Revistas en papel
 Amiga World Nº10 - Mayo 1990
Anterior
MenĂº
Logotipo

El Amiga Me Encanta ha conseguido el permiso por escrito de IDG Comunications España
para ofrecer los artículos de la revista Amiga World España.

EFECTOS CON LA PANTALLA Amiga World

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

Envía esta página web a un amigo:
Esta opción está desactivada temporalmente, rogamos disculpen las molestias

Volver a la página anterior

Al menú principal