From ff22231f8a2f3714df701fd7c12b07915adc15e9 Mon Sep 17 00:00:00 2001 From: Miquel Sabaté Solà Date: Fri, 7 Mar 2025 16:04:42 +0100 Subject: shared: Add utilities for clearing screens MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These are quite mindless, but they are rather useful on simple examples in which we don't care about performance and we just want to show something on the screen. For now this didn't matter much, but on real hardware I was able to reproduce the same glitches as with emulators which randomized memory on both the CPU memory and on the PPU. Hence, just allow some examples to manually reset these regions and avoid silly graphical glitches. Signed-off-by: Miquel Sabaté Solà --- shared/clear.s | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 shared/clear.s (limited to 'shared') diff --git a/shared/clear.s b/shared/clear.s new file mode 100644 index 0000000..a099387 --- /dev/null +++ b/shared/clear.s @@ -0,0 +1,39 @@ +;; Clear the first nametable by resetting it to the default tile ID. This is a +;; rather drastic measure only to be done on examples that don't actually load +;; columns in "clever" ways, but they just want a clean slate. +.macro CLEAR_SCREEN + ldy #$20 + jsr clear_screen_y +.endmacro + +;; Clear the given two nametables. `ONE` and `OTHER` have to be the high byte +;; for each nametable to clear. For example, on an horizontal scrolling game: +;; `CLEAR_SCREENS $20, $24`. +.macro CLEAR_SCREENS ONE, OTHER + ldy #ONE + jsr clear_screen_y + + ldy #OTHER + jsr clear_screen_y +.endmacro + +;; Clear the nametable with the high byte as defined in the `y` register. +.proc clear_screen_y + bit $2002 + + ldx #$FF +@loop: + sty $2006 + stx $2006 + lda #$00 + sta $2007 + + dex + bne @loop + + iny + cpy #$24 + bne @loop + + rts +.endproc -- cgit v1.2.3