Sprites en el modo radastaniano del ZX Uno

Soporte técnico sobre los lanzamientos de MojonTwins y comentarios sobre los güegos. Ofrecemos soporte técnico con Fourspriter, te ayudamos con ZX Basic o Z88DK, te damos pistas some cómo saltarse un bicho y cosas así.

Moderador: na_th_an

Avatar de Usuario
radastan
Mensajes: 692
Registrado: Vie, 20 Ago 2010, 12:54
Contactar:

Sprites en el modo radastaniano del ZX Uno

Mensajepor radastan » Dom, 18 Ene 2015, 00:34

Veamos, estoy en ese punto en el que uno no sabe si se ha vuelto majareta. Al adaptar mi rutina de Sprites al ZX Uno consigo imprimir sólo las primeras líneas pero no las siguientes de cada sprite. En concreto falla cuando tengo que incrementar el registro D para que apunte al siguiente cuarteto de líneas (van de 4 en 4 en el registro E, ya que cada línea tiene 64 bytes o 128 pixels).

Os dejo la rutina por si alguien encuentra el fallo:

Código: Seleccionar todo

// ___________________________________________
// Posiciona un Sprite de 8x8 a color
// ___________________________________________

void put_sprite_x8 (unsigned char *posicion, unsigned int x, unsigned int y)
{
   // -------------------------------------------
   // RUTINA DE IMPRESION DE UN SPRITE 8x8 PIXELS
   // EN CUALQUIER POSICION DE BYTES (cada byte dos pixels horizontales)
   // ENTRADAS:
   // D será la posición del cursor vertical en pixels
   // E será la posición del cursor horizontal en parejas de pixels
   // HL es la posición de memoria donde tenemos el sprite
   // SALIDAS: se escribe en el mapa de pantalla
   // ADVERTENCIAS: no comprueba límites de pantalla
   // -------------------------------------------
   #asm
      ld hl,2      ; Pasamos la variable de entrada al acumulador
      add hl,sp
      ld d, (hl)   ; D es el valor Y
      inc hl
      inc hl
      ld e, (hl)   ; E es el valor X
      inc hl
      inc hl
      ld a, (hl)
          inc hl
          ld h, (hl)
          ld l, a      ; HL es el puntero al sprite
   
      ld a, d      ; recuperamos el valor vertical
      rrca
           rrca      ; rotamos para dejar su valor en múltiplos de 64 (linea, de dos en dos pixels)
      and 192      ; borramos el resto de bits por si las moscas
      or e      ; sumamos el valor horizontal
      ld e, a      ; e preparado
      ld a, d      ; cargamos el valor vertical
      rrca
      rrca      ; rotamos para quedarnos con los bits altos
      and 63      ; borramos el resto de bits
      or 64      ; nos posicionamos a partir de 16384 (16384=64+0 en dos bytes)
      ld d, a      ; d preparado, ya tenemos la posición en pantalla
   
      ld b,0
      ld c,8      ; Indicamos que vamos a pintar 8 líneas
      .draw      ; dibujamos 8 pixels (4 bytes)
      push de      ; guardamos DE (la posición de pantalla)
      push bc      ; Guardamos las iteraciones (8 líneas)
      ldi
      ldi
      ldi
      ldi
      pop bc      ; recuperamos el número de iteraciones
      pop de      ; recuperamos DE
      ld a,e
      add a,64   ; incrementamos una línea
      ld e,a
      jr nc, sigue
      inc d      ; incrementamos D si sale acarrero al incrementar E en 64 bytes
      .sigue
      dec c      ; decrementamos ********* AQUI DEBE ESTAR EL PROBLEMA **********
      jr nc, draw
   
      ret
   
   #endasm
}


Mañana le daré otro tiento, a ver que puñetas pasa.
antoniovillena
Mensajes: 494
Registrado: Jue, 24 Oct 2013, 15:52

Re: Sprites en el modo radastaniano del ZX Uno

Mensajepor antoniovillena » Dom, 18 Ene 2015, 00:50

El problema está en el salto condicional después del "dec c". Debe ser jr nz en lugar de jr nc.
antoniovillena
Mensajes: 494
Registrado: Jue, 24 Oct 2013, 15:52

Re: Sprites en el modo radastaniano del ZX Uno

Mensajepor antoniovillena » Dom, 18 Ene 2015, 00:56

Los push y pop dentro del bucle hacen que vaya muy lento. Prueba a poner algo así, verás cómo se acelera.

Código: Seleccionar todo

        ld      b, 8      ; Indicamos que vamos a pintar 8 líneas
.draw                     ; dibujamos 8 pixels (4 bytes)
        ld      c, 4      ; Indicamos que vamos a pintar 8 píxeles
        ldi
        ldi
        ldi
        ldi
        ld      a, e
        add     a, 60     ; incrementamos una línea
        ld      e, a
        jr      nc, sigue
        inc     d         ; incrementamos D si sale acarrero al incrementar E en 60 bytes
