Registrarse

[ASM] Clase 1 : ASM - Hex

Cheve

MoonLover~
Miembro de honor
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)​

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)​

Ésta es más sencilla de explicar: De entender se encargan ustedes... xD

É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 Puntero
Explicado 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 :rolleyes:

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... :cool:

¿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:

Jon.

Usuario mítico
Respuesta: GBA | Otros | ASM - Clase Numero 1 - Comprendiendo lo Basico (HEX)

Muy bueno Lucas. Ya sabía muchas de estas cosas, pero con el tiempo uno se va olvidando.
Siempre me gustaron tus tutoriales, son simples y dinámicos.

Espero ver la parte 2 ;)

Saludos.
 

Silver.Exe

Nivel 30, wiii
Respuesta: GBA | Otros | ASM - Clase Numero 1 - Comprendiendo lo Basico (HEX)

Yo kiero ssver, yo iero sver!

Okno.

Muy buena guía para los principiantes (como yo) que recién entran en el romhack (como yo), aunque yo personalmente uso rpg maker.

Buena suerte y que no se caiga!
 

MegaSceptile9

Usuario mítico
Respuesta: GBA | Otros | ASM - Clase Numero 1 - Comprendiendo lo Basico (HEX)

¿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
ARG, dinos ya!!!!!, soy muy vago para hacer por mi mismo -.-

Muy buena guía por más que me expliquen esto...no termino de entender como funciona, mejor sigo estudiando medicina espero que no pares de hacer los demás tutos.
 

Dragonite

But where's your heart
Respuesta: GBA | Otros | ASM - Clase Numero 1 - Comprendiendo lo Basico (HEX)

Pues yo no notú nada raro ._. ?Ser? que lo apliqué en mi hack y no en una ROM limpia?
 

Neodanix

El mejor Nuv de todos ;^)
Respuesta: GBA | Otros | ASM - Clase Numero 1 - Comprendiendo lo Basico (HEX)

Mmm acabo de hacer los cambios del offset de tarea en una rom limpia y... ¿El cambio es que empiezas en otra ciudad? Osea que ¿con esos punteros manejas el Warp principal?
 
Respuesta: GBA | Otros | ASM - Clase Numero 1 - Comprendiendo lo Basico (HEX)

Vaya, lo que hace es que aparezcas en un centro pokémon de otro pueblo... pero no entiendo cómo has hecho eso o_O

Edito: Aaaaahhhh!! el 0x06 y 0x05 es el Mapa (la ciudad)??? y el 0x07 y 0x04 son las coordenadas dentro del centro pokemon?? Pero cómo has hecho para que aparezca dentro del Centro, es decir, sin asignarle el mapa del centro??

PD: Creo que me estoy liando xD
 

Laquin

Usuario mítico
Re: GBA | Otros | ASM - Clase Numero 1 - Comprendiendo lo Basico (HEX)

Espera al finde y lo digo xD

Muy buen tu to Cheve, ojalá lo acabes, quién sabe, igual acabo haciendo mejores rutinas que @javi4315- o @eing (?)


Gracias y saludos :D

PD: Al final no lo hice :v
 
Última edición:

Cheve

MoonLover~
Miembro de honor
Respuesta: GBA | Otros | ASM - Clase Numero 1 - Comprendiendo lo Basico (HEX)

Pues me he olvidado al final de deciros que es lo que cambiamos xD

Lo que se cambian son los datos que lee el juego del "Mapa inicial", así es que introducimos, mediante Hexadecimal, en qué mapa empezamos y en qué coordenadas ;)
 

Bethermy

Aprendiz en ascenso
Respuesta: GBA | ASM | Clase Numero 1 - Comprendiendo lo básico (HEX)

bah, se que esto es un tema viejo, pero llevo horas leyendo tutoriales de ASM y al fin encuentro uno que entiendo de a poco (lo leo varias veces, se me explota la cabeza y la vuelvo a montar por parte para seguir), pero bueno al caso.

El punto es, ¿cómo consiguió encontrar el offset de la ubicación de inicio del juego? ¿se puede encontrar el offset de cualquier cosa del juego? ¿cómo?
 

Kaiser de Emperana

Called in hand
Re: Respuesta: GBA | ASM | Clase Numero 1 - Comprendiendo lo básico (HEX)

bah, se que esto es un tema viejo, pero llevo horas leyendo tutoriales de ASM y al fin encuentro uno que entiendo de a poco (lo leo varias veces, se me explota la cabeza y la vuelvo a montar por parte para seguir), pero bueno al caso.

El punto es, ¿cómo consiguió encontrar el offset de la ubicación de inicio del juego? ¿se puede encontrar el offset de cualquier cosa del juego? ¿cómo?
No creo que Cheve haya buscado el mismo los offsets de la posición inicial, los debe haber sacado directamente de alguna herrmienta que los modificaba.

Pero respondiendo tu otra pregunta, sí, se puede. Así es como lo encontraron en el primer lugar.
Sobre como hacerlo, hay muchas formas diferentes que se podría buscar y dependiendo que estes buscando alguna puede ser más rápida que la otra.
Por ejemplo, sabemos que los mapas tienen un número de banco y un número de mapa. Si abrís A-Map, mirás el numero de mapa y ves que es 0x16. Podrías simplemente cambiar uno por uno tooodos los bytes iguales a 0x16 del rom hasta que encuentres el correcto.
Que incluso, haciéndolo de una forma más eficiente podría llegar a no ser una tan mala idea.
Este es el método que se usa por ejemplo para traducir, buscar los bytes que coinciden y ver cual es el que me interesa.

Pero bueno, para la mayoría de las cosas ese método no es muy bueno que digamos. Lo mejor siempre suele ser el buscar algun punto de inicio, que sepas que esta relacionado con lo que estás buscando y usar un debugger (como vba-sdl-h) para acercarte a ello.
Por ejemplo en este caso, vos buscás la posición inicial del jugador. ¿Qué puede estar relacionado con la posición inicial del jugador? Yo diría que la posicion actual xD
La posición actual tiene que estar en la RAM y si bien no sabemos dónde, para buscar cosas en la ram podemos usar un método como este para encontrarlo.

Una vez encontrada la posición actual, podemos buscar la primera vez que esta es escrita y de allí podremos encontrar facilmente la dirección de la ROM en que fue leida.
No hay ttutoriales en este foro de como usar un debugger, pero el yo recomiendo el tutorial de knizz.

A medida que lo fui escribiendo me di cuenta que esto no se iba a entender absolutamente nada... Uno de estos días capaz que haga un tutorial rápido de como hacerlo... xD

Saludos y perdón por probablemente haberte confundido más.
 
Arriba