Rutina para dibujar un Sprite en pantalla.

Programando el Amstrad en Ensamblador.
Reglas del Foro
Debido a que hay varios temas pidiendo ayuda para programar en ensamblador máquinas distintas al Amstrad CPC, con micro distinto al Z80 y que incluso dependen del sistema operativo, nos vemos en la necesidad de poner por escrito que estos posts son bienvenidos pero que no es el lugar adecuado ya que por estos lares nos dedicamos más al ensamblador del Z80, un microprocesador de 8 bits que tuvo su gran auge en ordenadores y consolas de los años 80.

De todas formas, esto no quita que alguien que sepa del asunto pueda postear alguna respuesta pero es más fácil encontrar foros dedicados a programar en ensamblador en Windows o MS-DOS que ayudarán más que nosotros:
http://www.lawebdelprogramador.com/news ... nsamblador
Avatar de Usuario
DaDMaN
Keeper of The Forum
Keeper of The Forum
Mensajes: 796
Registrado: Jue 16 Mar , 2006 10:51 pm

Mensajepor DaDMaN » Lun 10 Sep , 2007 5:54 pm

Para hacer las cosas más rápidas, te aconsejo un tile de 8 o de 16 pixels de alto de modo que todos se puedan dibujar en inicio de caracter y así ganar velocidad haciendo una rutina específica. El ancho ya da un poco más igual puesto que el cálculo del incremento es trivial.
La verdad es que 16 pixeles de altura me desmonta un poco el tema... 20 pixeles por 10 tiles = 200 pixeles (el alto total de la pantalla)... con 16 pixeles, la cosa descuadra un poco... pero si no queda mas remedio, adaptaré "mi pensamiento".

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Mensajepor Artaburu » Lun 10 Sep , 2007 5:58 pm

Hombre, pueden ser de 20 de alto pero la rutina será un poco más lenta porque comprobará todo el rato si hay salto de caracter o de línea pero irá bastante rápido también. ¿El fondo se guarda o se reconstruye el tile tocado? ¿hay buffer para dibujar los sprites?
Salu2,
Arta

Avatar de Usuario
DaDMaN
Keeper of The Forum
Keeper of The Forum
Mensajes: 796
Registrado: Jue 16 Mar , 2006 10:51 pm

Mensajepor DaDMaN » Lun 10 Sep , 2007 6:03 pm

Hombre, pueden ser de 20 de alto pero la rutina será un poco más lenta porque comprobará todo el rato si hay salto de caracter o de línea pero irá bastante rápido también. ¿El fondo se guarda o se reconstruye el tile tocado? ¿hay buffer para dibujar los sprites?
La idea es que no se pueda pasar sobre los tiles... seran plataformas... yo no me veo capaz de restaurar fondos ni leches xD

Osea, se dibuja el "mapeado" con los tiles de las plataformas y hasta la siguiente pantalla no se redibuja la pantalla completa...

Habia pensado en meter disparos... que si pasarian sobre los tiles de las plataformas... pero claro... repito, soy un cutre y no me veo capaz de gestionar eso, ni se como hacerlo.

Salu2

Avatar de Usuario
MiguelSky
Lord of Short Time
Lord of Short Time
Mensajes: 6969
Registrado: Sab 08 Oct , 2005 2:02 am
Contactar:

Mensajepor MiguelSky » Lun 10 Sep , 2007 6:07 pm

Yo creo que hay un problema en la parte final de la rutina, en
salto_caracter
ld bc,&37b0+10 ;37b0+ ancho
sbc hl,bc
jp loop_alto_2x
salto_linea
ld bc,&0800-10 ;0800-ancho
add hl,bc
jp loop_alto_2x
Esas medidas de ancho hay que cambiarlas por variables para hacer la rutina 'universal'. Por otro lado, el &37b0 no se de donde sale :-k

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Mensajepor Artaburu » Lun 10 Sep , 2007 6:10 pm

Okis, si el juego es divertido no tiene porqué ser un alarde de la técnica. Como no redibujas tiles sigue con los de 10x20 tranquilamente ;)
Para los disparos, si los dibujar con XOR y cuando pasen los redibujas en la posición anterior con XOR, se restaura el fondo... simpre que no se haya tocado nada. Bueno, como los disparos serán pequeños spritillos diminutos y simpáticos, también puedes capturar el fondo para ellos.
Salu2,
Arta

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Mensajepor Artaburu » Lun 10 Sep , 2007 6:14 pm

