Megadrive Magical Taluluto

Aperto da Kingfield, Maggio 22, 2014, 19:16:32

Discussione precedente - Discussione successiva

Kingfield

Salve, ho trovato l'indirizzo RAM per abilitare la selezione delle mappe nella schermata opzioni

FFFD31:00FF



da ore sto cercando il corretto ROM address in modo da hackerare il gioco definitivamente

alcuni tentativi mettendo valore 00FF in TUTTE le locazioni FD31:

B9CE' schermo nero
B9CE  schermo nero
12DC' pausa infinita alla schermata SEGA
12DC  niente
12B4  niente
12A9 pausa
BA23 niente

provato sottraendo -1 quindi con FD30
32E57 niente
2d87A grafica buggata
222CA niente
B9F0 schermo nero
B1814 schermo nero dopo essere entrati in options
ecc
ecc

qualsiasi aiuto o consiglio sono ben accetti !

Phoenix

Hai provato a cercare qualche manciata di byte precedente a quel valore in ram?

È anche possibile che quel valore sia (per qualche motivo) generato in ram via codice. Potresti provare a settareun breakpoint in scrittura a quell'indirizzo con il debugger. Traccia il codice all'indietro da lì e cerca di capire quale istruzione setta quel valore.
Phoenix
****************
membro di SadNES cITy
I gruppo italiano di traduzione ROM
http://www.sadnescity.it
*****************************

Phoenix

Infatti, mettendo un breakpoint in scrittura a quell'indirizzo (ho usato Exodus, che sembra essere l'unico emulatore con un debugger decente), finisci sull'istruzione BA2A: BSET.b #7, $00FFFD31
cioè setta l'ultimo bit a 1. I byte che compongono questa istruzione sono 08 F9 00 07 00 FF FD 31, che puoi trovare facilmente dentro la rom. Basta cambiare quel 07 in 06 per forzare la scrittura del bit numero 6, anziché del numero 7, e avrai la selezione della mappa nel menu.

Ricorda di fixare il checksum della ROM una volta che hai applicato le modifiche.
Phoenix
****************
membro di SadNES cITy
I gruppo italiano di traduzione ROM
http://www.sadnescity.it
*****************************

Kingfield

raw= BA2C:0006
sei stato utilissimo, funziona alla grande, grazie mille!

cestino subito regen per exodus:\

Hamon

Salve, scusate se riprendo questa discussione, volevo chiedere se potevate spiegarmi come è stato trovato l'indirizzo di memoria 'FFFD31' per abilitare la scelta delle mappe e come mai l'istruzione BA2A: BSET.b #7, $00FFFD31 è la chiave di tutto?
Non potendo provare Exodus, che funziona solo sul 64bit, ho dato un occhiata a Regen che è fatto veramente male e non ci ho capito granchè...

Lo chiedo perchè mi piace imparare cose nuove, visto che non sono molto ferrato sull'architettura 68k, fino ad ora ho usato il debugger solo sullo snes.

Phoenix

