Revistas en papel
 Amiga World Nº6 - Enero 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.

INICIACIÓN AL LENGUAJE
ENSAMBLADOR
Gráficos (3) 8.ª Parte


Por Fernando García

En el capítulo de este mes trataremos la
última parte sobre gráficos, es decir los
Sprites, dichosos elementos que se
mueven en la pantalla a gran velocidad.

Amiga WorldTécnicamente los Sprites son objetos creados por el hardware del Amiga y se mueven independientemente de la pantalla donde se visualizan. Es decir, no ocupan ningún espacio gráfico, sino que los generan los Custom Chips (exactamente el Denise). Puede controlar hasta ocho Sprites cada uno de ellos, con 16 pixels de ancho y cualquier número de píxel de alto. En cuanto a colores tiene tres colores por cada dos Sprites, con color transparente, mostrando lo que hay detrás de él. Estos además ocupan 8 canales DMA (acceso directo a memoria) para una mayor aproximación entre el Denise y los datos de los Sprites. Al igual que en el C-64, hay algunos trucos para mostrar en pantalla más de 8 Sprites cambiando las posiciones, colores y datos de éstos durante la línea de barrido.

Para mostrar un Sprite en pantalla son necesarias las siguientes consideraciones:

Los datos de los Sprites, es decir, su imagen, tamaño, color, posición de la pantalla donde se quieren visualizar.

Veamos primero las posiciones x-y en las que se puede visualizar el Sprite.

En cuanto a la x (horizontal) el rango varía de 0 a 447. Para que el objeto sea visible tiene que tener la pantalla unos límites, es decir, la del ancho de 320 pixels que corresponden a la baja resolución. Esto hace que el rango de valores para la visualización es de 64 a 383, un valor fuera de estos límites haría que el objeto no se viera.

Para poder calcular la coordenada exacta en la que se ha de posicionar el objeto se les ha de sumar 64. Si queremos por ejemplo que el Sprite aparezca 80 pixels a partir del margen derecho el valor exacto a utilizar es 80+64=144.

En cuanto a la Y (vertical) el caso es igual, los rangos a utilizar están en los valores 0 a 262. Para su visualización se manejan los valores entre 44 y 243, que corresponden a una pantalla de 200 pixels de alto en baja resolución. Poniendo un ejemplo para presentar un Sprite en el punto 40,100 a partir de la esquina superior izquierda los valores a utilizar serían 104 y 144.

El único problema se dará cuando manejemos una pantalla de más resolución, las coordenadas no cambian, ya que en las que se mueve el Sprite corresponden a una de baja resolución. Esto hace que por ejemplo en una pantalla de alta resolución (640x400) la coordenada 640,400 de ésta sería para el Sprite la mitad ya que maneja el mismo rango de coordenadas.

El ancho máximo que puede tener un Sprite es de 16 pixels y el alto puede ser cualquiera. Si quieres uno más ancho que el permitido puedes utilizar la técnica de empalmar Sprites, es decir, de situar la esquina superior derecha del primero con la esquina superior izquierda del segundo, y mover los dos a la vez, debiendo utilizar la coordenada vertical del izquierdo más 16 pixels que es la del siguiente y con la misma coordenada horizontal ya que se encuentran a la misma altura. En el caso de que se utilice una resolución mayor, el tamaño real en pantalla no variará la resolución del Sprite.

Los colores de los Sprites son una delimitación, pudiendo utilizar tres colores más un color cero o transparente por cada grupo de dos. En total son 16 colores que se podrán variar en los registros de la tabla del 16 al 31: Corresponden a las posiciones de los Custom Chips desde $DFF1A0 a $DFF1BE y han de usarse dentro del Copperlist.

Para el diseño de un Sprite será conveniente que se dibuje el mismo en una hoja cuadriculada donde se ha de distinguir los colores del 0 al 3 (el 0 como transparente).

Los bits en la alta palabra corresponden al bit izquierdo de cada código binario del color, así como los bits
en la segunda palabra corresponden a los bits derecho de cada color en el píxel.

Un ejemplo sería éste:

     0000112232211000
     0001122333221100
     0011223333322110
     0001122333221100
     0000112232211000

