;
; TROLLWAR
; BY
; SCOTT D. LANGSTON
; ROCK ISLAND, IL
;
; SYSTEM EQUATES
;
CHBASE    = $D409
HPOSM0    = $D004
HPOSM1    = $D005
HPOSM2    = $D006
HPOSM3    = $D007
HPOSP0    = $D000
HPOSP1    = $D001
HPOSP2    = $D002
HPOSP3    = $D003
RANDOM    = $D20A
WSYNC    = $D40A
XITVBV    = $E462
;
    * = $80
;
TEMP10        2     ;PAGE ZERO VARIABLES
TEMP11        2
TEMP12        2
GUNTOP        1     ;POINTER TO TOP OF GUN DRAWING
GUNBOT        1     ;POINTER TO BOTTOM OF GUN DRAWING
BOMB        1     ;VARIBLE FOR CHAR FIRED FROM GUN
P0        1     ;POINTER/HORIZ POS PLAYER 0
P2        1     ;HORIZ POS PLAYER 2
P1        1     ;HORIZ POS PLAYER 1
P5        1     ;HORIZ POS MISS 1
P6        1     ;HORIZ POS MISS 2
P4        1     ;HORIZ POS MISS 0
P7        1     ;HORIZ POS MISS 4
TEMP1        1     ;VARIABLE
TEMP13        1     ;POINTER ON LAST LINE WHERE TROLL IS DISPLAYED
STEMP2        1
VBCNT        1     ;COUNTER FOR # OF TIMES VERT BLANK EXCUTED
GUNFLAG        1     ;FLAG FOR GHOST TOUCHIN GUN
GTOP        1     ;PLAYER0/POINTER TOP OF GHOST
GTOP1        1     ;PLAYER1/"
GTOP2        1     ;PLAYER2/"
GFLAG        1     ;PLAYER0/FLAG FOR GHOST DIRECTION
GFLAG1        1     ;PLAYER1/"
GFLAG2        1     ;PLAYER2/"
EXPTIM        1     ;VAR/DELAY FOR GUN SOUND
GTEMP        1     ;TEMPORARY VARIABLE
GH1ST        1     ;PLAYER0/POINTER GHOST DRAWING
GH2ST        1     ;PLAYER1/"
GH3ST        1     ;PLAYER2/"
GCNT1        1     ;PLAYER0/COUNTER BEFORE DRAWING CHANGES
GCNT2        1     ;PLAYER1/"
GCNT3        1     ;PLAYER2/"
SD        1     ;POINTER TO SONG NOTE
SD1        1     ;DELAY BEFORE NOTE CHANGES
SD2        1     ;SONG TEMPO VAR
TIMER1        1     ;TIMERS FOR WHEN TROLLS
TIMER2        1     ;SPEED-UP
GAMEOVER        1     ;FLAG FOR GAME OVER
SCOUNT        1     ;COUNTER OF SCORE VALUE OF 0 THRU 250
TR        1
;
    *= $2000
;
PM        768
MIS        256     ;MISSILE 0-3
PL0R        256     ;PLAYER 0
PL1R        256     ;PLAYER 1
PL2R        256     ;PLAYER 2
PL3R        256     ;PLAYER 3
;
;CHARACTER SET
;
CHAR    .BYTE $00,$00,$00,$00,$00,$00,$00,$00
    .BYTE $00,$00,$14,$55,$55,$55,$55,$14
    .BYTE $00,$00,$14,$45,$45,$51,$51,$14
    .BYTE $00,$00,$10,$41,$41,$41,$51,$14
    .BYTE $15,$13,$17,$A5,$8A,$3A,$0C,$3C
    .BYTE $50,$10,$50,$68,$88,$B0,$C0,$F0
    .BYTE $00,$03,$00,$0C,$02,$00,$0C,$03
    .BYTE $55,$F5,$F5,$56,$BA,$A8,$CF,$03
    .BYTE $05,$3F,$0F,$05,$EB,$0A,$03,$0F
    .BYTE $50,$50,$50,$60,$A0,$80,$00,$00
    .BYTE $0C,$3C,$03,$3C,$0C,$00,$00,$00
    .BYTE $C0,$F0,$00,$F0,$C0,$00,$00,$00
    .BYTE $00,$00,$00,$FF,$FF,$00,$00,$00
    .BYTE $CC,$3B,$1D,$1C,$1E,$0F,$0F,$0F
    .BYTE $C0,$00,$00,$80,$00,$40,$C0,$C0
    .BYTE $00,$60,$F0,$FF,$FF,$FC,$F8,$60
    .BYTE $00,$03,$0C,$30,$30,$0C,$03,$2A
    .BYTE $00,$F0,$00,$50,$50,$00,$F0,$A8
    .BYTE $00,$F0,$00,$00,$00,$00,$F0,$A8
    .BYTE $00,$0F,$3F,$FF,$FF,$7F,$17,$04
    .BYTE $0C,$03,$05,$04,$05,$3D,$33,$3B
    .BYTE $CC,$F0,$54,$84,$94,$5F,$F3,$FB
TW    .BYTE $FF,$FF,$0F,$0F,$0F,$0F,$0F,$0F
    .BYTE $F3,$F3,$03,$03,$03,$03,$03,$03
    .BYTE $FF,$CF,$CF,$FF,$FC,$CF,$CF,$CF
    .BYTE $3F,$3F,$3C,$3C,$3C,$3C,$3F,$3F
    .BYTE $F3,$F3,$F3,$F3,$F3,$F3,$F3,$F3
    .BYTE $C0,$C0,$C0,$C0,$C0,$C0,$FF,$FF
    .BYTE $3C,$3C,$3C,$3C,$3C,$3C,$3F,$3F
    .BYTE $00,$00,$00,$00,$00,$00,$F0,$F0
    .BYTE $F0,$F0,$F0,$F3,$FF,$3C,$3C,$3C
    .BYTE $3C,$3C,$3C,$3C,$FC,$F0,$F0,$F0
    .BYTE $FF,$F3,$F3,$FF,$FF,$F3,$F3,$F3
    .BYTE $CF,$CF,$CF,$CF,$CF,$CF,$CF,$CF
    .BYTE $FC,$3C,$3C,$FC,$F0,$3C,$3C,$3C
    .BYTE $FF,$F3,$F3,$FF,$FF,$F3,$F3,$F3
    .BYTE $C0,$C0,$C0,$C0,$C0,$C0,$C0,$C0
    .BYTE $F0,$F3,$F3,$F3,$F0,$F0,$F3,$F0
    .BYTE $FC,$FF,$C0,$FC,$FF,$0F,$FF,$FC
    .BYTE $FF,$F3,$F3,$FF,$FF,$F3,$F3,$F3
    .BYTE $CF,$CF,$CF,$CF,$CF,$CF,$CF,$CF
    .BYTE $F0,$3C,$3C,$F0,$F0,$3C,$3C,$F0
    .BYTE $FF,$FF,$F3,$F3,$F3,$F3,$FF,$FF
    .BYTE $3C,$3C,$3C,$3C,$3C,$3C,$FC,$FC
    .BYTE $FF,$FF,$0F,$0F,$0F,$0F,$0F,$0F
    .BYTE $F0,$F0,$00,$00,$00,$00,$00,$00
    .BYTE $FF,$FF,$0F,$0F,$0F,$0F,$0F,$0F
    .BYTE $F3,$F3,$03,$03,$03,$03,$03,$03
    .BYTE $FF,$FF,$CF,$CF,$CF,$CF,$FF,$FF
    .BYTE $3F,$FF,$F0,$FF,$3F,$03,$FF,$3F
    .BYTE $0F,$CF,$00,$00,$C0,$C0,$C0,$00
    .BYTE $FF,$FF,$F0,$F0,$F0,$F0,$F0,$F0
    .BYTE $3F,$3C,$3C,$3F,$3F,$3C,$3C,$3C
    .BYTE $F3,$F3,$F3,$F3,$F3,$F3,$F3,$F3
    .BYTE $FF,$CF,$CF,$FF,$FC,$CF,$CF,$CF
    .BYTE $3F,$3F,$03,$03,$03,$03,$03,$03
    .BYTE $FC,$FC,$C0,$C0,$C0,$C0,$C0,$C0
    .BYTE $0F,$3F,$F0,$F0,$F0,$F3,$F0,$3F
    .BYTE $C0,$F0,$F0,$00,$00,$FC,$F0,$C0
    .BYTE $FF,$F3,$F3,$FF,$FF,$F3,$F3,$F3
    .BYTE $CF,$CF,$CF,$CF,$CF,$CF,$CF,$CF
    .BYTE $00,$C0,$F3,$3F,$0C,$00,$00,$00
    .BYTE $3C,$FC,$FC,$3C,$3C,$3C,$3C,$3C
    .BYTE $FF,$FF,$F0,$FF,$FF,$F0,$FF,$FF
    .BYTE $C0,$C0,$00,$00,$00,$00,$C0,$C0
    .BYTE $FF,$FF,$F3,$F3,$F3,$F3,$FF,$FF
    .BYTE $CF,$CF,$C3,$C3,$C0,$C0,$C0,$C0
    .BYTE $00,$00,$C3,$C3,$FF,$FF,$3C,$3C
    .BYTE $F3,$F3,$C3,$C3,$03,$03,$03,$03
    .BYTE $FF,$FF,$C0,$FC,$FC,$C0,$FF,$FF
    .BYTE $3F,$3C,$3C,$3F,$3F,$3C,$3C,$3C
    .BYTE $F0,$F0,$F0,$F0,$C0,$F0,$F0,$F0
