gbdk-2020 | GameBoy Development Kit |
| download: https://git.y1.nz/archives/gbdk.tar.gz | |
| README | Files | Log | Refs | LICENSE |
gbdk-lib/libc/targets/sm83/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 hl, #rle_cursor
18 ld a, e
19 ld (hl+), a
20 ld a, d
21 ld (hl+), a
22 xor a
23 ld (hl+), a
24 ld (hl), a
25 inc a
26 ret
27
28 _rle_decompress::
29 ld b, a ; b == count
30
31 ld hl, #rle_cursor
32 ld a, (hl+)
33 ld h, (hl)
34 ld l, a ; hl == cursor
35
36 or h
37 ret z ; return 0
38
39 ld a, (rle_counter)
40 or a
41 jr z, 0$
42
43 ld c, a
44 add a
45 ld a, (rle_current)
46 jr c, 2$
47 jr 5$
48 0$:
49 ;; Fetch the run
50 ld a, (hl+)
51 ld c, a
52 ;; Negative means a run
53 add a
54 jr nc, 3$
55 ;; Expanding a run
56 ld a, (hl+)
57 1$:
58 ld (de), a
59 inc de
60
61 dec b
62 jr z, 7$
63 2$:
64 inc c
65 jr nz, 1$
66 jr 0$
67 3$:
68 ;; Zero means end of a block
69 jr z, 6$
70 ;; Expanding a block
71 4$:
72 ld a, (hl+)
73 ld (de), a
74 inc de
75
76 dec b
77 jr z, 7$
78 5$:
79 dec c
80 jr nz, 4$
81 jr 0$
82 6$:
83 ;; save state and exit
84 ld hl, #rle_cursor
85 xor a
86 ld (hl+), a
87 ld (hl), a
88 ret ; return 0
89 7$:
90 ;; save state and exit
91 ld d, h
92 ld e, l
93 ld hl, #rle_current
94 ld (hl-), a
95 ld a, c
96 ld (hl-), a
97 ld a, d
98 ld (hl-), a
99 ld (hl), e
100 ld a, #1
101 ret ; return 1
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.