A continuación deberemos pasar estos números en binario, utilizando dos palabras (words) por cada línea horizontal, que van a ser palabra alta y palabra baja. Las palabras en total que va a tener el Sprite es el del número de líneas multiplicado por dos, por lo tanto cada línea tendrá 32 bits correspondientes a la palabra alta y palabra baja. Los bits en la alta palabra corresponden al bit izquierdo de cada código binario del color, así como los bits en la segunda palabra corresponden a los bit derecho de cada color en el píxel. El resultado para la primera línea sería éste:

     Valor del color 0 0 0 0 1 1 2 2 3 2 2 1 1 0 0 0
     Primera palabra 0 0 0 0 1 1 0 0 1 0 0 1 1 0 0 0 = $0c98
     Segunda palabra 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 = $03E0

Ahora se transforma cada línea como palabra en hexadecimal, dando el valor definitivo para utilizarlo en nuestro programa. Este mismo proceso se deberá hacer para todas las líneas, a no ser que se posea algunos de los programas de dominio público que permiten el diseño de Sprites.

Los valores binarios de cada píxel corresponden a un número de registro de color, siendo para cada Sprite el siguiente:

Sprite Número binario Registro de Color
0,1
00,01,10,11
Transparente,17,18,19
2,3
00,01,10,11
Transparente,21,22,23
4,5
00,01,10,11
Transparente,25,26,27
6,7
00,01,10,11
Transparente,29,30,31

El valor 00 corresponde al transparente y por lo tanto no es necesario cambiar el registro.

Ahora que ya sabemos los datos de los pixels pasaremos a la estructura que va a tener todo el Sprite, en el cual algunas de sus palabras corresponden a información de situación en pantalla.

Para crear la totalidad de la estructura de un Sprite se necesita:

  • Eje horizontal y vertical situado en la primera palabra de control.

  • H vertical de final en la segunda palabra de control.

  • Los datos correspondientes a los cuatro colores en la definición de un píxel que se ha construido anteriormente.

  • Palabra de control que define el final de la estructura de un Sprite.

El siguiente cuadro representa la estructura en la memoria de un Sprite:

En memoria por palabras (2 bytes)

Toda la estructura está alineada por palabras, es decir, que cada una de ellas ha de estar en posiciones de
memoria pares y se ha de situar en la zona de memoria Chip para poder ser accedidas por los Custom Chips.


Memoria Palabra 16-bit Función
M Palabra de Control 1 Eje horizontal y vertical
M+1 Palabra de Control 2 Eje vertical final
M+2 Datos de Sprites palabra baja Bits de colores para línea 1
M+3 Datos de Sprites palabra alta Bits de colores para línea 1
M+4 Datos de Sprites palabra baja Bits de colores para línea 2
M+5 Datos de Sprites palabra baja Bits de colores para línea 2
- - -
- - -
- Palabras fin de estructura Dos palabras indicando fin Sprite

Toda esta estructura está alineada por palabras, es decir, que cada una de ellas ha de estar en posiciones de memoria pares y se ha de situar en la zona de memoria Chip para poder se accedidas por los Custom Chips.

Las dos primeras palabras en la estructura del Sprite contienen las posiciones en las que se coloca el Sprite. La primera de ellas tiene en cada byte la sprint vertical (coordenada y) y la horizontal (coordenada x) respectivamente. La segunda palabra de control contiene la sprint final del Sprite, es decir, la sprint horizontal anterior más el número de líneas menos 1, siendo por ejemplo para nuestro Sprite el valor 5 ya que tiene 6 líneas. Además, en la misma palabra contiene datos correspondientes a los bits altos de las tres posiciones. La estructura en la palabra segunda de control es la siguiente:

Bits Función
8-15 Posición vertical final
3 Sprites contiguos
4-7 Sin uso
0 Bit alto en posición horizontal
1 Bit alto en posición vertical final
2 Bit alto en posición vertical

Los tres últimos bits sirven de expansión, es decir, para la coordenada horizontal un Sprite no pasaría de la posición 255 ya que es el máximo permitido por 8 bits o un byte. Para que llegue se le ha incluido un bit de expansión o bit alto permitiendo un rango hasta 511. Lo mismo ocurre para las dos posiciones verticales.

