zork/tell.mud

1264 lines
28 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

<NEWTYPE PSTRING WORD>
<SETG RUBOUT? <>>
<SETG RUVEC <IUVECTOR 4>>
<SETG NO-TELL 0>
<SETG IN-TELL 0>
<SETG TELL-VEC <IUVECTOR 7>>
;"Print some strings to ,OUTCHAN"
<TITLE TELL>
<DECLARE ("VALUE" ATOM <PRIMTYPE STRING> "OPTIONAL" FIX
<OR STRING FALSE> <OR STRING FALSE>)>
<MOVE A* AB>
LOOP <PUSH TP* (AB)>
<PUSH TP* 1(AB)>
<ADD AB* [<(2) 2>]>
<JUMPL AB* LOOP>
<HLRES A>
<ASH A* -1>
<ADDI A* TABEND>
<PUSHJ P* @ (A) 1>
<JRST FINIS>
<TELL4>
<TELL3>
<TELL2>
TABEND <TELL1>
<INTERNAL-ENTRY TELL1 1> ; "push 1"
<PUSH TP* <TYPE-WORD FIX>>
<PUSH TP* [1]>
<INTERNAL-ENTRY TELL2 2>
<PUSH TP* <TYPE-WORD FALSE>>
<PUSH TP* [0]>
<INTERNAL-ENTRY TELL3 3>
<PUSH TP* <TYPE-WORD FALSE>>
<PUSH TP* [0]>
<INTERNAL-ENTRY TELL4 4>
<SUBM M* (P)>
<INTGO>
<PUSHJ P* SETUP> ; "SETUP FOR INTERRUPTS"
<JRST [<PUSH TP* <TYPE-WORD FALSE>>
<PUSH TP* [0]>
<DPUSH TP* <PQUOTE <STRING <ASCII 13> <ASCII 10>>>>
<MOVE C* <MQUOTE <RGLOC OUTCHAN T>>>
<ADD C* GLOTOP 1>
<MOVE C* 1(C)>
<PUSH P* 1(C)>
<MOVEI C* 0>
<PUSHJ P* DOSIOT> ; "PRINT CRLF"
<SUB TP* [<(2) 2>]>
<JRST INTLV>]>
INTLV <JRST [<SUB P* [<(1) 1>]>
<JRST RLDONE1>]> ; "RETURN FROM NON-PRINT"
<MOVE C* <MQUOTE <RGLOC OUTCHAN T>>>
<ADD C* GLOTOP 1>
<MOVE C* 1(C)>
<MOVE C* 1(C)> ; "CHANNEL NUMBER IN C"
<PUSH P* C> ; "SAVE ON STACK"
<MOVE E* <MQUOTE <RGLOC SCRIPT-CHANNEL T>>>
<ADD E* GLOTOP 1>
<PUSH TP* (E)>
<PUSH TP* 1(E)>
<MOVE O* -6(TP)> ; "FIX SPECIFYING WHEN TO DO CR'S"
<TRNN O* 2> ; "SKIP IF PRINT CR BEFORE"
<JRST PTFST>
<PUSH TP* <PQUOTE <STRING <ASCII 13> <ASCII 10>>>>
<PUSH TP* <MQUOTE <STRING <ASCII 13> <ASCII 10>>>>
<MOVEI C* 0>
<PUSHJ P* DOSIOT>
PTFST <LDB C* [<(*220913*) -6>]> ; "MAYBE THE GUY GAVE A LENGTH FOR THIS?"
<PUSH TP* -9(TP)> ; "PUSH ARGS FOR DOSIOT"
<PUSH TP* -9(TP)>
<PUSHJ P* DOSIOT>
<INTGO>
<GETYP O* -5(TP)>
<CAIN O* <TYPE-CODE FALSE>> ; "IS IT FALSE?"
<JRST DONE>
<PUSH TP* -5(TP)>
<PUSH TP* -5(TP)> ; "ARGS"
<MOVEI C* 0>
<PUSHJ P* DOSIOT> ; "DO PRINT"
<GETYP O* -3(TP)>
<CAIN O* <TYPE-CODE FALSE>>
<JRST DONE>
<PUSH TP* -3(TP)>
<PUSH TP* -3(TP)>
<MOVEI C* 0>
<PUSHJ P* DOSIOT>
DONE <MOVE O* -6(TP)>
<TRNN O* 1> ; "CR AFTER?"
<JRST RLDONE>
<PUSH TP* <PQUOTE <STRING <ASCII 13> <ASCII 10>>>>
<PUSH TP* <MQUOTE <STRING <ASCII 13> <ASCII 10>>>>
<MOVEI C* 0>
<PUSHJ P* DOSIOT> ; "PRINT CRLF"
RLDONE <MOVE A* <MQUOTE <RGLOC IN-TELL T>>>
<ADD A* GLOTOP 1>
<SETZM 1(A)> ; "NO LONGER IN TELL"
<SUB P* [<(2) 2>]> ; "CLEAN UP P"
<SUB TP* [<(2) 2>]>
RLDONE1 <SUB TP* [<(8) 8>]>
<MOVE C* <MQUOTE <RGLOC TELL-FLAG T>>> ;"SETG TELL-FLAG"
<ADD C* GLOTOP 1>
<MOVE A* <TYPE-WORD ATOM>>
<MOVEM A* (C)>
<MOVE B* <MQUOTE T>>
<MOVEM B* 1(C)>
<JRST MPOPJ>
; "SET UP FOR INTERRUPTS"
SETUP <SUBM M* (P)>
<PUSH P* (P)>
<MOVE A* <MQUOTE <RGLOC NO-TELL T>>>
<ADD A* GLOTOP 1>
<SKIPGE 1(A)> ; "IF ALREADY TURNED OFF, JUST LEAVE"
<JRST SPOPJ>
<SKIPL -4(TP)> ; "DO THIS ONLY IF TOLD TO"
<JRST SETUPO>
<MOVE A* <MQUOTE <RGLOC TELL-VEC T>>>
<ADD A* GLOTOP 1>
<MOVE A* 1(A)>
<HLRE B* A>
<ADDI B* 1>
<MOVNS B>
<ADDI B* (A)>
<HRLI A* AB>
<SUB P* [<(1) 1>]>
<BLT A* (B)>
<ADD P* [<(1) 1>]>
<MOVE A* <MQUOTE <RGLOC IN-TELL T>>>
<ADD A* GLOTOP 1>
<SETOM 1(A)> ; "NOW IN TELL"
SETUPO <SOS (P)>
SPOPJ <SOS (P)> ; "SKIP TWICE NORMALLY, ONCE IF NOT PRINTING"
<JRST MPOPJ> ; "SKIP RETURN"
;"SYSTEM DEPENDENT"
;"PUSHJ DOSIOT WITH ARGS ON TOP OF TP STACK; CHANNEL/JFN IS -1(P); SCRIPT CHANNEL
IS NEXT FROB ON TP. FORTUNATELY, NO AC'S ARE SACRED. C HAS # CHARS TO PRINT
IF NON-ZERO."
DOSIOT <SUBM M* (P)>
<SKIPG C> ; "IF C>0, THEN ITS THE # OF CHARS TO PRINT"
<HRRZ C* -1(TP)> ; "GET STRING LENGTH"
<PUSH P* C>
<MOVE B* (TP)> ; "GET STRING"
<SKIPL -8(TP)>
<JRST DOSIOT1> ; "ONLY ENABLE IF TOLD TO"
<AOSN INTFLG>
<JSR LCKINT> ; "ENABLE INTERRUPTS"
DOSIOT1 <IFOPSYS (TENEX
<MOVNS C> ; "GET -LENGTH"
<JUMPE C* DODONE> ; "0 LENGTH STRING"
<MOVE A* -2(P)> ; "GET JFN"
<SOUT> ; "DO IT")
(ITS
<*CALL SIOT>
<JFCL>)>
<SKIPGE -6(TP)>
<SETZM INTFLG> ; "DISABLE INTERRUPTS"
<SKIPL -2(TP)> ; "SCRIPTING?"
<JRST DODONE>
<MOVSI A* <TYPE-CODE STRING>>
<HRR A* -1(TP)>
<PUSH TP* A> ; "PUSH STRING"
<PUSH TP* -1(TP)>
<PUSH TP* -5(TP)> ; "PUSH CHANNEL"
<PUSH TP* -5(TP)>
<PUSH TP* <TYPE-WORD FIX>>
<PUSH TP* (P)>
<MCALL 3 PRINTSTRING> ; "DO PRINTSTRING"
DODONE <SUB TP* [<(2) 2>]> ; "GET RID OF ARGS"
<SUB P* [<(1) 1>]>
<JRST MPOPJ>
<IFOPSYS (ITS
SIOT <SETZ>
<SIXBIT "SIOT">
<-2(P)>
<MOVE B>
<SETZ C>)>
<TITLE CTRL-S>
<DECLARE ("VALUE" <OR ATOM DISMISS> CHARACTER CHANNEL)>
<DPUSH TP* (AB)>
<DPUSH TP* 2(AB)>
<PUSHJ P* ICTRL>
<JRST FINIS>
<INTERNAL-ENTRY ICTRL 2>
<SUBM M* (P)>
<MOVE B* -2(TP)>
<CAIN B* 7> ; "CTRL-G?"
<JRST GACK>
<IFOPSYS
(TENEX
<CAIE B* %<ASCII !\>>)
(ITS
<CAIE B* %<ASCII !\>>)>
<JRST [<MOVSI A* <TYPE-CODE ATOM>>
<JRST ICTRL1>]> ; "NOT CTRL-S, SO FLUSH"
<SETZM INTFLG>
<MOVE A* <MQUOTE <RGLOC INCHAN T>>>
<ADD A* GLOTOP 1>
<DPUSH TP* (A)>
<MCALL 1 RESET>
<PUSH TP* <TYPE-WORD FALSE>>
<PUSH TP* [0]>
<MCALL 1 TTY-INIT>
<MOVE A* <MQUOTE <RGLOC NO-TELL T>>>
<ADD A* GLOTOP 1>
<SKIPGE 1(A)> ; "ALREADY TRUE?"
<JRST ICTRLO> ; "YES, SO FLUSH"
<SETOM 1(A)> ; "NO, SO MAKE IT TRUE"
<MOVE A* <MQUOTE <RGLOC IN-TELL T>>>
<ADD A* GLOTOP 1>
<SKIPL 1(A)> ; "IN TELL?"
<JRST ICTRLO> ; "NO, FLUSH"
<SETZM 1(A)> ; "NOT ANY MORE"
<PUSH TP* <TYPE-WORD FIX>>
<PUSH TP* [0]>
<MCALL 1 INT-LEVEL> ; "FIX UP INTERRUPTS"
<MOVE A* <MQUOTE <RGLOC TELL-VEC T>>>
<ADD A* GLOTOP 1> ; "GET POINTER TO SAVED AC'S (N OF THEM)"
<MOVE A* 1(A)> ; "PICK UP POINTER"
<HLRE B* A> ; "# OF AC'S IS IN B"
<ADDI B* P 1> ; "FIRST ONE"
<HRLS A>
<HRR A* B> ; "BLT POINTER IN A"
<BLT A* P> ; "BLT THE AC'S BACK"
<JRST MPOPJ> ; "AND LEAVE"
ICTRLO <MOVSI A* <TYPE-CODE DISMISS>>
ICTRL1 <MOVEI B* <MQUOTE 'T>>
<SUB TP* [<(4) 4>]>
<JRST MPOPJ>
GACK <MOVE A* <MQUOTE <RGLOC INCHAN T>>>
<ADD A* GLOTOP 1>
<DPUSH TP* (A)>
<MCALL 1 RESET>
<PUSH TP* <TYPE-WORD FALSE>>
<PUSH TP* [0]>
<MCALL 1 TTY-INIT>
<PUSH TP* <TYPE-WORD FALSE>>
<PUSH TP* [0]>
<PUSH TP* <TYPE-WORD ATOM>>
<PUSH TP* <MQUOTE CONTROL-G?!-ERRORS>>
<MCALL 2 HANDLE>
<JRST ICTRLO>
;"Get current time in disk format"
;"SYSTEM DEPENDENT (GROSSLY)"
<TITLE DSKDATE>
<DECLARE ("VALUE" WORD)>
<PUSHJ P* IDSKDATE>
<JRST FINIS>
<INTERNAL-ENTRY IDSKDATE 0>
<SUBM M* (P)>
<IFOPSYS (TENEX
<HRROI B* -1> ; "-1 TO SAY CURRENT TIME"
<MOVEI D* 0> ; "NOTHING FANCY"
<ODCNV> ; "GET IT: B HAS YEAR,,MONTH; C DAY,,; D ,,TIME"
<TLZ D* -1> ; "CLEAN OUT LH OF D"
<ASH D* 1> ; "TIME IN HALF-SECONDS"
<HLRZS C> ; "GET DAY OF MONTH -1"
<ADDI C* 1> ; "DO THE RIGHT THING"
<DPB C* [<(*220500*) D>]> ; "STUFF DAY INTO D"
<IDIV B* [(1)]> ; "SPLIT B IN HALF"
<ADDI C* 1> ; "GET REAL MONTH"
<DPB C* [<(*270400*) D>]> ; "STUFF IN MONTH"
<IDIVI B* 100> ; "GET YEAR OF CENTURY IN C"
<DPB C* [<(*330700*) D>]> ; "STUFF IN YEAR"
<MOVE B* D>
<MOVE A* <TYPE-WORD WORD>>
<JRST MPOPJ>)
(ITS
<*CALL RQDATE>
<SETO B*>
<MOVE A* <TYPE-WORD WORD>>
<JRST MPOPJ>
RQDATE <SETZ>
<SIXBIT "RQDATE">
<SETZM B>)>
;"GET STRING OF USER NAME (OR SOMETHING LIKE THAT)"
<TITLE GXUNAME>
<DECLARE ("VALUE" STRING)>
<PUSHJ P* IXUNAME>
<JRST FINIS>
<INTERNAL-ENTRY IXUNAME 0>
<SUBM M* (P)>
<IFOPSYS (TENEX
<GJINF> ; "GET DIRECTORY NUMBER IN B"
<MOVE B* A>
<MOVE C* <MQUOTE <RGLOC SCRATCH-STR T>>>
<ADD C* GLOTOP 1>
<MOVE A* 1(C)>
<DIRST>
<JFCL>
<MOVE B* 1(C)>
<MOVE A* (C)>
<JRST MPOPJ>)
(ITS
<*SUSET [<(*74*) A>]>
<PUSH TP* <TYPE-WORD WORD>>
<PUSH TP* A>
<PUSHJ P* ISIXTO>
<JRST MPOPJ>
;"TAKES WORD ON TOP OF TP, RETURNS STRING"
ISIXTO <SUBM M* (P)>
<LDB O* [<(*000613*) 0>]> ; "LAST BYTE IN WORD"
<MOVEI C* 1>
<JUMPE O* CONTIN>
<MOVEI C* 2> ; "NUMBER OF WORDS REQUIRED"
CONTIN <PUSH P* C> ; "SAVE #WORDS"
<MOVE A* C>
<MOVEI O* IBLOCK>
<PUSHJ P* RCALL> ; "GET UVECTOR (IN A AND B)"
<MOVE A* <TYPE-WORD STRING>>
<POP P* C>
<MOVEI O* 4(C)> ; "LENGTH IS FIVE OR SIX"
<HRR A* O> ; "LENGTH OF STRING"
<ADD C* B>
<MOVEI O* <TYPE-CODE CHARACTER>>
<DPB O* [<(*221503*) 0>]> ; "CLOBBER TYPE SLOT IN DOPE WORDS"
<HRLI B* *440700*> ; "GET STRING POINTER TO UV"
; "AT THIS POINT, IN A AND B WE HAVE THE TYPE-VALUE WORD, ALMOST READY TO
RETURN. ON TOP OF TP, THE WORD TO BE HACKED."
START <PUSH P* B> ; "SAVE BP TO RETURN"
<MOVE C* (TP)> ; "GET WORD TO HACK IN C"
<MOVE D* [<(*440600*) C>]> ; "AND SIXBIT POINTER IN D"
<HRRZ E* A> ; "LENGTH OF STRING"
<JUMPE E* DONE> ; "CAN'T HACK EMPTY STRING"
<CAILE E* 6>
<MOVEI E* 6> ; "MAX # CHARS"
STRLOP <ILDB O* D> ; "GET CHAR IN O"
<ADDI O* *40*>
<IDPB O* B> ; "STUFF CHAR INTO STRING"
<SOJG E* STRLOP>
DONE <POP P* B> ; "GET OLD BP BACK"
<SUB TP* [<(2) 2>]>
<JRST MPOPJ>)>
;"Takes channel open to name file, returns string of name"
<IFOPSYS (TENEX
<TITLE GET-NAME>
<DECLARE ("VALUE" <OR FALSE STRING>)>
<PUSHJ P* IGETNAME>
<JRST FINIS>
<INTERNAL-ENTRY IGETNAME 1>
<SUBM M* (P)>
;"FIRST, WE NEED A JFN TO THE CRETIN FILE WITH THE RIGHT CRETIN BITS."
<MOVSI A* *100001*> ; "I HOPE THIS MEANS GET
EXISTING FILE, SHORT FORM"
<MOVE B* <MQUOTE "DSK:<IMSSS>DATSYS.PMAP">>
; "FILE NAME, ASCIZ"
<GTJFN>
<JRST OPLOST> ; "LOSE, LOSE"
<TLZ A* -1>
<MOVE B* [<(*440000*) *202200*>]>
; "36 BYTE SIZE, THAWED MODE, DON'T HANG"
<OPENF>
<JRST OPLOST>
<PUSH P* A> ; "SAVE JFN"
<MOVEI A* 4>
<PUSHJ P* PGFIND> ; "GET FOUR PAGES FROM INTERPRETER"
<JUMPL B* [<ERRUUO* <MQUOTE CANT-GET-PAGES>>]>
<ASH B* 1> ; "CRETIN TENEX"
<PUSH P* B> ; "SAVE PAGE NUMBER"
<TLO B* *400000*> ; "TURN ON 'ME' BIT"
<HRLZ A* -1(P)> ; "GET JFN"
<HRRI A* *60*> ; "PAGE IN FILE"
<HRLI C* *100000*>
<MOVEI D* *10*>
MLOP <PMAP> ; "DO MAP"
<ADDI A* 1>
<ADDI B* 1>
<SOJG D* MLOP> ; "WORK ON 10X/20X"
<GJINF> ; "DIRNUM IS IN A; B AND C HAVE GONE AWAY"
<IMULI A* 4> ; "OFFSET INTO BLOCK"
<MOVE B* (P)> ; "PAGE #, TENEX STYLE"
<ASH B* *11*> ; "MAKE IT AN ADDRESS"
<ADDI B* (A)> ; "ADDRESS OF BEGINNING OF STRING"
<PUSH P* B> ; "SAVE FOR EVENTUAL BLT"
<HRLI B* *440700*> ; "BYTE POINTER"
<MOVEI A* 0> ; "# OF CHARS"
LENLP <ILDB O* B> ; "GET CHAR"
<JUMPE O* ENDSTR> ; "DONE?"
<AOJA A* LENLP> ; "NO, INCREASE COUNT AND TRY AGAIN"
ENDSTR <PUSH P* A> ; "SAVE LENGTH"
<IDIVI A* 5> ; "# OF WORDS"
<CAIE B* 0> ; "REMAINDER 0?"
<ADDI A* 1> ; "NOPE"
<PUSH P* A> ; "SAVE # WORDS"
<MOVEI O* IBLOCK>
<PUSHJ P* RCALL> ; "GET UV"
; "# OF WORDS IN STRING IS (P); LENGTH OF STRING IS -1(P); ADDRESS OF SOURCE IS -2(P);
PAGE # OF MAPPED AREA IS -3(P)"
<MOVE D* B>
<HRL D* -2(P)> ; "SOURCE POINTER"
<MOVEI C* -1(D)> ; "DEST POINTER -1"
<ADD C* (P)> ; "END OF DESTINATION"
<BLT D* (C)> ; "GET STRING"
<MOVEI O* <TYPE-CODE STRING>>
<DPB O* [<(*221503*) 1>]> ; "CLOBBER DOPE WORDS"
<HRLI B* *440700*>
<MOVSI A* <TYPE-CODE STRING>>
<HRR A* -1(P)> ; "FINISH STRING POINTER"
<PUSH TP* A> ; "PUSH STRING"
<PUSH TP* B>
<HRROI A* -1> ; "A IS -1 FOR UNMAPPING"
<MOVE B* -3(P)> ; "PAGE #"
<TLO B* *400000*>
<MOVE C* [<(*400000*) *10*>]> ; "# PAGES"
<PMAP> ; "UNMAP"
<MOVE A* -4(P)> ; "JFN"
<CLOSF> ; "CLOSE, RELEASE JFN"
<JFCL>
<MOVE B* -3(P)>
<ASH B* -1>
<MOVEI A* *4*>
<PUSHJ P* PGGIVE> ; "GIVE BACK PAGES"
<POP TP* B>
<POP TP* A> ; "GET STRING BACK"
<SUB P* [<(5) 5>]> ; "CLEAN UP P"
<JRST MPOPJ> ; "DONE"
OPLOST <MOVE A* <TYPE-WORD FALSE>> ; "RETURN FALSE"
<MOVEI B* 0>
<JRST MPOPJ>)>
<TITLE STARTER>
<DECLARE ("VALUE" <OR FIX STRING>)>
<PUSHJ P* ISTART>
<JRST FINIS>
<INTERNAL-ENTRY ISTART 0>
<SUBM M* (P)>
<IFOPSYS (TENEX
; "NOW FIGURE OUT WHAT'S GOING ON WITH DIRECTORIES"
GETDIR <MOVEI A* *2500*> ; "ALMOST GUARANTEED--SHARING WITH SAVE FILE"
<LSH A* -9> ; "10X PAGE #"
<HRLI A* *400000*> ; "THIS PROCESS"
<RMAP> ; "GET JFN IN LH OF B"
<SKIPGE A>
<JRST D*>
<HLRZ B* A> ; "JFN TO THE RIGHT"
<MOVE D* <MQUOTE <RGLOC SCRATCH-STR T>>>
<ADD D* GLOTOP 1>
<MOVE A* 1(D)> ; "DESTINATION"
<MOVSI C* *010000*> ; "DIRECTORY FIELD ONLY"
<JFNS>
<MOVE B* 1(D)>
<MOVE A* (D)>
<JRST MPOPJ> ; "RETURN THE STRING"
OUT <MOVSI A* <TYPE-CODE FIX>>
<MOVEI B*>
<JRST MPOPJ>)
(ITS
<*CALL TTYGET>
<JFCL>
<TLO B* *300*>
<*CALL TTYSET>
<JFCL>
<*IOPUS>
<*CALL [<SETZ>
<SIXBIT "OPEN">
[<(0) 0>]
[<SIXBIT "DSK">]
[<SIXBIT "TRIVIA">]
[<SIXBIT "CURFEW">]
<SETZ [<SIXBIT "_MSGS_">]>]>
<JRST [<*IOPOP>
<JRST CORCHK>]>
<*SUSET [<(*74*) A>]>
<CAMN A* [<SIXBIT "GUEST">]>
<JRST FLUSHO>
<*CALL [<SETZ>
<SIXBIT "OPEN">
[<(0) 0>]
[<SIXBIT "DSK">]
[<SIXBIT ".FILE.">]
[<SIXBIT "(DIR)">]
<SETZ A>]>
<JRST FLUSHO>
<*CALL [<SETZ>
<SIXBIT "OPEN">
[<(*20*) 0>] ; "DON'T CHASE LINKS"
[<SIXBIT "DSK">]
[<SIXBIT "_MSGS_">]
<MOVE A>
<SETZ A>]>
<JRST FLUSHO>
<*IOPOP>
<JRST CORCHK>
FLUSHO <*IOPOP>
<MOVEI B* 5>
<JRST LEAVE>
CORCHK <MOVNI A* 1>
<*SUSET [<(*400021*) A>]> ; "FUNNY HACK"
<*CALL [<SETZ> ; "#SHARERS OF 200. INTO B"
<SIXBIT "CORTYP">
<MOVEI 201.>
<MOVEM C>
<MOVEM 0>
<MOVEM 0>
<SETZM B>]>
<*VALUE>
<JUMPL C* NOTPUR>
<TLZ B* -1> ; "CLEAR LH"
LEAVE <MOVSI A* <TYPE-CODE FIX>>
<JRST MPOPJ>
NOTPUR <MOVEI B* 5>
<JRST LEAVE>
TTYGET <SETZ>
<SIXBIT "TTYGET">
<MOVEI 2>
<MOVEM A>
<MOVEM B>
<MOVEM C>
<MOVEM D>
<SETZM E>
TTYSET <SETZ>
<SIXBIT "TTYSET">
<MOVEI 2>
<MOVE A>
<MOVE B>
<MOVE C>
<SETZ D>)
>
<IFOPSYS (TENEX
<TITLE GETSYS> ; "RETURN T IF 10X"
<DECLARE ("VALUE" <OR ATOM FALSE>)>
<PUSHJ P* IGETSYS>
<JRST FINIS>
<INTERNAL-ENTRY IGETSYS 0>
<SUBM M* (P)>
<HRROI A* 3>
<HRLOI B* *600015*> ; "NUL/NIL DEVICE"
<MOVEI C* 0>
<DEVST>
<JFCL>
<CAMN C* [<(*472531*) *400000*>]>
<JRST TOPS20>
<MOVSI A* <TYPE-CODE ATOM>>
<MOVE B* <MQUOTE T>>
<JRST MPOPJ>
TOPS20 <MOVSI A* <TYPE-CODE FALSE>>
<MOVEI B*>
<JRST MPOPJ>)>
; "ATMFIX takes an ATOM and returns a word which is the PNAME of the
atom appropriately XORed."
<TITLE ATMFIX>
<DECLARE ("VALUE" FIX <OR ATOM PSTRING>)>
<DPUSH TP* (AB)>
<PUSHJ P* ATMFIX1>
<JRST FINIS>
<INTERNAL-ENTRY ATMFIX1 1>
<SUBM M* (P)>
<MOVE A* <TYPE-WORD FIX>>
<MOVE B* (TP)>
<GETYP O* -1(TP)>
<CAIN O* <TYPE-CODE ATOM>>
<MOVE B* 3(B)>
<MOVE D* [<(*402010*) *040200*>]>
<AND D* B>
<LSH D* -1>
<TDO B* D>
<MOVE C* <MQUOTE <RGLOC SRUNM T>>>
<ADD C* GLOTOP 1>
<MOVE C* 1(C)>
<MOVE C* 1(C)>
<XOR B* C>
<SUB TP* [<2 (2)>]>
<JRST MPOPJ>
; "FIXSTR is the inverse of ATMFIX. It takes a FIX and returns a STRING
which is the PNAME of the ATOM which was previously given to ATMFIX."
<TITLE FIXSTR>
<DECLARE ("VALUE" STRING FIX)>
<DPUSH TP* (AB)>
<PUSHJ P* FIXSTR1>
<JRST FINIS>
<INTERNAL-ENTRY FIXSTR1 1>
<SUBM M* (P)>
<MOVE B* <MQUOTE <RGLOC SAVSTR T>>>
<ADD B* GLOTOP 1>
<MOVE A* (B)>
<MOVE B* 1(B)>
<SKIPN C* (TP)>
<JRST FIXFLS>
<MOVE D* <MQUOTE <RGLOC SRUNM T>>>
<ADD D* GLOTOP 1>
<MOVE D* 1(D)>
<XOR C* 1(D)>
<MOVE D* [<(*402010*) *040200*>]>
<AND D* C>
<LSH D* -1>
<TDZ C* D>
<MOVEM C* 1(B)>
FIXOUT <SUB TP* [<2 (2)>]>
<JRST MPOPJ>
FIXFLS <MOVE A* <TYPE-WORD FALSE>>
<SETZ B*>
<JRST FIXOUT>
<TITLE DISPATCH>
<DECLARE ("VALUE" ANY NOFFSET "OPTIONAL" ANY)>
<MOVE A* AB>
LOOP <DPUSH TP* (AB)>
<ADD AB* [<(2) 2>]>
<JUMPL AB* LOOP>
<HLRES A>
<ASH A* -1>
<ADDI A* TABEND>
<PUSHJ P* @ (A) 1>
<JRST FINIS>
<DISP2>
TABEND <DISP1>
<INTERNAL-ENTRY DISP1 1>
<PUSH TP* <TYPE-WORD FALSE>>
<PUSH TP* [0]>
<INTERNAL-ENTRY DISP2 2>
<SUBM M* (P)>
<MOVE A* <MQUOTE <RGLOC DISPATCH-TABLE T>>>
<ADD A* GLOTOP 1>
<MOVE A* 1(A)> ; "get dispatch table"
<GETYP C* -1(TP)>
<SKIPG B* -2(TP)> ; "pick up offset"
<JRST DOOPT>
<ADDI A* -1(B)> ; "point to instruction"
<CAIE C* <TYPE-CODE FALSE>>
<JRST ONEARG>
NOARG <XCT (A)>
<SUB TP* [<(4) 4>]>
<JRST MPOPJ>
ONEARG <XCT (A)>
<SUB TP* [<(2) 2>]>
<JRST MPOPJ>
DOOPT <MOVNS B>
<CAIE C* <TYPE-CODE FALSE>>
<JRST [<ADDI A* (B)> ; "point to next"
<JRST ONEARG>]>
<ADDI A* -1(B)>
<JRST NOARG>
;"READER FOR ZORK: TAKES INPUT BUFFER AND PROMPT, RETURNS NUMBER OF
CHARACTERS IN BUFFER.
AC USAGE:
O: RANDOM, MAINLY FOR SIOTING
A: ON ITS, .IOT <INCHAN>,B; ON 10X, PRIMARY INPUT JFN
B: USUALLY CHARACTER LAST READ, BUT CLOBBERED FOR SIOTS AND SOUTS
C: USUALLY COUNT OF CHARACTERS READ; MAY BE FROBBED TEMPORARILY WHEN SOUTING
D: ILDB POINTER TO NEXT CHAR IN BUFFER
E: <0 --> RUBOUT SHOULD FLUSH A CHAR
=0 --> RUBOUT SHOULD ECHO \<RUBBED OUT>
>0 --> RUBOUT SHOULD ECHO <RUBBED OUT>--USED BY WDFLS
PVP: OUTCHAN
P: # CHARS IN BUFFER
ARGS: INPUT BUFFER PROMPT ALTMODE ONLY TERMINATOR?"
<TITLE READST>
<DECLARE ("VALUE" FIX STRING STRING <OR ATOM FALSE>)>
<DPUSH TP* (AB)>
<DPUSH TP* 2(AB)>
<DPUSH TP* 4(AB)>
<PUSHJ P* IREADST>
<JRST FINIS>
<INTERNAL-ENTRY IREADST 3>
<SUBM M* (P)>
<IFOPSYS
(TENEX
<MOVEI E* 0>
<MOVEI A* *400000*>
<MOVEI B* 0>
<STIW> ; "NO INTERRUPTS IN HERE")
(ITS
<MOVE A* <MQUOTE <RGLOC RUBOUT? T>>>
<ADD A* GLOTOP 1>
<MOVEI E* 0>
<SKIPGE 1(A)>
<MOVNI E* 1>)>
<MOVE A* <MQUOTE <RGLOC OUTCHAN T>>>
<ADD A* GLOTOP 1>
<MOVE A* 1(A)>
<MOVE PVP* 1(A)> ; "OUTPUT CHANNEL/JFN"
<MOVE A* <MQUOTE <RGLOC INCHAN T>>>
<ADD A* GLOTOP 1>
<MOVE A* 1(A)>
<MOVE A* 1(A)> ; "GET CHANNEL #"
<IFOPSYS
(ITS
<LSH A* *27*>
<IOR A* [<*IOT B>]>)> ; "JFN FOR 10X, I/O INS FOR ITS"
<PUSHJ P* PPRMPT>
<HRRZ C* -5(TP)>
<PUSH P* C> ; "# CHARS IN STRING"
<MOVEI C* 0>
<MOVE D* -4(TP)> ; "BUFFER POINTER"
CHRLOP <IFOPSYS
(TENEX
<BIN>)
(ITS
<XCT A>)> ; "GET CHAR IN B"
<SKIPGE INTFLG>
<JRST INTHAK> ; "INTERRUPTS?"
INTBCK <CAIGE B* *40*> ; "NOT SPECIAL?"
<JRST SPCCHR>
<CAIN B* *177*> ; "RUBOUT?"
<JRST RUBOUT>
PUTCHR <PUSHJ P* PUTCHR1>
<JRST CHRLOP>
<MOVEI B* *33*> ; "PUTCHR1 SKIPS IF BUFFER FULL"
SPCCHR <CAIE B* *15*>
<CAIN B* *37*> ; "EOL"
<JRST CRHACK>
<CAIN B* *33*> ; "ALTMODE"
<JRST [<PUSHJ P* PCRLF>
<JRST RDDONE>]>
<JUMPE B* BUFFLS>
<CAIE B* %<ASCII !\>>
<CAIN B* %<ASCII !\>>
<JRST BUFFLS> ; "KILL BUFFER"
<CAIN B* %<ASCII !\>>
<JRST WDFLS>
<CAIN B* *10*>
<JRST RUBOUT> ; "BS=RUBOUT"
<CAIE B* %<ASCII !\>>
<CAIN B* %<ASCII !\>>
<JRST REBUF>
<CAIN B* *14*>
<JRST CREBUF> ; "BUFFER REDISPLAY"
<CAIN B* 7>
<JRST FAKINT> ; "CTRL-G SHOULD BE PROCESSED"
<CAIN B* *12*> ; "IGNORE CTRL-J, SINCE ^M ADDS IT"
<JRST CHRLOP>
<JRST PUTCHR>
PUTCHR1 <IDPB B* D> ; "STUFF IT OUT"
<ADDI C* 1>
<CAML C* -1(P)> ; "BUFFER FULL?"
<AOS (P)> ; "YES, SKIP"
<POPJ P*>
FAKINT <PUSH P* A>
<PUSH P* E>
<PUSH P* PVP>
<EXCH C* -3(P)>
<SUB C* -3(P)>
<HRLI C* <TYPE-CODE STRING>>
<PUSH TP* C>
<PUSH TP* D> ; "MAKE RESTED STRING TO PUSH"
<PUSH TP* <PQUOTE "CHAR">>
<PUSH TP* <MQUOTE "CHAR">>
<PUSH TP* <TYPE-WORD CHARACTER>>
<PUSH TP* B>
<PUSH TP* <TYPE-WORD CHANNEL>>
<MOVE B* <MQUOTE <RGLOC INCHAN T>>>
<ADD B* GLOTOP 1>
<PUSH TP* 1(B)>
<IFOPSYS
(TENEX
<MOVEI A* *400000*>
<MOVE B* [<(*002000*) *200000*>]>
<STIW>)>
<MCALL 3 INTERRUPT>
<IFOPSYS
(TENEX
<MOVEI A* *400000*>
<MOVEI B* 0>
<STIW>)>
<POP TP* D>
<POP TP* C>
<ADD C* -3(P)>
<EXCH C* -3(P)>
<POP P* PVP>
<POP P* E>
<POP P* A>
<PUSHJ P* PPRMPT> ; "REDISPLAY PROMPT TO SHOW THAT BACK FROM INT"
<JRST CHRLOP>
INTHAK <PUSH P* PVP> ; "SAVE OUTCHAN"
<EXCH C* -1(P)>
<SUB C* -1(P)>
<HRLI C* <TYPE-CODE STRING>> ; "MAKE C HAVE A VALID TYPE WORD FOR STRING"
<#OPCODE!-OP!-PACKAGE *5000000000* [<(*001111*) *000311*>]>
<POP P* PVP>
<HRRZS C>
<ADD C* (P)>
<EXCH C* (P)>
<JRST INTBCK> ; "RESTORE EVERYTHING, AND BACK"
CRHACK <IFOPSYS
(TENEX
<CAIE B* *37*> ; "TURN EOL INTO CRLF"
<JRST CRHACK1>
<MOVEI B* *15*>
<PUSHJ P* CHROUT>
<MOVEI B* *12*>
<PUSHJ P* CHROUT>
<MOVEI B* *15*>)>
CRHACK1 <SKIPL (TP)> ; "CAN CR TERMINATE?"
<JRST RDDONE> ; "YES!"
<PUSHJ P* PUTCHR1>
<CAIA>
<JRST RDDONE>
<MOVEI B* *12*> ; "FOLLOW WITH LF"
<JRST PUTCHR>
<IFOPSYS
(ITS
SIOT <SETZ>
<SIXBIT "SIOT">
<MOVE PVP>
<MOVE B>
<SETZ O>
DSIOT <SETZ>
<SIXBIT "SIOT">
<MOVSI *4000*> ; "TURN ON DISPLAY BIT"
<MOVE PVP>
<MOVE B>
<SETZ O>)>
CHROUT <IFOPSYS
(TENEX
<PUSH P* A>
<MOVE A* PVP>
<BOUT>
<POP P* A>)
(ITS
<*CALL [<SETZ>
<SIXBIT "IOT">
<MOVE PVP>
<SETZ B>]>
<*LOSE *1000*>)>
<POPJ P*>
RDDONE <MOVE A* <MQUOTE <RGLOC SCRIPT-CHANNEL T>>>
<ADD A* GLOTOP 1>
<SKIPL 1(A)> ; "SKIPS IF SCRIPTING ON"
<JRST RDDONE1>
<PUSH P* C> ; "SAVE CHARACTER COUNT"
<PUSH TP* (A)>
<PUSH TP* 1(A)>
<PUSH TP* -5(TP)> ; "PROMPT"
<PUSH TP* -5(TP)>
<PUSH TP* (A)>
<PUSH TP* 1(A)>
<MCALL 2 PRINTSTRING>
<PUSH TP* -7(TP)>
<PUSH TP* -7(TP)> ; "BUFFER"
<PUSH TP* -3(TP)>
<PUSH TP* -3(TP)> ; "SCRIPT CHANNEL"
<PUSH TP* <TYPE-WORD FIX>>
<PUSH TP* (P)> ; "# CHARACTERS"
<MCALL 3 PRINTSTRING>
<DPUSH TP* <PQUOTE <STRING <ASCII 13> <ASCII 10>>>>
<PUSH TP* -3(TP)>
<PUSH TP* -3(TP)>
<PUSH TP* <TYPE-WORD FIX>>
<PUSH TP* [2]>
<MCALL 3 PRINTSTRING>
<SUB TP* [<(2) 2>]>
<POP P* C>
RDDONE1 <IFOPSYS
(TENEX
<MOVEI A* *400000*>
<MOVE B* [<(*002004*) *000000*>]>
<STIW>)>
<MOVSI A* <TYPE-CODE FIX>>
<MOVE B* C>
<SUB P* [<(1) 1>]>
<SUB TP* [<(6) 6>]>
<JRST MPOPJ>
CREBUF <IFOPSYS
(TENEX
<JRST REBUF>)
(ITS
<MOVEI O* 2>
<MOVE B* <MQUOTE "C">>
<*CALL DSIOT> ; "THIS HAS DISPLAY BIT ON"
<*LOSE *1000*>
<JRST REBUF1>)>
REBUF <IFOPSYS
(TENEX
<PUSH P* C>
<PUSHJ P* PCRLF> ; "CR"
<PUSHJ P* PPRMPT>
<MOVE B* -4(TP)>
<MOVN C* (P)>
<SKIPE C>
<SOUT> ; "BUFFER"
<POP P* C>)
(ITS
<PUSHJ P* PCRLF>
REBUF1 <PUSHJ P* PPRMPT> ; "COMMON CODE FOR CTRL-D AND CTRL-L"
<MOVE B* -4(TP)>
<MOVE O* C>
<*CALL SIOT>
<*LOSE *1000*>)>
<JRST CHRLOP> ; "GO BACK FOR NEXT CHAR"
PCRLF <IFOPSYS
(TENEX
<MOVE B* <MQUOTE %<STRING <ASCII 13> <ASCII 10>>>>
<PUSH P* C>
<MOVNI C* 2>
<SOUT>
<POP P* C>)
(ITS
<MOVE B* <MQUOTE %<STRING <ASCII 13> <ASCII 10>>>>
<MOVEI O* 2>
<*CALL SIOT>
<*LOSE *1000*>)>
<POPJ P*>
PPRMPT <IFOPSYS
(TENEX
<MOVE B* -2(TP)>
<PUSH P* C>
<HRRZ C* -3(TP)>
<MOVNS C>
<SKIPE C>
<SOUT>
<POP P* C>)
(ITS
<MOVE B* -2(TP)>
<HRRZ O* -3(TP)>
<*CALL SIOT>
<*LOSE *1000*>)>
<POPJ P*>
BUFFLS <MOVEI C* 0> ; "THROW EVERYTHING AWAY"
<MOVE D* -4(TP)>
<PUSHJ P* PCRLF>
<PUSHJ P* PPRMPT>
<JRST CHRLOP>
RUBOUT <PUSHJ P* RRUBOUT>
<JRST CHRLOP>
RRUBOUT <JUMPE C* [<SUB P* [<(1) 1>]>
<JRST REBUF>]> ; "IF RUBBING OUT PAST BEG OF LINE, REDO PROMPT &C"
<IFOPSYS
(ITS
<JUMPL E* RUBFLS> ; "IF E IS 0, HAVE TO PRINT \ FIRST")>
<JUMPG E* RUBOUT1>
<MOVEI B* 92>
<PUSHJ P* CHROUT>
RUBOUT1 <LDB B* D> ; "GET CHAR BEING FLUSHED"
<PUSHJ P* CHROUT>
RUBOUT2 <ADD D* [<(*70000*) 0>]>
<TLNE D* *400000*>
<ADD D* [<(*347777*) *777777*>]>
<SUBI C* 1>
<POPJ P*>
<IFOPSYS
(ITS
RUBFLS <LDB B* D> ; "GET CHAR"
<CAIN B* *12*>
<JRST [<MOVE B* <MQUOTE <STRING "U">>> ; "LINE STARVE"
<JRST RUBFLO>]>
<CAIN B* *15*>
<JRST RUBFCR>
<MOVE B* <MQUOTE <STRING "X">>>
RUBFLO <MOVEI O* 2>
<*CALL DSIOT>
<*LOSE *1000*>
<JRST RUBOUT2>
RUBFCR <PUSH P* C>
<PUSH P* D>
<PUSH P* E>
<MOVE D* -4(TP)> ; "POINTER TO BUFFER"
<HRRZ E* -3(TP)> ; "CURRENT HORIZONTAL POSITION--PROMPT"
<SOJLE C* RUBCRE1> ; "FLUSH CR FROM END"
RUBCRL <ILDB B* D>
<CAIN B* *15*>
<JRST [<MOVEI E* 0>
<JRST RUBCRE>]>
<CAIN B* *12*>
<JRST RUBCRE>
<ADDI E* 1>
RUBCRE <SOJG C* RUBCRL>
RUBCRE1 <ADDI E* 8>
<MOVEI O* 2>
<MOVE B* <MQUOTE "H">>
<*CALL DSIOT>
<*LOSE *1000*>
<*CALL [<SETZ>
<SIXBIT "IOT">
<MOVSI *4000*>
<MOVE PVP>
<SETZ E>]> ; "SET HORIZONTAL POSITION"
<*LOSE *1000*>
<POP P* E>
<POP P* D>
<POP P* C>
<JRST RUBOUT2>)>
WDFLS <JUMPE C* REBUF> ; "NOTHING TO FLUSH"
<JUMPL E* WDFLS1> ; "CAN RUBOUTS HAPPEN?"
<MOVEI B* 92>
<PUSHJ P* CHROUT>
<ADDI E* 1> ; "INHIBIT \ WHEN DOING RUBOUTS"
WDFLS1 <LDB B* D> ; "GET CHAR BEING FLUSHED"
<CAIE B* *40*> ; "SPACE?"
<CAIN B* *15*> ; "CR?"
<JRST WDFLS11>
<CAIE B* *12*>
<CAIN B* *11*>
<JRST WDFLS11>
<CAIE B* *54*> ; "COMMA"
<CAIN B* *56*> ; "PERIOD"
<JRST WDFLS11>
<JRST WDFLS2> ; "REAL STUFF"
WDFLS11 <PUSHJ P* RRUBOUT> ; "RUB IT OUT"
<JUMPE C* WDFLSO> ; "EMPTY BUFFER"
<JRST WDFLS1>
WDFLS2 <LDB B* D>
<CAIE B* *40*>
<CAIN B* *15*>
<JRST WDFLSO>
<CAIE B* *12*>
<CAIN B* *11*>
<JRST WDFLSO>
<CAIE B* *54*>
<CAIN B* *56*>
<JRST WDFLSO>
<PUSHJ P* RRUBOUT>
<JUMPG C* WDFLS2>
WDFLSO <JUMPLE E* CHRLOP>
<MOVEI B* 92>
<PUSHJ P* CHROUT>
<MOVEI E* 0>
<JRST CHRLOP>
<TITLE TTY-INIT>
<DECLARE ("VALUE" ATOM <OR ATOM FALSE>)>
<DPUSH TP* (AB)>
<PUSHJ P* IINIT>
<JRST FINIS>
<INTERNAL-ENTRY IINIT 1>
<SUBM M* (P)>
<MOVE A* <MQUOTE <RGLOC OUTCHAN T>>>
<ADD A* GLOTOP 1>
<MOVE A* 1(A)> ; "OUTCHAN"
<IFOPSYS
(TENEX
<MOVEI B* 70>
<SKIPN 25(A)>
<MOVEM B* 25(A)> ; "MAKE CHANNEL WIDTH NON-ZERO")>
<MOVE A* 1(A)>
<IFOPSYS
(TENEX
<SKIPL (TP)> ; "SAVE CURRENT STATE?"
<JRST STMODE>
<MOVE E* <MQUOTE <RGLOC RUVEC T>>>
<ADD E* GLOTOP 1>
<MOVE E* 1(E)>
STMODE <RFMOD>
<SKIPGE (TP)>
<MOVEM B* (E)> ; "MODE WORD"
<TRO B* *140100*>
<TRZ B* *030200*>
<SFMOD>
<SKIPL (TP)>
<JRST SCMODE>
<RFCOC> ; "CONTROL CHARACTER FORMATTING"
<MOVEM B* 1(E)>
<MOVEM C* 2(E)>
SCMODE <MOVE B* <MQUOTE #2 {0 1 1 1 0 1 1 2 0 3 3 1 0 3 1 1 1 1}>>
<MOVE B* 1(B)>
<MOVE C* <MQUOTE #2 {1 1 1 1 1 0 0 1 1 1 1 1 1 0}>>
<MOVE C* 1(C)>
<SFCOC> ; "THIS DOES ECHOING FOR CTRL-CHARS"
<MOVEI A* *400000*>
<SKIPL (TP)>
<JRST SIMODE>
<RTIW>
<MOVEM B* 3(E)>
SIMODE <MOVE B* [<(*2004*) 0>]>
<STIW>
<SKIPL (TP)>
<JRST INTSET>
<MCALL 0 ACTIVATE-CHARS>
<MOVE C* <MQUOTE <RGLOC ACT-STRING T>>>
<ADD C* GLOTOP 1>
<MOVEM A* (C)>
<MOVEM B* 1(C)>
INTSET <DPUSH TP* <PQUOTE "">>
<MCALL 1 ACTIVATE-CHARS>)
(ITS
<*CALL [<SETZ>
<SIXBIT "CNSGET">
<MOVE A>
<MOVEM B>
<MOVEM B>
<MOVEM B>
<MOVEM B>
<SETZM B>]>
<*LOSE *1000*>
<TLNN B* *40000*> ; "TEST %TOERS"
<JRST INIT1>
<MOVE B* <MQUOTE <RGLOC RUBOUT? T>>>
<ADD B* GLOTOP 1>
<MOVE C* <MQUOTE T>>
<MOVEM C* 1(B)>
<MOVSI C* <TYPE-CODE ATOM>>
<MOVEM C* (B)> ; "SETG RUBOUT? TO T"
INIT1 <SKIPL (TP)>
<JRST DTTYST>
<MOVE B* <MQUOTE <RGLOC RUVEC T>>>
<ADD B* GLOTOP 1>
<MOVE B* 1(B)>
<*CALL [<SETZ>
<SIXBIT "TTYGET">
<MOVE A>
<MOVEM (B)>
<SETZM 1(B)>]>
<*LOSE *1000*>
DTTYST <*CALL [<SETZ>
<SIXBIT "TTYSET">
<MOVE A>
<MOVE [<(*022020*) *202020*>]>
<SETZ [<(*032022*) *220222*>]>]>
<*LOSE *1000*>)>
TTYIDN <SUB TP* [<(2) 2>]>
<MOVSI A* <TYPE-CODE ATOM>>
<MOVE B* <MQUOTE T>>
<JRST MPOPJ>
<TITLE TTY-UNINIT>
<DECLARE ("VALUE" ATOM)>
<PUSHJ P* IUNINIT>
<JRST FINIS>
<INTERNAL-ENTRY IUNINIT 0>
<SUBM M* (P)>
<MOVE A* <MQUOTE <RGLOC OUTCHAN T>>>
<ADD A* GLOTOP 1>
<MOVE A* 1(A)>
<MOVE A* 1(A)>
<IFOPSYS
(TENEX
<MOVE D* <MQUOTE <RGLOC RUVEC T>>>
<ADD D* GLOTOP 1>
<MOVE D* 1(D)>
<MOVE B* (D)>
<SFMOD> ; "RESTORE MODES"
<MOVE B* 1(D)>
<MOVE C* 2(D)>
<SFCOC>
<MOVEI A* *400000*>
<MOVE B* 3(D)>
<STIW>
<MOVE D* <MQUOTE <RGLOC ACT-STRING T>>>
<ADD D* GLOTOP 1>
<PUSH TP* (D)>
<PUSH TP* 1(D)>
<MCALL 1 ACTIVATE-CHARS> ; "RESTORE INTERRUPTS")
(ITS
<MOVE B* <MQUOTE <RGLOC RUVEC T>>>
<ADD B* GLOTOP 1>
<MOVE B* 1(B)>
<*CALL [<SETZ>
<SIXBIT "TTYSET">
<MOVE A>
<(B)>
<SETZ 1(B)>]>
<*LOSE *1000*>)>
<MOVE B* <MQUOTE T>>
<MOVSI A* <TYPE-CODE ATOM>>
<JRST MPOPJ>
<TITLE EXCRUCIATINGLY-UNTASTEFUL-CODE>
<DECLARE ("VALUE" ATOM)>
<PUSHJ P* IEUC>
<JRST FINIS>
<INTERNAL-ENTRY IEUC 0>
<SUBM M* (P)>
<MOVE A* <MQUOTE <RGLOC PRSVEC T>>>
<ADD A* GLOTOP 1>
<HRRZ A* 1 (A)>
<ADDI A* 1>
<MOVEM A* *60*>
<ADDI A* 2>
<MOVEM A* *61*>
<ADDI A* 2>
<MOVEM A* *62*>
<MOVE A* <TYPE-WORD ATOM>>
<MOVE B* <MQUOTE T>>
<JRST MPOPJ>
; "POBLIST HACKS"
<TITLE STRINGP>
<DECLARE ("VALUE" STRING <PRIMTYPE WORD>)>
<DPUSH TP* (AB)>
<PUSHJ P* ISTRP>
<JRST FINIS>
<INTERNAL-ENTRY ISTRP 1>
<SUBM M* (P)>
<MOVE A* <TYPE-WORD STRING>>
<MOVE B* <MQUOTE <RGLOC PPSTRING T>>>
<ADD B* GLOTOP 1>
<MOVE B* 1(B)>
<MOVE C* (TP)>
<MOVE D* [<(*440700*) C>]>
<SETZ E*>
STRPLP <ILDB D>
<JUMPE STRPGO>
<CAIN E* 5>
<JRST STRPGO>
<AOJA E* STRPLP>
STRPGO <HRR A* E>
<MOVEM C* 1(B)>
<SUB TP* [<(2) 2>]>
<JRST MPOPJ>
<TITLE PSTRING>
<DECLARE ("VALUE" PSTRING STRING)>
<DPUSH TP* (AB)>
<PUSHJ P* IPSTR>
<JRST FINIS>
<INTERNAL-ENTRY IPSTR 1>
<SUBM M* (P)>
<MOVE A* (TP)>
<HLRZ C* A>
<CAIN C* *10700*>
<JRST PSTR1>
<MOVE B* (A)>
<HRRZ C* -1(TP)>
<SUBI C* 5>
<MOVNS C>
<IMULI C* 7>
<LSH B* (C)>
<CAIA>
PSTR1 <MOVE B* 1(A)>
<MOVE A* <TYPE-WORD PSTRING>>
<SUB TP* [<(2) 2>]>
<JRST MPOPJ>