0100 ; ------------------------ 0110 ; CRASH DIVE! (TM) 0120 ; by Brian Moriarty 0130 ; ANALOG Computing #18 0140 ; (C)1984 ANALOG Computing 0150 ; ------------------------ 0160 ; 0170 ; MACRO DEFINITIONS 0180 ; ----------------- 0190 ; 0200 ; POSITION MACRO 0210 ; -------------- 0220 ; SYNTAX: 0230 ; POSITION xpos,ypos 0240 ; 0250 .MACRO POSITION 0260 .IF %0<>2 .OR %1>39 .OR %2>23 0270 .ERROR "POS parameters" 0280 .ELSE 0290 .IF %1=13 0300 LDY #%2 0310 JSR POSIT13 0320 .ELSE 0330 LDX #%1 0340 LDY #%2 0350 JSR POSIT 0360 .ENDIF 0370 .ENDIF 0380 .ENDM 0390 ; 0400 ; PRINT MACRO 0410 ; ----------- 0420 ; SYNTAX: 0430 ; PRINT 0440 ; 0450 .MACRO PRINT 0460 .IF %0<>1 0470 .ERROR "PRINTE parameters" 0480 .ELSE 0490 LDA # <%1 0500 LDY # >%1 0510 JSR EPRINT 0520 .ENDIF 0530 .ENDM 0540 ; 0550 ; TEXT MACRO 0560 ; ---------- 0570 ; SYNTAX: 0580 ; TEXT <"string"> 0590 ; 0600 .MACRO TEXT 0610 .IF %0<>1 .OR %1>127 0620 .ERROR "TEXT parameters" 0630 .ELSE 0640 .BYTE %$1,EOL 0650 .ENDIF 0660 .ENDM 0670 ; 0680 ; SYSTEM EQUATES 0690 ; --------------- 0700 ; 0710 ; ZERO-PAGE 0720 ; --------- 0730 BOOT? = $09 ; OS boot flag 0740 POKMSK = $10 ; interrupt mask 0750 RTCLOK = $14 ; system clock 0760 LMARGN = $52 ; left margin 0770 RMARGN = $53 ; right margin 0780 ROWCRS = $54 ; cursor row 0790 COLCRS = $55 ; cursor column 0800 RAMTOP = $6A ; # pages of RAM 0810 FR0 = $D4 ; floating point register 0820 CIX = $F2 ; FP index register 0830 INBUFF = $F3 ; FP pointer 0840 ; 0850 ; PAGES 2-3 0860 ; --------- 0870 VDSLST = $0200 ; DLI vector 0880 SRTIMR = $022B ; key repeat timer 0890 SDMCTL = $022F ; DMA control 0900 SDLSTL = $0230 ; D-list addr 0910 COLDST = $0244 ; coldstart flag 0920 GPRIOR = $026F ; PMG priority 0930 PCOLR0 = $02C0 ; player 0 color 0940 PCOLR1 = $02C1 ; player 1 color 0950 PCOLR2 = $02C2 ; player 2 color 0960 PCOLR3 = $02C3 ; player 3 color 0970 COLOR0 = $02C4 ; playfield 0 color 0980 COLOR1 = $02C5 ; playfield 1 color 0990 COLOR2 = $02C6 ; playfield 2 color 1000 COLOR4 = $02C8 ; background color 1010 CRSINH = $02F0 ; cursor inhibit 1020 CH = $02FC ; keypress register 1030 ICCOM = $0342 ; CIO command 1040 ICBADR = $0344 ; CIO addr 1050 ICBLEN = $0348 ; CIO length 1060 ICAUX1 = $034A ; AUX byte 1 1070 ICAUX2 = $034B ; AUX byte 2 1080 ; 1090 ; CTIA/GTIA 1100 ; --------- 1110 HPOSP0 = $D000 ; h-pos player 0 1120 HPOSP1 = $D001 ; " " 1 1130 HPOSP2 = $D002 ; " " 2 1140 HPOSP3 = $D003 ; " " 3 1150 SIZEP0 = $D004 ; width player 0 1160 SIZEP1 = $D009 ; " " 1 1170 SIZEP2 = $D00A ; " " 2 1180 SIZEP3 = $D00B ; " " 3 1190 GRAFP0 = $D00D ; graphics player 0 1200 GRAFP1 = $D00E ; " " 1 1210 GRAFP2 = $D00F ; " " 2 1220 GRAFP3 = $D010 ; " " 3 1230 COLPF2 = $D018 ; color register 2 1240 CONSOL = $D01F ; console keys 1250 ; 1260 ; POKEY 1270 ; ----- 1280 AUDF1 = $D200 ; frequency channel 1 1290 AUDC1 = $D201 ; vol/dist channel 1 1300 AUDCTL = $D208 ; audio control 1310 RANDOM = $D20A ; random # generator 1320 IRQEN = $D20E ; interrupt enable 1330 ; 1340 ; ANTIC 1350 ; ----- 1360 DMACTL = $D400 ; DMA control 1370 WSYNC = $D40A ; wait for horz sync 1380 NMIEN = $D40E ; NMI enable 1390 ; 1400 ; FLOATING POINT 1410 ; -------------- 1420 FASC = $D8E6 ; FP-to-ATASCII 1430 IFP = $D9AA ; integer-to-FP 1440 ZFR0 = $DA44 ; clear FR0 1450 ; 1460 ; OS ROUTINES 1470 ; ----------- 1480 CIOV = $E456 ; CIO entry 1490 SETVBV = $E45C ; set v-blank vector 1500 SYSVBV = $E45F ; OS VBI entry 1510 SIOINV = $E465 ; SIO init 1520 ; 1530 ; INTERNAL EQUATES 1540 ; ---------------- 1550 ; 1560 ; MEMORY ALLOCATION 1570 ; ----------------- 1580 INLINE = $0600 ; text input buffer 1590 GAMEDATA = $3AC0 ; working area 1600 EDLIST = $3C20 ; start of E: display list 1610 SCREEN = $3C40 ; start of screen RAM 1620 ; 1630 ; Game play database 1640 ; 1650 *= GAMEDATA 1660 ; 1670 EVENT *= *+2 ; event # 1680 PLACE *= *+1 ; location 1690 SLAT *= *+1 ; ship's latitude 1700 SLON *= *+1 ; ship's longitude 1710 MLAT *= *+1 ; missile latitude 1720 MLON *= *+1 ; missile longitude 1730 DEPTH *= *+1 ; sub's depth 1740 GREEN *= *+1 ; green button on/off 1750 RED *= *+1 ; red button on/off 1760 SWITCH *= *+1 ; arming switch on/off 1770 BREATH *= *+1 ; holding breath? 1780 HATCH *= *+1 ; hatch opened? 1790 UNIT *= *+1 ; unit dropped in rm 17? 1800 CRASHED *= *+1 ; sub crashed? 1810 BULLET *= *+1 ; bullet used? 1820 SUIT *= *+1 ; suit searched? 1830 CAPTAIN *= *+1 ; captain searched? 1840 BHOLD *= *+1 ; breath holding counter 1850 TRAITOR *= *+1 ; traitor wait counter 1860 HOLDINGS *= *+6 ; current inventory 1870 VECTORS *= *+132 ; current vector table 1880 OBJECTS *= *+132 ; current object table 1890 NTRANS *= *+38 ; current translation matrix 1900 ; 1910 ; MISCELLANEOUS 1920 ; ------------- 1930 EOL = $9B 1940 SPACE = $20 1950 ; 1960 ; ZERO-PAGE 1970 ; --------- 1980 *= $80 1990 ; 2000 ; Cursor control 2010 ; 2020 CURSEN *= *+1 ; cursor on/off flag 2030 CSHAPE *= *+1 ; current cursor shape 2040 BLINK *= *+1 ; cursor blink timer 2050 ; 2060 ; Keyboard handler 2070 ; 2080 CLICK *= *+1 ; key click counter 2090 LENGTH *= *+1 ; line length register 2100 ; 2110 ; DLI control 2120 ; 2130 DLICOL *= *+1 ; DLI color index 2140 ; 2150 ; Screen clearing 2160 ; 2170 CLPOINT *= *+2 ; screen clear pointer 2180 CINDEX *= *+1 ; window clear index 2190 ; 2200 ; Parser 2210 ; 2220 PBUFF *= *+3 ; parsing buffer 2230 PDEX *= *+1 ; scanning index 2240 LBREAK *= *+1 ; pos. of space char 2250 VCODE *= *+1 ; verb code # 2260 UCODE *= *+1 ; untranslated noun code # 2270 NCODE *= *+1 ; translated noun code # 2280 DOVECT *= *+2 ; verb execution vector 2290 CURVECT *= *+6 ; current room vectors 2300 CUROBJS *= *+6 ; current room objects 2310 NEWPLACE *= *+1 ; next room code # 2320 VPNT *= *+2 ; addr of current v-buffer 2330 OPNT *= *+2 ; addr of current o-buffer 2340 INVPOS *= *+1 ; position in inventory buffer 2350 ROOMPOS *= *+1 ; position in room buffer 2360 ANY? *= *+1 ; flag for empty room/inv 2370 LATSHOW *= *+1 ; latitude to display 2380 LONSHOW *= *+1 ; longitude to display 2390 VLAST *= *+1 ; last verb 2400 ULAST *= *+1 ; last noun 2410 ; 2420 ; Event counter 2430 ; 2440 EBUFF *= *+5 ; printing buffer 2450 ; 2460 ; INITIALIZATION 2470 ; -------------- 2480 ; 2490 *= $1F80 2500 ; 2510 ENTRY 2520 LDX #0 2530 STX COLDST 2540 INX ; = 1 2550 STX BOOT? 2560 JSR SIOINV ; for sound init 2570 JMP TITLE 2580 ; 2590 ; CUSTOM DISPLAY LIST 2600 ; ------------------- 2610 DLIST 2620 .BYTE $70,$70,$70,$70 ; blank 32 lines 2630 .BYTE $42, SCREEN ; text w/LMS 2640 .BYTE $90,$10 ; blank 4 w/DLI 2650 .BYTE $02 ; text (location) 2660 .BYTE $90,$10 ; blank 4 w/DLI 2670 .BYTE $02 ; text (exits) 2680 .BYTE $90,$10 ; blank 4 w/DLI 2690 .BYTE $02,$02,$02,$02,$02,$02 ; text (v-items) 2700 .BYTE $90,$10 ; blank 4 w/DLI 2710 .BYTE $02,$02 ; text (events) 2720 .BYTE $90,$10 ; blank 4 w/DLI 2730 .BYTE $02,$02 ; text (response) 2740 .BYTE $80,$80,$10 ; blank 4 w/DLIs 2750 .BYTE $02,$02,$02,$02,$02,$02 ; text (i-items) 2760 .BYTE $70 ; blank 8 2770 .BYTE $41, DLIST ; JVB 2780 ; 2790 ; TITLE SCREEN 2800 ; ------------ 2810 TITLE 2820 LDX #$FF 2830 TXS 2840 JSR NEWSCREEN ; reset E: 2850 POSITION 12,6 2860 PRINT T0 ; "Brian Moriarty's" 2870 POSITION 25,7 2880 PRINT T1 ; "CRASH DIVE" 2890 POSITION 8,9 2900 PRINT T2 ; "(C)1984 ANALOG Computing" 2910 ; 2920 STARTOP 2930 POSITION 5,16 2940 PRINT T3 ; "Press START to play new game" 2950 POSITION 3,18 2960 PRINT T4 ; "Press OPTION to restore old game" 2970 ; 2980 LDA #6 2990 STA EDLIST+12 ; modify 3000 STA EDLIST+13 ; display list 3010 ; 3020 LDA #$22 3030 STA SDMCTL ; restore screen 3040 JSR BEEP 3050 ; 3060 ; Wait for selection 3070 ; 3080 POLL 3090 LDA CONSOL 3100 CMP #7 ; scan until a 3110 BEQ POLL ; key is pressed 3120 LETGO 3130 LDX CONSOL 3140 CPX #7 3150 BNE LETGO 3160 CMP #6 ; START pressed? 3170 BEQ NEWGAME ; yes, do a new game 3180 CMP #3 ; OPTION pressed? 3190 BEQ RESTORE ; yes, restore old game 3200 BADPOLL 3210 JSR BOOP ; else 3220 JMP POLL ; resume scan 3230 ; 3240 ; Start new game 3250 ; 3260 NEWGAME 3270 JSR INITDATA 3280 JMP PLAYSCREEN 3290 ; 3300 ; Restore a previous game 3310 ; 3320 RESTORE 3330 POSITION 5,20 3340 PRINT T5 ; "Restore from Disk or Tape?" 3350 JSR BEEP 3360 DORT 3370 JSR GETKEY 3380 CMP #'D ; disk? 3390 BEQ GETDISK 3400 CMP #'C ; tape? 3410 BEQ GETAPE 3420 DORTERR 3430 JSR CLOSE1 3440 JSR BOOP 3450 JMP DORT 3460 ; 3470 ; Get game from disk 3480 ; 3490 GETDISK 3500 JSR DPOINT 3510 JMP READOPEN 3520 ; 3530 ; Get game from tape 3540 ; 3550 GETAPE 3560 JSR TPOINT 3570 ; 3580 READOPEN 3590 LDA #3 ; OPEN command 3600 STA ICCOM,X 3610 LDA #4 ; READ 3620 STA ICAUX1,X 3630 LDA #0 3640 STA ICAUX2,X 3650 JSR CIOV 3660 BMI DORTERR 3670 ; 3680 ; Get game data thru IOCB #1 3690 ; 3700 GETDATA 3710 LDX #$10 3720 LDA # GAMEDATA 3750 STA ICBADR+1,X 3760 LDA #$48 3770 STA ICBLEN,X 3780 LDA #$01 3790 STA ICBLEN+1,X 3800 LDA #7 ; GET RECORD 3810 STA ICCOM,X 3820 JSR CIOV 3830 BMI DORTERR 3840 JSR CLOSE1 3850 ; 3860 ; PLAYSCREEN INIT 3870 ; --------------- 3880 PLAYSCREEN 3890 JSR NEWSCREEN ; reset E: 3900 ; 3910 ; Enable custom display list 3920 ; 3930 LDA # DLIST 3960 STA SDLSTL+1 3970 ; 3980 ; Print title & labels 3990 ; 4000 PRINT T6 ; "CRASH DIVE! (TM) EVENT #" 4010 LDA #12 ; set right margin 4020 STA RMARGN ; for wraparound 4030 PRINT T7 ; "LOCATION/EXITS" 4040 PRINT T8 ; "VISIBLE ITEMS" 4050 JSR BAR 4060 JSR BAR 4070 JSR BAR 4080 JSR BAR ; 4 blank bars 4090 JSR SAYWHAT ; "WHAT" 4100 PRINT T11 ; "HAPPENS/YOUR RESPONSE" 4110 JSR SAYWHAT ; "WHAT" 4120 PRINT T12 ; "YOU ARE CARRYING" 4130 JSR BAR 4140 JSR BAR ; more blank bars 4150 LDA #39 4160 STA RMARGN ; reset 4170 ; 4180 LDA #$C4 ; green 4190 STA PCOLR0 ; cursor 4200 ; 4210 ; Setup P/M borders & mask 4220 ; 4230 LDA #48 4240 STA HPOSP1 ; position left 4250 LDA #202 ; and 4260 STA HPOSP2 ; right borders 4270 LDA #64 ; and 4280 STA HPOSP3 ; title cover 4290 LDX #255 4300 STX GRAFP1 ; set up 4310 STX GRAFP2 ; side borders and 4320 STX GRAFP3 ; title mask 4330 INX ; = 0 4340 STX SIZEP0 ; set cursor width 4350 INX ; = 1 4360 STX GPRIOR ; set player priority 4370 LDA #3 4380 STA SIZEP1 ; set border 4390 STA SIZEP2 ; and mask 4400 STA SIZEP3 ; widths 4410 ; 4420 LDA #$F0 ; init 4430 STA CSHAPE ; cursor shape 4440 LDA #30 ; and 4450 STA BLINK ; blink timer 4460 ; 4470 LDA #13 4480 STA LMARGN ; init left margin 4490 ; 4500 LDY # IMMVBI ; specifying 4520 LDA #6 ; immediate-mode 4530 JSR SETVBV 4540 ; 4550 LDA # DLI ; we put our 4580 STA VDSLST+1 ; DLI service routine 4590 LDA #$C0 ; set bits 6 & 7 of NMIEN 4600 STA NMIEN ; to enable DLIs and VBIs 4610 ; 4620 LDA PLACE 4630 JMP REENTRY 4640 ; 4650 ; EVENT GENERATOR 4660 ; --------------- 4670 ; 4680 NEXTEVENT 4690 LDX #$FF ; empty stack 4700 TXS ; just in case! 4710 JSR SHOWEV ; show event # 4720 INC EVENT ; update 4730 BNE RADIO ; event 4740 INC EVENT+1 ; counter 4750 ; 4760 ; Handle room 0 4770 ; 4780 RADIO 4790 LDA PLACE 4800 BNE ENEMY 4810 LDA #32 ; got suit? 4820 JSR OWNIT? 4830 BEQ ENEMY 4840 JSR NEWSCREEN 4850 POSITION 8,3 4860 PRINT T79 ; "A blast of radioactivity" 4870 JMP KILLS 4880 ; 4890 ; Check for enemy takeover 4900 ; 4910 ENEMY 4920 LDA EVENT 4930 CMP #32 4940 BNE LUNGS 4950 LDA EVENT+1 4960 BNE LUNGS 4970 LDA DEPTH 4980 BNE LUNGS 4990 JSR NEWSCREEN 5000 POSITION 7,3 5010 PRINT T67 ; "Enemy captures the sub and" 5020 JMP KILLS 5030 ; 5040 ; Limit breath-holding 5050 ; 5060 LUNGS 5070 LDA BREATH ; holding it? 5080 BEQ POISON ; no - skip this 5090 DEC BHOLD ; else decrement count 5100 BNE POISON ; continue if NZ 5110 LDA #0 ; else 5120 STA BREATH ; release hold 5130 ; 5140 ; Handle poison atmosphere 5150 ; 5160 POISON 5170 LDA HATCH ; hatch opened? 5180 BEQ DOTRAIT ; not yet 5190 LDA #28 ; got the 5200 JSR OWNIT? ; mask? 5210 BEQ DOTRAIT ; yup - you're safe 5220 LDA BREATH ; holding breath? 5230 BNE DOTRAIT ; good thing, otherwise ... 5240 JSR NEWSCREEN 5250 POSITION 8,3 5260 PRINT T62 ; "A cloud of poisonous gas" 5270 JMP KILLS 5280 ; 5290 ; Handle traitor 5300 ; 5310 DOTRAIT 5320 LDA TRAITOR 5330 BPL NTRAIT 5340 JSR NEWSCREEN 5350 POSITION 9,3 5360 PRINT T77 ; "Traitor shoots you and" 5370 JMP KILLS 5380 NTRAIT 5390 LDA PLACE ; is this 5400 CMP #18 ; room 18? 5410 BNE TRESET ; we're safe 5420 LDA #4 ; is the traitor 5430 JSR INROOM? ; lurking? 5440 BNE TRESET ; thankfully not 5450 DEC TRAITOR ; else reduce wait time 5460 JMP DOCRASH 5470 TRESET 5480 LDA #1 5490 STA TRAITOR 5500 ; 5510 ; Change sub coords, handle crash 5520 ; 5530 DOCRASH 5540 LDA CRASHED 5550 BNE PARSER 5560 LDA RANDOM 5570 AND #$F8 5580 STA SLAT 5590 LDA RANDOM 5600 AND #$F8 5610 STA SLON 5620 LDA RED 5630 BEQ PARSER 5640 LDA DEPTH 5650 CLC 5660 CLD 5670 ADC #8 5680 STA DEPTH 5690 BPL PARSER 5700 STA CRASHED 5710 JSR CLWH 5720 PRINT T45 ; "BANG!" 5730 PRINT T78 ; "Sub hits bottom!" 5740 ; 5750 ; INPUT PARSER 5760 ; ------------ 5770 ; 5780 PARSER 5790 LDA #$22 5800 STA SDMCTL 5810 JSR GETLINE ; put line into INLINE 5820 JSR CLWH 5830 LDX LENGTH 5840 CPX #1 ; if length is 1 5850 BNE DOCLAUSE ; check for legality 5860 ; 5870 ; Check for a legal single-char command 5880 ; 5890 LDA INLINE ; get the character 5900 LDX #8 ; init search index 5910 LEGSING 5920 CMP SCOMS,X 5930 BEQ EXSING ; matched! go do it 5940 DEX ; otherwise 5950 BPL LEGSING ; keep searching 5960 JSR SYNERR ; error, so print 5970 PRINT T14 ; "Invalid command" 5980 JMP BADPARSE ; and try again 5990 ; 6000 ; Execute a single-char command 6010 ; 6020 EXSING 6030 LDA SVECTL,X ; fetch the lsb 6040 STA DOVECT ; and 6050 LDA SVECTH,X ; msb of the 6060 STA DOVECT+1 ; execution addr 6070 JMP (DOVECT) ; and do it! 6080 ; 6090 ; Find the 1st space character 6100 ; in the user's response 6110 ; 6120 DOCLAUSE 6130 LDA #SPACE 6140 STA PBUFF+1 6150 STA PBUFF+2 6160 LDX #1 6170 FIND1 6180 LDA INLINE,X ; length is in X 6190 CMP #SPACE ; is it a space? 6200 BEQ ENDV ; yes! 6210 INX ; else keep scanning 6220 CPX LENGTH 6230 BCC FIND1 6240 BADVERB 6250 JSR SYNERR ; verb is no good, so print 6260 PRINT T15 ; "Verb not recognized" 6270 JMP BADPARSE ; and try again 6280 ; 6290 ; Space char found, so record its 6300 ; position and move the first half 6310 ; of the clause into the parsing buffer 6320 ; 6330 ENDV 6340 STX LBREAK 6350 CPX #2 6360 BCC TOVB 6370 LDX #2 6380 TOVB 6390 LDA INLINE,X 6400 STA PBUFF,X 6410 DEX 6420 BPL TOVB 6430 ; 6440 ; Check for a legal verb 6450 ; 6460 LDX #0 ; init verb index 6470 STX VCODE 6480 VNEXT 6490 STX PDEX 6500 LDY #0 ; init buffer char index 6510 VSCAN 6520 LDA PBUFF,Y ; get a char from buffer 6530 CMP VERBS,X ; match? 6540 BNE NEXTRY ; nope - try another verb 6550 INX 6560 INY 6570 CPY #3 6580 BCC VSCAN ; if all 3 chars match 6590 BCS LEGALV ; the verb is legal 6600 NEXTRY 6610 INC VCODE 6620 LDX PDEX 6630 INX 6640 INX 6650 INX 6660 CPX #NV*3+3 ; out of verbs? 6670 BCC VNEXT ; nope - keep scanning 6680 BCS BADVERB ; else verb is worthless 6690 ; 6700 ; Verb is legal, so fetch its execution 6710 ; vector 6720 ; 6730 LEGALV 6740 LDA VCODE ; fetch verb # 6750 CMP #28 ; if it's GO, 6760 BNE MOVE2 ; warn user: 6770 PRINT T29 ; "Type N S E W U or D" 6780 JMP BADPARSE 6790 ; 6800 ; Move the second half of the 6810 ; clause into the parsing buffer 6820 ; 6830 MOVE2 6840 LDX LBREAK ; fetch pos. of space char 6850 INX ; plus 1 6860 LDY #0 ; init buffer char index 6870 MOVEN 6880 LDA INLINE,X ; fetch character 6890 STA PBUFF,Y ; stuff into buffer 6900 INX 6910 INY 6920 CPY #3 ; until 3 characters 6930 BCC MOVEN ; have been moved 6940 ; 6950 ; Check for a legal noun 6960 ; 6970 LDX #0 ; init noun index 6980 STX UCODE 6990 NNEXT 7000 STX PDEX 7010 LDY #0 ; init buffer char index 7020 NSCAN 7030 LDA PBUFF,Y ; get a char from buffer 7040 CMP NOUNS,X ; match? 7050 BNE NEXTRY2 ; nope - try another noun 7060 INX 7070 INY 7080 CPY #3 7090 BCC NSCAN ; if all 3 chars match 7100 BCS LEGALN ; the noun is legal 7110 NEXTRY2 7120 INC UCODE 7130 LDX PDEX 7140 INX 7150 INX 7160 INX 7170 CPX #NN*3+3 ; out of nouns? 7180 BCC NNEXT ; nope - keep scanning 7190 JSR SYNERR ; else noun is garbage 7200 PRINT T16 ; "Noun not in vocabulary" 7210 JMP BADPARSE 7220 ; 7230 ; Noun's code # is in UCODE; 7240 ; verb's code # is in VCODE; 7250 ; verb execution addr is in DOVECT 7260 ; 7270 LEGALN 7280 LDA VCODE ; fetch 7290 STA VLAST 7300 ASL A ; execution addr 7310 TAX ; and 7320 LDA VVECTS,X ; save it 7330 STA DOVECT ; in DOVECT 7340 INX 7350 LDA VVECTS,X 7360 STA DOVECT+1 7370 LDA UCODE 7380 STA ULAST 7390 CMP #39 ; was it BUTTON? 7400 BEQ DOBUTT 7410 CMP #40 ; was it INVENTORY? 7420 BEQ DOINVE 7430 TAX 7440 LDA NTRANS,X ; translate noun 7450 STA NCODE 7460 JMP (DOVECT) ; execute verb 7470 ; 7480 ; Handle BUTTON 7490 ; 7500 DOBUTT 7510 PRINT T30 ; "Refer to it by color" 7520 JMP BADPARSE 7530 ; 7540 ; Handle INVENTORY 7550 ; 7560 DOINVE 7570 PRINT T31 ; "Type I for inventory" 7580 JMP BADPARSE 7590 ; 7600 ; EXECUTE SINGLE-CHAR COMMANDS 7610 ; ---------------------------- 7620 ; 7630 ; COMMAND VECTOR TABLES 7640 ; --------------------- 7650 SVECTL 7660 .BYTE DOM, >DOM, >DOM, >DOM, >DOM 7700 .BYTE >DOM, >DOQ, >DOX, >DOA 7710 ; 7720 ; HANDLE "Q" (QUIT) 7730 ; ----------------- 7740 DOQ 7750 POSITION 13,12 7760 PRINT T19 ; "Type Y to quit game:" 7770 POSITION 34,12 7780 STX CURSEN ; enable cursor 7790 JSR BEEP 7800 JSR GETKEY 7810 CMP #'Y 7820 BEQ DOQUIT 7830 LDX #12 7840 JSR ERASE 7850 JMP BADPARSE 7860 DOQUIT 7870 JMP TITLE 7880 ; 7890 ; HANDLE MOVEMENT 7900 ; --------------- 7910 ; ENTRY: Vector (0-5) in X 7920 ; 7930 DOM 7940 LDA CURVECT,X 7950 BPL EXMOVE 7960 CANTGO 7970 PRINT T18 ; "You can't go that way." 7980 JMP BADPARSE 7990 EXMOVE 8000 CLD ; for safety 8010 STA NEWPLACE ; save destination 8020 JSR SAVELOC ; save status 8030 LDA NEWPLACE ; get destination, 8040 STA PLACE ; make it current, and 8050 REENTRY 8060 JSR BPOINT ; point to the new buffers 8070 ; 8080 ; Get new buffer data 8090 ; 8100 LDY #5 8110 RLOOP 8120 LDA (VPNT),Y 8130 STA CURVECT,Y 8140 LDA (OPNT),Y 8150 STA CUROBJS,Y 8160 DEY 8170 BPL RLOOP 8180 ; 8190 ; Refresh screen 8200 ; 8210 SHOWPLACE 8220 LDX #1 8230 JSR ERASE ; clear location window 8240 POSITION 13,1 8250 LDX PLACE ; get loc # 8260 LDA RDLS,X ; fetch lsb and 8270 LDY RDHS,X ; msb of text addr and 8280 JSR EPRINT ; print it 8290 ; 8300 JSR SHOWVIS ; display visible items 8310 JSR SHOWVECTS ; display new vectors 8320 JSR SHOWINV ; show inventory 8330 JMP POKAY ; congratulations! 8340 ; 8350 ; POINT TO NEW BUFFERS 8360 ; -------------------- 8370 ; ENTRY: Buffer # (0-23) in A 8380 ; 8390 BPOINT 8400 ASL A ; * 2 8410 STA NCODE ; save it 8420 ASL A ; * 4 8430 CLC 8440 ADC NCODE ; *2 + *4 = *6 8450 STA NCODE ; save it 8460 CLC 8470 ADC # VECTORS 8500 ADC #0 8510 STA VPNT+1 8520 CLC 8530 LDA NCODE 8540 ADC # OBJECTS 8570 ADC #0 8580 STA OPNT+1 8590 RTS 8600 ; 8610 ; HANDLE "X" (SAVE GAME) 8620 ; ---------------------- 8630 DOX 8640 JSR SAVELOC ; save current status 8650 JSR NEWSCREEN 8660 POSITION 5,11 8670 PRINT T82 ; "Save game to Disk or Cassette?" 8680 LDA #$22 8690 STA SDMCTL 8700 JSR BEEP 8710 SAVEPOLL 8720 JSR GETKEY 8730 CMP #'D 8740 BEQ DSAVE 8750 CMP #'C 8760 BEQ CSAVE 8770 BADWRITE 8780 JSR CLOSE1 8790 JSR BOOP 8800 JMP SAVEPOLL 8810 ; 8820 ; Save to disk 8830 ; 8840 DSAVE 8850 JSR DPOINT 8860 JMP GSAVE 8870 ; 8880 ; Save to cassette 8890 ; 8900 CSAVE 8910 JSR TPOINT 8920 ; 8930 GSAVE 8940 LDA #3 8950 STA ICCOM,X 8960 LDA #8 8970 STA ICAUX1,X 8980 LDA #0 8990 STA ICAUX2,X 9000 JSR CIOV 9010 BMI BADWRITE 9020 ; 9030 ; Write out game data 9040 ; 9050 WRITE 9060 LDX #$10 9070 LDA # GAMEDATA 9100 STA ICBADR+1,X 9110 LDA #$48 9120 STA ICBLEN,X 9130 LDA #$01 9140 STA ICBLEN+1,X 9150 LDA #11 9160 STA ICCOM,X 9170 JSR CIOV 9180 BMI BADWRITE 9190 JSR CLOSE1 9200 JMP PLAYSCREEN 9210 ; 9220 ; HANDLE "A" (AGAIN) 9230 ; ------------------ 9240 DOA 9250 LDA VLAST ; restore old verb 9260 STA VCODE 9270 LDA ULAST ; and noun 9280 STA UCODE 9290 JMP LEGALN ; and do it again! 9300 ; 9310 ; SAVE LOC STATUS 9320 ; --------------- 9330 SAVELOC 9340 LDA PLACE 9350 JSR BPOINT 9360 LDY #5 9370 SLOOP 9380 LDA CURVECT,Y 9390 STA (VPNT),Y 9400 LDA CUROBJS,Y 9410 STA (OPNT),Y 9420 DEY 9430 BPL SLOOP 9440 RTS 9450 ;