Guida ai puntatori del Game
Boy
15/02/2002
Dark
Schneider 2002
Dato che i puntatori del Game Boy
sono molto poco menzionati nelle guide sul rom hacking, ho deciso di buttare giù
questo doc molto breve per far conoscere a tutti come si calcolano. E' ovvio che
per leggere questo documento (e capirlo), è necessario che sappiate cosa è un
puntatore...detto questo, iniziamo subito :)
I puntatori del GB (e GBC) differiscono da quelli "tradizionali", dal fatto che il loro valore varia a seconda di certi intervalli di indirizzi. Mentre nel NES si poteva tranquillamente prendere l'offset della stringa e calcolarne il pointer, nel GB bisogna seguire le seguenti regole:
Se l'offset è compreso tra 0000 e 3FFF, allora gli si deve aggiungere 4000 e invertire i byte. Per esempio, da 1234 -> 5234 => 3452.
Se l'offset della stringa è compreso tra i valori 4000 e 7FFF, allora basta invertire le coppie ed abbiamo il nostro pointer. Per esempio, se l'offset è 4566, il puntatore risultante è 6655.
Se l'offset è compreso tra 8000 e BFFF, allora si deve sottrarre 4000 e invertire i byte. Per esempio, 9512 -> 5512 => 1255.
Infine, se l'offset è compreso tra C000 e FFFF allora si deve sottrarre 8000 e invertire i byte. Per esempio, C123 -> 4123 => 2341.
Ricapitolando:
0000 - 3FFF |
4000 - 7FFF |
8000 - BFFF |
C000 - FFFF |
Aggiungere 4000 e invertire | Invertire | Sottrarre 4000 e invertire | Sottrarre 8000 e invertire |
Alcune note:
Tutti i valori che ho indicato qui sono espressi in esadecimale, quindi comportatevi di conseguenza.
Non è detto che il Game Boy (come tutte le altre console) abbia soltanto questo sistema di pointer.
Ovviamente queste cose non le ho scoperte io (magari), ma mi sono limitato a scrivere in maniera decente quello che era scritto su un documento in inglese scritto da qualcuno che non ha neanche indicato il suo nome.
Per ottenere l'offset da cui calcolare il puntatore, prendete l'indirizzo della vostra stringa e tenete soltanto le 4 cifre meno significative. Per esempio, con l'indirizzo 123456 -> 3456.
Dark Schneider.