01 .OPT NO LIST 0100 ;*********************** 0110 ;* * 0120 ;* 'BOULDER BOMBERS' * 0130 ;* by * 0140 ;* Mark Price * 0150 ;* * 0160 ;*********************** 0170 ; 0180 ; ZERO-PAGE VARIABLES 0190 ; 0200 *= $12 0210 ; 0220 CLOCK 1 0230 DELYVAL 1 0240 DIR 1 0250 EXPLODE 1 0260 HOLDIT 1 0270 MASK 1 0280 ONSCR 1 0290 PLAY 1 0300 PLAYERS 1 0310 RKILL 1 0320 TDIR 1 0330 XCOUNT 1 0340 YCOUNT 1 0350 BMBDRP 2 0360 BRUN 2 0370 DRPFREQ 2 0380 DRPRATE 2 0390 FREMEN 2 0400 BOMBS 2 0410 PLYRX 2 0420 PLYRY 2 0430 RCKHIT 2 0440 ROCKS 2 0450 SCRPTR 2 0460 ; 0470 ; KEYBOARD VARIABLES 0480 ; 0490 CH = $02FC 0500 CH1 = $02F2 0510 ; 0520 PMAREA = $3000 0530 PL0 = PMAREA+1024 0540 PL1 = PL0+256 0550 PL2 = PL1+256 0560 PL3 = PL2+256 0570 ; 0580 ROMCH = $E000 ;ROM CHR SET 0585 CHARS = $2C00 ;MY CHR SET 0590 ; 0600 ; SYSTEM EQUATES 0610 ; 0620 AUDCTL = $D208 0630 AUDC1 = $D201 0640 AUDC2 = $D203 0650 AUDC3 = $D205 0660 AUDC4 = $D207 0670 AUDF1 = $D200 0680 AUDF3 = $D204 0690 AUDF4 = $D206 0700 CHBASE = $D409 0710 COLBAK = $D01A 0720 COLPF0 = $D016 0730 COLPF1 = $D017 0740 COLPF2 = $D018 0750 COLPF3 = $D019 0760 COLPM0 = $D012 0770 COLPM1 = $D013 0780 COLPM2 = $D014 0790 COLPM3 = $D015 0800 CONSOL = $D01F 0810 DLIST = $D402 0820 DMACTL = $D400 0830 SDMCTL = $022F 0840 GRACTL = $D01D 0850 HITCLR = $D01E 0860 HPOSP0 = $D000 0870 HPOSP1 = $D001 0880 HPOSP2 = $D002 0890 HPOSP3 = $D003 0900 NMIEN = $D40E 0910 PL2PF = $D006 0920 PMBASE = $D407 0930 PORTA = $D300 0940 RANDOM = $D20A 0950 SIZEP0 = $D008 0960 SKCTL = $D20F 0970 TRIG0 = $D010 0980 ; 0990 *= $2000 1000 ; 1001 INIT LDX #111 ;COPY MY CHARS 1002 MYCHRS LDA MYCHARS,X 1003 STA CHARS,X 1004 DEX 1005 BPL MYCHRS 1010 LDA #0 ;DISABLE VBI 1020 STA NMIEN 1030 LDA #$34 ;SET COLORS 1040 STA COLPF0 1050 LDA #$28 1060 STA COLPF1 1070 LDA #$84 1080 STA COLPF2 1090 LDA #$C4 1100 STA COLPF3 1110 LDA #0 1120 STA COLBAK 1130 LDX #3 ;INIT PLAYERS 1140 STWIDTH STA SIZEP0,X 1150 DEX 1160 BPL STWIDTH 1170 LDA #$28 1180 STA COLPM0 1190 LDA #$84 1200 STA COLPM1 1210 LDA #$C8 1220 STA COLPM2 1230 LDA #$C8 1240 STA COLPM3 1250 LDA # >PMAREA 1260 STA PMBASE 1270 LDA #$3E 1280 STA DMACTL 1290 LDA #3 1300 STA GRACTL 1310 LDY #112 ;INIT CHR SET 1320 SETCH1 LDA ROMCH,Y 1330 STA CHARS,Y 1340 INY 1350 BNE SETCH1 1360 SETCH2 LDA ROMCH+256,Y 1370 STA CHARS+256,Y 1380 INY 1390 BNE SETCH2 1400 LDA # >CHARS 1410 STA CHBASE 1420 LDA #0 ;INIT VARS 1430 LDY #SCRPTR+1-CLOCK 1440 ZEROVAR STA CLOCK,Y 1450 DEY 1460 BPL ZEROVAR 1470 LDY #$27 ;SET SCREEN DISP 1480 CLRTOP STA CANYON,Y 1490 DEY 1500 BPL CLRTOP 1510 JSR SETSCRN 1520 LDA #0 ;INIT SOUND 1530 STA AUDCTL 1540 LDA #3 1550 STA SKCTL 1560 LDA #56 ;SET PLAYER 1570 STA PLYRY ; LANES 1580 LDA #72 1590 STA PLYRY+1 1600 ; 1610 RESTART LDA #44 ;SET PLAYER 1620 STA PLYRX ; START 1630 LDA #204 ; POSITIONS 1640 STA PLYRX+1 1650 LDA #0 ;TURN OFF SCREEN 1670 STA DMACTL 1680 STA AUDC3 ; EXPLOSIONS, 1690 STA EXPLODE 1700 STA AUDC4 ; AND BKG SOUND 1710 JSR PMCLR ;CLEAR PLAYERS 1720 LDA # DLIST1 1750 STA DLIST+1 1760 LDA #$FF ;SET GAME SPEED 1770 STA DELYVAL ; FOR TITLES 1780 LDA #1 ;SET START DIR 1790 STA DIR 1800 STA PLAY ;SET PLAY FALSE 1810 LDA #0 ;PLAYERS NOT 1820 STA ONSCR ; ON SCREEN 1830 LDA #$3E ;TURN SCREEN 1840 STA DMACTL ; BACK ON 1850 LDA #3 ; INIT CLOCK 1860 STA CLOCK 1870 GTCNSL LDA CONSOL ;CHECK CONSOL 1880 AND #3 ; SWITCHES 1890 CMP #1 ;SELECT PRESSED? 1900 BNE CHKSTRT ; NO, TRY START 1910 SELECT LDA CONSOL ; YES, WAIT FOR 1920 AND #2 ; KEY RELEASE 1930 BEQ SELECT 1940 LDA PLAYERS ;CHANGE # OF 1950 EOR #1 ; PLAYERS 1960 STA PLAYERS 1970 CLC 1980 ADC #$11 ; & SET ON SCREEN 1990 STA SCNOPLR 2000 BNE MOVET ;(MOVE PLAYERS) 2010 CHKSTRT CMP #2 ;IF START THEN 2020 BEQ START ; START GAME 2030 MOVET LDA ONSCR ;IF ON SCREEN, 2040 BNE MOVIT ; THEN MOVE 2050 LDA RANDOM ;ELSE, PICK OUT 2060 AND #1 ; NEW SHIP TYPE 2070 TAX 2080 LDA MASKS,X 2090 STA MASK ; & SET IT 2100 MOVIT JSR MOVEPLR ;MOVE PLAYERS 2110 JMP GTCNSL ;DO CHECK AGAIN 2120 ; 2130 START LDA CONSOL ;WAIT FOR KEY 2140 AND #1 ; RELEASE 2150 BEQ START 2160 LDA #3 ;SET GAME SPEED 2170 STA DELYVAL ; TO $FF+$04 2180 LDA #0 ;SET PLAY TRUE 2190 STA PLAY 2200 STA DMACTL ;TURN OFF SCREEN 2220 LDX #2 ;SET SCORES TO 2230 ZEROSCR STA SCORE1,X ; ZERO 2240 STA SCORE2,X 2250 DEX 2260 BPL ZEROSCR 2270 LDA #$10 2280 STA SCORE1+3 2290 STA SCORE2+3 2300 LDX #2 ;SET BOMBS LEFT 2310 LDA #$CD ; TO THREE 2320 STBMBC STA BOMB1,X 2330 STA BOMB2,X 2340 DEX 2350 BPL STBMBC 2360 LDA #3 2370 STA BOMBS 2380 STA BOMBS+1 2390 LDA #$11 ;SET NEXT FREE 2400 STA FREMEN ; BOMB AT 1000 2410 STA FREMEN+1 2420 LDA PLAYERS ;SET SECOND 2430 ASL A ; PLAYER MESSAGE 2440 ASL A ; TO 'PLAYER 2' 2450 ASL A ; OR 'COMPUTER' 2460 LDX #7 2470 TAY 2480 STP2MS LDA P2COMPT,Y 2490 STA P2MSG,X 2500 INY 2510 DEX 2520 BPL STP2MS 2530 LDA # DLIST2 ; SCREEN 2560 STA DLIST+1 2570 LDA #$3E ;TURN ON SCREEN 2580 STA DMACTL 2590 ; 2600 NEWSCRN JSR SETSCRN ;SET CANYON 2610 LDA #3 ;SET TYPE TO 2620 STA MASK ; BALLOON 2630 STA CLOCK ;AND BEGIN CLOCK 2640 LDA #1 2650 STA DIR ;DIR = RIGHT 2660 STA ROCKS+1 ;ROCKS IN 2670 LDA #42 ; CANYON=298 2680 STA ROCKS 2690 JSR PMCLR ;CLEAR PLAYERS 2700 LDA #0 ;SET PLAYERS ON 2710 STA ONSCR ; SCREEN=FALSE 2720 STA AUDF4 2730 LDA #44 ;SET START 2740 STA PLYRX ; POSITIONS 2750 LDA #204 ; OF PLAYERS 2760 STA PLYRX+1 2770 STA HITCLR ;CLEAR HITS 2780 LDA #8 ;#ROCKS PER BOMB 2790 STA RKILL ; (MAX) =8 2800 LDA DELYVAL ;SPEED UP THE 2810 CMP #$AF ; GAME JUST A BIT 2820 BEQ BMBLOOP ; (UNLESS ALREADY 2830 SEC ; AT MAX SPEED) 2840 SBC #4 2850 STA DELYVAL 2860 ; 2870 ; BOMB MOVEMONT, HIT CHECKS, 2880 ; SCORE AND HIGHSCORE SET 2890 ; 2900 BMBLOOP LDX #1 ;GET PLAYER INDEX 2910 BMBNLOP LDA BMBDRP,X ;IF BOMB NOT 2920 BNE CHKHITS ; DROPPED 2930 JMP CHKDRP ; CHECK TRIG 2940 CHKHITS LDA PL2PF,X ;BOMB HIT 2950 BNE CKHROK ; ANYTHING? 2960 JMP LWRBMB ; NO,MOVE BOMB 2970 CKHROK AND #7 ;IF HIT ONLY 2980 BNE BHITRK ; COLOR 3, IT 2990 JMP KILLBMB ; GETS ERASED 3000 BHITRK LDA #0 ;SET POINTER 3010 STA SCRPTR+1 ; INTO SCREEN 3020 LDA BMBDRP,X ; RAM WHERE THE 3030 SEC ; ROCK HIT IS. 3040 SBC #103 ;1ST, GET BOMB'S 3050 AND #$F8 ; Y-POS TRANS- 3060 STA SCRPTR ; LATED INTO 3070 ASL SCRPTR ; ROW NUMBER 3080 ASL SCRPTR ;AND MULTIPLY IT 3090 ROL SCRPTR+1 ; BY 40 3100 CLC 3110 ADC SCRPTR 3120 STA SCRPTR 3130 BCC GTP0 3140 INC SCRPTR+1 3150 GTP0 LDA PLYRX,X ;THEN, CHANGE 3160 SEC ; X-POS INTO THE 3170 SBC #47 ; COLUMN NUMBER 3180 LSR A 3190 LSR A 3200 CLC ;AND ADD IT ON 3210 ADC SCRPTR 3220 STA SCRPTR 3230 BCC GTPA 3240 INC SCRPTR+1 3250 GTPA CLC ; ADD SCREEN 3260 ADC # CANYON 3300 STA SCRPTR+1 3310 LDY #0 ;CLEAR INDEX 3320 LDA (SCRPTR),Y ; & GET CHAR 3330 BEQ GTP1 ;IF IT'S BLANK 3340 CMP #4 ; OR ABOVE 4 3350 BCC GOTCHR ; THIS ISN'T IT. 3360 GTP1 INY ; TRY AGAIN,ONE 3370 LDA (SCRPTR),Y ; RIGHT 3380 BEQ GTP2 3390 CMP #4 3400 BCC GOTCHR 3410 GTP2 LDY #$28 ;IF WE STILL 3420 LDA (SCRPTR),Y ; DON'T GET IT 3430 BEQ GTP3 ; TRY 1 DOWN 3440 CMP #4 3450 BCC GOTCHR 3460 GTP3 INY ;THEN, BOTH AT 3470 LDA (SCRPTR),Y ; ONCE 3480 BNE GCKRCK 3490 JMP LWRBMB ;IF BY THIS 3500 GCKRCK CMP #4 ; TIME, WE DONT 3510 BCC GOTCHR ; HAVE IT, THEN 3520 JMP LWRBMB ; GIVE UP 3530 GOTCHR ASL A ;HOLD SCORE= 3540 STA HOLDIT ; CHAR * 2 3550 LDA #0 ;ERASE ROCK ON 3560 STA (SCRPTR),Y ; SCREEN 3570 LDA ROCKS ;LOWER # OF 3580 SEC ; ROCKS LEFT 3590 SBC #1 3600 STA ROCKS 3610 BCS GOT1 3620 DEC ROCKS+1 3630 GOT1 LDA #$FE ;START EXPLOSION 3640 STA EXPLODE ; SOUND 3650 ; 3660 ; ADD ON TO SCORE 3670 ; 3680 LDY SCRNDX,X ;GET BASE INDEX 3690 LDA HOLDIT ; TO SCORES,AND 3700 CLC ; ADD TO SCORE 3710 ADC SCORE1,Y 3720 STA SCORE1,Y 3730 LDA #3 ;SET DIGIT # FOR 3740 STA HOLDIT ; ROLLOVER PROT. 3750 ADDSCR LDA SCORE1,Y ;DONE? 3760 BEQ CHKHI ; YES, CHECK HIGH 3770 CMP #26 ;DIGIT >10? 3780 BCC SCUNDX ; NO, GO RIGHT 3790 SEC ;SUB 10 FROM 3800 SBC #10 ; THIS DIGIT 3810 STA SCORE1,Y 3820 DEY ;POINT TO NEXT 3830 DEC HOLDIT 3840 BMI CHKHI ;ROLLOVER! LEAVE 3850 LDA SCORE1,Y ;GET DIGIT 3860 BNE SCBRK ;IF BLANK, SET 3870 LDA #$10 ; TO ZERO 3880 SCBRK CLC ;ADD 1 3890 ADC #1 3900 STA SCORE1,Y ; AND SAVE IT 3910 BNE ADDSCR ;CHECK THIS DIGIT 3920 SCUNDX INY ;GO RIGHT ONE 3930 INC HOLDIT ; DIGIT 3940 BNE ADDSCR 3950 ; 3960 ; CHECK FOR HIGH SCORE 3970 ; 3980 CHKHI LDA # SCORE1 ; TO SCORE FOR 4010 STA SCRPTR+1 ; PLAYER 1 4020 TXA ;IF IT ISN'T 4030 BEQ CHKSCR ; PLAYER 1, THEN 4040 LDA #10 ; ADD TO GET 4050 CLC ; POINTER FOR 4060 ADC SCRPTR ; PLAYER 2 4070 STA SCRPTR 4080 BCC CHKSCR 4090 INC SCRPTR+1 4100 CHKSCR LDY #0 ;BEGIN AT HI END 4110 CHECKSC LDA (SCRPTR),Y 4120 CMP HISCOR,Y ;COMPARE 'EM 4130 BEQ CKNXDG ;IF SAME,DO NEXT 4140 BCS STHISC ;IF PLAYER > SET 4150 BCC CHKFRM ;IF HIGH > SKIP 4160 CKNXDG INY ;DO NEXT DIGIT 4170 CPY #4 ;IF ALL DONE, 4180 BNE CHECKSC ; THEN IT'S THE 4190 BEQ CHKFRM ; SAME, SKIP 4200 ; 4210 ; SET HIGH SCORE 4220 ; 4230 STHISC LDY #3 ;COPY THE 4240 SETDIGT LDA (SCRPTR),Y ; NEW HIGH 4250 STA HISCOR,Y ; SCORE INTO 4260 DEY ; HISCOR 4270 BPL SETDIGT 4280 ; 4290 ; CHECK FOR GETTING EXTRA BOMBS 4300 ; 4310 CHKFRM LDY SCRNDX,X ;GET SCORE 4320 LDA SCORE1-3,Y ; IN THOUSANDS 4330 CMP FREMEN,X ;IF NOT FREE 4340 BNE STRKHT ; BOMB YET,SKIP. 4350 INC BOMBS,X ;ELSE, UP BOMBS 4360 LDA BOMBS,X ; BY 1 4370 CMP #4 ;IF BOMBS>=4, 4380 BCS UPDTFM ; KEEP IN RESERVE 4390 CLC ;IF BOMBS LESS 4400 ADC SCRNDX,X ; THAN 4, THEN 4410 TAY ; SET EXTRA 4420 LDA #$CD ; ON SCREEN 4430 STA BOMB1-4,Y 4440 UPDTFM INC FREMEN,X ;SET FOR NEXT 4450 ; 4460 STRKHT INC RCKHIT,X ;IF NEW # OF 4470 LDA RCKHIT,X ; ROCKS HIT = 4480 CMP RKILL ; MAX,KILL BOMB 4490 BNE LWRBMB ; ELSE, LOWER IT 4500 KILLBMB TXA ;SET POINTER 4510 CLC ; TO BOMB 4520 ADC # >PL2 4530 STA SCRPTR+1 4540 LDA BMBDRP,X 4550 STA SCRPTR 4560 LDY #5 ;AND ERASE IT 4570 LDA #0 4580 ERABOMB STA (SCRPTR),Y 4590 DEY 4600 BPL ERABOMB 4610 KILBOMB TXA ;TURN OFF SOUND 4620 ASL A ; FOR THIS BOMB 4630 TAY 4640 LDA #0 4650 STA AUDF1,Y 4660 STA AUDC1,Y 4670 STA BMBDRP,X ;SET FLAG OFF 4680 LDA RCKHIT,X ;IF IT DIDN'T 4690 BNE DONXBMB ; HIT ANYTHING, 4700 JSR LWRMISS ; LOWER # BOMBS 4710 JMP DONXBMB ; & DO NEXT 4720 ; 4730 ; LOWER THE BOMBS 4740 ; 4750 LWRBMB TXA 4760 CLC 4770 ADC # >PL2 ;SET POINTER TO 4780 STA SCRPTR+1 ; BOMB 4790 LDA BMBDRP,X 4800 STA SCRPTR 4810 LDA #0 ;ERASE THE BOMB 4820 LDY #5 4830 ERBMB STA (SCRPTR),Y 4840 DEY 4850 BPL ERBMB 4860 INC DRPRATE,X ;UP DROP SPEED 4870 LDA DRPRATE,X 4880 LSR A ;UPDATE POSITION 4890 LSR A 4900 LSR A 4910 LSR A 4920 STA HOLDIT 4930 CLC 4940 ADC BMBDRP,X 4950 CMP #196 ;OUT OF RANGE? 4960 BCS KILBOMB ; YES, KILL IT 4970 STA BMBDRP,X ;ELSE, SET 4980 STA SCRPTR ; THE BOMB 4990 LDY #5 5000 SETBOMB LDA CHARS+96,Y 5010 STA (SCRPTR),Y 5020 DEY 5030 BPL SETBOMB 5040 TXA ;SET Y TO INDEX 5050 ASL A ; THE SOUND REGS 5060 TAY 5070 LDA HOLDIT ;UPDATE SOUND 5080 CLC ; OF DROPPING 5090 ADC DRPFREQ,X ; BOMB 5100 STA DRPFREQ,X 5110 STA AUDF1,Y 5120 LDA #$A8 5130 SEC 5140 SBC HOLDIT 5150 STA AUDC1,Y 5160 DONXBMB DEX ;RESET INDEX 5170 BMI DOPLMV ;IF BOTH NOT 5180 JMP BMBNLOP ; DONE, DO NEXT 5190 ; 5200 ; CHECK & DROP BOMBS 5210 ; 5220 CHKDRP LDA BOMBS,X ;IF NO BOMBS LEFT 5230 BEQ DONXBMB ; THEN DO NEXT 5240 TXA ;IF NOT THE 5250 CLC ; COMPUTER,CHECK 5260 SBC PLAYERS ; TRIGGER 5270 BNE CHKTRG ;IT'S PLAYER! 5281 LDA DIR ;GOING LEFT? 5282 BMI GOINGR ;NO! 5283 LDA PLYRX,X ;GET COMPUTER X 5290 CMP #$44 ;TOO FAR LEFT? 5300 BCC DONXBMB ;YES! 5302 BCS TRYDRP ;NO, TRY DROP! 5303 GOINGR LDA PLYRX,X ;GET COMP. X 5310 CMP #$B8 ;TOO FAR RIGHT? 5320 BCS DONXBMB ;YES! 5330 TRYDRP LDA RANDOM ;COMPUTER DROPS 5340 AND #15 ; A BOMB IF 5350 BEQ DROPIT ; RANDOM SAYS TO 5360 BNE DONXBMB ;ELSE DO NEXT 5370 CHKTRG LDA TRIG0,X ;TRIG PUSHED? 5380 BNE DONXBMB ; NO, DO NEXT 5390 DROPIT LDA PLYRY,X ;DROP: SET 5400 CLC ; BOMB Y TO 5410 ADC #8 ; PLAYER Y+8 5420 STA BMBDRP,X 5430 LDA #0 ;CLEAR DROP RATE 5440 STA DRPRATE,X 5450 STA RCKHIT,X ; AND ROCKS HIT 5460 INC BRUN,X ;UP BOMBS DROPPED 5470 LDA #50 ;SET THE SOUND 5480 STA DRPFREQ,X ; FLAG 5490 BNE DONXBMB ;AND DO NEXT 5500 ; 5510 DOPLMV STA HITCLR ;CLEAR HITS 5520 JSR MOVEPLR ;MOVE PLAYERS 5530 LDA EXPLODE ;EXPLOSION GOING? 5540 BEQ CKRSTRT ; NO,SKIP 5550 DEC EXPLODE ;UPDATE EXPLOSION 5560 DEC EXPLODE ; SOUND 5570 EOR #$F0 5580 STA AUDF3 5590 LSR A 5600 LSR A 5610 LSR A 5620 LSR A 5630 EOR #$8F 5640 STA AUDC3 5650 CKRSTRT LDA CONSOL ;ANY CONSOLE 5660 CMP #7 ; BUTTONS PUSHED? 5670 BEQ CKNSCR ;IF YES, THEN 5680 JMP RESTART ; RE-START 5690 CKNSCR LDA ROCKS ;# OF ROCKS LEFT 5700 BNE CHKPAUS ; = ZERO? 5710 LDA ROCKS+1 ;IF YES, THEN 5720 BNE CHKPAUS ; SET UP A 5730 JMP NEWSCRN ; NEW SCREEN 5740 CHKPAUS LDA CH ;SPACEBAR PRESSED? 5750 CMP #33 5760 BNE CKDRRCK ;NO, CONTINUE 5770 LDA #0 ;YES, PAUSE GAME 5780 STA AUDC1 ;TURN OFF MAIN 5790 STA AUDC2 ; SOUNDS 5800 STA AUDC3 5810 HLDPTRN LDA PORTA ;WAIT FOR STICK 5820 CMP #$FF ; MOVEMENT 5830 BEQ HLDPTRN 5840 LDA #$FF ;RESET CH FOR 5850 STA CH ; ANOTHER PAUSE 5860 STA CH1 5870 CKDRRCK LDA CLOCK ;TIME TO DROP 5880 AND #15 ; SUSPENDED 5890 BEQ DRPROCK ; ROCKS? 5900 JMP BMBLOOP ;NO, DO BOMBS 5910 DRPROCK LDA #39 ;SET COLUMN TO 39 5920 STA XCOUNT 5930 DSTYCNT LDA #8 ;ROW TO 8 5940 STA YCOUNT ;AND SET POINTER 5950 LDA # <[CANYON+360] ; TO XCOUNT 5960 CLC ; PLUS CANYON 5970 ADC XCOUNT ; START 5980 STA SCRPTR 5990 LDA # >[CANYON+360] 6000 ADC #0 6010 STA SCRPTR+1 6020 RK2DRP LDY #0 ;ROCK FALL LOOP: 6030 LDA (SCRPTR),Y ;NOTHING THERE 6040 BEQ DONXRCK ; THEN TRY NEXT UP 6050 TAX ;ELSE HOLD IT 6060 LDY #$28 ; & LOOK UNDERNEATH 6070 LDA (SCRPTR),Y 6080 BNE DONXRCK ;NOT BLANK-DO NEXT 6090 TXA ;BLANK, MOVE ROCK 6100 STA (SCRPTR),Y ; ABOVE DOWN 6110 LDY #0 6120 TYA 6130 STA (SCRPTR),Y 6140 LDA SCRPTR ; & GO UP ONE 6150 SEC ; SO WHOLE COLUMN 6160 SBC #$28 ; WON'T FALL AT 6170 STA SCRPTR ; ONCE 6180 BCS NOVER 6190 DEC SCRPTR+1 6200 NOVER DEC YCOUNT ;LAST ROW DONE? 6210 BMI DONXCOL ; YES, DO NEXT COL 6220 DONXRCK LDA SCRPTR ;GO UP ONE 6230 SEC ; ROW 6240 SBC #$28 6250 STA SCRPTR 6260 BCS NOVER2 6270 DEC SCRPTR+1 6280 NOVER2 DEC YCOUNT ;LAST ROW DONE? 6290 BPL RK2DRP ; YES, DO NEXT COL 6300 DONXCOL DEC XCOUNT ;LAST COL DONE? 6310 BPL DSTYCNT ; NO, DO NEXT 6320 JMP BMBLOOP ;DO BOMBS AGAIN 6330 ; 6340 ; MOVE PLAYER,CHECK FOR LEAVING 6350 ; SCREEN, END GAME CHECK, SWITCH 6360 ; SHIP TYPES 6370 ; 6380 MOVEPLR LDA ONSCR ;IF NOT ON 6390 BNE ADDCLOK ; SCREEN, SET SOUND 6400 LDA MASK ; AND PLAYERS 6410 CMP #3 ;BALLOON? 6420 BEQ STBLSND ; YES, DO THAT 6430 LDA #$96 ;SET PLANE SOUND 6440 STA AUDF4 6450 LDA #$24 6460 STA AUDC4 6470 BNE ADDCLOK ; & GOTO CLOCK ADD 6480 STBLSND LDA #0 ;SET WIND SOUND 6490 STA AUDF4 6500 LDA #2 6510 STA AUDC4 6520 LDX #1 ;SET BALLOON 6530 STBLNS LDA PLYRY,X 6540 STA SCRPTR 6550 TXA 6560 CLC 6570 ADC # >PL0 6580 STA SCRPTR+1 6590 LDY #15 6600 SETBALN LDA CHARS+80,Y 6610 STA (SCRPTR),Y 6620 DEY 6630 BPL SETBALN 6640 DEX 6650 BPL STBLNS 6660 ADDCLOK INC CLOCK ;ADD TO CLOCK 6670 LDA CLOCK ;IF CLOCK AND 6680 AND MASK ; MASK<>0 THEN 6690 BNE DODELAY ; DON'T MOVE 6700 LDA PLYRX ;MOVE THE PLAYERS 6710 CLC ;FIRST PLAYER 1 6720 ADC DIR 6730 STA PLYRX 6740 STA HPOSP0 6750 STA HPOSP2 6760 LDA DIR ;THEN PLAYER 2 6770 EOR #$FE 6780 CLC 6790 ADC PLYRX+1 6800 STA PLYRX+1 6810 STA HPOSP1 6820 STA HPOSP3 6830 LDA MASK ;IF ON PLANES 6840 CMP #1 ; THEN CHECK IF 6850 BNE DODELAY ; TIME TO ANIMATE 6860 LDA CLOCK ; PROPS 6870 AND #2 6880 BEQ DODELAY ;NO, SKIP THIS 6890 LDA DIR ;SET TEMP DIR 6900 STA TDIR ;(WILL BE KILLED) 6910 LDX #1 6920 ANILOOP LDA PLYRY,X ;SET POINTER 6930 STA SCRPTR ; TO PLAYER 6940 TXA 6950 CLC 6960 ADC # >PL0 6970 STA SCRPTR+1 6980 LDA CLOCK ;GET IMAGE INDEX 6990 AND #4 ; FROM CLOCK 7000 ASL A 7010 STA HOLDIT ; AND HOLD IT 7020 LDA TDIR ;GET DIRECTION 7030 AND #$10 ; INDEX FROM 7040 CLC ; DIR 7050 ADC HOLDIT ;& ADD 'EM TO GET 7060 STX HOLDIT ; INDEX. 7070 TAX ;SAVE PLAYER # 7080 LDY #0 ;SET PLAYER 7090 ANISET LDA CHARS+48,X 7100 STA (SCRPTR),Y 7110 INX 7120 INY 7130 CPY #8 7140 BNE ANISET 7150 LDA TDIR ;REVERSE TDIR 7160 EOR #$FE 7170 STA TDIR 7180 LDX HOLDIT ;GET PLAYER # 7190 DEX ; & ANIMATE NEXT 7200 BPL ANILOOP 7210 DODELAY LDX #15 ;WAIT FOR A 7220 DELAY1 LDY DELYVAL ; WHILE TO MAKE 7230 DELAY2 DEY ; GAME PLAYABLE 7240 BNE DELAY2 7250 DEX 7260 BNE DELAY1 7270 LDA #1 ;PLAYERS ARE NOW 7280 STA ONSCR ; ON SCREEN 7290 LDA PLYRX ;BUT CHECK TO 7300 CMP #44 ; SEE IF THEY 7310 BEQ OFFSCR ; AREN'T 7320 CMP #204 7330 BNE MPGOBAK ;IF ON, RETURN 7340 OFFSCR LDA #0 ;ELSE, TURN OFF 7350 STA AUDC3 ; EXPLOSIONS AND 7360 STA AUDC4 ; BKG SOUND 7370 STA EXPLODE 7380 STA ONSCR ;SET ONSCR FALSE 7390 LDX #1 7400 CHKBR LDA BMBDRP,X ;IF A BOMB IS 7410 BEQ CKBRN ; IN THE AIR, AND 7420 LDA RCKHIT,X ; IT HASN'T HIT 7430 BNE CKBRN ; ANYTHING YET, 7440 JSR LWRMISS ; IT'S A MISS 7450 CKBRN LDA BRUN,X ;IF NO BOMBS 7460 BNE CKNBR ; DROPPED THIS 7470 JSR LWRMISS ; PASS,IT'S A MISS 7480 CKNBR DEX 7490 BPL CHKBR 7500 JSR PMCLR ;CLEAR OUT PLAYERS 7510 LDX PLAYERS ;IF THE ACTUAL 7520 LDA BOMBS ; PLAYERS HAVE 7530 CLC ; NO MORE BOMBS, 7540 ADC BOMBS,X ; AND WE'RE ON A 7550 ADC PLAY ; GAME, END IT 7560 BEQ ENDGAME 7570 LDA DIR ;REVERSE DIRECTION 7580 EOR #$FE 7590 STA DIR 7600 LDX PLYRY ;CHANGE PLAYER 7610 LDY PLYRY+1 ; LANES 7620 STX PLYRY+1 7630 STY PLYRY 7640 LDA #3 ;RESET CLOCK 7650 STA CLOCK 7660 LDA ROCKS+1 ;IF HALF OF THE 7670 BNE MPGOBAK ; ROCKS ARE GONE 7680 LDA ROCKS ; THEN SWITCH 7690 CMP #149 ; TO PLANES 7700 BCS MPGOBAK ;ELSE RETURN 7710 LDA #1 ;SET MOVE RATE 7720 STA MASK ; MASK 7730 LDA #4 ;PLANE BOMBS GET 7740 STA RKILL ; MAX OF 4 ROCKS 7750 MPGOBAK RTS ;RETURN 7760 ; 7770 ENDGAME PLA ;GET RID OF 7780 PLA ; RETURN ADDRESS 7790 LDA #8 ;DO DELAY SO 7800 STA HOLDIT ; THE PLAYERS 7810 WAIT0 LDX #$FF ; CAN SEE THE 7820 WAIT1 LDY #$FF ; FINAL SCORE 7830 WAIT2 LDA CONSOL ; (END DELAY 7840 CMP #7 ; EARLY WITH 7850 BNE ENDGOBK ; CONSOL KEY) 7860 DEY 7870 BNE WAIT2 7880 DEX 7890 BNE WAIT1 7900 DEC HOLDIT 7910 BPL WAIT0 7920 ENDGOBK JMP RESTART ;GO TITLE SCREEN 7930 ; 7940 ; SET CANYON SCREEN IMAGE 7950 ; 7960 SETSCRN LDY #0 ;COPY ROCKS & 7970 SETSC1 LDA ROCKIMG,Y ; CANYON TO 7980 STA CANYON+40,Y ; SCREEN 7990 INY 8000 BNE SETSC1 8010 LDY #145 8020 SETSC2 LDA ROCKIMG+255,Y 8030 STA CANYON+295,Y 8040 DEY 8050 BNE SETSC2 8060 RTS ;RETURN 8070 ; 8080 ; LOWER NUMBER OF BOMBS LEFT 8090 ; 8100 LWRMISS LDA BOMBS,X ;IF ALREADY 8110 BEQ LWMGOBK ; ZERO, EXIT 8120 DEC BOMBS,X ;LOWER BOMBS LEFT 8130 LDA BOMBS,X ;IF AT LEAST 3 8140 CMP #3 ; LEFT, RETURN 8150 BCS LWMGOBK 8160 CLC ;GET INDEX FOR 8170 ADC SCRNDX,X ; SCREEN TO 8180 TAY ; ERASE BOMB 8190 LDA #0 8200 STA BOMB1-3,Y 8210 LWMGOBK RTS ;RETURN 8220 ; 8230 ; CLEAR PLAYERS,BOMB Y POSITIONS, 8240 ; BOMBS DROPPED THIS PASS, AND 8250 ; TURN OFF BOMB SOUNDS 8260 ; 8270 PMCLR LDA #0 8280 TAY 8290 PMCLOOP STA PL0,Y ;CLEAR ALL 8300 STA PL1,Y ; PLAYERS 8310 STA PL2,Y 8320 STA PL3,Y 8330 DEY 8340 BNE PMCLOOP 8350 STA BMBDRP ;CLEAR BOMB Y 8360 STA BMBDRP+1 ; POSITION 8370 STA BRUN ; & BOMBS DROPPED 8380 STA BRUN+1 ; THIS PASS 8390 STA AUDC1 ;TURN OFF BOMB 8400 STA AUDC2 ; FALL SOUNDS 8410 RTS 8420 ; 8430 ; PLAYER 2/COMPUTER MESSAGES 8440 ; 8450 P2COMPT .SBYTE +$80,"RETUPMOC2 REYALP" 8460 ; 8470 ; MISC DATA 8480 ; 8490 SCRNDX .BYTE 3,13 8500 MASKS .BYTE 1,3 8510 ; 8520 ; TITLE SCREEN DISPLAY LIST 8530 ; 8540 DLIST1 .BYTE $70,$70,$70,$46 8550 .WORD GAME 8560 .BYTE $70,$70,$70,$70,$70 8570 .BYTE $70,$70,$70,$70,$44 8580 .WORD CANYON+40 8590 .BYTE 4,4,4,4,4,4,4,4,4,$47 8600 .WORD TITLE 8610 .BYTE 6,6,$41 8620 .WORD DLIST1 8630 ; 8640 ; GAME DISPLAY LIST 8650 ; 8660 DLIST2 .BYTE $70,$70,$70,$70 8670 .BYTE $70,$70,$70,$70,$70 8680 .BYTE $70,$70,$70,$70,$44 8690 .WORD CANYON+40 8700 .BYTE 4,4,4,4,4,4,4,4,4,$46 8710 .WORD GAME 8720 .BYTE $70,6,6,$41 8730 .WORD DLIST2 8740 ; 8750 ; TITLES 8760 ; 8770 TITLE .SBYTE +$80," boulder " 8780 .SBYTE +$80," bombers " 8790 .SBYTE " by mark price " 8800 .SBYTE " PLAYERS: " 8810 SCNOPLR .BYTE $11,0,0,0,0,0 8820 ; 8830 ; BOTTOM OF GAME SCREEN 8840 ; 8850 GAME .SBYTE " HIGH: " 8860 HISCOR .SBYTE " 0 PLAYER 1 " 8870 P2MSG .BYTE 0,0,0,0,0,0,0,0,0,0 8880 SCORE1 .BYTE 0,0,0,0,0 8890 BOMB1 .BYTE 0,0,0,0,0 8900 SCORE2 .BYTE 0,0,0,0,0 8910 BOMB2 .BYTE 0,0,0,0 8920 ; 8930 ; DATA FOR CANYON 8940 ; 8950 ROCKIMG .BYTE 1,1,1,1,1,1,1,1,1,1 8960 .BYTE 1,1,1,1,1,1,1,1,1,1 8970 .BYTE 1,1,1,1,1,1,1,1,1,1 8980 .BYTE 1,1,1,1,1,1,1,1,1,1 8990 .BYTE $85,1,1,1,1,1,1,1,1,1 9000 .BYTE 1,1,1,1,1,1,1,1,1,1 9010 .BYTE 1,1,1,1,1,1,1,1,1,1 9020 .BYTE 1,1,1,1,1,1,1,1,1,$85 9030 .BYTE $84,$85,1,1,1,1,1,1,1,1 9040 .BYTE 1,1,1,1,1,1,1,1,1,1 9050 .BYTE 1,1,1,1,1,1,1,1,1,1 9060 .BYTE 1,1,1,1,1,1,1,1,$84,$85 9070 .BYTE $84,$85,2,2,2,2,2,2,2,2 9080 .BYTE 2,2,2,2,2,2,2,2,2,2 9090 .BYTE 2,2,2,2,2,2,2,2,2,2 9100 .BYTE 2,2,2,2,2,2,2,2,$84,$85 9110 .BYTE $84,$84,$85,2,2,2,2,2,2,2 9120 .BYTE 2,2,2,2,2,2,2,2,2,2 9130 .BYTE 2,2,2,2,2,2,2,2,2,2 9140 .BYTE 2,2,2,2,2,2,2,$84,$84,$85 9150 .BYTE $84,$84,$85,2,2,2,2,2,2,2 9160 .BYTE 2,2,2,2,2,2,2,2,2,2 9170 .BYTE 2,2,2,2,2,2,2,2,2,2 9180 .BYTE 2,2,2,2,2,2,2,$84,$84,$85 9190 .BYTE $84,$84,$84,$85,3 9200 .BYTE 3,3,3,3,3,3,3 9210 .BYTE $85,3,3,3,3,3,3,3,3,3,3,3 9220 .BYTE 3,3,3,$85,3,3,3,3,3,3,3,3 9230 .BYTE $84,$84,$84,$85,$84,$84 9240 .BYTE $84,$85,3,3,3,3 9250 .BYTE 3,3,3,$84,$84,$85 9260 .BYTE 3,$85,3,3,3,3 9270 .BYTE 3,3,3,3,$85,3 9280 .BYTE $84,$84,$85,3,3,3 9290 .BYTE 3,3,3,3,$84,$84 9300 .BYTE $84,$85,$84,$84,$84,$84 9310 .BYTE $85,3,3,3,3,3 9320 .BYTE $84,$84,$84,$84,$84,$84 9330 .BYTE $85,3,3,3,3,3 9340 .BYTE 3,$84,$84,$84,$84,$84 9350 .BYTE $84,$85,3,3,3,3 9360 .BYTE 3,$84,$84,$84,$84,$85 9370 .BYTE $84,$84,$84,$84,$84,$85 9380 .BYTE 3,3,3,$84,$84,$84 9390 .BYTE $84,$84,$84,$84,$84,$85 9400 .BYTE 3,3,3,3,$84,$84 9410 .BYTE $84,$84,$84,$84,$84,$84 9420 .BYTE $85,3,3,3,$84,$84 9430 .BYTE $84,$84,$84,$85 9510 ; 9520 ; CHARACTER SET DATA 9530 ; 9540 MYCHARS .BYTE 0,0,0,0,0,0,0,0 9550 .BYTE 84,84,84,84,84,84,84,0 9560 .BYTE 168,168,168,168,168,168,168,0 9570 .BYTE 252,252,252,252,252,252,252,0 9580 .BYTE 255,255,255,255,255,255,255,255 9590 .BYTE 252,252,252,252,252,252,252,252 9600 .BYTE 0,0,1,3,63,211,254,128 9610 .BYTE 0,0,1,131,191,211,126,0 9620 .BYTE 0,0,128,192,252,203,127,1 9630 .BYTE 0,0,128,193,253,203,126,0 9640 .BYTE 60,126,255,0,255,255,126,60 9650 .BYTE 24,36,36,24,24,0,0,0 9660 .BYTE 160,64,224,224,224,64,0,0 9670 .BYTE 108,124,56,124,124,124,56,16 9680 ; 9690 ; ON-SCREEN CANYON 9700 ; 9710 CANYON = *+$0190 9720 ; 9730 *= $02E0 9740 .WORD INIT ;RUN ADDRESS 9750 ; 9760 .END