By Darrell Spice, Jr. (adapted by Duane Alan Hahn, a.k.a. Random Terrain)
As an Amazon Associate I earn from qualifying purchases.
Original Blog Entry
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:
The ROM and the source are at the bottom of my blog entry.
Other Assembly Language Tutorials
Be sure to check out the other assembly language tutorials and the general programming pages on this web site.
Amazon: Atari 2600 Programming (#ad)
Amazon: 6502 Assembly Language Programming (#ad)
Atari 2600 Programming for Newbies (#ad)
|
|
|
Table of Contents for Let’s Make a Game!
Step 1: Generate a Stable Display
Step 3: Score and Timer Display
Step 5: Automate Vertical Delay
Step 8: Select and Reset Support
Step 12: Add the Missile Objects
Disclaimer
View this page and any external web sites at your own risk. I am not responsible for any possible spiritual, emotional, physical, financial or any other damage to you, your friends, family, ancestors, or descendants in the past, present, or future, living or dead, in this dimension or any other.
Use any example programs at your own risk. I am not responsible if they blow up your computer or melt your Atari 2600. Use assembly language at your own risk. I am not responsible if assembly language makes you cry or gives you brain damage.