Shooting Stars Assembly Source


The article describing this program appears on a separate page.

Listing 4

SSTARS.ASM is available in ATASCII format.

;
; Shooting stars by Dennis Fox
;

; Page zero usage

PBASE  =   $CB          ;POINTERS TO...
MBASE  =   $CD          ;MISSILES,
BASE2  =   $CF          ;PLAYER1,
BASE3  =   $D1          ;PLAYER2,
BASE4  =   $D3          ;PLAYER3,
ADDR   =   $D5          ;2-BYTE POINTER

; Page 6 usage

X      =   $600
Y      =   $601
XM     =   $610
YM     =   $620
DM     =   $630
T1     =   $640
T2     =   $641
TI1    =   $642
TI2    =   $643
HIT    =   $645
LIFE   =   $650
TI3    =   $660
TI4    =   $6A0
ELF    =   $6A1
SF1    =   $6A2
STIME  =   $6A3

; Operating system equates

ATTRAC =   $4D          ;ATTRACT MODE POINTER
PCOLR0 =   $2C0         ;PLAYER COLORS
PCOLR1 =   $2C1
PCOLR2 =   $2C2
PCOLR3 =   $2C3
COLOR0 =   $2C4         ;PLAYFIELD COLORS
COLOR1 =   $2C5
COLOR2 =   $2C6
COLOR3 =   $2C7
COLOR4 =   $2C8
SDMCTL =   $22F         ;DMA CONTROL
SDLSTL =   $230         ;DISP LIST POINTER
SDLSTH =   $231
STICK0 =   $278         ;JOYSTICK
STRIG0 =   $284         ;STICK BUTTON
HITCLR =   $D01E        ;COLLISION CLEAR
HPOSP0 =   $D000        ;P/M HOR. POSITIONS
HPOSP1 =   $D001
HPOSP2 =   $D002
HPOSP3 =   $D003
HPOSM0 =   $D004
HPOSM1 =   $D005
HPOSM2 =   $D006
HPOSM3 =   $D007
M1PL   =   $D009        ;COLLISION REGISTERS
M2PL   =   $D00A
M3PL   =   $D00B
P1PL   =   $D00D
P2PL   =   $D00E
P3PL   =   $D00F
GRACTL =   $D01D        ;GRAPHIC CONTROL
CONSOL =   $D01F        ;CONSOLE BUTTONS
AUDF1  =   $D200        ;AUDIO CONTROLS
AUDC1  =   $D201
AUDF2  =   $D202
AUDC2  =   $D203
RANDOM =   $D20A        ;RANDOM #
PMBASE =   $D407        ;P/M START ADDR
SETVBV =   $E45C        ;VERT BLANK SET VECTOR
XITVBV =   $E462        ;VERT BLANK EXIT

; set up screen and display list

 ORG $2000

SSTAR  LDX #9
       LDA #$FF
SETTB  STA SCRNA,X      ;SET TOP...
       STA SCRNC,X      ;AND BOTTOM...
       DEX              ;OF SCREEN
       BPL SETTB
       LDX #41
       LDA #SCRNB/256   ;POINT TO...
       STA ADDR+1       ;MIDDLE OF SCREEN
       LDA #SCRNB&255
       STA ADDR
SETMID LDY #9
MIDLP  LDA MIDBYT,Y     ;COPY MIDDLE BYTES...
       STA (ADDR),Y     ;TO SCREEN RAM
       DEY
       BPL MIDLP
       LDA ADDR         ;NOW ADD 10 BYTES...
       CLC              ;TO POINT TO...
       ADC #10          ;NEXT LINE
       STA ADDR
       LDA ADDR+1
       ADC #0
       STA ADDR+1
       DEX              ;ANOTHER LINE?
       BPL SETMID       ;YES!
       LDA #DLIST&255   ;POINT TO
       STA SDLSTL       ;DISPLAY
       LDA #DLIST/256   ;LIST
       STA SDLSTH
       LDA #$00         ;SET LOW BYTES...
       STA MBASE        ;OF P/M POINTERS
       STA PBASE
       STA BASE2
       STA BASE3
       STA BASE4
       LDA #$33         ;NOW SET HI BYTES
       STA MBASE+1      ;TO POINT TO
       LDA #$34         ;VARIOUS P/M AREAS
       STA PBASE+1
       LDA #$35
       STA BASE2+1
       LDA #$36
       STA BASE3+1
       LDA #$37
       STA BASE4+1

