viernes, 15 de noviembre de 2019

CopperList

En la anterior entrada vimos como montar el esqueleto de nuestro programa con SkyInit y decidimos dejar para el siguiente capitulo el montaje de la CopperList.

¿Pero que es una copperlist? Pues no es mas que una serie de instrucciones que son ejecutadas por el copper, un chip que esta dentro del Agnus del Amiga.
El copper solo tiene 3 instrucciones (Wait, Move y Skip) pero no vamos a centrarnos de momento en su funcionamiento si no en como hacer que el copper trabaje.


Una de las ventajas del copper es que ejecuta su lista de instrucciones cada Vertical Blank (cada inicio de frame) y lo hace independiente de la CPU. Por eso es buen lugar para actualizar punteros entre otras cosas.

Pero empecemos con el lío.

En la entrada anterior vimos como SkyInit llamaba a una serie de subrutinas siendo _Main donde se iba a ejecutar nuestro programa. Escribimos el código y lo explicamos.

Básicamente lo que hacemos aquí es decirle a los registros de los bitplanos donde esta nuestra pantalla, decirle a un registro del copper (COP1LCH) donde esta nuestra copperlist y acto seguido activar nuestra copperlist escribiendo en COPJMP1.

Vale, vale! Quieto ahí parado Tolkien! Y de donde sacas la pantalla y la copperlist?

Pues como ya sabemos los custom chips del Amiga solo pueden acceder a la memoria chip por lo que tanto la pantalla como la copperlist debemos ubicarlas en esta area de memoria.

En ensamblador hay una directiva llamada Section que crea secciones de programa que pueden ser tanto de código como de datos y ubicarlos en memoria chip, fast, etc etc...

En este caso hemos creado una sección llamada bitplanes que es de datos y esta en chip (data_c) y otra sección llamada copperlist tambien de datos y en chip.

Como vemos en la sección bitplanes hemos reservado 40*256 bytes para nuestra pantalla con la etiqueta screen que es a la que hacíamos referencia en _Main.

En la propia copperlist está la etiqueta Planes también usada en _Main que son los registros de los bitplanos que deben ser actualizados cada vertical blank.
Al principio de la copperlist hay una serie de registro que se usan para centrar la pantalla, definir numero de bitplanos que vamos a usar y demás cosas que de momento vamos a obviar.

 Y por último tenemos dos instrucciones del copper que esperan a una linea y cambia el color 0 a $0f00 (rojo).
Y la instrucción dc.w $ffff,$fffe que indica que se termina la copperlist.

Recapitulemos y pongamos todo el source junto.


Por ultimo incluyo el source para descargar y el fichero GoblinsCustom.i en el que vienen los registros del Amiga por sus nombres para poder ensamblar el ejemplo.

Main.s
GoblinsCustom.i

4 comentarios:

  1. Gran aporte Tolkien. Esperamos más!!!!.

    ResponderEliminar
  2. Gracias maestro! Intentaré ir actualizando con las cuatro cosas que he aprendido gracias a vosotros.

    ResponderEliminar
  3. A ver si ya te lanzas de una vez y no duermes tanto :)

    ResponderEliminar
  4. Programando no seré bueno pero durmiendo....;)

    ResponderEliminar