La estructura final para visualizar nuestro Sprite en el máximo vertical 50 y horizontal 60 es el listado 2.

Para cambiar la SPRINT de Sprite es suficiente cambiarlo en las posiciones vertical, horizontal y vertical final situados en esta misma estructura. Al observar el Custom Chip que ha variado el número realiza el cambio de posición. Se ha de tener el cuidado de cambiar estas coordenadas cuando haya comenzado la línea de barrido en la parte superior de la pantalla, ya que si chequea el cambio de número cuando el 68000 lo está variando se produce un salto visible y no deseado.

Para la posibilidad de presentar más de ocho Sprites en pantalla, simplemente se ha de añadir otra serie de
datos detrás de cada Sprite que se quiere utilizar de nuevo.

Los Sprites también tienen sus prioridades en pantalla, teniendo la máxima prioridad el Sprite 0, así hasta el octavo. Esto quiere decir que si situamos los ocho Sprites en la misma posición, el único visible será el primero y así hasta el último.

Comentamos anteriormente que hay la posibilidad de presentar más de ocho Sprites en pantalla. Para ello simplemente se ha de añadir otra serie de datos detrás de cada Sprite que se quiere utilizar de nuevo. El único problema es que se les ha de separar una línea horizontal entre los nuevos Sprites, es decir, no se han de cruzar los primeros con los que se quieren duplicar.

Esto lo podrá observar en el ejemplo de hoy, en el que utilizaremos en pantalla ocho Sprites, pero en realidad son cuatro, pues se repiten al situar los datos detrás de los de cada Sprite.

Hay otros registros muy importantes que se utilizan para activar los Sprites y apuntar a sus datos. Son éstos.

REGISTRO COMENTARIO
$DFF120-$DFF13E Punteros Datos Sprites 0 a 7
$DFF140-$DFF17E Datos de control (Coordenadas) de sprites 0 a 7

Estos últimos registros están repartidos cada cuatro por Sprite de esta forma están vertical-horizontal de comienzo al igual que al comienzo de cada grupo de datos:

  • LD, vertical final.
  • registro de datos A.
  • registro de datos B.

Este es el programa que visualiza lo anteriormente dicho (ver listado 1).

Explicando el programa la visualización de estos Sprites se produce utilizando dos bitplanes, ajustando sus colores en el Copperlist. Este último se utiliza también para apuntar a los dos bitplanes, y ajustar sus coordenadas en pantalla (offsets esquina superior izquierda). El programa ajusta que interrupciones en DMA que va a permitir como son la de los Sprites, Copper y Bitplanes.

El método utilizado para realizar el movimiento en pantalla de los Sprites es el de situar su rutina principal en una interrupción del 68000, es decir, una de las que realiza solamente el microprocesador, haciendo que este movimiento se realice de una manera limpia y suave.

Como he explicado en anteriores capítulos esta interrupción hace pasar todo el proceso del microprocesador 50 veces por segundo para realizar cualquier rutina que nosotros queramos. Esta velocidad exacta hace que la visualización de los Sprites sea correcta, en contraposición de las anteriores y primitivas técnicas, que situaban esta rutina en la programación principal.

Los índices (INDEX) se utilizan para retrasar en número constante (7, 14 y 21) las coordenadas y así
conseguir el efecto estela. La rutina como podrá comprobar es complicada, pero es muy útil para ver lo que se
puede hacer con Sprites.

Otra cualidad de esta rutina es el de situar correctamente las coordenadas de ocho Sprites mediante tablas e índices. Esta técnica saca cuatro coordenadas y las sitúa en la etiqueta PUNTERO del programa para insertarlas debidamente al comienzo de cada estructura de los Sprites 0 a 3. Los cuatro restantes Sprites tienen la misma coordenada horizontal que los anteriores.

Los índices (INDEX) se utilizan para retrasar en número constante (7, 14, y 21) las coordenadas y así conseguir el efecto estela. La rutina como podrá comprobar es complicada, pero es muy útil para ver lo que se puede hacer con Sprites. Se puede variar la velocidad insertando saltos condicionales cuando se realice la interrupción.

