0100 ; 0110 ;Battle portion of 0120 ;CLASH OF KINGS 0130 ; 0140 ;Written by: Barry Kolbe 0150 ; 0160 MAKSCR LDY #19 ;set up screen 0170 LDA #BORD ;do top border 0180 SQ1 STA SCMEM,Y 0190 STA SCMEM+180,Y 0200 DEY 0210 BPL SQ1 0220 LDA # SCMEM 0250 STA PMTO+1 0260 LDX #8 0270 SQ2 JSR ADD20 ;add 20 0280 LDA #BORD ;do edge 0290 LDY #0 0300 STA (PMTO),Y 0310 LDY #19 0320 STA (PMTO),Y 0330 DEX 0340 BPL SQ2 0350 RTS ;border done 0360 ; 0370 ADD20 LDA PMTO ;add 20 to scr 0380 CLC ;memory ptr. 0390 ADC #20 0400 STA PMTO 0410 LDA PMTO+1 0420 ADC #0 0430 STA PMTO+1 0440 RTS 0450 ; 0460 BATTLE LDA STRIG0 ;wait until 0470 BEQ BATTLE ;players release 0480 LDA STRIG0+1 ;buttons 0490 BEQ BATTLE 0500 LDX # >VBLAN ;set up 0510 LDY # DLIST ;list 0650 STA 561 0660 ; 0670 JSR PUTMAZE ;put maze scrn 0680 JSR MAKSCR ;do border 0690 JSR SHOWSC ;show hits 0700 JSR SETCL ;fade colors 0710 JSR PMINIT ;init. pm 0720 JSR CLRPM ;clear pm 0730 JSR DEFPLR ;define plyrs 0740 JSR INITGM ;intial game 0750 STA HITCLR ;clear collision 0760 MAIN JSR CHKHIT ;chk hits 0770 JSR CHKZAP ;check if hit 0780 LDA RFLG ;restart flg 0790 BEQ MAIN ;no hit 0800 JSR REMMIS ;rem miss 0810 DEC RFLG ;get plyr # 0820 LDX RFLG ;0 or 1 0830 JSR EXPLOD ;do explosion 0840 LDX RFLG ;get x back 0850 DEC HTS,X ;1 less hit 0860 LDA HTS,X ;done yet? 0870 BEQ QUIT ;yes 0880 JSR REMPLR ;plyrs off 0890 JMP START2 ;set up again 0900 QUIT TXA 0910 EOR #1 ;flip loser to 0920 STA WINNER ;winner 0930 JSR REMMIS ;all done 0940 JSR REMPLR ;no miss/plrys 0950 LDA #7 0960 LDX # >XITVBV ;get rid 0970 LDY # PMB ;pmbase 1230 STA PMBASE 1240 LDA #3 1250 STA GRACTL ;turn on pm 1260 LDA #0 1270 LDX #3 ;put plyrs off 1280 PM1 STA HPOSP0,X ;screen 1290 STA SIZEP0,X ;normal size 1300 DEX 1310 BPL PM1 1320 LDA #0 ;clear zap 1330 STA ZAP ;registers 1340 STA ZAP+1 1350 RTS 1360 ; 1370 CLRM0 LDA #0 ;clear miss 0 1380 LDY #$FF ;i.e. plyr 2 1390 MC1 STA PLR2,Y 1400 DEY 1410 BNE MC1 1420 RTS 1430 ; 1440 CLRM1 LDA #0 ;clear miss 1 1450 LDY #$FF ;i.e. plyr 3 1460 MC2 STA PLR3,Y 1470 DEY 1480 BNE MC2 1490 RTS 1500 ; 1510 ;define players 1520 ; 1530 DEFPLR LDY #111 1540 LDX #15 1550 DF LDA PLY1,X 1560 STA PLR0,Y 1570 LDA PLY2,X 1580 STA PLR0+272,Y 1590 DEY 1600 DEX 1610 BPL DF 1620 LDA #56 ;init x pos 1630 STA HPOSP0 ;plyr 0 1640 STA XPOS0 1650 LDA #192 ;ditto plyr 1 1660 STA HPOSP1 1670 STA XPOS1 1680 LDA #96 ;init y pos. 1690 STA YPOS0 1700 LDA #112 1710 STA YPOS1 1720 RTS 1730 ; 1740 ; move playrs 1750 ; 1760 MOVEP LDA #0 ;clear collisions 1770 STA HITCLR 1780 LDA HSCL,X ;moving lft or rt? 1790 BEQ TRYUD ;no try up-dn 1800 LDA SAVST,X ;which direction 1810 CMP #7 ;rt? 1820 BNE LFM ;no 1830 LDA HSCL,X ;first time to 1840 CMP #8 ;scroll? 1850 BNE RTOK ;no 1860 JSR WALLCK ;check if wall 1870 LDA WC,X ;or star 1880 BEQ NOHS ;no move 1890 JSR CHKPLR ;is other plyr 1900 LDA PFLG ;there? 1910 BNE RT ;no 1920 NOHS LDA #0 ;do not scroll 1930 STA HSCL,X ;plyr 1940 RTS 1950 RT INC SCX,X ;change screen pos 1960 RTOK INC XPOS0,X ;chng horz.pos 1970 LDA XPOS0,X 1980 STA HPOSP0,X ;do move 1990 DEC HSCL,X ;scroll reg.-1 2000 RTS 2010 LFM CMP #11 ;try left 2020 BNE TRYUD ;nope 2030 LDA HSCL,X ;moving? 2040 CMP #8 ;first time? 2050 BNE LFOK ;nope 2060 JSR WALLCK ;check wall 2070 LDA WC,X ;& star 2080 BEQ NOHS ;no move 2090 JSR CHKPLR ;plyr in way? 2100 LDA PFLG 2110 BEQ NOHS ;yup 2120 DEC SCX,X ;ok scrn pos -1 2130 LFOK DEC XPOS0,X ;do lft move 2140 LDA XPOS0,X 2150 STA HPOSP0,X 2160 DEC HSCL,X ;scroll reg.-1 2170 RTS 2180 TRYUD LDA VSCL,X ;try moving 2190 BEQ GETST ;up-dn 2200 LDA SAVST,X ;get direct. 2210 CMP #14 ;up? 2220 BNE TRDN ;try dn 2230 LDA VSCL,X ;moving yet? 2240 CMP #16 2250 BNE UPOK ;yup 2260 JSR WALLCK ;chk wall & star 2270 LDA WC,X 2280 BEQ NOVS ;no move 2290 JSR CHKPLR ;chk plyr 2300 LDA PFLG ;in way 2310 BNE UL ;ok 2320 NOVS LDA #0 ;no move 2330 STA VSCL,X 2340 RTS 2350 UL LDA SCX,X ;subt. 20 from 2360 SEC ;scrn. pos. 2370 SBC #20 2380 STA SCX,X 2390 UPOK JSR UPDOWN ;get pmg page 2400 DEY ;set up to move 2410 STY PMFR 2420 LDY #0 2430 UPL LDA (PMTO),Y ;move 17 bytes 2440 STA (PMFR),Y ;down in memry 2450 INY 2460 CPY #17 2470 BNE UPL 2480 DEC YPOS0,X ;chng y pos ptr 2490 DEC VSCL,X ;scrll -1 2500 RTS 2510 TRDN CMP #13 ;down? 2520 BNE GETST ;no get stick 2530 LDA VSCL,X ;moving? 2540 CMP #16 2550 BNE DNOK 2560 JSR WALLCK ;chk wall & star 2570 LDA WC,X 2580 BEQ NOVS 2590 JSR CHKPLR ;chk other guy 2600 LDA PFLG ;he there? 2610 BEQ NOVS ;yup 2620 LDA SCX,X ;add 20 to scrn 2630 CLC ;memry location 2640 ADC #20 2650 STA SCX,X 2660 DNOK JSR UPDOWN ;set up pages 2670 INY ;to move 2680 STY PMFR ;player up in 2690 LDY #17 ;memry 2700 DNL LDA (PMTO),Y 2710 STA (PMFR),Y 2720 DEY 2730 BPL DNL 2740 INY 2750 LDA #0 ;knock out the 2760 STA (PMTO),Y ;last byte 2770 INC YPOS0,X ;new y pos. 2780 DEC VSCL,X ;scroll-1 2790 RTS ;all done moving 2800 GETST LDA STICK0,X 2810 STA SAVST,X 2820 CMP #7 2830 BNE T11 2840 T7 LDA #8 2850 STA HSCL,X 2860 RTS 2870 T11 CMP #11 2880 BNE T14 2890 BEQ T7 2900 T14 CMP #14 2910 BNE T13 2920 T15 LDA #16 2930 STA VSCL,X 2940 RTS 2950 T13 CMP #13 2960 BEQ T15 2970 RTS 2980 ; 2990 ; 3000 UPDOWN LDA UDTAB,X ;set up pages 3010 STA PMTO+1 ;for plyr moves 3020 STA PMFR+1 3030 LDA YPOS0,X 3040 TAY 3050 STY PMTO 3060 RTS 3070 ; 3080 ;Initialize variables 3090 ; 3100 INITGM LDA #81 3110 STA SCX 3120 LDA #118 3130 STA SCX+1 3140 LDA #3 3150 STA WSR 3160 STA STIME 3170 LDA #30 3180 STA ZTIME 3190 LDA #15 3200 STA MZR 3210 LDA #0 3220 STA MISM 3230 STA MISM+1 3240 STA HSCL 3250 STA HSCL+1 3260 STA VSCL 3270 STA VSCL+1 3280 STA RFLG 3290 STA BSR ;no blowup 3300 STA MSR ;no missile snd 3310 STA EXEC 3320 RTS 3330 ; 3340 ;do the maze 3350 ; 3360 MAZE LDY #15 3370 PCK1 JSR RND 3380 STA MZTAB,Y 3390 DEY 3400 BNE PCK1 3410 RTS 3420 ; 3430 ; 3440 RND LDA RANDOM 3450 CMP #22 3460 BCC RND 3470 CMP #178 3480 BCS RND 3490 LDX #15 3500 CRN CMP MZCK,X 3510 BEQ RND 3520 DEX 3530 BPL CRN 3540 RTS 3550 ; 3560 ; 3570 ;put maze on screen 3580 ; 3590 PUTMAZE JSR MAZE 3600 LDX #15 3610 MZ1 LDA MZTAB,X 3620 TAY 3630 STX X1 3640 LDA RANDOM 3650 AND #3 3660 TAX 3670 LDA MZCOL,X 3680 LDX X1 3690 STA SCMEM,Y 3700 DEX 3710 BNE MZ1 3720 RTS 3730 ; 3740 ; 3750 ; 3760 ;check if wall 3770 ; 3780 WALLCK STX XTEM 3790 LDA #0 ;0=no move 3800 STA WC,X 3810 LDA SCX,X ;pos. in sc.mem 3820 STA TEMP ;0-239 3830 LDA SAVST,X 3840 LDX #3 ;get dir 3850 WCK CMP WALLTAB,X 3860 BEQ WCK1 3870 DEX 3880 BPL WCK 3890 WCK1 LDA ADDER,X 3900 CLC 3910 ADC TEMP 3920 TAY 3930 STY TEMP ;hang on to loc 3940 LDX XTEM 3950 LDA SCMEM,Y ;get byte 3960 BNE RT1 ;not 0 >no move 3970 LDA #1 ;ok to move 3980 STA WC,X ;move flag 3990 RT1 RTS 4000 ; 4010 ;move missile routine 4020 ; 4030 MOVEM STA HITCLR 4040 LDA MISM,X ;direction or 4050 BNE MOK ;0=not moving 4060 LDA STRIG0,X 4070 BEQ PMIS ;0=pressed 4080 RTS ;not pressed 4090 PMIS LDA SAVST,X ;get direct 4100 STX TEMP ;save x 4110 LDX #3 4120 CKMD CMP WALLTAB,X ;chk direct 4130 BEQ PMOK ;ok valid 4140 DEX 4150 BPL CKMD 4160 LDA #0 ;not valid 4170 LDX TEMP ;direct 4180 STA MISM,X 4190 RTS 4200 PMOK LDX TEMP 4210 STA MISM,X ;save direction 4220 LDA #7 ;set up missile 4230 STA MSR ;snd rout. 4240 LDA #9 4250 STA MTIME 4260 JSR PUTMIS 4270 MOK STX XTEM 4280 LDA MISM,X ;get dir 4290 CMP #7 ;rt? 4300 BNE N1 4310 LDA XPOS2,X 4320 CLC 4330 ADC #2 4340 STA XPOS2,X 4350 STA HPOSP2,X 4360 RTS 4370 N1 CMP #11 4380 BNE N2 4390 LDA XPOS2,X 4400 SEC 4410 SBC #2 4420 STA XPOS2,X 4430 STA HPOSP2,X 4440 RTS 4450 N2 CMP #14 ;up? 4460 BNE N3 4470 LDA #2 4480 STA UDFL 4490 UPAGN JSR MSUPDN 4500 DEY 4510 STY MIST 4520 LDY #0 4530 N5 LDA (MISF),Y 4540 STA (MIST),Y 4550 INY 4560 CPY #8 4570 BNE N5 4580 DEC YPOS2,X 4590 DEC UDFL 4600 LDA UDFL 4610 BNE UPAGN 4620 RTS 4630 N3 CMP #13 4640 BEQ N7 4650 RTS 4660 N7 LDA #2 4670 STA UDFL 4680 DNAGN JSR MSUPDN 4690 INY 4700 STY MIST 4710 LDY #7 ;only 8 bytes 4720 N6 LDA (MISF),Y 4730 STA (MIST),Y 4740 DEY 4750 BPL N6 4760 LDY #0 4770 TYA 4780 STA (MISF),Y 4790 INC YPOS2,X 4800 DEC UDFL 4810 LDA UDFL 4820 BNE DNAGN 4830 RTS 4840 ; 4850 ;set page ptrs miss 4860 ; 4870 MSUPDN LDA MSUP,X 4880 STA MISF+1 4890 STA MIST+1 4900 LDY YPOS2,X 4910 STY MISF 4920 RTS ;rtn with y 4930 ; 4940 ; 4950 ;put missile on scn 4960 ; 4970 PUTMIS LDA XPOS0,X 4980 STA XPOS2,X 4990 LDA YPOS0,X 5000 CLC 5010 ADC #4 5020 STA YPOS2,X 5030 ; 5040 ;define missiles 5050 ; 5060 STX XTEM 5070 CPX #0 ;miss 0 or 1 5080 BNE MM1 ;do miss1 5090 JSR CLRM0 5100 LDY YPOS2,X ;get y pos 5110 LDX #0 5120 MM2 LDA MISS0,X 5130 STA PLR2,Y 5140 INY 5150 INX 5160 CPX #8 5170 BNE MM2 5180 LDX XTEM 5190 MM4 LDA XPOS2,X 5200 STA HPOSP2,X 5210 RTS 5220 MM1 JSR CLRM1 5230 LDY YPOS2,X 5240 LDX #0 5250 MM3 LDA MISS1,X 5260 STA PLR3,Y 5270 INY 5280 INX 5290 CPX #8 5300 BNE MM3 5310 LDX XTEM 5320 JMP MM4 5330 RTS 5340 ; 5350 ; delays 5360 ; 5370 DELAY LDA #120 5380 STA TIMER+1 5390 DEL2 LDA #0 5400 STA TIMER 5410 DEL3 DEC TIMER 5420 LDA TIMER 5430 BNE DEL3 5440 DEC TIMER+1 5450 LDA TIMER+1 5460 BNE DEL2 5470 RTS 5480 ; 5490 ;longer delay 5500 ; 5510 DELAY1 LDA #70 5520 STA TIMER+1 5530 BNE DEL2 5540 ; 5550 ;vblank routine 5560 ; 5570 VBLAN LDA BSR 5580 BEQ VNS 5590 JSR BLOWUP 5600 JMP XITVBV 5610 VNS LDA EXEC 5620 BEQ VOK 5630 JSR SNDOFF 5640 JMP XITVBV 5650 VOK INC VTIME 5660 LDA VTIME 5670 CMP #9 5680 BEQ VB1 5690 JMP TRYMIS ;done 5700 VB1 LDA #0 5710 STA VTIME 5720 INC PTYPE ;next def 5730 LDA PTYPE 5740 CMP #3 5750 BCC PT 5760 LDA #0 5770 PT STA PTYPE 5780 LDA PTYPE ;plyr type 0/1 5790 BNE VB3 5800 LDA # PLY1 5830 STA VB2+2 5840 LDA # PLY2 5870 STA VB4+2 5880 JMP VB5 5890 VB3 CMP #1 5900 BNE VB6 5910 LDA # PLY3 5940 STA VB2+2 5950 LDA # PLY4 5980 STA VB4+2 5990 JMP VB5 6000 VB6 LDA # PLY5 6030 STA VB2+2 6040 LDA # PLY6 6070 STA VB4+2 6080 VB5 LDY YPOS0 ;plyr 0 6090 LDX #0 ; 16 bytes 6100 VB2 LDA PLY3,X 6110 STA PLR0,Y 6120 INY 6130 INX 6140 CPX #16 6150 BNE VB2 6160 LDY YPOS1 ;plyr 1 6170 LDX #0 ;16 6180 VB4 LDA PLY4,X 6190 STA PLR1,Y 6200 INY 6210 INX 6220 CPX #16 6230 BNE VB4 6240 LDA #0 6250 STA 77 ;kill attract 6260 TRYMIS STA HITCLR 6270 VB7 LDX #0 6280 JSR MOVEM 6290 INX 6300 JSR MOVEM 6310 LDX #0 6320 JSR MOVEP 6330 INX 6340 JSR MOVEP 6350 JSR WHIRLY 6360 JSR MISHOT 6370 JSR CHMAZE 6380 JMP XITVBV 6390 ; 6400 ;check for hits 6410 ; 6420 CHKHIT LDA 53254 ;plyr2=miss0 6430 BEQ K1 ;no 6440 K3 LDA #0 ;yes 6450 STA MISM ;don't move 6460 STA HPOSP2 ;get off scn 6470 K1 LDA 53255 6480 BEQ K2 ;no 6490 LDA #0 6500 STA MISM+1 6510 STA HPOSP3 6520 K2 LDA 53262 6530 AND #2 ;hit plyr1? 6540 BEQ K4 ;no 6550 LDA #1 6560 STA ZAP+1 6570 STA EXEC ;killvblank 6580 K4 LDA 53263 6590 AND #1 ;hit plyr0? 6600 BEQ K5 6610 LDA #1 6620 STA ZAP 6630 STA EXEC ;kill vblank 6640 K5 STA HITCLR 6650 RTS 6660 ; 6670 ;check zap 6680 ; 6690 CHKZAP LDX #0 6700 STX RFLG ;defalt =0 6710 LDY #1 6720 LDA ZAP,X 6730 BEQ ZP1 6740 ZP2 STY RFLG 6750 RTS 6760 ZP1 INX 6770 INY 6780 LDA ZAP,X 6790 BNE ZP2 6800 RTS 6810 ; 6820 ;show score 6830 ; 6840 SHOWSC LDX #0 6850 LDY HTS,X 6860 DEY 6870 LDA #BAR 6880 SH1 STA SCMEM+201,Y 6890 DEY 6900 BPL SH1 6910 INX 6920 LDY HTS,X 6930 DEY 6940 SH2 STA SCMEM+211,Y 6950 DEY 6960 BPL SH2 6970 RTS 6980 ; 6990 ;remove missls 7000 ; 7010 REMMIS LDA #0 7020 STA MISM 7030 STA MISM+1 7040 STA HPOSP2 7050 STA HPOSP3 7060 RTS 7070 ; 7080 ;remove plrs 7090 ; 7100 REMPLR LDA #0 7110 STA HPOSP0 7120 STA HPOSP1 7130 RTS 7140 ; 7150 ;whirlybird snd 7160 ; 7170 WHIRLY DEC STIME 7180 LDA STIME 7190 BEQ DOSND 7200 RTS 7210 DOSND LDA #2 7220 STA STIME 7230 LDX WSR 7240 BEQ CHWS 7250 LDA #$84 7260 STA AUDC1 7270 LDA WSN,X 7280 STA AUDF1 7290 DEC WSR 7300 RTS 7310 CHWS LDX #2 7320 STX WSR 7330 RTS 7340 ; 7350 ;miss shot 7360 ; 7370 MISHOT LDA MSR 7380 BNE SNOK 7390 RTS 7400 SNOK LDX MSR 7410 LDA #$AA 7420 STA AUDC2 7430 LDA MSN,X 7440 STA AUDF2 7450 DEC MSR 7460 RTS 7470 ; 7480 ;explosion 7490 ; 7500 EXPLOD LDY YPOS0,X ;get y pos 7510 LDA #67 7520 STA BSR 7530 STY PMFR 7540 LDA #5 7550 STA TEMP 7560 LDA # >EXPLR 7570 STA PMTO+1 ;hi byte 7580 LDA #