[snes] Brain Lord

Aperto da Romhacking.it, Febbraio 14, 2006, 23:47:00

Discussione precedente - Discussione successiva

Clomax

salve, riprendo in mano questa traduzione che necessita di un repointer.
oggi ho fatto nuovamente il punto della situazione ripercorrendo velocemente i passi fatti l'ultima volta.

nei prossimi giorni scriverò un piccolo tool in python per verificare i ragionamenti fatti sui puntatori.

seguono gli appunti presi quest'oggi riguardo la struttura della rom:

Citazione
[brain lord - noheader]


[informazioni utili]

indirizzo inizio blocco di testo - 170000
indirizzo fine   blocco di testo - 17fac9
indirizzo fine della rom - 17ffff
byte inutilizzati ma sfruttabili dalla fine del blocco di testo fino alla fine della rom - 536
indirizzo inizio blocco puntatori - 050013
i puntatori puntano all'indirizzo dopo ogni (da verificare) byte F7 presente nel blocco di testo
i puntatori possono trovarsi:
   sparsi (ma forse hanno una logica) all'interno del blocco di testo
   nel blocco dei puntatori (al momento, per il testo, è stato trovato solo un blocco di puntatori)


[tabella dei puntatori]

indirizzo dopo il byte F7;puntatore;indirizzo del puntatore
170001;0100d7;50013
173b4e;4e3bd7;50187
1743fd;fd43d7;174060
174006;0640d7;173f8f
176c06;066cd7;50169
176d2a;2a6dd7;176c0f
178ce8;e88cd7;50157


[byte speciali]
8b - lo prende dalla ram?

Clomax

dopo tanto penare ho deciso come operare. creerò un programmino che cercherà i puntatori. nel caso in cui li trovi TUTTI (cercherò a mano quelli nn trovati) UNIVOCI (ho trovato un caso di puntatore doppio, un caso limite da gestire) allora passerò a pensare ad un algoritmo di ripuntamento.

Morpher

E' un bel casino; comunque un'ideuzza che mi venne quando esaminai la rom fu quella di non andare a ricalcolare i puntatori sparsi per il testo ma piazzarci direttamente il testo. Non ci sono problemi di spazio quindi credo che la cosa sia fattibile e il tuo lavoro si ridurrebbe a scrivere un tool che dumpi il testo dinamicamente su txt sequenziale e lo reinserisca direttamente in maniera sequenziale. Non so se sono stato abbastanza chiaro Clomo...  :P  

Clomax

si, è come hanno fatto i francesi, i tedeschi e gli spagnoli.
ma la fase di traduzione non mi interessa molto e piano piano sto arrivando a scoprire il funzionamento di molti byte (ad esempio quelli di apertura del menù dei negozi, le varie scelte e compagnia bella).

l'ultima novità riguarda un indetazione particolare quando parlano alcuni personaggi.
per fare un esempio:

gemmo:
  ciao clommo, oggi ho proprio
  voglia di divertirmi con te in un campo
  buio. hai la
  macchina?


ecco, quei tre spazi di indettatura sono dati da una dte (che altri non è che tre spazi) e da un ulteriore spazio. quindi due byte. questa tecnica è usata moltissimo nel gioco (praticamente ogni volta che parlano i tuoi compagni di avventura). avendo trovato i puntatori alle dte e considerando che dall'ultima dte fino alal fine del suo blocchetto c'è dello spazio inutilizzato (ma non per aggiungerci NUOVE dte, purtroppo solo per espanderli) si potrebbe tranquillamente aggiungere uno spazio alla dte da due spazi ed utilizzare quella nel testo risparmiando un pochino di spazio. ho ovviamente verificato che quella dte non viene utilizzata in altri casi particolari...

insomma, si potrebbero fare tante belle cosine... peccato per il wvf... non saprei da che parte cominciare...

io continuo per la strada del ripuntatore XD

Morpher

Citazionesi potrebbe tranquillamente aggiungere uno spazio alla dte

