summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--test.s74
1 files 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