Bindings python de un emulador del procesador Z80.
Esto es una prueba de concepto, todo muy pre-alfa.
El emulador está escrito en C (https://github.com/anotherlin/z80emu) con lo que la velocidad de python no es un problema.
Python por su parte proporciona la facilidad de programación y la posibilidad de experimentar con el emulador desde el intérprete interactivo.
El binding permite asociar al emulador una función (escrita en python) que será llamada en ciertos momentos. Esto permite simular hardware adicional o llamadas al sistema sin necesidad de escribir C. En el ejemplo zexall.py se muestra como utilizar esto para simular llamadas al sistema CP/M y poder ejecutar en el emulador un binario compilado para ese sistema.
Crear un emulador:
from pyz80 import Z80
emu = Z80()
Leer la memoria, un byte:
emu.memory(0x1234)
Escribir la memoria, un byte:
emu.memory(0x1234, 0xAB)
Escribir un bloque de memoria, n bytes, desde una cadena (str
py2,
byte
py3):
data = "\0x01\0x02\0x03"
emu.load_memory(data, 0x1234)
Escribir un bloque de memoria, n bytes, desde un bytearray
:
data = bytearray([0x01, 0x02, 0x03])
emu.load_memory(data, 0x1234)
Leer un registro:
emu.register("A")
Escribir un registro:
emu.register("A", 0xAB)
Asignar syscall:
def my_syscall(z):
print "SYSCALL"
emu.syscall(my_syscall)
Comprobar si la emulación ha finalizado:
if emu.is_done:
print "Fin"
Obtener el número de ciclos emulados:
print emu.cycles
El directorio src/examples contiene varios ejemplos:
- demo.py: ejemplo sencillo en el que se muestra como cargar un programa y ejecutarlo.
- zexall.py: muestra como implementar llamadas al sistema.
- Mejorar syscall. Actualmente es la adaptación directa del programa de ejemplo que viene con el emulador. En ese sentido me da que es una solución especializada que podria mejorarse, pero antes necesito aprender mas del Z80.
- Mejorar la API, no es muy pythonica.
- Añadir profiling. Por el momento añadir contadores para las lecturas i escrituras de la RAM.