git.y1.nz

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.