JaS: el principio

Después de pasearme por el código de JaS durante algún tiempo y de probar algunos programas, decido que el primer paso podría ser emular el comportamiento de los bits indocumentados del registro F, ya que los programas de test fallan todos debido a que el core Z80 de JaS no los emula.

El día 9 de enero de 2008, y tras intensas sesiones de hacking, consigo que el core Z80 pase todos los test del programa ZEXALL. Era un buen comienzo, pero solo acababa de empezar. Varias cosas complicaban el desarrollo. La primera de ellas era que ZEXALL te dice si un conjunto de instrucciones está mal o bien emulado pero, si falla, solo sabes que hay algo mal, no qué exactamente. Ello me obligaba a buscar un método de test más granular, más fino. Por otra parte, tenía la intención de emular la memoria compartida con la ULA (los primeros 16K de RAM), y ello me forzaba a modificar de forma importante el núcleo del Z80 y a mantener el resto del emulador en consonancia con los cambios realizados para poder compilar y probar lo modificado. Con ello, perdía mucho tiempo y dispersaba el tiempo de trabajo.

Finalmente, decidí sacar el núcleo Z80 del JaS y crear un mini-proyecto paralelo que llamé Z80Core. De ese modo conseguía tener un núcleo Z80 completamente reutilizable (¿quizá para un futuro emulador del Sinclair ZX80/ZX81?) y poder depurarlo de forma más detallada. Para ello, programé en Java un símil del coretest de FUSE. Básicamente, es un pequeño programa que se enlaza con el core Z80 de FUSE y que usa un fichero de entrada, que comprueba las instrucciones una a una y las compara con un fichero de salida esperado. Como para cada entrada define claramente los registros de entrada, los de salida y el contenido de la memoria al finalizar el test, siempre fallan tests concretos y sabes qué ha fallado para ese test que corresponde a una sola instrucción. Pasa muy a menudo que falla un grupo relacionado de instrucciones que, cuando se arregla, se solucionan todos de golpe. Al acotar tanto el problema, se acelera la solución.

Pero nada es perfecto. A mediados de enero de 2008 ya tenía un núcleo Z80 bastante apañado pero que, después de muchos cambios, no había forma sencilla de reintegrar a JaS. Y eso que aún no había hecho las modificaciones necesarias para emular la contended-memory, cosa que hice hacia finales de diciembre, tras un largo receso.

Tuve que hacer otra parada técnica hasta el tercer trimestre de 2009 porque en marzo volví a ser papá y ese tipo de cosas consumen mucho tiempo. Afortunadamente, aportan otro tipo de satisfacciones. :)

A partir de la tercera semana de septiembre, inicié otra modificación profunda del núcleo Z80 para cambiar el tratamiento de los flags y usar tablas para acelerar la emulación todo lo posible. El compilador Just In Time de Java hace maravillas, no milagros. Además, incorporé la emulación del registro escondido MEMPTR y tuve que hacerme a la idea de que me había alejado demasiado de la estructura de JaS y que incorporar al emulador ese núcleo me iba a llevar, al menos, tanto tiempo como empezar casi de cero (y digo casi, porque ya tenía JScr como inicio). Y tampoco era cuestión de tirar todo el tiempo invertido en la emulación del Z80 por no poder integrarlo al emulador original. Entre la opción de abandonar y la de hacer un emulador completamente nuevo, me incliné por la segunda opción.

Y a partir de aquí es donde empieza otro proyecto.