Non saprei rispondere sull'indirizzo di memoria. Presumo l'utente che ha iniziato il post lo abbia preso da un qualche codice gameshark, altrimenti non mi spiego come mai, una volta trovato l'indirizzo, non abbia trovato anche l'istruzione che ne modifica il contenuto.
Presumo comunque che tale indirizzo possa essere recuperato dalla routine di disegno del menu. Dentro quella routine esiste quasi certamente un check che verifica la presenta di un bit settato a 1 a quell'indirizzo.
Se lo trova, disegna anche il menu di debug.
Per rispondere alla domanda sull'istruzione BSET.b #7:
Gli sviluppatori, con buona probabilità, invece di eliminare il codice di debug dalla ROM, hanno pensato bene di usare un flag in memoria (all'indirizzo FFFD31 appunto) che serve ad indicare se il menu di debug debba essere abilitato o no. Quando il gioco è stato ultimato, è bastato disabilitare il debug mode settanto il flag.
Phoenix
****************
membro di SadNES cITy
I gruppo italiano di traduzione ROM
http://www.sadnescity.it
*****************************

Hamon

In effetti l'indirizzo ram è proprio FD31 che abilitando il debug mode passa da 80 a C0 e per questo settando il bit 06 ad 1 le mappe vengono abilitate.
Ora l'unico dubbio che mi rimane è che il gioco fa riferimento a FFFD31 come indirizzo di memoria, ma la ram in realtà arriva fino a FFFF, quindi penso ricicli i byte allocati da 0000 a FFFF per FF volte per poi ritrovarsi allo stesso punto di FD31 con il medesimo valore. Se è così perchè non usare direttamente FD31 come indirizzo?

Phoenix

Ssolitamente, quando lo spazio di indirizzi è più ampio della RAM installata, si usano i restanti bit per mappare registri di controllo delle periferiche hardware tramite indirizzi speciali RAM.
http://en.wikibooks.org/wiki/Genesis_Programming.

l'altro caso è quando si vuole avere differenti modalità di accesso alla RAM.
La PSX ad esempio può accedere alla memoria RAM o con indirizzi assoluti "classici" oppure con indirizzi il cui bit più significativo è settato ad uno, quindi del tipo 0x8xxxxxxx.
Indirizzi di questo tipo fanno riferimento a zone di RAM che sono state messe in cache per un accesso più veloce.
Phoenix
****************
membro di SadNES cITy
I gruppo italiano di traduzione ROM
http://www.sadnescity.it
*****************************

Hamon

Bene, ora tutto mi è chiaro!

Grazie mille per avermi risposto e per le spiegazioni!

Kingfield

CitazioneNon saprei rispondere sull'indirizzo di memoria.

be no, l'ho trovato da me con fusion364 funzione 'state'

Citazionefinisci sull'istruzione BA2A: BSET.b #7, $00FFFD31
cioè setta l'ultimo bit a 1. I byte che compongono questa istruzione sono 08 F9 00 07 00 FF FD 31, che puoi trovare facilmente dentro la rom. Basta cambiare quel 07 in 06 per forzare la scrittura del bit numero 6, anziché del numero 7

il procedimento funziona anche per PULSEMAN (gioco con lo stesso engine) stesso indirizzo RAM FFFD31:00FF, che in ROM diventa 007F9C:0006

per curiosita' ho sperimentato la cosa anche in altri giochi che hanno menu' sbloccabili nelle opzioni

garoudensetsu2:



trovato il RAM FF001B:00A0
80 solo test
20 solo personaggi aggiuntivi
A0 tutte e 2 le cose insieme

trovato l'istruzione


BTST.b #6 $00ff001B  0839 0006 00FF 001B
ma poi mi sono bloccato..non mi e' chiaro il fuzionamento di bittest, forzando il test sul bit 5 anziche' 6 con 0314C4:0005 non ottengo risultati

Phoenix

è probabile che sia presente un'altra istruzione da qualche parte che set ancora quei bit. Azzerando di fatto i tuoi cambiamenti. Hai verificato se il breakpoint in scrittura blocca l'esecuzione sempre in quel punto, oppure ci sono più punti nel codice che modificano quel valore in ram?
Phoenix
****************
membro di SadNES cITy
I gruppo italiano di traduzione ROM
http://www.sadnescity.it
*****************************

Hamon

Citazione di: Kingfield il Ottobre 04, 2014, 13:38:56
ma poi mi sono bloccato..non mi e' chiaro il fuzionamento di bittest, forzando il test sul bit 5 anziche' 6 con 0314C4:0005 non ottengo risultati

Ciao, cambiando il bit da testare al btst, in questo caso, penso sia inutile; il valore in ram a FF001B inizialmente è 0 e quindi il test fallirà sempre qualunque bit gli passi e da come ho visto l'indirizzo della ram viene scritto solo al momento dell'attivazione della cheat. Una soluzione può essere quella di invertire i controlli tra beq e bne ad ogni riferimento di FF001B o semplicemente ignorarli con un nop.