; ; 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 STA 561 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 # ENDSC ;END OF PLFLD IS ENDSC BNE EXITSC LDA TEMP12 ;IF NOT = EXIT CMP # LEV0 ;SET TEMP12 STA TEMP12+1 ;TO POINT TO LDA # 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 # 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 # VBROUTIN LDY #