z80_unpacker: probs context-size for offset/length numbers as EQU

This commit is contained in:
Peter Helcmanovsky (Ped)
2022-09-14 19:53:50 +02:00
parent 540a91d1ba
commit a75a35efb2

View File

@@ -18,6 +18,9 @@
OPT push reset --syntax=abf OPT push reset --syntax=abf
MODULE upkr MODULE upkr
NUMBER_BITS EQU 16+15 ; context-bits per offset/length (16+15 for 16bit offsets/pointers)
; numbers (offsets/lengths) are encoded like: 1a1b1c1d1e0 = 0000'0000'001e'dbca
/* /*
u8* upkr_data_ptr; u8* upkr_data_ptr;
u8 upkr_probs[1 + 255 + 1 + 2*32 + 2*32]; u8 upkr_probs[1 + 255 + 1 + 2*32 + 2*32];
@@ -112,8 +115,8 @@ unpack:
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
inc c inc c ; context_index to first "number" set for offsets decoding (257)
call decode_length call decode_number
dec de ; offset = upkr_decode_length(257) - 1; dec de ; offset = upkr_decode_length(257) - 1;
ld a,d ld a,d
or e or e
@@ -126,14 +129,14 @@ unpack:
; ++write_ptr; ; ++write_ptr;
; } ; }
; prev_was_match = 1; ; prev_was_match = 1;
ld c,low(257+64) ; context_index = 257+64 ld c,low(257 + NUMBER_BITS) ; context_index to second "number" set for lengths decoding
call decode_length ; length = upkr_decode_length(257 + 64); call decode_number ; length = upkr_decode_length(257 + 64);
push de push de
exx exx
ld h,d ; DE = write_ptr ld h,d ; DE = write_ptr
ld l,e ld l,e
.offset+*: ld bc,0 .offset+*: ld bc,0
sbc hl,bc ; CF=0 from decode_length ; HL = write_ptr - offset sbc hl,bc ; CF=0 from decode_number ; HL = write_ptr - offset
pop bc ; BC = length pop bc ; BC = length
ldir ldir
exx exx
@@ -258,7 +261,7 @@ int upkr_decode_length(int context_index) {
return length | (1 << bit_pos); return length | (1 << bit_pos);
} }
*/ */
decode_length: decode_number:
; HL = upkr_state ; HL = upkr_state
; IX = upkr_data_ptr ; IX = upkr_data_ptr
; BC = probs+context_index ; BC = probs+context_index
@@ -291,7 +294,7 @@ decode_length:
ENDIF ENDIF
probs: EQU ($+255) & -$100 ; probs array aligned to 256 probs: EQU ($+255) & -$100 ; probs array aligned to 256
.real_c: EQU 1 + 255 + 1 + 2*32 + 2*32 ; real size of probs array .real_c: EQU 1 + 255 + 1 + 2*NUMBER_BITS ; real size of probs array
.c: EQU (.real_c + 1) & -2 ; padding to even size (required by init code) .c: EQU (.real_c + 1) & -2 ; padding to even size (required by init code)
.e: EQU probs + .c .e: EQU probs + .c