Voy a suponer que todo lo anterior es corresto, y me pongo al lío.
Primero voy a crear una rutinilla que me dibuje un fondo, p.ej. líneas diagonales:
Código: Seleccionar todo
ORG $8000
start:
di
ld a, INK_BLACK
out (254), a
ld a, BRIGHT_ON + PAPER_BLACK + INK_WHITE
call cls
ld b, 0
ld hl, VRAM_ADDR + 0x0000 ; primer tercio
call fondo
ld hl, VRAM_ADDR + 0x0800 ; segundo tercio
call fondo
ld hl, VRAM_ADDR + 0x1000 ; tercer tercio
call fondo
jarl: jr jarl
fondo:
push hl
ld (hl), %00000001
inc h
ld (hl), %00000010
inc h
ld (hl), %00000100
inc h
ld (hl), %00001000
inc h
ld (hl), %00010000
inc h
ld (hl), %00100000
inc h
ld (hl), %01000000
inc h
ld (hl), %10000000
inc h
pop hl
inc l
djnz fondo
ret
Esto me genera el siguiente fondo:

A continuación voy a plantar encima un sprite de 32x32 píxeles. De momento lo coloco sin utilizar ningún mezclador de píxeles con el fondo. La rutina sería así:
Código: Seleccionar todo
;sprite 4x4
ld b, 32
ld de, mariposa ; puntero al bitmap
ld hl, VRAM_ADDR+500
spr01:
ld a, (de)
ld (hl), a
inc de
inc l
ld a, (de)
ld (hl), a
inc de
inc l
ld a, (de)
ld (hl), a
inc de
inc l
ld a, (de)
ld (hl), a
inc de
dec l
dec l
dec l
call calc_next_vram
djnz spr01
(la rutina calc_next_vram se vio en este hilo:
viewtopic.php?t=8372 )
Y se vería así:

Lóxicamente al no haber ningún mezclador, los píxeles "transparentes" del sprite borran el fondo. Así es como trabaja el NIRVANA, y esto hace que no sea un buen motor gráfico cuando tienes un fondo de pantalla, pero si quieres multicolor es una absoluta virguería, oiga.
Bueno, nosotros vamos a añadir un mezclador para conservar el fondo. Cuando el sprite tiene zonas a dibujar en un color, y zonas transparentes hay que usar el mezclador "OR". Si el sprite tuviera 2 zonas de color más el transparente, entonces habría que recurrir a la tésnica MASK, uséase, usar máscaras de sprites, y esto lo intentaré en otra ocasión. De momento vamos a ver cómo se implementaría el mezclador "OR":
Código: Seleccionar todo
;sprite 4x4
ld b, 32
ld de, mariposa ; puntero al bitmap
ld hl, VRAM_ADDR+500
spr01:
ld a, (hl)
ld c, a
ld a, (de)
or c
ld (hl), a
inc de
inc l
ld a, (hl)
ld c, a
ld a, (de)
or c
ld (hl), a
inc de
inc l
ld a, (hl)
ld c, a
ld a, (de)
or c
ld (hl), a
inc de
inc l
ld a, (hl)
ld c, a
ld a, (de)
or c
ld (hl), a
inc de
dec l
dec l
dec l
call calc_next_vram
djnz spr01
Obsérvese que lo único que hago es obtener el fondo con ld a, (hl), retenerlo en c, obtener el sprite coon ld a, (de), y mezclarlos con or c. Se vería así:

Se ve de escándalo.
Hasta aquí todo de lujo cuando se trata de imprimir una imagen estática sobre un fondo. Ya no habría que hacer más. PERO, ¿qué pasa cuando la imagen estática hay que moverla, lo que viene siendo un sprite? Si el sprite hay que pintarlo encima del anterior, podemos utilizar esta misma rutina. El poblema viene cuando hay que imprimir el sprite en otra posición. Lógicamente primero tendremos que restaurar el fondo que había antes de que pintáramos el primer sprite.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!