git.y1.nz

gbdk-2020

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

commit 33030947181f59382fdbd2c234dd8281b25897a7
parent 79bd1341eb732a25cade2c2b1bdf3094392997fe
Author: Michel Iwaniec <46843052+michel-iwaniec@users.noreply.github.com>
Date:   Mon, 24 Mar 2025 00:35:02 +0000

NES: Reduce zeropage usage by merging flag for oam validity and forced blanking to one byte (#753)


Diffstat:
Mgbdk-lib/libc/targets/mos6502/nes/crt0.s27+++++++++++++++------------
Mgbdk-lib/libc/targets/mos6502/nes/global.s4++++
Mgbdk-lib/libc/targets/mos6502/nes/set_data.s4++--
Mgbdk-lib/libc/targets/mos6502/nes/set_native_data.s4++--
Mgbdk-lib/libc/targets/mos6502/nes/vram_transfer_buffer.s20++++++++++----------
5 files changed, 33 insertions(+), 26 deletions(-)

diff --git a/gbdk-lib/libc/targets/mos6502/nes/crt0.s b/gbdk-lib/libc/targets/mos6502/nes/crt0.s @@ -66,12 +66,11 @@ __current_bank:: .ds 1 _sys_time:: .ds 2 _shadow_PPUCTRL:: .ds 1 _shadow_PPUMASK:: .ds 1 -__crt0_spritePageValid: .ds 1 _bkg_scroll_x:: .ds 1 _bkg_scroll_y:: .ds 1 _attribute_row_dirty:: .ds 1 _attribute_column_dirty:: .ds 1 -.crt0_forced_blanking:: .ds 1 +__oam_valid_display_on:: .ds 1 __SYSTEM:: .ds 1 __hblank_writes_index: .ds 1 @@ -134,7 +133,7 @@ ProcessDrawList_DoOneTransfer: ; .bndry 0x100 (skip alignment as previous alignment means page-cross won't happen) __crt0_doSpriteDMA: - bit *__crt0_spritePageValid + bit *__oam_valid_display_on bpl __crt0_doSpriteDMA_spritePageInvalid lda #0 ; +2 sta OAMADDR ; +4 @@ -542,8 +541,9 @@ _wait_vbl_done_waitForNextFrame: sty *__hblank_writes_index ; Enable OAM DMA in next NMI - sec - ror *__crt0_spritePageValid + lda *__oam_valid_display_on + ora #OAM_VALID_MASK + sta *__oam_valid_display_on ; Restore shadow registers pla sta *_bkg_scroll_y @@ -560,8 +560,9 @@ _wait_vbl_done_waitForNextFrame_loop: beq _wait_vbl_done_waitForNextFrame_loop ; Disable OAM DMA in next NMI - clc - ror *__crt0_spritePageValid + lda *__oam_valid_display_on + and #~OAM_VALID_MASK + sta *__oam_valid_display_on rts @@ -594,8 +595,9 @@ _display_off:: sta *_shadow_PPUMASK sta PPUMASK ; Set forced blanking bit - sec - ror *.crt0_forced_blanking + lda *__oam_valid_display_on + ora #DISPLAY_OFF_MASK + sta *__oam_valid_display_on rts .display_on:: @@ -604,8 +606,9 @@ _display_on:: ora #(PPUMASK_SHOW_BG | PPUMASK_SHOW_SPR) sta *_shadow_PPUMASK ; Clear forced blanking bit - clc - ror *.crt0_forced_blanking + lda *__oam_valid_display_on + and #~DISPLAY_OFF_MASK + sta *__oam_valid_display_on rts __crt0_RESET: @@ -669,7 +672,7 @@ __crt0_RESET_bankSwitchValue: lda #(PPUMASK_SHOW_BG | PPUMASK_SHOW_SPR | PPUMASK_SHOW_BG_LC | PPUMASK_SHOW_SPR_LC) sta *_shadow_PPUMASK lda #0x80 - sta *__crt0_spritePageValid + sta *__oam_valid_display_on ; enable NMI lda #(PPUCTRL_NMI | PPUCTRL_SPR_CHR) sta *_shadow_PPUCTRL diff --git a/gbdk-lib/libc/targets/mos6502/nes/global.s b/gbdk-lib/libc/targets/mos6502/nes/global.s @@ -8,6 +8,10 @@ ;; Number of 8-cycles available each frame for transfer buffer VRAM_DELAY_CYCLES_X8 = 171 + ; Bits for quick checking of OAM validity and display ON/OFF + OAM_VALID_MASK = 0x80 + DISPLAY_OFF_MASK = 0x40 + ;; Keypad .UP = 0x08 .DOWN = 0x04 diff --git a/gbdk-lib/libc/targets/mos6502/nes/set_data.s b/gbdk-lib/libc/targets/mos6502/nes/set_data.s @@ -42,8 +42,8 @@ _set_sprite_data:: rol asl *.ppu_addr_lo rol - bit *.crt0_forced_blanking - bpl .copy_tiles_indirect + bit *__oam_valid_display_on + bvc .copy_tiles_indirect ; Direct write sta PPUADDR lda *.ppu_addr_lo diff --git a/gbdk-lib/libc/targets/mos6502/nes/set_native_data.s b/gbdk-lib/libc/targets/mos6502/nes/set_native_data.s @@ -43,8 +43,8 @@ _set_sprite_native_data:: rol asl *.ppu_addr_lo rol - bit *.crt0_forced_blanking - bpl .copy_tiles_indirect + bit *__oam_valid_display_on + bvc .copy_tiles_indirect ; Direct write sta PPUADDR lda *.ppu_addr_lo diff --git a/gbdk-lib/libc/targets/mos6502/nes/vram_transfer_buffer.s b/gbdk-lib/libc/targets/mos6502/nes/vram_transfer_buffer.s @@ -69,8 +69,8 @@ __vram_transfer_buffer_pos_old:: .ds 1 ; .ppu_stripe_begin_horizontal:: clc - bit *.crt0_forced_blanking - bpl .ppu_stripe_begin_indirect + bit *__oam_valid_display_on + bvc .ppu_stripe_begin_indirect ; Direct write stx PPUADDR sta PPUADDR @@ -86,8 +86,8 @@ __vram_transfer_buffer_pos_old:: .ds 1 ; .ppu_stripe_begin_vertical:: sec - bit *.crt0_forced_blanking - bpl .ppu_stripe_begin_indirect + bit *__oam_valid_display_on + bvc .ppu_stripe_begin_indirect ; Direct write stx PPUADDR sta PPUADDR @@ -142,8 +142,8 @@ __vram_transfer_buffer_pos_old:: .ds 1 ; End a stripe (be it direct or via transfer buffer) ; .ppu_stripe_end:: - bit *.crt0_forced_blanking - bpl 1$ + bit *__oam_valid_display_on + bvc 1$ ; For direct writes there's nothing more to do rts 1$: @@ -175,8 +175,8 @@ __vram_transfer_buffer_pos_old:: .ds 1 ; Writes a byte of an in-progress horizontal / vertical stripe (be it direct or via transfer buffer) ; .ppu_stripe_write_byte:: - bit *.crt0_forced_blanking - bpl 1$ + bit *__oam_valid_display_on + bvc 1$ sta PPUDATA ; Direct write rts 1$: @@ -208,8 +208,8 @@ _set_vram_byte:: .ppu_stripe_append:: .define ppu_addr ".tmp" ; - bit *.crt0_forced_blanking - bpl .ppu_stripe_append_indirect + bit *__oam_valid_display_on + bvc .ppu_stripe_append_indirect ; Direct write stx PPUADDR sta PPUADDR

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