; 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  MENTED 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 ;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) ;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 ;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 TITLE 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 ;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 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