Página 1 de 1

Necesito ayuda con rutina de sprites en ASM

Publicado: Mié Abr 06, 2011 8:02 am
por radastan
Vamos a ver, ¿Alguien puede ayudarme con esta rutina? es que no hace NADA, simplemente retorna al BASIC tan alegremente.

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.

Re: Necesito ayuda con rutina de sprites en ASM

Publicado: Mié Abr 06, 2011 2:54 pm
por radastan
A ver, que me huelo por donde van los tiros... creo que esto es cosa del EASy68K. Para mi que las etiquetas no puedo usarlas así, y hay que cambiar los DBF para que apunten de forma relativa. El problema es que esto ya me pasó una vez y bastaba poner (PC) después del nombre de la etiqueta, pero con DBF no me sirve... y claro, el ensamblador lo pone en una dirección a su antojo y la rutina no es reubicable.

¿Alguna idea?

Re: Necesito ayuda con rutina de sprites en ASM

Publicado: Mié Abr 06, 2011 4:07 pm
por radastan
He simulado con el EASy68K el funcionamiento de la rutina y va de perlas, es perfecta. El problema que hay es el tema de la reubicación de las etiquetas, por lo que tengo que hacer saltos relativos. La pega es que con saltos relativos me pierdo con el 68000, aún no tengo currada esa parte.

El código cambiado a saltos (cambiando DBF por los equivalentes) sería tal que así:

Código: Seleccionar todo

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      ; Decrementamos el tamaño XX del sprite en 1
   SUBQ   #1, D4      ; Decrementamos 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
; Sutituimos DBF   D3, ESCRIBEX   Seguimos copiando en horizontal hasta completar el tamaño X del sprite
   SUBQ   #1, D3
   CMPI   #0, D3
   BGT   ESCRIBEX
   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)
; Sustituimos DBF   D4, ESCRIBEY   Seguimos copiando en vertical hasta completar el tamaño Y del sprite
   SUBQ   #1, D4
   CMPI   #0, D4
   BGT   ESCRIBEX
   MOVEQ   #0, D0      ; Dejamos todo preparado para el BASIC
   RTS         ; Salimos
   END   COMIENZO   ; Fin del programa


Vengaaaaa, una ayuditaaaaa payooooooos, que casi lo tenemos. Lo bueno es que cuando terminemos esta rutina puedo hacer la inversa muy fácilmente (una que meta un cuadrado de la pantalla en un sprite).

Re: Necesito ayuda con rutina de sprites en ASM

Publicado: Jue Abr 07, 2011 12:48 am
por mcleod_ideafix
Pero el DBF... ¿no hace saltos relativos? Por el fichero resultado de la compilación (el .L68) parece que eso es lo que hace. Y por la descripción de los saltos de tipo DBxx también se deduce que ya son relativos.

Es más... no veo nada en el código ensamblador que impida que éste sea reubicable.

Re: Necesito ayuda con rutina de sprites en ASM

Publicado: Jue Abr 07, 2011 1:31 am
por mcleod_ideafix
Por otra parte, veo algunas cosas que no pillo. Por ejemplo:

MOVE.W (A1),(A0) : dices que esto mueve 4 bytes, pero el .W significa 16 bits. Si quieres mover 4 bytes tendría que ser MOVE.L, ¿no?
Pero por otra parte, A0 y A1 los incrementas en 2, no en 4, así que no me queda claro si realmente querías mover 16 bits o 32 bits de datos en el MOVE anterior.

Vale, edito: leí bytes cuando tú pones píxeles. Sí, es lo correcto...

Re: Necesito ayuda con rutina de sprites en ASM

Publicado: Jue Abr 07, 2011 3:36 am
por mcleod_ideafix
Más cosas que he pillado:

En tu ejemplo, usas X=4, Y=4, y recalcas que deben ser múltiplo de 4. En la rutina, X se divide por 4, y te sale 1. Al sumar la nueva X dividida a A0 y demás, te sale que A0 tiene un valor impar. Esto no está permitido en el 68000.

Estoy reescribiendo tu rutina para que use postincremento en el MOVE principal (el que pinta el sprite) y así nos evitamos los dos ADDQ que vienen después. Creo que casi la tengo :D (es la primera vez que escribo algo en el 68000) :)

Re: Necesito ayuda con rutina de sprites en ASM

Publicado: Jue Abr 07, 2011 4:04 am
por mcleod_ideafix
Vale, ya está :) Por correo te he enviado más cosillas... ;)

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), TamX (D3), TamY (D4), SPRITE (D5)

PonSprite
   move.l #131072,a0  ; a0 <- comienzo de la pantalla
   movea.l d5,a1  ; a1 <- comienzo de la definicion del sprite
   lsr.l #1,d1 ; X dividido entre 2
   andi.b #$fe,d1 ; y nos aseguramos de que sea par
   lsr #2,d3 ; TamX dividido entre 4
   subq #1,d3 ; restamos 1 a TamX porque asi lo necesitan los DBRA
   subq #1,d4 ; y lo mismo con TamY.
   add.l d1,a0 ; sumamos X a comienzo de pantalla
   lsl #7,d2 ; un scan de la pantalla tiene 128 bytes
   adda.l d2,a0 ; a0 apunta a la coordenada X,Y
   move.l d3,d5 ; d5 es backup de d3
   move.l a0,d6 ; d6 es backup de a0

