gbdk-2020 | GameBoy Development Kit |
| download: https://git.y1.nz/archives/gbdk.tar.gz | |
| README | Files | Log | Refs | LICENSE |
gbdk-lib/libc/targets/z80/rle_decompress.s
1 .include "global.s"
2
3 .module RLE_DECOMPRESS
4
5 .area _DATA
6
7 rle_cursor:
8 .ds 0x02
9 rle_counter:
10 .ds 0x01
11 rle_current:
12 .ds 0x01
13
14 .area _CODE
15
16 _rle_init::
17 ld (rle_cursor), hl
18 xor a
19 ld hl, #rle_counter
20 ld (hl), a
21 inc hl
22 ld (hl), a
23 ld l, #1
24 ret
25
26 _rle_decompress::
27 ;; Pop the return address
28 pop hl
29 pop de
30 dec sp
31 ex (sp), hl
32 ld b, h
33
34 ld hl, (rle_cursor)
35
36 ld a, l
37 or h
38 ret z
39
40 ld a, (rle_counter)
41 or a
42 ld c, a
43 jr z, 1$
44
45 ld a, (rle_current)
46 bit 7, c
47 jr nz, 7$
48 jp 8$
49 1$:
50 ;; Fetch the run
51 ld c, (hl)
52 inc hl
53
54 ;; Negative means a run
55 bit 7, c
56 jr z, 2$
57 ;; Expanding a run
58 ld a, (hl)
59 inc hl
60 3$:
61 ld (de), a
62 inc de
63
64 dec b
65 jr z, 6$
66 7$:
67 inc c
68 jp NZ, 3$
69 jp 1$
70 2$:
71 ;; Zero means end of a block
72 inc c
73 dec c
74 jr z, 4$
75 ;; Expanding a block
76 5$:
77 ldi
78 inc bc
79
80 dec b
81 jr z, 6$
82 8$:
83 dec c
84 jp NZ, 5$
85 jp 1$
86 4$:
87 ;; save state and exit
88 ld hl, #0
89 ld (rle_cursor), hl
90 ld (rle_counter), hl
91 ret
92 6$:
93 ;; save state and exit
94 ld (rle_cursor), hl
95 ld hl, #rle_counter
96 ld (hl), c
97 inc hl
98 ld (hl), a
99 ld l, #1
100 ret
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.