@@ -22,52 +22,87 @@ dzx7t_copy_byte_loop:
2222 ldi ; copy literal byte
2323dzx7t_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
3338dzx7t_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
4252dzx7t_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