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.