Scrolles

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Avatar de Usuario
climacus
Sabreman
Mensajes: 411
Registrado: Mar Ago 25, 2009 1:46 pm

Re: Scrolles

Mensaje por climacus » Mar May 06, 2014 10:47 pm

susso escribió:Interesante hilo, por si acaso dejo un link de optimizaciones que de vez en cuando echo una ojeada:
http://wikiti.brandonw.net/index.php?ti ... timization



Enviado con Tapatalk


Que bueno!! Gracias.
Todos mis juegos en formato físico
http://www.matranet.net/boutique/zx/zx.php

Avatar de Usuario
climacus
Sabreman
Mensajes: 411
Registrado: Mar Ago 25, 2009 1:46 pm

Re: Scrolles

Mensaje por climacus » Mar May 06, 2014 10:51 pm

zx81 escribió:
climacus escribió:
antoniovillena escribió:Sí, usa sprites prerrotados. Concretamente 4 rotaciones por sprite (siendo el desplazamiento de 2 pixeles). Y no, no es nada complicado, tan sólo tienes que hacer que tu rutina pinte el fondo rotado sin sprites pero con el mismo orden. Lo importante es coger es la idea.


Ya decia yo que iba muy deprisa todo! Ya me has picado para hacer una rutina de sprites prerrotados. :)

Creo que el raster va linea a linea de izquierda a derecha. Osea, que en vez de pintar tile a tile completo hay que pintar el primer scan del tile de la izquierda, el primer scan del de su derecha y asi sucesivamente, no?

Pero creo recordar que en Cobra se vuelca el fondo a base de PUSHes, por lo que el proceso es a la inversa...


El raster va, efectivamente, de izquierda a derecha y de arriba a abajo. Para pintar sin que se vea, puedes ir por detrás del raster, o si te da tiempo, aprovechar momentos en medio. Una línea de raster dura 224 t-estados de CPU en el 48k (228 en los demás). El primer pixel se pinta en pantalla 14336 t-estados después de la interrupción. Antes de eso está el borde, lo mismo que tras 57248 t-estados, que es donde empieza el borde inferior (recuerda, todo lo que digo son timings del 48k). Un frame completo son 69888 t-estados.

Cada línea de raster necesita los primeros 128 t-estados de los 224 que dura, así que al final de cada una te quedan 96 t-estados, difíciles de aprovechar, pero posible en teoría. Para hacerlo por PUSH, podrías esperar al estado 57248 y así tendrías 26976 t-estados para actualizar (gestión de la interrupción aparte).

El arkanoid, por ejemplo, dibuja la bola alrededor del t-estado 400 y la borra sobre los 57000. De esa forma, el movimiento de la bola es absolutamente suave.


Vaya tela. La verdad es que me he hecho comodo usando la shadow screen. Pero esto me parece de lo mas interesante. Nunca me habia dado por contar estados...

Muchas gracias. Cacharreare con el asunto.
Todos mis juegos en formato físico
http://www.matranet.net/boutique/zx/zx.php

susso
Jack The Nipper
Mensajes: 146
Registrado: Mar May 07, 2013 9:42 am

Re: Scrolles

Mensaje por susso » Mar May 06, 2014 10:53 pm

Es lo que digo siempre, programar para spectrum con z80 es mejor que los sudokus y más eficaz que los brain trainings. =o)
Perdón por el offtopic.


Enviado con Tapatalk

Avatar de Usuario
antoniovillena
Nonamed
Mensajes: 1164
Registrado: Dom Ene 09, 2011 8:55 am

Re: Scrolles

Mensaje por antoniovillena » Mié May 07, 2014 1:35 am

susso escribió:Espera, espera.. Tienes más saltos y más returns. Hay más ciclos.


No, son los mismos ciclos pero te ahorras 3 bytes.

climacus escribió:Vaya tela. La verdad es que me he hecho comodo usando la shadow screen. Pero esto me parece de lo mas interesante. Nunca me habia dado por contar estados...

Muchas gracias. Cacharreare con el asunto.


Gracias zx81 por explicárselo. ¿Qué usas la shadow screen de los modelos 128K?
Imagen

Avatar de Usuario
climacus
Sabreman
Mensajes: 411
Registrado: Mar Ago 25, 2009 1:46 pm

Re: Scrolles

Mensaje por climacus » Mié May 07, 2014 7:39 am

antoniovillena escribió:
susso escribió:Espera, espera.. Tienes más saltos y más returns. Hay más ciclos.


No, son los mismos ciclos pero te ahorras 3 bytes.

