; hl = source
; de = dest
decompress:
ex de,hl
ld c,4 ; 4 bitplanes
_OuterLoop:
push hl
_Loop:
ld a,(de) ; get byte
or a ; if zero, it is either RLE or the end of the bitplane
jr z,_RLE
inc a ; if $ff, write the following byte twice
jr z,_WriteNextByteTwice
dec a ; else write the byte itself
_WriteByteIncrementBothAndLoop:
call WriteAToVRAMAtHL
inc hl
inc hl
inc hl
inc hl
_IncrementSrcAndLoop:
inc de ; move to next byte and repeat
jr _Loop
_WriteNextByteTwice:
inc de ; get next byte
ld a,(de)
call WriteAToVRAMAtHL ; write it to VRAM
inc hl ; skip bitplane
inc hl
inc hl
inc hl
jr _WriteByteIncrementBothAndLoop ; then write it again and loop
_RLE:
inc de ; get next byte = RLE count
ld a,(de)
inc de
or a ; if it is 0, it is actually the end of the bitplane
jr z,_EndOfBitplane
ld b,a ; output the next byte repeatedly
ld a,(de)
-:call WriteAToVRAMAtHL
inc hl
inc hl
inc hl
inc hl
djnz -
jr _IncrementSrcAndLoop ; move to next byte and repeat
_EndOfBitplane:
pop hl ; move original dest pointer on by 1
inc hl
dec c ; loop 4 times for 4 bitplanes
jr nz,_OuterLoop
ret ; done