;
;GAME DISPLAY LIST
;
DLIST    .BYTE $70,$70,$45
    .WORD SCR5
    .BYTE $44
    .WORD SCR1
    .BYTE $04,$04,$04,$04,$04,$04,$04,$04
    .BYTE $04,$04,$04,$04,$04,$04,$04,$04,$04,$04,$04,$84,$46
    .WORD SCR4
    .BYTE $41
    .WORD DLIST
;
;LOOKUP TABLES
;
SONG .BYTE 85,96,102,96,81,64,72,81,85,81,64,47,60,64,68,64,42,47,50,47,42,47
    .BYTE 53,47,40,40,42,47,53,57,64
TABLE5    .BYTE $02,$04,$03,$01,$03,$02
    .BYTE $02,$04,$01,$04,$01,$03,$04,$02,$03,$02
TABLE7    .BYTE $B8,$A8,$DC,$B8,$DC,$A8
    .BYTE $A8,$DC,$DC,$C8,$DC,$AC,$A8,$DC,$A8,$B8
GUN    .BYTE $08,$0A,$8A,$AE,$FF,$AE,$8A,$0A,$08
SCR42    .BYTE $00,$00,$00,$00,$33,$23,$2F,$32,$25,$00
    .BYTE $00,$10,$10,$10,$10,$10,$00,$00,$00,$00
SCR52    .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$96
    .BYTE $97,$98,$99,$9A,$9B,$9C,$9D,$00,$00,$00
    .BYTE $00,$00,$00,$9E,$9F,$A0,$A1,$A2,$00,$00
    .BYTE $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
SCR6    .BYTE $00,$00,$00,$A3,$A4,$00,$9E,$9F,$A0,$A1
    .BYTE $A2,$00,$A5,$A6,$00,$A7,$A8,$A9,$AA
    .BYTE $A8,$AB,$AC,$AD,$00,$AE,$AF,$B0,$00,$00,$B1
    .BYTE $B2,$B3,$B4,$B5,$B6,$B7,$B8,$00,$00,$00
SCR7    .BYTE $B9,$BA,$BB,$BC,$BD,$BE,$BF,$C0,$C1,$C2,$C3,$C4,$C5,$C6,$C7
GHOST    .BYTE $1C,$3E,$2A,$36,$1C,$7F,$5D,$5D,$1C,$18,$30
    .BYTE $00,$00,$14,$00,$00,$00,$00,$00,$00,$00,$00
GHOST2    .BYTE $7C,$54,$7D,$39,$FF,$BC,$BE,$3F,$03,$01
;
;SUBROUTINE DLI:USED BY DISPLAY
;INTERURPT TO LOAD ADDRESS
;OF REDEFINED CHARACTER BASE
;
DLI    PHA
    LDA TR     ;CHAR BASE ADDRESS
    STA WSYNC     ;WAIT SYNC
    STA CHBASE     ;CHAR BASE REGISTER
    PLA
    RTI
;
;SUBROUTINE ZEROSC:CLEARS
;PLAYFIELD AND PLAYER
;MEMORY.EXECUTES 256 TIMES.
;
ZEROSC    LDX #0
    TXA
Z1    STA SCR1,X     ;CLEAR SCREEN
    STA LEV1,X
    STA LEV2,X
    STA LEV3,X
    STA PL0R,X     ;CLEAR PLAYERS
    STA PL1R,X
    STA PL2R,X
    STA PL3R,X
    INX
    BNE Z1
    RTS
;
;SUBROUTINE WALL:BUILDS
;PLAYFIELD.GEM IS CHARACTER
;16 AND 17.WALL IS CHARACTER 12.
;KING IS CHARACTER 20&21
;
WALL    LDX #15     ;# OF PLAYFLD ROWS-1
W2    LDY #0     ;LOOP W2 PLACES
    TXA      ; GEM CHARACTERS
    LSR A
    BCC W1     ;GEM CHAR IS PLACED
    LDY #2     ;STARTING IN BYTE 2 OR 0
W1    LDA #16     ;LEFT HALF OF GEM
y    STA (TEMP12),Y     ;TEMP12 HOLDS
    INY      ;ADDRESS OF A LINE IN THE PLAYFIELD
    LDA #17     ;RIGHT HALF OF GEM
    STA (TEMP12),Y
    JSR LINECNT     ;JUMP SUB TO
    DEX      ;INCREMENT TEMP12 TO
    BPL W2     ;NEXT LINE
    LDA #21
    STA LEV7,Y     ;LEV7 IS LOWEST
    LDA #20     ;PLAYFLD WHERE KING IS PLACED
    DEY
    STA LEV7,Y
    LDX #39     ;# OF BYTES PER LINE-1
    LDA #12     ;WALL CHARACTER
W3    STA ENDSC,X     ;LOOP W3 PLACES
    STA LEV9,X     ;SOLID WALL
    STA LEV8,X     ;CHARACTERS
    DEX      ;(3 WALLS ARE BIULT)
    BPL W3
    RTS
