Mensajepor jepalza » 02 Oct 2012, 21:57
Veamos:
Las IRQ no se definen como "teclado", "video" y demas. No. Las IRQ son solo pausas en la CPU, y las genera la CPU. Y no porque el teclado o el vídeo las llame. Lo que ocurre, es que, por hard o soft, puedes hacer que al pulsar una tecla, se detenga la CPU mediante una IRQ que tú has programado (bueno, el fabricante del ordenador).
Tu escribes una rutina de tratamiento de IRQ (o dos, o tres o las que IRQ que lleve). En el ejemplo que te he puesto del 6809, hay 3: IRQ, FIRQ, y NMI. La IRQ es la normal, la FIRQ es una IRQ Rápida (de ahí la "F" de Fast), y es para pararse sin hacer preguntas, y ahorrar algún ciclo de reloj, tan necesario en muchas situaciones, como juegos muy complejos. Y la NMI es la Hardware, que se activa externamente por una patilla de la CPU que puede ir colocada en el teclado, de ahí, que el teclado genere una NMI (que es una IRQ no enmascarable o en ingles "Not Maskered IRQ" o algo así).
Así que, tu programa llevará "x" rutinas de IRQ, una para cada tipo que lleve la CPU. Y no una para el teclado, otra para el video, etc. No, solo una general. Al llegar a esa IRQ, es donde miras si ha side el teclado, o el vídeo o el reset el que la ha llamado, y entonces sí que saltas a la rutina de teclado o la que sea.
Los puntos 1 y 2a es "ma o meno" como dices, pero ojo con el PC, que no todas las CPU empiezan en "0". El Z80 sí empieza en la "0", pero el 6809, empieza en la FFFE (dos bytes antes del final), lee esa dirección y salta al código. Tu CPU debes mirar dónde empieza, y el PC apuntará ahí.
La tabla de bytes de INS, eso a gusto del usuario. Yo por ejemplo, (bueno, y el 100% de los programadores) metemos en un Array del tamaño de la ROM (por ejemplo, 16k) todo el código de la ROM, y vamos cogiendo de byte en byte desde ahí, según donde apunte el PC. Al leer ese primer byte, actuas en consecuencia, y saltas a la rutina que corresponde a ese byte, y desde ahi, vuelves a leer otro byte (si es NOP, simplemente, no haces nada, o sino lo has hecho antes, pues incrementas PC, decrementas pulsos de IRQ, y vuelves)
En el punto 7a, es como dices, en una tabla tienes, la INS (su nº e incluso, para depuracion, su nombre real, el del ASM, aunque luego no lo uses) su nº de bytes trás ella, el nº de ciclos que gasta, y si es un modo especial o no (como las INS extendidas del Z80)
El punto 8a, generalmente, se descuenta, no se suma. Creo que es mas limpio el código, si vas restando hasta llegar a "0", que si vas sumando hasta alcanzar "x".
El final, no te entiendo bien, pero las llamadas a video y teclado pueden ser cuando a ti te venga en gana, o cuando el creador del ordenador lo programara.
Si haces muchas llamadas a video y teclado, cada poco tiempo, enlenteces el emulador, pero se verá fluido, si llamas cada muuuucho tiempo, irá a saltos, y verás cada pocos FPS.
Lo del bucle principal, es la vida del emulador, el corazón.
Primero, inicializas todo a "0" (o al valro que sea, por que una IRQ, según que CPU, puede que vaya activada desde el principio, no tiene que ser "0")
Luego, entras en el bucle principal, ahí lees el primer byte al que apunta el PC, saltas a la rutina que emula ese byte, vuelves al bucle principal
y entonces,decrementas contador de IRQ, o miras teclado, o refrescas vídeo, etc, pero no todo al mismo tiempo, ni todo en cada INS, por que entonces, el emulador no va a poder con todo. Digamos que lees el estado del teclado cada 100ins, y refrescas el vídeo cada 200ins. Es por poner un ejemplo, pero esos valores te los dicta el hardware, el cómo se ha diseñado ese ordenador.
Ahí entramos ya en un mundo mas complejo: el refresco del vídeo se hace cada "x" mhz del ordenador, para lo cual, debes saber cuando saltar la IRQ. AHora no recuerdo la fórmula, pero era algo así como dividir los MHZ por los HZ del pais, ejemplo un equipo de 2mhz de velocidad, son 2000000 de hz, dividido entre los 60hz del estándar de la tele, quedan 33333 ciclos, o sea, que cada 33333 ciclos de INS ejecutadas, se genera una IRQ de vídeo. (esto, a groso modo)
Pero eso es liarse, lo mejor, es ir probando hasta lograr tu propio ciclo de IRQ.
Y por ahora, dejo de escribir, que me duelen los dedos.