; Set players starting position

START2 LDA #16          ;INITIALIZE TIMERS
       STA TI1
       STA TI2
       STA TI4
       LDA #$00
       STA ELF
       STA SF1
       STA STIME
       STA TI3
       LDA #5           ;START W/5 LIVES
       STA LIFE
START  LDA #180         ;SET UP...
       STA X            ;ASTRONAUT X
       LDA RANDOM       ;NOW GET...
       LSR A            ;RANDOM #
       CLC              ;AND SET UP
       ADC #55          ;ASTRONAUT Y
       STA Y

; Set missles horizontal position

       LDX #$00         ;GET RANDOM...
L1     LDA RANDOM       ;HORIZONTAL
       LSR A            ;POSITION,
       LSR A            ;MAKE SURE IT'S
       ADC #50          ;ON SCREEN,
       STA XM,X         ;STORE IT
       INX              ;NEXT MISSILE
       CPX #6           ;ALL DONE?
       BNE L1           ;NOT YET!

; Set missles vertical position

       LDX #$00         ;START W/MISSILE 0
L2     TXA              ;GET MISSILE #
       ASL A            ;MULTIPLY...
       ASL A            ;MISSILE...
       ASL A            ;NUMBER...
       ASL A            ;BY 32,
       ASL A            ;MAKE SURE IT'S...
       ADC #55          ;ON SCREEN,
       STA YM,X         ;AND STORE IT!
       INX              ;NEXT MISSILE
       CPX #6           ;ALL DONE?
       BNE L2           ;NOT YET!

; Set missiles' starting directions

       LDX #$00
L3     LDA RANDOM       ;GET RANDOM...
       AND #$03         ;DIRECTION
       STA DM,X         ;AND STORE
       INX              ;NEXT MISSILE
       CPX #6           ;ALL DONE?
       BNE L3           ;NOT YET!

; Set up player missile graphics
; Single line resolution

       LDA #$30         ;POINT TO P/M AREA
       STA PMBASE
       LDA #62          ;TURN ON SCREEN
       STA SDMCTL
       LDA #3           ;SET P/M GRAPHICS
       STA GRACTL
       LDA #$00         ;NOW CLEAR OUT...
       TAY              ;ALL MISSILES
A1     STA (PBASE),Y    ;AND PLAYERS
       STA (MBASE),Y
       STA (BASE2),Y
       STA (BASE3),Y
       STA (BASE4),Y
       INY
       BNE A1
       LDA #$00         ;NO COLLISION!
       STA HIT
       STA HITCLR
       LDA #$46         ;SET UP COLORS
       STA PCOLR0
       LDA #15
       STA PCOLR1
       STA PCOLR2
       STA PCOLR3
       LDA #150
       STA COLOR1
       LDA #54
       STA COLOR2
       LDA #$F8
       STA COLOR0
       LDA #3
       STA T2
       LDA #$07         ;NOW START UP...
       LDX #VBI/256     ;OUR VERTICAL BLANK...
       LDY #VBI&255     ;INTERRUPT!
       JSR SETVBV

; The game begins here

BACK   LDA CONSOL       ;CHECK CONSOLE KEYS
       CMP #6           ;START PRESSED?
       BNE JOY2         ;NOPE!
       JMP DEATH        ;GO TO RESTART!

; Read joystick

JOY2   LDA STICK0       ;GET ASTRONAUT...
       AND #1           ;DIRECTION
       BNE O1
       DEC Y            ;UP
