¿Puede haber otra interrupción que no sea de linea o VBLANK?

Por Mustang

Resident (49)

imagem de Mustang

29-05-2020, 11:48

Buenas a todos. Estoy programando una rutina de interrupción de línea y de VBLANK y me ha surgido una duda para la que no encuentro una respuesta segura. Ahora mismo en la rutina compruebo el bit 7 del registro S#0 para ver si hay interrupción VBLANK. Si está activado salto al código de la interrupción VBLANK y si no lo está compruebo el bit 0 del registro S#1. Si está activado salto al código de la interrupción de línea y si no lo está termino la interrupción. Me funciona perfectamente, pero como quiero optimizar al máximo la rutina me pregunto es si es necesario/conveniente esta segunda comprobación de la interrupción de línea o puedo suponer que si hay interrupción y no es VBLANK entonces tiene que ser la de línea forzosamente y puedo prescindir de forma segura de la comprobación. ¿Tengo que leer obligatoriamente S#1 para provocar que se resetee el flag de interrupción de línea?. ¿Pasa algo si no lo reseteo?. ¿Podría producirse otra interrupción que no fuese de linea o VBLANK que me provocara un fallo garrafal al estar dando por supuesto que sólo voy a tener interrupciones de linea o VBLANK?. ¿Qué otra cosa podría provocar una interrupción?. Gracias.

Entrar ou registrar-se para comentar

Por Juan Luis

Master (147)

imagem de Juan Luis

29-05-2020, 20:18

Sí, tienes que leer el registro de estado para que el VDP entienda que has atendido a su interrupción. Si no lo haces, lo que ocurrirá es que tras terminar la rutina de servicio de interrupción ISR, el VDP asume que no le has atendido y volverá a interrumpir a la CPU, y así hasta que leas su registro de estado.

Respecto a si hay otras interrupciones, la respuesta es sí dependiendo de la configuración de tu MSX. Por ejemplo, la disquetera puede emitir interrupciones, pero antes habrías tenido que darle una orden de lectura/escritura, y tras leer un sector, la disquetera envía una interrupción a la CPU para que le atienda y lea/escriba los datos del sector en/desde un buffer. También, recuerda que puedes tener otros VDPs en el sistema. Por ejemplo, si tienes una GFX9000, el V9990 también puede emitir interrupciones, aunque por defecto están desactivadas. Las señales de sincronismo vertical de los VDP adicionales son independientes aunque vayan a la misma frecuencia de barrido.

Hay muchos otros periféricos, y dependiendo del fabricante podrían enviar también sus interrupciones.

Lo que no está muy logrado, en general, en las arquitecturas de Z80 es el filtrado del periférico que provoca la interrupción. El Z80 tiene 3 modos de interrupción, el 0, el 1 que es en el que está habitualmente el MSX y el 2. En el modo 1, la ISR tiene que hacer polling y averiguar qué periférico a emitido la interrupción y leer su registro de estado.

En los modos 0 el periférico puede poner un código de instrucción en el bus de 3 bytes (normalmente una instrucción de salto a una rutina de interrupción), y en el modo 2 el periférico coloca un byte en el bus, y el Z80 puede con ese byte y el valor del registro I crear una dirección de salto a una rutina de interrupción específica, lo que permitiría atender al periférico sin hacer polling. Hasta donde yo sé, ningún fabricante de periféricos dio soporte en el MSX a los modos 0 y 2 del Z80, ni emitiendo instrucciones de salto ni enviando un byte durante la interrupción.

Por Mustang

Resident (49)

imagem de Mustang

30-05-2020, 12:42

Muchas gracias Juan Luis, que respuesta tan completa. Da gusto encontrar gente con estos conocimientos en el foro.

Por mohai

Paragon (1031)

imagem de mohai

31-05-2020, 19:19

Muy buena y resumidita la explicanción de las interrupciones.
Que yo sepa, el Z80 en el MSX sólo tiene conectada la patilla de interrupción al VDP y a los conectores de cartucho externos.
Creo que nada más puede interrumpir directamente al Z80.
No estoy seguro que la controladora de disco esté conectada ahí.
Los VDPs externos, como V9990 o el de Sega, supongo sí están conectados.

Por Mustang

Resident (49)

imagem de Mustang

01-06-2020, 11:55

Vaya, gracias mohai. Entonces por resumir entiendo que sólo el VPD y aquello que esté conectado a un slot de cartucho puede generar interrupciones. O sea, que ni la disquetera, ni el cassette, ni la impresora, ni teclado, ni nada que esté conectado a los puertos de los joystick u otros puertos que puedan existir podrían generar interrupciones. Bueno, si la disquetera de la que habla Juan Luis es externa y se conecta al MSX mediante un slot de cartucho tal vez sí produzca interrupciones....

Por mohai

Paragon (1031)

imagem de mohai

01-06-2020, 16:28

Mustang wrote:

Vaya, gracias mohai. Entonces por resumir entiendo que sólo el VPD y aquello que esté conectado a un slot de cartucho puede generar interrupciones. O sea, que ni la disquetera, ni el cassette, ni la impresora, ni teclado, ni nada que esté conectado a los puertos de los joystick u otros puertos que puedan existir podrían generar interrupciones. Bueno, si la disquetera de la que habla Juan Luis es externa y se conecta al MSX mediante un slot de cartucho tal vez sí produzca interrupciones....

Correcto.
El BIOS sólo atiende la interrupción del VDP en la dirección 38h. No hay rutina para tratar interrupciones de otros periféricos.
Lo que sí hay son 2 ganchos que se podrían desviar a tus propias rutinas y tratar la interrupción de otro hardware que tambien active la INT.

Por Manel46

Paladin (674)

imagem de Manel46

02-06-2020, 13:34

Los reproductores de música y efectos, se sitúan en estos ganchos. De manera que a cada interrupción se atiende al reproductor, manteniendo la música y o el fx que toque.
En el arranque en cada gancho hay un #c9 (ret), de hecho 3. Hay que colocar ahí el salto al reproductor. Estos 3 bytes se substituyen por #c3,#xx,#xx (jp dirección).
Los ganchos están en ram.