Rinconete escribió:Me gustaría probar el ejercicio que propones y escribir también una rutina de servicio de la int del temporizador para leer la memoria de vídeo...
Sería el emulador de Spectrum que interpretaría el Sinclair BASIC más rápido del mundo, creo
Necesitarías:
- Una ROM recompilada para 8086, es decir una ROM que use opcodes del 8086. Algunos opcodes no se podrían implementar, como IM x, pero creo que la ROM sólo usa IM 1.
- Tu programa deberá reprogramar el 8254 del PC (IRQ 0, o INT 08h en MSDOS) para llamar, cada 1/50 de segundo a una rutina "fuera del espacio del Spectrum" que se encargara de volcar los 6912 bytes de la memoria de pantalla, a la VGA, por ejemplo, a una VGA en modo 13h (MCGA).
- La ROM original deberá sustituir cualquier IN 254 (para leer el teclado) por una rutina que lea el valor "traducido" del teclado del PC. Es decir, necesitarás un gestor de interrupción para el teclado del PC (IRQ 1, o INT 9 en MSDOS) que cuando se reciba una pulsación o depulsación de una tecla del PC actualice un mapa en memoria que refleje el estado de la matriz del teclado del Spectrum. Cuando en la ROM aparezca un IN 254, deberá sustituirse con el valor leído de este mapa, según la semifila requerida.
- Asimismo, cualquier OUT 254 que afecte al altavoz (en la ROM esto sólo se hace en la rutina BEEPER) se sustituirá por código equivalente en el 8086 que use el puerto 61h (creo que era ese) donde se encuentra el altavoz del PC.
Haces un programa (un .COM por ejemplo, es más cómodo para esto) que atrape la INT 08h y INT 09h. La INT 08h la reprograma para que emita una interrupción 50 veces por segundo, y la diriges a una rutina que se encargue de repintar la pantalla, y de ejecutar la rutina situada en la dirección 38h del segmento de la ROM.
La INT 09h leerá teclas del PC, las mapeará a ZX Spectrum y mantendrá una estructura en memoria semejante a la matriz del teclado del Spectrum (por ejemplo, 8 variables que contengan cada una el estado de una semifila). La ROM estará, como te decía antes, modificada para que un IN 254 se traduzca en una lectura a la variable correspondiente.
La ROM la vuelcas en los primeros 16K de un segmento de memoria real. La RAM serán los 48K restantes. Tu rutina de actualización de pantalla tomará los datos de los segundos 16K del segmento.
Cuando esté todo listo, no tendrás más que saltar al comienzo de la ROM traducida, y a partir de ahí, el "Spectrum" está funcionando.
El emulador así hecho no sería capaz de cargar o grabar programas a cinta, entre otras cosas porque iría demasiado rápido para los timmings que maneja el Spectrum real, pero podrías perfectamente teclear programas en BASIC y verlos ejecutarse a una velocidad vertiginosa: una instrucción Z80 original = una instrucción 8086 original. Si tomamos que un Z80 va a 3,5MHz y un 8086 (vamos, un Pentium/AMD de los de ahora) va a 3,5 GHz (vale, va a menos, pero recordad que son máquinas superescalares y aún trabajando a 16 bits, eso se nota, así que la velocidad de reloj "aparente" es mayor que la velocidad real), esto significa que el intérprete de BASIC, y nuestros programas, irían 1000 veces más rápido. Incluso si eliges ejecutarlo dentro de DosBOX, iría más rápido que cualquier emulador de MS DOS ejecutado dentro de DosBOX (acabo de probar mi copia registrada del Z80 de Gerton Lunter en el DosBOX y lo que antes iba a 100% en un 486 DX4/100, ahora va al 58%).
Eso sí, sólamente programas BASIC puros. Ni un sólo POKE que no sea a las variables del sistema o a la pantalla, y ni un RANDOMIZE USR... ¡¡¡a menos que la rutina del USR sea código máquina del 8086!!!