;
;SUBROUTINE SETTBL6:RANDOMLY SETS
;THE ORDER OF HOW FAST TROLLS MOVE.
;TABLE6 CONTROLS HOW LONG BEFORE
;TROLL MOVES,TABLES 2 AND 3
;CONTROL HOW FAST EGG TURNS INTO
;A TROLL CHARACTER.
;
SETTBL6    LDA RANDOM     ;GET RANDOM #
    AND #$0F     ;MAKE 0..15
    STA TEMP1     ;TEMPORARY SAVE #
    TAX      ;POINTER TO WHERE VALUE IS
    LDY #0     ;POINTER TO WHERE VALUE IS GOING
CHCKX    INX      ;VALUE OF X CAN ONLY BE 0-15
    CPX #16
    BCC LOAD6
    LDX #0
LOAD6    LDA TABLE7,X     ;GET VALUE
    STA TABLE6,Y     ;SAVE VALUE
    STA TABLE1,Y     ;SAVE VALUE
    INY      ;NEXT DESTINATION
    CPX TEMP1     ;IF X=TEMP1 THEN ALL VALUES HAVE
    BNE CHCKX     ;BEEN LOADED INTO TABLE6
    LDX #15
LOAD23    LDA #15     ;LOAD AND SAVE
    STA TABLE2,X     ;CORRESPONDING
    LDA TABLE5,X     ;TABLE VALUES
    STA TABLE3,X
    DEX
    BPL LOAD23
    RTS
;
;SUBROUTINE INITIAL:SETS
;INITIAL VALUE OF POINTERS
;AND COUNTERS. SETS-PMGRAPH,
;PLAYFIELD,PLAYER COLOR,AND
;PLAYER WIDTH/PRIORITY
;ALSO LOAD ADDRESS OF DISPLAY
;LIST AND ENABLES DISPLAY LIST
;INTERRUPT.
;
INITIAL    LDA #0
    STA SCOUNT
    STA GCNT1
    STA GCNT2
    STA GCNT3
    STA EXPTIM
    STA GAMEOVER
    STA VBCNT
    STA $D00B     ;PLAYER SIZE
    STA $D00A     ;"
    STA $D009     ;"
    STA $D008     ;"
    STA $D00C     ;"
    STA $02C8     ;BACKGROUND
    STA SD
    STA SD1
    STA TIMER1
    STA TIMER2
    STA GH1ST
    STA GH2ST
    STA GH3ST
    STA $D208
    STA $D205
    LDA #3
    STA $D20F
    LDA #30
    STA SD2
    LDA #1
    STA GUNFLAG
    STA GFLAG
    STA GFLAG1
    STA GFLAG2
    LDA #17
    STA $026F     ;PLAYER PRIORITY
    LDA #$AA     ;SET SOUND
    STA $D201
    STA $D203
    LDA #$A2
    STA $D207
    LDA #41
    STA TEMP13
    LDA #$10     ;CLEAR SCORE
    STA SCR4+11
    STA SCR4+12
    STA SCR4+13
DISPLAY    LDA # <DLIST     ;SET DISP LIST
    STA 560
    LDA # >DLIST
    STA 561
    LDA # <DLI     ;SET UP DISPLAY
    STA $0200     ;LIST INTERRUPT
    LDA # >DLI
    STA $0201
    LDA $D40E     ;ENABLE DISPLAY INTERRUPT
    ORA #$80
    STA $D40E
PMGRAPH    LDA # >PM     ;SET UP PMGRAPG
    STA $D407
    LDA #62
    STA $022F
    LDA #3
    STA $D01D
COLORPLF    LDA #42     ;SET PLAYFIELD COLOR
    STA $02C4
    LDA #12
    STA $02C5
    LDA #206
    STA $02C6
COLORPLR    LDA #76     ;SET PLAYER COLOR
    STA $02C0
    LDA #196
    STA $02C3
    LDA #72
    STA $02C1
    LDA #14
    STA $02C2
    RTS
;
;SUBROUTINE PLOR0:SETS POINTER
;TO START OF PLAYER 0 AND
;SETS X TO POINT TO PLAYER0
;VARIABLES
;
PLOR0    LDX #0
    LDA # >PL0R
    BNE PLSRX
;
;SUBROUTINE PLIR1:SAME AS
;PLOR0 EXCEPT FOR PLAYER 1
;
PLIR1    LDX #1
    LDA # >PL1R
    BNE PLSRX
;
;SUBROUTINE PLSR2:SAME AS
;PLOR0 EXCEPT FOR PLAYER 2
;
PLSR2    LDX #2
    LDA # >PL2R
PLSRX    STA TEMP11+1
    LDA # <PL2R
    STA TEMP11
    RTS
;
;SUBROUTINE MOVGHOST :JUMPS
;SUBRS TO SET POINTERS
;FOR CORRESPONDING PLAYER,
;CHANGES DRAWING BY SUB CHG1,
;CHANGES VERTICLE POSITION
;BY SUB HEIGHT,AND CHANGES
;HORIZONTAL POSITION BY
;SUB MOVP (MOVE PLAYERYS)
;
MOVGHOST    JSR PLOR0
    JSR HEIGHT
    LDX #0
    JSR CHG1
    JSR PLIR1
    JSR HEIGHT
    LDX #1
    JSR CHG1
    JSR PLSR2
    JSR HEIGHT
    LDX #2
    JSR CHG1
    JMP MOVP
;
;SUBROUTINE HEIGHT:MOVES
;DRAWING OF GHOST UP OR DOWN
;1 POSITION WITHIN PLAYER 0-2.
;DRAWING DOES NOT MOVE ABOVE
;POSITION 52 OR BELOW 175.
;ONCE DRAWING REACHES BOUNDARY
;(52 OR 175) GFLAG IS SET SO
;DRAWING IS MOVED THE OTHER
;DIRECTION.
;
;
HEIGHT    LDA GTOP,X     ;LOAD GHOST TOP
    CMP #52     ;UPPER LIMIT?
    BNE NX1
    LDA #0     ;YES THEN SET FLAG
    STA GFLAG,X
NX1    CMP #175     ;LOWER LIMIT?
    BNE NX2
    LDA #1     ;YES THEN SET FLAG
    STA GFLAG,X
NX2    LDA GFLAG,X     ;GET FLAG
    BEQ NX3     ;IF=0 MOVE GHOST UP
    DEC GTOP,X     ;NEW POS (OLD POS-1)
    LDY GTOP,X
    LDX #11     ;HIEGHT OF GHOST
NX4    INY
    LDA (TEMP11),Y     ;OLD POS
    DEY
    STA (TEMP11),Y     ;NEW POS
    INY      ;NEXT DRAWING BYTE
    DEX
    BPL NX4     ;DONE?
    RTS
NX3    LDA GTOP,X     ;LOAD TOP OF GHOST
    INC GTOP,X     ;NEW POS
    CLC
    ADC #10     ;BOTTOM OF GHOST
    TAY
    LDX #11     ;HIEGHT OF GHOST+1
NX5    LDA (TEMP11),Y     ;OLD POS
    INY
    STA (TEMP11),Y     ;NEW POS
    DEY      ;RESET POINTER
    DEY      ;NEXT BYTE
    DEX
    BPL NX5     ;DONE?
    RTS