Yo creo que hay un problema en la parte final de la rutina, en
salto_caracter
ld bc,&37b0+10 ;37b0+ ancho
sbc hl,bc
jp loop_alto_2x
salto_linea
ld bc,&0800-10 ;0800-ancho
add hl,bc
jp loop_alto_2x
Esas medidas de ancho hay que cambiarlas por variables para hacer la rutina 'universal'. Por otro lado, el &37b0 no se de donde sale :-k
Ah, pequeño saltamontes... la rutina sólo vale para número par de bytes, eh? y ese número tan raro es el número que hay que restar para pasar a la siguiente línea cuando se salta de caracter. Es la diferencia entre el valor de la última posición de un caracter menos la siguiente (o al revés). Por ejemplo, entre &F800 y &C050
Salu2,
Arta

Avatar de Usuario
MiguelSky
Lord of Short Time
Lord of Short Time
Mensajes: 6969
Registrado: Sab 08 Oct , 2005 2:02 am
Contactar:

Mensajepor MiguelSky » Lun 10 Sep , 2007 6:52 pm

es el número que hay que restar para pasar a la siguiente línea cuando se salta de caracter. Es la diferencia entre el valor de la última posición de un caracter menos la siguiente (o al revés). Por ejemplo, entre &F800 y &C050
Ahá !!! ¿Y que hay de lo sumar C850 y despreciar el acarreo ? xDD Que sepas que me ha gustado ;), pero deberías estandarizar esa rutina, auqne solo sea para números pares.

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Mensajepor Artaburu » Mar 11 Sep , 2007 8:37 am

es el número que hay que restar para pasar a la siguiente línea cuando se salta de caracter. Es la diferencia entre el valor de la última posición de un caracter menos la siguiente (o al revés). Por ejemplo, entre &F800 y &C050
Ahá !!! ¿Y que hay de lo sumar C850 y despreciar el acarreo ? xDD Que sepas que me ha gustado ;), pero deberías estandarizar esa rutina, auqne solo sea para números pares.
Pero es que para sprites pequeños creo que es más lenta. De todas formas no costará mucho estandarizarla. A ver si esta tarde-noche puedo.
Salu2,
Arta

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Mensajepor Artaburu » Mar 25 Sep , 2007 8:47 am

Os dejo una rutina que colgó Prodatron en algún foro alemán y que encontró DaDMaN. Mejora muy mucho a las rutinas que hay hasta ahora en este hilo. Sirve para dibujar sprites sólidos (sin transparencias)
La rutina original está aquí:
http://www.cpc-forum.de/phpbb/viewtopic.php?t=209
Ojo que si la cogéis debéis meter un par de ex de,hl porque si no me equivoco, se le olvidó meter un cambio de hl a de para poder hacer el salto de línea.

La rutina que cuelgo aquí está modificada para ejecutarla desde BASIC con call &writesprite,destino,dimensiones,origen
Dimensiones =&alto.ancho
Es muy sencilla de entender y de modificar para pasar los parámetros desde ASM, pero en caso de duda... preguntad.

Código: Seleccionar todo

writesprite:
ld b,(ix+2) ;ancho
ld l,(ix+4)
LD h,(ix+5)

ld a,64
sub b
add a
ld (width1+1),a
xor a
sub b ;-ancho
ld (width2+1),a
ld a,(ix+3) ;A lleva el alto del sprite
width0: ex de,hl
width1: jr width1 ;cada LDI es un byte
;se hace el salto al byte correspondiente (64-ancho)
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi
dec a
ret z
width2:
ld bc,#700
ex de,hl
add hl,bc
jp nc,width0
ld bc,#c050
add hl,bc
jp width0
Salu2,
Arta

Avatar de Usuario
jgnavarro
Megaforero
Megaforero
Mensajes: 296
Registrado: Mar 24 Mar , 2009 12:27 pm

Re: Rutina para dibujar un Sprite en pantalla.

Mensajepor jgnavarro » Dom 29 Ago , 2010 11:56 pm

con meter un jr width1 entre las siguientes lineas funciona:

ld a,(ix+3) ;A lleva el alto del sprite
width0: ex de,hl

o un ex de,hl que es más rápido...
--
Salu2 (-:) JAVIER

Who'd need windows in a world without gates?
¿Quien necesita ventanas en un mundo sin puertas?

Visita www.4mhz.es

Avatar de Usuario
Mode 2
I am The Forum
I am The Forum
Mensajes: 2068
Registrado: Lun 10 Oct , 2005 8:01 pm
Ubicación: Sevilla, años 80.
Contactar:

Re:

Mensajepor Mode 2 » Jue 22 Dic , 2011 2:57 pm

Con la información que aparece en:
http://andercheran.aiind.upv.es/~amstra ... trtim.html
Se pueden calcular mejor los tiempos relativos de ejecución de las rutinas.
Este enlace parece roto ¿sabeis de algun otro sitio donde se encuentre esta información?

