;
; 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    ;POINT TO...
    STA    ADDR+1    ;MIDDLE OF SCREEN
    LDA    <SCRNB
    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    ;POINT TO
    STA    SDLSTL    ;DISPLAY
    LDA    >DLIST    ;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   ;OUR VERTICAL BLANK...
    LDY    <VBI    ;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 MISILE
    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    ;SOUND 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 SECOND
    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  Org *+10
SCRNB  Org *+420
SCRNC  Org *+10

End    SSTAR