Dipende dal codice della dte. Se la Dual-Tile Encoding va a leggere solo 2 byte dalla tabella (cosa che credo sia così e proprio per questo è stato aggiunto un altro spazio nei dialoghi) anche aggiungendo un'altro spazio nella tabella di sicuro il codice non lo leggerà mai.

Citazionepeccato per il wvf... non saprei da che parte cominciare...

Parti da rh.it, dovrebbero esserci esempi di vwf per snes

PS: Ho aperto un paio di cartelle e ho trovato questo



E' una modifica che feci tempo fa per portare la lunghezza dei nomi a 11 caratteri.


Chester

Curiosità, come hai fatto per aumentare la lunghezza dei nomi? Immagino (spero per te xD) che sia stato meno incasinato del mio assurdo (ma necessario) metodo per Bahamut Lagoon.

Citazionedovrebbero esserci esempi di vwf per snes
C'è la guida di Gemini, che spiega molto bene il meccanismo di funzionamento, ma SOLO quello.
Close the world, txEn eht nepO

Morpher

CitazioneCuriosità, come hai fatto per aumentare la lunghezza dei nomi?

Forse non lo ricordi ma te l'ho già detto :P
Comunque il gioco lo permetteva e mi è bastato fare qualche modifica al codice. Per mia fortuna non ho dovuto implementare nessuna codifica particolare.

CitazioneC'è la guida di Gemini, che spiega molto bene il meccanismo di funzionamento, ma SOLO quello.

Su rh.net invece c'è proprio qualche esempio commentato. Basterebbe qualche ritocco per farlo andare su BL.


Gemini

CitazioneSu rh.net invece c'è proprio qualche esempio commentato. Basterebbe qualche ritocco per farlo andare su BL.
Lui non parlava di un VWF convenzionale. Comunque direi che stiamo andando fuori argomento.

Clomax

CitazioneDipende dal codice della dte. Se la Dual-Tile Encoding va a leggere solo 2 byte dalla tabella (cosa che credo sia così e proprio per questo è stato aggiunto un altro spazio nei dialoghi) anche aggiungendo un'altro spazio nella tabella di sicuro il codice non lo leggerà mai.

nono, è ufficiale: si può fare. le DTE, che a questo punto chiemerei MTE sono le seguenti:


C9=  
CA=th
CB=ou
CC=a
CD=ar
CE=an
CF=be
D0=re
D1=n't
D2=de
D3=me
D4=is
D5=er
D6=ll
D7=se
D8=es
D9=Kashi
DA='s
DB=The
DC=it
DD=Rein
DE=to
DF=...
E0=we
E1=Drago
E2=I'm
E3=have
E4=in
E5=nd
E6=oo
E7=st
E8=ed
E9=on
EA=y
EB=d
EC=n
ED=e
EE=<white>
EF= <white>


il C9 è il famoso doppio spazio. hot rovato i puntatori a questo blocchetto e ho modificato i due spazi in tre. beh... lo ha preso. l'unica pecca è che non posso umentarne il numero ma c'è un pò di spazio fatto dfi zeri dopo l'ultimo <white>.

Clomax

ci sono novità:


indirizzo 6052e:

U8deX8dea8ded8dei8del8deo8der8deu8dex8de8d


questi sono i puntatori alle mte del post precedente. la forma è quella traslata e sono separati dal byte DE).

esempio: MTE all'indirizzo 120834 il suo puntatore sarà 3408de.

basta cambiargli l'indirizzo e si possono allungare le mte a piacimento


th

ou

a

ar

an

be

re

n't

de

me

is

er

ll

se

es

Kashi

's

The

it

Rein

to

...

we

Drago

I'm

have

in

nd

oo

st

ed

on

y

d

n

e

<white>

<white>

00000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000                                                    


ok, tutti quegli 0 sono sfruttabili. spero di essere stato chiaro. ovviamente sopra le dte c'è il blocco contenente i luoghi e alcuni nomi importanti. i loro puntatori precedono quelli delle mte.


        {END}

Remeer{END}

Rein{END}

Ferris{END}

Barness{END}

Kashian{END}

Ason{END}

