aboutsummaryrefslogtreecommitdiff
path: root/tools/rasm/decrunch/dzx0_standard.asm
diff options
context:
space:
mode:
authorJuan J. Martinez <jjm@usebox.net>2022-09-06 07:37:20 +0100
committerJuan J. Martinez <jjm@usebox.net>2022-09-06 07:37:20 +0100
commit30bf0f51335e87812ffeb54e9437f0b6a1514d67 (patch)
tree9c85a2de53b4da69fcfaa84488cc6c12ebd3e5d0 /tools/rasm/decrunch/dzx0_standard.asm
parentd8990284057e6401d0374f439df51879595d804d (diff)
downloadubox-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.asm64
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
+; -----------------------------------------------------------------------------
+
+