|
Por Francisco Javier Rodríguez
Cuando alguien se compra un ordenador, por primera vez, lo más normal es que empiece a aprender el lenguaje más sencillo de programación: el Basic.
Dependiendo del ordenador en cuestión, el usuario puede no llegar a programar nunca; pues como en este caso (con el Amiga), se utiliza únicamente con fines específicos, en los cuales el usuario solamente tendrá que limitarse a utilizar un paquete en cuestión, ya sea tratamiento de la imagen, sonido, autoedición...
Pero los usuarios que al comprar el ordenador no se limitan únicamente al uso de programas, sino que también al desarrollo de los mismos, se encuentran con una difícil solución a la hora de elegir el lenguaje de programación.
De entre los lenguajes, habitualmente más utilizados para la programación, es el lenguaje ensamblador el que ofrece unas mayores posibilidades; ya que es este con el que se posee un acceso más directo a los registros hardware, así como el que menos memoria consume.
Sin embargo a la hora de empezar a programar en ensamblador, existen varios problemas; uno de ellos es la falta de literatura en nuestro idioma, así como una amplia biblioteca de referencia a un coste no muy elevado. Lamentablemente el Amiga no posee ningún libro específico en nuestro idioma, sino que hay que limitarse a la adquisición de libros en inglés.
En este artículo no se pretende demostrar la forma de programar en ensamblador, sino que se limita únicamente a demostrar el fácil acceso a los registros hardware, así como la sencillez con la que se utilizan éstos, consiguiendo como podrán comprobar unos efectos bastante curiosos.
Programación de los registros DMA
Los programas de este artículo se basan en el control del Raster, así como de los registros utilizados para definir la posición inicial y final de una ventana ($DFF98E, $DFF090). El primer registro utiliza una palabra para definir la esquina superior izquierda de la ventana en cuestión, el byte alto se corresponde a la posición vertical, y el byte bajo a la posición horizontal. El segundo registro contiene la misma función pero ésta se corresponde con la esquina inferior derecha.
Otro registro utilizado es el de control del Copper ($DFF100), así como un CopperList encargado de realizar el típico efecto multicolor del fondo mediante el barrido.
El registro $DFF100, denominado BPLCON0, es el encargado de definir las diferentes características de la pantalla (alta/baja resolución, Interlazado/no interlazado, cantidad de bitplanes, elección del modo Dual PlayField, etc...). Como consecuencia de la alteración de estos registros, se obtiene una ventana 'algo especial', pues el contenido de la pantalla se reajustará en la nueva dimensión y posición de la ventana definida. Con este efecto se puede realizar el movimiento de un gráfico a través de la pantalla con la simple alteración de dos palabras.
Efecto con el barrido
Una buena característica del Amiga es la velocidad con la que éste mueve datos, con lo cual se pueden desplazar grandes bloques de memoria en un corto período de tiempo. Debido a esta velocidad de proceso se consiguen unos buenos efectos con el barrido (programas WINDOW2 Y WINDOW3).
Se puede definir a los efectos de la pantalla, como el resultado conseguido mediante la manipulación de unos registros hardware (casi siempre el raster), por los cuales se obtienen despliegues de la pantalla, desdoblamiento de ésta, efecto de scroll, o simplemente el resultado de alguna invención suya.
Lo que hace especialmente interesantes a dichos efectos, es la facilidad con la que se pueden programar éstos, dependiendo eso sí de lo espectacular o complicados que se quiera realizar. Como ejemplo basta decir que las rutinas que se incluyen en este artículo ocupan en total 300 bytes, cambiando en ellas algunos parámetros.
Otra forma de utilizar los efectos de la pantalla, es la de combinación de éstos con otro tipo de rutinas, ya sean de impresión de texto u otras similares. Por ejemplo en asociación con la tercera rutina presentada en este artículo, se puede implementar una rutina de texto, con lo cual si se crea un tipo de Fonts adecuado, podría servir de logotipo.
Es precisamente con el control de barrido con lo que se puede controlar diferentes cambios en pantalla (seguramente ya habrá visto más de un efecto en el que la causa era el control de barrido), bien sea el cambio de los registros de color, movimiento de bloques, distorsiones de la pantalla, etc...
El efecto, utilizando el mismo método de definición de la ventana, consiste en la constante alteración del byte más bajo de la palabra que define la posición vertical final de la ventana; con lo cual se produce la formación de unos triángulos alternantes en pantalla.
Para poder ver los efectos resultantes de las rutinas aquí utilizadas, se deberá hacer activar NOFASTMEM antes de ejecutar los programas; siempre y cuando el ordenador en el que se trabaje posea algún tipo de ampliación de memoria (interna o externa).
Descripción de los registros
CONTROL DMA $DFF096
| Bit |
Descripción |
| 15 |
bit de control para lectura/escritura. Determina si los bits escritos a uno se corresponden a estado de encendido o apagado. |
| 14 |
Bit de estado para Blitter (sólo lectura). |
| 13 |
Bit de estado 'cero lógico' del Blitter. |
| 12 |
? |
| 11 |
? |
| 10 |
Prioridad del Blitter DMA sobre la CPU. |
| 9 |
? |
| 8 |
Selecciona Bit Plane DMA. |
| 7 |
Selecciona Copper DMA. |
| 6 |
Selecciona Blitter DMA. |
| 5 |
Selecciona Disk DMA. |
| 0-3 |
Selecciona los canales audio DMA. |
En las diferentes rutinas presentadas en este artículo, se utiliza para este registro la máscara #%0001111110000000; con lo cual se seleccionan los bits correspondientes a 'prioridad del Blitter sobre el DMA', selector DMA, selector Bit-Plane y por último el correspondiente a la selección del Coprocesador DMA.
| BIT |
Descripción |
| |
|
| DIWSTRT |
$DFF08E |
| 15-8 |
Posición superior vertical. |
| 7-0 |
Posición superior horizontal. |
| |
|
| DIWSTOP |
$DFF090 |
| 15-8 |
Posición inferior vertical. |
| 7-0 |
Posición interior horizontal. |
| |
|
| BPLOPHI |
$DFF0E0 |
| 15 |
- |
| 0-2 |
Palabra alta de puntero a Bitplano 0. |
| |
|
| BPL0PLO |
$DFF0E2 |
| 0-15 |
Palabra baja de puntero a Bitplano 0. |
En las rutinas utilizadas, el puntero al BitPlano 0 (el único utilizado) es el $70000.
PROGRAMA: WINDOW
----------------
WINDOWE EQU $DFF08E
WINDOWS EQU $DFF090
INIT: MOVEM D0-D7/A0-A6,-(A7)
JSR INITCOP(PC)
LEA RASTER,A0
LEA RASTER1,A1
LOOP ADDQ #1,(A0)
SUBQ #1,(A1)
MOVE.B (A0),WINDOWS
MOVE.B (A1),WINDOWE
BTST #6,$BFE001
BNE.S LOOP
MOVE.W #-$7fe0,$dff09a
MOVE.W #$8000,$dff096
MOVEM (A7)+,a0-a6/d0-d7
RTS
INITCOP: CLR.L 0
MOVE.W #$20,$dff09a
MOVE.W #-%0001111110000000,$dff096
LEA COPPER,a1
MOVE.L a1,$dff084
CLR.W $dff08a
LEA $70000,a0
MOVE.W #$4000,d0
LOOP2 MOVE.L #$FF00FF00,(a0)+
DBF d0,LOOP2
RTS
copper dc.w $0100,$9208,$00e0,$0007,$00e2,$0000
dc.w $0092,$003C,$0094,$00D4
dc.w $0108,$00ff,$010a,$00FF,$0180,$0000
dc.w $6401,$fffe,$0180,$0000
dc.w $6601,$fffe,$0180,$0111
dc.w $6801,$fffe,$0180,$0222
dc.w $6a01,$fffe,$0180,$0333
dc.w $6c01,$fffe,$0180,$0444
dc.w $6e01,$fffe,$0180,$0555
dc.w $7001,$fffe,$0180,$0666
dc.w $7201,$fffe,$0180,$0777
dc.w $7401,$fffe,$0180,$0888
dc.w $7601,$fffe,$0180,$0999
dc.w $7801,$fffe,$0180,$0000
dc.w $ffff,$fffe
RASTER DC.W 0000
RASTER1 DC.W 0000
DC.W $FFFF,$FFFE
END |
|
|
 |
 |
 |