Ifrie{END}

Golem{END}

Sarah{END}

Pilulu{END}

Wak{END}

Domul{END}

Kass{END}

Pazun{END}

Jima{END}

Griffin{END}

Priss{END}

Gala{END}

{END}

{END}

Arcs{END}

House{END}

Tower1{END}

Tower2{END}

Tower3{END}

Tower4{END}

Field 2{END}

Ruins1{END}

Ruins2{END}

Ruins3{END}

Ruins4{END}

Field 3{END}

Toronto{END}

Desert{END}

Castle1{END}

Castle2{END}

Castle3{END}

Castle4{END}

Field 5{END}

Droog2{END}

Droog1{END}

Droog3{END}

Droog4{END}

Worm{END}

Platinum1{END}

Platinum2{END}

Platinum3{END}

Platinum4{END}

Fairy{END}

Weapon 1{END}

Arena{END}

Weapon 2{END}

Boss 1{END}

Boss 2{END}

Boss 3{END}

Dragon{END}

Boss 5{END}

Dragon{END}

Restaurant{END}

{END}

{END}

{END}

{END}

{END}

{END}

{END}

{END}

{END}

{END}

{END}

{END}

{END}

{END}

{END}

{END}

{END}

{END}

{END}

{END}

{END}

{END}

{END}

{END}

{END}

{END}

Morguai{END}

BlustOwk{END}

Bug-Aug{END}

Sabarri{END}

Dk.Hirai{END}

Chocoff{END}

Dragonite{END}

Gr.Lance{END}

Bachoff{END}

Ball Man{END}

Iron Bear{END}

King Bull{END}

Status{END}

Items{END}

Magic{END}

Option{END}

HP{END}

MP{END}

Power{END}

Guard{END}

Equ.{END}

Use{END}

Copy{END}

Dis.{END}

Yes{END}

No{END}

To whom{END}

Free{END}

Continue{END}

Beginning{END}

Copy{END}

Erase{END}

Quit{END}

Is this OK?{END}

{END}

Mode{END}

Config.{END}

1 {END}

2 {END}

3 {END}

Memory1erased{END}

Memory2erased{END}

Memory3erased{END}

Return{END}

Poison{END}

Paralysis{END}

LV{END}

EX{END}

Message{END}

Sound{END}

Fast{END}

Normal{END}

Slow{END}

Stereo{END}

Mono{END}

Buy{END}

Sell{END}

Trade{END}

Quit{END}

Key{END}

Attack...... {END}

Jump........ {END}

Defense..... {END}

Enter Com. {END}

{END}

Cancel Com. {END}

^{END}

A B C D E F G H I J K L{END}

{END}

M N O P Q R S T U V W X{END}

{END}

Y Z a b c d e f g h i j{END}

{END}

k l m n o p q r s t u v{END}

{END}

w x y z {F2}>       The End{END}

Task{END}

Escape{END}

Flag{END}

Items{END}

Level{END}

Slow{END}

Time{END}

Set{END}

Sound{END}

Memory{END}

Up{END}

Down{END}

On{END}

Off{END}

Warp{END}

{END}

{END}

Address{END}

Set{END}

^ {END}

>{END}

Key{END}

Jewel{END}

Weapon{END}

{END}

Shield{END}

Helmet{END}

0{1B}{END}

1{1B}{END}

2

Clomax

