þþG X; ------------------------X; ONE FOR THE ROADX; by Clayton Walnum(X; ANALOG Computing #2X; (C)1985 ANALOG Computing<X; ------------------------FX;PX; MACRO DEFINITIONSZX; -----------------dX;nX; POSITION MACROxX; --------------‚ X; SYNTAX:ŒX; POSITION xpos,ypos–X; ‰POSITION ª 3 '3 ´ AŽPOS parametersA¾È   Ò%> Ü ‡POSIT13æð$> ú%>  …POSIT",X;6X; PRINT MACRO@X; -----------J X; SYNTAX:T+X; PRINT ^X;h †PRINT r  | A‘PRINTE parametersA† Q>4 š %>5 ¤ †EPRINT®¸ÂX;ÌX; TEXT MACROÖX; ----------à X; SYNTAX:êX; TEXT <"string">ôX;þ …TEXT  3  ATEXT parametersA& =ƒEOL0:DX;NX; SYSTEM EQUATESXX; ---------------bX;lX; ZERO-PAGEvX; ---------€…BOOT? ;; OS boot flagŠ†POKMSK;; interrupt mask”†RTCLOK;; system clockž†LMARGNR;; left margin¨†RMARGNS;; right margin²†ROWCRST;; cursor row¼†COLCRSU;; cursor columnƆRAMTOPj;; # pages of RAMÐ$ƒFR0Ô;; floating point registerÚƒCIXò;; FP index registerä†INBUFFó;; FP pointerîX;øX; PAGES 2-3X; --------- †VDSLST;; DLI vector!†SRTIMR+;; key repeat timer †SDMCTL/;; DMA control*†SDLSTL0;; D-list addr4†COLDSTD;; coldstart flag>†GPRIORo;; PMG priorityH†PCOLR0À;; player 0 colorR†PCOLR1Á;; player 1 color\†PCOLR2Â;; player 2 colorf†PCOLR3Ã;; player 3 colorp"†COLOR0Ä;; playfield 0 colorz"†COLOR1Å;; playfield 1 color„"†COLOR2Æ;; playfield 2 colorŽ!†COLOR4È;; background color˜†CRSINHð;; cursor inhibit¢…CHBASô;; adr of char set¬‚CHü;; keypress register¶…ICCOMB;; CIO commandÀ†ICBADRD;; CIO addrʆICBLENH;; CIO lengthÔ†ICAUX1J;; AUX byte 1Þ†ICAUX2K;; AUX byte 2èX;òX; CTIA/GTIAüX; ---------†HPOSP0Ð;; h-pos player 0†HPOSP1Ð;; " " 1†HPOSP2Ð;; " " 2$†HPOSP3Ð;; " " 3.†SIZEP0Ð;; width player 08†SIZEP1 Ð;; " " 1B†SIZEP2 Ð;; " " 2L†SIZEP3 Ð;; " " 3V"†GRAFP0 Ð;; graphics player 0`"†GRAFP1Ð;; " " 1j"†GRAFP2Ð;; " " 2t"†GRAFP3Ð;; " " 3~!†COLPF2Ð;; color register 2ˆ†CONSOLÐ;; console keys’X;œX; POKEY¦X; -----°#…AUDF1Ò;; frequency channel 1º"…AUDC1Ò;; vol/dist channel 1ĆAUDCTLÒ;; audio controlÎ#†RANDOM Ò;; random # generatorØ …IRQENÒ;; interrupt enableâX;ìX; ANTICöX; -----†DMACTLÔ;; DMA control "…WSYNC Ô;; wait for horz sync…NMIENÔ;; NMI enableX;(X; FLOATING POINT2X; --------------<„FASCæØ;; FP-to-ATASCIIFƒIFPªÙ;; integer-to-FPP„ZFR0DÚ;; clear FR0ZX;dX; OS ROUTINESnX; -----------x„CIOVVä;; CIO entry‚#†SETVBV\ä;; set v-blank vectorŒ†SYSVBV_ä;; OS VBI entry–†SIOINVeä;; SIO init X;ªX; INTERNAL EQUATES´X; ----------------¾X;È X; MEMORY ALLOCATIONÒ X; -----------------Ü"†INLINE;; text input bufferæˆGAMEDATAÀ:;; working areað)†EDLIST <;; start of E: display listú$†SCREEN@<;; start of screen RAMX;X; Game play databaseX;" ˆGAMEDATA,X;6…EVENT ;; event #@…PLACE ;; locationJ!‡CABINET ;; cabibet openedT#†RAFTIN ;; raft in the water^!‡INFLATE ;; raft inflated?h…CHEST ;; chest open?rƒJUG ;; jug open?|„ROBE ;; wearing robe?†&†SACRIF ;; sacrifice performed? †GOBLET ;; goblet filled?š!‡SHELVES ;; shelves moved?¤!…DRINK ;; liquid consumed?® …PAPER ;; paper inserted?¸ …PHOTO ;; photo inserted?Â&†DPLACE ;; location of dynamitẽOIL ;; oil poured?ÖƒLIT ;; match lit?à†MATCNT ;; # of matchesê$†CHECNT ;; chest turn counterô†WALLET þ$‡ROCKCNT ;; hit rocks counter„CORD ;; cord pulled?‡RAFTFND ;; raft found?"‡DYNAFND ;; dynamite found?&…SNAKE ;; snake dead?0…LASSO ;; got coconut?:†LITCNT ;; match counterD…BLAST ;; dynamite lit?N%ˆHOLDINGS ;; current inventoryX'‡VECTORS „;; current vector tableb'‡OBJECTS „;; current object tablel,†NTRANS &;; current translation matrixvX;€X; MISCELLANEOUSŠX; -------------” ƒEOL›ž …SPACE ¨ †SETPNTͲ †OFFCNTϼ†NEWSETDƆROMSETàÐX;ÚX; ZERO-PAGEäX; ---------î€øX;X; Cursor control X;$†CURSEN ;; cursor on/off flag &†CSHAPE ;; current cursor shape*#…BLINK ;; cursor blink timer4X;>X; Keyboard handlerHX;R"…CLICK ;; key click counter\&†LENGTH ;; line length registerfX;pX; DLI controlzX;„!†DLICOL ;; DLI color indexŽX;˜X; Screen clearing¢X;¬'‡CLPOINT ;; screen clear pointer¶$†CINDEX ;; window clear indexÀX;Ê X; ParserÔX;Þ…PBUFF ;; parsing bufferè„PDEX ;; scanning indexò$†LBREAK ;; pos. of space charü…VCODE ;; verb code # )…UCODE ;; untranslated noun code # '…NCODE ;; translated noun code # '†DOVECT ;; verb execution vector$ '‡CURVECT ;; current room vectors. '‡CUROBJS ;; current room objects8 $ˆNEWPLACE ;; next room code #B („VPNT ;; addr of current v-bufferL („OPNT ;; addr of current o-bufferV .†INVPOS ;; position in inventory buffer` *‡ROOMPOS ;; position in room bufferj '„ANY? ;; flag for empty room/invt …VLAST ;; last verb~ …ULAST ;; last nounˆ X;’ X; Event counterœ X;¦ …EBUFF ;; printing buffer° X;º X; INITIALIZATIONÄ X; --------------Î X;Ø €â X;ì …ENTRYö $> &†COLDST 2;; = 1 &…BOOT? ‡MOVESET;; redefine char set(  †SIOINV;; for sound init2 !…TITLE< X;F !X; CUSTOM DISPLAY LISTP !X; -------------------Z …DLISTd p=p=p=p;; blank 32 linesn % B=4†SCREEN=5†SCREEN;; text w/LMSx  =;; blank 4 w/DLI‚  ;; text (location)Œ  =;; blank 4 w/DLI–  ;; text (exits)   =;; blank 4 w/DLIª & =====;; text (v-items)´  =;; blank 4 w/DLI¾  =;; text (events)È  =;; blank 4 w/DLIÒ  =;; text (response)Ü  €=€=;; blank 4 w/DLIsæ & =====;; text (i-items)ð  p;; blank 8ú  A=4…DLIST=5…DLIST;; JVB X; X; TITLE SCREEN X; ------------" …TITLE, $>ÿ6 B@  ‰NEWSCREEN;; reset E:J ‰POSITION  =T #†PRINT ‚T0;; "Clayton Walnum's"^ ‰POSITION =h #†PRINT ‚T1;; "ONE FOR THE ROAD"r ‰POSITION = | +†PRINT ‚T2;; "(C)1985 ANALOG Computing"† X; ‡STARTOPš ‰POSITION =¤ 1†PRINT ‚T3;; "Press  ÓÔÁÒÔ  to play new game"® ‰POSITION =¸ 5†PRINT ‚T4;; "Press  ÏÐÔÉÏΠ to restore old game" X;Ì Q>Ö P†EDLIST ;; modifyà P†EDLIST ;; display listê X;ô Q>"þ P†SDMCTL;; restore screen „BEEP X; X; Wait for selection& X;0 „POLL: Q†CONSOLD R>;; scan until aN F„POLL;; key is pressedX …LETGOb $†CONSOLl (>v H…LETGO€ R>;; START pressed?Š !F‡NEWGAME;; yes, do a new game” R>;; OPTION pressed?ž $F‡RESTORE;; yes, restore old game¨ ‡BADPOLL²  „BOOP;; else¼ !„POLL;; resume scanÆ X;Ð X; Start new gameÚ X;ä ‡NEWGAMEî ˆINITDATAø !ŠPLAYSCREEN X; X; Restore a previous game X; ‡RESTORE* ‰POSITION =4 -†PRINT ‚T5;; "Restore from Disk or Tape?"> „BEEPH „DORTR †GETKEY\ R> D;; disk?f F‡GETDISKp R> C;; tape?z F†GETAPE„ ‡DORTERRŽ †CLOSE1˜ „BOOP¢ !„DORT¬ X;¶ X; Get game from diskÀ X;Ê ‡GETDISKÔ †DPOINTÞ !ˆREADOPENè X;ò X; Get game from tapeü X; †GETAPE †TPOINTX;$ ˆREADOPEN.Q>;; OPEN command8 P…ICCOM9BQ>;; READL P†ICAUX19VQ>` P†ICAUX29j „CIOVt G‡DORTERR~X;ˆ X; Get game data thru IOCB #1’X;œ ‡GETDATA¦$>°Q>4ˆGAMEDATAº P†ICBADR9ÄQ>5ˆGAMEDATAÎP†ICBADR9ØQ>Qâ P†ICBLEN9ìQ>öP†ICBLEN9Q>;; GET RECORD  P…ICCOM9 „CIOV G‡DORTERR( †CLOSE12X;<X; PLAYSCREEN INITFX; ---------------PŠPLAYSCREENZ ‰NEWSCREEN;; reset E:dX;n X; Enable custom display listxX;‚ Q>4…DLISTŒ P†SDLSTL– Q>5…DLIST P†SDLSTLªX;´X; Print title & labels¾X;È+†PRINT ‚T6;; "ONE FOR THE ROAD EVENT #"ÒQ> ;; set right marginÜP†RMARGN;; for wraparoundæ!†PRINT ‚T7;; "LOCATION/EXITS"ð †PRINT ‚T8;; "VISIBLE ITEMS"ú ƒBAR ƒBAR ƒBAR ƒBAR;; 4 blank bars" ‡SAYWHAT;; "WHAT",)†PRINT ƒT11;; "HAPPENS/YOUR RESPONSE"6 ‡SAYWHAT;; "WHAT"@$†PRINT ƒT12;; "YOU ARE CARRYING"J ƒBART ƒBAR;; more blank bars^Q>'hP†RMARGN;; resetrX;|Q> ;; white†P†PCOLR0;; cursorX;šX; Setup P/M borders & mask¤X;®Q>0¸P†HPOSP1;; position left Q>Ê;; andÌP†HPOSP2;; right bordersÖ Q>@;; andàP†HPOSP3;; title coverê$>ÿô&†GRAFP1;; set upþ&†GRAFP2;; side borders and&†GRAFP3;; title mask 2;; = 0&†SIZEP0;; set cursor width& 2;; = 10!&†GPRIOR;; set player priority:Q>DP†SIZEP1;; set borderNP†SIZEP2;; and maskXP†SIZEP3;; widthsbX;lQ>ð;; initvP†CSHAPE;; cursor shape€ Q>;; andŠP…BLINK;; blink timer”X;žQ> ¨P†LMARGN;; init left margin²X;¼%>4†IMMVBI;; set VBI vector,Æ$>5†IMMVBI;; specifyingÐQ>;; immediate-modeÚ †SETVBVäX;î Q>4ƒDLIøP†VDSLST;; tell OS whereQ>5ƒDLI;; we put our $P†VDSLST;; DLI service routine!Q>À;; set bits 6 & 7 of NMIEN $P…NMIEN;; to enable DLIs and VBIs*X;4 Q…PLACE> !‡REENTRYHX;RX; EVENT GENERATOR\X; ---------------fX;p ‰NEXTEVENTz$>ÿ;; empty stack„B;; just in case!Ž †SHOWEV;; show event #˜#…EVENT;; update¢HˆHITROCKS;; event¬#…EVENT;; counter¶X;ÀX; Handle rocksÊX;Ô ˆHITROCKSÞ Q…PLACEèR>òD‚R1ü !‡EXPLODE‚R1 "‡ROCKCNT Q‡ROCKCNT$ H‡EXPLODE. ‰NEWSCREEN8‰POSITION  =B+†PRINT ƒT77;; "Crashing into the rocks"L !…KILLSVX;`X; Handle explosionjX;t ‡EXPLODE~Q…BLAST;; counter set?ˆFˆCHESTRTN;; no’"…BLAST;; -1 from counterœQ…BLAST;; time to explode?¦HˆCHESTRTN;; no° Q…PLACEº.R†DPLACE;; player in same room as dynamite?ÄF„EXP4;; yes, too bad!ÎQ>;; dynamiteØ †OWNIT?âF„EXP4;; deep trouble!ì Q†DPLACE;; room with dynamiteö"T?;; * 2 ; calculate positionP…NCODE;; in objects buffer  T?;; * 4,O…NCODE;; *2 + *4 = *6(O>2?;; use Y as index<„EXP0FQ‡OBJECTS8;; get objectPR>;; dynamite?ZF„EXP1;; sure is!d1nH„EXP0;; try next objectx„EXP1‚ Q†DPLACEŒR> ;; explosion in room 9?–H„EXP3;; nope Q>;; caveªP‡OBJECTS8;; put in room 9´Q> ;; new room vector¾P‡VECTORS9È„EXP2Ò‰POSITION  = Ü!†PRINT ƒT48;; "Booooommmmm!!"æ „BOOMð !ˆCHESTRTNú„EXP3Q>ÿ#P‡OBJECTS8;; get rid of dynamite H„EXP2"„EXP4, ‰NEWSCREEN6‰POSITION  =@"†PRINT ƒT73;; "Huge explosion"J „BOOMT !…KILLS^X;hX; handle chestrX;| ˆCHESTRTN† Q†CHECNTR>ÿ;; chest already placed?šFˆMATCHRTN;; yes¤$R>;; time for chest to show up?®H…CRTN1;; nope¸Q…PLACE;; current roomÂR>;; is it room 3?ÌFˆMATCHRTN;; yesÖ'%>;; point to room 3 object bufferà„CRTNê Q‡OBJECTS8ôR>ÿ;; got space?þF…CRTN0;; yes!1)>;; end of room 3 buffer?H„CRTN;; no, try again&FˆMATCHRTN;; no space yet0 …CRTN0:Q>;; chestDP‡OBJECTS8;; put in roomN …CRTN1X "†CHECNTbX;lX; handle matchesvX;€ ˆMATCHRTNŠQƒLIT;; match lit?”F‡DRNKRTN;; nopež"†LITCNT;; -1 from counter¨H‡DRNKRTN;; still lit²Q>¼PƒLIT;; match goes out½‰POSITION  = ¾"†PRINT ƒT29;; "Match goes out" X;X; handle liquid X;* ‡DRNKRTN4Q…DRINK;; drank liquid?>F†PARSER;; noH#"…DRINK;; yes, decrement counterRQ…DRINK;; time up?\H†PARSER;; no, whew!f ‰NEWSCREENp‰POSITION  =z"†PRINT ƒT32;; "Strange liquid"„ !…KILLSŽX;˜X; INPUT PARSER¢X; ------------¬X;¶ †PARSERÀQ>"Ê P†SDMCTLÔ# ‡GETLINE;; put line into INLINEÞ „CLWHè $†LENGTHò(>;; if length is 1ü"HˆDOCLAUSE;; check for legalityX;+X; Check for a legal single-char commandX;$Q†INLINE;; get the character.$>;; init search index8 ‡LEGSINGB R…SCOMS9LF†EXSING;; matched! go do itV0;; otherwise`I‡LEGSING;; keep searchingj †SYNERR;; error, so printt#†PRINT ƒT14;; "Invalid command"~!ˆBADPARSE;; and try againˆX;’#X; Execute a single-char commandœX;¦ †EXSING°Q†SVECTL9;; fetch the lsbºP†DOVECT;; andÄQ†SVECTH9;; msb of theÎP†DOVECT;; execution addrØ!@†DOVECT:;; and do it!âX;ì"X; Find the 1st space characteröX; in the user's responseX;  ˆDOCLAUSE Q>…SPACE P…PBUFF( P…PBUFF2$>< …FIND1FQ†INLINE9;; length is in XPR>…SPACE;; is it a space?ZF„ENDV;; yes!d2;; else keep scanningn (†LENGTHx D…FIND1‚ ‡BADVERBŒ' †SYNERR;; verb is no good, so print–'†PRINT ƒT15;; "Verb not recognized" !ˆBADPARSE;; and try againªX;´%X; Space char found, so record its¾&X; position and move the first halfÈ+X; of the clause into the parsing bufferÒX;Ü„ENDVæ &†LBREAKð(>ú D„TOVB$>„TOVB Q†INLINE9" P…PBUFF9,06 I„TOVB@X;JX; Check for a legal verbTX;^$>;; init verb indexh &…VCODEr …VNEXT| &„PDEX† %>;; init buffer char index …VSCANš$Q…PBUFF8;; get a char from buffer¤R…VERBS9;; match?®%H†NEXTRY;; nope - try another verb¸2Â3Ì)>Ö!D…VSCAN;; if all 3 chars matchàE†LEGALV;; the verb is legalê †NEXTRYô #…VCODEþ $„PDEX222&(>‚NV;; out of verbs?0!D…VNEXT;; nope - keep scanning:%E‡BADVERB;; else verb is worthlessDX;N+X; Verb is legal, so fetch its executionX X; vectorbX;²!X; Move the second half of the¼$X; clause into the parsing bufferÆX;Ð †LEGALVÚ&$†LBREAK;; fetch pos. of space charä 2;; plus 1î %>;; init buffer char indexø …MOVENQ†INLINE9;; fetch character P…PBUFF8;; stuff into buffer2 3*)>;; until 3 characters4D…MOVEN;; have been moved>X;HX; Check for a legal nounRX;\$>;; init noun indexf &…UCODEp …NNEXTz &„PDEX„ %>;; init buffer char indexŽ …NSCAN˜$Q…PBUFF8;; get a char from buffer¢R…NOUNS9;; match?¬&H‡NEXTRY2;; nope - try another noun¶2À3Ê)>Ô!D…NSCAN;; if all 3 chars matchÞE†LEGALN;; the noun is legalè ‡NEXTRY2ò #…UCODEü $„PDEX222$(>‚NN;; out of nouns?.!D…NNEXT;; nope - keep scanning8" †SYNERR;; else noun is garbageB†PRINT ƒT16;; "Bad noun"L !ˆBADPARSEVX;` X; Noun's code # is in UCODE;j X; verb's code # is in VCODE;t&X; verb execution addr is in DOVECT~X;ˆ †LEGALN’Q…VCODE;; fetchœ P…VLAST¦T?;; execution addr° >;; andºQ†VVECTS9;; save itÄP†DOVECT;; in DOVECTÎ2Ø Q†VVECTS9âP†DOVECTì Q…UCODEö P…ULAST>Q†NTRANS9;; translate noun( P…NCODE2!@†DOVECT:;; execute verbxX;‚*X; EXECUTE SINGLE-CHAR COMMANDSŒ*X; ----------------------------–X; #X; COMMAND VECTOR TABLESª#X; ---------------------´ †SVECTL¾! 4ƒDOM=4ƒDOM=4ƒDOM=4ƒDOM=4ƒDOMÈ 4ƒDOM=4ƒDOQ=4ƒDOX=4ƒDOAÒ †SVECTHÜ! 5ƒDOM=5ƒDOM=5ƒDOM=5ƒDOM=5ƒDOMæ 5ƒDOM=5ƒDOQ=5ƒDOX=5ƒDOAðX;úX; HANDLE "Q" (QUIT)X; -----------------ƒDOQ‰POSITION  = "(†PRINT ƒT19;; "Type Y to quit game:",‰POSITION "= 6&†CURSEN;; enable cursor@ „BEEPJ †GETKEYTR> Y^ F†DOQUITh$> r …ERASE| !ˆBADPARSE† †DOQUIT !…TITLEšX;¤X; HANDLE MOVEMENT®X; ---------------¸X; ENTRY: Vector (0-5) in XÂX;̃DOMÖ Q‡CURVECT9à I†EXMOVEê †CANTGOô*†PRINT ƒT18;; "You can't go that way."þ !ˆBADPARSE †EXMOVE -;; for safety PˆNEWPLACE;; save destination& R>;; going to room 2?0 H…EXMV0;; no: Q‡INFLATE;; raft inflated?D F…EXMV3;; noN $†RAFTIN;; raft in the water?X F…EXMV3;; nob H…EXMV2l …EXMV0v R>;; going to room 1?€ H…EXMV1;; noŠ $‡INFLATE;; raft inflated?” F…EXMV2;; nož Q>;; raft¨ †OWNIT?² F…EXMV4¼ …EXMV1Æ R> ;; going to room 9?Ð H…EXMV2;; noÚ Q…SNAKE;; snake dead?ä H…EXMV2;; yesî (†PRINT ƒT46;; "Snake won't let you!"ø !‰GOODPARSE! …EXMV2 ! ‡SAVELOC;; save status! QˆNEWPLACE;; get destination, !!P…PLACE;; make it current, and*! ‡REENTRY4!& †BPOINT;; point to the new buffers>!X;H!X; Get new buffer dataR!X;\!%>f! …RLOOPp! Q@„VPNT7z! P‡CURVECT8„! Q@„OPNT7Ž! P‡CUROBJS8˜!1¢! I…RLOOP¬!X;¶!X; Refresh screenÀ!X;Ê! ‰SHOWPLACEÔ!$>Þ!" …ERASE;; clear location windowè!‰POSITION  =ò!$…PLACE;; get loc #ü! †CHGCLR;; set screen colors"Q„RDLS9;; fetch lsb and"!%„RDHS9;; msb of text addr and" †EPRINT;; print it$"X;."$ ‡SHOWVIS;; display visible items8"$ ‰SHOWVECTS;; display new vectorsB" ‡SHOWINV;; show inventoryL"!…POKAY;; congratulations!V" …EXMV3`" ‰NEWSCREENj"‰POSITION  =t"&†PRINT ƒT71;; "Storm tossed ocean"~" !…KILLSˆ" …EXMV4’""†PRINT ƒT38;; "Raft's too big"œ"!‰GOODPARSE¦"X;°""X; POINT TO NEW BUFFERSº""X; --------------------Ä"!X; ENTRY: Buffer # (0-23) in AÎ"X;Ø" †BPOINTâ" T?;; * 2ì"P…NCODE;; save itö" T?;; * 4#, #O…NCODE;; *2 + *4 = *6#P…NCODE;; save it#,(#O>4‡VECTORS2# P„VPNT<#Q>5‡VECTORSF#O>P# P„VPNTZ#,d# Q…NCODEn#O>4‡OBJECTSx# P„OPNT‚#Q>5‡OBJECTSŒ#O>–# P„OPNT #:ª#X;´#$X; HANDLE "X" (SAVE GAME)¾#$X; ----------------------È#ƒDOXÒ#" ‡SAVELOC;; save current statusÜ# ‰NEWSCREENæ#‰POSITION = ð#2†PRINT ƒT82;; "Save game to Disk or Cassette?"ú#Q>"$ P†SDMCTL$ „BEEP$ ˆSAVEPOLL"$ †GETKEY,$R> D6$ F…DSAVE@$R> CJ$ F…CSAVET$ ˆBADWRITE^$ †CLOSE1h$ „BOOPr$ !ˆSAVEPOLL|$X;†$X; Save to disk$X;š$ …DSAVE¤$ †DPOINT®$ !…GSAVE¸$X;Â$X; Save to cassetteÌ$X;Ö$ …CSAVEà$ †TPOINTê$X;ô$ …GSAVEþ$Q>% P…ICCOM9%Q>% P†ICAUX19&%Q>0% P†ICAUX29:% „CIOVD% GˆBADWRITEN%X;X%X; Write out game datab%X;l% …WRITEv%$>€%Q>4ˆGAMEDATAŠ% P†ICBADR9”%Q>5ˆGAMEDATAž%P†ICBADR9¨%Q>Q²% P†ICBLEN9¼%Q>Æ%P†ICBLEN9Ð%Q> Ú% P…ICCOM9ä% „CIOVî% GˆBADWRITEø% †CLOSE1&!ŠPLAYSCREEN &X;& X; HANDLE "A" (AGAIN) & X; ------------------*&ƒDOA4&Q…VLAST;; restore old verb>& P…VCODEH&Q…ULAST;; and nounR& P…UCODE\&!†LEGALN;; and do it again!f&X;p&X; SAVE LOC STATUSz&X; ---------------„& ‡SAVELOCŽ& Q…PLACE˜& †BPOINT¢&%>¬& …SLOOP¶& Q‡CURVECT8À& P@„VPNT7Ê& Q‡CUROBJS8Ô& P@„OPNT7Þ&1è& I…SLOOPò&:ü&X;