Gracias.
BUSCO: VideoPac+, Jaguar Saturn, Micromanía 1, Amstrad Semanal, MicroHobby, juegos especialmente CPC y Vectrex, Aquarius, Sam Copé, 520 ST, manual +3, manual CPC664.

Avatar de Usuario
MiguelSky
Lord of Short Time
Lord of Short Time
Mensajes: 6969
Registrado: Sab 08 Oct , 2005 2:02 am
Contactar:

Re: Rutina para dibujar un Sprite en pantalla.

Mensajepor MiguelSky » Jue 22 Dic , 2011 3:26 pm

:)

http://www.cpctech.org.uk/docs/instrtim.html

o http://www.cepece.info/amstrad/docs/instrtim.html

Tengo que ver si puedo actualizar el mirror de cepece.info, que ya no lo está...

Avatar de Usuario
syx
Master of The Forum
Master of The Forum
Mensajes: 1353
Registrado: Mié 02 Sep , 2009 9:55 am

Re: Rutina para dibujar un Sprite en pantalla.

Mensajepor syx » Jue 22 Dic , 2011 4:40 pm

ó puedes usar la versión de mi google code ;)

Avatar de Usuario
jgnavarro
Megaforero
Megaforero
Mensajes: 296
Registrado: Mar 24 Mar , 2009 12:27 pm

Re: Rutina para dibujar un Sprite en pantalla.

Mensajepor jgnavarro » Jue 22 Dic , 2011 10:46 pm

Me gusta
ó puedes usar la versión de mi google code ;)
--
Salu2 (-:) JAVIER

Who'd need windows in a world without gates?
¿Quien necesita ventanas en un mundo sin puertas?

Visita www.4mhz.es

Avatar de Usuario
Mode 2
I am The Forum
I am The Forum
Mensajes: 2068
Registrado: Lun 10 Oct , 2005 8:01 pm
Ubicación: Sevilla, años 80.
Contactar:

Re:

Mensajepor Mode 2 » Vie 25 Ene , 2013 11:34 pm

Con la información que aparece en:
http://andercheran.aiind.upv.es/~amstra ... trtim.html
Se pueden calcular mejor los tiempos relativos de ejecución de las rutinas.
Sí, es muy instructiva y puedes saber que instrucciones 'penan' más en tiempo pero algo pesado calcularlas a mano. Imagino que con el time de Basic o un análogo en Ensamblador te dará una idea de cómo de rápida o no es una rutina ¿no?
ó puedes usar la versión de mi google code ;)
¡¡¡Que guay!!, y en español. ;-)
Os dejo una rutina que colgó Prodatron....

La rutina que cuelgo aquí está modificada para ejecutarla desde BASIC con
call &writesprite,destino,dimensiones,origen donde Dimensiones =&alto.ancho
Es muy sencilla de entender y de modificar para pasar los parámetros desde ASM, pero en caso de duda... preguntad.

writesprite:
ld b,(ix+2) ;ancho
ld l,(ix+4)
LD h,(ix+5)

ld a,64
sub b
add a
ld (width1+1),a
xor a
sub b ;-ancho
ld (width2+1),a
ld a,(ix+3) ;A lleva el alto del sprite
width0: ex de,hl
width1: jr width1 ;cada LDI es un byte
;se hace el salto al byte correspondiente (64-ancho)
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi
dec a
ret z
width2:
ld bc,#700
ex de,hl
add hl,bc
jp nc,width0
ld bc,#c050
add hl,bc
jp width0
Tengo una pequeña duda, la he probado y va perfectamente pero ahora a pasarla a Ensamblador, sin la llamada a BASIC veo que la dirección del sprite no aparece asignandose a DE por ningun lado :-s aunque al poner un 'breakpoint' nada más comenzar la rutina ya tiene DE asignada dicha dirección (en mi ejemplo he puesto en &4000 el comienzo del código y el sprite en &4400). Seguramente será una tontería, pero no la veo. [-(

Por cierto, a día de hoy ¿es ésta la rutina más rápida para pintar un sprite sin respetar el fondo que conocéis?

Gracias.
BUSCO: VideoPac+, Jaguar Saturn, Micromanía 1, Amstrad Semanal, MicroHobby, juegos especialmente CPC y Vectrex, Aquarius, Sam Copé, 520 ST, manual +3, manual CPC664.


¿Quién está conectado?

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


La Comunidad Española
ESP Soft, juegos para tu CPC Foro de Amstrad CPC Todos los juegos para CPC en un CD Web dedicada al Amstrad CPC (utilidades) Información útil para el CPC (talleres) Selección de juegos de Amstrad CPC Mundo CPC Pree Play then any Key CPC Basic