Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
cursos:ensamblador:avanzadas1 [19-01-2024 08:32] – sromero | cursos:ensamblador:avanzadas1 [21-01-2024 10:31] (actual) – [Obtener el valor de PC (Contador de Programa)] sromero | ||
---|---|---|---|
Línea 183: | Línea 183: | ||
ORG 26000 | ORG 26000 | ||
- | ; Ponemos la pila colgando del programa principal, | + | ; Ponemos la pila colgando del programa principal, |
- | ; y fuera de la contended memory. | + | ; de la contended memory. Si necesitaramos volver a BASIC |
+ | ; habria que hacer una copia de SP en una variable para | ||
+ | ; recuperarla antes del RET final del programa. | ||
ld sp, 33500 | ld sp, 33500 | ||
- | call detectar_modelo_128K | + | call Detectar_Modelo_128K |
- | call inicializar_algo | + | call Inicializar_Algo |
- | menu: | + | Menu: |
; codigo del menu aqui. | ; codigo del menu aqui. | ||
; ... en algun punto.. | ; ... en algun punto.. | ||
- | call iniciar_partida | + | call Iniciar_Partida |
- | jp menu | + | jp Menu |
graficos_menu DEFB ..... | graficos_menu DEFB ..... | ||
Línea 210: | Línea 212: | ||
ORG 33500 | ORG 33500 | ||
- | iniciar_partida: | + | Iniciar_Partida: |
; codigo del juego aqui | ; codigo del juego aqui | ||
Línea 430: | Línea 432: | ||
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 '' | ||
+ | |||
+ | \\ | ||
+ | ===== Obtener el valor de PC (Contador de Programa) ===== | ||
+ | |||
+ | Utilizando '' | ||
+ | |||
+ | <code z80> | ||
+ | call NextInstr | ||
+ | NextInstr: | ||
+ | pop hl ; HL contiene ahora PC | ||
+ | </ | ||
+ | |||
+ | Al ejecutarse '' | ||
+ | |||
+ | ¿Para qué podría valer algo así? Nuestro compañero **< | ||
+ | |||
+ | <code z80> | ||
+ | Imprimir_Mensajes: | ||
+ | call MyPrintString | ||
+ | DB " | ||
+ | call MyPrintString | ||
+ | DB " | ||
+ | call MyPrintString | ||
+ | DB " | ||
+ | (...) | ||
+ | |||
+ | MyPrintString: | ||
+ | pop hl ; obtenemos la direccion de la cadena (PC) | ||
+ | mpr_loop: | ||
+ | ld a, (hl) | ||
+ | cp $ff | ||
+ | Jr z, mprexit | ||
+ | rst $10 | ||
+ | inc hl | ||
+ | jr mpr_loop | ||
+ | mpr_exit: | ||
+ | push hl ; introducimos direccion de retorno | ||
+ | ret ; PC continuará después de la cadena impresa | ||
+ | </ | ||
+ | |||
+ | La llamada a '' | ||
+ | |||
+ | La rutina extrae ese valor de la pila y lo usa como " | ||
+ | |||
+ | Esto nos evitaría lo siguiente, que suponen 3 bytes por cada instrucción '' | ||
+ | |||
+ | <code z80> | ||
+ | ld hl, cadena1 | ||
+ | call MyPrintString | ||
+ | ld hl, cadena2 | ||
+ | call MyPrintString | ||
+ | ld hl, cadena3 | ||
+ | call MyPrintString | ||
+ | </ | ||
\\ | \\ | ||
**[ [[.: | **[ [[.: |