un'altra mte che viene utilizzata sono i tre puntini (...).
una cosa abbastanza inutile considerando che per aggiungere nuovi caratteri di spazio ce n'è a iosa (la cosa mi ha permesso di inserire le lettere accentate senza patemi d'animo) e che, già a suo tempo, avevo aggiunto un nuovo carattere contenente i tre puntini (un pò ravvicinati ma facevano un bell'effetto).

la cosa non aumenterà lo spazio disponibile ma renderà disponibile una nuova mte da utilizzare a piacimento.

aperta con il tile layer pro le lettere sono all'indirizzo: 74000.

Chester

Qualcuno ha detto VWF? :P


Originale:


VWF:
Close the world, txEn eht nepO

Sephiroth 1311

Sephiroth 1311
****************
membro di SadNES cITy
I gruppo italiano di traduzione ROM
http://www.sadnescity.it
*****************************
Fidati di chi ama leggere, fidati di chi porta sempre con sé un libro di poesie. Guarda con sospetto chi ti dice che non ha tempo, che la letteratura è una bella  cosa, che quando si è giovani  si può leggere, ma poi? Mente, non gliene importa nulla. Mente sapendo di mentire.
Roberto Cotroneo

Morpher

E io come ti avevo promesso ho inserito una routine perfettamente funzionante per aggiungere altre mte. Precisamente se ne possono aggiungere altre 30 (credo di poter aumentare ancor più il numero; tutto dipende dai byte che sono disponibili) utilizzando i byte che vanno da A0 a BF.

hirom;// hirom

;// Offsets

;// Spazio libero in rom in cui è locato il codice
!CodeOffset = $D7FB30

;// Offsets per il ritorno all'inizio del vecchio codice
!OldCodeOffset = $C2C70D
!OldFFOffset = $C2C67E

;// Offset per il ritorno al codice di caricamento dei byte che
;// compongono il puntatore
!OldLoadCode = $C2CBCE

;// Banco e offset in rom in cui sono locati i nuovi puntatori
!PntBank = #$D7
!PntOffset = #$FAD0

;// Modifica del vecchio codice
org $C2C676
JMP !CodeOffset;// Salto alla nuova routine

;// Nuova routine
org !CodeOffset

;// Vecchio codice di check del byte
CMP #$FF
BNE $04
JMP !OldFFOffset

;// Confronta il byte nel registro A con il valore 0XA0
;// e se è maggiore continua il ciclo altrimenti ritorna
;// alla routine originaria
CMP #$A0
BCS $04
JMP !OldCodeOffset

;// Confonta il byte nel registro A con il valore 0XBF
;// e in questo caso controlla se è minore per continuare
;// la routine modificata
CMP #$BF
BCC $04
JMP !OldCodeOffset

;// Trasferisce l'indice del puntatore da prendere in Y
REP #$20
AND #$00FF
SEP #$20
SEC
SBC #$A0
STA $4202
LDA #$03
STA $4203
LDA $4216
TAY

;// Carica il base offset dei puntatori nel registro A
;// e salva in memoria
REP #$20
LDA !PntOffset
STA $85

;// Carica in A il banco di memoria e lo salva
SEP #$20
LDA !PntBank
STA $87

;// Ritorna al codice di lettura dei puntatori
JMP !OldLoadCode


EDIT: Giusto un paio di bug risolti :P

Clomax

ok, il ripuntatore (brainrelord_repointer.py) funziona. fa incartare la rom in un punto quindi bisognerà lavorare ancora sull'algoritmo.
ecco la history del repointer:
history:

2008-09-17 (0.32)
 new get_pointers_table function!
 improved repointer algorithm (but at the end of the presentation the rom crash)
 renamed functions: hex2dec (hex_to_int), dec2hex (int_to_hex)
2008-09-16 (0.31)
 TEXT_POINTER2_BLOCK_END fixed
2008-09-16 (0.3)
 partial repointer algorithm (with documentation)
 the addresses of the function get_pointers_table now are stored as an integer
 function deswitched_pointer added!
 function make_a_doc added!
 function hex_to_int added!
2008-09-15 (alpha)
 initial alpha


ecco la logica (parziale e scritta  abestia) dell'algoritmo:
'''
dopo la verifica che entrambi gli array contenenti i puntatori originali e quelli modificati hanno la stessa dimensione
l'algoritmo ciclera sull'array dei puntatori della rom originale
scartando i puntatori per i quali non e stato trovato nessun indirizzo (testo sequenziale)
e ne verifichera la corrispondenza (data dalla sequenza) tra i puntatori originali e quelli spostati
nel caso in cui i puntatori si trovano nel banco di testo viene effettuato una nuova ricerca nella rom modificata
per poi sostituire il vecchio puntatore con quello nuovo
'''