O1     LDA STICK0
       AND #$08
       BNE O2
       INC X            ;RIGHT
O2     LDA STICK0
       AND #$02
       BNE O3
       INC Y            ;DOWN
O3     LDA STICK0
       AND #$04
       BNE O4
       DEC X            ;LEFT
O4     LDA X            ;GET ASTRO. X
       CMP #200         ;TOO FAR RIGHT?
       BNE O5           ;IT'S OK
       DEC X            ;TOO FAR!
O5     LDA X
       CMP #50          ;TOO FAR LEFT?
       BNE O6           ;OK.
       INC X            ;TOO FAR!
O6     LDA Y            ;GET ASTRO. Y
       CMP #52          ;TOO FAR UP?
       BNE O7           ;OK.
       INC Y            ;TOO FAR!
O7     LDA Y
       CMP #200         ;TOO FAR DOWN?
       BNE O8           ;OK.
       DEC Y            ;TOO FAR!

; Put astronaut on playfield

O8     LDA X            ;GO AHEAD AND SET...
       STA HPOSP0       ;HOR. POSITION
       LDX #$00         ;NOW COPY THE...
       LDY Y            ;ASTRONAUT IMAGE...
B1     LDA ANAUT,X      ;INTO PLAYER 1
       STA (PBASE),Y
       INX
       INY
       CPX #19
       BNE B1

; Move missiles

       LDX #$00
D0     LDA DM,X         ;GET MISSILE DIR.
       BNE D1
       INC XM,X         ;RIGHT...
       DEC YM,X         ;AND UP
D1     LDA DM,X
       CMP #1
       BNE D2
       INC XM,X         ;RIGHT...
       INC YM,X         ;AND DOWN!
D2     LDA DM,X
       CMP #2
       BNE D3
       DEC XM,X         ;LEFT...
       INC YM,X         ;AND DOWN!
D3     LDA DM,X
       CMP #3
       BNE DO1
       DEC XM,X         ;LEFT...
       DEC YM,X         ;AND UP!
DO1    INX              ;NEXT MISSILE
       CPX #6           ;ALL DONE?
       BNE D0           ;NO, DO OTHERS!

; Check if missile has hit wall

       LDX #$00
C0     LDA XM,X         ;GET X POS.
       CMP #202         ;TOO FAR RIGHT?
       BNE C1           ;IT'S OK.
       LDA DM,X         ;IT'S TOO FAR,
       BNE DI1          ;WE MUST REVERSE
       LDA #3           ;THE DIRECTION!
       STA DM,X
       CLC
       BCC C1
DI1    LDA #2
       STA DM,X
C1     LDA XM,X         ;GET X POS.
       CMP #48          ;TOO FAR LEFT?
       BNE C2           ;OK.
       LDA DM,X         ;REVERSE DIRECTION!
       CMP #2
       BEQ DI2
       LDA #0
       STA DM,X
       CLC
       BCC C2
DI2    LDA #1
       STA DM,X
C2     LDA YM,X         ;GET Y POS.
       CMP #52          ;TOO FAR UP?
       BNE C3           ;OK.
       LDA DM,X         ;REVERSE!
       BNE DI3
       LDA #1
       STA DM,X
       CLC
       BCC C3
DI3    LDA #2
       STA DM,X
C3     LDA YM,X         ;GET Y POS.
       CMP #213         ;TOO FAR DOWN?
       BNE C4           ;OK.
       LDA DM,X         ;REVERSE!
       CMP #1
       BNE DY2
       LDA #$00
       STA DM,X
       CLC
       BCC C4
DY2    LDA #3
       STA DM,X
C4     INX              ;NEXT MISSILE
       CPX #6           ;ALL DONE?
       BNE C0           ;NO, DO OTHERS!

