En los comentarios me han preguntado cómo implementar las interrupciones, así que os comento brevemente cómo lo he hecho yo para que cada uno saque sus propias ideas.

Antes de nada, os sugiero leer esta entrada donde ya comenté el funcionamiento de los modos de interrupción, tipo de interrupciones y el hardware asociado a todo esto.

Bien, si no me equivoco, en la Master System el único dispositivo que provoca interrupciones es el VDP. En concreto, genera una interrupción en dos momentos diferentes: al acabar de pintar un fotograma y al acabar de pintar una línea. Ya escribiré una entrada al respecto más adelante, pero así os hacéis una idea.

Por otro lado, según el manual de referencia de la propia SEGA, la Master System solo atiende al modo de interrupción 1 (el más sencillito de ellos), así que a menos que los programadores se salten las recomendaciones en sus juegos y establezcan otro modo sería suficiente con implementar éste (aunque yo he implementado los 3 posibles).

Respecto a las NMI, su línea está directamente conectada con el botón de Pausa de la consola, así que ese es el único momento en que se genera.

Vale, dicho esto, el Z80 tendría que tener una variable (o una función que acceda al VDP) que le diga si está activa la línea de interrupciones. Antes de ejecutar cada instrucción, si se encuentra activa la línea y están habilitadas las interrupciones (biestable IFF1=1) el procesador tratará la interrupción del modo en que se encuentre.

Concentrándonos en el modo 1 de la SMS, el Z80 salvaguardará el PC en la pila (igual que una instrucción PUSH(PC)), inhibe las interrupciones (para evitar que se encadenen) poniendo IFF1=IFF2=0 y carga el PC con el valor 0×0038.

A partir de ahí ya se seguirá ejecutando como de costumbre en la dirección 0×0038.

En cuanto a las NMI, la cosa es más sencilla, pues siempre que esté activada su línea se ejecutará la rutina, es decir, se salvaguarda el PC como en las INT, se salva IFF1 en IFF2 y se pone IFF1 a 0 y se salta a la dirección 0×0066.

Una cosa que no hice bien en su momento y tuve que rehacer hace unos días fue el tema de la línea de interrupciones, pues es el propio dispositivo que interrumpe el que debe solicitar la línea y desactivarla cuando no la necesite.

Espero que haya quedado más claro.