[snes] Bahamut Lagoon

Aperto da Romhacking.it, Gennaio 31, 2005, 18:16:29

Discussione precedente - Discussione successiva

Chester

Hack al 100% invidiatoci dal mondo intero, DeJap inclusi, ma da parte mia c'è scarsa voglia (nonché tempo) di continuare a tradurlo. Il progetto può considerarsi sospeso fino a quando non si farà vivo qualche volontario *serio*. Mi spiace, ma ho altri progetti in cantiere :ph34r:
Close the world, txEn eht nepO

Vivi 86

qualcuno può contattare chester personalmente e dirgli di collegarsi al forum?! Ho quasi finito la traduzione del gioco ma è da giorni che non lo vedo su msn (io è da circa un anno che non mi connetto  ;D ) e per email non risponde!

Chester

Close the world, txEn eht nepO

Clomax


arnold101

Citazione di: Chester il Ottobre 08, 2007, 17:21:27
Ce l'ho fatta :favorevole:

Dopo ore passate in mezzo alle routine di Bahamut Lagoon DeJap, ecco a voi il risultato dei miei sforzi!




Di seguito spiego molto rapidamente tutti i procedimenti effettuati (l'emulatore utilizzato è il Geiger Snes9x Debugger):

La scoperta del funzionamento dei puntatori
- Una veloce occhiata alla RAM durante la visualizzazione del testo ha confermato che era lì che veniva allocato una volta decompresso, o meglio durante la decompressione;
- Con un breakpoint in lettura all'indirizzo 7FAC46 (l'indirizzo in cui iniziava una frase, quindi al quale avrebbe dovuto puntare il pointer) l'esecuzione si è fermata a quest'istruzione:
$DA/694D B7 2B       LDA [$2B],y[$7F:AC46]   A:0CFF X:0E03 Y:0C46 P:envMxdizC
La quale carica nell'accumulatore il valore contenuto nella posizione equivalente alla somma tra il valore contenuto in $2B e nel registro Y, in tutto 7FAC46. A questo punto appare evidente che, essendo il valore di Y pari a 0C46, $2B contenga 7FA000, ovvero l'indirizzo di partenza dei dati decompressi in RAM (da notare come, a partire da qui e prima dell'inizio del testo, siano memorizzati, tra l'altro, i puntatori). Y rappresenta dunque lo scostamento a partire da questa locazione, ed è quindi con ogni probabilità il puntatore (opportunamente invertito).

La scoperta della tabella degli indirizzi dei blocchi compressi
- Il breakpoint in scrittura per l'indirizzo $7F:A000 ha fermato l'esecuzione su quest'istruzione:
$DA/68CB 8D 80 21    STA $2180  {$7F:A000}   A:A00C X:0000 Y:0003 P:envMxdizc
- Ho steppato fino ad arrivare a un'istruzione che facesse riferimento a un indirizzo della ROM:
$DA/68CE C8          INY                     A:A00C X:0000 Y:0003 P:envMxdizc
$DA/68CF B7 28       LDA [$28],y[$DB:F4B5]   A:A00C X:0000 Y:0004 P:envMxdizc <-----
$DA/68D1 8D 80 21    STA $2180  {$7F:A001}   A:A000 X:0000 Y:0004 P:envMxdiZc
$DA/68D4 C8          INY                     A:A000 X:0000 Y:0004 P:envMxdiZc
$DA/68D5 B7 28       LDA [$28],y[$DB:F4B6]   A:A000 X:0000 Y:0005 P:envMxdizc

L'istruzione indicata dalla freccia carica nell'accumulatore il valore formato dalla somma del contenuto di $28 e di quello di Y, l'indirizzo DBF4B5. Si capisce dal valore della Y che ci si trova già nel bel mezzo della routine di decompressione, e non esattamente all'inizio. Si intuisce quindi che DBF4B5 (somma di $28 + Y) meno 0004 (Y) è uguale a DBF4B1, ovvero la posizione della ROM dal quale il gioco comincia a decomprimere il blocco compresso. Uno sguardo nella posizione della RAM 7E0028 ha confermato questa tesi;

- Una volta invertito il valore DBF4B1 (formato SNES HiRom*), ho ottenuto B1F4DB e l'ho cercato nella ROM tramite un Hexeditor. All'indirizzo 1A8000 (formato PC) ho trovato la tanto cercata tabella che mi permette, modificandola, di espandere la ROM e spostare il testo dove preferisco** :lol:

* L'indirizzo DBF4B1 è in formato SNES HiRom, convertito in formato PC corrisponde a 1BF4B1.

** In realtà, avendo scritto un compressore non è strettamente necessario spostare alcunché. Questa tabella mi è utile soprattutto per trovare gli indirizzi a partire dai quali ha inizio ciascun blocco compresso.

P.S. I primi 2 byte del blocco compresso rappresentano la lunghezza in byte, invertita, del blocco di testo compresso. E' fondamentale che il suo valore sia regolato in modo tale che la sequenza di byte corrisponda in maniera valida a ciascun bit dell'ultimo flag della compressione. Se mancano dei byte per completare la sequenza, è sufficente aggiungere tanti 00 (che ovviamente vanno tenuti in considerazione nel conteggio) quanti sono i byte mancanti.



Se siete interessati e non è chiaro qualche punto (molto probabile visto che l'ho scritto in 10 minuti) chiedete pure :)
tutto sto casino e sta pappardella tecnica e poi hai abbandonato tutto? no comment. E quello che diceva di aver quasi finito di tradurlo, pure lui sparito?

Clomax

il progetto è stato spostato da tempo in "progetti abbandonati". ergo: tutto è fermo. la "pappardella tecnica" potrebbe essere utile a chi volesse cimentarsi nella traduzione. avevi veramente bisogno di questa risposta? :P

arnold101

Era ben altro il senso della mia risposta. Trovo super ridicolo che uno che si mette a fare post del genere e poi manco completa la traduzione (ovvero la cosa piu importante)...il colmo😂

Ora ti è chiaro?

Clomax

mi è chiaro che sono passati sei anni ma ancora non hai sufficiente apertura mentale da capire che "uno che si mette a fare post del genere e poi manco completa la traduzione" non è ridicolo ma semplicemente ha avuto altro da fare o ha perso l'interesse a farlo. cosa legittima e comprensibile. se non riesci a capirlo e devi giudicare, allora hai un problema.