.sigue
        djnz    draw
Avatar de Usuario
radastan
Mensajes: 692
Registrado: Vie, 20 Ago 2010, 12:54
Contactar:

Re: Sprites en el modo radastaniano del ZX Uno

Mensajepor radastan » Dom, 18 Ene 2015, 01:38

Esto me pasa por programar a deshoras... Gracias!

:ymca:
Avatar de Usuario
Metalbrain
Mensajes: 9
Registrado: Mié, 21 May 2014, 21:19

Re: Sprites en el modo radastaniano del ZX Uno

Mensajepor Metalbrain » Lun, 19 Ene 2015, 17:26

antoniovillena escribió:

Código: Seleccionar todo

        ld      b, 8      ; Indicamos que vamos a pintar 8 líneas
.draw                     ; dibujamos 8 pixels (4 bytes)
        ld      c, 4      ; Indicamos que vamos a pintar 8 píxeles
        ldi
        ldi
        ldi
        ldi
        ld      a, e
        add     a, 60     ; incrementamos una línea
        ld      e, a
        jr      nc, sigue
        inc     d         ; incrementamos D si sale acarrero al incrementar E en 60 bytes
.sigue
        djnz    draw


Hmmm... no he podido resistirme:

Código: Seleccionar todo

        ld      b, 8      ; Indicamos que vamos a pintar 8 líneas
.draw                     ; dibujamos 8 pixels (4 bytes)
        ld      c, 64      ; Indicamos que vamos a pintar 8 píxeles
        ldi
        ldi
        ldi
        ldi
        ld      a, e
        add     a, c     ; incrementamos una línea
        ld      e, a
        jr      nc, sigue
        inc     d         ; incrementamos D si sale acarrero al incrementar E en 60 bytes
.sigue
        djnz    draw
antoniovillena
Mensajes: 494
Registrado: Jue, 24 Oct 2013, 15:52

Re: Sprites en el modo radastaniano del ZX Uno

Mensajepor antoniovillena » Lun, 19 Ene 2015, 17:43

Bien visto. Yo pensé en otra optimización pero no la puse para no liar a radastan. La pongo junto con otra que se me ha ocurrido ahora (y la tuya).

Código: Seleccionar todo

        ld      b, 8      ; Indicamos que vamos a pintar 8 líneas
        ld      a, e
.draw                     ; dibujamos 8 pixels (4 bytes)
        ld      c, 64     ; Indicamos que vamos a pintar 8 píxeles
        ldi
        ldi
        ldi
        ldi
        add     a, c      ; incrementamos una línea
        ld      e, a
        jr      c, sigue2
.sigue
        djnz    draw
        ret
sigue2
        inc     d         ; incrementamos D si sale acarrero al incrementar E en 60 bytes
        djnz    draw
        ret
Avatar de Usuario
Metalbrain
Mensajes: 9
Registrado: Mié, 21 May 2014, 21:19

Re: Sprites en el modo radastaniano del ZX Uno

Mensajepor Metalbrain » Lun, 19 Ene 2015, 19:42

Lo de sacar ld a,e del bucle creo que no funciona bien... LDI afecta a DE, pero no a A, así que en la suma le estás sumando 60 al valor inicial, no al actual. Y si cambias C por 68 para que se sumen 64, tienes el problema de que si los LDI aumentan el valor de D, este se incrementará 2 veces.
antoniovillena
Mensajes: 494
Registrado: Jue, 24 Oct 2013, 15:52

Mensajepor antoniovillena » Lun, 19 Ene 2015, 20:00

Sí, hay que cambiar la constante a 68. Pero creo que funcionará porque para que ldi aumente d el sprite debe estar justo en el borde.
Avatar de Usuario
radastan
Mensajes: 692
Registrado: Vie, 20 Ago 2010, 12:54
Contactar:

Re: Sprites en el modo radastaniano del ZX Uno

Mensajepor radastan » Mar, 20 Ene 2015, 17:46

Gracias por las anotaciones, serán tomadas en cuenta.

Ya si me la modificáis para que se pueda usar una máscara de bits mejor todavía, yo hasta dentro de unas semanas no tendré tiempo.
Avatar de Usuario
iforeve
Mensajes: 731
Registrado: Vie, 09 Ene 2009, 19:49

Re: Sprites en el modo radastaniano del ZX Uno

Mensajepor iforeve » Mar, 20 Ene 2015, 18:54

Metalbrain escribió:
Hmmm... no he podido resistirme:



Es lo que se entiende como el "ansia viva". :lol: :lol: :lol:

Volver a “Ayuda”

¿Quién está conectado?

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