;
;SUBROUTINE CHG1:CHANGES
;THE DRAWING(OF A GHOST)
;THAT IS IN PLAYER 0-2
;
CHG1    INC GCNT1,X     ;ADD 1 TO COUNTER OF DELAY
    LDA GCNT1,X     ;BEFORE GHOST DRAWING CHANGES
    CMP #4
    BCC NCHG     ;IF<4 NO CHANGE
    LDA #0     ;ELSE SET POINTER TO
    STA GCNT1,X     ;NEXT DRAWING
    CLC      ;OF GHOST  (ONLY 2 DRAWINGS ARE USED)
    LDA GH1ST,X
    ADC #11
    CMP #22
    BNE GST1
    LDA #0
GST1    STA GH1ST,X     ;SAVE POINTER TO DRAWING
    STA TEMP1     ;ALSO TEMPORARY SAVE
    LDA GTOP,X     ;LOAD VERT POS OF GHOST
    TAY
    CLC      ;SET UP TO ADD
    ADC #11     ;ADD 11 TO FIND BOTTOM
    STA GTEMP     ;OF GHOST AND SAVE VALUE
    LDX TEMP1
GST11    LDA GHOST,X     ;GET DRAWING BYTE
    STA (TEMP11),Y     ;SAVE IN PLAYER
    INX      ;NEXT DRAWING BYTE
    INY      ;NEXT POS WHERE DRAWING IS GOING
    CPY GTEMP     ;DRAWING CHANGED?
    BNE GST11     ;IF EQ THEN DONE
NCHG    RTS      ;EXIT
;
;SUBROUTINE PLAYERS:SETS
;INITIAL VALUE OF POINTER
;OF PLAYER0-2 AND READS
;DRAWING OF GHOST INTO THE
;PLAYERS.
;
PLAYERS    LDX #10     ;HIEGHT OF GHOST-1
    LDA #70
    STA GTOP     ;PLAYER0 GHOST TOP
    LDA #95
    STA GTOP1     ;PLAYER1 GHOST TOP
    LDA #170
    STA GTOP2     ;PLAYER2 GHOST TOP
PL1    LDA GHOST,X     ;READ IN DRAWING
    STA PL0R+70,X     ;OF GHOST AND
    STA PL1R+95,X     ;STORE IN PLAYERS
    STA PL2R+170,X
    DEX
    BPL PL1
    STX HPOSP0     ;SET HORIZONTAL
    STX HPOSP1     ;REGISTERS
    STX HPOSP2
    STX P0     ;SET HORIZONTAL
    STX P1     ;POINTERS
    STX P2
    RTS
;
;SUBROUTINE MOVP:DECREMENTS
;POINTER OF CURRENT HORIZONTAL
;POSITION OF PLAYERS 0-2
;AND STORES NEW VALUE
;
MOVP    DEC P0
    DEC P0
    LDA P0
    STA HPOSP0
    LDA SCOUNT     ;GET SCORE COUNT
    CMP #20     ;IF < 20 THEN ONLY
    BCC NMP     ;1 GHOST
    DEC P1
    LDA P1
    STA HPOSP1
    LDA SCOUNT
    CMP #50     ;IF < 50 THEN ONLY
    BCC NMP     ;2 GHOSTS
    DEC P2
    DEC P2
    DEC P2
    LDA P2
    STA HPOSP2
NMP    RTS
;
;SUBROUTINE GHOSTM:CLEARS MISSILE
;MEMORY,READS IN GHOST DRAWING
;SETS HORIZONTAL POSITION
;
GHOSTM    LDX #0
    TXA
ZMIS    STA MIS,X     ;CLEAR MISS'S
    INX
    BNE ZMIS
    LDA RANDOM     ;GET RANDOM #
    STA $02C7     ;SET PLFLD COLOR
    LDX #9     ;GHOST HIEGHT-1
    LDY GUNBOT     ;Y IS POINTER BOT OF GHOST
SLOOP    LDA GHOST2,X     ;READ IN/SAVE
    STA MIS,Y     ;GHOST DRAWING
    DEY
    DEX
    BPL SLOOP
    LDA #242     ;SET HORIZ POS OF
    STA P4     ;MISS SAVE IN CORRESPONDING
    STA HPOSM0     ;REGISTERS/POINTERS
    LDA #240
    STA P5
    STA HPOSM1
    LDA #238
    STA P6
    STA HPOSM2
    LDA #236
    STA P7
    STA HPOSM3
    RTS
;
;SUBROUTINE LINECNT:LOADS
;ZERO PAGE VARIABLE TEMP12
;WITH START ADDRESS OF A
;LINE OF THE PLAYFIELD
;SCREEN.TEMP12 CAN POINT TO
;LINES 4 THRU 20.
;
LINECNT    LDA TEMP12     ;LOAD CURRENT SCREEN LINE
    CLC
    ADC #40     ;ADD # OF BYTES PER LINE
    STA TEMP12     ;TEMP12 POINTER
    LDA TEMP12+1     ;TO NEXT LINE
    ADC #0
    STA TEMP12+1
    CMP # >ENDSC     ;END OF PLFLD IS ENDSC
    BNE EXITSC
    LDA TEMP12     ;IF NOT = EXIT
    CMP # <ENDSC
    BNE EXITSC     ;ELSE IF = RESET TEMP12
ORGIN    LDA # >LEV0     ;SET TEMP12
    STA TEMP12+1     ;TO POINT TO
    LDA # <LEV0     ;1ST PLAYFIELD
    STA TEMP12     ;LINE
EXITSC    RTS
;
;SUBROUTINE FORCE:CONTROLLS THE
;FLASHING CHARACTER THAT IS
;DISPLAYED IN BOTTOM ROW.
;CHARACTER FLASHES BY ALTERNATING
;THE ACTUAL DRAWING WITH THE
;ZERO CHARACTER
;
FORCE    LDY TEMP13     ;SET POINTER TO
    DEY      ;WHERE FLASHING CHAR IS
    DEY      ;GOING
    LDA LEV7,Y     ;DOES NEW POS HAVE
    CMP #21     ;KING CHAR IN IT
    BEQ EX13     ;IF YES THEN EXIT
    LDA LEV7,Y     ;ELSE MAKE CHAR FLASH
    BEQ BOLT
    LDA #0     ;STORE ZERO TO REMOVE
    STA LEV7,Y     ;CHARACTER
    DEY
    STA LEV7,Y
EX13    RTS
BOLT    LDA #15     ;STORE CHARS THAT
    STA LEV7,Y     ;MAKEUP FLASHING
    DEY      ;CHAR
    LDA #19
    STA LEV7,Y
    RTS
;
;SUBROUTINE FINDCHAR:ACCEPTS
;VERTICLE POSITION OF PLAYER 3
;(THE GUN)AND CALCULATES THE
;CORRESPONDING PLAYFIELD
;ROW IN THAT POSITION
;
FINDCHAR    LDA STEMP2     ;LOAD PLAYR3 VERT POS
    SEC      ;SUBTRACT AREA WHERE PLAYER CAN
    SBC #$28     ;MOVE BUT THAT IS NOT ON PLAYFLD
    LSR A     ;DIVIDE BY HIEGHT OF
    LSR A     ;CHARACTER GIVES
    LSR A     ;# OF ROWS
    TAX
    LDA DLIST+6     ;LOAD CURRENT
    STA TEMP10     ;SCREEN ADDRESS
    LDA DLIST+7
    STA TEMP10+1
ROW    DEX      ;CALCULATE # ROW-1
    BMI EXIT30     ;TO FIND POS
    CLC      ;OF PLAYER 3
    LDA TEMP10
    ADC #40     ;# BYTES PER LINE
    STA TEMP10
    BCC ROW
    INC TEMP10+1
    BCS ROW
