Código: Seleccionar todo
*-----------------------------------------------------------
* Programa :
* Autor :
* Fecha :
* Descripcion : Rutina de sprites
*-----------------------------------------------------------
* X es la posición donde queremos poner el Sprite (0 izquierda) (múltiplo de 4)
* Y es la posición donde queremos poner el sprite (0 arriba)
* XX es el tamaño horizontal del Sprite (múltiplo de 4)
* YY es el tamaño vertical del Sprite
* SPRITE es la dirección de memoria del Sprite
*
* ENTRADA: X (D1), Y (D2), XX (D3), YY (D4), SPRITE (D5)
COMIENZO:
LSR.W #2,D1 ; Dividimos la posición X entre cuatro
LSR.W #2,D3 ; Dividimos el tamaño XX entre cuatro
MOVEA.L #$20000,A0 ; Ponemos en A0 el valor de la primera posición de la VRAM
MOVE.L D5,A1 ; ;Ponemos en A1 la posición del sprite
ADDA.W D1, A0 ; Añadimos a A0 el valor de la posición X
LSL.W #7, D2 ; Multiplicamos la posición Y por 128
ADDA.W D2,A0 ; Añadimos a A0 el valor de la posición Y
SUBQ #1,D3 ; Drecrementamos el tamaño XX del sprite en 1
SUBQ #1,D4 ; Drecrementamos el tamaño YY del sprite en 1
MOVE.B D3, D6 ; Copiamos D3 a D6
ESCRIBEY:
MOVE.L A0,A2 ; Copiamos A0 en A2
ESCRIBEX:
MOVE.W (A1),(A0) ; Copiamos 4 pixels del sprite a la pantalla
ADDQ #2, A0 ; Incrementamos el puntero de pantalla
ADDQ #2, A1 ; Incrementamos el puntero de sprite
DBF D3,ESCRIBEX ; Seguimos copiando en horizontal hasta completar el tamaño X del sprite
MOVE.B D6,D3 ; Restauramos el valor de D3 para la siguiente línea de exploración
MOVE.L A2,A0 ; Restauramos el valor de A0 para la siguiente línea de exploración
ADDA #128, A0 ; Incrementamos el valor Y de la pantalla en 128 (siguiente línea)
DBF D4, ESCRIBEY ; Seguimos copiando en vertical hasta completar el tamaño Y del sprite
MOVEQ #0,D0 ; Dejamos todo preparado para el BASIC
RTS ; Salimos
END COMIENZO ; Fin del programa
Estoy usando un programa lanzador desde Super Basic tal que así:
Código: Seleccionar todo
10 CLS
20 prog = RESPR(52)
30 LBYTES flp1_sprite1, prog
40 sprite = RESPR(64)
50 FOR a=sprite TO sprite+63: POKE a,255: NEXT a
60 CALL prog,4,4,16,16,sprite
La idea es la siguiente desde BASIC:
- Reservo memoria para la rutina
- La cargo
- Reservo memoria para el sprite (64 bytes)
- Me hago un sprite a base de 255 (todos los bits a 1)
- Llamo a la rutina de sprites en ensamblador
Supuestamente la rutina recoge los parámetros:
- Posición X en registro D1
- Posición Y en registro D2
- Tamaño horizontal del sprite en D3
- Tamaño vertical del sprite en D4
- Lugar de la memoria donde está el sprite en D5
Una ayudita de los genios del 68000, que no lo mio es el Z80 y se me están atragantando los 16 bits.