Esto es todo por lo que respecta a los gráficos, esperamos que le haya sido de utilidad.

LISTADO 1.
MAXSPR          EQU     4000                 ; TAMA�O DE LOS
                                             ; DATOS SPRITES
SCRPLANE        EQU     $40000               ; AMA�O BITPLANE
SPRBUFFER       EQU     $45000
BPLANE1         EQU     SPRBUFFER+MAXSPR     ; SUMA BITPLANE Y SPRITES
BPLANE2         EQU     BPLANE1+3440         ; BITPLANE 2
PFILED1         EQU     BPLANE2+4000
                MOVE.L  SP,INICIALSP         ; SALVA PUNTERO STACK
                MOVE.L  4,A6                 ; BASE LIBRERIA EXEC
                LEA     GFXNAME,A1           ; OBTIENE DIREC. NOMBRE LIB.
                JSR     -$198(A6)            ; ABRE LIBRERIA
                MOVE.L  D0,GFXBASE           ; ALMACENA BASE
                                             ; LIBRERIA
                MOVE.L  D0,D6                ; SALVA REGISTRO
                                             ; A6 PARA USO
                BEQ     NOGFX                ; SALIDA DEL
                                             ; PROGRAMA EN
                                             ; ERROR
                LEA     SPRBUFFER,A1         ; DIRECCION FINAL
                                             ; DATOS SPRITES
                LEA     SPRITES,A0           ;
                MOVE.L  #S_FIN-SPRITES,D0    ; CALCULA LONG.
                                             ; TOTAL DATOS
                                             ; SPR.
LOOP1           MOVE.B  (A0)+,(A1)+          ;
                DBRA    D0,LOOP1             ; TRANSLADA
                MOVE.L  4,A6                 ; BASE LIBRERIA
                                             ; EXEC
                JSR     -$84(A6)             ; PARA
                                             ; MULTITASKING
                MOVE.L  GFXBASE,A0           ; BASE LIBRERIA
                                             ; GRAFICA
                ADD.L   #$32,A0              ; OBTIENE PUNTERO
                                             ; COPPERLIST
                MOVE.W  #$4000,$DFF09A       ; QUITA
                                             ; INTERRUPCIONES
                MOVE.L  $6C,VECTOR           ; SALVA
                                             ; INTERRUPCION
                MOVE.L  #INTERR.$6C          ; INSTALA NUEVA
                                             ; INTERRUPCION
                MOVE.W  #$C000,$DFF09A       ; AJUSTA NUEVAS
                                             ; INTERRUPCIONES
                MOVE.W  #$0080,$DFF096       ; PATA COPPER
                MOVE.L  (A0),ANTCOPPER       ; SALVA ANTIGUO
                                             ; PUNTERO COPPER
                MOVE.L  #COPLIST,(A0)        ; AJUSTA NUEVO
                                             ; COPPER
                MOVE.W  #$B0A0,$DFF096       ; AJUSTA BITS DMA
MVRT
                MOVE.B  $BFE001,D0           ; ESPERA AL BOTON
                                             ; DEL RATON
                AND.L   #$40,D0
                BNE     MVRT
                MOVE.L  GFXBASE,A0           ; BASE LIBRERIA
                ADD.L   #$32,A0              ; APUNTA PUNTERO
                                             ; COPPER
                MOVE.W  #$0080,$DFF096       ; PARA COPPER Y
                                             ; SONIDO
                MOVE.L  ANTCOPPER,(A0)       ; RESTAURA COPPER
                MOVE.W  #$8180,$DFF096       ; AJUSTA DMA
                MOVE.W  #$4000,$DFF09A       ; PARA
                                             ; INTERRUPCIONES
                MOVE.L  VECTOR,$6C           ; RESTAURA
                                             ; INTERRUPCION
                MOVE.W  #$C000,$DFF09A       ; START AGAIN
                MOVE.L  4,A6                 ; BASE EXEC
                JSR     -$8A(A6)             ; PERMITE
                                             ; PULTITASKING
                MOVE.L  GFXBASE,A1           ; BASE LIBRERIA
                                             ; GRAFICA
                JSR     -$19E(A6)            ; CIERRA
                                             ; LIBRERIA
                MOVE.L  INICIALSP,SP         ; RESTAURA
                                             ; PUNTERO DE FILA
                CLR.L   D0                   ;
                RTS                          ; RETORNA, FIN DE
                                             ; PROGRAMA