PonScan
   move.l d5,d3
   move.l d6,a0

Pon4pixels  ;o pon 8, si estamos en modo 4
   move.w (a1)+,(a0)+
   dbra d3,Pon4pixels
   
   addi.l #128,d6
   dbra d4,PonScan
   
   moveq #0,d0
   rts

   end PonSprite

Re: Necesito ayuda con rutina de sprites en ASM

Publicado: Jue Abr 07, 2011 7:29 am
por radastan
Mc_Leod, mil gracias, especialmente por explicarlo todo y decirme donde estaban los fallos.

Ha quedado una rutina preciosa, y lo mejor de todo es que ahora se abre la veda para poder hacer cosas más curiosas desde BASIC. Voy a trabajar en ello esta misma noche y en la Retroencounter lo muestro, a ver si picamos a la gente para hacer algunos juegos.

Y la semana que viene rutina a la inversa, para reponer el fondo si lo machacamos, y modificación de esta rutina para usar transparencia (lo suyo es usar los bits de flash, y así no los desaprovechamos).

Como siempre, nos sacas las castañas del fuego a los demás.

Re: Necesito ayuda con rutina de sprites en ASM

Publicado: Jue Abr 07, 2011 7:07 pm
por afx
¡Sois unos monstruos! … :D

Sería fantástico tener un método optimizado de tratamientos de sprites. El libro “Genio de los juegos con el QL” tiene una rutina simple de sprites en código máquina pero es muy limitada.

Estaría bien, implementarla al final como una extensión del SuperBASIC (seguramente se podrá sin muchas complicaciones), así sería muy cómoda su utilización.

He estado también probando algunas demos de animación que vienen con QTOP (las llevaré a la RE). La verdad es que en esas demos consiguen unas prestaciones muy buenas moviendo gráficos a modo de "sprites" por toda la pantalla; lo que demuestra que al QL se le puede sacar un partido excelente en el mundo de los juegos (cosa que nunca llegó a cuajar en esta máquina).

Re: Necesito ayuda con rutina de sprites en ASM

Publicado: Jue Abr 07, 2011 7:25 pm
por mcleod_ideafix
Estoy adaptando un efecto clásico de la demoscene, a ver si sale bonita y se la paso a Radastan...

Re: Necesito ayuda con rutina de sprites en ASM

Publicado: Lun Abr 18, 2011 3:26 pm
por programandala.net
afx escribió:Sería fantástico tener un método optimizado de tratamientos de sprites.


Yo también lo hecho mucho en falta: un sistema de gestión de gráficos accessible desde S*BASIC, que funcione en cualquier modo de pantalla. Desgraciadamente el 68000 es una de mis asignaturas pendientes. En cuanto haya algo me animo a escribir una versión mejorada para QL de mi último jueguecillo-divertimento experimental para ZX Spectrum: Alien-B, que por supuesto se llamará Alien-Q :)

afx escribió:El libro “Genio de los juegos con el QL” tiene una rutina simple de sprites en código máquina pero es muy limitada.


Alguna vez me he preguntado si merecería la pena utilizarla de base para escribir otra más versátil y que funcione también en los nuevos modos de pantalla.

Ante la falta de opciones, estaba considerando usar Super Sprite Generator, que venía en la colección final de programas de Digital Precision, que compré cuando la empresa cerró. Por supuesto no funciona en sistemas modernos.

Re: Necesito ayuda con rutina de sprites en ASM

Publicado: Lun Abr 18, 2011 5:42 pm
por afx
programandala.net escribió: estaba considerando usar Super Sprite Generator, que venía en la colección final de programas de Digital Precision


Tenía entendido que es Super Sprite no funcionaba ni siquiera con QLs expandidos. Hace tiempo estuve intentando ver este paquete de Digital Precision, pero no logre hacer funcionar nada (tampoco le didiqué mucho tiempo). Ya contarás si consigues algo.

Cualquier rutina de Sprites será bien venida aunque no vaya en sistemas modernos. Por mi parte con que vaya en la máquina original y en Q-emuLator, por ejemplo, serís suficiente.

Re: Necesito ayuda con rutina de sprites en ASM

Publicado: Mar Abr 19, 2011 12:55 pm
por radastan
Esta semana estoy más liado que la pata de un romano, sobre todo por temas familiares (es lo que tiene la Semana Santa). La próxima semana os dejaré para descargar las rutinas de McLeod con ejemplos, y empezaré a diseñar un editor de sprites para Windows que nos pueda generar los gráficos de una forma cómoda, al igual que una rutina que haga el proceso inverso (coger un área de pantalla y volcarla a un sprite).

Re: Necesito ayuda con rutina de sprites en ASM

Publicado: Mar Abr 19, 2011 1:27 pm
por programandala.net
afx escribió:Cualquier rutina de Sprites será bien venida aunque no vaya en sistemas modernos. Por mi parte con que vaya en la máquina original y en Q-emuLator, por ejemplo, serís suficiente.


Sí, eso ya permitiría hacer muchas cosas!

Pero la diferencia es solo la dirección y la resolución de color de la pantalla. No sería difícil que para empezar funcionara bien esté donde esté alojada la pantalla (en lugar de suponer que está en la dirección de la QL original); eso ya permitiría usarla con Minerva, y en QPC2 con el comando de simulación de pantalla original. Después se haría que usara el tamaño real de pantalla disponible, y por último las nuevas resoluciones de color...