climacus escribió:Vaya tela. La verdad es que me he hecho comodo usando la shadow screen. Pero esto me parece de lo mas interesante. Nunca me habia dado por contar estados...

Muchas gracias. Cacharreare con el asunto.


Gracias zx81 por explicárselo. ¿Qué usas la shadow screen de los modelos 128K?


Sí. En todos los juegos que he hecho para 128k uso la shadow screen. Es muy cómodo y aunque tienes menos memoria al ir paginando la pantalla, merece la pena. Lo malo es que te despreocupas demasiado de las cosas importantes de la vida, como una gestión óptima de la pantalla... :)
Todos mis juegos en formato físico
http://www.matranet.net/boutique/zx/zx.php

Avatar de Usuario
climacus
Sabreman
Mensajes: 411
Registrado: Mar Ago 25, 2009 1:46 pm

Re: Scrolles

Mensaje por climacus » Mié May 07, 2014 7:48 am

antoniovillena escribió:
susso escribió:Interesante hilo, por si acaso dejo un link de optimizaciones que de vez en cuando echo una ojeada:
http://wikiti.brandonw.net/index.php?ti ... timization


Interesante. Pero podrían optimizar esto:

Código: Seleccionar todo

foo:
  ld hl, data
  call bar      ; Run routine once
  call bar      ; .. twice
  call bar      ; .. three times
bar:
  ld a, (hl)    ; .. fourth and final time
  inc l
  and $0F
  out (c), a
  ret


Por esto otro:

Código: Seleccionar todo

foo:
  ld hl, data
  call bar1
bar1:
  call bar2
bar2:
  ld a, (hl)
  inc l
  and $0F
  out (c), a
  ret


Esto no optimizaría más?

Código: Seleccionar todo

   ld hl,bar2
   push hl
   push hl
   push hl
   ld hl,data
bar2:
  ld a, (hl)
  inc l
  and $0F
  out (c), a
  ret



Son 43 ciclos (quitando la rutina común) y 6 bytes.
Todos mis juegos en formato físico
http://www.matranet.net/boutique/zx/zx.php

Avatar de Usuario
wilco2009
Freddy Hardest
Mensajes: 543
Registrado: Lun Sep 17, 2012 9:40 am
Ubicación: Valencia

Re: Scrolles

Mensaje por wilco2009 » Mié May 07, 2014 9:31 am

Realmente ingenioso, aunque ilegible.

La única observación es que la pila es 2 bytes más grande que en la solución de antonio que tiene dos calls anidados, y 4 bytes más grande que en la inicial que llama a las subrutinas secuencialmente.

Cierto es que la memoria de la pila es memoria temporal y luego se recupera.

En cuanto a cliclos de ejecución no hay color, aunque a mi me salen 28 ciclos menos en total no 43.

Avatar de Usuario
antoniovillena
Nonamed
Mensajes: 1164
Registrado: Dom Ene 09, 2011 8:55 am

Re: Scrolles

Mensaje por antoniovillena » Mié May 07, 2014 10:18 am

climacus escribió:Sí. En todos los juegos que he hecho para 128k uso la shadow screen. Es muy cómodo y aunque tienes menos memoria al ir paginando la pantalla, merece la pena. Lo malo es que te despreocupas demasiado de las cosas importantes de la vida, como una gestión óptima de la pantalla... :)


Entonces podrías hacer un juego que funcione en ambas máquinas. Si detecta shadow screen pues usa la rutina de shadow screen, si detecta puerto flotante usa lo de la sincronización. Así es como hice el engine FASE.

climacus escribió:Esto no optimizaría más?

Código: Seleccionar todo

   ld hl,bar2
   push hl
   push hl
   push hl
   ld hl,data
bar2:
  ld a, (hl)
  inc l
  and $0F
  out (c), a
  ret



Son 43 ciclos (quitando la rutina común) y 6 bytes.


Sí que optimiza más.

wilco2009 escribió:Realmente ingenioso, aunque ilegible.


Es lo que se suele perder optimizando, la legibilidad.
Imagen

Avatar de Usuario
climacus
Sabreman
Mensajes: 411
Registrado: Mar Ago 25, 2009 1:46 pm

Re: Scrolles

Mensaje por climacus » Mié May 07, 2014 10:25 am

wilco2009 escribió:Realmente ingenioso, aunque ilegible.

La única observación es que la pila es 2 bytes más grande que en la solución de antonio que tiene dos calls anidados, y 4 bytes más grande que en la inicial que llama a las subrutinas secuencialmente.

Cierto es que la memoria de la pila es memoria temporal y luego se recupera.