; Plot missiles on playfield

       LDA XM           ;SET ALL MISSILES...
       STA HPOSP1       ;HORIZONTAL...
       LDA XM+1         ;POSITIONS!
       STA HPOSP2
       LDA XM+2
       STA HPOSP3
       LDA XM+3
       STA HPOSM1
       LDA XM+4
       STA HPOSM2
       LDA XM+5
       STA HPOSM3
       LDA #$00         ;PLOT 1ST MISSILE
       LDY YM           ;IN PLAYER 1
       STA (BASE2),Y
       LDA #$10
       INY
       STA (BASE2),Y
       INY
       STA (BASE2),Y
       LDA #$00
       INY
       STA (BASE2),Y
       LDA #$00         ;PLOT 2ND MISSILE
       LDY YM+1         ;IN PLAYER 2
       STA (BASE3),Y
       LDA #$10
       INY
       STA (BASE3),Y
       INY
       STA (BASE3),Y
       LDA #$00
       INY
       STA (BASE3),Y
       LDA #$00         ;PLOT 3RD MISSILE
       LDY YM+2         ;IN PLAYER 3
       STA (BASE4),Y
       LDA #$10
       INY
       STA (BASE4),Y
       INY
       STA (BASE4),Y
       LDA #$00
       INY
       STA (BASE4),Y
       LDA #$EF         ;PLOT 4TH MISSILE
       LDY YM+3         ;IN MISSILE 1
       AND (MBASE),Y
       STA (MBASE),Y
       LDA #$10
       INY
       ORA (MBASE),Y
       STA (MBASE),Y
       LDA #$10
       INY
       ORA (MBASE),Y
       STA (MBASE),Y
       LDA #$EF         ;PLOT 5TH MISSILE
       INY              ;IN MISSILE 2
       AND (MBASE),Y
       STA (MBASE),Y
       LDA #$FB
       LDY YM+4
       AND (MBASE),Y
       STA (MBASE),Y
       LDA #$04
       INY
       ORA (MBASE),Y
       STA (MBASE),Y
       LDA #$04
       INY
       ORA (MBASE),Y
       STA (MBASE),Y
       LDA #$FB         ;PLOT 6TH MISSILE
       INY              ;IN MISSILE 3
       AND (MBASE),Y
       STA (MBASE),Y
       LDA #$BF
       LDY YM+5
       AND (MBASE),Y
       STA (MBASE),Y
       LDA #$40
       INY
       ORA (MBASE),Y
       STA (MBASE),Y
       LDA #$40
       INY
       ORA (MBASE),Y
       STA (MBASE),Y
       LDA #$BF
       INY
       AND (MBASE),Y
       STA (MBASE),Y

; Create sound

       INC T1
       LDA T1
       CMP #$10
       BNE SO1
       LDA #$00
       STA T1
       DEC T2
       LDA T2
       BNE SO2
       LDA #3
       STA T2
SO2    LDA #$C8         ;SET SOUND CONTROL
       STA AUDC2
       LDA T2           ;GET SOUND NUMBER
       CMP #3           ;SOUND 3?
       BNE S2           ;NO!
       LDA #120         ;SET 3RD...
       STA AUDF2        ;SOUND FREQUENCY
       CLC
       BCC SO1          ;GO SHOW TIME
S2     LDA T2
       CMP #2           ;SOUND 2?
       BNE S3           ;NO!
       LDA #100         ;SET 2ND...
       STA AUDF2        ;SOUND FREQUENCY
       CLC
       BCC SO1          ;AND SHOW TIME
S3     LDA #85          ;SET 1ST
       STA AUDF2        ;SOUNC FREQUENCY
SO1    LDA TI1          ;SHOW DIGIT 1...
       STA SCREEN+9     ;OF SECONDS
       LDA TI2          ;SHOW DIGIT 2...
       STA SCREEN+10    ;OF SECONDS
       LDA TI4          ;SHOW MINUTES!
       STA SCREEN+7

