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:
$this->bbcode_second_pass_code('', '
// ___________________________________________
// 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.
Sprites en el modo radastaniano del ZX Uno
Moderador: na_th_an
-
- Mensajes: 494
- Registrado: Jue, 24 Oct 2013, 15:52
Re: Sprites en el modo radastaniano del ZX Uno
El problema está en el salto condicional después del "dec c". Debe ser jr nz en lugar de jr nc.
-
- Mensajes: 494
- Registrado: Jue, 24 Oct 2013, 15:52
Re: Sprites en el modo radastaniano del ZX Uno
Los push y pop dentro del bucle hacen que vaya muy lento. Prueba a poner algo así, verás cómo se acelera.
$this->bbcode_second_pass_code('', '
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
')
$this->bbcode_second_pass_code('', '
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
')
Re: Sprites en el modo radastaniano del ZX Uno
Esto me pasa por programar a deshoras... Gracias!
- Metalbrain
- Mensajes: 9
- Registrado: Mié, 21 May 2014, 21:19
Re: Sprites en el modo radastaniano del ZX Uno
$this->bbcode_second_pass_quote('antoniovillena', '
')$this->bbcode_second_pass_code('', '
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
')
')$this->bbcode_second_pass_code('', '
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:
$this->bbcode_second_pass_code('', '
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
')