Skip to content

Commit 573d738

Browse files
committed
optimized zx7
1 parent 249db4c commit 573d738

1 file changed

Lines changed: 52 additions & 17 deletions

File tree

src/ce/zx7.src

Lines changed: 52 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,52 +22,87 @@ dzx7t_copy_byte_loop:
2222
ldi ; copy literal byte
2323
dzx7t_main_loop:
2424
add a, a ; check next bit
25-
call z, dzx7t_load_bits ; no more bits left?
25+
jr nz, dzx7t_copy_byte_has_bits
26+
; dzx7t_load_bits
27+
ld a, (hl)
28+
inc hl
29+
rla
30+
dzx7t_copy_byte_has_bits:
2631
jr nc, dzx7t_copy_byte_loop ; next bit indicates either literal or sequence
2732

2833
; determine number of bits used for length (Elias gamma coding)
2934

3035
push de
31-
ld de, 0
36+
ld de, $FF00
3237
ld bc, 1
3338
dzx7t_len_size_loop:
34-
inc d
3539
add a, a ; check next bit
36-
call z, dzx7t_load_bits ; no more bits left?
40+
jr nz, dzx7t_len_size_has_bits
41+
; dzx7t_load_bits
42+
ld a, (hl)
43+
inc hl
44+
rla
45+
dzx7t_len_size_has_bits:
46+
inc d
3747
jr nc, dzx7t_len_size_loop
38-
jr dzx7t_len_value_start
48+
jr z, dzx7t_len_value_start
3949

4050
; determine length
4151

4252
dzx7t_len_value_loop:
4353
add a, a ; check next bit
44-
call z, dzx7t_load_bits ; no more bits left?
54+
jr nz, dzx7t_len_value_has_bits
55+
; dzx7t_load_bits
56+
ld a, (hl)
57+
inc hl
58+
rla
59+
dzx7t_len_value_has_bits:
4560
rl c
4661
rl b
4762
jr c, dzx7t_exit ; check end marker
48-
dzx7t_len_value_start:
4963
dec d
5064
jr nz, dzx7t_len_value_loop
65+
scf
66+
dzx7t_len_value_start:
5167
inc bc ; adjust length
5268

5369
; determine offset
5470

5571
ld e, (hl) ; load offset flag (1 bit) + offset value (7 bits)
5672
inc hl
57-
sla e
58-
inc e
73+
rl e ; sll e since carry is set
5974
jr nc, dzx7t_offset_end ; if offset flag is set, load 4 extra bits
6075
add a, a ; check next bit
61-
call z, dzx7t_load_bits ; no more bits left?
76+
jr nz, dzx7t_has_bits_1
77+
; dzx7t_load_bits
78+
ld a, (hl)
79+
inc hl
80+
rla
81+
dzx7t_has_bits_1:
6282
rl d ; insert first bit into D
6383
add a, a ; check next bit
64-
call z, dzx7t_load_bits ; no more bits left?
84+
jr nz, dzx7t_has_bits_2
85+
; dzx7t_load_bits
86+
ld a, (hl)
87+
inc hl
88+
rla
89+
dzx7t_has_bits_2:
6590
rl d ; insert second bit into D
6691
add a, a ; check next bit
67-
call z, dzx7t_load_bits ; no more bits left?
92+
jr nz, dzx7t_has_bits_3
93+
; dzx7t_load_bits
94+
ld a, (hl)
95+
inc hl
96+
rla
97+
dzx7t_has_bits_3:
6898
rl d ; insert third bit into D
6999
add a, a ; check next bit
70-
call z, dzx7t_load_bits ; no more bits left?
100+
jr nz, dzx7t_has_bits_4
101+
; dzx7t_load_bits
102+
ld a, (hl)
103+
inc hl
104+
rla
105+
dzx7t_has_bits_4:
71106
ccf
72107
jr c, dzx7t_offset_end
73108
inc d ; equivalent to adding 128 to DE
@@ -85,8 +120,8 @@ dzx7t_exit:
85120
pop hl ; restore source address (compressed data)
86121
jr nc, dzx7t_main_loop
87122

88-
dzx7t_load_bits:
89-
ld a, (hl) ; load another group of 8 bits
90-
inc hl
91-
rla
123+
; dzx7t_load_bits:
124+
; ld a, (hl) ; load another group of 8 bits
125+
; inc hl
126+
; rla
92127
ret

0 commit comments

Comments
 (0)