NOGFX           MOVE.L  INICIALSP,SP         ; RESTAURA
                                             ; PUNTERO DE FILA
                RTS                          ; RETORNA
******  INTERRUPCION
INTERR          MOVEM.L D0-D2/A0-A1,-(A7)    ; SALVA
                                             ; PRINCIPALES
                                             : REGISTROS
                MOVE    SR,-(SP)             ;
                MOVE.W  $DFF01E,D0           ; OBTIENE
                                             ; INTERRUPCIONES
                BTST    #5,D0                ; ESPERA LINEA
                                             ; BARRIDO
                BNE,S   VBLANK               ; SI NO ACABA, DE
                                             ; NUEVO
                BRA     ENDINTERR            ; SI ES FIN,
                                             ; ACABA
                                             ; INTERRUPCION
VBLANK
                CLR.L   D2                   ; BORRA REGISTRO
                                             ; D2
                LEA     PUNTERO,A0           ; OBTIENE PUNTERO
                LEA     SPRBUFFER,A1         ; BASE DATOS
                                             ; SPRITES
MVOBJ
                CLR.L   D0                   ; RUTINA
                                             ; REPRESENTAR 4
                                             ; SPRITES
                MOVE.W  0(A0,D2.W),D0
                LSR.W   #1,D0
                BCS.S   SETHORZ
                BCLR    #0,3(A1)
                BRA.S   LAB1
SETHORZ         BSET    #0,3(A1)
LAB1
                MOVE.B  D0,1(A1)
                MOVE.B  D0,73(A1)
                MOVE.W  8(A0,D2.W),D0
                MOVE.B  D0,(A1)
                ADD.W   #17,D0
                MOVE.B  D0,2(A1)
                ADD.L   #148,A1              ; APUNTA
                                             ; SIGUIENTE
                                             ; SPRITE
                ADDQ.W  #2,D2                ; HASTA CUATRO
                                             ; SPRITES
                CMP.W   #6,D2
                BLS     MVOBJ
 ****   RUTINA MOVER SPRITES
                MOVEM.L A2-A3,-(SP)          ; SALVA REGISTROS
                CLR,L   D2                   ; BORRA D2
                LEA     INDEX,A0             ; OBTIENE INDICE
                                             ; 4 SPRITES
                LEA     X_ABA,A1             ; ABA X
                LEA     Y_ABA,A2             ; ABA Y
                LEA     PUNTERO,A3           ; PUNTERO
NPOS
                MOVE.W  0(A0,D2.W),D0        ; RUTINA PARA
                                             ; CALCULO POSIC.
                CMP.W   #256,D0              ; 256 POSICIONES
                BCS.S   LOK2                 ; SI ACABA,
                                             ; PUNTERO A 0
                C�R.W   D0
LOK2            MOVE.B  0(A1,D0.W),D1
                AND.W   #$FF,D1
                ADD.W   #120,D1
                MOVE.W  D1,0(A3,D2.W)
                MOVE.B  0(A2,D0.W),D1
                AND.W   #$FF,D1
                ADD.W   #40,D1
                MOVE.W  D1,8(A3,D2.W)
                ADDQ.W  #1,D0
                MOVE.W  D0,0(A0,D2.W)
                ADDQ.W  #2,D2
                CMP.L   #6,D2
                BLS     NPOS
                MOVEM.L (SP)+,A2-A3
ENDINTERR
                MOVE    (SP)+,SR             ; RETORNO
                                             ; INTERRUPCION
                MOVE.L  (SP)+,D0-D2/A0-A1
                DC.W    $4EF9                ; JMP INTERRUPCION
VECTOR          DC.L    $0000
GFXNAME         DC.B    'graphics.library',0
                CNCP    0,2                  ; ALINEAMIENTO A
                                             ; PALABRA
