git.y1.nz

gbdk-2020

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

commit 7c992c8ea5f0b09805e1e4de972538d6f354c7ab
parent 7290a6aaea0a9ec7c5bc8deeae81a73687a79928
Author: Toxa <untoxa@mail.ru>
Date:   Sat, 28 Jan 2023 15:34:29 +0300

GB: refactor metasprites

Diffstat:
Mgbdk-lib/examples/cross-platform/metasprites/src/metasprites.c1+
Mgbdk-lib/include/gb/metasprites.h34+++++++++++++++++-----------------
Mgbdk-lib/libc/targets/sm83/metasprites.s59++++++++++++++++++++++++++++-------------------------------
Mgbdk-lib/libc/targets/sm83/metasprites_flip.s157++++++++++++++++++++++++++++++++++++-------------------------------------------
Mgbdk-lib/libc/targets/sm83/metasprites_hide.s4+---
Mgbdk-lib/libc/targets/sm83/metasprites_hide_spr.s13++++++-------
6 files changed, 125 insertions(+), 143 deletions(-)

diff --git a/gbdk-lib/examples/cross-platform/metasprites/src/metasprites.c b/gbdk-lib/examples/cross-platform/metasprites/src/metasprites.c @@ -158,6 +158,7 @@ void main(void) { DISPLAY_OFF; #if defined(GAMEBOY) + cgb_compatibility(); set_sprite_palette(OAMF_CGB_PAL0, 1, gray_pal); set_sprite_palette(OAMF_CGB_PAL1, 1, pink_pal); set_sprite_palette(OAMF_CGB_PAL2, 1, cyan_pal); diff --git a/gbdk-lib/include/gb/metasprites.h b/gbdk-lib/include/gb/metasprites.h @@ -100,14 +100,14 @@ extern uint8_t __current_base_prop; extern uint8_t __render_shadow_OAM; -static uint8_t __move_metasprite(uint8_t id, uint8_t x, uint8_t y) OLDCALL; -static uint8_t __move_metasprite_flipx(uint8_t id, uint8_t x, uint8_t y) OLDCALL; -static uint8_t __move_metasprite_flipy(uint8_t id, uint8_t x, uint8_t y) OLDCALL; -static uint8_t __move_metasprite_flipxy(uint8_t id, uint8_t x, uint8_t y) OLDCALL; -static uint8_t __move_metasprite_vflip(uint8_t id, uint8_t x, uint8_t y) OLDCALL; -static uint8_t __move_metasprite_hflip(uint8_t id, uint8_t x, uint8_t y) OLDCALL; -static uint8_t __move_metasprite_hvflip(uint8_t id, uint8_t x, uint8_t y) OLDCALL; -static void __hide_metasprite(uint8_t id) OLDCALL; +static uint8_t __move_metasprite(uint8_t id, uint16_t yx); +static uint8_t __move_metasprite_flipx(uint8_t id, uint16_t yx); +static uint8_t __move_metasprite_flipy(uint8_t id, uint16_t yx); +static uint8_t __move_metasprite_flipxy(uint8_t id, uint16_t yx); +static uint8_t __move_metasprite_vflip(uint8_t id, uint16_t yx); +static uint8_t __move_metasprite_hflip(uint8_t id, uint16_t yx); +static uint8_t __move_metasprite_hvflip(uint8_t id, uint16_t yx); +static void __hide_metasprite(uint8_t id); /** Hides all hardware sprites in range from <= X < to @@ -116,7 +116,7 @@ static void __hide_metasprite(uint8_t id) OLDCALL; @see hide_sprite */ -void hide_sprites_range(UINT8 from, UINT8 to) OLDCALL PRESERVES_REGS(b, c); +void hide_sprites_range(UINT8 from, UINT8 to); /** Moves metasprite to the absolute position x and y @@ -144,7 +144,7 @@ inline uint8_t move_metasprite_ex(const metasprite_t * metasprite, uint8_t base_ __current_metasprite = metasprite; __current_base_tile = base_tile; __current_base_prop = base_prop; - return __move_metasprite(base_sprite, x, y); + return __move_metasprite(base_sprite, (y << 8) | (uint8_t)x); } /** Obsolete @@ -153,7 +153,7 @@ inline uint8_t move_metasprite(const metasprite_t * metasprite, uint8_t base_til __current_metasprite = metasprite; __current_base_tile = base_tile; __current_base_prop = 0; - return __move_metasprite(base_sprite, x, y); + return __move_metasprite(base_sprite, (y << 8) | (uint8_t)x); } /** Moves metasprite to the absolute position x and y, __flipped by X__ @@ -183,7 +183,7 @@ inline uint8_t move_metasprite_flipx(const metasprite_t * metasprite, uint8_t ba __current_metasprite = metasprite; __current_base_tile = base_tile; __current_base_prop = base_prop; - return __move_metasprite_flipx(base_sprite, x - 8, y); + return __move_metasprite_flipx(base_sprite, (y << 8) | (uint8_t)(x - 8u)); } /** Obsolete @@ -192,7 +192,7 @@ inline uint8_t move_metasprite_vflip(const metasprite_t * metasprite, uint8_t ba __current_metasprite = metasprite; __current_base_tile = base_tile; __current_base_prop = 0; - return __move_metasprite_vflip(base_sprite, x - 8, y); + return __move_metasprite_vflip(base_sprite, (y << 8) | (uint8_t)(x - 8u)); } @@ -223,7 +223,7 @@ inline uint8_t move_metasprite_flipy(const metasprite_t * metasprite, uint8_t ba __current_metasprite = metasprite; __current_base_tile = base_tile; __current_base_prop = base_prop; - return __move_metasprite_flipy(base_sprite, x, y - ((LCDC_REG & 0x04U) ? 16 : 8) ); + return __move_metasprite_flipy(base_sprite, ((y - ((LCDC_REG & LCDCF_OBJ16) ? 16u : 8u)) << 8) | x); } /** Obsolete @@ -232,7 +232,7 @@ inline uint8_t move_metasprite_hflip(const metasprite_t * metasprite, uint8_t ba __current_metasprite = metasprite; __current_base_tile = base_tile; __current_base_prop = 0; - return __move_metasprite_hflip(base_sprite, x, y - ((LCDC_REG & 0x04U) ? 16 : 8) ); + return __move_metasprite_hflip(base_sprite, ((y - ((LCDC_REG & LCDCF_OBJ16) ? 16u : 8u)) << 8) | x); } /** Moves metasprite to the absolute position x and y, __flipped by X and Y__ @@ -262,7 +262,7 @@ inline uint8_t move_metasprite_flipxy(const metasprite_t * metasprite, uint8_t b __current_metasprite = metasprite; __current_base_tile = base_tile; __current_base_prop = base_prop; - return __move_metasprite_flipxy(base_sprite, x - 8, y - ((LCDC_REG & 0x04U) ? 16 : 8)); + return __move_metasprite_flipxy(base_sprite, ((y - ((LCDC_REG & LCDCF_OBJ16) ? 16u : 8u)) << 8) | (uint8_t)(x - 8)); } /** Obsolete @@ -271,7 +271,7 @@ inline uint8_t move_metasprite_hvflip(const metasprite_t * metasprite, uint8_t b __current_metasprite = metasprite; __current_base_tile = base_tile; __current_base_prop = 0; - return __move_metasprite_hvflip(base_sprite, x - 8, y - ((LCDC_REG & 0x04U) ? 16 : 8)); + return __move_metasprite_hvflip(base_sprite, ((y - ((LCDC_REG & LCDCF_OBJ16) ? 16u : 8u)) << 8) | (uint8_t)(x - 8)); } /** Hides a metasprite from the screen diff --git a/gbdk-lib/libc/targets/sm83/metasprites.s b/gbdk-lib/libc/targets/sm83/metasprites.s @@ -5,7 +5,7 @@ .area _DATA -___current_metasprite:: +___current_metasprite:: .ds 0x02 ___current_base_tile:: .ds 0x01 @@ -15,27 +15,26 @@ ___current_base_prop:: .area _INITIALIZED ___render_shadow_OAM:: .ds 0x01 - + .area _INITIALIZER .db #>_shadow_OAM .area _CODE -; uint8_t __move_metasprite(uint8_t id, uint8_t x, uint8_t y) +; uint8_t __move_metasprite(uint8_t id, uint16_t yx) +; a: id +; de: yx ___move_metasprite:: - ldhl sp, #4 - ld a, (hl-) - ld b, a - ld a, (hl-) - ld c, a - ld a, (hl) cp #40 - jr nc, 3$ - + jr c, 0$ + xor a + ret +0$: + push af add a add a - ld e, a + ld c, a ld hl, #___current_metasprite ld a, (hl+) @@ -43,44 +42,42 @@ ___move_metasprite:: ld l, a ld a, (___render_shadow_OAM) - ld d, a + ld b, a 1$: ld a, (hl+) ; dy cp #0x80 jr z, 2$ - add b - ld b, a - ld (de), a - inc e + add d + ld d, a + ld (bc), a + inc c ld a, (hl+) ; dx - add c - ld c, a - ld (de), a - inc e + add e + ld e, a + ld (bc), a + inc c ld a, (___current_base_tile) add (hl) ; tile inc hl - ld (de), a - inc e + ld (bc), a + inc c ld a, (___current_base_prop) add (hl) ; props inc hl - ld (de), a - inc e + ld (bc), a + inc c - ld a, e + ld a, c cp #160 jr c, 1$ 2$: - ld a, e + ld a, c srl a srl a - ldhl sp, #2 -3$: - sub (hl) - ld e, a + pop de + sub d ret diff --git a/gbdk-lib/libc/targets/sm83/metasprites_flip.s b/gbdk-lib/libc/targets/sm83/metasprites_flip.s @@ -9,22 +9,21 @@ .area _CODE -; uint8_t __move_metasprite(uint8_t id, uint8_t x, uint8_t y) +; uint8_t __move_metasprite(uint8_t id, uint16_t yx) +; a: id +; de: yx ___move_metasprite_flipy:: ___move_metasprite_hflip:: - ldhl sp, #4 - ld a, (hl-) - ld b, a - ld a, (hl-) - ld c, a - ld a, (hl) cp #40 - jr nc, 3$ - + jr c, 0$ + xor a + ret +0$: + push af add a add a - ld e, a + ld c, a ld hl, #___current_metasprite ld a, (hl+) @@ -32,65 +31,60 @@ ___move_metasprite_hflip:: ld l, a ld a, (___render_shadow_OAM) - ld d, a + ld b, a 1$: ld a, (hl+) cp #0x80 jr z, 2$ cpl inc a - add b - ld b, a - ld (de), a - inc e + add d + ld d, a + ld (bc), a + inc c ld a, (hl+) ; dx - add c - ld c, a - ld (de), a - inc e + add e + ld e, a + ld (bc), a + inc c ld a, (___current_base_tile) add (hl) ; tile inc hl - ld (de), a - inc e + ld (bc), a + inc c ld a, (___current_base_prop) add (hl) ; props inc hl xor #0x40 - ld (de), a - inc e + ld (bc), a + inc c - ld a, e + ld a, c cp #160 jr c, 1$ 2$: - ld a, e + ld a, c srl a srl a - ldhl sp, #2 -3$: - sub (hl) - ld e, a + pop de + sub d ret ___move_metasprite_flipx:: ___move_metasprite_vflip:: - ldhl sp, #4 - ld a, (hl-) - ld b, a - ld a, (hl-) - ld c, a - ld a, (hl) cp #40 - jr nc, 3$ - + jr c, 0$ + xor a + ret +0$: + push af add a add a - ld e, a + ld c, a ld hl, #___current_metasprite ld a, (hl+) @@ -98,65 +92,60 @@ ___move_metasprite_vflip:: ld l, a ld a, (___render_shadow_OAM) - ld d, a + ld b, a 1$: ld a, (hl+) ; dy cp #0x80 jr z, 2$ - add b - ld b, a - ld (de), a - inc e + add d + ld d, a + ld (bc), a + inc c ld a, (hl+) ; dx cpl inc a - add c - ld c, a - ld (de), a - inc e + add e + ld e, a + ld (bc), a + inc c ld a, (___current_base_tile) add (hl) ; tile inc hl - ld (de), a - inc e + ld (bc), a + inc c ld a, (___current_base_prop) add (hl) ; props inc hl xor #0x20 - ld (de), a - inc e + ld (bc), a + inc c - ld a, e + ld a, c cp #160 jr c, 1$ 2$: - ld a, e + ld a, c srl a srl a - ldhl sp, #2 -3$: - sub (hl) - ld e, a + pop de + sub d ret ___move_metasprite_flipxy:: ___move_metasprite_hvflip:: - ldhl sp, #4 - ld a, (hl-) - ld b, a - ld a, (hl-) - ld c, a - ld a, (hl) cp #40 - jr nc, 3$ - + jr c, 0$ + xor a + ret +0$: + push af add a add a - ld e, a + ld c, a ld hl, #___current_metasprite ld a, (hl+) @@ -164,49 +153,47 @@ ___move_metasprite_hvflip:: ld l, a ld a, (___render_shadow_OAM) - ld d, a + ld b, a 1$: ld a, (hl+) cp #0x80 jr z, 2$ cpl inc a - add b - ld b, a - ld (de), a - inc e + add d + ld d, a + ld (bc), a + inc c ld a, (hl+) ; dx cpl inc a - add c - ld c, a - ld (de), a - inc e + add e + ld e, a + ld (bc), a + inc c ld a, (___current_base_tile) add (hl) ; tile inc hl - ld (de), a - inc e + ld (bc), a + inc c ld a, (___current_base_prop) add (hl) ; props inc hl xor #0x60 - ld (de), a - inc e + ld (bc), a + inc c - ld a, e + ld a, c cp #160 jr c, 1$ 2$: - ld a, e + ld a, c srl a srl a - ldhl sp, #2 -3$: - sub (hl) - ld e, a + pop de + sub d ret diff --git a/gbdk-lib/libc/targets/sm83/metasprites_hide.s b/gbdk-lib/libc/targets/sm83/metasprites_hide.s @@ -11,11 +11,9 @@ ; void __hide_metasprite(uint8_t id) ___hide_metasprite:: - ldhl sp, #2 - ld a, (hl) cp #40 ret nc - + add a add a ld e, a diff --git a/gbdk-lib/libc/targets/sm83/metasprites_hide_spr.s b/gbdk-lib/libc/targets/sm83/metasprites_hide_spr.s @@ -10,25 +10,24 @@ ; void hide_sprites_range(UINT8 from, UINT8 to) _hide_sprites_range:: - ldhl sp, #2 - ld a, (hl+) - cp #40 ret nc + ld d, a + add a add a - ld e, a + ld c, a - ld a, (hl-) - sub (hl) + ld a, e + sub d ret c ret z ld hl, #___render_shadow_OAM ld h, (hl) - ld l, e + ld l, c ld de, #4

This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.