þþ?W X; VERB EXECUTORSX; --------------X;(&X; ENTRY: Translated noun code in A2X; and in NCODE;<'X; untranslated code in UCODEFX;PX; TAKEZX; ----d †DOTAKEn Q…UCODExR>;; is it moveable?‚EƒDT0;; yesŒ !†IMPOSS–ƒDT0  Q…NCODEª †OWNIT?;; already have it?´HƒDT1¾ !‡ALREADYȃDT1Ò Q…NCODEÜ ‡INROOM?;; is it here?æFƒDT3ð !‡NOTHEREúƒDT3 ‰INVSPACE?;; arms full?FƒDT4 !ˆARMSFULL"ƒDT4,"$‡ROOMPOS;; get object position6%†INVPOS;; and inv position@Q‡CUROBJS9;; pick it upJ!PˆHOLDINGS8;; add to inventoryTQ>ÿ^"P‡CUROBJS9;; leave a blank sloth ‡SHOWALLr ‡SHOWVIS;; show room| ‡SHOWINV;; and inventory†!…POKAY;; done!X;šX; DROP¤X; ----® †DODROP¸ †OWNIT?;; do you have it?ÂFƒDD0Ì !ˆDONTHAVEÖƒDD0à% ŠROOMSPACE?;; enough room for it?êFƒDD1ô !ˆROOMFULLþƒDD1 Q…NCODER>;; robe? HƒDD2;; no&Q>0P„ROBE;; turn off flag: F†DROPITDƒDD2NR>;; dynamite?XH†DROPIT;; nob Q…PLACE;; keep track of wherelP†DPLACE;; the dynamite isv †DROPIT€ $‡ROOMPOSŠ %†INVPOS”QˆHOLDINGS8ž P‡CUROBJS9¨Q>ÿ²PˆHOLDINGS8¼ H‡SHOWALLÆX;ÐX; KICKÚX; ----ä †DOKICKîR>;; cabinet?ø HƒDK1;; no Q…PLACE HƒDK0Q‡CABINET;; already open? HƒDK1;; sure is!*Q>4P‡CABINET;; set flag>&†PRINT ƒT43;; "Ouch! But it opens"H!‰GOODPARSERƒDK0\ !‡NOTHEREfƒDK1p !‡WHYBOTHzX;„X; LOOK/EXAMŽX; ---------˜ †DOLOOK¢ Q…UCODE¬R>';; button?¶F„CABC;; yepÀR>);; cord?ÊF„CABC;; yepí Q…NCODEò …DLRF1÷R>;; raft?üH…DOLK1;; no Q…PLACER>;; in raft? H„DOLK$!ƒLK4.„DOLK8 Q…NCODEB …DOLK1L ‡INROOM?;; is it in room?V F†LOOKOK`Q…NCODE;; if not,j †OWNIT?;; do you have it?t F†LOOKOK~!‡NOTHERE;; guess notˆ †LOOKOK’ Q…NCODEœR>;; cabinet?¦HƒLK0°Q‡CABINET;; already open?ºH„CAB0;; yep!ĆPRINT ƒT26;; "It's stuck"Î!‰GOODPARSEØ„CAB0âQ‡RAFTFND;; found raft?ìF„CAB1;; nopeí„CABCö!ˆSEEMSORD;; yep„CAB1  ŠROOMSPACE?;; room for raft?F„CAB2;; sure is!!ˆROOMFULL;; guess not(„CAB22$†PRINT ƒT35;; "Found something!"<Q>;; raftFP‡RAFTFND;; set flagP $‡ROOMPOSZ P‡CUROBJS9;; put raft in roomd ‡SHOWVISn!‰GOODPARSExƒLK0‚R>;; chest?Œ HƒLK1;; no–Q…CHEST;; already open? HƒCH0;; yesª"†PRINT ƒT42;; "From your boat"´!‰GOODPARSE¾ƒCH0ÈQ‡DYNAFND;; found dynamite?ÒFƒCH1;; not yetÜ !ˆSEEMSORDæƒCH1ð$ ŠROOMSPACE?;; room for dynamite?úFƒCH2;; yep!!ˆROOMFULL;; no wayƒCH2$†PRINT ƒT35;; "Found something!""Q>;; dynamite,P‡DYNAFND;; set flag6 $‡ROOMPOS@$P‡CUROBJS9;; put dynamite in roomJ ‡SHOWVIST!‰GOODPARSE^ƒLK1hR>;; jug?r HƒLK2;; no|QƒJUG;; already open?† H‚J0;; yes"†PRINT ƒT51;; "Tightly corked"š!‰GOODPARSE¤‚J0®#†PRINT ƒT54;; "Filled with oil"¸!‰GOODPARSEƒLK2ÌR>;; machine?Ö HƒLK3;; noà Q…PLACEêR>;; in stone house?ô H‚M0;; noþ †PRINT ƒT50;; "Has a button"!‰GOODPARSE‚M0R>;; in secret room?& HƒLK3;; no0'†PRINT ƒT62;; "Has button and slot":!‰GOODPARSEDƒLK3NR>;; walletXHƒLK4b$†WALLET;; already looked?lHƒLK4;; yepv ‰INVSPACE?€HƒWL0ŠQ>;; photo”P†WALLET;; set flagž $†INVPOS¨&PˆHOLDINGS9;; give player the photo²#†PRINT ƒT35;;"Found Something!"¼ ‡SHOWINVÆ!‰GOODPARSEЃWL0Ú !ˆROOMFULLäƒLK4î T?;; * 2ø>;; use as an indexQ„LKLK9;; fetch lsb  2;; and%„LKLK9;; msb of text addr  †EPRINT;; print text*ƒLKX4!‰GOODPARSE;; and exit>X;H$X; EXAM TEXT LOOKUP TABLER$X; ----------------------\„LKLKf ƒT34=ƒT34=ƒT34=ƒT41p ƒT83=ƒT34=ƒT49=ƒT34z ƒT34=ƒT34=ƒT52=ƒT34„ ƒT84=ƒT34=ƒT34=ƒT34Ž ƒT34=ƒT34=ƒT34=ƒT34˜ ƒT68=ƒT60=ƒT36=ƒT34¢ ƒT34=ƒT45=ƒT34=ƒT34¬ ƒT34=ƒT34=ƒT34=ƒT34¶ ƒT34=ƒT34=ƒT34ÀX;ÊX; READÔX; ----Þ †DOREADè !†IMPOSSòX;üX; PULL X; ---- X; †DOPULL$ Q…UCODE% R>;; door?& FƒDP2. R>);; cord?8 HƒDP0;; noB Q>;; raftL †OWNIT?V HƒDP1` Q‡INFLATE;; already inflated?j HƒDP2;; yest Q>~ P‡INFLATE;; set flagˆ !†PRINT ƒT37;; "Raft inflates"’ !‰GOODPARSEœ ƒDP0¦ !‡WHYBOTH° ƒDP1º !ˆDONTHAVEÄ ƒDP2Î !†NOTHAPØ X;â X; PUSHì X; ----ö †DOPUSH †OWNIT? HƒDPH !‡WHYBOTH ƒDPH( Q…PLACE2 R>;; in room 14?< F„DPH0;; yesF R>;; in room 20?P F„DPH1;; yesZ !‡WHYBOTHd „DPH0n "Q†SACRIF;; sacrifice performed?x F„DPH3;; no‚ Q>;; gobletŒ †OWNIT?– H„DPH4  Q†GOBLET;; already filled?ª H„DPH4;; yes´ Q>¾ P†GOBLET;; set flagÈ '†PRINT ƒT59;; "Liquid fills goblet"Ò !‰GOODPARSEÜ „DPH1æ "Q†SACRIF;; sacrifice performed?ð F„DPH3;; noú Q…DRINK;; drank liquid? F„DPH5;; nope, trouble! Q…PAPER;; paper inserted? H„DPH2;; yes" Q…PHOTO;; photo inserted?, F„DPH5;; no, too bad!6 …FLASH@ …FLASHJ  ‰NEWSCREENT ‰POSITION  = ^ !†PRINT ƒT86;; "You are home!"h Q>"r P†SDMCTL;; turn on screen| †SOLVED† !†SOLVED „DPH2š …FLASH¤ …FLASH® Q>¸ P…PAPER;; turn off flag Q>Ì !†EXMOVEÖ „DPH3à !†NOTHAPê „DPH4ô !†PRINT ƒT44;; "Liquid spills"þ !‰GOODPARSE „DPH5  ‰NEWSCREEN ‰POSITION =& #†PRINT ƒT76;; "Blast of energy"0 !…KILLS: X;D X; OPENN X; ----X †DOOPENb ‡INROOM?l F†OPENOKv Q…NCODE€ †OWNIT?Š F†OPENOK” !‡NOTHEREž †OPENOK¨ Q…NCODE² R>;; cabinet?¼ HƒOP0;; no¾ Q‡CABINET;; already open?¿ HƒOPC;; yep!Æ †PRINT ƒT26;; "It's stuck"Ð !‰GOODPARSEÚ ƒOP0ä R>;; chest?î HƒOP1;; noø $…CHEST;; already open? F„CHE1;; no ƒOPC %†PRINT ƒT80;; "Already did that!" !ˆBADPARSE „CHE1* P…CHEST;; set flag4 †PRINT ƒT58;; "You open it"> !‰GOODPARSEH ƒOP1R R>;; jug?\ HƒOP2;; nof $ƒJUG;; already open?p FƒJU0;; noz %†PRINT ƒT80;; "Already did that!"„ !‰GOODPARSEŽ ƒJU0˜ †PRINT ƒT53;; "With what?"¢ !‰GOODPARSE¬ ƒOP2¶ !†IMPOSSÀ X;Ê X; KILLÔ X; ----Þ †DOKILLè R>;; snake?ò H„DKI0;; noü Q…SNAKE;; already dead?H„DKI0;; yepQ>;; coconut †OWNIT?$ H„DKI1.Q>;; snake8 ‡INROOM?B H„DKI0L)†PRINT ƒT47;; "Coconut clobbers him!"VQ>;; dead snake` $‡ROOMPOSjP‡CUROBJS9;; put in roomt P…SNAKE~ ‡SHOWVISˆ!‰GOODPARSE’„DKI0œ !†IMPOSS¦„DKI1° ‰NEWSCREENº‰POSITION =ĆPRINT ƒT78;; "Snake bite"Î !…KILLSØX;âX; INSERTìX; ------öX; ˆDOINSERT  †OWNIT? H„DIN2 Q…NCODE(R>;; photo?2H„DIN0;; no<P…PHOTO;; set flagFQ>P P…PAPER;; turn off other flagZ F„DIN1d„DIN0nR>;; paper?x H„DIN3‚P…PAPER;; set flagŒ„DIN1–Q>ÿ  PˆHOLDINGS9;; remove from invª!†PRINT ƒT57;; "Into the slot"´ ‡SHOWINV¾!‰GOODPARSEÈ„DIN2Ò !ˆDONTHAVEÜ„DIN3æ !†IMPOSSðX;úX; CLIMBX; ----- ‡DOCLIMBR>;; gate?" HƒDC1;; no, Q…PLACE6R> ;; in room 11?@ HƒDC0;; noJQ> ;; room 12T!†EXMOVE;; move to new room^ƒDC0hR> ;; in room 12?rHƒDC2;; nope|Q> ;; room 11†!†EXMOVE;; move to new roomƒDC1š !†IMPOSS¤ƒDC2® !‡NOTHERE¸X;ÂX; DRINKÌX; -----ÖX;à ‡DODRINKê Q…UCODEôR>+;; liquid?þH„DDRK;; noQ>;; goblet †OWNIT? H…DDRK0&Q†GOBLET;; goblet filled?0F…DDRK0;; no:Q…DRINK;; already drank?DH…DDRK1;; yep! Trouble!NQ>;; # turns to surviveXP…DRINK;; set counterbQ>lP†GOBLET;; goblet now emptyv%†PRINT ƒT64;; "One for the Road!"€!‰GOODPARSEŠ„DDRK” !†IMPOSSž …DDRK0¨ !ˆDONTHAVE² …DDRK1¼ ‰NEWSCREENƉPOSITION  =Ð&†PRINT ƒT32;; "The strange liquid"Ú !…KILLSäX;îX; ROWøX; --- …DOROW R>;; raft? HƒDR0;; no Q>;; oars* †OWNIT?4HƒDR1> Q…PLACEHR>;; in raft?R HƒDR0;; no\Q>;; room 3f !†EXMOVEpƒDR0z !†IMPOSS„ƒDR1Ž !†NOTYET˜X;¢X; POUR¬X; ----¶X;À †DOPOURÊ Q…UCODEÔR>*;; oil?ÞH„DPR0;; noè Q>;; jugò †OWNIT?ü H„DPR1QƒJUG;; is it open?F„DPR2;; noQƒOIL;; already poured?$H„DPR3;; yes. Q…PLACE8R>;; player in room 18?BH„DPR4;; noLPƒOIL;; set flagV"†PRINT ƒT74;; "On the carcass"`!‰GOODPARSEj„DPR0t !†IMPOSS~„DPR1ˆ !ˆDONTHAVE’„DPR2œ !†NOTYET¦„DPR3°$†PRINT ƒT80;; "Already did that"º !ˆBADPARSEÄ„DPR4Î'†PRINT ƒT85;; "Don't do that here!"Ø!‰GOODPARSEâX;ìX; THROWöX; ----- ‡DOTHROWR>;; dynamite?HƒDTH !†DODROPƒDTH  †OWNIT? H„DTH1 Q…NCODE(R>;; raft?2H„DTH0;; no< Q…PLACEFR>;; in room 1?PH„DTH0;; noZQ>ÿdP†RAFTIN;; set flagn%PˆHOLDINGS9;; remove raft from invx"†PRINT ƒT39;; "Into the ocean"‚ ‡SHOWINVŒ!‰GOODPARSE–„DTH0  !‡WHYBOTHª„DTH1´ !ˆDONTHAVE¾X;ÈX; WEARÒX; ----Ü †DOWEARæR>;; robe?ðH„DWR1;; noúQ„ROBE;; already wearing it?HƒDWR;; yes Q…NCODE †OWNIT?" H„DWR0,Q>6P„ROBE;; set flag@'†PRINT ƒT70;; "You put on the robe"J!‰GOODPARSETƒDWR^$†PRINT ƒT80;; "Already did that"h !ˆBADPARSEr„DWR0| !ˆDONTHAVE†„DWR1 !†IMPOSSšX;¤X; WITH®X; ----¸X; †DOWITHÌR>;; knifeÖ H„DWTHà †OWNIT?ê H…DWTH1ô Q>;; jugþ †OWNIT? H„DWTHQƒJUG;; already open?H…DWTH0;; yes&Q>0PƒJUG;; set flag:†PRINT ƒT58;; "You open it"D!‰GOODPARSEN„DWTHX !‡WHYBOTHb …DWTH0l$†PRINT ƒT80;; "Already did that"v !ˆBADPARSE€ …DWTH1Š !†NOTYET”X;žX; LIGHT¨X; -----²X;¼ ‡DOLIGHTÆR>;; match?ÐH„DLT2;; noÚ †OWNIT?ä H„DLT0î Q†MATCNT;; have matches left?øF„DLT1;; all gone"†MATCNT;; use 1 match PƒLIT;; set flagQ> #P†LITCNT;; life of burning match*%†PRINT ƒT88;; "Don't get burned!"4!‰GOODPARSE>„DLT0H !ˆDONTHAVER„DLT1\†PRINT ƒT79;; "None left"f!‰GOODPARSEp„DLT2zR>;; dynamite?„H„DLT4;; noŽ ‡INROOM?˜ F„DLT3¢Q>¬ †OWNIT?¶ H„DLT6À„DLT3ÊQƒLIT;; match lit?ÔF„DLT6;; noÞQ>èP…BLAST;; set counterò !…POKAYü„DLT4 Q…UCODE R>*;; oil F„DLTOR> ;; carcass? H„DLT6#„DLTO$ Q…PLACE.R>;; in room 18?8 H„DLT6BQ>;; carcassL ‡INROOM?V H„DLT6`QƒOIL;; oil poured?j F„DLT6tQƒLIT;; match lit?~ F„DLT6ˆQ„ROBE;; wearing robe?’F„DLT7;; no, too bad!œP†SACRIF;; set flag¦&†PRINT ƒT55;; "A fiery sacrifice!"°Q>;; carcassº ‡INROOM?ÄQ>ÿÎ"P‡CUROBJS9;; get rid of carcassØ ‡SHOWVISâ!‰GOODPARSEì„DLT5ö !†IMPOSS„DLT6  !†NOTYET„DLT7 ‰NEWSCREEN(‰POSITION =2†PRINT ƒT75;; "Blasphemy!"< !…KILLSFX;PX; LASSOZX; -----dX;n ‡DOLASSOxR>;; coconut?‚H„DLA0;; noŒQ>;; rope– †OWNIT?  H„DLA1ª Q…PLACE´R>;; in room 6?¾H„DLA2;; noÈQ…LASSO;; already got one?ÒH„DLA3;; yepÜ& ŠROOMSPACE?;; someplace to put it?æH„DLA4;; all filled up!ðQ>;; coconutúP‡CUROBJS9;; put in room ‡SHOWVIS !…POKAY„DLA0" !†IMPOSS,„DLA16†PRINT ƒT53;; "With what?"@!‰GOODPARSEJ„DLA2T†PRINT ƒT40;; "Too high"^!‰GOODPARSEh„DLA3r !‡WHYBOTH|„DLA4† !ˆROOMFULLX;šX; MOVE¤X; ----®X;¸ †DOMOVEÂR> ;; shelves?Ì HƒDMV;; noÖ ‡INROOM?à H„DMV0êQ‡SHELVES;; already moved?ôH„DMV1;; yepþ ŠROOMSPACE? H„DMV2Q> ;; secret doorwayP‡SHELVES;; set flag& P‡CUROBJS9;; put door in room0$†PRINT ƒT35;; "Found something!":Q>;; new room vectorDP‡CURVECT;; add new exitN ‰SHOWVECTSX ‡SHOWVISb!‰GOODPARSElƒDMVv !†IMPOSS€„DMV0Š !‡NOTHERE”„DMV1ž !‡WHYBOTH¨„DMV2² !ˆROOMFULL¼X;Æ †IMPOSSÐ&†PRINT ƒT17;; "That's impossible."ÚH‰GOODPARSEäX;î †NOTYETø*†PRINT ƒT23;; "You can't do that yet."H‰GOODPARSE X; ˆARMSFULL -†PRINT ƒT24;; "You're carrying too much!"* HˆBADPARSE4X;> ˆROOMFULLH)†PRINT ƒT25;; "Not enough room here."R HˆBADPARSE\X;f ‡NOTHEREp"†PRINT ƒT22;; "It isn't here."z HˆBADPARSE„X;Ž ‡ALREADY˜(†PRINT ƒT21;; "You already have it."¢ HˆBADPARSE¬X;¶ ˆDONTHAVEÀ&†PRINT ƒT27;; "You don't have it."Ê HˆBADPARSEÔX;ÞX;è ‡WHYBOTHò†PRINT ƒT33;; "Why bother?"üH‰GOODPARSEX; ˆSEEMSORD#†PRINT ƒT34;; "Seems ordinary."$H‰GOODPARSE.X;8 †NOTHAPB$†PRINT ƒT56;; "Nothing happens."LH‰GOODPARSEVX;` ‰GOODPARSEj „BEEPt!‰NEXTEVENT~X;ˆ ˆBADPARSE’ „BOOPœ !†PARSER¦X;°X; SUBROUTINESºX; -----------ÄX;ÎX; DLI ROUTINEØX; -----------âƒDLIì5;; save A,öA5;; X  C;; and5;; Y registers$†DLICOL;; fetch color index(Q…DCOLS9;; fetch new color2%†CURSES9;; and cursor shape<P…WSYNC;; wait for scanFP†COLPF2;; change colorP'†GRAFP0;; and player shapeZ#†DLICOL;; update indexd7n?;; restore Y,x7;; X‚ >;; andŒ7;; A registers–9;; back to mainline X;ª …DCOLS´ p=`=p=`=p==`¾ †CURSESÈ ====Ò †CURSORÜ =æX;ð$X; PRINT MACRO SUBROUTINEú$X; ----------------------*X; ENTRY: Addr of EOL-terminated string(X; in A/Y registers (LSB/MSB).X;" †EPRINT,$>;; IOCB #0 (E:)6 P†ICBADR;; lsb of string addr@#'†ICBADR;; msb of string addrJQ> ;; PUT LINE commandT P…ICCOM^Q>h#P†ICBLEN;; lsb max string lengthr&†ICBLEN;; msb (0)| !„CIOV†X;$X; POSITION MACRO ROUTINEš$X; ----------------------¤$X; ENTRY: X-pos in X, Y-pos in Y.®X;¸ ‡POSIT13Â$> Ì …POSITÖ &†COLCRSà '†ROWCRSê:ôX;þX; AUDIO PROMPTS X; ------------- „BEEP Q>;; high tone& H…BTONE0 X;: „BOOPD Q>d;; low toneN …BTONEX P…AUDF1b Q>ª;; dist/vol = 10l P…AUDC1v Q>€ P†RTCLOKŠ …SOUND” Q†RTCLOKž R>;; 5 jiffies¨ H…SOUND² $>¼ &…AUDC1;; silence!Æ 0Ð &‚CH;; clear last keyÚ :ä X;î !X; ERASE A STATUS LINEø !X; -------------------!%X; ENTRY: Target line (0-18) in X. !X;! …ERASE !Q†LADRSL9;; lsb of line addr*! P‡CLPOINT4!Q†LADRSH9;; msb of addr>!P‡CLPOINTH!%>;; clear 25 charactersR!Q>\! †CLLOOPf!P@‡CLPOINT7p!1z! I†CLLOOP„!:Ž!X;˜!X; INIT SCREEN¢!X; -----------¬! ‰NEWSCREEN¶!Q>@À! P…NMIENÊ!P†RAMTOP;; set system to 16KÔ!X;Þ!X; Close IOCB #0 (E:)è!X;ò!$>;; IOCB #0 (E:)ü!Q> ;; CLOSE command" P…ICCOM" „CIOV;; slam!"X;$""X; Re-open E: with new RAM size."X;8"$>;; E: againB"&†ICAUX2;; zero this byteL"Q>;; OPEN commandV" P…ICCOM`"Q>4„EADR;; point to "E:"j" P†ICBADRt" Q>5„EADR~"P†ICBADRˆ"Q> ;; allow read/write’" P†ICAUX1œ" „CIOV;; do the OPEN¦"X;°"Q>º" P†DMACTLÄ"P†SDMCTL;; shut off ANTICÎ" P†GRAFP0Ø" P†GRAFP1â" P†GRAFP2ì"P†GRAFP3;; blank out bordersö"X;#$>;; all colors black # †COLOFF# P†PCOLR09#0(# I†COLOFF2#Q><#P†COLOR1;; except textF#Q>tP# P†COLOR0Z#X;d#$>n##&†CRSINH;; disable system cursorx# 2;; = 2‚#&†LMARGN;; fix marginŒ#Q>p–# P†POKMSK #P…IRQEN;; disable BREAK keyª#Q>5†NEWSET;; addr char set´#P…CHBAS;; point to char set¾#:;; and returnÈ#X;Ò#X; FLASH ROUTINEÜ#X; -------------æ#X;ð# …FLASHú#Q>;; black$ƒLP1 †CLRCHG;; change colors$$>ÿ;; delay loop$ƒLP20"$HƒLP2,$,6$O>;; next color@$FƒFLH;; all doneJ$HƒLP1;; change colors againT$ƒFLH^$P…DRINK;; turn off counterh$$…PLACE;; get current room #r$# †CHGCLR;; restore screen colors|$:†$X;$X; EXPLOSION ROUTINEš$X; -----------------¤$X;®$„BOOM¸$Q>–Â$ P…AUDF1Ì$Q>JÖ$ƒSNDà$ P…AUDC1ê$$>ô$ &†RTCLOKþ$„SND0% $†RTCLOK%(> % H„SND0&%;0%S>:%R>@D%HƒSNDN%Q>X% P…AUDC1b%:l%X;v% †CLRCHG€%%>;; y is indexŠ%…NXCLRPÁ8;; change color”%3;; point to next registerž%)>;; done?¨%H…NXCLR;; no²%:¼%X;Æ%X; SET SCREEN COLORSÐ%X; -----------------Ú%X;ä% †CHGCLRî%Q†RMCOLS9;; get room colorø%P†COLOR2;; set colors& P†COLOR4 & P†PCOLR1& P†PCOLR2 & P†PCOLR3*&Q>;; white4&P†COLOR1;; text color>&P†PCOLR0;; cursor colorH&Q>tR& P†COLOR0\&:f&X;p&X; color table for roomsz&X;„& †RMCOLSŽ& 4=4=r====Æ=Ƙ& Æ==== = =¦= ¢& d=V=d=V=V=6¬&X; BLANK BAR¶&X; ---------À&ƒBARÊ&†PRINT ‚T9Ô&:Þ&X;è&X; "WHAT" BARò&X; ---------ü& ‡SAYWHAT'†PRINT ƒT10':'X;$'$X; KEYBOARD INPUT HANDLER.'$X; ----------------------8')X; These routines are based in part onB'3X; Steve Howard's "Alternative Keyboard Handler"L')X; (ANALOG Computing #15, pp. 96-103).V'X;`'X; FETCH A KEYPRESSj'X; ----------------t' †GETKEY~'Q‚CHˆ'R>ÿ;; key pressed?’'%F†GETKEY;; not yet - keep scanningœ'X;¦'X; Analyze keycode°'X;º' ‡ANALYZEÄ'?;; save key for laterÎ'$>ÿØ'&‚CH;; reset keyâ'M>À;; bit 6 or 7 set?ì'F†LEGAL?;; nopeö'X;(X; Handle a bad keypress (X;( †BADKEY( „BOOP;; razz user and((!†GETKEY;; try again2(X;<(X; Look for illegal keysF(X;P( †LEGAL?Z(C;; restore keycoded($> n( …KLOOPx( R‡ILLEGAL9‚(!F†BADKEY;; razz if illegal keyŒ(0–( I…KLOOP (X;ª(X; Get ATASCII equivalent´(X;¾( Q†ATASCI8È(X;Ò()X; Screen out numbers, pass EOL and BSÜ(X;æ(R>…SPACE;; space bar?ð(F„CLK1;; that's okayú(R>ƒEOL;; RETURN?)F„CLK1;; fine by me)R>~;; backspace?)F„CLK1;; love 'em")R> a,) D†BADKEY6)-@);J)S> ;; convert to upper caseT)X;^)X; Click the speakerh)X;r)„CLK1|)%>†) '…CLICK)„CLK2š) %…CLICK¤)'†CONSOL;; tick!®)$>;; click freq¸) …DELAYÂ)0Ì) I…DELAYÖ) "…CLICKà)I„CLK2;; 128 timesê)X;ô):;; ATASCII code in Aþ)X;*X; ILLEGAL KEYS*X; ------------* ‡ILLEGAL&* ;; escape0* ,;; tab:* ';; atariD*:N* <;; capsX* 6;; l* ;; =v*  ;; ,€* ;; ;Š* ";; .”* &;; /ž* ;; +¨* ;; *²* ;; -¼*X;Æ*&X; ATASCII CONVERSION TABLEÐ*&X; ------------------------Ú*&X; We use our own table because theä*,X; location of the ROM-based table variesî*+X; depending on which computer you have.ø*X;+ †ATASCI + l=j=;=Š=‹=k=+=*+ o=€=p=u=›=i=-== + v=€=c=Œ==b=x=z*+ 4=€=3=6==5=2=14+ ,= =.=n=€=m=/=>+ r=€=e=y==t=w=qH+ 9=€=0=7=~=8=<=>R+ f=h=d=€=‚=g=s=a\+X;f+'X; INTERNAL CONVERSION TABLEp+'X; -------------------------z+ †INTATA„+  =@==`Ž+X;˜+X; Y-OFFSET TABLES¢+X; ---------------¬+"X; These two tables contain the¶+*X; starting address of each status lineÀ+*X; (absolute screen line address + 13).Ê+-X; LADRSL holds the LSBs, LADRSH the MSBs.Ô+X;Þ+ †LADRSLè+3 4†SCREEN5=4†SCREEN5=4†SCREEN]=4†SCREEN…ò+4 4†SCREEN­=4†SCREENÕ=4†SCREENý=4†SCREEN%ü+7 4†SCREENM=4†SCREENu=4†SCREEN=4†SCREENÅ,7 4†SCREENí=4†SCREEN=4†SCREEN==4†SCREENe,* 4†SCREEN=4†SCREENµ=4†SCREENÝ, †LADRSH$,3 5†SCREEN5=5†SCREEN5=5†SCREEN]=5†SCREEN….,4 5†SCREEN­=5†SCREENÕ=5†SCREENý=5†SCREEN%8,7 5†SCREENM=5†SCREENu=5†SCREEN=5†SCREENÅB,7 5†SCREENí=5†SCREEN=5†SCREEN==5†SCREENeL,* 5†SCREEN=5†SCREENµ=5†SCREENÝV,X;`,X; FETCH INPUT LINEj,X; ----------------t, ‡GETLINE~,X;ˆ,X; Clear line input buffer’,X;œ,-¦,$>°, Q>…SPACEº, …CLINLÄ, P†INLINE9Î,0Ø, I…CLINLâ,X;ì,!X; Get first character of lineö,X;- †GETONE -‰POSITION  = -$>ÿ- &†CURSEN;; turn on PMG cursor(-&‚CH;; clear key2-2<-&†LENGTH;; zero line lengthF- †GETKEY;; fetch a keycodeP-R>…SPACE;; first char not beZ-F†BADONE;; a spaced-R>~;; a backspacen- F†BADONEx-R>ƒEOL;; or an EOL‚- H„PUT1Œ-X;–- X; Handle bad first character -X;ª- †BADONE´- „BOOP;; razz user and¾-!†GETONE;; try againÈ-X;Ò-X; Print 1st charÜ-X;æ-„PUT1ð- †SETCIO;; to E:ú- „CIOV. #†LENGTH.X;.X; Get rest of input line".X;,.„REST6." †GETKEY;; grab another keycode@.R>ƒEOL;; if it's an EOL,J.!F†GOTEOL;; line entry completeT.R>~;; backspace?^."H‡PUTNEXT;; no - send to screenh.X;r.X; Handle a backspace|.X;†. …BACKS.!"†LENGTH;; if 1st char of lineš.G†BADONE;; signal error¤. †SETCIO;; E:®. „CIOV;; let CIO do backspace¸.Q†LENGTH;; if length=0,Â. F†GETONE;; handle as 1st charÌ.H„REST;; else continueÖ.X;à.X; Print latest characterê.X;ô. ‡PUTNEXTþ. †SETCIO/ „CIOV;; print character/#†LENGTH;; next position/ Q†LENGTH&/R>;; end of line?0/%D„REST;; not yet - get another key:/X;D/X; Too many chars in line!N/X;X/ ‡GETLASTb/ „BOOP;; a warning razzl/ †GETKEYv/R>ƒEOL;; must have an EOL€/ F†GOTEOLŠ/R>~;; or a backspace”/ F…BACKSž/H‡GETLAST;; insist!¨/X;²/X; EOL recieved¼/X;Æ/ †GOTEOLÐ/ †SETCIO;; specify E:Ú/&†CURSEN;; shut off cursorä/ „CIOV;; and send EOLî/X;ø/%X; Convert screen bytes to ATASCII0X; and move to INLINE 0X;0%> 0 †TOBUFF*0,40#Q†SCREENí8;; grab screen byte>0%P†SCREENÅ8;; move to upper lineH0U?R0U?\0U?f0U?p0M>;; transform byte, andz0>;; use as an index„0)Q†SCREENÅ8;; restore original valueŽ0M>;; clear bits 5-7˜0$L†INTATA9;; merge with code table¢0P†INLINE8;; send to buffer¬0Q>¶0&P†SCREENí8;; clear response lineÀ01Ê0 I†TOBUFFÔ0:Þ0X;è0#X; IMMEDIATE VBI ROUTINEò0#X; ---------------------ü0"X; Positions and blinks cursor,1X; resets DLI color index1X;1 †IMMVBI$1X;.1X; Reset DLI color index81X;B1Q>L1 P†DLICOLV1X;`1X; Okay to update cursor?j1X;t1!Q†CURSEN;; if enable flag = 0,~1 F…VEXIT;; don't redraw cursorˆ1X;’1"X; Calculate cursor X-position:œ1X; XNEW = ( XOLD * 4 ) + 48¦1X;°1-º1 Q†COLCRSÄ1T?Î1T?;; times 4Ø1,â1O>0;; plus 48ì1P†HPOSP0;; use as h-posö1X;2!X; Don't blink cursor if a key 2X; is being pressed.2X;2Q†SRTIMR;; 0 = no press(2 F†BLINK?22X;<2Q>ðF2 P†CURSORP2P†CSHAPE;; force cursor onZ2Q><;; for at leastd2P…BLINK;; 1 secondn2X;x2 †BLINK?‚2 Q†CSHAPEŒ2"…BLINK;; next jiffy–2 H…VEXIT;; don't blink until 0 2X;ª2X; Blink the cursor´2X;¾2%>È2'…BLINK;; reset timerÒ2N>ð;; flip the cursor shapeÜ2#P†CSHAPE;; and save it for lateræ2 …VEXITð2P†CURSOR;; plot the cursorú2!†SYSVBV;; sayonara3X;3#X; DISPLAY EVENT COUNTER3#X; ---------------------"3 †SHOWEV,3X;63X; Initialize EBUFF@3X;J3Q> °T3 P…EBUFF^3 P…EBUFFh3 P…EBUFFr3 Q>ƒEOL|3 P…EBUFF†3X;3 X; Convert event # to ATASCIIš3X;¤3„ECON®3 Q…EVENT¸3PƒFR0Â3 Q…EVENTÌ3 PƒFR0Ö3$ ƒIFP;; convert to floating pointà3 „FASC;; then to ATASCIIê3-ô3X;þ3 X; Determine length of number4X;4%>ÿ;; init loop index4 …FINDE&4304 Q@†INBUFF7;; check characters:4 I…FINDED4X;N4#X; Change # to inverse video andX4X; move to EBUFFb4X;l4$>;; move 3 chars maximumv4„TOEB€4 Q@†INBUFF7Š4L>€;; set msb”4P…EBUFF9;; put in EBUFFž40¨41²4 I„TOEB¼4X;Æ4X; Display contents of EBUFFÐ4X;Ú4‰POSITION !=ä4†PRINT …EBUFFî4:ø4X;5&X; SET CIO TO PUT CHAR MODE 5&X; ------------------------5 †SETCIO 5$> *5 &…ICCOM45$>>5 &†ICBLENH5&†ICBLENR5:\5X;