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/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.