Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa | |||
cursos:ensamblador:avanzadas1 [21-01-2024 10:26] – [Obtener el valor de PC (Contador de Programa)] sromero | cursos:ensamblador:avanzadas1 [21-01-2024 10:31] (actual) – [Obtener el valor de PC (Contador de Programa)] sromero | ||
---|---|---|---|
Línea 433: | Línea 433: | ||
Con esto el mismo juego 48K podrá tener música en modo 128K con unos pequeños añadidos muy sencillos, y ser compatible con ambos modelos. | Con esto el mismo juego 48K podrá tener música en modo 128K con unos pequeños añadidos muy sencillos, y ser compatible con ambos modelos. | ||
+ | |||
+ | \\ | ||
+ | \\ | ||
+ | ===== Código Automodificable ===== | ||
+ | |||
+ | Ya vimos en un capítulo anterior un ejemplo de **código automodificable**. Consiste en sobreescribir en memoria un opcode o un dato en función de una condición, para que cuando lleguemos a ese punto del programa, se ejecute el opcode modificado. | ||
+ | |||
+ | En el ejemplo que ya vimos, utilizamos código automodificable para sobreescribir un instrucción de carga " | ||
+ | |||
+ | <code z80> | ||
+ | ld (save_bc+1), | ||
+ | ; opcode "ld bc, NN NN" en memoria | ||
+ | |||
+ | ... hacer cosas con BC, perdiendo su valor ... | ||
+ | |||
+ | save_bc: | ||
+ | ld bc, $0000 ; En el LD anterior cambiamos $000 | ||
+ | ; por el valor de BC, así que cuando | ||
+ | ; el z80 llegue aquí no es ya ld bc, 0 | ||
+ | ; sino ld bc, valor_que_tenia_BC | ||
+ | ; así que recuperaremos BC aquí. | ||
+ | </ | ||
+ | |||
+ | Cuando se ejecuta la instrucción '' | ||
+ | |||
+ | Cuando se ejecuta el '' | ||
+ | |||
+ | La escritura en memoria ('' | ||
+ | |||
+ | Y no sólo podemos modificar datos, también podríamos modificar opcodes, cambiando '' | ||
\\ | \\ |