Useful
Inventions
Favorite
Quotes
Game
Design
Atari
Memories
Personal
Pages

Let’s Make a Game!

Step 8: Select and Reset Support

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:

Color Cycle

B&W Color Cycle example:

Black and White Color Cycle

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 Stuff

 

< Previous Step

 

 

Next Step >

 

 

 

 

 

Table of Contents for Let’s Make a Game!

Introduction

Step 1: Generate a Stable Display

Step 2: Timers

Step 3: Score and Timer Display

Step 4: 2 Line Kernel

Step 5: Automate Vertical Delay

Step 6: Spec Change

Step 7: Draw the Playfield

Step 8: Select and Reset Support

Step 9: Game Variations

Step 10: “Random Numbers”

Step 11: Add the Ball Object

Step 12: Add the Missile Objects

Step 13: Add Sound Effects

Step 14: Add Animation

 

 

 

 

Back to Top

 

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.

 

Home Inventions Quotations Game Design Atari Memories Personal Pages About Site Map Contact Privacy Policy Tip Jar