EXIT30    RTS
;
;SUBROUTINE ONE:WHEN ENERGY
;BOLT HITS TROLL,THIS
;SUBROUTINE ADDS 1 TO THE
;CURRENT SCORE
;
ONE    LDA SCOUNT
    CMP #250
    BEQ AD1
    INC SCOUNT
    LDA SCOUNT
    CMP #100
    BCC SN1
    LDA #10
    STA SD2
    JMP AD1
SN1    CMP #70
    BCC AD1
    LDA #20
    STA SD2
AD1    INC SCR4+13     ;HUNDERS COUNTER
    LDA SCR4+13
    CMP #26     ;>9
    BNE SC1     ;IF NO EXIT
    LDA #16     ;"0"
    STA SCR4+13
    INC SCR4+12     ;THOUSANDS
    LDA SCR4+12
    CMP #26     ;>9
    BNE SC1     ;IF NO EXIT
    LDA #16     ;"0"
    STA SCR4+12
    INC SCR4+11     ;TEN THOUSANDS
    LDA SCR4+11
    CMP #26     ;>9
    BNE SC1     ;IF NO EXIT
    LDA #16     ;"0"
    STA SCR4+13     ;RESET SCORE
    STA SCR4+12
    STA SCR4+11
SC1    RTS
SOUND    LDY SD     ;POINTER TO NOTE
    LDA SONG,Y     ;GET NOTE
    ASL A     ;LOWER OCTIVE
    STA $D206     ;PLAY NOTE
    INY      ;NEXT NOTE THAT WOULD PLAY
    CPY #32     ;32 NOTES TO PLAY
    BCC OKS     ;IF < CHECK DELAY
    LDA #0     ;ELSE RESET TO SONG START
    STA SD
    RTS
OKS    INC SD1     ;INC DELAY BEFORE NOTE PLAYS
    LDA SD1
    CMP SD2     ;CMP WITH SONG SPEED
    BNE OKS2
    INC SD     ;NEXT NOTE
    LDA #0     ;RESET DELAY
    STA SD1
OKS2    RTS
;
;SUBROUTINE JS15:SETS INITIAL
;POSITION OF PLAYER 3(THE
;GUN) AND READS IN THE
;DRAWING OF THE GUN
;
JS15    LDA #70     ;ENDING POSITION
    STA GUNBOT     ;OF GUN DRAWING
    LDA #62     ;STARTING POSITION
    STA GUNTOP     ;OF GUN DRAWING
    STA HPOSP3     ;HORIZ POS PLAYER3
    LDX #8     ;#BTYES GUN DRAWING-1
M1    LDA GUN,X     ;GET DRAWING BYTE
    STA PL3R+62,X     ;SAVE IN PLAYER
    DEX      ;NEXT BYTE
    BPL M1     ;DONE?
    RTS
;
;VERTICLE BLANK ROUTINE:
;
VBROUTIN    LDA GAMEOVER
    BEQ NOTOVER
    LDA #0
    STA $D206     ;TURN OFF SOUND
    STA $D204
    STA $D202
    STA $D200
    JMP XITVBV
NOTOVER    INC TIMER1     ;HIGH BYTE OF TIMER
    BNE NOTOV1
    INC TIMER2     ;LOW BYTE OF TIMER
NOTOV1    JSR FORCE
    JSR SOUND
    JSR MOVMIS
    LDA EXPTIM     ;GET SOUND VARIABLE
    BEQ NOEX     ;IF NE PLAY TROL HIT SOUND
    DEC EXPTIM     ;NEXT NOTE TO PLAY
    CMP #240
    BEQ OFF     ;IF NOTE =240 TURN OFF SOUND
    STA $D200     ;ELSE PLAY NOTE
    JMP NOEX
OFF    LDA #0     ;ZERO TO TURN OFF
    STA $D200
    STA EXPTIM
NOEX    LDA GUNFLAG     ;IF FLAG NE THEN FREEZE GUN
    BNE VB2
    LDA $D00F     ;ELSE CHECK SEE IF PLAYER 3 COLLISION
    BEQ VB1
VB3    LDA #90     ;90 COUNTS OF GUN FREEZE
    STA GUNFLAG
    LDA #78     ;CHANGE COLOR OF GUN
    STA $02C3
VB2    LDA #0     ;CLEAR COLLISION
    STA $D01E
    STA $D202     ;TRUN OFF GUN FIRE SOUND
    JSR MOVGHOST
    DEC GUNFLAG     ;DEC GUN FREEZE DELAY
    JMP XITVBV
VB1    LDA #0     ;HIT CLEAR
    STA $D01E
    JSR MISSILE
    JSR MOVGHOST
    LDA #196     ;RESTORE GUN COLOR
    STA $02C3
;
;SUBROUTINE JOYSTICK:READS
;VALUE OF JOYSTICK 0.IF VALUE
;IS 13 THEN PLAYER3 DRAWING
;(THE GUN) IS MOVED DOWN ONE
;POSITION.IF VALUE IS 14 THEN
;GUN IS MOVED UP ONE POSITION
;
JOYSTICK    LDA $0278     ;LOAD VALUE OF STICK 0
    CMP #13     ;IS IT 13
    BNE STICK14     ;NO CMP WITH OTHERS
    LDX GUNBOT     ;BOTTOM OF GUN
    LDY #12     ;HIEGHT OF GUN
    CPX #184     ;LOWER LIMIT CAN
    BCS EXIT     ;NOT MOVE PAST
DOWN    LDA PL3R-1,X     ;MOVE DRAWING
    STA PL3R,X     ;DOWN 1 BYTE
XP2    DEX      ;NEXT BYTE
    DEY
    BNE DOWN
    INC GUNTOP     ;NEW POSITION
    INC GUNBOT
    JMP XITVBV
STICK14    CMP #14     ;STICK0=14?
    BNE EXIT     ;NO EXIT
    LDX GUNTOP     ;TOP OF GUN
    LDY #12     ;HIEGHT OF GUN
    CPX #56     ;UPPER LIMIT CAN
    BCC EXIT     ;NOT MOVE PAST
UP    LDA PL3R+1,X     ;MOVE DRAWING
    STA PL3R,X     ;UP 1 BYTE
XP3    INX      ;NEXT BYTE
    DEY
    BNE UP
    DEC GUNTOP     ;NEW POSITION
    DEC GUNBOT
EXIT    JMP XITVBV
;
;SUBROUTINE MISSILE:READS
;VALUE OF TRIGGER 0.IF PUSHED
;AND A DELAY OF 16 HAS PASSED
;THEN AN ENERGY BOLT CHARACTER
;IS DISPLAYED AT PLAYFIELD
;POSITION CORRESPONDING TO
;PLAYER 3(GUN) POSITION
;
MISSILE    LDA $0284     ;READ TRIGGER0
    BEQ FIRE     ;IF PUSHED FIRE ENERGY
NOMIS    LDA #0     ;IF NOT TURN OFF
    STA $D202     ;SOUND OF GUN FIRE
    RTS
