;============================================================
;tilemap data decompression routine from Sylvan Tale
;
; DATA is stored into RAM, not VRAM. can be modified to do so but have to read from vram.
;
; Hl = address of compressed data
; DE = RAM address to load data into
SylvanTaleTilemapDecompression:
--:
ld c,(hl) ; load control byte
inc hl ;
ld b,$08 ; repeat 8 times
-:
rr c ; evaluate a bit from control byte
jr nc,TD_decomp ; if bit 0 load new pointer
ldi ; (de) = (hl)
inc bc ; restore bc from the ldi
jr + ;
TD_decomp: ; loads new source pointer + count byte
push bc ;
ld c,(hl) ;
inc hl ;
ld b,(hl) ;
inc hl ; bc = (hl)
ld a,c ;
or b ;
jr z,TD_exit ; finish if bc = 0;
push hl ;
ld a,b ;
or $f0 ;
ld h,a ;
ld l,c ;
add hl,de ; hl = de + (bc OR $f000) = new pointer
ld a,b ;
and $f0 ;
rrca ;
rrca ;
rrca ;
rrca ; a = high nibble of b
add a,$03 ;
ld c,a ;
ld b,$00 ; counter = high nibble of b + 3
ldir ; load out previous data
pop hl ; restore pointer
pop bc ;
+
djnz - ;
jr -- ;
TD_exit:
pop bc ;
ret ;