PROGRAMA WINDOW2
----------------
WINDOWE EQU $DFF00E
WINDOWS EQU $DFF090
INIT: MOVEM D0-D7/A0-A6,-(A7)
JSR INITCOP(PC)
LEA RASTER,A0
LEA RASTER1,A1
LOOP MOVE #$0100,(A0)
ADDI #1,(A1)
MOVE.B (A0),WINDOWS
MOVE.W (A1),WINDOWE
BTST #6,$BFE001
BNE.S LOOP
MOVE.W #-$7fe0,$dff09a
MOVE.W #$8000,$dff096
MOVEM (A7)+,a0-a6/d0-d7
RTS
INITCOP: CLR.L 0
MOVE.W #$20,$dff09a
MOVE.W #-%0001111110000000,$dff096
LEA COPPER,a1
MOVE.L a1,$dff084
CLR.W $dff08a
LEA $70000,a0
MOVE.W #$4000,d0
LOOP2 MOVE.L #$ffffffff,(a0)+
DBF d0,LOOP2
RTS
COPPER dc.w $0100,$9200,$00e0,$0007,$00e2,$0000
dc.w $0092,$003C,$0094,$00D4
dc.w $0108,$00ff,$010a,$00FF,$0180,$0000
dc.w $6401,$fffe,$0180,$0000
dc.w $6601,$fffe,$0180,$0111
dc.w $6801,$fffe,$0100,$0222
dc.w $6a01,$fffe,$0180,$0333
dc.w $6c01,$fffe,$0180,$0444
dc.w $6e01,$fffe,$0180,$0555
dc.w $7001,$fffe,$0180,$0666
dc.w $7201,$fffe,$0180,$0777
dc.w $7401,$fffe,$0180,$0888
dc.w $7601,$fffe,$0180,$0999
dc.w $7801,$fffe,$0180,$0000
dc.w $ffff,$fffe
RASTER DC.W 0000
RASTER1 DC.W 0000
DC.W $FFFF,$FFFE
END |
|
|
 |
 |
 |
