mirror of
https://github.com/exoticorn/upkr.git
synced 2026-01-20 11:36:42 +01:00
z80_unpacker: optimisations: -1B in unpack implementation = 182B
This commit is contained in:
@@ -84,8 +84,8 @@ unpack:
|
|||||||
; BC = probs (context_index 0), state HL = 0, A' = 0x80 (no source bits left in upkr_current_byte)
|
; BC = probs (context_index 0), state HL = 0, A' = 0x80 (no source bits left in upkr_current_byte)
|
||||||
|
|
||||||
; ** main loop to decompress data
|
; ** main loop to decompress data
|
||||||
.decompress_data_reset_match:
|
; D = prev_was_match = uninitialised, literal is expected first => will reset D to "false"
|
||||||
ld d,0 ; prev_was_match = 0;
|
; values for false/true of prev_was_match are: false = high(probs), true = 1 + high(probs)
|
||||||
.decompress_data:
|
.decompress_data:
|
||||||
ld c,0
|
ld c,0
|
||||||
call decode_bit ; if(upkr_decode_bit(0))
|
call decode_bit ; if(upkr_decode_bit(0))
|
||||||
@@ -102,16 +102,17 @@ unpack:
|
|||||||
ld (de),a ; *write_ptr++ = byte;
|
ld (de),a ; *write_ptr++ = byte;
|
||||||
inc de
|
inc de
|
||||||
exx
|
exx
|
||||||
jr .decompress_data_reset_match
|
ld d,b ; prev_was_match = false
|
||||||
|
jr .decompress_data
|
||||||
|
|
||||||
; * copy chunk of already decompressed data (match)
|
; * copy chunk of already decompressed data (match)
|
||||||
.copy_chunk:
|
.copy_chunk:
|
||||||
|
ld a,b
|
||||||
inc b ; context_index = 256
|
inc b ; context_index = 256
|
||||||
; if(prev_was_match || upkr_decode_bit(256)) {
|
; if(prev_was_match || upkr_decode_bit(256)) {
|
||||||
; offset = upkr_decode_length(257) - 1;
|
; offset = upkr_decode_length(257) - 1;
|
||||||
; if (0 == offset) break;
|
; if (0 == offset) break;
|
||||||
; }
|
; }
|
||||||
xor a
|
|
||||||
cp d ; CF = prev_was_match
|
cp d ; CF = prev_was_match
|
||||||
call nc,decode_bit ; if not prev_was_match, then upkr_decode_bit(256)
|
call nc,decode_bit ; if not prev_was_match, then upkr_decode_bit(256)
|
||||||
jr nc,.keep_offset ; if neither, keep old offset
|
jr nc,.keep_offset ; if neither, keep old offset
|
||||||
@@ -140,7 +141,7 @@ unpack:
|
|||||||
pop bc ; BC = length
|
pop bc ; BC = length
|
||||||
ldir
|
ldir
|
||||||
exx
|
exx
|
||||||
ld d,b ; prev_was_match = non-zero
|
ld d,b ; prev_was_match = true
|
||||||
djnz .decompress_data ; adjust context_index back to 0..255 range, go to main loop
|
djnz .decompress_data ; adjust context_index back to 0..255 range, go to main loop
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user