*****  DATOS SPRITES
SPRITES
                DC.W    $6D60,$7E00          ; NOB SPRITE
                DC.W    $00F8,$0000,$0108,$00F0
                DC.W    $02E8,$01F0,$05E8,$03F0,$0BE8,$07F0
                DC.W    $1668,$0FF0,$2C68,$1EF0,$5868,$3CF0
                DC.W    $B868,$7CF0,$BFE2,$7FFC,$BFFA,$7FFC
                DC.W    $8062,$7FFC,$FF6E,$00F0,$0168,$00F0
                DC.W    $0168,$00F0,$0108,$00F0,$01F8,$0000
                DC.W    $C060,$D100             ; o SPRITE
                DC.W    $00F8,$0000,$0108,$00F0
                DC.W    $02E8,$01F0,$05E8,$03F0,$0BE8,$07F0
                DC.W    $1668,$0FF0,$0C68,$1EF0,$5868,$3CF0
                DC.W    $B868,$7CF0,$BFE2,$7FFC,$BFFA,$7FFC
                DC.W    $8062,$7FFC,$FF6E,$00F0,$0168,$00F0
                DC.W    $0168,$00F0,$0108,$00F0,$01F8,$0000
                DC.W    $0000,$0000
;
;   SPRITE DATA 9
;
                DC.W    $6D60,$7E00             ; O SPRITE
                DC.W    $1FE0,$0000,$2010,$1FE0
                DC.W    $5FE8,$3FF0,$B074,$7FF8,$B074,$78F8
                DC.W    $B074,$78F8,$B074,$78F8,$BFF4,$7FF8
                DC.W    $5FF4,$3FFB,$2074,$1FF8,$1F74,$00F8
                DC.W    $F174,$00F8,$8F74,$70F8,$B074,$7FF8
                DC.W    $5FE8,$3FF0,$2010,$1FE0,$1FE9,$0000
                DC.W    $C060,$D100             ; O SPRITE
                DC.W    $1FE0,$0000,$2010,$1FE0
                DC.W    $5FE8,$3FF0,$B074,$7FF8,$B074,$78F8
                DC.W    $B074,$78F8,$B074,$78F8,$BFF4,$7FF8
                DC.W    $5FF4,$3FF8,$2074,$1FFB,$1F74,$00F8
                DC.W    $F174,$00F8,$8F74,$70F8,$B074,$7FF8
                DC.W    $5FE8,$3FF0,$2010,$1FE0,$1FE0,$0000
                DC.W    $0000,$0000
; SPRITE DATA 1   (TIMES 2)
                DC.W    $6D60,$7E00             ; O SPRITE
                DC.W    $0FE0,$0000,$1020,$0FC0
                DC.W    $2FA0,$1FC0,$5FA0,$3FC0,$B3A0,$7FC0
                DC.W    $ABA0,$77C0,$9BA0,$67C0,$EBA0,$07C0
                DC.W    $0BA0,$07C0,$0BA0,$07C0,$0BA0,$07C0
                DC.W    $0BA0,$07C0,$0BA0,$07C0,$0BA0,$07C0
                DC.W    $0BA0,$07C0,$0820,$07C0,$0FE0,$0000
                DC.W    $C060,$D100             ; O SPRITE
                DC.W    $0FE0,$0000,$1020,$0FC0
                DC.W    $2FA0,$1FC0,$5FA0,$3FC0,$B3A0,$7FC0
                DC.W    $ABA0,$77C0,$9BA0,$67C0,$EBA0,$07C0
                DC.W    $0BA0,$07C0,$0BA0,$07C0,$0BA0,$07C0
                DC.W    $0BA0,$07C0,$0BA0,$07C0,$0BA0,$07C0
                DC.W    $0BA0,$07C0,$0820,$07C0,$0FE0,$0000
                DC.W    $0000,$0000
