De aquí a un mes diré lo mismo XD, a ver si puedo explicarlo paso a paso.
Los tres primeros bloques se explican por si mismo.
Constantes universales.
Línea de BASIC para el arranque del programa.
Conectando el sprite en modo multicolor y activar las interrupciones.
IRQ
Aquí esta el programa que se ejecutará a cada interrupción por barrido.
Este, lo único que hace es activar el permiso para que las rutinas que trabajarán
dentro del tiempo de barrido fuera de la pantalla se ejecuten.
¿Con esto qué consigo?. Aparte de complicarme la vida XD, dejo que el código de
mover gráficos lo haga fuera de las interrupciones en tiempo normal de ejecución del
programa. ¿Para qué sirve?. Pues para que durante una interrupción se puedan leer
teclado o joystick ya que en mis pruebas con las interrupciones, no podía leer ninguna
entrada durante las mismas (o no sé hacerlo bién), además de un ejercicio para
re-aprender a seguir un programa comprendiendo como piensa el commodore64 .
PREMAIN
Coloco el puntero que indica el sprite a mostrar que a su vez, hace que el programa
sepa hacia donde mover la nave gracias a las tablas que veremos más abajo.
ResetEjeNaveX y ResetEjeNaveY , son subrutinas que dan los valores adecuados a las
variables de trabajo. Veréis que hay redundancia, es por las futuras ampliaciones.
MAIN
Aquí empieza el programa que se va a repetir en bucle.
Las 3 primeras líneas comprueban si las interrupciones han dado su permiso para ejecutar
el código. Si no es así, salta a ejecutar código "normal" fuera de las interrupciones.
lda #0 ;Desconecto el permiso de ejecución por IRQ
sta Permiso ;para evitar su ejecución constante. Si lo poneis a 1, vereis el programa a toda
mecha XD.
Una vez se permite la ejecución del código , anulo ese permiso para evitar que se ejecute
constantemente. Debe ejecutarse solo a cada IRQ.
LEER JOY 2
Esto no tiene misterio, si el valor es joy derecha o izquierda , incrementa o decrementa
el valor del puntero del sprite0 y después compruebo si se sale del limite. Si es así, le
otorgo el valor correcto y el ciclo continua.
MOVER EJE X
Aquí empieza lo divertido.
Mover una nave en 16 direcciones diferentes implica mover los ejes en tiempos variables.
Desplazarse en ángulos rectos es sencillo, INC ejeX o ejeY.
Las diagonales igual INC ejeX e INC ejeY a la vez. Pero esta manera solo consigue
8 direcciones diferentes y hace los giros muy bruscos (para mi gusto).
Pero las direcciones intermedias entre estos ángulos (8 más) , necesitan que uno de los
ejes se ejecute dos veces mientras que el otro solo una vez, ahí
entran las tablas y las comprobaciones para conseguirlo.
MovX0Temp contiene el freno para el ejeX
MovY0Temp contiene el freno para el ejeY.
Si es 0 directamente, pasa, es decir, no mueve ese eje.
Si no es 0, pasa a decrementar su valor hasta que sea 0 pero en el segundo paso,
solo entonces se moverá ese eje.
DEjeX0Temp contiene la dirección hacia donde se ha de mover el eje X.
DEjeY0Temp contiene la dirección hacia donde se ha de mover el eje Y.
Una vez movidos cada eje o cambiado el puntero del sprite0 , hago que se devuelvan
los valores de nuevo para repetir el ciclo otra vez usando el puntero del sprite
como guía para la lectura de las tablas.
Para eso uso las subrutinas ResetEjeNaveX y ResetEjeNaveY.
PASODEIRQ
A partir de aquí van las rutinas que se ejecutarán normalmente a cada ciclo sin importar
las interrupciones (puntuación, detección de choques , lo que sea...).
MSBX0
Activa o desactiva el MSB (bit más significativo) del eje X del sprite 0.
Esta rutina solo se llama cada vez que hay desbordamiento al sumar o restar 1 (o 2 o 3 o...)
al eje X.
Espero que esto ayude un poco a comprender su funcionamiento.
Esta rutina no solo vale para mover al protagonista, si no que también sirve para hacer mover enemigos siguiendo una tabla o patrón que le permitiría hacer giros bonitos (XD) antes de atacar o lo que vuestra imaginación os permita.