--- /dev/null
+ ; TABLE OF POWERS OF TEN
+ TITLE TENTAB
+ 1PASS
+ .LIBRA TENTAB,ITENTB
+ .GLOBA TENTAB,ITENTB
+
+TENTAB: REPEAT 39. 10.0^<.RPCNT-1>
+
+MUM=1
+ITENTB: REPEAT 11. 10.^<.RPCNT-1>
+
+END
+\f\ 3\f\ 3\ 3MENTED MODULES:
+; GTUNIT - GETS A UNIT OF TEXT AND RETURNS VALUE
+; CONVRT - DOES THE ACTUAL CONVERSION
+; LXINIT - SETS UP LEXICON FILES
+;CHANNEL DEFS
+
+MLXCHN==1 ;CHANNEL FOR MAIN LEXICON
+ALXCHN==2 ;AUXILIARY LEXICON
+TYIC==3
+TTYIN==3
+TYOC==4
+TYOC1==4
+TTYOUT==4
+ALT==5
+NWCHN==6
+\f;SECTION TO START THE SYSTEM
+
+GO: .OPEN TYIC,[SIXBIT / TTY/]
+ .VALUE
+ .OPEN TYOC,[SIXBIT / !TTY/]
+ .VALUE
+ PASCR [ASCIZ /ENTER LEXICON NAMES/]
+ PUSHJ P,LXINIT
+
+;CODE HERE FOR MAIN LOOP OF LEXICONTEXT (LISTENER)
+\f;SUBROUTINE TO INITIALIZE THE SYSTEM BY OPENING LEXICON FILES
+
+;FIRST FILE IS MAIN LEXICON
+;SECOND FILE IS AUXILIARY LEXICON
+;THIRD FILE IS NEW LCXICON; IF IT IS NOT FOUND, IT WILL BE CREATED
+ ;IF IT IS FOUND, NEW WORDS WILL BE APPENDED
+
+LXINIT: PUSH P,A ;SAVE AC A
+ SKIPE LXFMFL
+ JRST LSETMN
+ PASC [ASCIZ /MAIN LEXICON: /]
+LSETMN: PUSHJ P,RCMD ;READ A FILE NAME
+ PUSHJ P,SCNAME
+ SKIPN A,SCN1 ;NO NAME GIVEN MEANS THERE IS NO MAIN LEXICON
+ JRST AUXNM ;AND JUST SKIP THIS STEP
+ MOVEM A,MLXNM+1 ;SET UP FIRST NAME
+ SKIPN A,SCN2 ;SEE IF ANY SECOND NAME GIVEN
+ MOVE A,[SIXBIT /MAINLX/] ;IF NOT SET UP DEFAULT SECOND NAME
+ MOVEM A,MLXNM+2 ;SET UP SECOND NAME
+ .OPEN MLXCHN,MLXNM ;OPEN THE MAIN LEXICON FILE
+ .VALUE ;REPLACE BY ERROR PROCEDURE EVENTUALLY
+AUXNM: SKIPE LXFMFL
+ JRST LSETAU
+ PASC [ASCIZ /AUXILIARY LEXICON: /]
+ PUSHJ P,RCMD ;READ SECOND FILE NAME
+ PUSHJ P,SCNAME
+LSETAU: SKIPN A,SCN1 ;NO AUXILIARY LEXICON?
+ JRST NWNM ;NO, JUST SET UP NEW LEXICON THEN
+ MOVEM A,ALXNM+1 ;SET UP FIRST NAME
+ SKIPN A,SCN2 ;SET UP SECOND NAME AS ABOVE
+ MOVE A,[SIXBIT /AUXLEX/]
+ MOVEM A,ALXNM+2
+ .OPEN ALXCHN,ALXNM ;OPEN AUXILIARY LEXICON FILE
+ .VALUE ;REPLACE BY ERROR PROCEDURE
+\f;SECTION TO OPEN NEW LEXICON FILE
+
+NWNM: SKIPE LXFMFL
+ JRST LSETNW
+ PASC [ASCIZ /NEW LEXICON: /]
+ PUSHJ P,RCMD ;READ THIRD FILE NAME
+ PUSHJ P,SCNAME
+LSETNW: SKIPN A,SCN1 ;ANY NAME GIVEN?
+ JRST READY ;NEW LEXICON WILL BE SET UP LATER
+ MOVEM A,NWLXNM+1 ;SET UP NAME
+ SKIPN A,SCN2
+ MOVE A,[SIXBIT /NEWLEX/]
+ MOVEM A,NWLXNM+2 ;SET UP SECOND NAME
+ MOVE A,[SIXBIT / &DSK/] ;READ IMAGE BLOCK
+ MOVEM A,NWLXNM
+ PUSHJ P,NWLXOP ;GO TELL CONVRT ABOUT NEW LEXICON FILE
+
+;SECTION TO READ IN B-BLOCKS
+
+READY: SKIPN MLXNM+1 ;IS THERE A MAIN LEXICON?
+ JRST RDAUXB ;NO READ AUX B-BLOCKS THEN
+ .ACCES MLXCHN,[0]
+ MOVE A,[-26.,,MBBASE]
+ .IOT MLXCHN,A ;READ IN MAIN LEXICON B-BLOCK
+RDAUXB: SKIPN ALXNM+1
+ JRST BLKSRD ;ALL DONE
+ .ACCES ALXCHN,[0]
+ MOVE A,[-26.,,ABBASE]
+ .IOT ALXCHN,A
+BLKSRD: SETZM MENMAP
+ SETZM AENMAP
+ MOVE A,[377777,,777777]
+ MOVEM A,MBGMAP
+ MOVEM A,ABGMAP
+ PASCR [ASCIZ /READY/]
+ POP P,A
+ POPJ P,
+
+MLXNM: SIXBIT / &DSK/
+ 0
+ 0
+ALXNM: SIXBIT / &DSK/
+ 0
+ 0
+LXFMFL: 0
+\fTITLE GTUNIT - MODULE TO GET A UNIT OF TEXT FROM THE USER
+
+;INPUT MODULE - GETS INPUT AND RETURNS LEXICON VALUES
+;AS 36-BIT QUANTITIES
+;IF THE ITEM RECEIVED IS THE ESCAPE CHARACTER TO GO TO EDIT
+;MODE, RETURNS ARGP=0, OTHERWISE ARGP CONTAINS ACTUAL LEXICON
+;VALUE
+
+;CALLS CONVRT TO CONVRT AN ASCII STRING TO A VALUE IF A WORD
+;IS THE NEXT ITEM
+
+;BUILDS LITERALS FROM PUNCTUATION,,ETC. AND PACKS THEM
+;4 TO A WORD, 7BIT ASCII, IN FORMAT FOR BYTE MANIPULATION
+;LEFTMOST PART OF WORD CONTAINS TYPE CODE FOR A LITERAL
+;THIS MODULE MAKES A CALL UP TO A ROUTINE LITOUT
+;WHENEVER SUCH A LITERAL WORD SHOULD BE PLACED IN OUTPUT STREAM
+
+;USES REVISED GETITM ROUTINE WHICH TREATS SPACES AND C.R. AS PUNCT.
+;ASSUMES TTY CHANNELS OPEN ON CHANNELS TTYOUT, TTYIN
+
+;DEFINE THE ESCAPE CHARACTER
+ESCAPE==0
+
+\f;ENTER TO GET A UNIT OF TEXT AND RETURN A VALUE IN ARGP
+
+GTUNIT: SAVEB A,D
+GTCHNK: CALL GETITM,[0,ITYPE] ;GET A CHUNK OF INPUT INTO B
+ CAIN ITYPE,3 ;IS IT A STRING (WORD)
+ JRST WRDGOT ;YES, CONVERT TO LEXICON VALUE
+ CAIN ITYPE,4 ;IS IT PUNCTUATION
+ JRST PNCGOT ;YES, GO BUILD LITERAL
+ JRST GTCHNK ;FOR NOW, IGNORE ALL OTHER TYPES
+
+WRDGOT: PUSHJ P,LITDMP ;CLEAR ANY LITERAL BUFFER
+ MOVE ARGP,A ;SET UP POINTER TO HEAD OF THE CHARACTER STRING
+ SOS A
+ PUSHJ P,CONVRT ;AND CONVERT TO A VALUE
+RRRET: RESTB A,D ;EXIT SEQUENCE
+ POPJ P, ;EXIT WITH VALUE IN ARGP
+
+PNCGOT: CAIN A,ESCAPE ;IS IT THE ESCAPE CHARACTER?
+ JRST MODCHG ;YES, CHANGE MODE
+ PUSHJ P,LITADD ;ADD TO LITERAL BUFFER
+ JRST RRRET ;AND RETURN
+
+
+LITDMP: CAMN C,[350700,,D] ;SEE IF BUFFER HAS ANYTHING IN IT
+ POPJ P, ;NO, JUST RETURN
+ MOVE ARGP,D ;YES, SEND OUT THE LITERAL
+ PUSHJ P,LITOUT
+ MOVE C,[350700,,D] ;RESET BUFFER
+ POPJ P,
+LITADD: IDPB A,D ;PUT CHARACTER IN THE LITERAL BUFFER IN D
+CAMN C,[000700,,D] ;FULL?
+PUSHJ P,LITDMP ;YES, DUMP IT
+POPJ P,
+
+;CODE HERE TO CHANGE MODES
+MODCHG: .BREAK ;FOR DEBUGGING
+\f TITLE GETITM
+; THIS PROGRAM READS ITEMS FROM THE INPUT STREAM
+; RETURNING THEM ONE AT A TIME TO THE USER WITH
+; A TYPE CODE
+
+
+
+ .GLOBA READCH,TENTAB,ITENTB,FLUSHI,GETERR
+
+
+;THIS DEFINED FOR ACTUAL TTY ROUTINE
+
+
+
+; CODES FOR CHARACTER TYPES
+
+OCDIG=1
+DECDIG=2