;
; LAST SPRITE OF 1 IMAGE
;
                DC.W    $6D60,$7E00             ; IMAGEN SPRITE
                DC.W    $0FE0,$0000,$1020,$0FC0
                DC.W    $2FA0,$1FC0,$5FA0,$3FC0,$B3A0,$7FC0
                DC.W    $ABA0,$77C0,$9BA0,$67C0,$EBA0,$07C0
                DC.W    $0BA0,$07C0,$08A0,$07C0,$0BA0,$07C0
                DC.W    $0BA0,$07C0,$0BA0,$07C0,$0BA0,$07C0
                DC.W    $0BA0,$07C0,$0820,$07C0,$0FE0,$0000
                DC.W    $C060,$D100             ; AGENTA SPRITE
                DC.W    $0FE0,$0000,$1020,$0FC0
                DC.W    $2FA0,$1FC0,$5FA0,$3FC0,$B3A0,$7FC0
                DC.W    $ABA0,$77C0,$9BA0,$67C0,$EBA0,$07C0
                DC.W    $0BA0,$07C0,$0BA0,$07C0,$0BA0,$07C0
                DC.W    $0BA0,$07C0,$0BA0,$07C0,$0BA0,$07C0
                DC.W    $0BA0,$07C0,$0820,$07C0,$0FE0,$0000
                DC.W    $0000,$0000
S_FIN  EQU  *
****** COPPERLIST
COPLIST
                DC.W    $008E,$2C81,$0090,$F4C1,$0092,$38,$0094,$D0
                DC.W    $00E0,BPLANE1/$10000,$00E2      ; BITPLANE 1
                DC.W    (BPLANE1&$FFFF)+40
                DC.W    %00E4,BPLANE2/$10000,$00E6      ; BITPLANE 2
                DC.W    (BPLANE2&$FFFF)+40
                DC.W    $0108,00                        ; MODULO
                                                        ; BITPLANE
                DC.W    $0100,$1200                     ; 2 BITPLANES
                DC.W    $0102,$0000
                DC.W    $0104,$0024
                DC.W    $0180,$000                      ; COLOR
                                                        ; BACKGROUND
                DC.W    $0182,$000
                DC.W    $01A2,$00F                      ; COLORES
                                                        ; SPRITES
                DC.W    $01A4,$0AF,$01A6,$0DD,$01AA,$00F
                DC.W    $01AC,$0AF,$01AE,$0DD
                DC.W    $0120,$0004                     ; PUNTEROS
                                                        ; 4 SPRITES
                DC.W    $0122,$5128,$0124,$0004,$0126,$5094
                DC.W    $0128,$0004,$012A,$5000,$012C,$0004
                DC.W    $012E,$51BC,$FFFF,$FFFE
****  SPRITES DATOS DE COORDENADAS
                CNOP0,2
X_RISTOS
     DC.B    $50,$50,$51,$53,$56,$5A,$5E,$63,$68,$6E,$74,$7B,$82
     DC.B    $89,$91,$98,$9F,$A7,$AD,$B4,$BA,$C0,$C5,$CA,$CE
     DC.B    $D1,$D4,$D6,$D7,$D8,$D8,$D8,$D6,$D5,$D2,$D0,$CD
     DC.B    $C9,$C5,$C1,$BD,$B9,$B5,$B1,$AD,$A9,$A6,$A2,$A0
     DC.B    $9D,$9B,$99,$98,$97,$97,$97,$97,$98,$99,$9B,$9C
     DC.B    $9E,$A0,$A2,$A4,$A6,$A8,$AA,$AB,$AC,$AD,$AE,$AE
     DC.B    $AE,$AD,$AC,$AA,$A8,$A6,$A3,$A0,$9C,$98,$94,$8F
     DC.B    $8B,$86,$81,$7D,$78,$74,$70,$6C,$69,$66,$64,$62
     DC.B    $61,$61,$61,$62,$64,$66,$6A,$6D,$72,$77,$7D,$83
     DC.B    $89,$90,$97,$9F,$A6,$AE,$B6,$BD,$C4,$CB,$D1,$D7
     DC.B    $DD,$E2,$E6,$E9,$EC,$EE,$EF,$EF,$EE,$ED,$EB,$E8
     DC.B    $E4,$E0,$DB,$D6,$D0,$CA,$C3,$BC,$B5,$AE,$A7,$A0
     DC.B    $9A,$93,$8D,$87,$82,$7D,$79,$76,$73,$70,$6F,$6E
     DC.B    $6D,$6D,$6E,$70,$71,$74,$76,$79,$7C,$80,$83,$87
     DC.B    $8B,$8E,$92,$95,$98,$9B,$9D,$9F,$A1,$A2,$A3,$A3
     DC.B    $A3,$A3,$A2,$A1,$A0,$9E,$9C,$9A,$98,$96,$94,$92
     DC.B    $90,$8E,$8D,$8B,$8B,$8A,$8A,$8B,$8B,$8D,$8F,$91
     DC.B    $94,$97,$9B,$9F,$A3,$A8,$AD,$B2,$B7,$BC,$C2,$C7
     DC.B    $CC,$D0,$D4,$D8,$DC,$DE,$E1,$E2,$E3,$E3,$E3,$E1
     DC.B    $DF,$DD,$D9,$D6,$D0,$CB,$C5,$BE,$B7,$B0,$A9,$A1
     DC.B    $99,$91,$8A,$82,$7B,$74,$6E,$68,$63,$5E,$5A,$57
     DC.B    $54,$53,$52
