Interrupciones del VIC

Como ya hemos comentado en entradas anteriores, el C64 tiene un mecanismo muy interesante llamado “interrupciones”. Las “interrupciones” son, como su nombre indica, interrupciones en el flujo de ejecución normal de los programas que, de forma temporal, pasan a ejecutar una rutina de interrupción para luego continuar con el programa interrumpido.

Estas interrupciones se pueden generar por eventos en el software (ej. instrucción “brk”) o en el hardware (ej. eventos que ocurren en el VIC o en otros chips y que activan las patillas de interrupción del 6510).

Esta entrada está dedicada a las interrupciones que puede generar el VIC, es decir, las que guardan relación con la programación gráfica del C64.

El VIC puede generar interrupciones cuando se producen los siguientes eventos:

  • El raster llega a una determinada línea (registro $d012; ver entrada anterior).
  • Un sprite colisiona con el fondo.
  • Un sprite colisiona con otro sprite.

Por otro lado, el VIC tiene dos registros relacionados con interrupciones:

  • El registro $d019, que sirve para obtener información sobre las interrupciones generadas.
  • El registro $d01a que sirve para programar las interrupciones deseadas.

En ambos casos existe una correlación uno a uno entra la causa que genera la interrupción (o que se quiere que genere la interrupción), y los bits del registro $d019/$d01a:

  • Bit 0: El raster llega a la línea programada en el registro $d012.
  • Bit 1: Un sprite colisiona con el fondo.
  • Bit 2: Un sprite colisiona con otro sprite.

Además, el bit 3 sirve para consultar/generar interrupciones relativas al lápiz óptico (sin mucho interés para este blog), y el bit 7 para obtener información sobre si se ha generado una interrupción de cualquiera de los tipos.

En definitiva, para trabajar con interrupciones del VIC (ej. para detectar una colisión y restar vidas), hay que programar en el registro $d01a las interrupciones deseadas. Además, cuando se produzca una interrupción, y ya desde la rutina de interrupción, hay que averiguar de qué naturaleza es con el registro $d019 (esto sólo es necesario si pudieran ocurrir interrupciones de varias causas a la vez), y atender la interrupción ejecutando el código que sea necesario.

InterrupVIC


Programa de ejemplo: Prog38

Deja un comentario