jepalza escribió:¡Exactly!
Por ahí van los tiros.
Dos comentarios, por ahora: el contador de la IRQ, una vez agotado, deberías ponerlo a "100", no a "100+contador", por que puede ocurrir que nunca sea 100 exactos, sino 99, o 97, y aunque es una minucia como la copa de un pino, en una emulación real, pierdes unos ciclos muy valiosos, y haces un funcionamiento aleatorio, una veces salta en 100, otras en 97, etc. En la vida real, no se va a notar, pero sí en un equipo real.
Capicci!!!

Y luego, te faltaría una pila de datos (según avances la emulación), para guardar allí las direcciones de saltos y demas, de modo que el PC no siempre sería "PC=PC+1", sino que dependería de si una rutina le obliga a saltar a la 100, y luego, al retornar, vuelve a ser 1 por ejemplo.
Ok! Poco a poco...
Y lo de la IRQ, el contador, que lo has pillado, debes mirar el hardware, como lo interpreta, si es por ciclos consumidos, o por instrucciones consumidas. Si es por intrucciones, lo tienes bien, si es por ciclos, debes mirar y meter en las variables de instrucciones, el apartado de ciclos a usar, y emplearlos para descontar al contador, en lugar de descontar nº de ins leídas.
Para el tema de las IRQ... declaro como he hecho un contador, que salta cada X y FUERZA ejecutar la IRQ.
pero ¿como sabemos que IRQ usar?
Si es "provocada" por el teclado, entiendo que fácilmente podemos añadir un Registro_tipo_IRQ y en el SELECT CASE de turno, ejecutamos la IRQ que corresponda.
Si es por software, también se debería poder "meter" en algún registro...
¿correcto?
Se me olvida: sigues con la idea, de que las IRQ deben ir nombradas, 0 para pantalla, 1 para teclado, pero no es así. Si lo quieres ver así, no pasa nada, funciona igualmente, pero debes entender que la IRQ es única. Simplemente, se ha generado, bien por agotamiento del tiempo establecido en la CPU, bien por que un dispositivo la ha llamado. Simplemente, se ha activado la IRQ, y nada mas. Una vez activada y en la rutina, tu no sabes si ha sido el teclado o la pantalla, solo sabes que has llegado por uno de los motivos citados antes. Lo que ocurre, es que en esta rutina, estudias cada caso. Por ejemplo, la pantalla es casi obligatorio refrescarla, asi que vas a ello sin preguntar, como mucho, miras que el refresco de la pantalla (el sincronismo vertical), este fuera del marco visible, para evitar parpadeos y evitar dibujar en medio del rayo (así es en el hardware real, en la emulación no pasa eso, pero es una emulación, osea, que debe ser fiel a la realidad). El teclado, idem, ya que estas en la rutina de la IRQ, lo miras por si hay tecla pulsada.
Aja... Entonces... en el main loop, al decrementar el contador de IRQ... habra IRQ's que saltaran cada X ciclos, y otros cada X otros ciclos... ¿si?
El caso de una IRQ activada externamente, como puede ser un teclado, es diferente, y en ese caso, no te queda mas remedio que meterte con la multitarea, o sea, con una rutina aparte que se llama continuamente al márgen de como vaya la CPU y dónde se encuentre. Si una vez en la multitarea del teclado, se pulsa una tecla, entonces se genera una IRQ (NMI) y la CPU, al seguir su curso, ve que alguien ha puesto la NMI a "1", y para lo que esté haciendo, pone la IRQ igualmente a "1" y salta a la rutina. Como ya tienes NMI y IRQ a "1" ambos, sabes que alguien externo, en este caso el teclado, ha pedido saltar ahí.
Pero este caso es mas raro que se emplee en micros viejos, por que detienes a la CPU en un punto que no se esperaba, y se pueden producir parpadeos de la pantalla, por poner un ejem,plo.
Ok, cuando "salta" la IRQ, "trapeamos" quien la envia, si teclado, video, cinta, lo que sea...
Creo que si me aclaras esto, ya puedo avanzas BASTANTE más... y currarme la implementacion de mas instrucciones...
Gracias como siempre por anticipado.