Y E
     DC.B    $56,$52,$4F,$4B,$48,$44,$41,$3E,$3C,$39,$37,$36
     DC.B    $35,$34,$33,$33,$33,$34,$35,$36,$37,$39,$3B,$3E
     DC.B    $40,$43,$45,$48,$4B,$4E,$51,$53,$56,$59,$5B,$5D
     DC.B    $5F,$61,$62,$63,$64,$65,$65,$66,$65,$65,$65,$64
     DC.B    $63,$62,$61,$60,$5F,$5E,$5C,$5B,$5A,$59,$58,$57
     DC.B    $57,$56,$56,$56,$56,$56,$57,$58,$58,$59,$5A,$5C
     DC.B    $5D,$5E,$60,$61,$63,$64,$65,$66,$67,$68,$69,$69
     DC.B    $69,$69,$69,$68,$67,$66,$64,$62,$60,$5E,$5C,$59
     DC.B    $56,$53,$50,$4D,$4A,$47,$44,$41,$3F,$3C,$3A,$38
     DC.B    $36,$3A,$33,$32,$32,$32,$32,$32,$33,$33,$37,$39
     DC.B    $3B,$3E,$41,$44,$47,$4B,$4E,$52,$56,$59,$5D,$61
     DC.B    $64,$67,$6A,$6D,$6F,$72,$73,$75,$76,$77,$77,$77
     DC.B    $77,$77,$76,$74,$73,$71,$6F,$6D,$6B,$68,$66,$63
     DC.B    $60,$5E,$5B,$59,$56,$54,$52,$50,$4F,$4D,$4C,$4B
     DC.B    $4B,$4A,$4A,$4A,$4B,$4B,$4C,$4C,$4D,$4E,$4F,$50
     DC.B    $51,$52,$53,$54,$55,$56,$57,$57,$57,$57,$57,$57
     DC.B    $56,$56,$55,$54,$52,$51,$50,$4E,$4C,$4B,$49,$48
     DC.B    $46,$45,$43,$42,$41,$41,$40,$40,$40,$40,$41,$42
     DC.B    $43,$44,$46,$48,$4A,$4D,$50,$53,$56,$59,$5C,$5F
     DC.B    $62,$66,$69,$6C,$6F,$71,$74,$76,$78,$79,$7A,$7B
     DC.B    $7C,$7C,$7B,$7B,$79,$78,$76,$74,$72,$6F,$6C,$69
     DC.B    $65,$62,$5E,$5B
                CNOP0,2
GFXBASE         DS.L    1
INICIALSP       DS.L    1
ANTCOPPER       DS.L    1
TIMER           DS.W    1
PUNTERO         DS.L    4
INDEX           DC.W    $0007,$000E,$0015,$0000
LISTADO 2.
DC.W  $637C,$6800  ; VERTICAL Y HORIZONTAL,
                   ; VERTICAL FINAL
DC.W  $0C98,$03E0  ; PRIMERA LINEA DEL SPRITE
DC.W  $19CC,$07F0
DC.W  $33E6,$0FFB
DC.W  $19CC,$07F0
DC.W  $0C98,$03E0  ; ULTIMA LINEA DEL SPRITE
DC.W  $0000,$0000  ; DOS PALABRAS A 0 INDICANDO FIN DE ESTRUCTURA
                   ; DEL SPRITE

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