; Check for extra life

       LDA TI4          ;GET MINUTES
       CMP #19          ;3 MINUTES?
       BNE OELC         ;NO!
       LDA ELF          ;DONE EXTRA LIFE YET?
       BNE OELC         ;YES, NO MORE!
       INC LIFE         ;ANOTHER LIFE
       INC ELF          ;SET EXTRA LIFE FLAG
       LDA #$A4         ;SET UP FOR...
       STA AUDC1        ;EXTRA LIFE SOUND
       LDA #$01
       STA SF1
OELC   LDA TI4          ;GET MINUTES
       CMP #21          ;5 MINUTES?
       BNE OEL          ;NO!
       LDA ELF          ;GOT 2ND EXTRA?
       CMP #1
       BNE OEL          ;NO MORE!
       INC LIFE         ;ANOTHER LIFE!
       INC ELF          ;INC EXTRA LIFE FLAG
       LDA #$A4         ;SET UP FOR...
       STA AUDC1        ;EXTRA LIFE SOUND
       LDA #$01
       STA SF1

; Check for ending sequence

OEL    LDA HIT          ;ASTRO HIT DEBRIS?
       BEQ NEND         ;NO, HE'S OK.
       JMP END          ;UH-OH!
NEND   LDA #80          ;THIS SECTION
       LSR TI1          ;CREATES A TIME
       PHP              ;DELAY USING
       SEC              ;THE TIME VARIABLES
       SBC TI1          ;TI1 AND TI4
       PLP
       ROL TI1
       LDX #$00
SMOR   SBC TI4
       INX
       CPX #3
       BNE SMOR
       TAX
TD1    LDY #$00         ;THIS IS A
TD2    INY              ;TIME DELAY
       BNE TD2          ;ROUTINE!
       DEX
       BNE TD1

; Play extra life sound

       LDA SF1          ;GET BONUS SOUND FLAG
       CMP #1           ;FIRST FREQ?
       BNE SC2          ;NO!
       LDA #50          ;SET 1ST BONUS FREQ.
       STA AUDF1
       INC STIME        ;INC SOUND TIMER
       LDA STIME
       CMP #$25         ;END OF SOUND?
       BNE SC2          ;NOT YET!
       INC SF1          ;NEXT FREQ
       LDA #$00         ;NO MORE SOUND!
       STA STIME
SC2    LDA SF1          ;GET BONUS SOUND FLAG
       CMP #2           ;SECOND FREQ?
       BNE SC3          ;NO!
       LDA #40          ;SET FREQ.
       STA AUDF1
       INC STIME        ;INCREMENT TIMER
       LDA STIME
       CMP #$25         ;SOUND DONE?
       BNE SC3          ;NO!
       INC SF1          ;NEXT FREQ
       LDA #$00         ;ALL DONE!
       STA STIME
SC3    LDA SF1          ;GET BONUS SOUND FLAG
       CMP #3           ;3RD FREQ?
       BNE SC4          ;NO!
       LDA #32          ;SET FREQ.
       STA AUDF1
       INC STIME        ;INC SOUND TIMER
       LDA STIME
       CMP #$25         ;SOUND DONE?
       BNE SC4          ;NO!
       INC SF1          ;SET FOR END
       LDA #$00         ;ALL DONE!
       STA STIME
SC4    LDA SF1          ;GET BONUS SOUND FLAG
       CMP #4           ;END OF SOUND?
       BNE SC5          ;NO!
       LDA #00          ;SHUT OFF SOUND!
       STA AUDF1
       STA AUDC1
       LDA #$00         ;ALL DONE!
       STA STIME
SC5    LDA #138         ;UPDATE LIVES...
       LDX #$00         ;DISPLAY
DMORE  STA SCREEN+13,X  ;ALL LIVES
       INX
       CPX LIFE
       BNE DMORE
       JMP BACK
END    DEC LIFE         ;1 LESS LIFE
       LDA #$A8         ;INIT DEATH SOUND
       STA AUDC1
       STA AUDC2
       LDA #50          ;INIT FREQ.
