Autor Tema: changecolors.asm  (Leído 2477 veces)

0 Usuarios y 1 Visitante están viendo este tema.

SapphiRe

  • Visitante
changecolors.asm
« en: 24 de Abril de 2006, 03:42:44 pm »
Hi again!

  Imagine you have a ram buffer filled with 4bit color data (screen 1,2 or 3) and you want to replace white color for grey, light green for dark green... (for instance to simulate a darkening of the image).

Código: [Seleccionar]
          xor a          ; a =0
@@LOOP:   rrd            ; Rotate nibbles a -> [hl] -> a
          ld e,a         ; Lower byte of the color change table
          ld a,[de]      ; Paper color substitution
          rrd            ; Rotate nibbles a -> [hl] -> a
          ld e,a         ; Lower byte of the color change table
          ld a,[de]      ; Ink color substitution
          rrd            ; Rotate nibbles a -> [hl] -> a
          cpi            ; Inc HL, Dec BC
          jp pe,@@LOOP   ; If BC <> 0 then goto @@LOOP
          ret            ; Return

RRD rotates a 12 bits number (4 lower bits of A and 8 bits of [HL]) 4 bits to the right. RRL do the same to the left. Both are standard and documented Z80 instructions.

Usage of the routine:

HL -> Buffer address
DE -> Change color table address (lower byte MUST be zero! This speeds up a lot the routine)
BC -> Buffer length

  The change color table is a 16 bytes area containing the destination color for each source color. For instance, the table:

Código: [Seleccionar]
.db 0,1,2,3,4,5,6,7,8,9,10,11,12,13,15,14
just exchange white and grey colors. Surely you can find more interesting uses for this little piece of code.

Regards
--
SapphiRe
« Última modificación: 24 de Abril de 2006, 04:05:15 pm por SapphiRe »