git.y1.nz

gbdk-2020

GameBoy Development Kit
download: https://git.y1.nz/archives/gbdk.tar.gz
README | Files | Log | Refs | LICENSE

commit 5ed7455470c431b0bf1482d6e457dfb3ebb8afcf
parent b48405ad477a3b870d6f8ae6a412385f99b4bc32
Author: Toxa <untoxa@mail.ru>
Date:   Wed,  3 Feb 2021 15:55:36 +0300

GB-Decompress support

Diffstat:
Agbdk-lib/include/gb/gbdecompress.h28++++++++++++++++++++++++++++
Mgbdk-lib/libc/gb/Makefile1+
Agbdk-lib/libc/gb/gb_decompress.s94+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Agbdk-lib/libc/gb/gb_decompress_tiles.s130+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 253 insertions(+), 0 deletions(-)

diff --git a/gbdk-lib/include/gb/gbdecompress.h b/gbdk-lib/include/gb/gbdecompress.h @@ -0,0 +1,27 @@ +// GB-Compress decompressor +// Compatible with GBTD + +#ifndef __GBDECOMPRESS_H_INCLUDE +#define __GBDECOMPRESS_H_INCLUDE + +/** gb-decompress data from sour into dest + */ +void gb_decompress(const unsigned char * sour, unsigned char * dest) __preserves_regs(b, c); + +/** gb-decompress background tiles into VRAM + */ +void gb_decompress_bkg_data(UINT8 first_tile, const unsigned char * sour) __preserves_regs(b, c); + +/** gb-decompress window tiles into VRAM + */ +void gb_decompress_win_data(UINT8 first_tile, const unsigned char * sour) __preserves_regs(b, c); + +/** gb-decompress sprite tiles into VRAM + */ +void gb_decompress_sprite_data(UINT8 first_tile, const unsigned char * sour) __preserves_regs(b, c); + +/** gb-decompress data from sour into dest (VRAM-safe) + */ +void gb_decompress_vram(const unsigned char * sour, unsigned char * dest) __preserves_regs(b, c); + +#endif + diff --git a/gbdk-lib/libc/gb/Makefile b/gbdk-lib/libc/gb/Makefile @@ -30,6 +30,7 @@ ASSRC = cgb.s cpy_data.s \ get_t.s set_t.s init_vram.s \ fill_rect.s fill_rect_bk.s fill_rect_wi.s \ metasprites.s metasprites_flip.s \ + gb_decompress.s gb_decompress_tiles.s \ heap.s \ crt0.s diff --git a/gbdk-lib/libc/gb/gb_decompress.s b/gbdk-lib/libc/gb/gb_decompress.s @@ -0,0 +1,94 @@ +; GB-Deompress routine +; Compatible with GBTD + + .area _CODE + +_gb_decompress:: + lda hl,5(SP) + ld a,(hl-) + ld d,a + ld a,(hl-) + ld e,a + ld a,(hl-) + ld l,(hl) + ld h,a + +; hl = source; de = dest +gb_decompress:: + push bc +1$: + ld a,(hl+) ; load command + or a + jr z,9$ ; exit, if last byte + bit 7,a + jr nz,5$ ; string functions + bit 6,a + jr nz,3$ + ; RLE byte + and #63 ; calc counter + inc a + ld b,a + ld a,(hl+) +2$: + ld (de),a + inc de + dec b + jr nz,2$ + jr 1$ ; next command +3$: ; RLE word + and #63 + inc a + ld b,(hl) ; load word into bc + inc hl + ld c,(hl) + inc hl +4$: + push af + ld a,b ; store word + ld (de),a + inc de + ld a,c + ld (de),a + inc de + pop af + dec a + jr nz,4$ + jr 1$ ; next command +5$: + bit 6,a + jr nz,7$ + ; string repeat + and a,#63 + inc a + push hl + ld c,(hl) + inc hl + ld b,(hl) + ld h,d + ld l,e + add hl,bc + ld b,a +6$: + ld a,(hl+) + ld (de),a + inc de + dec b + jr nz,6$ + pop hl + inc hl + inc hl + jr 1$ ; next command +7$: ; string copy + and #63 + inc a + ld b,a +8$: + ld a,(hl+) + ld (de),a + inc de + dec b + jr nz,8$ + jr 1$ ; next command +9$: + pop bc + ret diff --git a/gbdk-lib/libc/gb/gb_decompress_tiles.s b/gbdk-lib/libc/gb/gb_decompress_tiles.s @@ -0,0 +1,130 @@ + .include "global.s" + +; GB-Decompress tiledata directly to VRAM +; Compatible with GBTD + + .area _CODE + +_gb_decompress_vram:: + lda hl,5(SP) + ld a,(hl-) + ld d,a + ld a,(hl-) + ld e,a + ld a,(hl-) + ld l,(hl) + ld h,a + jr gb_decompress_vram + +_gb_decompress_bkg_data:: +_gb_decompress_win_data:: + ld d, #0x90 + ldh a, (.LCDC) + bit 4, a + jr z, .load_params +_gb_decompress_sprite_data:: + ld d, #0x80 + +.load_params: + ldhl sp, #2 + ld a, (hl+) + + ; Compute dest ptr + swap a ; *16 (size of a tile) + ld e, a + and #0x0F ; Get high bits + add d ; Add base offset of target tile "block" + ld d, a + ld a, e + and #0xF0 ; Get low bits only + ld e, a + + ld a, (hl+) + ld h, (hl) + ld l, a + +; hl = source; de = dest +gb_decompress_vram:: + push bc +1$: + ld a,(hl+) ; load command + or a + jr z,9$ ; exit, if last byte + bit 7,a + jr nz,5$ ; string functions + bit 6,a + jr nz,3$ + ; RLE byte + and #63 ; calc counter + inc a + ld b,a +2$: + WAIT_STAT + ld a,(hl) + ld (de),a + inc de + dec b + jr nz,2$ + inc hl + jr 1$ ; next command +3$: ; RLE word + and #63 + inc a + ld b,(hl) ; load word into bc + inc hl + ld c,(hl) + inc hl +4$: + push af + WAIT_STAT + ld a,b ; store word + ld (de),a + inc de + WAIT_STAT + ld a,c + ld (de),a + inc de + pop af + dec a + jr nz,4$ + jr 1$ ; next command +5$: + bit 6,a + jr nz,7$ + ; string repeat + and a,#63 + inc a + push hl + ld c,(hl) + inc hl + ld b,(hl) + ld h,d + ld l,e + add hl,bc + ld b,a +6$: + WAIT_STAT + ld a,(hl+) + ld (de),a + inc de + dec b + jr nz,6$ + pop hl + inc hl + inc hl + jr 1$ ; next command +7$: ; string copy + and #63 + inc a + ld b,a +8$: + WAIT_STAT + ld a,(hl+) + ld (de),a + inc de + dec b + jr nz,8$ + jr 1$ ; next command +9$: + pop bc + 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.