step 8 - Select and Reset support
For this update we're adding initial support for the Select and Reset buttons. For this we're adding a new RAM variable called GameState to keep track of "Game Active" vs "Game Over".
; D7, 1=Game Active, 0=Game Over GameState: ds 1 ; stored in $A7
We're going to use D7 to denote the state as we can easily test D7 (as well as D6) by using the BIT command. You can see this in the revised Vertical Blank routine were we test GameState to determine if UpdateTimer and ProcessJoystick should be skipped over:
VerticalBlank: jsr ProcessSwitches bit GameState bpl NotActive jsr UpdateTimer jsr ProcessJoystick NotActive: jsr PositionObjects jsr SetObjectColors jsr PrepScoreForDisplay rts ; ReTurn from Subroutine
ProcessSwitches will check SWCHB to see if RESET is pressed. If so, it'll start up a new game. If not, it'll check if SELECT is pressed, and if so cancel an active game.
ProcessSwitches: lda SWCHB ; load in the state of the switches lsr ; D0 is now in C bcs NotReset ; if D0 was on, the RESET switch was not held jsr InitPos ; Prep for new game lda #%10000000 sta GameState ; set D7 on to signify Game Active rts NotReset: lsr ; D1 is now in C bcs NotSelect lda #0 sta GameState ; clear D7 to signify Game Over NotSelect: rts
In the next update ProcessSwitches will be expanded upon so that the Select routine will let you select a game variation (and if you check the source you'll see a new Arena layout is already in place for that).
In order to visually show you that the game is over, I've revised the Color routines to color cycle if the game is not active.
SetObjectColors: lda #$FF sta Temp2 ; default to color mask and ColorCycle ; color cycle bit GameState bpl SOCgameover lda #0 ; if game is active, no color cycle SOCgameover: sta Temp ldx #4 ; we're going to set 5 colors (0-4) ldy #4 ; default to the color entries in the table (0-4) lda SWCHB ; read the state of the console switches and #%00001000 ; test state of D3, the TV Type switch bne SOCloop ; if D3=1 then use color ldy #$0f sty Temp2 ; set B&W mask ldy #9 ; else use the b&w entries in the table (5-9) SOCloop: lda Colors,y ; get the color or b&w value eor Temp ; color cycle and Temp2 ; B&W mask sta COLUP0-1,x ; and set it dey ; decrease Y dex ; decrease X bne SOCloop ; Branch Not Equal to Zero lda Colors,y ; get the Arena color eor Temp ; color cycle and Temp2 ; B&W mask sta ArenaColor ; save in RAM for Kernal Usage rts ; ReTurn from Subroutine
Color cycle example
B&W Color Cycle example:
ROM
Source
COLLECT TUTORIAL NAVIGATION
10 Comments
Recommended Comments