þþ£QdX; VERB EXECUTORSnX; --------------xX;‚&X; ENTRY: Translated noun code in AŒX; and in NCODE;–'X; untranslated code in UCODE X;ªX; TAKE´X; ----¾ †DOTAKEÈ Q…UCODEÒR>;; is it moveable?ÜEƒDT0;; yesæ !†IMPOSSðƒDT0ú Q…NCODE †OWNIT?;; already have it?HƒDT1 !‡ALREADY"ƒDT1, Q…NCODE6 ‡INROOM?;; is it here?@FƒDT2J !‡NOTHERETƒDT2^ Q…NCODEhR>;; bolted unit?rHƒDT3|+†PRINT ƒT41;; "Bolts are tight & rusty"†!‰GOODPARSEƒDT3šR>*;; free unit?¤ H„DT3B®Q…PLACE;; room 0?¸ H„DT3BÂQ>;; got wrench?Ì †OWNIT?Ö F„DT3Aà'†PRINT ƒT80;; "Bolts won't let you"ê!‰GOODPARSEô„DT3AþQ>;; power cable ‡INROOM? H„DT3B&†PRINT ƒT83;; "Connected to cable"&!‰GOODPARSE0„DT3B: ‰INVSPACE?;; arms full?DFƒDT4N !ˆARMSFULLXƒDT4b"$‡ROOMPOS;; get object positionl%†INVPOS;; and inv positionvQ‡CUROBJS9;; pick it up€!PˆHOLDINGS8;; add to inventoryŠQ>ÿ”"P‡CUROBJS9;; leave a blank slotž ‡SHOWALL¨ ‡SHOWVIS;; show room² ‡SHOWINV;; and inventory¼!…POKAY;; done!ÆX;ÐX; DROPÚX; ----ä †DODROPî †OWNIT?;; do you have it?øFƒDD0 !ˆDONTHAVE ƒDD0 Q…PLACE R>;; is this room 17?*F†DROP17;; special handling4ƒDD1>% ŠROOMSPACE?;; enough room for it?H F†DROPITR !ˆROOMFULL\ †DROPITf $‡ROOMPOSp %†INVPOSzQˆHOLDINGS8„ P‡CUROBJS9ŽQ>ÿ˜PˆHOLDINGS8¢ H‡SHOWALL¬X;¶X; Handle room 17ÀX;Ê †DROP17Ô" ‰ROOMIN18?;; space in room 18?ÞHƒDD1;; no - drop it in 17è%†INVPOS;; get inv positionò!$‡ROOMPOS;; and pos in room 18üQˆHOLDINGS8;; pick up itemP‡OBJECTS9;; and put in 18Q>ÿ;; clear inventoryPˆHOLDINGS8;; slot$*†PRINT ƒT68;; "It falls down the pipe". Q…NCODE8R>*;; dropped the unit?B FˆDROPUNIT;; special handlingL„D17BV ‡SHOWVIS` ‡SHOWINVj!‰GOODPARSEtX;~X; Handle UNIT in 17ˆX;’ ˆDROPUNITœQ„UNIT;; init = 0¦ H„D17B°Q>&;; update traitorº$>;; status inÄP„UNIT;; unit flag,Î!P†NTRANS9;; translation matrixØ$>l;; and objectâP‡OBJECTS9;; matrixì ‰ROOMIN18?;; find roomö$‡ROOMPOS;; for pistol Q>;; and P‡OBJECTS9;; drop it in 18 H„D17BX;( X; Find empty slot in room 182X;< ‰ROOMIN18?F$>m;; skip 1st objectP„RN18Z Q‡OBJECTS9dG…RN18A;; found a blank!n2x(>q;; scan to end‚D„RN18;; of roomŒA;; return NZ status–:  …RN18Aª&‡ROOMPOS;; save room pos´Q>;; set zero status¾:ÈX;ÒX; REMOVEÜX; ------æ ˆDOREMOVEðR>;; moveable?úEƒDRM !†IMPOSSƒDRMR>;; mask?" F†GODROP,R> ;; suit?6 F†GODROP@R>*;; unit?J F†GOGRABT !†BESPEC^ †GOGRABh !†DOTAKEr †GODROP| !†DODROP†X;X; LOOK/EXAMšX; ---------¤ †DOLOOK® ‡INROOM?;; is it in room?¸F†LOOKOK;; if not, Q…NCODEÌ †OWNIT?;; do you have it?Ö F†LOOKOKà!‡NOTHERE;; guess notê †LOOKOKô Q…NCODEþR> ;; captain?HƒLK0X;X; Search captain&X;0 ‡EXAMCAP: Q‡CAPTAINDFƒEC0N !ˆSEEMSORDXƒEC0b ŠROOMSPACE?lFƒEC1v !ˆROOMFULL€ƒEC1Š$†PRINT ƒT35;; "Found something!"”Q>ž P‡CAPTAIN¨ $‡ROOMPOS² P‡CUROBJS9¼ ‡SHOWVISÆ!‰GOODPARSEÐX;ÚƒLK0äR>;; gauge?îHƒLK1øX;X; Read depth gauge X; ‰READGAUGE  „ZFR0* Q…DEPTH4PƒFR0> †VPRINTH†PRINT ƒT55;; "Fathoms"R!‰GOODPARSE\X;fƒLK1pR>;; display?zHƒLK2„X;ŽX; Read navigation displays˜X;¢ ‡READISP¬ Q…PLACE¶R> ;; missile room?À F†SHOWMDÊ Q„SLATÔ $„SLONÞ H†DISHOWè †SHOWMDò Q„MLATü $„MLON †DISHOW P‡LATSHOW &‡LONSHOW$ †PRINT ƒT53;; "X =". ‰POSITION = 8 „ZFR0B Q‡LATSHOWL PƒFR0V †VPRINT` †PRINT ƒT54;; "Y ="j ‰POSITION = t „ZFR0~ Q‡LONSHOWˆ PƒFR0’ †VPRINTœ HƒLKX¦ X;° ƒLK2º R> ;; suit?Ä HƒLK3Î X;Ø X; Examine suitâ X;ì ˆEXAMSUITö Q„SUIT FƒES0 !ˆSEEMSORD ƒES0  ŠROOMSPACE?( FƒES12 '!ˆROOMFULL;; "Not enough room here."< ƒES1F $†PRINT ƒT35;; "Found something!"P Q>!;; keyZ P„SUITd $‡ROOMPOSn P‡CUROBJS9x ‡SHOWVIS‚ !‰GOODPARSEŒ X;– ƒLK3  R>;; pistol?ª HƒLK4´ X;¾ X; Examine pistolÈ X;Ò ˆEXAMPISTÜ Q†BULLETæ HƒPX0;; init = 1ð †PRINT ƒT52;; "No bullets"ú HƒLKX ƒPX0 !†PRINT ƒT51;; "Only 1 bullet" HƒLKX" X;, ƒLK46 T?;; * 2@ >;; use as an indexJ Q„LKLK9;; fetch lsbT 2;; and^ %„LKLK9;; msb of text addrh  †EPRINT;; print textr ƒLKX| !‰GOODPARSE;; and exit† X; $X; EXAM TEXT LOOKUP TABLEš $X; ----------------------¤ „LKLK®  ƒT36=ƒT64=ƒT34=ƒT38¸  ƒT39=ƒT34=ƒT64=ƒT39  ƒT42=ƒT34=ƒT34=ƒT34Ì  ƒT34=ƒT34=ƒT39=ƒT34Ö  ƒT37=ƒT34=ƒT34=ƒT46à  ƒT41=ƒT34=ƒT34=ƒT48ê  ƒT48=ƒT34=ƒT49=ƒT34ô  ƒT34=ƒT34=ƒT48=ƒT48þ  ƒT34=ƒT34=ƒT34=ƒT34  ƒT37=ƒT34=ƒT34=ƒT49  ƒT39=ƒT34=ƒT47 X;& X; READ0 X; ----: †DOREADD $> N †RDLOOPX R…READS9b F†READOKl 0v I†RDLOOP€ !†IMPOSSŠ †READOK” !†DOLOOKž X;¨ X; READable nouns² X;¼ …READSÆ  =$===Ð  ====Ú X;ä X; PUSHî X; ----ø †DOPUSH †OWNIT? HƒDPH !‡WHYBOTH ƒDPH* Q…NCODE4 ‡INROOM?> F„DPH0H !‡NOTHERER „DPH0\ Q…NCODEf R> ;; green button?p H„DPH1z X;„ X; Handle green button pushŽ X;˜ $>¢ Q…GREEN¬ F†SCANON¶ Q>À P…GREENÊ Q>;; blank scannerÔ ‡SCANNERÞ P†NTRANS9è P‡CUROBJSò ‡SHOWVISü !‰GOODPARSE †SCANONQ‡OBJECTS;; check cableR>$ F‡ONGREEN.!†NOTHAP;; "Nothing happens"8 ‡ONGREENB &…GREENLQ>$;; active scannerV H‡SCANNER`X;j„DPH1tR> ;; red button?~ H„DPH2ˆX;’X; Handle red button pushœX;¦$ƒRED° F…REDONºQ>ÄPƒREDÎ"†PRINT ƒT59;; "Sub levels off"Ø H„REDXâ …REDONì 2;; = 1ö&ƒRED†PRINT ƒT60;; "Sub dives!" „REDX!‰GOODPARSEX;(„DPH22R> ;; gold button?< H„DPH3FX;PX; Handle gold buttonZX;d Q„MLATn-x,‚O>Œ P„MLAT– !†SHOWMD X;ª„DPH3´R> ;; silver button?¾ H„DPH4ÈX;ÒX; Handle silver buttonÜX;æ Q„MLONð;ú-S> P„MLON !†SHOWMD"X;,„DPH46R>;; white button?@ H…SORRYJX;TX; Handle white button^X;h ‰PUSHWHITErQ„MLAT;; missile =|R„SLAT;; sub?† H…SORRYQ„MLON;; missile =šR„SLON;; sub?¤ H…SORRY®Q†SWITCH;; missile armed?¸ F…SORRY ‰NEWSCREENÌQ>Ö P†COLOR2à P†COLOR4êQ>ô P†COLOR1þ‰POSITION  = $†PRINT ƒT81;; "Congratulations!"Q>" P†SDMCTL& †SOLVED0 !†SOLVED: …SORRYD !†NOTHAP;; "Nothing happens."NX;XX; OPENbX; ----l †DOOPENvR>;; can't be OPENed€DƒOP0;; if NCODE > 6Š !†IMPOSS”ƒOP0ž ‡INROOM?;; is it here?¨FƒOP1²!‡NOTHERE;; nope¼ƒOP1ÆQ…NCODE;; hatch?ÐHƒOP2Ú …HOPENäQ>"î!P…HATCH;; mark hatch as openedø(P‡CUROBJS;; change in current objectsQ>;; open path to P‡CURVECT;; room 4 ‡SHOWVIS  ‰SHOWVECTS* !…POKAY4ƒOP2>R>;; door?HHƒOP3R'†PRINT ƒT64;; "Lock is very secure"\HƒOPXfƒOP3pR>;; grate?zHƒOP4„$†PRINT ƒT38;; "Screwed in place"ŽHƒOPX˜ƒOP4¢R>;; airlock?¬HƒOP5¶%†PRINT ƒT23;; "Can't do that yet"ÀHƒOPXʃOP5ÔR>";; open hatch?Þ F†ALOPENèR>#;; open door?ò F†ALOPENüR>%;; open grate? F†ALOPENR>';; open airlock?HƒOP6$ †ALOPEN.!†PRINT ƒT65;; "Already open!"8ƒOPXB!‰GOODPARSELƒOP6V !†IMPOSS`X;jX; SHOOTtX; -----~ ‡DOSHOOTˆQ>;; do you have’ †OWNIT?;; the pistol?œ F„SHT0¦ !†EASIER°„SHT0º Q…NCODEÄ ‡INROOM?Î F„SHT1Ø Q…NCODEâ †OWNIT?ì F„SHT1ö !‡NOTHERE„SHT1  Q†BULLET H„SHT3†PRINT ƒT52;; "No bullets"(!‰GOODPARSE2„SHT3<†PRINT ƒT45;; "BANG!"FQ>P P†BULLETZ Q…NCODEdR>;; Locked door?n H†SHOOTXx#†PRINT ƒT71;; "Lock destroyed!"‚Q>#;; change door status inŒP‡CUROBJS;; object matrix– $>;; and P†NTRANS9;; in theª2;; translation´P†NTRANS9;; table¾Q>;; open west wallÈP‡CURVECT;; to room #5Ò ‡SHOWVIS;; show door changeÜ ‰SHOWVECTS;; and new vectoræ †SHOOTXð!‰GOODPARSEúX;X; INSERTX; ------ ˆDOINSERT" †OWNIT?, F„INS06 !ˆDONTHAVE@„INS0J Q…NCODETR>;; card?^ H„INS1h(†PRINT ƒT72;; "Try examining things"r!‰GOODPARSE|„INS1† R>;; ID? F„INS2š„INSX¤ !†BESPEC®„INS2¸ Q…PLACEÂR>;; room 19?Ì H„INSXÖQ>';; update objectàP‡CUROBJS;; matrixê $>;; andôP†NTRANS9;; translatorþQ>;; open south wallP‡CURVECT;; to room 21 †INEXIT ‡SHOWVIS& ‰SHOWVECTS0 !…POKAY:X;DX; UNSCREWNX; -------X ‰DOUNSCREWb ‡INROOM?l F„UNS0v !‡NOTHERE€„UNS0Š Q…UCODE”R>;; nothing you can carryžD„UNS1;; is unscrewable¨ !‡WHYBOTH²„UNS1¼ Q…NCODEÆR>;; bolted unit?Ð H„UNS2Ú !†DOTAKEä„UNS2îR>;; closed grate?ø F„UNS3 !†IMPOSS „UNS3Q>;; do you have  †OWNIT?;; the knife?*H„UNS4;; nope4Q>%;; patch>P‡CUROBJS;; objectH $>;; andR P†NTRANS9;; translator tables\Q>;; open south wall tofP‡CURVECT;; room 17p H†INEXITz„UNS4„Q>;; screwdriver?Ž †OWNIT?˜ H„UNSX¢$†PRINT ƒT73;; "Blade's too tiny"¬!‰GOODPARSE¶„UNSXÀ !†EASIERÊX;ÔX; HOLDÞX; ----è †DOHOLDò Q…UCODEüR>&;; breath? F…DHLD0 !†BESPEC …DHLD0$Q†BREATH;; already.H…DHLD1;; holding8 Q> ;; it?BP†BREATH;; if not, set timerLP…BHOLD;; to 8 eventsV !…POKAY` …DHLD1j !‡ALREADYtX;~X; UNLOCKˆX; ------’ ˆDOUNLOCKœQ>!;; key?¦ †OWNIT?° F„UNL0º !†EASIERÄ„UNL0Î Q…NCODEØ ‡INROOM?â F„UNL1ì !‡NOTHEREö„UNL1 Q…NCODE R>;; locked door? H„UNL2#†PRINT ƒT75;; "Key doesn't fit"(!‰GOODPARSE2„UNL2<R>;; locked switch?F F„UNL3P !†IMPOSSZ„UNL3dQ>(;; unlockedn P‡CUROBJSx$>‚ P†NTRANS9Œ P†SWITCH– !†INEXIT X;ªX; CUT´X; ---¾ …DOCUTÈ ‡INROOM?Ò F„DCT0Ü !‡NOTHEREæ„DCT0ð Q…NCODEúR>;; hummer? F„DCT1 !†IMPOSS„DCT1"Q>;; cutters?, †OWNIT?6 H„DCT2@ Q…GREENJ F…CUTITT ‰NEWSCREEN^‰POSITION  =h*†PRINT ƒT76;; "A jolt of high voltage"r !…KILLS| …CUTIT†Q>);; severedP‡CUROBJSš$>¤ P†NTRANS9®Q>;; blank scanner¸P‡OBJECTS*Â$>Ì P†NTRANS9Ö !†INEXITà„DCT2ê !†EASIERôX;þX; POURX; ---- †DOPOUR †OWNIT?&FƒDPR0 !ˆDONTHAVE:ƒDPRD Q…NCODENR>;; shampoo?X F†DOSHAMb !†IMPOSSl †DOSHAMv%†INVPOS;; remove€Q>ÿ;; shampoo fromŠPˆHOLDINGS8;; inventory”'†PRINT ƒT44;; "Shampoo all used up"žQ>;; is bolted unit¨ ‡INROOM?;; nearby?²H…POURX;; nope¼$‡ROOMPOS;; else change toÆQ>*;; free unitÐ P‡CUROBJS9Ú$>;; patchäP†NTRANS9;; translationî 2;; tableø P†NTRANS9 …POURX  ‡SHOWVIS ‡SHOWINV !‰GOODPARSE*X;4X; LUBRICATE>X; ---------H †DOLUBER †OWNIT?\HƒDOLf !‡WHYBOTHpƒDOLzQ>;; got the shampoo?„ †OWNIT?Ž F„DOL1˜„DOL0¢ !†EASIER¬„DOL1¶ Q…NCODEÀ ‡INROOM?Ê F†DOSHAMÔ !‡NOTHEREÞX;èX; WEARòX; ----ü †DOWEARR>;; mask? F†WEAROKR> ;; suit?$ F†WEAROK. !†IMPOSS8 †WEAROKB !†DOTAKELX;V †IMPOSS`&†PRINT ƒT17;; "That's impossible."jH‰GOODPARSEtX;~ †NOTYETˆ*†PRINT ƒT23;; "You can't do that yet."’H‰GOODPARSEœX;¦ †BESPEC°%†PRINT ƒT26;; "Be more specific."ºH‰GOODPARSEÄX;Î ˆARMSFULLØ-†PRINT ƒT24;; "You're carrying too much!"â HˆBADPARSEìX;ö ˆROOMFULL)†PRINT ƒT25;; "Not enough room here."  HˆBADPARSEX; ‡NOTHERE("†PRINT ƒT22;; "It isn't here."2 HˆBADPARSE<X;F ‡ALREADYP(†PRINT ƒT21;; "You already have it."Z HˆBADPARSEdX;n ˆDONTHAVEx&†PRINT ƒT27;; "You don't have it."‚ HˆBADPARSEŒX;– †NOHELP !†PRINT ƒT32;; "Doesn't help."ªH‰GOODPARSE´X;¾ ‡WHYBOTHȆPRINT ƒT33;; "Why bother?"ÒH‰GOODPARSEÜX;æ ˆSEEMSORDð#†PRINT ƒT34;; "Seems ordinary."úH‰GOODPARSEX; †NOTHAP$†PRINT ƒT56;; "Nothing happens.""H‰GOODPARSE,X;6 †EASIER@)†PRINT ƒT50;; "Easier said than done"JX;T ‰GOODPARSE^ „BEEPh!‰NEXTEVENTrX;| ˆBADPARSE† „BOOP !†PARSERšX;¤X; SUBROUTINES®X; -----------¸X;ÂX; DLI ROUTINEÌX; -----------ÖƒDLIà5;; save A,êAô5;; Xþ C;; and 5;; Y registers $†DLICOL;; fetch color index Q…DCOLS9;; fetch new color& %†CURSES9;; and cursor shape0 P…WSYNC;; wait for scan: P†COLPF2;; change colorD '†GRAFP0;; and player shapeN #†DLICOL;; update indexX 7b ?;; restore Y,l 7;; Xv >;; 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:)*! P†ICBADR;; lsb of string addr4!#'†ICBADR;; msb of string addr>!Q> ;; PUT LINE commandH! P…ICCOMR!Q>\!#P†ICBLEN;; lsb max string lengthf!&†ICBLEN;; msb (0)p! !„CIOVz!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…BTONE$"X;."„BOOP8"Q>d;; low toneB" …BTONEL" P…AUDF1V"Q>ª;; dist/vol = 10`" P…AUDC1j"Q>t" 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‡CLPOINT(#Q†LADRSH9;; msb of addr2#P‡CLPOINT<#%>;; clear 25 charactersF#Q>P# †CLLOOPZ#P@‡CLPOINT7d#1n# I†CLLOOPx#:‚#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;,$$>;; E: again6$&†ICAUX2;; zero this byte@$Q>;; OPEN commandJ$ P…ICCOMT$Q>4„EADR;; point to "E:"^$ P†ICBADRh$ Q>5„EADRr$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†COLOFF&%Q>0%P†COLOR1;; except text:%Q>tD% P†COLOR0N%X;X%$>b%#&†CRSINH;; disable system cursorl% 2;; = 2v%&†LMARGN;; fix margin€%Q>pŠ% P†POKMSK”%P…IRQEN;; disable BREAK keyž%:;; and return¨%X;²%X; BLANK BAR¼%X; ---------Æ%ƒBARÐ%†PRINT ‚T9Ú%:ä%X;î%X; "WHAT" BARø%X; ---------& ‡SAYWHAT &†PRINT ƒT10&: &X;*&$X; KEYBOARD INPUT HANDLER4&$X; ---------------------->&)X; These routines are based in part onH&3X; Steve Howard's "Alternative Keyboard Handler"R&)X; (ANALOG Computing #15, pp. 96-103).\&X;f&X; FETCH A KEYPRESSp&X; ----------------z& †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 again8'X;B'X; Look for illegal keysL'X;V' †LEGAL?`'C;; restore keycodej'$> t' …KLOOP~' 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> a2( D†BADKEY<(-F(;P(S> ;; convert to upper caseZ(X;d(X; Click the speakern(X;x(„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,) ;; escape6) ,;; tab@) ';; atariJ) <;; capsT) 6;; <^) 7;; >h) ;; =r)  ;; ,|) ;; ;†) ";; .) &;; /š) ;; +¤) ;; *®) ;; -¸)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=10* ,= =.=n=€=m=/=:* r=€=e=y==t=w=qD* 9=€=0=7=~=8=<=>N* f=h=d=€=‚=g=s=aX*X;b*'X; INTERNAL CONVERSION TABLEl*'X; -------------------------v* †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%4+7 5†SCREENM=5†SCREENu=5†SCREEN=5†SCREENÅ>+7 5†SCREENí=5†SCREEN=5†SCREEN==5†SCREENeH+* 5†SCREEN=5†SCREENµ=5†SCREENÝR+X;\+X; FETCH INPUT LINEf+X; ----------------p+ ‡GETLINEz+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 key.,28,&†LENGTH;; zero line lengthB, †GETKEY;; fetch a keycodeL,R>…SPACE;; first char not beV,F†BADONE;; a space`,R>~;; a backspacej, F†BADONEt,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;(-„REST2-" †GETKEY;; grab another keycode<-R>ƒEOL;; if it's an EOL,F-!F†GOTEOL;; line entry completeP-R>~;; backspace?Z-"H‡PUTNEXT;; no - send to screend-X;n-X; Handle a backspacex-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?,.%D„REST;; not yet - get another key6.X;@.X; Too many chars in line!J.X;T. ‡GETLAST^. „BOOP;; a warning razzh. †GETKEYr.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 ATASCIIþ.X; and move to INLINE/X;/%>/ †TOBUFF&/,0/#Q†SCREENí8;; grab screen byte:/%P†SCREENÅ8;; move to upper lineD/U?N/U?X/U?b/U?l/M>;; transform byte, andv/>;; use as an index€/)Q†SCREENÅ8;; restore original valueŠ/M>;; clear bits 5-7”/$L†INTATA9;; merge with code tablež/P†INLINE8;; send to buffer¨/Q>²/&P†SCREENí8;; clear response line¼/1Æ/ I†TOBUFFÐ/:Ú/X;ä/#X; IMMEDIATE VBI ROUTINEî/#X; ---------------------ø/"X; Positions and blinks cursor,0X; resets DLI color index 0X;0 †IMMVBI 0X;*0X; Reset DLI color index40X;>0Q>H0 P†DLICOLR0X;\0X; Okay to update cursor?f0X;p0!Q†CURSEN;; if enable flag = 0,z0 F…VEXIT;; don't redraw cursor„0X;Ž0"X; Calculate cursor X-position:˜0X; XNEW = ( XOLD * 4 ) + 48¢0X;¬0-¶0 Q†COLCRSÀ0T?Ê0T?;; times 4Ô0,Þ0O>0;; plus 48è0P†HPOSP0;; use as h-posò0X;ü0!X; Don't blink cursor if a key1X; is being pressed.1X;1Q†SRTIMR;; 0 = no press$1 F†BLINK?.1X;81Q>ðB1 P†CURSORL1P†CSHAPE;; force cursor onV1Q><;; for at least`1P…BLINK;; 1 secondj1X;t1 †BLINK?~1 Q†CSHAPEˆ1"…BLINK;; next jiffy’1 H…VEXIT;; don't blink until 0œ1X;¦1X; Blink the cursor°1X;º1%>Ä1'…BLINK;; reset timerÎ1N>ð;; flip the cursor shapeØ1#P†CSHAPE;; and save it for laterâ1 …VEXITì1P†CURSOR;; plot the cursorö1!†SYSVBV;; sayonara2X; 2#X; DISPLAY EVENT COUNTER2#X; ---------------------2 †SHOWEV(2X;22X; Initialize EBUFF<2X;F2Q> °P2 P…EBUFFZ2 P…EBUFFd2 P…EBUFFn2 Q>ƒEOLx2 P…EBUFF‚2X;Œ2 X; Convert event # to ATASCII–2X; 2„ECONª2 Q…EVENT´2PƒFR0¾2 Q…EVENTÈ2 PƒFR0Ò2$ ƒIFP;; convert to floating pointÜ2 „FASC;; then to ATASCIIæ2-ð2X;ú2 X; Determine length of number3X;3%>ÿ;; init loop index3 …FINDE"33,3 Q@†INBUFF7;; check characters63 I…FINDE@3X;J3#X; Change # to inverse video andT3X; move to EBUFF^3X;h3$>;; move 3 chars maximumr3„TOEB|3 Q@†INBUFF7†3L>€;; set msb3P…EBUFF9;; put in EBUFFš30¤31®3 I„TOEB¸3X;Â3X; Display contents of EBUFFÌ3X;Ö3‰POSITION !=à3†PRINT …EBUFFê3:ô3X;þ3&X; SET CIO TO PUT CHAR MODE4&X; ------------------------4 †SETCIO4$> &4 &…ICCOM04$>:4 &†ICBLEND4&†ICBLENN4:X4X;