git.y1.nz

gbdk-2020

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

commit 2d32eedb6e7b0eede529838d8cb1515ddfff7a2e
parent d2a4c10458d479e547843b34cdbc574474393bae
Author: Toxa <untoxa@mail.ru>
Date:   Tue, 17 Dec 2024 22:39:10 +0300

SMS/GG: Improve metasprite clipping by Y, change coordinate type to signed int16

Diffstat:
Mgbdk-lib/include/sms/metasprites.h18+++++++++---------
Mgbdk-lib/libc/targets/z80/sms_metasprites.s38+++++++++++++++++++++++++-------------
Mgbdk-lib/libc/targets/z80/sms_metasprites_flip.s36++++++++++++++++++++++++++----------
3 files changed, 60 insertions(+), 32 deletions(-)

diff --git a/gbdk-lib/include/sms/metasprites.h b/gbdk-lib/include/sms/metasprites.h @@ -45,10 +45,10 @@ extern uint8_t __current_base_tile; extern uint8_t __render_shadow_OAM; -static uint8_t __move_metasprite(uint8_t id, uint16_t x, uint16_t y); -static uint8_t __move_metasprite_flipx(uint8_t id, uint16_t x, uint16_t y); -static uint8_t __move_metasprite_flipy(uint8_t id, uint16_t x, uint16_t y); -static uint8_t __move_metasprite_flipxy(uint8_t id, uint16_t x, uint16_t y); +static uint8_t __move_metasprite(uint8_t id, int16_t x, int16_t y); +static uint8_t __move_metasprite_flipx(uint8_t id, int16_t x, int16_t y); +static uint8_t __move_metasprite_flipy(uint8_t id, int16_t x, int16_t y); +static uint8_t __move_metasprite_flipxy(uint8_t id, int16_t x, int16_t y); static void __hide_metasprite(uint8_t id) Z88DK_FASTCALL PRESERVES_REGS(iyh, iyl); /** @@ -78,7 +78,7 @@ void hide_sprites_range(uint8_t from, uint8_t to) PRESERVES_REGS(iyh, iyl); @return Number of hardware sprites used to draw this metasprite */ -inline uint8_t move_metasprite_ex(const metasprite_t * metasprite, uint8_t base_tile, uint8_t base_prop, uint8_t base_sprite, uint16_t x, uint16_t y) { +inline uint8_t move_metasprite_ex(const metasprite_t * metasprite, uint8_t base_tile, uint8_t base_prop, uint8_t base_sprite, int16_t x, int16_t y) { base_prop; __current_metasprite = metasprite; __current_base_tile = base_tile; @@ -87,7 +87,7 @@ inline uint8_t move_metasprite_ex(const metasprite_t * metasprite, uint8_t base_ /** Obsolete. This function has been replaced by move_metasprite_ex() */ -inline uint8_t move_metasprite(const metasprite_t * metasprite, uint8_t base_tile, uint8_t base_sprite, uint16_t x, uint16_t y) { +inline uint8_t move_metasprite(const metasprite_t * metasprite, uint8_t base_tile, uint8_t base_sprite, int16_t x, int16_t y) { __current_metasprite = metasprite; __current_base_tile = base_tile; return __move_metasprite(base_sprite, x, y); @@ -115,7 +115,7 @@ inline uint8_t move_metasprite(const metasprite_t * metasprite, uint8_t base_til @see move_metasprite() */ -inline uint8_t move_metasprite_flipx(const metasprite_t * metasprite, uint8_t base_tile, uint8_t base_prop, uint8_t base_sprite, uint16_t x, uint16_t y) { +inline uint8_t move_metasprite_flipx(const metasprite_t * metasprite, uint8_t base_tile, uint8_t base_prop, uint8_t base_sprite, int16_t x, int16_t y) { base_prop; __current_metasprite = metasprite; __current_base_tile = base_tile; @@ -144,7 +144,7 @@ inline uint8_t move_metasprite_flipx(const metasprite_t * metasprite, uint8_t ba @see move_metasprite() */ -inline uint8_t move_metasprite_flipy(const metasprite_t * metasprite, uint8_t base_tile, uint8_t base_prop, uint8_t base_sprite, uint16_t x, uint16_t y) { +inline uint8_t move_metasprite_flipy(const metasprite_t * metasprite, uint8_t base_tile, uint8_t base_prop, uint8_t base_sprite, int16_t x, int16_t y) { base_prop; __current_metasprite = metasprite; __current_base_tile = base_tile; @@ -173,7 +173,7 @@ inline uint8_t move_metasprite_flipy(const metasprite_t * metasprite, uint8_t ba @see move_metasprite() */ -inline uint8_t move_metasprite_flipxy(const metasprite_t * metasprite, uint8_t base_tile, uint8_t base_prop, uint8_t base_sprite, uint16_t x, uint16_t y) { +inline uint8_t move_metasprite_flipxy(const metasprite_t * metasprite, uint8_t base_tile, uint8_t base_prop, uint8_t base_sprite, int16_t x, int16_t y) { base_prop; __current_metasprite = metasprite; __current_base_tile = base_tile; diff --git a/gbdk-lib/libc/targets/z80/sms_metasprites.s b/gbdk-lib/libc/targets/z80/sms_metasprites.s @@ -21,7 +21,7 @@ ___render_shadow_OAM:: .area _CODE -; uint8_t __move_metasprite(uint8_t id, uint16_t x, uint16_t y); +; uint8_t __move_metasprite(uint8_t id, int16_t x, int16_t y); ; a == id ; de == x ; (sp+2) == y @@ -29,7 +29,7 @@ ___move_metasprite:: ld iyl, a pop hl - pop bc + pop bc ; de = x, bc = y push hl push af @@ -44,15 +44,30 @@ ___move_metasprite:: cp #0x80 jp z, 2$ + add a, a + sbc a, a + ld h, a + ld l, 0(ix) inc ix - - add c - ld c, a - cp #0xD0 - jp z, 3$ - - ld 0(iy), a - + add hl, bc + ld b, h + ld c, l + + ld a, #0x20 + add l + ld l, a + adc h + sub l + jp nz, 5$ + ld a, l + cp #(0x20 + 0xC0) + jp c, 6$ +5$: + ld 0(iy), #0xC0 + jp 7$ +6$: + ld 0(iy), c +7$: ld a, 0(ix) ; dx add a, a sbc a, a @@ -82,14 +97,11 @@ ___move_metasprite:: ld iyl, a jp 1$ -3$: - inc ix 4$: ld 0(iy), #0xC0 inc ix inc iyl jp 1$ - 2$: pop ix pop bc diff --git a/gbdk-lib/libc/targets/z80/sms_metasprites_flip.s b/gbdk-lib/libc/targets/z80/sms_metasprites_flip.s @@ -32,15 +32,34 @@ .ifne neg_dy neg ; apply flipy (or no-op) .endif + add a, a + sbc a, a + ld h, a + ld a, 0(ix) +.ifne neg_dy + neg ; apply flipy (or no-op) +.endif + ld l, a inc ix + add hl, bc + ld b, h + ld c, l - add c - ld c, a - cp #0xD0 - jp z, 3$ - - ld 0(iy), a - + ld a, #0x20 + add l + ld l, a + adc h + sub l + jp nz, 5$ + ld a, l + cp #(0x20 + 0xC0) + jp c, 6$ +5$: + ld 0(iy), #0xC0 + jp 7$ +6$: + ld 0(iy), c +7$: ld a, 0(ix) ; dx .ifne neg_dx neg ; apply flipx (or no-op) @@ -77,14 +96,11 @@ ld iyl, a jp 1$ -3$: - inc ix 4$: ld 0(iy), #0xC0 inc ix inc iyl jp 1$ - 2$: pop ix pop bc

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