PROGRAMA: WINDOW3
-----------------
WINDOWE EQU $DFF08E
WINDOWS EQU $DFF090
INIT: MOVEM D0-D7/A0-A6,-(A7)
JSR INITCOP(PC)
LEA RASTER,A0
LEA RASTER1,A1
LOOP MOVE #$0100,(A0)
ADDI #1,(A1)
AND.W #%0000000011111111,(a1)
MOVE.B (A0),WINDOWS
MOVE.w (a1),WINDOWE
BTST #6,$BFE001
BNE.S LOOP
MOVE.W #-$7fe0,$dff09a
MOVE.W #$8000,$dff096
MOVEM (A7)+,a0-a6/d0-d7
RTS
INITCOP: CLR.L 0
MOVE.W #$20,$dff09a
MOVE.W #-%0001111110000000,$dff096
LEA COPPER,a1
MOVE.L a1,$dff084
CLR.W $dff08a
LEA $70000,a0
MOVE.W #$4000,d0
LOOP2 MOVE.L #$ffffffff,(a0)+
DBF d0,LOOP2
RTS
copper dc.w $0100,$9200,$00e0,$0007,$00e2,$0000
dc.w $0092,$003C,$0094,$00D4
dc.w $0108,$00ff,$010a,$00FF,$0180,$0000
dc.w $6401,$fffe,$0180,$0000
dc.w $6601,$fffe,$0180,$0111
dc.w $6801,$fffe,$0180,$0222
dc.w $6a01,$fffe,$0180,$0333
dc.w $6c01,$fffe,$0180,$0444
dc.w $6e01,$fffe,$0180,$0555
dc.w $7001,$fffe,$0180,$0666
dc.w $7201,$fffe,$0180,$0777
dc.w $7401,$fffe,$0180,$0888
dc.w $7601,$fffe,$0180,$0999
dc.w $7801,$fffe,$0180,$0000
dc.w $ffff,$fffe
RASTER DC.W 0000
RASTER1 DC.W 0000
DC.W $FFFF,$FFFE
END |
|
|
 |
 |
 |
|