miércoles, 14 de agosto de 2019

Sky Init

SkyInit

El Amiga es una máquina alucinante. Durante años hemos visto todo lo que es capaz. Solo cuando te pones a programarla te das cuenta de que tambien en una máquina caprichosa y hay que entenderla muy bien.
La inmensa mayoría de juegos, demos e intros, para sacar el máximo provecho de su arquitectura, lo que hacen es lo que comunmente llamamos "matar el sistema".
Básicamente es tener el control de la máquina desactivando DMAs innecesarios, interrupciones y dejando la maquina a nuestra merced.
Esto tiene consecuencias como que no podremos usar parte de las librerias del AmigaOS pero dará mayor velocidad a nuestro programa.



Todo este proceso de matar el sistema lo hago con una rutina que he llamado SkyInit. Es una mezcla de código de Skynet, Blueberry y mio.

Este sencillo listado muestra el mínimo código necesario para hacer funcionar la rutina de inicio.
Como puede verse, SkyInit.s está incluido al principio del programa. Este a su vez hace llamadas a varias
subrutinas con diferentes propósitos.

Una vez ejecutado el programa y antes aun de haber obtenido el control del sistema, SkyInit llama primero a _Precalc.
Esta subrutina aun puede usar las funciones del AmigaOS y puede usarse durante la carga para generar tablas, descomprimir cosas etc.

Después de terminar _Precalc vamos a _Main, que será donde, como su nombre indica, ocurrirá el programa principal.

Y una vez terminado nuestro programa, recuperamos el sistema y saltamos a _Exit, donde podemos tomar las ultimas acciones antes de salir al workbench.

Hay otra subrutina mas llamada _Interrupt. Esta rutina se llama 50 veces por segundo a traves de una interrupción de Vertical Blank.

Vemos tambien al principio del código una serie de directivas. Son usadas para activar o no canales DMA del Amiga.

COPPER          =       1       
BLITTER         =       1
SPRITE          =       0
DISK            =       0
NASTY           =       0       ;Activa Nasty Mode del Blitter
TOPAZ           =       0       ;Usa Topaz
VBI             =       1       ;activa VertivalBlankInterrupt

Copper, Blitter, Sprite y Disk son los canales DMA correspondientes y se activan poniendolos a 1.
Nasty activa el Nasty mode del blitter.
Topaz activa ciertas partes de SkyInit.s para usar el fuente Topaz.
VBI activa o no la interrupcion del Vertical Blank.


Si ensamblamos y ejecutamos este programa no veremos nada. Notaremos que desaparece el puntero del ratón (porque hemos desactivado el DMA de los sprites) y no podremos volver al sistema hasta que no pulsamos el botón izquierdo del ratón.

En la próxima entrada explicaré como montar una copperlist y poder pintar en la pantalla.

Enlaces de descarga del fichero principal y de la rutina de inicio.
Descarga Main.s
Descarga SkyInit.s

No hay comentarios:

Publicar un comentario