Clase número 1 - Hexadecimal
(Para referencias sobre algunos terminos utilizados en éste tutorial/guia/teoría de aprendizaje, referirse al Link con la clase anterior: Clase numero 0)
Usuario:¿Pero de qué vas? ¿Hexa o ASM? ¡Decídete!
Cheve: Shhhh! :awesome:
Bueno, la clase uno hablaremos de hexadecimal. En la clase número 0 ya hablamos del sistema hexadecimal de números y de qué se trata.
Pero ahora os vengo a enseñar y demostrar un par de cosas que nos servirán para más adelante. (Aclaración: Para muchos que ya saben varias cosas de Hexa de la Rom, quizás esto les parezca "inútil" pero la idea es que hasta los más nuevos entiendan de qué va ASM).
Índice: ¿Que temas abrodaremos?
1. Read/Write
2. Funcionamiento básico de memoria y sus tipos.
3. ¿Qué es un puntero?
4. Ejemplo práctico
5. Relacion con ASM
Read / Write (Leer / Escribir)
Leer o escribir memoria:
En realidad no son conceptos tan dificiles, es más, ni siquiera los iba a poner a parte, pero como los conozco, pues nada xD
Ésto es la capacidad que tiene el procesador de Obtener datos (Leer) y de modificar datos guardados (Escribir) no tiene más vuelta...
Funcionamiento básico de memoria y sus tipos
¿Qué es la memoria? Es la capacidad de la mente para recordar ciertas cosas. (No te lo esperabas ¿Eh?)
Cuando tu vas a la escuela, cuando te aprendes un chiste, cada vez que lees un libro, (diría cuando estudiáis, pero no se muy bien de qué va eso xD), estás guardando en tu memoria datos, que luego usarás para algo.
En informática, solemos referirnos a las memorias con el mismo significado: "Lugar físico donde se almacenan los datos del Software".
Es importante que sepáis diferenciar dos tipos de memoria: ROM y RAM
ROM: Read Only Memory
(Memoria de Solo Lectura)
(Memoria de Solo Lectura)
Lo que dice Wikipedia:
Es un medio de almacenamiento utilizado en ordenadores y dispositivos electrónicos, que permite sólo la lectura de la información y no su escritura, independientemente de la presencia o no de una fuente de energía.
Lo que os digo yo: ¡Wikipedia me la fuma!
La definición dada de ROM es correcta, pero, nosotros como buenos "ROM Hackers" que somos, sabemos que es tan editable como un block de notas ¿Verdad?
Pues a ver, os daré una definición nueva, totalmente radical, para que entiendan mejor porque se llama Rom, y la editamos como queremos.
La ROM, es una memoria que el procesador solo puede leer, ya sea para tomar datos, transformarlos, operar con ellos y obtener la información que necesitamos, o para sacar la Línea de Instrucciones que deberá seguir.
También se dice que es una memoria "No Volátil", ya que no importa cuantas veces abramos o cerremos el Rom/Ejecutemos el Juego (Emulador / Consola) sus datos no se borraran ni cambiarán.
RAM: Random Acces Memory
(Memoria de acceso Aleatorio)
(Memoria de acceso Aleatorio)
Ésta es más sencilla de explicar:
Ésta memoria de acceso aleatorio, se llama así no porque sea "Tirar un dado para ver si justo caigo donde quiero. Sino que su nombre deriva de que se puede acceder a cualquier parte de ella en cualquier momento; ya sea para escribir o leer.
En GBA, tenemos varias "RAM", las cuales veremos más a fondo más adelante, pero ya las nombramos la clase anterior: WRAM (Working Ram), VRAM (Video RAM), PRAM (Palette RAM), SRAM (Static RAM).
Ahora, siguiendo con las Memorias en general, dijimos que guardan datos; la ROM de Gba puede hasta 32Mega Bytes de datos; aunque algunos de ellos son "intocables", la mayoría se pueden editar.
Punteros/Offsets
Cada dato de la memoria, tiene una dirección asociada, conocida como Offset o PunteroExplicado en un gráfico:
A la izquierda tenemos las direcciones (Offsets, punteros) de nuestra memoria y a la derecha los datos de cada dirección. (Éstas direcciones son manejadas internamente por el procesador, pero éste tema ya no nos interesa).
Por ejemplo aquí, en el Offset 0200 encontramos el byte A1
Es importante remarcar que cada Offset apunta a un único Byte.
En nuestro ROM, constantemente editamos Bytes en Offsets, ya que toda la data se guarda allí. Si nos equivocamos en un solo valor, ya la cagamos xD
En el ejemplo práctico, nuestro Rom tenia solo 8KBytes de memoria (ya que podía llegar hasta FFFF como mucho).
Pero la realidad es otra, un Rom de pokémon llega hasta los 0xFFFFFF de memoria ROM, e incluso, con una "F" más: 0xF FF FF FF (Éstos son los Roms extendidos).
Offsets Permutados: Ésto es corto, pero se los subrayo porque es IMPORTANTE. El procesador siempre utilizará los Offsets y punteros "Permutados" (O transpuestos), esto es así:
El offset será: 0x0812AB34
Para permutarlo se hace lo siguiente:
-Se los separa de dos en dos: 0x 08 12 AB 34
-Se pone el ultimo par primero, el tercero segundo y asi: 34 AB 12 08
*Recordar que siempre que hagamos referencia a la ROM, se empieza con un 08, como dimos a lo ultimo de la Clase 0
Ejemplo práctico
Herramientas necesarias:
Editor Hexadecimal Yo usaré HxD
Rom de Fire Red (USA)
Ésto será como una receta de cocina
Abrid vuestro Rom en HxD: (File > Open)
Aquí se puede ver como están los datos del ROM y los Offsets que los direccionan.
Pero bueno, la idea es ver de qué nos sirve ¿verdad?
1- Id a al offset 0x54A00 presionando Ctrl + G o llendo a "Search > Goto"
Dejad presionado "Hex" y "Begin" y escribir la direccion en la casilla sin el 0x, llegaran a una linea asi:
2-Cambiad ese 0x06 por un 0x04 (Les aparecerá en rojo, es decir, cambio sin guardar)
Ahora repetir ambos pasos pero con los siguientes offsets y datos:
0x54A04 - 0x06
0x54A06 - 0x05
0x54A08 - 0x07
Probad vuestro rom...
¿Pero qué hicimos?
¡Les queda de tarea! En unos dias editaré para quien desee saber la respuesta...
Nota: Tiene algo que ver con lo que estuvimos escribiendo hoy :awesome:
_______
Referencia a los otros temas:
Clase 0 - Comprendiendo lo muy muy básico
Clase 1 - Comprendiendo lo Básico
Clase 2 - Registros, conociendo al procesador.
Clase Número 3: Instrucciones Básicas
Última edición: