From bc70a2447830145fb67ec50450b649846d1b5362 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Mon, 6 Oct 2014 03:16:09 -0400 Subject: cleanups and comments --- test.s | 74 +++++++++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 44 insertions(+), 30 deletions(-) diff --git a/test.s b/test.s index bee2fea..35ce3d4 100644 --- a/test.s +++ b/test.s @@ -25,22 +25,35 @@ sprite_y DB .bank 0 .org $0000 +; the ppu takes two frames to initialize, so we have some time to do whatever +; initialization of our own that we want to while we wait. we choose here to +; set up cpu flags in the first frame and clear out system ram in the second +; frame (clearing out ram isn't at all necessary, but we can't do anything +; useful at this point anyway, so we may as well in order to make things more +; predictable). clearing out system ram actually takes quite a bit longer than +; a frame (a frame is ~2273 cycles, or ~324-1136 opcodes), but we may as well +; start the process while we wait. RESET: - SEI ; disable IRQs - CLD ; disable decimal mode + SEI ; disable IRQs + CLD ; disable decimal mode LDX #$40 - STX $4017.W ; disable APU frame IRQ + STX $4017.w ; disable APU frame IRQ LDX #$FF - TXS ; Set up stack - INX ; now X = 0 - STX $2000.W ; disable NMI - STX $2001.W ; disable rendering - STX $4010.W ; disable DMC IRQs + TXS ; Set up stack (grows down from $FF to $00, at $0100-$01FF) + INX ; now X = 0 + STX $2000.w ; disable NMI (we'll enable it later once the ppu is ready) + STX $2001.w ; disable rendering (same) + STX $4010.w ; disable DMC IRQs vblankwait1: ; First wait for vblank to make sure PPU is ready - BIT $2002 - BPL vblankwait1 - + BIT $2002 ; bit 7 of $2002 is reset once vblank ends + BPL vblankwait1 ; and bit 7 is what is checked by BPL + + ; set everything in ram ($0000-$07FF) to $00, except for $0200-$02FF which + ; is conventionally used to hold sprite attribute data. we set that range + ; to $FE, since that value as a position moves the sprites offscreen, and + ; when the sprites are offscreen, it doesn't matter which sprites are + ; selected or what their attributes are clrmem: LDA #$00 STA $0000, x @@ -51,28 +64,10 @@ clrmem: STA $0600, x STA $0700, x LDA #$FE - STA $0200, x ;move all sprites off screen + STA $0200, x INX BNE clrmem -vblankwait2: ; Second wait for vblank, PPU is ready after this - BIT $2002 - BPL vblankwait2 - -LoadPalettes: - LDA $2002 ; read PPU status to reset the high/low latch - LDA #$3F - STA $2006 ; write the high byte of $3F00 address - LDA #$00 - STA $2006 ; write the low byte of $3F00 address - LDX #$00 -LoadPalettesLoop: - LDA palette.w, x ;load palette byte - STA $2007 ;write to PPU - INX ;set index to next byte - CPX #$20 - BNE LoadPalettesLoop ;if x = $20, 32 bytes copied, all done - ; initialize variables in ram LDA #$00 STA buttons_pressed @@ -101,6 +96,25 @@ LoadPalettesLoop: LDA #$00 STA $020E ; set the sprite attributes (palette, flipping, etc) +vblankwait2: ; Second wait for vblank, PPU is ready after this + BIT $2002 + BPL vblankwait2 + + ; now that the ppu is ready, we can start initializing it +LoadPalettes: + LDA $2002 ; read PPU status to reset the high/low latch + LDA #$3F + STA $2006 ; write the high byte of $3F00 address + LDA #$00 + STA $2006 ; write the low byte of $3F00 address + LDX #$00 +LoadPalettesLoop: + LDA palette.w, x ;load palette byte + STA $2007 ;write to PPU + INX ;set index to next byte + CPX #$20 + BNE LoadPalettesLoop ;if x = $20, 32 bytes copied, all done + LDA #%00010000 ; enable sprites STA $2001 -- cgit v1.2.3-54-g00ecf