Karoshi MSX Community

Desarrollo MSX => Desarrollo (Español/Spanish) => Mensaje iniciado por: Shinzon en 25 de Septiembre de 2007, 02:47:00 pm



Título: Interrupciones del MSX
Publicado por: Shinzon en 25 de Septiembre de 2007, 02:47:00 pm
Muy buenas a todo el personal.

Siento no haberme pasado por aqui antes, pero ando bastante liado... pero supongo que como todo el mundo.

Bueno aclarado esto, paso a lo mio.

¿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.

Cada dia estoy mas cerca de ponerme con el Assembler, asi que paciencia. Dentro de poco, tendreis a otro plasta haciendo el invento del MSX, jejeje (aunque no se cuando, snifff).

Saludos cordiales desde las lluviosas tierras del Norte :)



Título: Re: Interrupciones del MSX
Publicado por: SapphiRe_MSX en 25 de Septiembre de 2007, 03:15:56 pm
¿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 :P

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 (http://karoshi.msxgamesbox.com/index.php?topic=212.0) 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


Título: Re: Interrupciones del MSX
Publicado por: jltursan en 25 de Septiembre de 2007, 03:42:25 pm
Y a todo lo dicho por Sapphire yo añado que tienes ejemplos de de IM1 e IM2 bien detallados en los snippets de "Interlaced SC1 with 64 columns", que sólo se diferencian en el código de gestión de interrupciones, eso te permitirá estudiarlo con más claridad.
Yo dejaría un poco de lado las interrupciones, no son imprescindibles y aumentan bastante el nivel de complejidad del programa :(


Título: Re: Interrupciones del MSX
Publicado por: Shinzon en 25 de Septiembre de 2007, 03:47:36 pm
Gracias por las aclaraciones a ambos.

No tengo intencion de meterme con ellas de inmediato, pero sospecho que tarde o temprano tendre que hacerlo, y necesitaba saber con que trataba.

Asumo, pues, que cuando se produce una interrupcion, se detiene la rutina que este en proceso y se almacena la posicion de memoria en la que estaba (en el PC ó en el SP, supongo), para cuando la interrupcion finalice (por que la subrutina de proceso de la interrupcion que se ponga finaliza) el micro sepa a donde tiene que regresar.

Si es asi me queda bastante claro el asunto. Lo que no se es como definir una interrupción por ahora, pero con eso me meteré cuando llegue a ese temario. Por ahora, me quedo satisfecho con la informacion que me habeis brindado.

¿Que puedo decir?... ¡Que muchas gracias!  ::)


Título: Re: Interrupciones del MSX
Publicado por: Shinzon en 25 de Septiembre de 2007, 04:30:52 pm
Otra cosilla, ya que estoy puesto y que no se cuando me volvere a conectar, me aprovecho como si cuan noble damisela sin mancilla en el honor... ¡estoy desvariando!

Hay un par de instrucciones, que me traen loco, no porque no vea el proceso de lo que hacen, sino que no entiendo paara que narices sirven... Dos de ellas (ahora no recuerdo los nemonicos), hacen un intercambio bastante coñon entre el par de registros HL y el Acumulador... ¿que funcion puede tener eso a parte de cabrear al personal?

A este sentido, creo, si no me falla el criterio con 39 veranos, que las instrucciones RL r, rota el registro a la izquierda del registro especificado, y creo de hecho, que basicamente es multiplicar por 2 el registro. Si esto es cierto... ¿lo hacen todas las instrucciones RL lo que sea? Se que algunas afectan al flag C, lo cual si que entiendo (de hecho, creo que es RLC x).

Si esto es asi, perfecto, sino, aclaracion plis...

Pero las que si que me traen loco son las contrarias... RR x, RRC x, etc... ¿estas dividen por 2?

He buscado aclaraciones por intesness, pero no me sale nada por ninguna parte. Vosotros sois mi unica esperanza... snifff :'(

Por cierto, he visto las rutinas, y creo que voy entendiendo el tema de las interrupciones. ¿Pero se pueden asignar diferentes interrupciones para distintos eventos? Quiero decir, que si tengo una interrupcion para por ejemplo, mover sprites, otra para la musica, etc... supongo que lo tendria que definir dentro de la rutina de enganche en FD9A, ¿no?
Me imagino que habria que hacerlo comprobando diferentes estados de flags, o algo asi... Bueno, ahi queda mi chapada.

Salu2.


Título: Re: Interrupciones del MSX
Publicado por: SapphiRe_MSX en 25 de Septiembre de 2007, 04:49:57 pm
¿Pero se pueden asignar diferentes interrupciones para distintos eventos? Quiero decir, que si tengo una interrupcion para por ejemplo, mover sprites, otra para la musica, etc... supongo que lo tendria que definir dentro de la rutina de enganche en FD9A, ¿no?

Para eso tendrías que tener varios dispositivos que generasen interrupciones. En la práctica puedes contar sólo con el VDP, así que tendrías que incluir todo lo que has dicho en una única rutina de interrupción.

Saludos
--
Sph.


Título: Re: Interrupciones del MSX
Publicado por: jltursan en 25 de Septiembre de 2007, 09:03:14 pm
Citar
Hay un par de instrucciones, que me traen loco, no porque no vea el proceso de lo que hacen, sino que no entiendo paara que narices sirven... Dos de ellas (ahora no recuerdo los nemonicos), hacen un intercambio bastante coñon entre el par de registros HL y el Acumulador... ¿que funcion puede tener eso a parte de cabrear al personal?

Te debes de referir a las instrucciones RLD y RRD, están ahí básicamente para su uso con datos numéricos almacenados en BCD; pero creo que Sapphire las empleó de una manera algo más creativa si no recuerdo mal. Curiosamente alguien se preguntaba eso mismo en este hilo (http://www.msx.org/forumtopic7362.html) del MRC.

Citar
A este sentido, creo, si no me falla el criterio con 39 veranos, que las instrucciones RL r, rota el registro a la izquierda del registro especificado, y creo de hecho, que basicamente es multiplicar por 2 el registro. Si esto es cierto... ¿lo hacen todas las instrucciones RL lo que sea? Se que algunas afectan al flag C, lo cual si que entiendo (de hecho, creo que es RLC x).

Si esto es asi, perfecto, sino, aclaracion plis...

Pero las que si que me traen loco son las contrarias... RR x, RRC x, etc... ¿estas dividen por 2?

Todas las que desplazan o rotan sin el flag de carry a la izquierda multiplican por 2 y las que lo hacen a la derecha dividen por 2 (evidentemente). Teniendo la codificación binaria de un byte en la cabeza es sencillo de comprender. Se pueden usar también las instrucciones que meten el flag de carry en la operación; pero ahí ya hay que tener más claro el contenido de dicho flag para que no se fastidie la operación. Usadas con cuidadín, las instrucciones más comunes para estas multiplicaciones/divisiones son RLCA y RRCA.

Citar
Me imagino que habria que hacerlo comprobando diferentes estados de flags, o algo asi...

Pues efectivamente, todo en una interrupción tal como te confirma Sapphire y luego tu te buscas la manera para que en una ocasión se haga una cosa y en otras, otra :).


Título: Re: Interrupciones del MSX
Publicado por: SapphiRe_MSX en 26 de Septiembre de 2007, 01:44:51 pm
Citar
Hay un par de instrucciones, que me traen loco, no porque no vea el proceso de lo que hacen, sino que no entiendo paara que narices sirven... Dos de ellas (ahora no recuerdo los nemonicos), hacen un intercambio bastante coñon entre el par de registros HL y el Acumulador... ¿que funcion puede tener eso a parte de cabrear al personal?

Te debes de referir a las instrucciones RLD y RRD, están ahí básicamente para su uso con datos numéricos almacenados en BCD; pero creo que Sapphire las empleó de una manera algo más creativa si no recuerdo mal. Curiosamente alguien se preguntaba eso mismo en este hilo (http://www.msx.org/forumtopic7362.html) del MRC.

En efecto, esas instrucciones fueron todo un descubrimiento y me simplicaron la vida un montón a la hora de hacer una rutina que en MSX1 cambiara los colores de las piezas del QBIQS... la puedes encontrar  aquí (http://karoshi.msxgamesbox.com/index.php?topic=239.0).

Saludos
--
Sph.