En cuanto a cliclos de ejecución no hay color, aunque a mi me salen 28 ciclos menos en total no 43.


Bueno, los bytes de la pila están para usarlos :)

Me refería a que el código dura 43 ciclos. Aunque posiblemente esté mal, ya que soy un madero con esto de los ciclos...
Todos mis juegos en formato físico
http://www.matranet.net/boutique/zx/zx.php

Avatar de Usuario
wilco2009
Freddy Hardest
Mensajes: 543
Registrado: Lun Sep 17, 2012 9:40 am
Ubicación: Valencia

Re: Scrolles

Mensaje por wilco2009 » Mié May 07, 2014 11:46 am

Según mis cuentas, la rutina inicial y la de Antonio tardan 191 ciclos en ejecutarse, teniendo en cuenta las tres iteraciones, y la de climacus 163.

Avatar de Usuario
wilco2009
Freddy Hardest
Mensajes: 543
Registrado: Lun Sep 17, 2012 9:40 am
Ubicación: Valencia

Re: Scrolles

Mensaje por wilco2009 » Mié May 07, 2014 11:57 am

Me acabo de dar cuenta que la rutina de climacus no funciona.
Cuando se ejecuta la tercera, y última, iteración, el programa retorna a bar2 y vuelve a ejecutar una cuarta vez la subrutina, llegando al RET sin ningún valor previsible en la pila.

Debería hacerse algo así:

Código: Seleccionar todo

   
   ld hl,exit
   push hl
   ld hl,bar2
   push hl
   push hl
   ld hl,data
bar2:
  ld a, (hl)
  inc l
  and $0F
  out (c), a
  ret
exit:

Avatar de Usuario
antoniovillena
Nonamed
Mensajes: 1164
Registrado: Dom Ene 09, 2011 8:55 am

Re: Scrolles

Mensaje por antoniovillena » Mié May 07, 2014 12:00 pm

En eso consiste, en llamar a la rutina cuatro veces y después ejecutar un RET. La de climacus está bien.
Imagen

Avatar de Usuario
wilco2009
Freddy Hardest
Mensajes: 543
Registrado: Lun Sep 17, 2012 9:40 am
Ubicación: Valencia

Re: Scrolles

Mensaje por wilco2009 » Mié May 07, 2014 12:07 pm

Cierto, disculpad, me había rayado.

Con lo que también tenía mal los ciclos.

231 ciclos en las dos primeras, frente a 193 en la de climacus. Ahorro = 38 ciclos.

Avatar de Usuario
climacus
Sabreman
Mensajes: 411
Registrado: Mar Ago 25, 2009 1:46 pm

Re: Scrolles

Mensaje por climacus » Mié May 07, 2014 2:28 pm

Bueno.
He hecho la rutina de sprites con prerrotados y todo va en principio bien a 50 pfs y pudiendo meter hasta 9 sprites más o menos.

Pero me encuentro con un problema. A ver si alguien me da ideas.

Cuando los sprites están quietos, se ven con claridad, pero cuando se mueven se ven borrosos.
He colgado un .z80 por si alguien lo quiere probar.

El personaje principal se ve claro (no se mueve).

Los que vienen hacia la derecha se ven borrosos y si te mueves a la izquierda mucho más. Lo mismo pasa con los que bajan, que se ven borrosos.
Pero si te mueves a la derecha, los que vienen hacia la derecha se ven claros, ya que no se mueven.

He probado a poner Halts por todos los lados para esperar al barrido de pantalla, pero da lo mismo. De hecho, este fichero lleva un HALT justo antes de volcar la shadow.

El sistema que uso es hacer el scroll , pintar los sprites (obvio) y paginar.

El .z80 está aquí: http://www.consigna.uva.es/6685 y te pide una contraseña que es: SCROLL (con mayúsculas)

Bueno, a ver si se nos ocurre algo
Todos mis juegos en formato físico
http://www.matranet.net/boutique/zx/zx.php

utopian
Manic Miner
Mensajes: 219
Registrado: Jue May 10, 2007 2:28 pm

Re: Scrolles

Mensaje por utopian » Mié May 07, 2014 3:54 pm

Yo no noto nada borroso (Fedora 20, FUSE y Monitor apañao). ¿No será tema de la sincronización entre el emulador y tu pantalla?

Por cierto, pinta genial la rutina, y sobre todo lo de que sea multidireccional hace que la envidia me corroa :lol: :lol:. ¿Cuántos tiles estás usando? Lo digo por si almacenas prerrotadas todas las combinaciones entre tiles, o bien las calculas al vuelo.

Responder

¿Quién está conectado?

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