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