From 3c773aca8d0f886930e61e13784fb3ec87519c55 Mon Sep 17 00:00:00 2001 From: "Peter Helcmanovsky (Ped)" Date: Fri, 16 Sep 2022 02:50:23 +0200 Subject: [PATCH] z80_unpacker: add performance variant of depacker --- z80_unpacker/unpack.asm | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/z80_unpacker/unpack.asm b/z80_unpacker/unpack.asm index 6dc9097..c788a70 100644 --- a/z80_unpacker/unpack.asm +++ b/z80_unpacker/unpack.asm @@ -15,6 +15,8 @@ ;; modifies: all registers except IY, requires 10 bytes of stack space ;; +; DEFINE UPKR_UNPACK_SPEED ; uncomment to get larger but faster unpack routine + OPT push reset --syntax=abf MODULE upkr @@ -215,6 +217,10 @@ decode_bit: ld d,0 ld e,a ; DE = state_scale ; prob || (256-prob) ld l,d ; H:L = (upkr_state>>8) : 0 + + IFNDEF UPKR_UNPACK_SPEED + ;; looped MUL for minimum unpack size + ld b,8 ; counter .mulLoop: add hl,hl @@ -222,6 +228,19 @@ decode_bit: add hl,de .mul0: djnz .mulLoop ; until HL = state_scale * (upkr_state>>8), also BC becomes (upkr_state & 255) + ELSE + ;;; unrolled MUL for better performance, +25 bytes unpack size + + ld b,d + DUP 8 + add hl,hl + jr nc,000_f + add hl,de +000: + EDUP + + ENDIF + add hl,bc ; HL = state_scale * (upkr_state >> 8) + (upkr_state & 255) pop af ld d,-16 ; D = -prob_offset (-16 0xF0 when bit = 0)