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

      1 ; GB-Deompress routine
      2 ; Compatible with GBTD
      3 
      4         .include        "global.s"
      5 
      6         .title  "GB Decompress"
      7         .module GBDecompress
      8 
      9         .area _CODE
     10 
     11 _gb_decompress::
     12         ld      h,d
     13         ld      l,e
     14         ld      d,b
     15         ld      e,c
     16 
     17 ; hl = source; de = dest
     18 gb_decompress::
     19         push    de
     20 1$:
     21         ld      a,(hl+) ; load command
     22         or      a
     23         jr      z,9$    ; exit, if last byte
     24         bit     7,a
     25         jr      nz,5$   ; string functions
     26         bit     6,a
     27         jr      nz,3$
     28         ; RLE byte
     29         and     #63     ; calc counter
     30         inc     a
     31         ld      b,a
     32         ld      a,(hl+)
     33 2$:
     34         ld      (de),a
     35         inc     de
     36         dec     b
     37         jr      nz,2$
     38         jr      1$      ; next command
     39 3$:                     ; RLE word
     40         and     #63
     41         inc     a
     42         ld      b,(hl)  ; load word into bc
     43         inc     hl
     44         ld      c,(hl)
     45         inc     hl
     46 4$:
     47         push    af
     48         ld      a,b     ; store word
     49         ld      (de),a
     50         inc     de
     51         ld      a,c
     52         ld      (de),a
     53         inc     de
     54         pop     af
     55         dec     a
     56         jr      nz,4$
     57         jr      1$      ; next command
     58 5$:
     59         bit     6,a
     60         jr      nz,7$
     61         ; string repeat
     62         and     a,#63
     63         inc     a
     64         push    hl
     65         ld      c,(hl)
     66         inc     hl
     67         ld      b,(hl)
     68         ld      h,d
     69         ld      l,e
     70         add     hl,bc
     71         ld      b,a
     72 6$:
     73         ld      a,(hl+)
     74         ld      (de),a
     75         inc     de
     76         dec     b
     77         jr      nz,6$
     78         pop     hl
     79         inc     hl
     80         inc     hl
     81         jr      1$      ; next command
     82 7$:                     ; string copy
     83         and     #63
     84         inc     a
     85         ld      b,a
     86 8$:
     87         ld      a,(hl+)
     88         ld      (de),a
     89         inc     de
     90         dec     b
     91         jr      nz,8$
     92         jr      1$      ; next command
     93 9$:
     94         pop     hl
     95         ld      a, e
     96         sub     l
     97         ld      c, a
     98         ld      a, d
     99         sbc     h
    100         ld      b, a
    101 
    102         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.