0100 ;SAVE#D:SPYPT2.M65 0110 ; 0120 ;--------------------------; 0130 ; Secret Agent (c) 1988 ; 0140 ; By: Barry Kolbe ; 0150 ; Second half of main ; 0160 ; program ; 0170 ;--------------------------; 0180 ; 0190 ;Wear scuba gear or gas mask 0200 ; 0210 DWEA LDA DO 0220 CMP #$12 ;scuba? 0230 BNE WTA ;no 0240 LDA OBJTBL+$12 ;have it? 0250 CMP #$80 0260 BEQ WTB ;yes 0270 HAVNT PRINT M5 ;'haven't got' 0280 RTS 0290 ; 0300 WTB LDA #0 ;set flag 0310 STA FE 0320 PRINT M17 ;'Wearing ..' 0330 RTS 0340 ; 0350 WTA CMP #$08 ;gas mask? 0360 BNE WTC ;no 0370 LDA OBJTBL+$08 ;own it? 0380 CMP #$80 0390 BNE HAVNT ;no 0400 LDA #0 ;set wear flag 0410 STA FH 0420 PRINT M31 ;'Wearing...' 0430 RTS 0440 WTC JMP NOCAN ;'Can't do that' 0450 ; 0460 ;Turn 0470 ; 0480 DTUR LDA WHERE ;room? 0490 CMP #$13 ;stairwell 0500 BNE TR1 ;nope 0510 LDA DO 0520 CMP #$18 ;hook? 0530 BEQ TR2 ;yes 0540 TR3 JMP NOCAN ;'Can't' 0550 TR2 LDA #$14 ;new exit west 0560 STA EXITAB+117 0570 JMP LKSEE ;show 0580 ; 0590 TR1 CMP #$18 ;stairwell 0600 BNE TR4 ;no 0610 LDA DO 0620 CMP #$17 ;knob 0630 BNE TR3 ;'Can't' 0640 LDA FD ;flip flag 0650 EOR #1 ;electric floor 0660 STA FD 0670 TR5 JMP PCLIK ;say 'Click' 0680 TR4 CMP #$0E ;stairwell 0690 BEQ TR5 ;just 'Click' 0700 CMP #$0A ;west end? 0710 BEQ TR5 ;yes 0720 TR6 CMP #9 ;ape room? 0730 BNE TR3 ;no 0740 LDA DO 0750 CMP #$17 ;knob 0760 BNE TR3 ;'Can't' 0770 LDA #0 ;loose ape! 0780 STA FI 0790 JSR PCLIK ;'Click' 0800 LDA #$20 ;south exit 0810 STA EXITAB+55 ;now 0820 JMP LKSEE 0830 ; 0840 ;flip switch 0850 ; 0860 DFLI LDA WHERE ;room? 0870 CMP #$0F ;office? 0880 BNE FCH ;no 0890 LDA FA ;is safe visible 0900 BNE FEV ;yes 0910 LDA DO 0920 CMP #$19 ;switch? 0930 BEQ FES ;yes 0940 FEV JMP NOSPEC ;'Nothng happns' 0950 FES LDA OBJTBL+$13 ;have it 0960 CMP #$80 0970 BEQ FET ;yes 0980 JMP HAVNT 0990 FET LDA FB ;opened before? 1000 BNE FEU ;no 1010 JMP PDON ;'Done' 1020 FEU EOR #1 ;set flag 1030 STA FB 1040 LDA #$0F ;show rod 1050 STA OBJTBL+$0F 1060 PRINT M29 ;'Safe open' 1070 JSR PCLIK ;'Click' 1080 JMP LKSEE 1090 ; 1100 FCH CMP #$10 ;chem lab? 1110 BNE FEV ;no 1120 LDA DO 1130 CMP #$19 ;switch? 1140 BNE FEV ;no 1150 LDA FG ;X-ray machine 1160 EOR #1 1170 STA FG ;fall through 1180 PCLIK PRINT M28 ;'.Click..' 1190 RTS 1200 ; 1210 ;Examine something 1220 ; 1230 DEXA LDA DO 1240 CMP #$13 ;electronic 1250 BNE EE1 ;device? 1260 LDA OBJTBL+$13 1270 CMP #$80 1280 BNE EVB 1290 PRINT M30 ;'On/Off switch' 1300 RTS 1310 EE1 CMP #$06 ;baton? 1320 BNE EE2 1330 LDA OBJTBL+6 1340 CMP #$80 1350 BEQ EE3 1360 EVB JMP HAVNT ;'Haven't got' 1370 EE3 PRINT M54 ;'Gravity 1380 RTS ;switch' 1390 EE2 PRINT M12 ;'Nothing ' 1400 RTS 1410 ; 1420 ;Wave an object 1430 ; 1440 DWAV LDX DO ;have it? 1450 LDA OBJTBL,X 1460 CMP #$80 1470 BEQ WA1 ;yes 1480 JMP HAVNT ;'Don't have' 1490 WA1 CPX #6 ;baton? 1500 BNE NOSPEC ;'Nothing' 1510 LDA WHERE 1520 CMP #$17 ;in right room? 1530 BEQ WA4 1540 NOSPEC PRINT M18 ;'Nothing 1550 RTS ;special' 1560 WA4 LDA FF ;flip flag 1570 EOR #1 1580 STA FF 1590 BEQ WA2 1600 LDA #$FF ;close exit 1610 WA3 STA EXITAB+140 1620 JMP LKSEE 1630 WA2 LDA #$10 ;open east 1640 BNE WA3 ;exit 1650 RTS 1660 ; 1670 ;Shoot the ___ with the gun 1680 ; 1690 DSHO LDA #0 ;message flag 1700 STA FK ;for CKWITH 1710 LDA DO 1720 CMP #$1A ;shoot robot? 1730 BNE GAP ;no 1740 SF2 LDA #1 ;set flags 1750 STA WITHF ;auto WITH 1760 LDA #5 ;gun 1770 STA PO ;as prep object 1780 JMP SF1 ;check it out 1790 GAP CMP #$24 ;shoot ape? 1800 BEQ SF2 ;yes 1810 LDA DO ;shoot gun? 1820 CMP #$05 1830 BNE SF1 1840 PRINT M50 ;'At what?' 1850 RTS 1860 SF1 LDA WHERE 1870 CMP #$1A ;in robot room? 1880 BNE SAPE ;no 1890 LDX #$1A ;robot=DO 1900 LDY #$05 ;gun =PO 1910 JSR CKWITH ;check it 1920 LDA FJ ;robot alive? 1930 BNE SS3 ;yes 1940 SS5 JMP WHAFOR ;'What for?' 1950 SS3 LDA RANDOM ;see if hit 1960 CMP #100 1970 BCS SS2 ;miss 1980 LDA #0 ;a hit 1990 STA FJ ;robot dead 2000 LDA # D1F 2030 STA ROBROM+1 2040 JMP LKSEE ;show it 2050 ; 2060 SS2 PRINT M33 ;'You missed' 2070 LDA RANDOM ;see if robot 2080 CMP #180 ;hits 2090 BCC SS4 2100 PRINT M35 ;robot missed 2110 RTS 2120 SS4 LDA #0 ;gotcha! 2130 JMP DEAD 2140 ; 2150 SAPE CMP #9 ;ape room? 2160 BEQ SAP1 ;yes 2170 JMP NOCAN ;'Can't do that' 2180 SAP1 LDX #$24 ;ape =DO 2190 LDY #5 ;gun =PO 2200 JSR CKWITH ;check mostly 2210 LDA FI ;for ownership 2220 BEQ SJ1 ;is ape out? 2230 JMP NOTYT ;no->'Not yet' 2240 SJ1 LDA F6 ;alive ape? 2250 BEQ SS5 ;no 2260 LDA RANDOM ;hit or miss? 2270 CMP #165 2280 BCC SA2 2290 LDA #0 ;one dead ape 2300 STA F6 2310 JMP LKSEE ;tell us all 2320 SA2 PRINT M33 ;'You missed' 2330 LDA RANDOM ;see if ape 2340 CMP #150 ;gets you 2350 BCS SA3 ;yes 2360 PRINT M37 ;'Charging' 2370 RTS 2380 SA3 LDA #1 ;'Crushed!' 2390 JMP DEAD 2400 ; 2410 ;Check: correct Direct Object, 2420 ;Prepositional Object, use of 2430 ;'WITH' and ownership of PO 2440 ;Enter with X=test value of DO 2450 ;Y= test value of PO 2460 ; 2470 CKWITH CPX DO ;X = DO? 2480 BNE WP1 ;nawh 2490 CPY PO ;Y = PO? 2500 BNE WP2 2510 LDA OBJTBL,Y ;have Y? 2520 CMP #$80 2530 BNE WP3 ;no 2540 LDA WITHF ;say 'WITH'? 2550 BEQ WP2 ;no 2560 RTS ;go ahead 2570 WP1 PLA ;pull return 2580 PLA 2590 JMP WHAFOR ;'What for?' 2600 ; 2610 WP2 PLA ;pull return 2620 PLA 2630 LDA FK ;message flag 2640 BEQ WP5 2650 JMP NOTYT ;'Not yet' 2660 WP5 JMP NOCAN ;'Can't do' 2670 ; 2680 WP3 PLA 2690 PLA 2700 JMP HAVNT ;'Haven't got' 2710 ; 2720 ;Lift the plant 2730 ; 2740 DLIF LDA WHERE ;in stairs? 2750 CMP #$0D 2760 BNE WHAFOR ;no! 2770 LDA DO 2780 CMP #$26 ;plant? 2790 BNE WHAFOR ;so why do it? 2800 LDA F5 ;lift before? 2810 BEQ WHAFOR ;yes 2820 EOR #1 ;set flag 2830 STA F5 2840 LDA #$0D ;show key 2850 STA OBJTBL+$11 2860 JMP LKSEE ;show us 2870 WHAFOR PRINT M27 ;'What for?' 2880 RTS 2890 ; 2900 ;Move an object 2910 ; 2920 DMOV LDA WHERE 2930 CMP #$0F ;office? 2940 BNE MVC ;no 2950 LDA DO 2960 CMP #$29 ;picture? 2970 BEQ MV2 ;yup 2980 MV1 JMP NOCAN ;no can do 2990 MV2 LDA FA ;safe already 3000 BEQ PDON ;visible? 3010 EOR #1 ;no. set flag 3020 STA FA 3030 LDA # DSAF 3060 STA SAFROM+1 3070 JMP LKSEE 3080 ; 3090 PDON PRINT M2 ;'Done' 3100 RTS 3110 ; 3120 MVC CMP #$1B ;storage? 3130 BNE MV1 ;no 3140 LDA DO 3150 CMP #$1B ;cabinet? 3160 BNE MV1 ;no 3170 LDA FC ;moved before? 3180 BEQ PDON ;yes 3190 EOR #1 3200 STA FC ;set flag 3210 LDA #$1D ;show exit down 3220 STA EXITAB+167 3230 JMP LKSEE 3240 ; 3250 ;Push (or Press) buttons 3260 ; 3270 DPUS LDA WHERE ;storage? 3280 CMP #7 3290 BNE PS2 ;no 3300 LDA DO 3310 CMP #$27 ;red button? 3320 BNE PS3 3330 LDA #0 ;turn off lasers 3340 PS4 STA F2 3350 JMP PCLIK ;'Click' 3360 PS3 CMP #$28 ;blue? 3370 BEQ PS1 ;yes 3380 PS6 JMP NOCAN ;'Can't ' 3390 PS1 LDA #1 ;turn lasers on 3400 BNE PS4 3410 PS2 CMP #$1D ;small room 3420 BNE PS6 ;(airlock) 3430 LDA DO 3440 CMP #$28 ;blue button 3450 BNE PS6 ;no 3460 LDA #$1E ;open east 3470 STA EXITAB+176 3480 LDA #$FF ;close north 3490 STA EXITAB+174 3500 JSR PCLIK ;'Click' 3510 JMP LKSEE 3520 ; 3530 ;Player's Inventory 3540 ; 3550 INVENT LDX #0 ;'You have:' 3560 ILL LDA YOUH,X 3570 STA IBUF,X 3580 INX 3590 CPX #10 3600 BNE ILL 3610 LDY #0 ;see which ones 3620 ILQ LDA OBJTBL,Y ;you own 3630 CMP #$80 3640 BNE ILN ;no this one 3650 TYA 3660 PHA ;save Y 3670 ASL A ;x2 for an 3680 TAY ;offset 3690 LDA OBJNAM,Y ;into names 3700 STA SL 3710 LDA OBJNAM+1,Y 3720 STA SL+1 3730 LDY #0 ;move name 3740 ILM LDA (SL),Y ;to buffer 3750 BEQ ILP ;done at 0 3760 STA IBUF,X 3770 INX 3780 INY 3790 BNE ILM 3800 ILP LDA #', ;put in ', ' 3810 STA IBUF,X 3820 INX 3830 LDA #$20 3840 STA IBUF,X 3850 INX 3860 PLA ;get Y 3870 TAY 3880 ILN INY ;next object 3890 CPY #NUMSHO ;at end? 3900 BNE ILQ ;no 3910 CPX #10 ;X still 10? 3920 BNE ILW ;no 3930 LDY #0 ;must have 3940 NOH LDA NOTH,Y ;'Nothing!' 3950 STA IBUF,X 3960 INX 3970 INY 3980 CPY #10 3990 BNE NOH 4000 JMP ILU ;print it 4010 ILW LDA #0 ;put in 'EOL' 4020 STA IBUF-1,X 4030 LDA #$20 ;erase last , 4040 STA IBUF-2,X 4050 ILU PRINT IBUF ;print it 4060 RTS 4070 ; 4080 ;You have failed the mission 4090 ;Enter with A = type of death 4100 ; 4110 DEAD ASL A ;x2 4120 TAX ;offset 4130 LDA DEADTAB+1,X ;get message 4140 TAY ;high byte 4150 LDA DEADTAB,X 4160 TAX ;low of address 4170 JSR PRINTE ;print it 4180 PRINT M41 ;'Failed' 4190 JMP WHANOW 4200 ; 4210 ;Before allowing a turn see if 4220 ;the player is in the ape or 4230 ;robot room. Don't allow them to 4240 ;move out. 4250 ; 4260 APEROB LDA WHERE 4270 CMP #$1A ;with robot? 4280 BNE DOAPE ;no 4290 LDA FJ ;robot alive? 4300 BNE EYA ;yes 4310 RTS ;whew! 4320 EYA JSR INTPRET ;get command 4330 LDA ERFLG ;test for error 4340 BNE EYB ;error 4350 LDA VP ;get verb # 4360 CMP #$0A ;shoot? 4370 BNE EYB ;nope 4380 JMP DSHO ;goto shoot 4390 EYB LDA RANDOM ;robot shoots 4400 CMP #200 4410 BCC EYC 4420 LDA #0 ;hit you 4430 JMP DEAD ;done for 4440 EYC PRINT M35 ;robot misses 4450 PLA ;pull return 4460 PLA 4470 JMP DOIN ;get input 4480 ; 4490 DOAPE CMP #9 ;ape room? 4500 BNE NOEN ;no 4510 LDA FI ;in cage? 4520 BNE NOEN ;yes 4530 LDA F6 ;alive? 4540 BEQ NOEN ;dead 4550 JSR INTPRET ;get command 4560 LDA ERFLG 4570 BNE EYD ;error 4580 LDA VP ;get verb # 4590 CMP #$0A ;shoot? 4600 BNE EYD ;no 4610 JMP DSHO ;do shoot 4620 EYD LDA RANDOM ;see if ape 4630 CMP #130 ;gets you 4640 BCS NOEN ;escape for now 4650 PLA 4660 PLA 4670 LDA #1 ;crushes you 4680 JMP DEAD 4690 NOEN RTS 4700 ; 4710 ;Check for traps in 4720 ;various rooms 4730 ; 4740 CKDEAD LDA WHERE 4750 CMP #5 ;hallway? 4760 BNE DI2 4770 LDA F2 ;lasers on? 4780 BEQ CDOK ;no 4790 LDA #5 ;blasted! 4800 JMP DEAD 4810 CDOK RTS ;ok so far 4820 DI2 CMP #$17 ;security? 4830 BNE DI3 4840 LDA FD ;electric floor 4850 BEQ CDOK ;ok 4860 LDA #2 ;Zzzzzit 4870 JMP DEAD 4880 DI3 CMP #$11 ;X-ray room? 4890 BNE DI4 4900 LDA FG ;switch 4910 BNE CDOK ;off! 4920 LDA #4 ;radiation 4930 JMP DEAD 4940 DI4 CMP #$12 ;security? 4950 BNE DI5 4960 LDA FH ;gas mask on? 4970 BEQ CDOK ;yes 4980 LDA #3 ;poison gas 4990 JMP DEAD 5000 DI5 CMP #$1E ;tunnel? 5010 BNE CDOK 5020 LDA FE ;wearing scuba? 5030 BEQ CDOK 5040 LDA #6 ;drowned 5050 JMP DEAD 5060 ; 5070 ;Check the status of objects 5080 ;and show the score 5090 ; 5100 DOSCOR LDA #0 ;zero 5110 STA SCORE 5120 LDY #4 ;check for the 5130 DYA LDA OBJTBL+$0A,Y 5140 CMP #$80 ;4 objects 5150 BEQ UPO 5160 DYB DEY 5170 BPL DYA 5180 LDA OBJTBL+$0C ;don't 5190 CMP #$80 ;count memo 5200 BNE DYC ;next time 5210 DEC SCORE ;(-1 for memo) 5220 DYC LDA SCORE ;I'll put them 5230 ORA #$10 ;next to one 5240 STA PLACE+37 ;another 5250 RTS ;show score 5260 UPO INC SCORE ;plus 1 5270 JMP DYB 5280 ; 5290 ;See if you've won after an 5300 ;escape from the lab 5310 ; 5320 ENDGAM PRINT M42 ;'Escaped' 5330 INC ROWCRS 5340 LDA SCORE ;win? 5350 CMP #4 5360 BNE NOWIN 5370 PRINT M44 ;You won! 5380 ENL JMP ENL 5390 NOWIN PRINT M41 ;not quite 5400 JMP WHANOW 5410 ; 5420 ;Save initial condition in 5430 ;the event of a restart 5440 ; 5450 KEEP LDA # SAVST 5480 STA J+1 5490 LDA # HOLD 5520 STA ML+1 5530 KK3 LDY #0 ;one byte at 5540 LDA (J),Y ;a time 5550 STA (ML),Y 5560 INC ML ;bump pointers 5570 BNE KK1 5580 INC ML+1 5590 KK1 INC J 5600 BNE KK2 5610 INC J+1 5620 KK2 LDA J+1 ;at the 5630 CMP # >SAVEN ;end yet? 5640 BNE KK3 5650 LDA J 5660 CMP # SAVST ;where the 5820 STA J+1 ;program can 5830 LDA # HOLD 5860 STA ML+1 5870 KR1 LDY #0 5880 LDA (ML),Y 5890 STA (J),Y 5900 INC ML 5910 BNE KR2 5920 INC ML+1 5930 KR2 INC J 5940 BNE KR3 5950 INC J+1 5960 KR3 LDA J+1 ;done yet? 5970 CMP # >SAVEN 5980 BNE KR1 5990 LDA J 6000 CMP #