mirror of
https://github.com/exoticorn/upkr.git
synced 2026-01-20 11:36:42 +01:00
z80_unpacker: attempt for faster decode_number (+6B, ~1% faster) => not good
archived in comments for future reference
This commit is contained in:
@@ -15,7 +15,7 @@
|
|||||||
;; modifies: all registers except IY, requires 10 bytes of stack space
|
;; modifies: all registers except IY, requires 10 bytes of stack space
|
||||||
;;
|
;;
|
||||||
|
|
||||||
; DEFINE BACKWARDS_UNPACK ; uncomment to build backwards depacker
|
; DEFINE BACKWARDS_UNPACK ; uncomment to build backwards depacker (write_ptr--, upkr_data_ptr--)
|
||||||
; initial IX points at last byte of compressed data
|
; initial IX points at last byte of compressed data
|
||||||
; initial DE' points at last byte of unpacked data
|
; initial DE' points at last byte of unpacked data
|
||||||
|
|
||||||
@@ -140,6 +140,7 @@ unpack:
|
|||||||
push de
|
push de
|
||||||
exx
|
exx
|
||||||
IFNDEF BACKWARDS_UNPACK
|
IFNDEF BACKWARDS_UNPACK
|
||||||
|
; forward unpack (write_ptr++, upkr_data_ptr++)
|
||||||
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
|
||||||
@@ -147,6 +148,7 @@ unpack:
|
|||||||
pop bc ; BC = length
|
pop bc ; BC = length
|
||||||
ldir
|
ldir
|
||||||
ELSE
|
ELSE
|
||||||
|
; backward unpack (write_ptr--, upkr_data_ptr--)
|
||||||
.offset+*: ld hl,0
|
.offset+*: ld hl,0
|
||||||
add hl,de ; HL = write_ptr + offset
|
add hl,de ; HL = write_ptr + offset
|
||||||
pop bc ; BC = length
|
pop bc ; BC = length
|
||||||
@@ -311,6 +313,37 @@ decode_number:
|
|||||||
jr c,.fix_bit_pos ; until stop bit is reached (all bits did land to correct position)
|
jr c,.fix_bit_pos ; until stop bit is reached (all bits did land to correct position)
|
||||||
ret ; return with CF=0 (important for unpack routine)
|
ret ; return with CF=0 (important for unpack routine)
|
||||||
|
|
||||||
|
/*
|
||||||
|
archived: negligibly faster but +6B longer decode_number variant using HL' and BC' to
|
||||||
|
do `number|=(1<<bit_pos);` type of logic in single loop.
|
||||||
|
*/
|
||||||
|
; decode_number:
|
||||||
|
; exx
|
||||||
|
; ld bc,1
|
||||||
|
; ld l,b
|
||||||
|
; ld h,b ; HL = 0
|
||||||
|
; .loop
|
||||||
|
; exx
|
||||||
|
; inc c
|
||||||
|
; call decode_bit
|
||||||
|
; jr nc,.done
|
||||||
|
; inc c
|
||||||
|
; call decode_bit
|
||||||
|
; exx
|
||||||
|
; jr nc,.b0
|
||||||
|
; add hl,bc
|
||||||
|
; .b0:
|
||||||
|
; sla c
|
||||||
|
; rl b
|
||||||
|
; jr .loop
|
||||||
|
; .done:
|
||||||
|
; exx
|
||||||
|
; add hl,bc
|
||||||
|
; push hl
|
||||||
|
; exx
|
||||||
|
; pop de
|
||||||
|
; ret
|
||||||
|
|
||||||
DISPLAY "upkr.unpack total size: ",/D,$-unpack
|
DISPLAY "upkr.unpack total size: ",/D,$-unpack
|
||||||
|
|
||||||
; reserve space for probs array without emitting any machine code (using only EQU)
|
; reserve space for probs array without emitting any machine code (using only EQU)
|
||||||
|
|||||||
Reference in New Issue
Block a user