[spoiler=1. Introduccion Al Sistema Hexadecimal]1- ¿Qué significan los símbolos “%”, “$”, “0x” y “x” entes de los números?
R: Son los prefijos que permiten al lector saber a qué sistema numérico pertenece tal número.
Binario =%
Hexadecimal = $, 0x, x
2- ¿Que es un bit?
Un bit es un dígito del sistema de numeración binario. Solo se usan dos dígitos, el 1 y el 0. Se puede imaginar un bit, como una bombilla que puede estar en uno de los siguientes dos estados:
Apagado = 0
ó Encendido = 1
Estos valores pueden ser convertidos al decimal y hexadecimal
A. Byte en Binario: %00000000
Byte en Decimal: 0
Byte en Hexadecimal:$00
B. Byte en Binario: %00000001
Byte en Decimal: 1
Byte en Hexadecimal:$01
C. Byte en Binario: %00000010
Byte en Decimal:2
Byte en Hexadecimal:$02
D. Byte en Binario: %00000011
Byte en Decimal:3
Byte en Hexadecimal:$03
E. Byte en Binario: %00001010
Byte en Decimal:10
Byte en Hexadecimal:$0A
F. Byte en Binario: %1011010
Byte en Decimal:90
Byte en Hexadecimal:$5A
G. Byte en Binario: %10111101
Byte en Decimal:189
Byte en Hexadecimal:$BD
H. Byte in binary form: %11111111
3- ¿Que es un byte?
Un Byte es grupo de 8 bits que forman una unidad de información.
He aquí algunos ejemplos para entender mejor el comprtamiento del byte:
A. Byte en Binario: %00000000
Byte en Decimal: 0
Byte en Hexadecimal:$00
B. Byte en Binario: %00000001
Byte en Decimal: 1
Byte en Hexadecimal:$01
C. Byte en Binario: %00000010
Byte en Decimal: 2
Byte en Hexadecimal:$02
D. Byte en Binario: %00000011
Byte en Decimal: 3
Byte en Hexadecimal:$03
E. Byte en Binario: %00001010
Byte en Decimal: 10
Byte en Hexadecimal:$0A
F. Byte en Binario: %1011010
Byte en Decimal:90
Byte en Hexadecimal:$5A
G. Byte en Binario: %10111101
Byte en Decimal:189
Byte en Hexadecimal:$BD
4: ¿Qué es un Offset?
Un offset se refiere a una ubicación específica en la memoria. En términos coloquiales, es la dirección del byte.
Se puede entender mejor si tomamos de ejemplo un librero con algunos libros.
Cuando necesitamos un libro en específico, el offset nos indicara sobre que repisa y a qué altura esta su localización.
Cuando una ROM de Game Boy o un archivo RAM se abre con un editor hexadecimal, contendrá toneladas de bytes hexadecimales en orden. El primer byte se localiza en el offset $0, el segundo byte en el offset $01, el tercer byte en el offset $02 y así sucesivamente hasta el fin de los tiempos.
Los offsets se escriben normalmente en un formato que es bastante sencillo que consiste en el signo “$” seguido del número Hex, pero existe otro formato que usa el Game Boy de forma nativa:
A. Offset en Decimal: 46679
Offset en primer Hexadecimal: $B657
Offset en segundo Hexadecimal: 02:57B6
B. Offset en Decimal: 132157
Offset en primer Hexadecimal: $2043D
Offset en segundo Hexadecimal: 08:3D04
C. Offset en Decimal: 924076
Offset en primer Hexadecimal: $E19AC
Offset en segundo Hexadecimal: 38:AC19
D. Offset en Decimal: 1420579
Offset en primer Hexadecimal: $15AD23
Offset en segundo Hexadecimal: 56:23AD
El segundo formato se entenderá más claramente una vez que se comprenda el concepto de Bank, Point y Repoint.
Los offsets son cruciales para modificar un juego mediante un programa hexadecimal, ya que se necesitan para saber donde se encuentran los datos a
modificar.
5- ¿Qué es un Bank?
Bank o Banco en español, se refiere a la manera en que se reparten los datos dentro de un ROM del Game Boy. Se dividen en secciones que de $4000 bytes, esto quiere decir que:
Bank $00: $0000 - $3FFF
Bank $01: $4000 - $7FFF
Bank $02: $8000 - $BFFF
Bank $03: $C000 - $FFFF
Bank $04: $10000 - $13FFF
...
Bank $2B: $AC000 - $AFFFF
Bank $2C: $B0000 - $B3FFF
Bank $2D: $B4000 - $B7FFF
Bank $2E: $B8000 - $BBFFF
Bank $2F: $BC000 - $BFFFF
...
En el primer banco, el $0000 está incluido en el cálculo de los $4000 bytes por banco, por esta razón, el segundo banco comienza en el $4000 y así sucesivamente.
El número del banco está determinado por su posición relativa; al primer banco se le asigna el $00, al segundo el $01, etc. Al decimo primero, entonces, se le asignaría el $0A.
El número de banco se puede calcular fácilmente si dividimos un offset entre $4000 en la calculadora de Windows (automáticamente hará el redondeo).
Ciertos bancos están reservados para funciones específicas; un ejemplo de esto son los juegos de segunda generación, en donde el segundo banco se utiliza principalmente para almacenar datos de las paletas (colores).
Para ver los detalles sobre bancos de la ROM de Pokemon Gold puedes consultar este enlace:
http://datacrystal.romhacking.net/wiki/Pok%C3%A9mon_Gold:ROM_map
Volviendo al ejemplo del librero, podemos decir que las repisas del librero es el equivalente a los Bancos de la ROM, esto con el fin de tener nuestros datos mejor organizados.
6- ¿Qué es un Point?
Un point o puntero es un dato dentro de la ROM que le dice a la misma ROM donde buscar otro dato. Los datos pueden ser texto, gráficos o comandos.
Coloquialmente se puede decir “apuntar”.
Por ejemplo, en nuestro librero, imaginemos a un pointer como si tuviéramos un montón de libros de color negro y el pointer señalara un libro en específico marcándolo con un color rojo para su fácil localización, así cada vez que necesitamos cierta información, nuestro librero sabe en qué “libro” buscar.
7.- ¿Qué es el Repoint, y que tan necesario es?
El repoint, o repunteo es cuando editamos algún point para que “apunte” a otra ubicación diferente en la ROM, esto debido a que se está agregando nueva información al juego.
El repoint es un concepto básico del Rom Haking; es necesario dominarlo para hacer avanzar en los aspectos más creativos y técnicos de nuestro Hack, ya que con el podemos ampliar el texto, ampliar eventos existentes o crear nuevos, hacer nuevos scripts, etc. Prácticamente se puede hacer de todo aprendiendo a repuntear.
Si en nuestro librero (ROM) necesitamos crecer un libro (Datos) de tamaño, pero no cabe en lugar en donde estaba, podemos moverlo a otra repisa (Banco) con mas espacio libre, pero debemos decirle al juego la nueva ubicaci ón para que sepa dónde buscar ;)
8.- ¿Cuál es la diferencia entre un pointer de 2 bytes y un pointer de 3 bytes?
Los dos tipos de pointers que se utilizan en los juegos de Game Boy tienen el mismo propósito, el de “apuntar” hacia la ubicación de datos, su única diferencia es que el pointer de 3 bytes tiene un byte adicional que indica la localización del banco.
Esto significa que los pointers de 2 bytes siempre apuntan a una ubicación dentrodel mismo banco en que se encuentra y los pointers de 3-bytes pueden apuntar a cualquier lugar del ROM. Un ejemplo de un 3-Bytes point son los sprites de los pokemon y entrenadores, que pueden localizarse en cualquier lugar de la ROM.
Operacion de Calculo de Punteros
Vamonos al calculo de punteros, lo que necesitas es:
- Calculadora de windows
- Haber pasado la primaria
- Un editor hex (Mejor si es Gold Finger)
Antes de hallar el Puntero que necesites, necesitas saber esta formula:
Offset / 4000 = Banco
Para hallar el puntero deseado necesitas usar la siguiente formula:
[Offset - (Banco * 4000)] + 4000 = Puntero permutado
El puntero permutado es nada mas y nada menos que el Puntero, solo que sus bytes estan al reves. Puede parecer confuso, pero poner en practica todo esto puede resultar mas facil de entender.
EJEMPLO
Muy bien, abramos nuestro editor hex y vayamos a offset AD6AC, no dire como lo se porque no es tema de este tutorial, pero este offset es el comienzo del mapa de Mahogany Town en Pokemon Silver.
En fin. Vayamos a offset AD6AC y averiguemos cual es su puntero de 3-bytes.
Abrimos inicio y buscamos la calculadora de windows. Una vez ahi da click en "ver" y luego en "programador". La calculadora deberia mostrarse asi:
¿Ves la columna donde dice "Hexa Dec Oct Bin"? Da click en "Hexa" y vamos a aplicar la formula:
AD6AC / 4000 = 2B. El Banco de este offset es 2B
[AD6AC - (2B * 4000)] + 4000
[AD6AC - AC000] + 4000
16AC + 4000
56AC
56AC es el Puntero Permutado
AC56 es el Puntero
Asi que el pointer de offset AD6AC es AC56.
¿Cual es su Puntero de 3-bytes?
Recordemos que el 3byte pointer es [pointer]. Como el Bank es 2B, entonces el 3byte pointer para offset AD6AC es 2B:AC56.
¿Cual es su Puntero de 2-bytes?
El 2byte pointer es nada mas y nada menos que el pointer en si mismo. En otras palabras, el 2byte pointer para offset AD6AC es AC56.
¿Como comprobamos que esto es correcto?
Bueno, como queriamos hallar el puntero de 3-bytes desde un principio usemos nuestro Hex editor. Abramos el ROM con el hex editor y vayamos a "Search". Una vez ahi marca "Hex" (si estas usando i.Hex. Esto depende del hex editor que uses) y escribe "2BAC56". Si lo hiciste bien deberias llegar a offset 94F07. Muy bien, que es lo que dicen los 3 bytes desde 94F07 hasta 94F09? Esos 3 bytes dicen "2B AC 56". Si cambias estos valores el juego no podra cargar mahogany y lo habras arruinado al menos que pongas esos valores de nuevo porque el juego no sabria localizar donde esta Mahogany.
Cuando hagas ROM hacking usando Hex editing es esencial que sepas esto, porque dependiendo de lo que necesites hackear, vas a tener que hacer uso de ya sea 2byte pointers o 3byte pointers casi siempre, asi que antes de aventurarte a hacer hex editing asegurate de dominar esto bien, que no es tan dificil y puede ser mas provechoso que utilizar un millon de tools para hackear.