NewsIl GruppoTraduzioniGuidaUtilitàLinks
I puntatori hirom

Capita spesso che mentre si è alle prese con una traduzione ci si accorga di non avere abbastanza spazio per poter inserire una parola o una frase. Per esempio prendiamo la parola "Level" che vorremo rendere in italiano "Livello". Si vede subito che se sulla ROM non ci sono due spazi liberi disponibili dopo "Level" non riusciremo mai a inserirci la parola "Livello". Questa è la tipica situazione in cui un hacking dei puntatori potrebbe risolvere il problema.

Per prima cosa cerchiamo di capire che cosa sia un puntatore. Senza perderci in tanti giri di parole il puntatore può assimilarsi al comando "Vai là". Si tratta di una sequenza di byte corrispondenti a un indirizzo, il programma va a leggere il testo nel punto indicato dal puntatore (nel nostro esempio Level).
Per farvi capire meglio facciamo un esempio pratico. Abbiamo la seguente stringa di testo:

Item<FF>Equip<FF>Magic<FF> ...

Come detto il puntatore serve a "puntare" (scusate il giro di parole) a un dato indirizzo della nostra ROM, nel nostro caso a far leggere una determinata stringa di testo.
La lettura parte dal punto indicato e arriva fino ad un certo punto individuato da un determinato valore esadecimale (nell'esempio che ho fatto è il valore ), rappresentante il byte di stop (che per il programma è equivalente all'istruzione "Adesso fermati"). Nella ROM saranno quindi presenti dei puntatori al primo carattere di ciascuna delle parole mostrate nell'esempio.
Immaginiamo di voler effettuare la traduzione della stringa nel seguente modo:

Oggetti<FF>Equip<FF>Magia<FF> ...

L'indirizzo di inizio delle seconde due parole è variato e il puntatore sta puntando ai caratteri sbagliati. Facendo girare il gioco si potrebbe osservare che la parola Oggetti venga correttamente visualizzata (in quanto il suo indirizzo iniziale non è variato), mentre al posto di Equip verrebbe mostrato "ti". Il fenomeno si spiega perché la parola Oggetti ha sconfinato, occupando l'indirizzo che prima era l'inizio di Equip.
La soluzione è trovare e modificare i puntatori di ciascuna di queste parole, in modo da aggiornarli alle nuove posizioni.
I puntatori, a seconda del caso, possono puntare a singole parole come nell'esempio o ad interi dialoghi.

Quanto appena detto è molto generale ed applicabile a qualunque sistema, ora si vogliono analizzare in dettaglio i puntatori per SNES di tipo hirom.

Bisogna innanzitutto spiegare che cos'è l'header. In parole povere l'header non è altro che la parte iniziale di una ROM e corrisponde ai primi 512 bytes (200 hex bytes).
Presto capiremo perché questo numero è importate. Eccone qui un esempio (questo è quello del gioco Final Fantasy VI):

8001008000000000AABB040000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000

Questo header in realtà non è parte della ROM, si tratta di dati aggiunti dai copiatori usati per fare il dump e sono generalmente utilizzati solo da loro. E' però importante tenerne conto anche nel rom hacking, perché la presenza dell'header influenza l'hacking dei puntatori.
Una cosa che consigliamo è quella di controllare la rom con uno dei tools tipo GoodSNES per sapere se la rom è un set originale, poi controllare se l'header è presente o meno (infatti non sempre è presente).

Il primo passo per trovare i puntatori è quello di sapere l'inizio del blocco di testo e quale il byte a cui corrisponde la fine di una stringa di testo. Non è detto che il primo carattere di un dialogo sia la prima lettera, in quanto spesso il testo viene preceduto da alcuni byte di controllo che regolano colore, posizione del testo, della finestra, etc. Il passo successivo consiste nel leggere l'offset del primo carattere, cioé l'indirizzo dove comincia la porzione di testo di cui vogliamo trovare il pointer.
Utilizziamo di nuovo un esempio pratico e supponiamo che la nostra frase cominci all'offset 55522h. La prima cosa da fare è quella di sottrarre l'header, quindi 55555h-200h=55322h. Di tale risultato prendiamo le ultime due coppie di numeri (nel nostro esempio 53 22), ne invertiamo l'ordine (22 53) e questo è il nostro pointer: 2253h.
Per trovare il nostro numero magico ci posizioniamo all'inizio del blocco di testo e cominciamo a cercare poco sopra quel punto, perché in genere lì si trovano i nostri cari pointers. In molti giochi è infatti presente poco prima dei dialoghi la "tabella dei puntatori", che non è altro che una sequenza di puntatori usati per puntare alle varie zone del testo che segue. Se così è siete molto fortunati, la modifica risulterà agevole.
La modifica del puntatore è ovvia: calcolate il puntatore al nuovo offset che volete puntare e sostituitelo al vecchio.
Se non riuscite a localizzare la tabella (non è detto che ce ne sia una!), non vi rimane che cercare il puntatore nella ROM e modificare selettivamente ciascuna occorrenza, controllando ogni volta se la frase interessata ha subito variazioni nel gioco.
Ci sono anche situazioni in cui il puntatore non si riesce a trovare affatto. E' possibile che sia memorizzato in un formato "strano" e che la console lo elabori per ricavare l'indirizzo effettivo. A questi casi non c'è semplice soluzione, se non un hacking a livello di assembly per capire cosa succede realmente.

mickey
Settembre 2006