Necesito ayuda con rutina de sprites en ASM

Subforo oficial del Sinclair QL: realiza aquí las consultas relativas a tu QL.

Moderador: Sir Cilve Sinclair

Responder
Avatar de Usuario
radastan
Phantomas
Mensajes: 2232
Registrado: Lun May 07, 2007 5:34 pm
Contactar:

Necesito ayuda con rutina de sprites en ASM

Mensaje por radastan » Mié Abr 06, 2011 8:02 am

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.
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________

Avatar de Usuario
radastan
Phantomas
Mensajes: 2232
Registrado: Lun May 07, 2007 5:34 pm
Contactar:

Re: Necesito ayuda con rutina de sprites en ASM

Mensaje por radastan » Mié Abr 06, 2011 2:54 pm

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?
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________

Avatar de Usuario
radastan
Phantomas
Mensajes: 2232
Registrado: Lun May 07, 2007 5:34 pm
Contactar:

Re: Necesito ayuda con rutina de sprites en ASM

Mensaje por radastan » Mié Abr 06, 2011 4:07 pm

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).
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Necesito ayuda con rutina de sprites en ASM

Mensaje por mcleod_ideafix » Jue Abr 07, 2011 12:48 am

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.
Web: ZX Projects | Twitter: @zxprojects

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Necesito ayuda con rutina de sprites en ASM

Mensaje por mcleod_ideafix » Jue Abr 07, 2011 1:31 am

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...
Última edición por mcleod_ideafix el Jue Abr 07, 2011 5:48 am, editado 1 vez en total.
Web: ZX Projects | Twitter: @zxprojects

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Necesito ayuda con rutina de sprites en ASM

Mensaje por mcleod_ideafix » Jue Abr 07, 2011 3:36 am

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) :)
Web: ZX Projects | Twitter: @zxprojects

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Necesito ayuda con rutina de sprites en ASM

Mensaje por mcleod_ideafix » Jue Abr 07, 2011 4:04 am

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
Web: ZX Projects | Twitter: @zxprojects

Avatar de Usuario
radastan
Phantomas
Mensajes: 2232
Registrado: Lun May 07, 2007 5:34 pm
Contactar:

Re: Necesito ayuda con rutina de sprites en ASM

Mensaje por radastan » Jue Abr 07, 2011 7:29 am

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.
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________

afx
Sabreman
Mensajes: 396
Registrado: Dom Feb 24, 2008 10:56 pm

Re: Necesito ayuda con rutina de sprites en ASM

Mensaje por afx » Jue Abr 07, 2011 7:07 pm

¡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).

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Necesito ayuda con rutina de sprites en ASM

Mensaje por mcleod_ideafix » Jue Abr 07, 2011 7:25 pm

Estoy adaptando un efecto clásico de la demoscene, a ver si sale bonita y se la paso a Radastan...
Web: ZX Projects | Twitter: @zxprojects

Avatar de Usuario
programandala.net
Manic Miner
Mensajes: 210
Registrado: Mié Ago 04, 2010 9:20 pm
Ubicación: España
Contactar:

Re: Necesito ayuda con rutina de sprites en ASM

Mensaje por programandala.net » Lun Abr 18, 2011 3:26 pm

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.
Marcos Cruz (programandala.net)

afx
Sabreman
Mensajes: 396
Registrado: Dom Feb 24, 2008 10:56 pm

Re: Necesito ayuda con rutina de sprites en ASM

Mensaje por afx » Lun Abr 18, 2011 5:42 pm

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.

Avatar de Usuario
radastan
Phantomas
Mensajes: 2232
Registrado: Lun May 07, 2007 5:34 pm
Contactar:

Re: Necesito ayuda con rutina de sprites en ASM

Mensaje por radastan » Mar Abr 19, 2011 12:55 pm

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).
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________

Avatar de Usuario
programandala.net
Manic Miner
Mensajes: 210
Registrado: Mié Ago 04, 2010 9:20 pm
Ubicación: España
Contactar:

Re: Necesito ayuda con rutina de sprites en ASM

Mensaje por programandala.net » Mar Abr 19, 2011 1:27 pm

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...
Marcos Cruz (programandala.net)

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 13 invitados