diff options
author | Juan J. Martinez <jjm@usebox.net> | 2022-09-06 07:37:20 +0100 |
---|---|---|
committer | Juan J. Martinez <jjm@usebox.net> | 2022-09-06 07:37:20 +0100 |
commit | 30bf0f51335e87812ffeb54e9437f0b6a1514d67 (patch) | |
tree | 9c85a2de53b4da69fcfaa84488cc6c12ebd3e5d0 /tools/rasm/decrunch/dzx0_standard.asm | |
parent | d8990284057e6401d0374f439df51879595d804d (diff) | |
download | ubox-msx-lib-30bf0f51335e87812ffeb54e9437f0b6a1514d67.tar.gz ubox-msx-lib-30bf0f51335e87812ffeb54e9437f0b6a1514d67.zip |
Updated rasm to 1.7
Diffstat (limited to 'tools/rasm/decrunch/dzx0_standard.asm')
-rw-r--r-- | tools/rasm/decrunch/dzx0_standard.asm | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/tools/rasm/decrunch/dzx0_standard.asm b/tools/rasm/decrunch/dzx0_standard.asm new file mode 100644 index 0000000..6525c8b --- /dev/null +++ b/tools/rasm/decrunch/dzx0_standard.asm @@ -0,0 +1,64 @@ +; ----------------------------------------------------------------------------- +; ZX0 decoder by Einar Saukas & Urusergi +; "Standard" version (68 bytes only) +; ----------------------------------------------------------------------------- +; Parameters: +; HL: source address (compressed data) +; DE: destination address (decompressing) +; ----------------------------------------------------------------------------- + +macro dzx0_standard + ld bc, $ffff ; preserve default offset 1 + push bc + inc bc + ld a, $80 +@dzx0s_literals: + call @dzx0s_elias ; obtain length + ldir ; copy literals + add a, a ; copy from last offset or new offset? + jr c, @dzx0s_new_offset + call @dzx0s_elias ; obtain length +@dzx0s_copy: + ex (sp), hl ; preserve source, restore offset + push hl ; preserve offset + add hl, de ; calculate destination - offset + ldir ; copy from offset + pop hl ; restore offset + ex (sp), hl ; preserve offset, restore source + add a, a ; copy from literals or new offset? + jr nc, @dzx0s_literals +@dzx0s_new_offset: + pop bc ; discard last offset + ld c, $fe ; prepare negative offset + call @dzx0s_elias_loop ; obtain offset MSB + inc c + ret z ; check end marker + ld b, c + ld c, (hl) ; obtain offset LSB + inc hl + rr b ; last offset bit becomes first length bit + rr c + push bc ; preserve new offset + ld bc, 1 ; obtain length + call nc, @dzx0s_elias_backtrack + inc bc + jr @dzx0s_copy +@dzx0s_elias: + inc c ; interlaced Elias gamma coding +@dzx0s_elias_loop: + add a, a + jr nz, @dzx0s_elias_skip + ld a, (hl) ; load another group of 8 bits + inc hl + rla +@dzx0s_elias_skip: + ret c +@dzx0s_elias_backtrack: + add a, a + rl c + rl b + jr @dzx0s_elias_loop +mend +; ----------------------------------------------------------------------------- + + |