SA     STA AUDF1
       PHA
       CLC
       ADC #100         ;INCREMENT SOUND
       STA AUDF2
       STA PCOLR0       ;FLASH ASTRONAUT
       PLA
       LDY #$00         ;TIME DELAY
DLY2   LDX #$00
DLY1   INX
       BNE DLY1
       INY
       CPY #25
       BNE DLY2
       CLC
       ADC #$01
       CMP #100         ;END OF DEATH?
       BNE SA           ;NO, LOOP BACK
       LDA #$00         ;SHUT OFF SOUND
       STA AUDF1
       STA AUDC1
       STA AUDF2
       STA AUDC2
       LDA #$46         ;RESET...
       STA PCOLR0       ;ASTRONAUT COLOR
       LDA #$00         ;REMOVE...
       LDY LIFE         ;LIFE INDICATOR...
       STA SCREEN+13,Y  ;FROM SCREEN
       LDA LIFE         ;ANY MORE LIVES?
       BEQ DEATH        ;NO! END OF GAME!
       JMP START        ;ANOTHER LIFE.
DEATH  LDA #00          ;ZERO LIVES
       STA LIFE
AGAIN  LDA STRIG0       ;STICK TRIGGER PRESSED?
       BEQ RESTRT       ;YES!
       LDA CONSOL       ;GET CONSOLE KEY
       CMP #6           ;START PRESSED?
       BNE AGAIN        ;NO!
RESTRT LDA #$00         ;RESET...
       STA ATTRAC       ;ATTRACT MODE
       JMP START2       ;RESTART GAME.

; Vertical blank interrupt

VBI    LDA M1PL         ;GET...
       ORA M2PL         ;ALL...
       ORA M3PL         ;COLLISION...
       ORA P1PL         ;REGISTERS...
       ORA P2PL         ;AND CHECK...
       ORA P3PL         ;FOR...
       AND #1           ;ASTRONAUT...
       STA HIT          ;COLLISION!
       INC TI3          ;INCREMENT 1/60 SEC.
       LDA TI3          ;TIMER
       CMP #60          ;ANOTHER SECOND?
       BNE TOVR         ;NO!
       LDA #$00         ;RESET 60THS OF SEC
       STA TI3
       INC TI2          ;ANOTHER SEC
       LDA TI2
       CMP #26          ;10 SECS?
       BNE TOVR         ;NO!
       LDA #16          ;RESET 2ND SECOND...
       STA TI2          ;DIGIT TO 0
       INC TI1          ;INCREMENT 1ST...
       LDA TI1          ;SECOND DIGIT
       CMP #22          ;GOT A MINUTE?
       BNE TOVR         ;NO!
       INC TI4          ;INCREMENT MINUTES
       LDA #16          ;RESET 1ST SECOND...
       STA TI1          ;DIGIT TO 0
TOVR   JMP XITVBV       ;EXIT VERT BLANK!

; Set up display list

DLIST  DB  112,112,112,71
       DW  SCREEN
       DB  9,9,9,9,9,9,9,9,9,9
       DB  9,9,9,9,9,9,9,9,9,9
       DB  9,9,9,9,9,9,9,9,9,9
       DB  9,9,9,9,9,9,9,9,9,9
       DB  9,9,9,9
       DB  65
       DW  DLIST

; Data for astronaut image

ANAUT  DB  $00,$7C,$54,$6C,$7C,$44,$7C,$10,$10,$FE,$BA,$BA
       DB  $BA,$38,$38,$28,$28,$EE,$00

; Set up screen memory

MIDBYT DB  128,0,0,0,0,0,0,0,0,1
SCREEN DB  0,0,116,105,109,101,0,0,26,0,0,0,0,0,0,0,0,0,0,0
SCRNA  DS  10
SCRNB  DS  420
SCRNC  DS  10

       END SSTAR

Previous | Contents | Next

Original text copyright 1984 by ANALOG Computing. Reprinted with permission by the Digital ANALOG Archive.