FIRE    INC VBCNT     ;INC DELAY COUNTER
    LDA VBCNT     ;MUST BE 16 BEFORE
    CMP #11     ; GUN CAN FIRE
    BCC NOMIS     ;IF<16 EXIT
    LDA #150     ;GUN FIRE NOTE
    STA $D202     ;PLAY NOTE
    LDA #0     ;RESET COUNTER
    STA VBCNT
    LDA GUNTOP     ;VERT POS GUN TOP
    CLC
    ADC #4     ;MIDDLE OF GUN
    STA STEMP2     ;TEMPORARY SAVE
    JSR FINDCHAR     ;GET PLAYFLD BYTE
    LDY #5     ;IS BYTE WHERE GUN IS
    LDA (TEMP10),Y     ;CLEAR? IF
    BNE NOMIS     ;NO THEN EXIT
    LDA #15     ;IF YES FIRE GUN
    STA (TEMP10),Y
    RTS
;
;SUBROUTINE MOVEMIS:CHECKS
;EACH BYTE OF PLAYFIELD
;FOR ENERGY BOLT CHARACTER
;IF IT IS A BOLT CHARACTER
;THEN THAT CHAR IS MOVED
;RIGHT ONE BYTE.(ENERGY BOLT
;CHAR IS #15 AND CHAR #19)
;ALSO CHANGES GEM'S RIGHT
;CHARACTER (#17 OR #18)
;CHANGING CHARACTER FROM
;#17 TO #18 MAKES GEM FLICKER
;TEMP12 HOLDS START ADDRESS
;OF A LINE OF PLAYFIELD
;
MOVEMIS    LDX #15     ;#PLAYFLD LINES-1
MVS1    LDY #36     ;# OF BYTES TO CHECK
MSLOOP    LDA (TEMP12),Y     ;GET LINE BYTE
    CMP #17     ;IS IT A GEM CHARACTER
    BNE MSX1     ;NO,CHECK OTHER CHAR
    LDA #18     ;YES,DISPLAY OTHER GEM
    STA (TEMP12),Y
    JMP NEXTMS     ;GET NEXT BYTE
MSX1    CMP #18     ;IS IT A GEM CHAR
    BNE MSX2     ;NO CHECK FOR MISSILE CHAR
    LDA #17     ;YES CHANGE GEM
    STA (TEMP12),Y
    JMP NEXTMS     ;GET NEXT BYTE
MSX2    CMP #15     ;IS IT MISSILE CHAR
    BEQ MSX3     ;IF YES JMP TO LOAD OTHER MISSILE CHAR
    CMP #19     ;IS IT OTHER MISSILE CHAR
    BNE NEXTMS     ;IF NO,GET NEXT BYTE
    LDA #15     ;LOAD MISSILE CHAR
    JMP MSX4
MSX3    LDA #19     ;LOAD MISSILE CHAR
MSX4    STA BOMB     ;TEMPORARY SAVE
    LDA #0     ;REMOVE OLD MISSILE CHAR
    STA (TEMP12),Y
    CPY #36     ;IS BYTE # 36
    BEQ NEXTMS     ;IF YES DO NOT DISPLAY NEW CHAR
    INY      ; ELSE GET NEXT BYTE TO RIGHT
    LDA (TEMP12),Y     ;IS BYTE CLEAR
    BNE REMVMIS     ;IF NO TROLL HIT
    LDA BOMB     ;ELSE MOVE MISSILE
    STA (TEMP12),Y     ;RIGHT 1 BYTE
    JMP NEXTMS     ;GET NEXT LINE BYTE
REMVMIS    LDA #0     ;"0" TO CLEAR
    STA (TEMP12),Y     ;LEFT HALF OF TROLL DRAWING
    INY      ;MOVE POINTER TO RIGHT HALF DRAWING
    STA (TEMP12),Y     ;REMOVE
    LDA #255     ;LOAD DELAY FOR SOUND WHEN
    STA EXPTIM     ;TROLL HIT
    JSR ONE     ;ADD 1 TO SCORE
NEXTMS    DEY      ;NEXT BYTE
    BNE MSLOOP
    JSR LINECNT     ;NEXT ROW
    DEX
    BPL MVS1     ;DONE?
    RTS
;
;SUBROUTINE FACELEFT:CHECKS
;38TH BYTE OF EACH PLAYFIELD
;LINE TO SEE IF CHARACTER IN
;THAT BYTE IS FRONT VIEW OF
;TROLL.IF IT IS THEN THE TROLL
;DRAWING IS REPLACED WITH
;DRAWING OF TROLL FACING LEFT
;
FACELEFT    LDY #38     ;BYTE 38
    LDA (TEMP12),Y     ;TEMP12 HOLDS CURRENT LINE
    CMP #5     ;FRONT VIEW OF TROLL
    BNE EXIT20     ;NO,EXIT
    LDA #9     ;CHAR,RIGHT HALF OF TROLL FACING LEFT
PLACE    STA (TEMP12),Y
    LDA #8     ;CHAR LEFT HALF OF TROLL
    DEY
    STA (TEMP12),Y
EXIT20    RTS
;
;SUBROUTINE MOVCRQ:MOVES
;TROLL CHARACTER LEFT
;ONE BYTE AND CHANGES DRAWING
;OR DOES NOT MOVE TROLL BUT
;CHANGES DRAWING.
;ALSO CHECKS TO SEE WHAT
;(IF ANY) IS IN FRONT OF
;TROLL
;DRAWING OF TROLL IS TWO BYTES
;CHARACTER 8&9 OR CHAR 6&7.
;IF CURRENT TROLL DRAWING IS
;CHAR 6&7 THEN TROL DRAWING
;IS CHANGED TO CHAR 8&9.
;IF CURRENT DRAWING IS
;CHAR 8&9 THEN DRAWING IS
;CHANGED TO CHAR 6&7 AND TROLL
;IS MOVE LEFT ONE BYTE.
;
MOVCRQ    LDY #2     ;PLAYFLD BYTE TO START AT
RF1Q    LDA (TEMP12),Y     ;LOAD BYTE
    CMP #7     ;TROLL CHARACTER?
    BNE RF2Q     ;IF NE CMP WITH OTHER CHAR
    LDA #9     ;ELSE,LDA NEW TROLL DRAWING
    STA (TEMP12),Y     ;SAVE
    DEY
    LDA #8     ;OTHER HALF OF TROLL
    STA (TEMP12),Y     ;SAVE
    INY      ;RESET POINTER
    JMP RF4Q     ;GET NEXT BYTE OF LINE
RF2Q    CMP #9     ;TROLL CHARACTER?
    BEQ TRL9     ;IF NO THEN GET NEXT BYTE
    JMP RF4Q
TRL9    DEY      ;MOVE POINTER TO FIND
    DEY      ;BYTE (CHARACTER) IN FRONT OF TROLL
    LDA (TEMP12),Y     ;LOAD BYTE
    BEQ RFR3     ;IF = MOVE TROLL
    CMP #17     ;IS CHARACTER IN
    BEQ GEM     ;FRONT OF TROLL A
    CMP #18     ;GEM CHARACTER?
    BEQ GEM     ;IF YES HAVE TROLL TAKE GEM
    CMP #5     ;ELSE IS CHARACTER ANOTHER TROLL?
    BEQ DISTRL     ;IF YES THEN DISPLAY TROLL
    INY      ;RESTORE POINTER
    INY
    JMP RF4Q     ;GET NEXT BYTE
DISTRL    TYA      ;TEMPORARY SAVE POINTER
    TAX
    DEC TEMP13     ;SET POINTER FOR
    DEC TEMP13     ;POSITION WHERE
    LDY TEMP13     ;TROLL IS PLACED ON LOWEST PLAYFLD LINE
    CPY #1     ;IS THAT POINTER BYTE 1?
DONE2    BNE NONE2     ;IF IT IS BYTE 1
DONE21    LDA #14     ;THEN HAVE TROLL
    STA LEV7,Y     ;DISTROY GEM IN LOWER
    LDA #13     ;LEFT CORNER OF PLAYFLD
    DEY
    STA LEV7,Y
    LDA #1
    STA GAMEOVER
    LDA #30
    STA SD2
    JSR GOVER
    JMP START     ;IF YES RESET GAME
NONE2    LDA #5     ;IF BYTE # <> 1
    STA LEV7,Y     ;THEN DISPLAY
    DEY      ;ANOTHER TROLL
    LDA #4     ;ON LOWEST LINE
    STA LEV7,Y     ;OF PLAYFLD
    TXA      ;RESTORE POINTER
    TAY
    JMP REMTRL     ;REMOVE OLD TROLL DRAWING
GEM    LDA #5     ;IF CHAR IN FRONT OF TROLL
    STA (TEMP12),Y     ;IS A GEM CHAR
    DEY      ;THEN REPLACE GEM WITH
    LDA #4     ;FRONT VIEW OF TROLL
    STA (TEMP12),Y
    INY
REMTRL    INY      ;SET POINTER SO TROLL
    LDA #0     ;DRAWING IS REMOVED
    STA (TEMP12),Y
    INY
    STA (TEMP12),Y
    JMP RF4Q     ;NEXT BYTE
RFR3    LDA #6     ;LEFT HALF DRAWING
    STA (TEMP12),Y     ;NEW POSITION
    INY      ;MOVE POINTER RIGHT
    LDA #7     ;RIGHT HALF OF DRAWING
    STA (TEMP12),Y     ;NEW POS
    INY      ;MOVE POINTER RIGHT
    LDA #0     ;REMOVE OLD DRAWING
    STA (TEMP12),Y
RF4Q    INY      ;NEXT BYTE OF LINE
    CPY #39     ;ALL BYTES CHECKED?
    BCS RF11     ;IF YES EXIT
    JMP RF1Q     ;ELSE CHECK NEW BYTE
RF11    RTS
;
;SUBROUTINE EGG:CHECKS 37TH
;BYTE OF EACH PLAYFIELD
;LINE TO SEE IF IT IS A
;CHARACTER THAT DEVELOPS
;INTO A TROLL CHARACTER
;TROLL FORMS OUT OF CHARACTER
;1,2,&3.FRONT VIEW OF TROLL
;IS CHARACTER 4&5.
;
EGG    LDY #37     ;SET POINTER TO BYTE 37
    LDA (TEMP12),Y     ;TEMP12 HOLDS ADDRESS OF LINE
    CMP #1     ;STARTING CHAR OF TROLL
    BNE RF5
    LDA #2     ;NEXT CHAR OF TROLL SEQUENCE
    STA (TEMP12),Y
    RTS
RF5    CMP #2     ;CONTINUE TO FORM TROLL
    BNE RF7
    LDA #3     ;3RD CHAR OF TROLL SEQUENCE
    STA (TEMP12),Y
    RTS
RF7    CMP #3     ;CONTINUE TO FORM TROLL
    BNE RF6
    INY
    LDA (TEMP12),Y
    BEQ RS
    RTS
RS    LDA #5     ;RIGHT HALF OF TROLL,FRONT VIEW
    STA (TEMP12),Y
    DEY
    LDA #4     ;LEFT HALF OF TROLL
    STA (TEMP12),Y
RF6    RTS
;
;SUBROUTINE TROLL:EVALUATES
;TABLE VALUE THAT REPRESENTS
;DELAY BEFORE TROLL IS FORMED,
;TURNED LEFT,AND MOVED.
;
TROLL    LDX #15     ;# OF PLAYFLD ROWS-1
OO1    LDA TABLE1,X     ;LOAD DELAY
    CMP #255     ;IF < 255 ADD 1 TO
    BCC OO2     ; DELAY AND GET NEXT LINE
    JSR MOVCRQ     ;MOVE TROLL
    JSR FACELEFT     ;TURN TROLL LEFT
    JSR EGG     ;START TROLL FORMING
    LDA TABLE6,X     ;RESET DELAY
    STA TABLE1,X
    CMP #253     ;253 IS LEAST AMOUNT OF DELAY
    BCS OO2     ;GET NEXT LINE
    INC TABLE6,X     ;SPEED UP DELAY
OO2    INC TABLE1,X
    JSR LINECNT     ;SET TEMP12 TO NEXT LINE
    DEX      ;DONE CHECKING LINES?
    BPL OO1     ;IF<0 THEN DONE
    RTS
;
;SUBROUTINE DISPEGG:EVALUATES
;TABLE VALUE THAT REPRESENTS
;DELAY BEFORE CHARACTER
;THAT FORMS INTO A TROLL
;WILL APPEAR
;
DISPEGG    LDX #15     ;# OF ROWS -1
    LDY #37     ;BYTE WHERE TROLL APPEARS
OO5    LDA TABLE3,X     ;CHECK DELAY
    BNE OO6     ;IF HIGH&LOW TABLE BYTES
    LDA TABLE2,X     ;ARE ZERO THEN
    BEQ OO7     ;FORM TROLL
OO6    SEC      ;ELSE DEC DELAY
    LDA TABLE2,X
    SBC #1
    STA TABLE2,X
    LDA TABLE3,X
    SBC #0
    STA TABLE3,X
    JMP OO4
OO7    LDA (TEMP12),Y     ;IS TROLL ALREADY DISPLAYED
    BNE OO4     ;IF YES THEN GET NEXT LINE
    LDA #15     ;ELSE RESET TABLE
    STA TABLE2,X
    LDA TABLE5,X
    STA TABLE3,X
    LDA #1     ;DISPLAY START OF TROLL
    STA (TEMP12),Y
OO4    JSR LINECNT     ;NEXT LINE
    DEX      ;16 LINES CHECKED?
    BPL OO5
    RTS
;
MOVMIS    LDA $D009     ;IS MISS 1 TOUCHING PLAYER3
    CMP #8     ;IF 8OR> THEN YES
    BCC NM1
    JMP NM3
NM1    LDA $D00B     ;IS MISS 2 TOUCHING PLAYER3
    CMP #8
    BCC NM2
NM3    LDA #90     ;LOAD LENGHT OF DELAY
    STA GUNFLAG     ;STORE TO FREEZE GUN
    LDA #78     ;CHANGE COLOR OF GUN
    STA $02C3
NM2    LDA SCOUNT     ;IF SCORE>70 THEN MOVE GHOST
    CMP #70
    BCC MEXIT
    DEC P5     ;SET NEW POS OF MISILE
    DEC P5     ;AND SAVE
    LDA P5
    STA HPOSM1
    DEC P7
    DEC P7
    LDA P7
    STA HPOSM3
    DEC P6
    DEC P6
    LDA P6
    STA HPOSM2
    DEC P4
    DEC P4
    LDA P4
    STA HPOSM0
    CMP #10
    BCS MEXIT
    JSR GHOSTM
MEXIT    RTS
;
;SUBROUTINE GOVER:USED AT
;END OF GAME.PRINTS OUT MESSAGE
;"GAME OVER" AND CHECKS TO
;SEE IF START KEY IS PRESSED.
;
GOVER    LDA # >LEV2     ;LOAD ADDRESS OF
    STA TEMP12+1     ;LINE WHERE MESSAGE
    LDA # <LEV2     ;IS TO PRINT
    STA TEMP12
    LDY #39     ;# OF BYTES-1 PER ROW
    LDA #0     ;ZERO TO CLEAR ROW
GV1    STA (TEMP12),Y     ;CLEAR ROW
    LDA #0
    DEY
    CPY #3
    BNE GV1
    LDA #42     ;SET COLOR PLFD3
    STA $02C7
    LDY #29     ;DISPLAY RIGHT TROLL
    LDA #5
    STA (TEMP12),Y
    DEY
    LDA #4
    STA (TEMP12),Y
    DEY
    LDA #9     ;DISPLAY TROLL THAT WALKS
    STA (TEMP12),Y     ;AND PRINTS MESSASE
    DEY
    LDA #8
    STA (TEMP12),Y
    LDA #14     ;POINTER TO LETTER OF
    STA TEMP1     ;MESSAGE
GV2    LDY #11     ;CHECK TO SEE IF
    LDA (TEMP12),Y     ;MESSAGE IS DONE
    BNE GV5     ;IF <> THEN DONE
    JSR DELAY     ;ELSE DELAY
    JSR MOVCRQ     ;MOVE TROLL LEFT
    LDY #11     ;CHECK TO SEE IF
GV3    LDA (TEMP12),Y     ;TROLL HAS MOVED
    CMP #6     ;IF CHAR 6 THEN TROLL MOVED
    BEQ GV4     ;SO IF EQ PRINT MESSAGE
    INY
    CPY #26     ;CHECK ROW THAT MESSAGE IS PRINTED
    BNE GV3     ;IN ORDER TO FIND A TROLL
    JMP GV2
GV4    LDX TEMP1     ;LOAD POINTER TO MESSAGE LETTER
    LDA SCR7,X     ;GET LETTER
    STA LEV2+13,X     ;DISPLAY
    DEC TEMP1     ;NEXT LETTER
    JMP GV2
GV5    LDA #4     ;IF MESSAGE DONE
    STA (TEMP12),Y     ;PRINT FRONT TROLL
    INY      ;AT THE FAR LEFT
    LDA #5
    STA (TEMP12),Y
GV0    DEC $02C7
    LDA $D01F     ;IS START KEY PRESSED
    CMP #6
    BEQ GEXIT
    JMP GV0
GEXIT    RTS
;
;SUBROUTINE DELAY
;
DELAY    LDX #255
D1    LDY #255
D2    DEY
    BNE D2
    DEX
    BNE D1
    RTS
;
;MAIN PROGRAM START1:DISPLAYS
;STARTING MESSAGE ,WALKING TROLL
;,AND GAME TITLE
;
START1    LDA $02F4     ;SAVE CHAR BASE ADDRESS
    STA TR
    LDA # >CHAR     ;STORE REDEFINED
    STA $02F4     ;CHAR BASE ADDRESS
    STA CHBASE
    JSR ZEROSC     ;CLEAR SCREEN
    JSR INITIAL
    LDX #59
    LDA #0
ST10    STA SCR4,X     ;CLEAR SCORE SCREEN
    DEX
    BPL ST10
    LDX #39
ST6    LDA SCR6,X     ;DISPLAY MESSAGE
    STA LEV2,X
    DEX
    BPL ST6
    LDA #14     ;COLOR WHITE
    STA $02C7
ST7    DEC $02C7     ;FADE MESSAGE
    JSR DELAY
    LDA $02C7     ;MESSAGE GONE?
    BNE ST7
    JSR ZEROSC
    LDY #35     ;SET POINTER FOR DISPLAYING
    LDA #6     ;TROLL
    STA LEV1,Y
    INY
    LDA #7
    STA LEV1,Y
    LDA # >LEV1     ;SET TEMP12 TO
    STA TEMP12+1     ;LINE WHERE
    LDA # <LEV1     ;TROLL WALKS
    STA TEMP12
ST    JSR MOVCRQ     ;MOVE TROLL
    JSR DELAY
    LDY #19
    LDA (TEMP12),Y     ;IS TROLL AT LINE
    BEQ ST     ;BYTE 19?
    LDA #4     ;IF YES THEN DISPLAY
    STA (TEMP12),Y     ;FRONT VIEW OF TROLL
    LDA #5
    INY
    STA (TEMP12),Y
    JSR DELAY
    JSR DELAY
    LDA #42     ;COLOR ORANGE
    STA $02C7
    LDX #39     ;DISPLAY "TROLL WAR"
ST9    LDA SCR52,X     ;READ IN LETTER
    STA SCR5,X     ;DISPLAY LETTER
    DEX
    BPL ST9
    JSR DELAY
    JSR DELAY
    JSR DELAY
    JSR DELAY
    LDA #4     ;BUILD REMAINING
    STA SCR5+7     ;PICTURES (OF TOLLS)
    STA SCR5+17     ;THAT ARE DISPLAYED
    STA SCR5+21     ;AT TOP OF SCREEN
    STA SCR5+28
    LDA #5
    STA SCR5+8
    STA SCR5+18
    STA SCR5+22
    STA SCR5+29
    LDA #20
    STA SCR5+19
    LDA #21
    STA SCR5+20
    LDX #19
ST8    LDA SCR42,X     ;READ IN "SCORE00000"
    STA SCR4,X     ;SAVE/DISPLAY
    DEX
    BPL ST8
;
;SUBROUTINE START:JUMPS
;TO SUBROUTINES TO INITIALIZE
; GAME
;
START    JSR SETTBL6
    JSR INITIAL
    JSR ZEROSC
    JSR JS15
    JSR GHOSTM
    LDA #7
    LDX # >VBROUTIN
    LDY # <VBROUTIN
    JSR $E45C
    JSR ORGIN
    JSR WALL
    JSR PLAYERS
;
;MAIN LOOP :CONTROLS PLAY
;OF GAME.
MAINLOOP    LDA #0
    STA 77
    INC $02C7     ;CHANGE COLOR OF MISSILE GHOST
    JSR ORGIN
    JSR TROLL
    JSR DISPEGG
    LDA SCOUNT
    CMP #131
    BCC MN1
    JSR DISPEGG
    LDA SCOUNT
    CMP #160
    BCC MN1
    JSR DISPEGG
MN1    JSR MOVEMIS
    LDA TIMER2     ;TIMER1&2 ARE DELAYS
    CMP #2     ;BEFORE TROLL APPEARS,IF=2
    BCC NOSH     ;THEN SPEED UP APPEARANCE
    LDX #15     ;BY SHIFTING VALUE
OO8    LSR TABLE3,X     ;OF TABLE3 RIGHT
    DEX      ;ONE BIT
    BPL OO8
    LDA #0     ;RESET TIMERS
    STA TIMER1
    STA TIMER2
NOSH    JMP MAINLOOP
;
;MISC WORKSPACE
;
SCR1        40
LEV9        40
LEV0        80
LEV1        240
LEV2        240
LEV3        80
ENDSC        40
LEV7        40
LEV8        80
LEV4        80
TABLE1        16
TABLE6        16
TABLE2        16
TABLE3        16
SCR4        20
SCR5        40
;
    *= $02E0
    .WORD START1
