¿Alguien podria decirme en CRISTIANO que son las interrupciones, para que sirven, y ejemplo sencillito de como usarlas? Por que entre los IM2 etc, que si un RETI, y compañia, no me aclaro.
Ahora me pillas sin mucho tiempo, pero te voy a hacer un pequeño esquema.
1- ¿Qué es una interrupción?
Una interrupción no es más que una señal que le llega al procesador para decirle que ha de interrumpir la ejecución del código que está ejecutando en ese momento y que debe ejecutar una rutina de interrupción.
2- ¿Para qué sirve?
Para que cierto código se ejecute en momentos determinados. En todos los MSX tenemos la interrupción del VBLANK que genera el VDP cada 1/50 de segundo en PAL (cada 1/60 en NTSC). Por lo tanto esa interrupción nos sirve para sincronizar los volcados a VRAM, la música de los juegos, crear relojes, contadores... etc. Algunos MSX vitaminados pueden tener otro hardware que genere interrupciones, aunque con esos aún no me he metido
3- ¿RETI RETN RET?
Existen dos tipos de interrupciones: las enmascarables y las no enmascarables. Las enmascarables pueden ser ignoradas por el procesador, las no enmascarables no. El MSX NO tiene interrupciones no enmascarables, por lo que podemos olvidarnos de ellas. Así pues el uso de cualquiera de estas instrucciones al finalizar una rutina de interrupción nos devolverá al programa que originalmente estaba ejecutando nuestra CPU.
4- ¿IM0 IM1 IM2?
Son los modos de interrupción del procesador:
-En modo IM0 se espera que el dispositivo que ha generado la interrupción coloque en el BUS una instrucción de un byte (normalmente un RST). Al saltar la interrupción se ejecuta dicha instrucción. Es un modo poco (por no decir nada) útil en los MSX.
-En modo IM1 se ejecuta un RST 38, saltando a la rutina de la BIOS que se encarga de procesar las interrupciones. Esta rutina realiza un par de CALLs a los ganchos situados en la zona superior de la RAM: FD9A (lo llama en TODAS las interrupciones) y FD9F (lo llama SÓLO en las interrupciones provocadas por el VDP). Puedes echarle un vistazo al
snippet la rutina que hice para enganchar una rutina más rápida de restauración de interrupciones que se engancha en FD9A.
-El modo IM2 es algo más complejo, pero te da un control total sobre las interrupciones, ya que te permite definir la dirección de memoria a la que saltar cuando se produce una interrupción. Para ello hay que usar el registro I, donde hay que colocar el byte alto de dicha dirección. El byte bajo se toma del bus, peeeero como en MSX los periféricos que generan interrupciones NO ponen nada en el bus hay que hacer el siguiente truco:
a) Crear una tabla de 257 bytes que comience en una dirección múltiplo de 256 (así el byte bajo del comienzo de la tabla será 0).
b) Llenar esa tabla con el mismo valor J (por ejemplo $C0).
c) Colocar la rutina de interrupción en JJ (es decir, si hemos llenado la tabla con $C0, la rutina de interrupción debe estar en $C0C0)
Este es el modo más rápido y te permite ahorrar unas 8 ó 9 líneas de ráster por cada interrupción. Si no necesitas apurar tanto es mejor no utilizarlo de buenas a primeras.
Espero que ahora te quede algo más claro todo el tema de las interrupciones.
Un saludo
--
SapphiRe