git.y1.nz

gbdk-2020

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

commit 4d647100c7970df59d0547a8261304f76244ab75
parent ea41a0a07bfea80806d996b3c79a5b6d6be55a31
Author: Toxa <untoxa@mail.ru>
Date:   Fri,  8 Mar 2024 19:55:21 +0300

SMS/GG: support SHOW_SPRITES/HIDE_SPRITES macros (no hiding midframe)

Diffstat:
Mgbdk-lib/include/sms/sms.h10++++++----
Mgbdk-lib/libc/targets/z80/gg/crt0.s3+++
Mgbdk-lib/libc/targets/z80/sms/crt0.s3+++
Mgbdk-lib/libc/targets/z80/sms_int.s45++++++++++++++++++++++++++++++---------------
4 files changed, 42 insertions(+), 19 deletions(-)

diff --git a/gbdk-lib/include/sms/sms.h b/gbdk-lib/include/sms/sms.h @@ -290,14 +290,14 @@ void refresh_OAM(void); #define HIDE_WIN /** Turns on the sprites layer. - Not yet implemented */ -#define SHOW_SPRITES +#define SHOW_SPRITES \ + (_sprites_OFF = 0) /** Turns off the sprites layer. - Not yet implemented */ -#define HIDE_SPRITES +#define HIDE_SPRITES \ + (_sprites_OFF = 1) /** Sets sprite size to 8x16 pixels, two tiles one above the other. */ @@ -710,6 +710,8 @@ extern volatile uint8_t _shadow_OAM_base; */ extern volatile uint8_t _shadow_OAM_OFF; +extern volatile uint8_t _sprites_OFF; + /** Disable shadow OAM to VRAM copy on each VBlank */ #define DISABLE_VBL_TRANSFER \ diff --git a/gbdk-lib/libc/targets/z80/gg/crt0.s b/gbdk-lib/libc/targets/z80/gg/crt0.s @@ -248,6 +248,8 @@ __shadow_OAM_base:: .ds 0x01 __shadow_OAM_OFF:: .ds 0x01 +__sprites_OFF:: + .ds 0x01 .mode:: .ds 0x01 ; Current mode @@ -269,4 +271,5 @@ __shadow_OAM_OFF:: .db 0 ; _VDP_ATTR_SHIFT .db #>_shadow_OAM ; __shadow_OAM_base .db 0 ; __shadow_OAM_OFF + .db 0 ; __sprites_OFF .db .T_MODE_INOUT ; .mode diff --git a/gbdk-lib/libc/targets/z80/sms/crt0.s b/gbdk-lib/libc/targets/z80/sms/crt0.s @@ -255,6 +255,8 @@ __shadow_OAM_base:: .ds 0x01 __shadow_OAM_OFF:: .ds 0x01 +__sprites_OFF:: + .ds 0x01 .mode:: .ds 0x01 ; Current mode @@ -276,4 +278,5 @@ __shadow_OAM_OFF:: .db 0 ; _VDP_ATTR_SHIFT .db #>_shadow_OAM ; __shadow_OAM_base .db 0 ; __shadow_OAM_OFF + .db 0 ; __sprites_OFF .db .T_MODE_INOUT ; .mode diff --git a/gbdk-lib/libc/targets/z80/sms_int.s b/gbdk-lib/libc/targets/z80/sms_int.s @@ -21,28 +21,26 @@ _INT_ISR:: jp z, 2$ ;; handle VBlank - ld hl, (.sys_time) - inc hl - ld (.sys_time), hl - - ld a, #1 - ld (.vbl_done), a - ;; transfer shadow OAM ld a, (__shadow_OAM_OFF) ; check transfer is OFF or a jp nz, 1$ - ld hl, #__shadow_OAM_base - ld h, (hl) - ld l, a ; a == 0 here - or h - jp z, 1$ ld a, (_shadow_VDP_R5) srl a - ld d, a + ld d, a ; d == high byte of SAT address ld c, #.VDP_CMD - xor a + + ld a, (__sprites_OFF) + or a + jp nz, 4$ + + ld hl, #__shadow_OAM_base + ld h, (hl) + ld l, a + cp h + jp z, 1$ + out (c), a out (c), d dec c ; c == .VDP_DATA @@ -53,7 +51,23 @@ _INT_ISR:: out (c), d dec c ; c == .VDP_DATA call .OUTI128 + jp 1$ +4$: + xor a + out (c), a + out (c), d + dec c ; c == .VDP_DATA + ld a, #0xd0 ; disable sprites + out (c), a 1$: + ;; tick time + ld hl, (.sys_time) + inc hl + ld (.sys_time), hl + + ;; set VBlank done flag + ld a, #1 + ld (.vbl_done), a ;; call user-defined VBlank handlers ld hl, (.VBLANK_HANDLER0) @@ -75,8 +89,9 @@ _INT_ISR:: CALL_HL jp 3$ - ;; handle HBlank 2$: + ;; handle HBlank + ld hl, (.HBLANK_HANDLER0) CALL_HL

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