Registrarse

[Otros] Terminología hexadecimal en GBC

Gold

Porrero a tiempo parcial
Miembro insignia
Bien gente vengo a repostear este tutorial que se quedo perdido y gracias a wayback machine lo recupere. Es una guia basica sobre los conceptos basicos del lenguaje hexadecimal, asi que empezemos.

-Hexadecimal: El sistema Hexadecimal (no confundir con sistema sexagesimal), a veces abreviado como Hex, es el sistema de numeración de base 16 —empleando por tanto 16 símbolos—(Wikipedia)

-Byte: Byte es, digamos, la unidad basica del sistema hexadecimal. Cada byte comprende 2 digitos del 0 a la F (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F (16 valores)) por lo que un byte podria ser cualquier combinacion de estos, siendo el maximo digito FF (255 en decimal)

Ejemplos de un byte: 0A, 3F, 51, 8C, etc.

-Offset (desplazamiento): Es donde se encuentran los datos que queremos buscar. Normalmente estan enumerados en Hexadecimal en editores hex, pero algunos tambien los enumeran en decimal. Se usan para señalar a donde tienes que ir para encontrar cierta data. Por ejemplo, yo podria decirte que vayas al Offset 237AB para modificar el sprite de un Pokemon (es solo un ejemplo, no estoy seguro que hace Offset 237AB, solo fue un numero al azar, ademas que su funcion depende del juego. En POkemon GS es diferente que en Pokemon Crystal y otros juegos)

-Pointer: Pointer es aquello que le señala al juego donde se encuentra cierta data. Es como un offset pero para lenguaje computadora.

-Header: Header o cabecera es un conjunto de bytes que forman una estructura que controlar cierta parte del juego. Cada Header tiene diferente estructura dependiendo de lo que controla, por ejemplo este es el Secondary Map header:

[Border Block][Y size (in blocks)][X size (in blocks)][Map data pointer (3-bytes)][Bank of Events & Maps Script][Script pointer (2-bytes)][Event data pointer (2-bytes)][Map Connections]

Si cuentas bien, veras que son 12 bytes.

Y este es el Tileset Header:

[Graphics Ptr, 3 byte] [Block Data Ptr, 3 byte] [Collision/Effect data ptr, 3 byte] [Animation Ptr, 2 byte] [Unused (00 00), 2 byte] [Palette Data Ptr, 2 byte]

Si cuentas bien, veras que son 15 bytes.

Asi que si llegas hasta el secondary map de, por ejemplo, pallet town y lo modificas, modificaras algo de ese mapa (tamaño, cuantas personas hay, etc).

Si por ejemplo llegas hasta el tileset header 15 (el de pallet town) y lo modificas, modificaras los Tiles que componen el mapa (asi podrias modificar los graficos de las casas, los colores, etc)
 

Chamber

Miembro insignia
Miembro insignia
Respuesta: [GBC] Diccionario de terminologia HEXADECIMAL

Gracias por la terminologia, muy buena para los que inician en esto.

Si me lo permites quisiera agregar unos terminos que rescato de mi escuela de RH-GBC.

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.
Código:
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

Código:
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:
Código:
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:

Código:
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:
Código:
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émon_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.
 
Arriba