Added PIP and SYSTAT, updated CREF
authorRichard Cornwell <rcornwell@github.com>
Sat, 11 May 2019 18:26:13 +0000 (14:26 -0400)
committerRichard Cornwell <rcornwell@github.com>
Sat, 11 May 2019 18:26:13 +0000 (14:26 -0400)
src/cref.mac
src/pip.mac [new file with mode: 0644]
src/pip.opr [new file with mode: 0644]
src/systat.mac [new file with mode: 0644]
src/systat.opr [new file with mode: 0644]

index c88c8c8..309cd1b 100644 (file)
@@ -103,7 +103,7 @@ MLON
 CREF:  TDZA IO,IO              ;START HERE FROM (JOBSA)\r
        MOVSI IO,IORPG          ;START HERE FROM (JOBSA)+1\r
        RESET\r
-       MOVEI ENDCLR\r
+       MOVEI ENDCLR+1\r
        MOVEM JOBFF             ;INIT JOBFF TO 1ST FREE LOCATION\r
        MOVE PP,[IOWD PDL,PPSET]        ;INIT PUSH DOWN LIST\r
 \r
diff --git a/src/pip.mac b/src/pip.mac
new file mode 100644 (file)
index 0000000..5f3f522
--- /dev/null
@@ -0,0 +1,3809 @@
+TITLE PIP V.022  19-AUG-71\r
+SUBTTL  VJC/PMH/AK-DAG/DMN      8-JUL-70\r
+\r
+;PERIPHERAL INTERCHANGE PROGRAM\r
+;"COPYRIGHT 1968, 1969, DIGITAL EQUIPMENT CORP.,MAYNARD,MASS.,U.S.A.\r
+\r
+VPIP==22               ;VERSION NUMBER\r
+SVER==0  \r
+\r
+\r
+;WCH==0  PIP IS ASSEMBLED FOR PDP-10 AND ASSUMES NEW FORMAT DECTAPES.\r
+;WCH==1  PIP IS ASSEMBLED FOR PDP-6 AND ASSUMES OLD FORMAT DECTAPES.\r
+\r
+;DISK30==0 PIP IS ASSEMBLED TO RUN WITH 10/40, 10/50 MONITOR SYSTEMS.\r
+;DISK30==1 PIP IS ASSEMBLED TO RUN WITH 10/30 DISK SYSTEM.\r
+\r
+;BLOC0==0 PIP ALLOWS COPYING OF BLOCK0 (DECTAPE).\r
+;BLOC0==1 PIP WILL NOT ALLOW BLOCK0 TO BE COPIED.\r
+\r
+;RIMSW==0 /Y SWITCH OPTION UNAVAILABLE. (ALSO UNAVAILABLE FOR OLD FORMAT DECTAPES)\r
+;RIMSW==1 /Y SWITCH OPTION AVAILABLE.\r
+\r
+;CCLSW==0 PIP WILL NOT PROCESS CCL COMMANDS.(ALSO TRUE FOR 10/30 DISK SYSTEM)\r
+;CCLSW==1 PIP WILL EXECUTE CCL COMMANDS FROM DISK.\r
+\r
+;TEMP==1 PIP WILL GET CCL COMMANDS FROM CORE (TMPCOR UUO)\r
+\r
+;REENT==1 PIP IS REENTRANT (AK-DAG)\r
+\r
+;FTDSK==0       NON DSK SYSTEM.NO CCL.SAVES CORE ON 10/40\r
+;FTDSK==1       10/50 DSK SYSTEM,ALSO 10/30 DSK SYSTEM\r
+\r
+\r
+\f\r
+;CONDITIONAL ASSEMBLY SWITCH SETUP (NORMAL CONFIGURATION)\r
+;---------------------------------\r
+\r
+IFNDEF WCH,     <WCH==0>\r
+IFNDEF DISK30,  <DISK30==0>\r
+IFNDEF BLOC0,   <BLOC0==0>\r
+IFNDEF FTDSK,   <FTDSK==1>\r
+IFE FTDSK,      <CCLSW==0>\r
+IFNDEF CCLSW,   <CCLSW==1>\r
+IFN DISK30,     <CCLSW==0>\r
+IFN WCH,        <RIMSW==0>\r
+IFE CCLSW,      <TEMP==0>\r
+IFNDEF TEMP,    <TEMP==1>\r
+IFNDEF REENT,   <REENT==1>\r
+IFNDEF RIMSW,   <RIMSW==0>\r
+\r
+\r
+\r
+IFN REENT,<HISEG>\r
+\r
+        LOC 124\r
+        PIP1            ;SET REENTER ADDRESS\r
+        RELOC\r
+        LOC 137\r
+        XWD SVER,VPIP\r
+        RELOC\r
+\r
+\r
+        MLON\r
+IFDEF SALL,     <SALL>\r
+\f\r
+EXTERN JOBFF,JOBSA,JOBREL,jobren\r
+\r
+;FLAG ASSIGNMENTS (RIGHT HALF)\r
+\r
+LINE==1         ;ASCII LINE MODE PROCESSING\r
+BMOD==2         ;BINARY PROCESSING\r
+TBMOD==4        ;SUPPRESS TRAILING SP, CHANGE MULTIPLE SP TO TABS\r
+DFLG==10        ;DELETE FILES MODE\r
+LFLG==20        ;LIST DIRECTORY\r
+NSMOD==40       ;IGNORE INPUT SEQUENCE NUMBERS\r
+RFLG==100       ;RENAME FILE MODE\r
+SQMOD==200      ;GENERATE SEQUENCE NUMBERS\r
+STS==400        ;END OF LINE SEEN, OUTPUT SEQUENCE NUMBER NEXT\r
+SPMOD==1000     ;SUPPRESS TRAILING SPACES\r
+XFLG==2000      ;COPY DECTAPE MODE\r
+ZFLG==4000      ;CLEAR DECTAPE DIRECTORY\r
+SUS==10000      ;SEQUENCE NUMBER GENERATION IN PROGRESS\r
+SPOK==20000     ;SPACE WAS LAST CHARACTER\r
+ESQ==40000      ;STOP OUTPUTTING SEQ NUM, RESUME OUTPUTTING DATA\r
+SNI==100000     ;DO NOT INCREMENT SEQUENCE NUMBER\r
+MTFLG==200000   ;MTA REQUEST RECEIVED\r
+OSFLG==400000   ;GENERATE SEQ. NOS. INCR. BY ONE\r
+\r
+;FLAG ASSIGNMENTS (LEFT HALF)\r
+\r
+OFLG==1         ;BLOCK 0 COPY\r
+RIMFLG==2       ;RIM FORMAT INPUT /OUT TO DTA. ILLEG IF RIMSW==0,OR WCH==1\r
+PFLG==4         ;FORTRAN PROGRAM OUTPUT FORMAT CONVERSION\r
+PCONV==10       ;COLUMN 1 CONVERSION IN PROGRESS\r
+NEWFIL==20      ;NEW FILE JUST INITIATED\r
+CHKFLG==40      ;PARENTHESES CHECK MODE\r
+IFLG==100       ;SELECT IMAGE MODE\r
+GFLG==200       ;KEEP GOING IF THERE ARE I/O ERRORS\r
+IBFLG==400      ;SELECT IMAGE BINARY MODE\r
+\f;AUXFLG ASSIGNMENTS (LEFT HALF)\r
+\r
+QFLG==1         ;PLEASE PRINT SWITCH SET\r
+NSPROT==2       ;NON-STANDARD DISK OUTPUT PROTECTION\r
+SBIN==4         ;36-BIT PR. ON REL. ETC. FILES\r
+NOMORE==20      ;IGNORE ANY SWITCHES BUT MTA FROM NOW ON\r
+CDRFLG==40      ;CONVERT COLS 73-80 TO SPACES + /C\r
+INFOFL==100     ;FLAG USED BY ERR3A:\r
+RSDCFL==200     ;USED FOR MERGING FILES, ==1 IF FILE HAS EXTENSION\r
+                ;REL,SAV,DMP,CHN OR OTHERWISE == 0\r
+FRSTIN==400     ;THIS IS THE FIRST INPUT FILE (USED IN FILE\r
+                ;MERGE COMMAND) == 0 FOR FIRST INPUT\r
+\r
+;MTAREQ ASSIGNMENTS (RIGHT HALF)\r
+\r
+MTAFLG==1       ;MTA ADVANCE ONE FILE\r
+MTBFLG==2       ;MTA BACKSPACE ONE FILE\r
+MTTFLG==4       ;MTA SKIP TP LOGICAL EOT\r
+MTWFLG==10      ;MTA REWIND\r
+MTFFLG==20      ;MTA MARK EOF\r
+MTUFLG==40      ;MTA REWIND AND UNLOAD\r
+MTDFLG==100     ;MTA ADVANCE ONE RECORD\r
+MTPFLG==200     ;MTA BACKSPACE ONE RECORD\r
+MT8FLG==400     ;MTA SET 800 B.P.I.\r
+MT5FLG==1000    ;MTA SET 556 B.P.I.\r
+MT2FLG==2000    ;MTA SET 200 B.P.I.\r
+MTEFLG==4000    ;MTA SELECT EVEN PARITY\r
+\r
+;AUXFLG ASSIGNMENTS (RIGHT HALF)\r
+\r
+REDFLG==1       ;==1 IF ANY FILES ARE INPUT (OTHER THAN DIRECTORIES)\r
+SYSLST==4       ;LAST DEVICE WAS SYS\r
+LPTOUT==10      ;LPT OUTPUT\r
+FFLG==20        ;LIST SHORT DISK DIRECTORY\r
+ONEOUT==40      ;ONE OUTPUT FILE INITIALIZED\r
+CDRIN==100      ;CARDS IN\r
+MTAOUT==200     ;OUTPUT TO MTA\r
+MTAIN==400      ;INPUT FROM MTA\r
+TTYIN==1000     ;INPUT FROM TTY\r
+READ1==2000     ;LOOK FOUND NEW INPUT FILE, NO READ YET.\r
+DTAOUT==4000    ;OUTPUT TO DTA\r
+DSKOUT==10000   ;OUTPUT TO DSK\r
+DTAIN==20000    ;INPUT FROM DTA\r
+DSKIN==40000    ;INPUT FROM DSK\r
+TTYOUT==100000  ;OUTPUT TO TTY\r
+PPTIN==200000   ;INPUT FROM PTR\r
+PPTOUT==400000  ;OUTPUT TO PTP\r
+\f;CALFLG ASSIGNMENTS (RIGHT HALF) FOR DESCRIBING A BLOCK OF INFORMATION\r
+;FOUND BY THE COMMAND SCANNER.\r
+\r
+FNEX==1         ;==1 WHEN FN.EX==*.*, *.EXT, FN.* (WHEN MORE\r
+                ;THAN ONE FN.EX IS IMPLIED).\r
+MATEX==2        ;FILE EXTENSIONS MUST MATCH\r
+MATFN==4        ;FILE NAMES MUST MATCH\r
+NEWDEV==10      ;A NEW INPUT DEVICE WAS GIVEN\r
+NEWPP==20       ;A NEW #P-P WAS GIVEN\r
+ASTFLG==40      ;FLAG SET WHEN FILE NAMED IN CS FOUND\r
+                ;BY LOOK ROUTINE EVEN IF FN OR EXT =*\r
+DEV==100        ;DEVICE NAME INDICATOR\r
+\r
+\r
+;DEVICE CHANNEL ASSIGNMENTS\r
+\r
+IFN CCLSW,<\r
+COM==0          ;STORED COMMAND INPUT CHANNEL>\r
+CON==1          ;COMMAND INPUT CHANNEL\r
+OUT==2          ;OUTPUT DEVICE\r
+IN==3           ;INPUT DEVICE\r
+TAPE==4         ;MTA POSITIONING\r
+DIR==5          ;DISK DIR. READ\r
+BLKIN==6        ;INPUT FOR 10/30 DISK FILES\r
+DTDIR==7        ; DECTAPE DIR. READ(FOR PPN)\r
+\r
+;ACCUMULATOR ASSIGNMENTS\r
+\r
+T1=1            ;GENERAL PURPOSE\r
+T2=2            ;G.P.\r
+T3=3            ;G.P.\r
+CHR=4           ;INPUT CHARACTER\r
+P=5             ;PUSHDOWN POINTER\r
+FLAG=6          ;FLAG REGISTER\r
+T4=7            ;G.P.\r
+IOS=10          ;IO STATUS BITS\r
+T5=11           ;G.P.\r
+T6=12           ; G.P.\r
+AUXFLG=13       ;AUXILIARY FLAG REGISTER\r
+T7=14           ;G.P.\r
+DOUT=15         ;DIVIDED NO. FOR OUTPUT\r
+DOUT1=16        ;REMAINDER, DOUT+1\r
+\f\r
+;MISCELLANEOUS PARAMETERS\r
+\r
+WRTLOK==400000  ;WRITE LOCK (DECTAPE) /IMPROPER I/O\r
+BIGBLK==40000   ;BLOCK TOO LARGE\r
+INBIT==2        ;DEVCHR BIT FOR DEV CAN DO INPUT\r
+OUTBIT==1       ;DEVCHR BIT FOR DEV CAN DO OUTPUT\r
+EOFBIT==20000   ;END OF FILE\r
+EOTBIT==2000    ;END OF TAPE\r
+BOTBIT==4000   ;BEGINNING OF TAPE\r
+DTABIT==4       ;DEVCHR BIT FOR DECTAPE IDENTIFICATION\r
+INHIB==1        ;OUTPUT RELEASE INHIBIT BIT\r
+TABSP==10       ;SPACES PER TAB\r
+PTRBIT==200     ;DEVCHR BIT FOR PTR\r
+PTPBIT==400     ;DEVCHR BIT FOR PTP\r
+DSKBIT==200000  ;DEVCHR BIT FOR DSK\r
+MTABIT==20      ;DEVCHR BIT FOR MTA\r
+LPTBIT==40000   ;DEVCHR BIT FOR LPT\r
+TTYBIT==10      ;DEVCHR BIT FOR TTY\r
+CDRBIT==100000  ;DEVCHR FOR CDR\r
+DENS2==200      ;MTA 200 BPI\r
+DENS5==400      ;MTA 556 BPI\r
+DENS8==600      ;MTA 800 BPI\r
+PARE==1000      ;MTA EVEN PARITY\r
+LDP==4000       ;MTA LOAD POINT STATUS\r
+HPAGE==20\r
+\r
+;MACRO DEFINITIONS\r
+\r
+;DEFINE SKIP (J)<JRST    .+1+'J>\r
+\r
+DEFINE  LSTLIN (Z),<\r
+        SKIPA   T1,[POINT 7,Z]\r
+        PUSHJ   P,PUT\r
+        ILDB    CHR,T1\r
+IFN WCH,<PUSHJ  P,CCASE>\r
+        JUMPN   CHR,.-2>\r
+\r
+DEFINE  ERRPNT  (X),<\r
+        JSP     T1,PTEXT\r
+        ASCIZ   X>\r
+\r
+DEFINE  ERRPN2  (X),<\r
+        JSP     T1,PTEXT2\r
+        ASCIZ   X>\r
+\r
+;DEFINE  ERRPNX  (X),<\r
+;        JSP     T1,PRETXT\r
+;        ASCIZ   X>\r
+\r
+DEFINE  PURE <\r
+IFN REENT,      <RELOC>>\r
+\r
+DEFINE  IMPURE <\r
+IFN REENT,     <LOC>>\r
+        IMPURE\r
+LOW:\r
+        PURE\r
+\f\r
+;ASCII CHARACTERS\r
+\r
+CR==15          ;CARRIAGE RETURN\r
+LF==12          ;LINE FEED\r
+FF==14          ;FORM-FEED\r
+ALTMOD==33      ;NEWEST ALTMODE\r
+ALT175==175     ;OLDEST ALTMODE\r
+ALT176==176     ;OLDER ALTMODE\r
+LA==137         ;LEFT ARROW\r
+CZ==32          ;CONTROL Z\r
+XON==21         ;^Q,START TTY PTR\r
+XOFF==23        ;^S,STOP TTY PTR MODE\r
+COMMA==54\r
+PERIOD==56      ;PERIOD\r
+COLON==72\r
+SPACE==40\r
+DEL==177        ;DELETE,RUBOUT,REPEAT MOD.35\r
+TAB==11         ;TAB\r
+\r
+\r
+;CALLI DEFINITIONS\r
+\r
+OPDEF   RESET   [CALLI   0]\r
+OPDEF   DEVCHR  [CALLI   4]\r
+OPDEF   CORE    [CALLI  11]\r
+OPDEF   EXIT    [CALLI  12]\r
+OPDEF   UTPCLR  [CALLI  13]\r
+OPDEF   DATE    [CALLI  14]\r
+OPDEF   MSTIME  [CALLI  23]\r
+OPDEF   GETPPN  [CALLI  24]\r
+OPDEF   PJOB    [CALLI  30]\r
+OPDEF   RUN     [CALLI  35]\r
+OPDEF   GETTAB  [CALLI  41]\r
+OPDEF   TMPCOR  [CALLI  44]\r
+OPDEF   DSKCHR  [CALLI  45]\r
+OPDEF   JOBSTR  [CALLI  47]\r
+OPDEF   DEVPPN  [CALLI  55]\r
+OPDEF   WAIT    [MTAPE   0]\r
+\r
+;EXTENDED LOOKUP PARAMETERS\r
+\r
+RBSIZ==5                ;WRITTEN FILE LENGTH\r
+RIBSTS==17              ;STATUS BITS\r
+\r
+\f\r
+\r
+PIP1:  IFN CCLSW,<\r
+       TDZA FLAG,FLAG          ;NORMAL ENTRY TO ACCEPT COMMANDS FROM TTY\r
+       SETO FLAG,               ;CCL ENTRY TO READ COMMANDS FROM DISK FILE\r
+       SETZM COMFLG>\r
+IFE REENT,<\r
+IFE FTDSK,<HLRZ T1,JOBSA        ;NO DSK SO USE JOBFF>\r
+IFN FTDSK,<MOVEI T1,DSKDR       ;ASSUME NO DISK FOR TEST, LOC OF DSK RTNS\r
+        MOVSI   0,(SIXBIT /DSK/)\r
+        DEVCHR                  ;DEVCHR REQUEST:       IS THERE A DSK \r
+        JUMPE   0,P1            ;0 IF NO DISK: USE DSKDR\r
+        MOVE    T1,JOBFF        ;DISK: PREPARE TO SAVE C(JOBFF)\r
+        HRRZ    T2,JOBREL       ;HIGHEST REL LOC AVAILABLE TO USER\r
+        CAIL    T2,6000         ;CURRENT SIZE 4K\r
+        JRST    P1              ;YES\r
+        MOVEI   T2,7777         ;NO. EXPAND TO 4K\r
+        HRRZM   T1,SVJBFF       ;SAVE JOBFF SO BUFFERS CAN BE CREATED\r
+        CORE    T2,             ;CORE UUO\r
+        JRST    DERR7           ;CORE UNAVAILABLE>\r
+       >\r
+IFN REENT,<\r
+       MOVEI   T1,LOWTOP\r
+       HRLM    T1,JOBSA        ;GET JOBFF>\r
+P1:            HRRZM   T1,SVJBFF       ;SAVE JOBFF SO BUFFERS CAN BE CREATED\r
+IFE CCLSW,<JRST        PIP>\r
+IFN CCLSW,<JUMPE FLAG,PIP      ;ENTER PIP IF NO COMMAND FILE\r
+       RESET                   ;RESET. MOVES JOBSA (LH) TO C (JOBFF)\r
+\f\r
+;THIS IS MODIFICATION FOR USING TMPCOR WITH CCL\r
+IFN TEMP,<MOVE T1,[XWD 2,TMPFIL];SET BLOCK POINTER FOR TMPCOR UUO\r
+                               ;1=READ ONLY, LOC OF FILENAME\r
+       MOVSI   T2,(SIXBIT /PIP/)\r
+       MOVEM   T2,TMPFIL\r
+       MOVSI   T2,-200\r
+       HRR     T2,SVJBFF       ;CALCULATE TMPFIL ADDRESS FOR BUFFER\r
+       MOVEM   T2,TMPFIL+1     ;STORE IN TMPFIL+1\r
+       SOS     TMPFIL+1        ;MAKE IT AN IOWD\r
+       TMPCOR  T1,             ;READ AND DELETE PIP FILE\r
+                               ;T1 ON RETURN=NOWDS IN CS\r
+       JRST    P11             ;NO PIP FILE IN CORE TRY DSK\r
+       HRLI    T2,440700       ;SET UP BYTE POINTR FOR COMMANDS\r
+       MOVEM   T2,TMPPNT       ;USE LATER IN GETSC\r
+       SETOM   TMPFLG          ;SIGNAL THAT TMPCOR WAS USED\r
+       ADDB    T1,SVJBFF       ;CALCULATE END OF TMPCOR BUFFER\r
+       MOVEM   T1,TMPEND       ;STORE FOR LATER USE\r
+       SETOM   COMFLG          ;MARK THAT CCL IS IN ACTION\r
+       JRST    PIP2A           ;START PIP\r
+P11:   >\r
+       PJOB    T1,             ;GET JOB NBR.\r
+       MOVEI   0,3             ;SET TO GENER. 3 DIGIT JOB NO\r
+       IDIVI   T1,^D10         ;DIVIDE BY 10\r
+       ADDI    T2,"0"-40       ;REMAINDER MAKE SIXBIT\r
+       LSHC    T2,-6           ;SHIFT T2 RIGHT INTO T3\r
+       SOJG    0,.-3           ;DECREMENT AND LOOP\r
+       HRRI    T3,(SIXBIT /PIP/)\r
+       MOVEM   T3,CFILE        ;INSERT JOB NBR IN CCL INIT\r
+       MOVSI   T3,(SIXBIT /TMP/)\r
+       MOVEM   T3,CFILE+1      ;DEFAULT DEVICE\r
+       SETZM   0,CFILE+2\r
+       SETZM   0,CFILE+3\r
+       INIT    COM,            ;INIT DEVICE FOR CCL OR @\r
+       SIXBIT  /DSK/\r
+       XWD     CFI\r
+       JRST    CER1            ;CAN'T INIT\r
+       LOOKUP  COM,CFILE       ;LOOKUP COMMAND FILE\r
+       JRST    PIP2A           ;NOT FOUND,ERROR\r
+       INBUF   COM,1           ;1 BUFFER ONLY\r
+       MOVE    0,JOBFF         ;SAVE JOBFF NOW\r
+       HRRZM   0,SVJBFF        ;TO LEAVE COMMANDS INTACT WHEN BUFFERS RECREATED\r
+       SETOM   COMFLG          ;SUCCESS: COMMAND FILE REQUESTED\r
+       JRST    PIP2A\r
+\f\r
+CER1:  ERRPNT  </?FILE />\r
+       PUSHJ   P,P6BIT\r
+               CFILE\r
+       ERRPN2  </.TMP INIT FAILURE!/>\r
+\r
+PIP2:  SKIPE   COMFLG  ;LAST COMMAND CCL?\r
+       EXIT\r
+       JRST    PIP2A   ;JUST INCASE MONITOR RETURNS>\r
+\r
+IFE REENT,<IFN FTDSK,<\r
+DERR7: ERRPNT  </?4K needed/>\r
+        EXIT                    ;EXIT TO MONITOR>>\r
+\f\r
+PIP:   RESET           ;REINITIALIZE WHEN RESTARTED MANUALLY\r
+                       ;NEW COMMAND STRING SCAN STARTS HERE\r
+IFE CCLSW,<PIP2:       >\r
+PIP2A: JSP T5,INICN1   ;INITIALIZE THE TTY AND PDL\r
+IFN CCLSW,<SKIPE COMFLG        ;ACCEPT NEW PIP COMMAND?\r
+       JRST PIP2B      ;NOT PIP (TTY) COMMD, BUT CCL>\r
+       MOVEI 0,CR      ;TYPE CR\r
+       IDPB 0,TFO+1\r
+       MOVEI 0,LF      ;AND LF\r
+       IDPB     0,TFO+1\r
+       MOVEI    0,"*"  ;TYPE ASTERISK******\r
+       IDPB 0,TFO+1    ;READY TO ACCEPT\r
+       OUTPUT CON,     ;COMMAND FROM TTY\r
+PIP2B: SETZM TOTBRK    ;CLEAR PAREN COUNTER\r
+       MOVEI 0,TABSP   ;SPACES PER TAB\r
+       MOVEM 0,TABCT   ;INITIALIZE TAB COUNT\r
+       MOVE 0,ZRO      ;ASCII /00000/\r
+       MOVEM 0,SQNUM   ;INITIALIZE SEQUENCE NUMBERS\r
+       RELEASE CON,    ;RELEASE TTY FOR USE AS IN-OUT DEVICE\r
+\r
+MAINA1:        SETZB FLAG,FILNAM   ;INITIALIZE FOR FIRST/NEXT COMMAND STRING\r
+       SETZB AUXFLG,DEVICE\r
+IFN FTDSK,<HRRZI 0,(SIXBIT /SYS/) ;SYSTEM DIRECT DEV, DSK/DTA\r
+       HRLZM 0,ADSK            ;PUT IN SYSTEM DEVICE>\r
+       MOVE 0,[XWD FILNAM,FILNAM+1]    ;SET PROJECT, PROG NO.\r
+       BLT 0,AB        ;ZERO OUT FILNAM - AB\r
+       MOVE T3,COMPTR  ;BYTE POINTER FOR STORING CS IN BUFFER\r
+\r
+;ACCUMULATE CS CHARS IN COMBUF ALLOW LONG CS ONLY FOR TTY COMMAND\r
+\r
+COMSTO:        PUSHJ   P,GETTA         ;GET CS CHARS\r
+       AOS     T4,COMCNT       ;COUNT CHARS\r
+       CAILE   T4,^D200        ;ALLOW UP TO 200 CHARS\r
+       JRST    ERR6B           ;MORE THAN 200 CHARS\r
+COMASK:        IDPB    0,T3            ;STORE IN COMBUF\r
+       SKIPE   COMEOF          ;END-OF-FILE SET?\r
+       JRST    COMPRP          ;YES, PROCESS CS IN COMBUF\r
+       CAIG    0,CR            ;NOT EOF\r
+       CAIGE   0,LF            ;LF,VT,FF,CR?\r
+       CAIN    0,ALTMODE       ;NO, $?\r
+       JRST    COMPRO          ;YES\r
+       JRST    COMSTO          ;NO, KEEP STORING\r
+\r
+COMPTR:        POINT   7,COMBUF-1,35\r
+\f\r
+;********************************************************************^\r
+;BEGIN SCAN OF DESTINATION PORTION OF COMMAND STRING\r
+COMPRO:\r
+IFN FTDSK,<PUSHJ P,GETEND>\r
+       JRST    COMASK\r
+COMPRP:        \r
+IFN FTDSK,<\r
+       MOVSI 0,(SIXBIT /DSK/)  ;IS THERE A DSK?\r
+       MOVEM   0,DEVICE        ;TENTATIVELY DSK>\r
+\r
+       RELEASE CON,            ;RELEASE TTY\r
+       MOVE    0,COMPTR        ;INITIALIZE POINTER\r
+       MOVEM   0,COMPTS        ;TO PICK UP CS FROM COMBUF\r
+       PUSHJ   P,NAME  ;GO SCAN DESTINATION PORTION OF COMMAND STRING\r
+       SKIPE   XNAME   ;NO SCAN OVERSHOOT ALLOWED\r
+       JRST    ERR6\r
+       TRNN    FLAG,ZFLG+XFLG+DFLG\r
+       JRST    MAINC\r
+       SKIPN   CALFLG\r
+       JRST    ERR6A\r
+\r
+MAINC: SKIPN T5,NSWTCH \r
+       SKIPN 0,SSWTCH\r
+       JRST ERR6A\r
+       MOVE 0,DEVICE   ;GET OUTPUT DEVICE NAME\r
+       MOVEM 0,ODEV    ;SAVE DEVICE NAME FOR LATER USAGE\r
+       PUSHJ P,DEVTST  ;SAVE DEVICE TYPE, SET XXX0UT.E.G DTAOUT\r
+       PUSHJ P,ABCHK   ;CHECK MTA BACKSPACE/ADV VALUES\r
+       PUSHJ P,PROTK   ;CHECK PROTECTION\r
+       MOVE 0,AB       ;MTA VALUE SWITCHES\r
+       MOVEM 0,ABOUT   ;GET MTA CONTROL NUMBERS FOR OUT\r
+       MOVE 0,AUX\r
+       MOVEM 0,AUXOUT\r
+       MOVE 0,[XWD FILNAM,DTON]\r
+       BLT 0,DTON+1    ;SAVE DESTINATION FILE NAME\r
+       SETZM DTON+3\r
+IFN FTDSK,<TRNN AUXFLG,DSKOUT  ;DISK OUTPUT?>\r
+       JRST M3\r
+       MOVE 0,[XWD PR,DTON+2]\r
+       BLT 0,DTON+3\r
+M3:    SETZM SSWTCH    ;TERMINATE DESTINATION FILE SCAN\r
+       MOVSI 0,(SIXBIT /DSK/)  ;DEFAULT CASE DSK\r
+       MOVEM 0,DEVICE  ;MUST NOT LET O/DEV. CARRY OVER AS I/DEV.\r
+M3A:   PUSHJ P,DESCRP  ;GET A UNIT DESCRIPTOR (INPUT).\r
+       TLNN AUXFLG,QFLG        ;Q?     ;SCAN INPUT PORTION OF COMMAND STRING\r
+       JRST M2         ;NO\r
+       HRRZI 0,(SIXBIT /SYS/)  ;YES MAKE INPUT DEVICE SYS\r
+       HRLZM 0,DEVICE\r
+       HRLZM DEVA              ;SAVE COPY OF INPUT DEVICE\r
+       MOVE 0,QPIP             ;MAKE INPUT FILENAME QPIP\r
+       MOVEM 0,FILNAM\r
+       MOVE 0,STAR             ;DONT RESTRICT QPIP\r
+       MOVEM 0,FILEX   ;EXT TO BEING NULL\r
+       MOVE 0,[XWD 1,1];GET SYS PP\r
+       MOVEM 0,PP      ;AND SET IT\r
+       SOS ESWTCH      ;NO MORE COMMAND STRING\r
+       TRZ AUXFLG,DTAIN+DSKIN+CDRIN+PPTIN+TTYIN+MTAIN\r
+       PUSHJ P,CHECK1  ;CHECK INPUT DEVICE\r
+\r
+M2:    TLO AUXFLG,NOMORE       ;NO MORE SWITCHES BUT MTA ALLOWED\r
+       TLNE FLAG,OFLG  ;BLOCK 0 COPY\r
+       JRST BLOCK0     ;YES\r
+       TRC FLAG,XFLG+RFLG;(RX)\r
+       TRCN FLAG,XFLG+RFLG\r
+       JRST ERR6\r
+       MOVEI T4,1\r
+       PUSHJ P,M5      ;YES,(RX)\r
+IFN RIMSW,<\r
+       TLNN FLAG,RIMFLG        ;RIM OUTPUT?\r
+       JRST M1         ;NO\r
+IFE WCH,<\r
+       TRNE AUXFLG,PPTOUT      ;RIM IS ONLY DTA TO PTP\r
+       TRNN AUXFLG,DTAIN!DSKIN!MTAIN\r
+       JRST ERR5B>\r
+IFN WCH,<JRST RIMTB >>\r
+\r
+       PUSHJ P,M4      ;NOT MTA\r
+       HRRZM T4,OMOD   ;SET MODE OF OUTPUT DEV\r
+M1:    MOVEI T4,1\r
+       PUSHJ P,INLOOK  ;SEE IF INPUT DEV MTA\r
+       PUSHJ P,M4      ;NOT MTA\r
+       HRRZM T4,ININI1 ;SET MODE IF INPUT DEV\r
+       PUSHJ P,FNSET   ;NOW DEVICE, DEVA CORRECT FOR START\r
+       JRST OMOD1      ;INIT OUTPUT DEVICE\r
+\f\r
+;SET MODE IF /I,/B,/H,\r
+\r
+M4:    TLNN FLAG,IFLG  ;IMAGE BINARY MODE?\r
+       JRST .+3        ;NO\r
+       TRO T4,10       ;IM. MODE\r
+       TRZ T4,1        ;CLEAR ASCII LINE MODE\r
+\r
+       TRNN FLAG,BMOD  ;BINARY MODE?\r
+       JRST .+3        ;NO\r
+       TRO T4,14       ;BIN. MODE\r
+       TRZ T4,1        ;CLEAR ASCII LINE MODE\r
+\r
+       TLNE FLAG,IBFLG ;ASCII TO START.  IB MODE?\r
+       TRO T4,13       ;YES\r
+       TRNE FLAG,XFLG  ;COPY MODE?\r
+       POPJ P,         ;YES, DON'T ALTER DATA MODE\r
+\r
+       TRNE FLAG,DFLG+RFLG     ;DELETE OR RENAME\r
+       TRO T4,20       ;DIRECTORY WILL BE WRITTEN, DON'T\r
+       POPJ P,         ;COMPUTE WORD COUNT MODE NEEDED.\r
+                       ;FORCE MONITOR TO USE WORD COUNT\r
+                       ;IN FIRST DATA WORD OF BUFFER\r
+\r
+M5:    TRNN AUXFLG,MTAOUT      ;CLEAR /R FLAG\r
+       POPJ P,                 ;RETURN\r
+\f;IF OUTPUT DEVICE IS MTA PERFORM ALL PRE-TRANSFER REQUESTS\r
+;SUCH AS REWIND.  IF OUTPUT DEVICE IS MTA, AND THERE IS NO \r
+;INPUT DEVICE, EXIT.  FOR OTHER MTA OUTPUT, PREPARE INIT\r
+;DENSITY AND PARITY.\r
+\r
+OUTLOOK:\r
+       MOVE T3,ABOUT   ;AB FOR OUTPUT DEV\r
+       MOVE T1,AUXOUT  ;AUX FOR OUTPUT DEV\r
+       MOVEI T6,INOMTA ;SET TO INIT\r
+       JRST MT1        ;MTA FOR OUTPUT\r
+\r
+\r
+\r
+\r
+;SAME FOR INPUT DEVICE.\r
+\r
+INLOOK:        TRNN AUXFLG,MTAIN\r
+       POPJ P,\r
+INLUK1:        MOVE T3,AB      ;ADV OR BKSPACE\r
+       MOVE T1,AUX     ;AUX FOR INPUT DEV\r
+       MOVEI T6,INIMTA ;SET TO INIT\r
+       JRST MT1        ;MTA FOR INPUT\r
+\f;ROUTINE TO INITIALIZE OUTPUT DEVICE\r
+\r
+OMODE: MOVE T1,[XWD OBF,IBF]\r
+       MOVEM T1,ODEV+1\r
+       MOVE T1,DTJBFF  ;JOBFF AFTER 2 TTY BUFS\r
+       MOVEM T1,JOBFF  ;SET UP\r
+\r
+       OPEN OUT,OMOD   ;INITIALIZE OUTPUT DEVICE\r
+       JRST ERR1       ;UNAVAILABLE ERROR\r
+       OUTBUF OUT,1    ;TRY ONE OUTBUFFER FOR SIZE\r
+       EXCH T1,JOBFF   ;JOBFF_DTJBFF+BUFSZ\r
+                       ;NOTE JOBFF RESET TO DTJBFF\r
+       SUB T1,DTJBFF   ;T1=BUFSZ\r
+       HRRZ 0,JOBREL   ;HIGHEST CORE AVAILABLE \r
+       SUB 0,DTJBFF    ;0=TOTAL CORE AVAILABLE\r
+       ASH 0,-1        ;COMPUTE HOW MANY OUTPUT BUFFERS\r
+       IDIVM 0,T1      ;FIT IN HALF THE AVAILABLE SPACE\r
+       CAIG T1,1       ;1 OR MORE THAN 1 FIT?\r
+       MOVEI T1,2      ;YES USE 2.\r
+       OUTBUF OUT,(T1) ;SET UP OUTPUT BUFFERS\r
+       MOVE 0,OBF+1\r
+       MOVEM 0,SVOBF   ;SAVE ORIGINAL MODE SETTING\r
+       MOVE 0,JOBFF\r
+       HRRZM 0,SVJBF1  ;PREPARE TO RECLAIM INBUFFER SPACE\r
+       POPJ P,\r
+\r
+OMOD1: PUSHJ P,OMODE   ;GO INITIALIZE OUTPUT DEVICE\r
+       TRZN FLAG,ZFLG  ;Z COMMAND TYPES?\r
+       JRST MAINA2     ;NO,\r
+       PUSHJ P,DTCLR   ;YES, GO CLEAR DIRECTORY\r
+       RELEASE OUT,\r
+       RELEASE DIR,\r
+       SKIPN 0,NSWTCH  ;SEE IF DEVICE WAS TYPED\r
+       JRST OMOD1      ;YES\r
+       JRST PIP2       ;GET NEXT COMMAND\r
+\f;MAIN LOOP TO PROCESS INPUT SIDE OF CS\r
+\r
+\r
+\r
+MAINA2:        TRNE    FLAG,RFLG+DFLG  ;RENAME OR DELETE FILE MODE?\r
+       JRST    DTDELE          ;YES./D,/X,OR(DX)\r
+IFN RIMSW,<\r
+       TLNE    FLAG,RIMFLG     ;RIM?\r
+       JRST    RIMTB           ;YES./Y\r
+       >\r
+       TRNE    FLAG,XFLG               ;TRANSFER EVERYTHING MODE?\r
+       JRST    PRECOP          ;YES./Y\r
+;LOOP TO COPY ALL FILES BEGINS HERE FROM MAIN2\r
+MAINA3:        TRNN    AUXFLG,FFLG     ;LIST DSK DIR SHORT?\r
+       TRNE    FLAG,LFLG       ;LIST DIRECTORY?\r
+       JRST    DTPDIR          ;YES./F OR /L\r
+       PUSHJ   P,ININIT        ;INITIALIZE INPUT FILE\r
+       TRNE    AUXFLG,DTAIN    ;DEC TAEP INPUT?\r
+       PUSHJ   P,DTADIR        ;INIT DTA DIR\r
+\r
+IFN FTDSK,<TRNN  AUXFLG,DSKIN  ;NO, DISK INPUT?\r
+       JRST    MAINA4          ;NO\r
+       PUSHJ   P,DSKDIR        ;OK, DSK>       \r
+MAINA4:        PUSHJ   P,LOOK          ;GET A FILE TO COPY\r
+       JRST    MAINA5          ;NO MORE\r
+       LOOKUP  IN,ZRF\r
+       JRST    ERR3            ;LOOKUP FAILURE\r
+IFN WCH,<\r
+MAINA6:        TRNN    AUXFLG,DTAIN+DTAOUT\r
+        JRST   .+5\r
+        HLRZ   0,ZRF+1\r
+        CAIE   0,(SIXBIT /DMP/)\r
+        IFN DISK30,<CAIN 0,(SIXBIT/SVE/)>\r
+        IFE DISK30,<CAIN 0,(SIXBIT/SAV/)>\r
+        JRST  MAINA4            ;DONT COPY DMP OR SAV FILES ON DTA>\r
+       TLO   FLAG,NEWFIL\r
+       PUSHJ P,FILTYP\r
+       TRNE  AUXFLG,ONEOUT\r
+       JRST  PSCANA            ;OUT HAS BEEN INITIALIZED\r
+IFE WCH,<\r
+       PUSHJ P,OKBLKS>\r
+       ENTER OUT,DTON          ;CREATE OUTPUT FILE\r
+       JRST  ERR4              ;DIR. FULL OR 0 FILE NAME\r
+       JRST  PSCANA\r
+\r
+MAINA5:        TRZN  AUXFLG,REDFLG\r
+       JRST  ERR3AA            ;NEVER READ A FILE\r
+       JRST  MAIN1\r
+\fPSCANA:       TRO     AUXFLG,REDFLG   ;SET FLAG FOR INPUT FILE READ\r
+       PUSHJ P,INP             ;GOT READ INPUT FILE\r
+       TRZ     AUXFLG,READ1\r
+       PUSHJ P,TTYZ            ;CHECK IF INPUT IS TTY\r
+       TRNE IOS,EOFBIT         ;EOF FIRST DATA?\r
+       JRST PSCANB\r
+       SKIPN IBF+2\r
+       JRST PSCANA\r
+       JRST PSCAN\r
+\r
+PSCANB:        TRNE AUXFLG,MTAIN!CDRIN!TTYIN!PPTIN     ;ON NON-DIR DEVICE?\r
+       SETZM   ALLCLF\r
+       TRON AUXFLG,ONEOUT      ;HAS OUT JUST BEEN INIT?\r
+       OUTPUT OUT,     ;YES, AND FIRST FILE IS EOF ONLY, INIT OUT IN\r
+                       ;CASE NO MORE SOURCE FILES\r
+       JRST PSCAN5     ;EMPTY FILE, CLOSE INPUT, RETURN FOR MORE\r
+\r
+PSCAN: TRO AUXFLG,ONEOUT       ;INDICATE ONE OUTPUT FILE INITED\r
+       MOVE 0,OPTRA    ;PRESCAN A LINE, INITIALIZE LINE BUFFER PTR\r
+       MOVEM 0,OPTR\r
+       SETZM CDRCNT\r
+       PUSHJ P,CLRBUF  ;CLEAR LINE BUFFER\r
+       TROA FLAG,STS   ;START A FRESH LINE\r
+PSCAN3:        PUSHJ P,PUT     ;HERE FOR BINARY DATA\r
+\r
+PSCAN2:        PUSHJ P,GET     ;GET CHARACTER\r
+       JRST PSCAN6     ;END OF FILE RETURN\r
+       TDNN FLAG,[XWD IFLG+IBFLG,BMOD] ;BIN. OR NO CHAR. PROCESSING\r
+       TLNE AUXFLG,SYSLST\r
+       JRST PSCAN3     ;YES\r
+       MOVE T1,OPTR\r
+       CAIN CHR,DEL    ;VJC 4/16/69\r
+       JRST PSCAN4     ; STR# 10-2615\r
+       CAMN T1,OPTMAX  ;CHECK LENGTH OF LINE\r
+       JRST E10A       ;LINE TOO LONG\r
+       IDPB CHR,OPTR   ;DEPOSIT CHAR. IN LINE BUFFER\r
+       CAIG CHR,24\r
+       CAIGE CHR,20    ;LINE PRINTERR CONTROL CHAR\r
+       SKIPA           ;NO\r
+       JRST PSCAN4     ;YES, TREAT AS END OF LINE\r
+       CAIG CHR,14\r
+       CAIGE CHR,12    ;END OF LINE CHARACTER?\r
+       JRST PSCAN2     ;NO, SO CONTINUE\r
+PSCAN4:        PUSHJ P,OUTLBF  ;YES, SO DUMP THE LINE BUFFER\r
+       JRST PSCAN      ;SCAN THE NEXT LINE\r
+\r
+PSCAN6:        PUSHJ P,OUTLBF  ;DUMP THE REMAINING BUFFER\r
+       TRNE FLAG,XFLG  ;COPY MODE?\r
+       JRST COPY2A     ;YES, GO COPY THE NEXT FILE\r
+PSCAN5:        CLOSE IN,\r
+       JRST MAINA4\r
+\f;COME HERE AFTER /L,/D,/R ON DISK OR THROUGH COPYING\r
+\r
+MAIN1: RELEAS DIR,     ;RELEASE THE DIRECTORY DEVICE\r
+       RELEAS IN,INHIB ;RELEASE THE INPUT DEVICE\r
+       SKIPL T4,ESWTCH ;MORE COMMAND STRING TO PROCESS?\r
+       JRST MAIN2      ;YES\r
+\r
+; COME HERE AFTER /D,/R ON DTA. ALSO FROM ABOVE\r
+\r
+MAINB: CLOSE OUT,      ;CLOSE THE OUTPUT FILE\r
+IFN FTDSK,<TLNN AUXFLG,NSPROT\r
+       JRST MAINB1\r
+       TRNN AUXFLG,DSKOUT ;DISK OUT/ OR DTA\r
+       JRST MAINB1     ;NO\r
+       PUSHJ P,OUTP1\r
+       LDB 0,PRPTL\r
+       DPB 0,PRPTD\r
+       RENAME OUT,DTON ;SET UP RENAME REQUEST\r
+       JRST DERR6      ;DISK ERROR\r
+MAINB1:>\r
+       PUSHJ P,OUTP1\r
+       RELEAS OUT,     ;RELEASE THE OUTPUT DEVICE\r
+       JRST PIP2       ;PROCESS THE NEXT COMMAND\r
+\r
+MAIN2: PUSHJ P,DESCRP  ;GET THE NEXT INPUT FILE TO PROCESS\r
+       PUSHJ P,INLOOK\r
+       PUSHJ P,M4\r
+       HRRZM T4,ININI1\r
+       JRST MAINA3\r
+;END OF LOOP BEGINNING AT MAINA3\r
+\f;SUBROUTINE TO INITIALIZE THE INPUT FILE\r
+\r
+ININIT:        MOVE T1,SVJBF1  ;SVJBF1=END OF OUTPUT BUFFERS\r
+       MOVEM T1,JOBFF  ;COMPARE OMODE CODE\r
+       MOVEI 0,IBF\r
+       MOVEM 0,DEVICE+1\r
+       OPEN IN,ININI1\r
+       JRST ERR1A      ;NOT AVAILABLE ERROR\r
+       INBUF IN,1      ;TRY ONE INPUT BUFFER FOR SIZE\r
+       EXCH T1,JOBFF   ;HOW MANY INBUFFERS WILL FIT?\r
+       SUB T1,SVJBF1\r
+       HRRZ 0,JOBREL\r
+       SUB 0,JOBFF     ;JOBREL-SVJBF1=TOTAL SPACE LEFT\r
+       IDIVM 0,T1\r
+       CAIG T1,1       ;1 OR MORE THAN 1 FITS\r
+       MOVEI T1,3      ;TRY 3.\r
+       INBUF IN,(T1)   ;SET UP AS MANY BUFFS AS FIT\r
+       MOVE 0,IBF+1    ;SAVE ORIGINAL MODE\r
+       MOVEM 0,SVIBF\r
+CPOPJ: POPJ P,\r
+\f;THIS ROUTINE GETS AN INPUT UNIT DESCRIPTOR AND, FOR\r
+;ADVANCE FILE AND BSPF ON MTA, ENSURES THE VALUE 1 IF NO\r
+;NUMBER WAS GIVEN.\r
+\r
+DESCRP:        SETZM AUX       ;WILL GET ANY MTA REQ. GOING TO AUXFLG.\r
+       MOVE 0,SYSFLG\r
+       HLRZM 0,SYSFLG\r
+       SETZM AB        ;MTA VALUE SWITCHES\r
+       SETZM PR        ;PROTECTIONS\r
+       SETZM PP        ;PROJ-PROG NUMBER\r
+;********************************************************************\r
+       PUSHJ P,NAME    ;GO SCAN INPUT SIDE OF COMMAND STRING\r
+       MOVE T1,PR      ;PROTECTION\r
+       HLLZM T1,PR     ;IGNORE PR FLAG IN RHS FOR INPUT\r
+       TRZ AUXFLG,DTAIN+DSKIN+PPTIN+MTAIN+CDRIN+TTYIN\r
+       PUSHJ P,CHECK1  ;CHECK UNIT, AND FOR _\r
+\r
+IFN FTDSK,<MOVE 0,DEVICE\r
+       TRNN AUXFLG,DSKIN       ;DSK INPUT?\r
+       JRST DESCR1     ;NO\r
+       PUSHJ P,PSYSP           ;IS THIS DEVICE SYS?\r
+       MOVE 0,SYSFLG\r
+       TLNE 0,1\r
+       JRST DESCR1\r
+       TRNN 0,1\r
+       JRST DESCR1\r
+       MOVE T2,FNPPNS  ;MAKE OLD [P,P] CURRENT [P,P]\r
+       SKIPE 0,PP\r
+       JRST DESCR1\r
+       MOVEM T2,PP     ;RESERVE [P,P]\r
+       MOVEM T2,FNPPN  ;NO OVERSHOOT ALLOWED>\r
+DESCR1:        SKIPE XNAME\r
+       JRST ERR6\r
+\r
+ABCHK: HLRZ 2,AB       ;NO RECS/FILES TO BACKSPACE\r
+       SKIPN T2        ;IF 0\r
+       MOVEI T2,1      ;GUARANTEE ONE\r
+       HRLM T2,AB      ;SET AB LH\r
+\r
+       HRRZ T2,AB      ;NO RECS/FILES TO ADV\r
+       SKIPN T2        ;IF 0\r
+       AOS AB          ;GARANTEE 1\r
+       PUSHJ P,FNSET   ;FIND OUT DETAILS OF FILENAME\r
+       POPJ P,\r
+\f\r
+;IF A NON-STANDARD OUTPUT PROTECTION IS REQUESTED, SAVE FOR RENAME.\r
+\r
+PROTK: MOVE T1,PR\r
+       TRNN T1,1\r
+       JRST PROTK1\r
+       HLLZM T1,PROTS\r
+       TLOA AUXFLG,NSPROT\r
+PROTK1:        MOVE T1,DPR\r
+       HLLZM T1,PR\r
+       POPJ P,\r
+\r
+;TEST "DEVICE" TO SEE IF DESTINATION DEVICE IS DTA, DSK, PTP, LPT, TTY, MTA\r
+;IF ANY IS TRUE, SET RELEVANT BIT IN AUXFLG.  "0" CONTAINS\r
+;"DEVICE" ON ENTRY.\r
+\r
+DEVTST:        DEVCHR          ;GET DEVICE CHARACTERISTICS\r
+IFN FTDSK,<TLNN 0,DSKBIT       ;IS OUTPUT DEV DSK?\r
+       JUMPA 0,DEVTSU  ;NO\r
+       TRO AUXFLG,DSKOUT       ;YES, SET BIT\r
+       EXCH 0,DEVICE\r
+       MOVEM 0,ADSK\r
+       EXCH 0,DEVICE\r
+       TLNN 0,1\r
+       JRST ERR6\r
+       POPJ P,\r
+DEVTSU:>\r
+       JUMPE 0,DEVER2          ;NON-EXISTING DEVICE\r
+       TLNE 0,DTABIT   ;DECTAPE?\r
+       TRO AUXFLG,DTAOUT       ;YES\r
+\r
+       TLNE 0,PTPBIT   ;PAPER TAPE PUNCH?\r
+       TRO AUXFLG,PPTOUT\r
+\r
+       TLNE 0,LPTBIT   ;LINE PRINTER?\r
+       TRO AUXFLG,LPTOUT\r
+\r
+       TLNE 0,TTYBIT   ;TELETYPE?\r
+       TRO AUXFLG,TTYOUT\r
+\r
+       TLNE 0,MTABIT   ;MAGTAPE?\r
+       TRO AUXFLG,MTAOUT\r
+\r
+       TRNN AUXFLG,PPTOUT+TTYOUT+DSKOUT+DTAOUT+MTAOUT+LPTOUT\r
+       JRST ERR6\r
+\r
+       TRNN AUXFLG,DSKOUT\r
+\r
+       POPJ P,\r
+\f\r
+;ROUTINE TO CHECK IF DEVICE SYS AND SET [P,P], IF NONE GIVEN\r
+\r
+IFN FTDSK,<\r
+PSYSP: HRLZI   T1,(SIXBIT /SYS/);IS DEVICE SYS?\r
+       CAME    0,T1\r
+       POPJ    P,              ;NO\r
+       SKIPN   T1,PP           ;PP GIVEN?\r
+       MOVE    T1,[XWD 1,1]    ;GET SYS PP\r
+       MOVEM   T1,PP           ;AND SET IT\r
+       HRLI    0,1\r
+       HLLM    0,SYSFLG        ;SET FLAG TO INIDICATE\r
+       POPJ    P,              ;CURRENT INPUT DEVICE IS SYS>\r
+\r
+DEVER2:        SKIPA T1,ODEV\r
+DEVER: MOVE T1,DEVICE\r
+       MOVEM T1,DEVERR\r
+       ERRPNT </?DEVICE />\r
+       PUSHJ P,P6BIT\r
+               DEVERR\r
+ERRPN2 </ DOES NOT EXIST!/>\r
+;ROUTINE TO INIT PDL POINTER AND TTY\r
+\r
+INICN1:        MOVEI   P,PDL-1         ;INITIALZE PUSHDOWN POINTER\r
+INICN2:        MOVE    0,SVJBFF        ;IS INITIALZED AT PIP1\r
+       MOVEM   0,JOBFF         ;SET JOBFF TO BEGINNING OF BUFFER AREA\r
+       HRRZ    0,JOBSA\r
+       MOVEM   0,JOBREN\r
+       PUSHJ   P,INICON        ;INITIALIZE THE TTY\r
+       INBUF   CON,1           ;ONE INBUFFER\r
+       OUTBUF  CON,1           ;ONE OUTBUFFER\r
+       MOVE    0,JOBFF\r
+       HRRZM   0,DTJBFF        ;JOBFF AFTER 2 TTY BUFFERS SET\r
+       OUTPUT  CON,            ;INITIALIZE BUFFER POINTER\r
+       JRST    (T5)\r
+\r
+;ROUTINE TO CLEAR LINE BUFFER\r
+\r
+CLRBUF:        SETZM   LBUF            ;SUBR. TO CLEAR LINE BUFFER\r
+       MOVE    0,[XWD LBUF, LBUF+1]\r
+       BLT     0,LBUFE\r
+       POPJ    P,\r
+\r
+\f;COMMAND SCANNER ROUTINE\r
+\r
+NAME:  SKIPL   SSWTCH          ;RETURN NULL IF _ OR END-OF-LINE SEEN\r
+       SKIPGE  ESWTCH\r
+       JRST    NM13            ;\r
+       SETZM   NSWTCH\r
+       SKIPE   T1,XNAME        ;IF COMMAND SCAN OVERSHOOT PICKED UP\r
+                               ;DEVICE NAME, USE IT NOW\r
+       JRST    NM7\r
+       SETZM   CALFLG\r
+;LOOK FOR FILE NAME, EXT\r
+NM1:   SETZM   FILEX\r
+NM2:   SETZM   FILNAM\r
+       MOVE    T1,NM15\r
+;LOOP TO PICK OFF FILENAME, EXT\r
+NM3:   PUSHJ   P,GETCOM        ;GO GET 7 BIT ASCII CHAR. FROM COMMAND STRING\r
+       CAIE    0,"*"           ;TO ALLOW FN.EX = *.*\r
+       CAIL    0,"A"           ; ALPHABETIC CHARACTER\r
+       CAILE   0,"Z"\r
+       JRST    NM4A            ;NO\r
+NM4:   SUBI    0,40            ;CONVERT TO SIXBIT\r
+       TLNE    T1,770000       ;6 CHARS. YET?\r
+       IDPB    0,T1            ;NO\r
+       JRST    NM3             ;GET NEXT CHAR.\r
+NM4A:  CAIL    0,"0"           ;NUMERIC?\r
+       CAILE   0,"9"\r
+       SKIPA                   ;NO\r
+       JRST NM4\r
+\f;CHARACTER NO *,0-9,A-Z\r
+NM5:   CAIG    0,CR            ;CARRIAGE RETURN\r
+       CAIGE   0,LF            ;LINE FEED\r
+       CAIN    0,ALTMOD        ;ALTMODE\r
+       JRST    NM5A            ;YES\r
+       CAIE    0,CZ            ;END-OF-FILE(CCL)?\r
+       SKIPA   ESWTCH\r
+NM5A:  SOSA    ESWTCH          ;YES, OR EOF\r
+       CAIN    0,COMMA         ;COMMA\r
+       JRST    NM6             ;YES\r
+       CAIN    0,PERIOD        ;PERIOD\r
+       JRST    NM10            ;YES\r
+       CAIN    0,COLON         ;COLON\r
+       JRST    NM9             ;YES\r
+       CAIE    0,LA            ;LEFT ARROW\r
+       JRST    NM3             ;NO\r
+       SETOM   SSWTCH\r
+\r
+NM6:   SKIPN   T1,FILEX        ;COMMA ROUTINE - FIGURE OUT WHAT WE HAVE\r
+       JRST    NM11            ;NO FILE NAME TEMPORARILY IN FILEX\r
+       EXCH    T1,FILNAM       ;PUT THE FILE NAME WHERE IT BELONGS\r
+       HLLZM   T1,FILEX        ;PUT THE EXTENSION WHERE IT BELONGS\r
+       POPJ    P,\r
+\r
+NM7:   SETZM   XNAME           ;USE XNAME ONLY ONCE\r
+       CAIN    T1,1            ;1 FLAGS A NULL OVERSHOOT\r
+       JRST    NM13            ;RETURN NULL NAME\r
+NM8:   MOVEM   T1,DEVICE       ;NEW DEVICE\r
+       SETOM   CALFLG\r
+       JRST    NM1             ;LOOK FOR A FILE NAME AND EXTENSION\r
+\r
+NM9:   SKIPN   CALFLG          ;COLON ROUTINE - IS DEVICE NAME IN YES?\r
+       JRST    NM12            ;NO\r
+       SKIPN   T1,FILNAM       ;SCAN OVERSHOOT - NULL OVERSHOOT?\r
+       MOVEI   T1,1            ;YES - FLAG NULL OVERSHOOT WITH A 1\r
+       MOVEM   T1,XNAME        ;XNAME = OVERSHOOT NAME\r
+       JRST    NM14\r
+NM10:  MOVE    0,FILNAM        ;PERIOD ROUTINE - SAVE FILE NAME\r
+       MOVEM   0,FILEX         ;TEMPORARY IN FILEX\r
+       JRST    NM2             ;LOOK FOR EXTENSION\r
+NM11:  SKIPN   FILNAM          ;WAS A FILE NAME SPECIFIED?\r
+       SKIPE   CALFLG          ;WAS ANYTHING SPECIFIED?\r
+       POPJ    P,              ;YES\r
+NM12:  SKIPE   T1,FILNAM       ;NULL NAME SPECIFIED?\r
+       JRST    NM8             ;NO - SO REMEMBER AND LOOK FOR FILE NAME\r
+\r
+NM13:  SETOM   NSWTCH          ;RETURN NULL NAME\r
+       SETZM   FILEX\r
+NM14:  SETZM   FILNAM\r
+       POPJ    P,\r
+\r
+NM15:  POINT   6,FILNAM\r
+\f;ROUTINE TO OUTPUT ONE LINE FROM LBUF\r
+\r
+OUTLBF:        TRNE FLAG,LINE\r
+       JRST OUTLBA     ;OUTPUT LINE-BY-LINE\r
+OUTCH1:        MOVE T2,OPTRA   ;OUTPUT CHARACTER-BY-CHARACTER\r
+OUTLB1:        CAMN T2,OPTR    ;ARE ALL CHARACTERS OUT?\r
+       POPJ P,         ;YES\r
+       ILDB CHR,T2     ;NO\r
+       PUSHJ P,PUT     ;GO OUTPUT CHARACTER\r
+       JRST OUTLB1\r
+OUTLBA:        TLNE FLAG,CHKFLG;PAREN COUNTING?\r
+       JRST OUTCHK     ;YES, SO DO IT\r
+       TRNE AUXFLG,TTYOUT+LPTOUT\r
+       JRST OUTCH1     ;IF OUTPUT TO TTY OR LPT DO CHR BY CHR\r
+       MOVEI T1,4      ;CLEAR UNUSED PORTION OF LAST WORD USED IN LBUG\r
+       MOVEI T2,0\r
+       MOVE T3,OPTR\r
+       IDPB T2,T3\r
+       SOJG T1,.-1\r
+       MOVEI T2,5\r
+       HRRZ T1,OPTR    ;COMPUTE NUMBER OF WORDS FILLED\r
+       SUBI T1,LBUF-1\r
+       JUMPE T1,OUTLB3 ;DO NOTHING IF BUFFER EMPTY\r
+       IMULM T1,T2     ;COMPUTE CHARACTER COUNT=5 TIMES WORD CT\r
+;THIS IS WHERE OLD FORTRAN MODE WAS TESTED.\r
+       CAMG T2,OBF+2   ;WILL LINE FIT IN THE OUTBUFFER?\r
+       JRST OUTLB2     ;YES\r
+       PUSHJ P,OUTP    ;NO, SO DUMP BUFFER AND CHECK ERROR BITS\r
+       MOVEI T6,1\r
+       TDNE T6,LBUF    ;SEQUENCED?\r
+       TRNN AUXFLG,DSKOUT+DTAOUT ;YES, ON DTA?\r
+       SKIPA           ;NO\r
+       ADDI T2,40*5    ;LEAVE EDITING ROOM\r
+OUTLB2:        MOVNS 0,T2\r
+       ADDM T2,OBF+2   ;UPDATE OUTBUFFER CHARACTER COUNT\r
+       HRLI T2,LBUF\r
+       HRR T2,OBF+1\r
+       AOS T2\r
+       ADDB T1,OBF+1   ;UPDATE OUTBUFFER BYTE POINTER\r
+       BLT T2,(T1)     ;MOVE DATA TO OUTBUFFER\r
+OUTLB3:        POPJ P,\r
+\f;ROUTINE TO PUT ONE CHAR INTO OUT BUFFER\r
+\r
+PUT:   SOSG OBF+2      ;SUBR. TO OUTPUT ONE CHARACTER IN AC CHR\r
+       PUSHJ P,OUTP    ;IF BUFFER FULL, DUMP AND CHECK ERR BITS\r
+       IDPB CHR,OBF+1  ;PUT CHARACTER IN BUFFER\r
+       POPJ P,\r
+\r
+;ROUTINE TO DUMP OUT BUFFER WHEN FULL\r
+\r
+OUTP:  OUTPUT OUT,     ;SUBR. TO DUMP OUTBUFFER AND CHECK ERR BITS\r
+OUTP1: GETSTS OUT,IOS  ;HERE FOR BIT CHECKING ONLY\r
+       PUSHJ P,OUTP4\r
+       SETSTS OUT,(IOS);ERRORS WERE DETECTED\r
+       POPJ P,         ;NO ERRORS\r
+\r
+OUTP4: TRNN AUXFLG,MTAOUT\r
+       JRST .+3\r
+OUTP3: TRNE IOS,EOTBIT ;EOT?\r
+       JRST .+3        ; YES\r
+       TRNN IOS,WRTLOK+DSKBIT+CDRBIT+BIGBLK    ;ANY ERROR BITS ON?\r
+       JRST CPOPJ1     ;NO\r
+       PUSHJ P,COMERR  ;YES\r
+\r
+       JSP T5,INICN2   ;INIT TTY\r
+       PUSHJ P,QUEST\r
+       ERRPN2  </OUTPUT DEVICE />\r
+       PUSHJ   P,P6BIT\r
+               ODEV\r
+       ERRPN2  </: FILE />\r
+       MOVEI T6,DTON   ;OUTPUT FILE NAME LOC\r
+       PUSHJ P,FN.EX   ;PRINT FILE NAME EXT\r
+       MOVE T2,AUXFLG\r
+       ANDI T2,MTAOUT+DSKOUT+DTAOUT\r
+\f\r
+IOERR: MOVEI T1,TXTC   ;PHYSICAL END OF TAPE\r
+       TRNE IOS,EOTBIT\r
+       JRST PTEXT2     ;YES\r
+\r
+       MOVEI T1,TXTD2  ;7-9 PUNCH MISSING\r
+       TRNN T2,CDRIN\r
+\r
+       MOVEI T1,TXTD   ;WRITE LOCK ERROR\r
+       TRNN T2,DSKIN+DSKOUT+DTAIN+DTAOUT+MTAIN+MTAOUT\r
+\r
+       MOVEI T1,TXTD1\r
+       TRNE IOS,WRTLOK\r
+       JRST PTEXT2\r
+\r
+       MOVEI T1,TXTA   ;DEVICE ERROR\r
+       TRNE IOS,200000\r
+       JRST PTEXT2\r
+\r
+       MOVEI T1,TXTB   ;CHECKSUM/PARITY ERROR\r
+       TRNE IOS,100000\r
+       JRST PTEXT2\r
+\r
+       MOVEI T1,TXTC1  ;BLOCK TOO LARGE\r
+       TRNN T2,EOFBIT+BOTBIT\r
+\r
+       MOVEI T1,TXTC2\r
+       JRST PTEXT2\r
+TXTD:  ASCIZ /WRITE (LOCK) ERROR/\r
+       JRST IOERRN     ;NO RECOVERY\r
+\r
+TXTD1: ASCIZ /BINARY DATA INCOMPLETE/\r
+       JRST IOERRG\r
+\r
+TXTD2: ASCIZ /7-9 PUNCH MISSING/\r
+       JRST IOERRG\r
+\r
+TXTA:  ASCIZ /DEVICE ERROR/\r
+       JRST IOERRG\r
+\r
+TXTB:  ASCIZ /CHECKSUM OR PARITY ERROR/\r
+       JRST IOERRG\r
+\r
+TXTC:  ASCIZ /PHYSICAL EOT/\r
+       JRST IOERRG\r
+\r
+TXTC1: ASCIZ /BLOCK TOO LARGE/\r
+       ;FALLS THROUGH TO IOERRN\r
+\f\r
+IOERRN:        RELEAS TAPE,    ;NO RECOVERY ERRORS EXIT HERE\r
+       RELEAS DIR,\r
+       RELEAS OUT,\r
+       RELEAS IN,\r
+IFN DISK30,<\r
+        RELEAS BLKIN,>\r
+       JRST PIP2       ;GET NEXT COMMAND\r
+\r
+TXTC2: ASCIZ /INPUT BUFFER OVERFLOW/\r
+\r
+;TEST IF /G FLAG(IGNORE ERRORS) SET\r
+\r
+IOERRG:        TLNN FLAG,GFLG          ;PRINTED CURRENT MESSAGE\r
+       JRST IOERRN             ;NO RECOVERY\r
+\r
+       JSP     T1,PTEXT2\r
+       ASCIZ   /\r
+/                              ;PRINT CR, LF DON'T MOVE\r
+\r
+       RELEAS CON,\r
+       TRNE AUXFLG,TTYOUT      ;TTY OUTPUT DEVICE?\r
+       PUSHJ P,OMODE           ;YES, INIT OUTPUT DEVICE\r
+       TRNE AUXFLG,TTYIN       ;REINIT TTYIN,TTYOUT\r
+       PUSHJ P,ININIT\r
+       TRZ IOS,WRTLOK+DSKBIT+CDRBIT+BIGBLK     ;CLEAR FILE STATUS, I/O ERRORS\r
+       TRNE T2,600\r
+       TRZ IOS,EOTBIT          ;CLEAR PHYICAL EOT I/O ERROR\r
+       JRST REST\r
+\r
+\fCOMERR:       PUSHJ P,SAVE    ;SAVE ACS T1,T2,T3,T5,T6\r
+       TRNE AUXFLG,TTYOUT\r
+       RELEAS OUT,\r
+       TRNE AUXFLG,TTYIN\r
+       RELEAS IN,\r
+       POPJ P,\r
+;PRINT FILE NAME AND EXTENSION FROM (T3), 1(T3).\r
+\r
+FN.EX: MOVE T3,T6\r
+       MOVE T1,(T6)    ;T1=FILENAME\r
+       HLRZ T6,1(T6)   ;T6=FILE EXT\r
+       CAIN T6,(SIXBIT /UFD/)\r
+       SETZM T1        ;UFD FILES ONLY ARE ASSUMED TO HAVE FILENAME\r
+       MOVEM T1,DERR2  ;OF NUMERIC FORM (#,# P-P NUMBER).\r
+       JUMPE T6,DERR2A ;FILE EXT=0?\r
+       CAIE T6,(SIXBIT /UFD/)\r
+       JRST DERR2B     ;NO\r
+\r
+       HLRZ DOUT,(T3)  ;YES, GET PROJ. NO.\r
+       MOVEI T2,PUTCON ;PRINT PROJ-PROG. NO.\r
+       PUSHJ P,OUTOCT  ;CONVERT TO ASCII\r
+\r
+       MOVEI CHR,COMMA\r
+       PUSHJ P,PUTCON\r
+\r
+       HRRZ DOUT,(T3)  ;GET PROG. NO.\r
+       PUSHJ P,OUTOCT  ;CONVERT TO ASCII\r
+\r
+DERR2B:        TLO T6,"."-40           ;PUT SIXBIT PERIOD\r
+DERR2A:        MOVEM T6,DERR2+1        ;INTO EXTENSION\r
+       PUSHJ P,P6BIT\r
+               DERR2\r
+       PUSHJ P,P6BIT\r
+               DERR2+1\r
+       MOVEI CHR," "\r
+       JRST PUTCON\r
+\r
+\r
+SAVE:  MOVE 0,[XWD 1, SAVAC]\r
+       BLT 0,SAVAC+2\r
+       MOVEM T5,SAVAC+3\r
+       MOVEM T6,SAVAC+4\r
+       POPJ P,\r
+REST:  MOVS 0,[XWD 1, SAVAC]\r
+       BLT 0,T3\r
+       MOVE T5,SAVAC+3\r
+       MOVE T6,SAVAC+4\r
+       POPJ P,\r
+\r
+\r
+\r
+\r
+\f;THIS ROUTINE GETS A 7 BIT ASCII CHARACTER FROM THE COMMAND STRING\r
+;AND RETURNS IT TO THE COMMAND SCANNER ROUTINE (NAME) IN AC0\r
+\r
+GETCOM:        PUSHJ P,GETBUF\r
+       CAIN 0,"/"      ;SINGLE CHARACTER SWITCH\r
+       JRST GETT6\r
+       CAIN 0,"("      ;LOOK FOR (MULTI-CHAR.) SWITCH\r
+       JRST GETT3\r
+       CAIN 0,"<"      ;GO LOOK FOR PROTECTION\r
+       JRST GETT9\r
+       CAIE 0,"["\r
+       POPJ P,\r
+\r
+GETT10:        PUSHJ P,GETNUM  ;LOOK FOR PROJECT-PROGRAMMER NUMBER\r
+       CAILE T7,-1     ;GREATER THAN HALF WORD?\r
+       JRST ERR2A      ;YES, ERROR\r
+       CAIE 0,","      ;SEPARATOR?\r
+       JRST GETT11     ;OR TERMINATOR (NON-NUMERIC)\r
+       HRLZM T7,PP\r
+       JRST GETT10\r
+\r
+GETT11:        HRRM T7,PP\r
+       CAIN 0,"]"      ;FORCE CORRECT TERMINATOR\r
+       JRST GETCOM\r
+       JRST ERR2\r
+\r
+GETT9: PUSHJ P,GETNUM\r
+       CAIN 0,">"      ;TERMINATE ON RIGHT BRKA ONLY\r
+       CAILE T7,777    ;PR. IN RANGE?\r
+       JRST ERR2A\r
+       ROT T7,-11\r
+       HLLOM T7,PR     ;RHS=1's MEANS <> SEEN (PR MAY BE 0)\r
+       JRST GETCOM\r
+\r
+GETNUM:        MOVEI T7,0      ;TO PICK P-P NUMBER\r
+GETN1: PUSHJ P,GETBUF  ;AND PROTECTION\r
+       CAIN 0," "      ;IGNORE SPACES\r
+       JRST GETN1\r
+       CAIL 0,"0"\r
+       CAILE 0,"7"\r
+       POPJ P,         ;GOT A NON-NUMERIC\r
+       MOVE    T5,0\r
+       LSH     T7,3\r
+       ADDI    T7,-60(T5)      ;ADD DIGIT\r
+       JRST GETN1\r
+\fGETT3:        PUSHJ P,GETT5   ;PROCESS SWITCH CHARACTER\r
+       CAIN 0,")"      ;CLOSING PAREN?\r
+       JRST GETCOM     ;YES\r
+       CAIN 0,"M"      ;MTA FLAG?\r
+       TRO FLAG,MTFLG  ;SET MTA, LOOK FOR MULTI CHAR. SWITCH\r
+       CAIE 0,"#"      ;MTA#\r
+       JRST GETT3      ;NO\r
+       TRNN FLAG,MTFLG ;ONLY LOOK AFTER # IF MTFLG IS ON.\r
+       JRST ERR6       ;I.E. IF MT SWITCH IS IN PROGRESS.\r
+       PUSHJ P,GETNUD  ;GET A NUMBER\r
+       CAIE 0,"D"      ;TERMINATED BY D?\r
+       CAIN 0,"A"      ;TERMINATED BY A?\r
+       JRST GETT3A     ;YES, MARK AB UPPER\r
+       CAIE 0,"P"      ;ONLY A,D,P AND B CAN BE\r
+       CAIN 0,"B"      ;PRECEDED BY #.\r
+       SKIPA \r
+       JRST ERR6\r
+       HRRM T7,AB      ;NO. FILES/RECS TO ADVANCE\r
+                       ;GOES IN AB (RH)\r
+GETT3B:        PUSHJ P,GETT5A\r
+       JRST GETT3\r
+\r
+GETT3A:        HRLM T7,AB      ;NO. FILES/RECS TO BACK SPACE\r
+       JRST GETT3B     ;GOES IN AB (LH)\r
+\r
+GETT6: PUSHJ P,GETT5   ;PROCESS ONE SWITCH CHAR\r
+       CAIE 0,"M"\r
+       CAIN 0,")"      ;THERE ARE ILLEGAL 1-SWITCH CHARS.\r
+       JRST ERR6\r
+       JRST GETCOM\r
+\r
+GETNUD:        MOVEI T7,0      ;GET A DECIMAL NUMBER\r
+GETN2: PUSHJ P,GETBUF  ;GET CHAR FROM COMMAND STRING\r
+       CAIN 0,SPACE    ;SPACE?\r
+       JRST GETN2      ;YES, IGNORE\r
+       CAIL 0,"0"      ;NUMBER?\r
+       CAILE 0,"9"\r
+       POPJ P,         ;NO\r
+       IMULI T7,^D10   ;T7*10\r
+       ANDI 0,17       ;ADD ON LAST DIGIT\r
+       ADD T7,0        ;+ LOW 4 BITS\r
+       JRST GETN2\r
+\f\r
+;GET NEXT COMMAND STRING CHAR(SWITCH),CHECK WITH TABLE,SET FLAGS\r
+\r
+GETT5: PUSHJ P,GETBUF  ;GET CHAR FROM COMMAND STRING\r
+GETT5A:        MOVE T2,[XWD 350700,DISPTB]     ;SET DISPTB NEXT SEARCH\r
+       MOVEI T6,MTAREQ ;SET MTAREQ NEXT SEARCH\r
+\r
+       TRNN FLAG,MTFLG ;SET UP TABLE TO SEARCH AND STORE RESULT IN\r
+       HRRI T2,DISPTA  ;PUT IN BYTE POINTER, NOT MTA REQUEST\r
+\r
+;SET TO LOOK AT NON-MTA LETTERS FIRST\r
+\r
+       TRNN FLAG,MTFLG ;IF MTFLG SET, START AT DISPTB AND STORE RESULT IN\r
+       MOVEI T6,AUXFLG ;MTAREQ, ELSE START AT DISPTA AND STORE RESULT IN\r
+                       ;AUXFLG OR FLAG\r
+;GET FIRST CHAR DISPTA OR DISPTB, LOOK FOR MATCH, SET SWITCH FLAGS.\r
+\r
+GETT7: LDB T3,T2       ;COMPARE WITH LEFT 7 BITS OF\r
+       JUMPN T3,GETT8  ;TABLE ENTRIES\r
+       TRZ FLAG,MTFLG  ;SEARCHED TABLE 1 (DISPTB) DROP MTA FLAG\r
+       MOVEI T6,AUXFLG ;SET AUXFLG NEXT TABLE SEARCH\r
+       TLNE AUXFLG,NOMORE      ;AFTER FIRST INPUT DEVICE ONLY ACCEPT MTA FLAGS\r
+       POPJ P,\r
+\r
+GETT8: CAIN T3,1       ;END OF DISPTA 1ST HALF\r
+       MOVEI T6,FLAG   ;YES, SEARCH DISPTA 2ND HALF FROM NOW ON\r
+       CAIN T3,2       ;END OF DISPTA 2ND HALF\r
+       JRST ERR6       ;SEARCHED TABLE 3, ERROR EXIT\r
+       CAME T3,0       ;MATCHING CHARACTER?\r
+       AOJA T2,GETT7   ;NO, GET NEXT SWITCH IN TABLE.\r
+\r
+       MOVE T5,(T2)    ;YES, SET FLAG OR AUXFLG OR MTAREQ\r
+       IORM T5,(T6)    ;FLAG OR AUXFLG\r
+       TRNE FLAG,MTFLG\r
+       IORM T5,AUX     ;MTA REQUESTS SAVED IN AUX\r
+IFE RIMSW,<\r
+       TLNE FLAG,RIMFLG\r
+       JRST RIMTB      ;NO RIM IF RIMSW=0\r
+       >               ;PRINT ERROR MESSAGE\r
+       POPJ P,         ;EXIT ON MATCHING CHAR\r
+\r
+\f\r
+;ROUTINE TO GET ONE TTY OR CCL COMMAND STRING CHAR INTO AC 0\r
+\r
+GETTA: \r
+IFN CCLSW,<\r
+       SKIPE COMFLG    ;STORED COMMANDS?\r
+       JRST GETSC      ;YES>\r
+\r
+       SOSLE TFI+2     ;SUBR TO GET ONE TTY CHAR IN AC 0\r
+       JRST GETT2      ;BUFFER NOT EMPTY\r
+       MOVE 0,TFI      ;BUFFER EMPTY, SAVE\r
+       MOVE T5,TFO     ;CURRENT BUFFER LOCS\r
+       PUSHJ P,INICON  ;BUFFER EMPTY SO RE-ATTACH TTY\r
+       HRROM 0,TFI     ;RESTOR OLD BUFFER LOCS\r
+       HRROM T5,TFO    ;USE PREVIOUSLY ASSIGNED I/O BUF. FOR TTY\r
+       PUSHJ   P,INFO2 ;TYPE CR,LF\r
+GETTIN:        INPUT CON,      ;GET THE NEXT LINE\r
+       MOVE T5,TFI+2   ;SAVE CHAR COUNT\r
+       RELEAS CON,     ;LET GO OF TTY FOR USE AS IN-OUT DEVICE\r
+       MOVEM T5,TFI+2  ;RESTORE CHAR COUNT LOST DURING RELEASE\r
+GETT2: ILDB 0,TFI+1    ;FETCH CHAR\r
+GETT4: CAIE 0,ALT175   ;OLD ALTMODE?\r
+       CAIN 0,ALT176\r
+       MOVEI 0,ALTMOD  ;YES,MAKE NEW ALTMODE\r
+       JUMPE   0,GETTA ;IGNORE NULL CHARS\r
+       CAIL 0,140      ;LOWER CASE?\r
+       TRZ     0,40    ;MAKE UPPER CASE\r
+       POPJ    P,\r
+\r
+;ROUTINE TO GET ONE TTY CHAR FROM COMBUF INTO AC0\r
+\r
+GETBUF:        SOSGE COMCNT    ;ANY CHARS LEFT?\r
+       JRST ERR6B      ;NO, COMMAND ERROR\r
+       ILDB 0,COMPTS   ;PICK UP CHAR FROM COMBUF\r
+       POPJ P,\r
+\r
+;ROUTINE TO INITIALIZE THE TTY, ASCII LINE MODE\r
+\r
+INICON:        INIT CON,1      ;SUBR TO INITIALIZE THE TTY\r
+       SIXBIT /TTY/\r
+       XWD TFO,TFI     ;TTY OUT/IN BUFFER HEADERS\r
+       EXIT            ;IF TTY NOT AVAILABLE,FATAL.JOB DET?\r
+       POPJ P,\r
+\f;GET 7 BIT ASCII CHARACTER - INPUT FROM CCL COMMAND FILE\r
+\r
+IFN CCLSW,<GETSC:\r
+IFN TEMP,<SKIPN TMPFLG         ;IS TMPCOR UUO IN ACTION?\r
+       JRST    GETTM1          ;NO CONTINUE AS USUAL\r
+GETTM2:        ILDB    0,TMPPNT        ;PICK UP NEXT CHARACTER\r
+       HRRZ    DOUT1,TMPPNT    ;GET BYTE POINTER POISITION\r
+       CAML    DOUT1,TMPEND    ;HAS THE COMMAND FINISHED YET\r
+       JRST    GETEND          ;YES, EXIT\r
+       JRST    GETT4           ;CHECK FOR ALTMODE,NULL,LOWER CASE\r
+GETTM1:                >\r
+       SOSLE   CFI+2           ;ANY REMAINING?\r
+       JRST    GETSC0          ;YES\r
+       INPUT   COM,\r
+       STATZ   COM,740000\r
+       JRST    GETTM3\r
+       STATZ   COM,EOFBIT      ;END-OF-FILE\r
+       JRST    GETEND          ;YES\r
+GETSC0:        ILDB    CFI+1           ;GET A CHARACTER\r
+       MOVE    DOUT1,@CFI+1    ;GET PRESENT WORD\r
+       TRNN    DOUT1,1         ;IS IT A SEQUENCE NUMBER?\r
+       JRST    GETT4           ;NO - CONTINUE\r
+       AOS     CFI+1           ;YES - ADD 1 TO BYTE POINTER\r
+       MOVNI   DOUT1,5         ;I.E. IGNRORE SEQ. NO.\r
+       ADDM    DOUT1,CFI+2     ;SUBTRACT 5 FROM COUNT FOR SEQ. NO.\r
+       JRST    GETSC           ;CONTINUE \r
+\r
+GETTM3:        ERRPNT </READ ERROR-CCL COMMAND FILE/>\r
+GETEND:\r
+IFN TEMP,<SKIPE TMPFLG         ;TMPCOR\r
+       JRST    GETEN2          ;YES>\r
+       SKIPN   COMFLG          ;CCL END OF CS?\r
+       JRST    GETEN2          ;NO\r
+GETEN1:        CLOSE   COM,            ;NO, DSK FILE CCL\r
+       SETZB   0,T1            ;DIRECTORY ENTRY FOR RENAME\r
+       SETZB   T2,T3\r
+       RENAME  COM,            ;WIPE OUT cOOMAND FILE\r
+       JFCL    17,.+1\r
+       RELEAS  COM,0           >\r
+GETEN2:        SETOM   COMEOF          ;INDICATE END OF FILE\r
+       MOVEI   0,CZ            ;NEEDED TO TERM CCL CS SCAN\r
+       POPJ    P,\r
+\f;TABLE OF RECOGNIZED COMMAND LETTERS AND CORRESPONDING FLAG BITS\r
+\r
+DEFINE DISP (A,B)\r
+<       XWD <"A">*4000,B>\r
+;MAGTAPE SWITCHES AND FLAG BITS. TABLE 1 (MTAREQ)\r
+DISPTB:        DISP A,MTAFLG\r
+        DISP B,MTBFLG\r
+        DISP T,MTTFLG\r
+        DISP W,MTWFLG\r
+        DISP 8,MT8FLG\r
+        DISP 5,MT5FLG\r
+        DISP 2,MT2FLG\r
+        DISP E,MTEFLG\r
+        DISP U,MTUFLG\r
+        DISP F,MTFFLG\r
+        DISP D,MTDFLG\r
+        DISP P,MTPFLG\r
+        DISP #,0\r
+        OCT 000000000000\r
+;1ST BYTE 0=END OF DISPTB\r
+;------------------------\r
+;COMMAND STRING LETTERS AND FLAG BITS. TABLE 2 (AUXFLG)\r
+DISPTA:                        XWD <"Q">*4000+QFLG,0\r
+                        XWD <"E">*4000+CDRFLG,0\r
+        DISP F,FFLG\r
+        OCT 004000000000\r
+;1ST BYTE 1=END OF DISPTA 1ST HALF\r
+;------------------------\r
+;COMMAND STRING LETTERS AND FLAG BITS. TABLE 3 (FLAG)\r
+        DISP A,LINE\r
+        DISP B,BMOD\r
+        DISP C,TBMOD                   ; NOT IN 1K\r
+        DISP D,DFLG                    ; NOT IN 1K\r
+        DISP L,LFLG                    ; NOT IN 1K\r
+        DISP M,0               ;NOT IN OLD\r
+               XWD <")">*4000,0                ;NOT IN OLD\r
+        DISP N,NSMOD\r
+        DISP O,SQMOD+NSMOD+STS+OSFLG           ;NOT IN OLD\r
+                        XWD <"P">*4000+PFLG+PCONV,0            ;NOT IN OLD\r
+        DISP R,RFLG                    ; NOT IN 1K\r
+        DISP S,SQMOD+NSMOD+STS\r
+        DISP T,SPMOD                   ; NOT IN 1K\r
+                        XWD <"V">*4000+CHKFLG,LINE             ;NOT IN OLD\r
+        DISP X,XFLG                    ; NOT IN 1K\r
+        DISP Z,ZFLG\r
+                        XWD <"U">*4000+OFLG,0\r
+                        XWD <"Y">*4000+IBFLG+RIMFLG,0          ;NOT IN OLD\r
+                        XWD <"I">*4000+IFLG,0          ;NOT IN OLD\r
+                        XWD <"H">*4000+IBFLG,0         ;NOT IN OLD\r
+                        XWD <"G">*4000+GFLG,0          ;NOT IN OLD\r
+        OCT 010000000000\r
+;FIRST BYTE 2=END OF DISPTA 2ND HALF\r
+\f;SUBR TO GET NEXT CHAR INTO AC CHR\r
+;NO SKIP RETURN IS END OF FILE, SINGLE SKIP IS NORMAL RETURN\r
+\r
+GET:   TLNN FLAG,NEWFIL        ;NEW FILE\r
+       TLZN FLAG,PCONV+NEWFIL  ;NO,CONVERT THIS CHAR\r
+       JRST GETPC1     ;YES\r
+       LDB CHR,IBF+1   ;GET CHAR\r
+       CAIN CHR," "    ;SPACE?\r
+       JRST GETPC2     ;YES, CONVERT TO LINE FEED\r
+       CAIG CHR,"3"    ;IS THE CHAR A PROPER FORMAT CONTROL CHAR?\r
+       CAIGE CHR,"*"\r
+       JRST GETPC3     ;NO, SO OUTPUT LINE FEED FOLLOWED BY BAD CHAR\r
+       CAIG CHR,"."    ;USE LEFT HALF OF TABLE\r
+       SKIPA CHR,PCHTAB-<"*">(CHR)\r
+       MOVS CHR,PCHTAB-<"/">(CHR)\r
+GETPC4:        DPB CHR,IBF+1   ;CLOBBER OLD CHAR, USUALLY BECOMES NULL\r
+       LSH CHR,-7      ;BUT OTHERWISE BECOMES ANOTHER FORMAT CHAR\r
+       ANDI CHR,377    ;EXTRACT THE CHAR TO BE OUTPUT\r
+       TRZE CHR,200    ;=1 FOR GENERATING MULTIPLE LINE FEEDS\r
+       TLO FLAG,PCONV  ;CONTINUE TO CONVERT\r
+       JUMPN CHR,CPOPJ1;OUTPUT THE GENERATED CHAR UNLESS NULL\r
+       POP     P,(P)   ;IGNORE NULL CHARS\r
+       JRST    PSCAN4  ;DUMP THE LINE BUFFER\r
+GETPC1:        TRNN FLAG,SUS   ;SUPPLYING SEQ. NUM. NOW?       \r
+       JRST GET2       ;NO\r
+       ILDB CHR,PTRPT  ;YES, SO GET CHAR OF SEQ NUM\r
+       JUMPN CHR,CPOPJ1;0 MARKS LAST CHAR\r
+       LDB T1,IBF+1    ;GET FIRST CHAR OF THIS LINE\r
+       MOVEI CHR,15\r
+       CAIG T1,15      ;PREPARE TO OUTPUT A CR,LF\r
+       CAIGE T1,12     ;IS FIRST CHAR OF LINE AN END OF LINE CHAR?\r
+       MOVEI   CHR,TAB ;NO, SO OUTPUT A TAB\r
+       TRZ FLAG,SUS    ;TURN OFF SUS SUPPLY\r
+       JRST    GETA5\r
+GET5:  AOS IBF+1       ;HERE IF A SEQ NUM FOUND IN INBUFFER\r
+       SUBI T1,5       ;IGNORE SEQ NUM, TAB AND DECREMENT CHAR COUNT\r
+       MOVEM T1,IBF+2\r
+       TRNE FLAG,NSMOD ;REMOVE SEQ NUMS MODE?\r
+       JRST GET2       ;YES, SO GET NEXT CHAR\r
+       MOVEM 2,SQNUM   ;SEQ NUM FROM BUFFER BECOMES NEW SEQ NUM\r
+       PUSHJ P,OUTLBF  ;DUMP THE LINE BUFFER (IF REQUIRED)\r
+       TRON FLAG,STS+SNI       ;TURN ON START OF LINE\r
+       PUSHJ P,CLRBUF  ;CLEAR LBUF IF IN THE MIDDLE OF A LINE\r
+\r
+GET2:  TRZE FLAG,ESQ   ;REPROCESS LAST CHAR?\r
+       JRST GET1       ;YES\r
+       SOSL T1,IBF+2   ;CHARS REMAINING IN INBUFFER?\r
+       JRST GET4       ;YES\r
+       PUSHJ P,INP     ;NO, SO REFILL AND CHECK ERR BITS\r
+       TRNE IOS,EOFBIT ;END OF FILE? IOS HAS STATUS BITS\r
+       POPJ P,         ;YES\r
+       JRST GET2       ;NO, SO PROCESS INBUFFER\r
+\r
+GETPC3:        TRO FLAG,ESQ    ;REPOCESS BAD CHAR\r
+       TROA CHR,12*200 ;PRECEED BAD CHAR WITH LINE FEED\r
+GETPC2:        MOVEI CHR,12*200;CHANGE SPACE TO LINE FEED\r
+       JRST GETPC4\r
+\r
+PCHTAB:         XWD 24*200,222*200+"."   ;/ *\r
+        XWD 212*200+" ",177*200 ;0 +   VJC 4/16/49\r
+        XWD 14*200,21*200       ;1 ,\r
+        XWD 20*200,212*200+"0"  ;2 -\r
+        XWD 13*200,22*200       ;3 .\r
+\r
+GET4:  ILDB CHR,IBF+1  ;FETCH CHAR FROM INBUFFER\r
+       TDNN FLAG,[XWD IFLG+IBFLG,BMOD] ;BIN, IB, I OR SBIN MODE?\r
+       TLNE AUXFLG,SBIN\r
+       JRST CPOPJ1     ;YES, SO NO PROCESSING REQUIRED\r
+GET1:  LDB CHR,IBF+1   ;AFTER SEQ NUM, HERE FOR 1ST CHAR\r
+       JUMPE CHR,GET2  ;IGNORE NULL CHARS\r
+       CAIN CHR,LF     ;INGORE LINE FEED IN FORTRAN OUTPUT\r
+       TLNN FLAG,PFLG  ;/P SWITCH IN EFFECT?\r
+       SKIPA           ;NO\r
+       TLOA FLAG,PCONV ;CONVERT THE NEXT LIVE CHAR\r
+       CAIN CHR,CZ\r
+       JRST GET2       ;GET NEXT CHAR\r
+GET1A: MOVE T2,@IBF+1  ;BIT 35 OF BUFFER SET?\r
+       TRZE T2,1\r
+       JRST GET5       ;YES, THIS IS A SEQ NUM\r
+       TRZE FLAG,STS   ;START SEQ (NEW LINW) FLAG ON?\r
+       TRNN FLAG,SQMOD+SNI     ;YES, SEQ MODE OR SEQ COPY?\r
+       JRST GET7       ;NO, SO PROCESS CHAR\r
+       MOVE T2,SQNUM   ;NO, SO ADD 10. TO SEQ NUM\r
+       MOVE T1,K1\r
+       TRNE FLAG,OSFLG ;TEST FOR INCR. BY ONE\r
+       MOVE T1,K4\r
+       ADD T2,T1       ;ASCII INCREMENT\r
+       AND T2,K3       ;MASK SIGNIFICANT DIGITS\r
+       MOVE T1,2\r
+       AND T1,ZRO      ;MASK CARRY BITS\r
+       ASH T1,-3\r
+       SUB T2,T1       ;ADJUST CARRIES\r
+       IOR T2,ZRO\r
+       TRZN FLAG,SNI   ;NON-INCREMENT SEQ NUM FLAG ON?\r
+       MOVEM T2,SQNUM  ;NO, SO SAVE THE RESULT\r
+       TRO FLAG,LINE+SUS+ESQ   ;TURN ON SUPPLY SEQ, REPROCESS\r
+                               ;LAST CHAR, AND LINE-BY-LINE FLAGS\r
+       AOS LBUF                ;SET BIT 35 IN LBUF TO MARK SEQ NUM\r
+       MOVE T1,[POINT 7,SQNUM]\r
+       MOVEM T1,PTRPT  ;INITIALIZE SEQ NUM PICK-UP POINTER\r
+       JRST GET        ;GO OUTPUT FIRST CHAR OF SEQ NUM\r
+\f;ROUTINE TO INPUT INPUT FILE\r
+\r
+INP:   INPUT   IN,     ;INPUT DATA\r
+       GETSTS IN,IOS   ;SUBR TO CHECK INPUT ERR BITS\r
+       TRNN AUXFLG,MTAIN       ;MTA INPUT?\r
+       TRNE IOS,740000 ;ANY ERROR BITS SET?\r
+       TRNN IOS,740000+EOTBIT  ;EOT FOR MTA?\r
+       POPJ P,         ;NO\r
+\r
+       PUSHJ P,COMERR  ;SAVE AC'S RELEASE TTY\r
+       JSP T5,INICN2   ;YES SO PRINT OUT COMPLETE FILE DESCRIPTOR\r
+       PUSHJ P,QUEST\r
+       ERRPN2 </INPUT DEVICE />\r
+       PUSHJ P,P6BIT\r
+               DEVICE\r
+       ERRPN2  </: FILE />\r
+       MOVEI T6,ZRF    ;LOC OF INPUT FILE NAME TO T6\r
+       PUSHJ P,FN.EX   ;DEPOSIT FILE NAME, EXT INTO TTY OUT BUFFER\r
+       MOVE T2,AUXFLG\r
+       ANDI T2,CDRIN+DTAIN+DSKIN+MTAIN\r
+       PUSHJ P,IOERR   ;GO PRINT ERROR DESCRIPTOR\r
+       SETSTS IN,(IOS)\r
+       POPJ P,\r
+\r
+;ROUTINE TO TEST IF BLOCK TOO LARGE, OR WRITE LOCKED\r
+\r
+QUEST: MOVEI CHR,"?"   ;DEPOSIT "?" IN ERROR MSG\r
+       TLNN FLAG,GFLG  ;ONLY IF /G NOT ON\r
+       JRST PUTCON     ;/G NOT ON, PRINT ?(FATAL) BEFORE ERR MSG\r
+\r
+       TRNN IOS,BIGBLK ;BLOCK NO. TOO LARGE?\r
+       JRST QUEST2     ;NO\r
+       TRNN AUXFLG,DTAIN+DTAOUT        ;YES\r
+       POPJ P,         ;BLOCK TOO LARGE\r
+\r
+       JRST PUTCON     ;DEPOSIT "?" FATAL EVEN IF /G ON\r
+\r
+QUEST2:        TRNE IOS,WRTLOK ;WRITE LOCKED?\r
+       TRNN AUXFLG,DSKIN+DTAIN+DTAOUT+MTAIN+MTAOUT+DSKOUT\r
+       POPJ P,         ;NO\r
+       JRST PUTCON     ;DEPOSIT "?" FATAL EVEN IF /G ON\r
+\f\r
+GET7:  TLNE FLAG,PCONV ;CONVERTING FORTRAN CARRAIGE CONTROL CHAR?\r
+       JRST GET+1      ;YES, GO DO IT\r
+       AOS T1,CDRCNT\r
+       TLNE AUXFLG,CDRFLG\r
+       JRST GET7B      ;CARD READER INPUT\r
+\r
+GET7C: CAIN CHR,SPACE  ;SPACE?\r
+       JRST GETA2      ;YES\r
+       CAIN CHR,CR     ;CAR. RET. ?\r
+       JRST GETA3      ;YES\r
+       TRZ FLAG,SPOK   ;CHAR NOT A SPACE STOP COUNTING CONSEC. SPACES\r
+       CAIN CHR,TAB    ;TAB?\r
+       JRST GETA5      ;KEEP TRACK OF TAB STOPS\r
+       CAIG CHR,137\r
+       CAIGE CHR,SPACE ;NON-SPACE CHARACTER?\r
+       JRST CPOPJ1     ;YES, SO RETURN IMMEDIATELY\r
+       SOSG TABCT      ;COUNT DOWN THE TAPE STOP COUNTER\r
+       JRST GETA5      ;RESET THE COUNTER IF TAB STOP PASSED\r
+CPOPJ1:        AOS     (P)     ;SKIP RETURN\r
+       POPJ    P,\r
+\r
+\r
+GET7B: CAIL T1,^D73    ;LT COL 73?\r
+       CAILE T1,^D80   ;NO, LE COL 80?\r
+       SKIPA           ;CANT BE A CARD SEQUENCE NUMBER\r
+       MOVEI CHR,SPACE ;REPLACE CARD SEQUENCE NOS. BY SPACE\r
+       JRST GET7C\r
+\r
+GETA3: TRZE FLAG,SPOK  ;CAR. RET. SEEN, ANY TRAILING SPACE?\r
+       TRNN FLAG,SPMOD+TBMOD   ;YES, ARE WE FLUSHING TRAILING SPACES\r
+       JRST GETA5      ;NO, RESET TAB COUNTER ONLY\r
+       MOVE 0,SVPTR1\r
+       MOVEM 0,OPTR    ;CLOBBER THE OUTPUT POINTER TO LBUF\r
+GETA5: MOVEI 0,TABSP\r
+       MOVEM 0,TABCT   ;RESET THE TAB COUNTER\r
+       JRST CPOPJ1\r
+\fGETA2:        TROE FLAG,SPOK  ;SPACE WAS SEEN, IS THIS ONE OF A SEQUENCE?\r
+       JRST GETA7      ;YES\r
+       MOVE 0,OPTR     ;THIS IS THE FIRST SPCE SEEN, SAVE LBUF\r
+                       ;POINTER IN CASE THIS SPACE MUST BE FLUSHED\r
+       MOVEM 0,SVPTR1  ;THIS POINTER FOR FLUSHING FINAL SPACES\r
+       MOVEM 0,SVPTR2  ;THIS POINTER FOR CHANGING MULT. SPACES TO TABS\r
+       SETZM SPCT      ;INITIALIZE THE SPACE COUNTER\r
+GETA7: AOS T1,SPCT\r
+       SOSLE TABCT     ;ARE WE AT THE NEXT TAB STOP?\r
+       JRST CPOPJ1     ;NO\r
+       CAIL T1,2       ;DONT BOTHER CHANGING ONE SPACE TO A TAB\r
+       TRNN FLAG,TBMOD ;TAB GENERATING MODE?\r
+       JRST GETA5A     ;NO, GO RESET TAB COUNTER\r
+       MOVE 0,SVPTR2\r
+       MOVEM 0,OPTR    ;BACK UP THE OUTPUT POINTER OF THE LAST\r
+                       ;GROUP OF SPACES\r
+       MOVEI CHR,TAB   ;OUTPUT A TAB\r
+       SETZM SPCT      ;RESET THE SPACE COUNTER\r
+GETA5A:        IBP SVPTR2      ;UPDATE THE CHANGE-SPACES-TO-TABS POINTER\r
+       JRST GETA5      ;RESET THE TAB COUNTER\r
+\f;ERROR ROUTINES\r
+\r
+IFE WCH,<IFN RIMSW,<\r
+ERR8A:  MOVEI   T4,ERR382\r
+        JRST    E10B\r
+ERR3B:  MOVEI   T4,ERR381\r
+        JRST    E10B>>\r
+\r
+IFE WCH,<\r
+ERR10: MOVEI   T4,ERR382\r
+       SKIPA \r
+       MOVEI   T4,ERR381>\r
+E10B:  ERRPNT  </?File />\r
+       MOVEI T6,ZRF\r
+       PUSHJ P,FN.EX\r
+       JRST    (T4)\r
+\r
+\r
+IFE WCH,<\r
+ERR381:        ERRPN2 </illegal extension!/>\r
+\r
+ERR382:        ERRPN2 </illegal format!/>\r
+\r
+ERR5B: ERRPN2 </? DTA to PTP only!/>>\r
+\r
+ERR9:  ERRPNT </?/>\r
+       MOVEI T6,DTON\r
+       PUSHJ P,FN.EX\r
+       JRST    ERR4B\r
+\fERR1: SKIPA T2,ODEV   ;OUTPUT UNAVAILABLE\r
+ERR1A: MOVE T2,DEVICE  ;INPUT UNAVAILABLE\r
+ERR1B: ERRPNT  </?Device />\r
+       PUSHJ   P,P6BIT\r
+               T2\r
+       ERRPN2  </ not available!/>\r
+ERR3:\r
+IFN FTDSK,<TRNE AUXFLG,DSKIN\r
+       JRST DERR5      ;ERR ON DSK>\r
+ERR3AA:        ERRPNT </? No file named />\r
+       MOVEI T6,FILNAM\r
+       PUSHJ P,FN.EX   ;PRINT NAME OF FILE THAT CANNOT BE FOUND\r
+       JRST PIP2\r
+\r
+ERR4:  SKIPN DTON\r
+       JRST ERR4A\r
+IFN FTDSK,<TRNE AUXFLG,DSKOUT\r
+       JRST DERR6>\r
+       ERRPNT </? Directory full!/>\r
+ERR4A:\r
+IFN FTDSK,< TRNE AUXFLG,DSKOUT\r
+       JRST ERR4C>\r
+ERR4B: ERRPNT </?Illegal file name!/>\r
+IFN FTDSK,<\r
+ERR4C: ERRPNT </?(0) Illegal file name!/>>\r
+\r
+ERR6A: JUMPE T5,ERR6\r
+       SKIPE ESWTCH\r
+       JRST MAINA1\r
+ERR6:  ERRPNT </?PIP command error!/>\r
+\r
+ERR6B: ERRPNT </?PIP COMMAND TOO LONG!/>\r
+\r
+E10A:          MOVEI T4,.+2\r
+       JRST E10B\r
+       ERRPN2 </ line too long!/>\r
+ERR5A: ERRPNT </?Too many input devices!/>\r
+ERR5:  ERRPNT </?Disk or DECtape input required!/>\r
+ERR2:  ERRPNT </?Incorrect Project-Programmer number!>/\r
+ERR2A: ERRPNT </?Illegal protection!/>\r
+IFE BLOC0,<\r
+ERR7A: ERRPNT <Z?DECtape I/O only!Z>>\r
+\f\r
+;ROUTINE TO CHECK INPUT DEV, SET XXXIN.E.G.DTAIN\r
+\r
+CHECK1:        MOVE 0,DEVICE   ;INPUT DEVICE NAME TO AC 0\r
+       JUMPE 0,CHECK   ;IGNORE IF NO INPUT DEVICE\r
+       DEVCHR          ;GET INPUT DEVCHR\r
+IFN FTDSK,<TLNN 0,DSKBIT ;INPUT DEVICE DISK?\r
+       JRST CHECK2     ;NO\r
+       TRO AUXFLG,DSKIN;INPUT DEVICE IS DSK, SET BIT\r
+       PUSH P,DEVICE\r
+       POP P,ADSK\r
+       JRST CHECK>\r
+\r
+CHECK2:        JUMPE 0,DEVER   ;NON-EX. DEVICE\r
+\r
+       TLNN 0,INBIT    ;CAN DEVICE DO INPUT?\r
+       JRST ERR6       ;NO, COMMD ERROR\r
+\r
+       TLNE 0,PTRBIT   ;PAPER TAPE READER?\r
+       TRO AUXFLG,PPTIN;YES\r
+\r
+       TLNE 0,DTABIT   ;DECTAPE?\r
+       TRO AUXFLG,DTAIN\r
+\r
+       TLNE 0,MTABIT   ;MAGTAPE?\r
+       TRO AUXFLG,MTAIN\r
+\r
+       TLNE 0,CDRBIT   ;CARD READER?\r
+       TRO AUXFLG,CDRIN\r
+\r
+       TLNE 0,TTYBIT   ;TELETYPE?\r
+       TRO AUXFLG,TTYIN\r
+\r
+       TRNN AUXFLG,PPTIN+DTAIN+MTAIN+CDRIN+TTYIN\r
+       JRST ERR6\r
+\r
+CHECK: SKIPE SSWTCH    ;_FLAG STILL ON?\r
+       JRST ERR6       ;YES ,COMMAND ERROR\r
+       POPJ P,         ;NO, RETURN\r
+\f;SUBR TO PRINT ERROR MESSAGES\r
+;! MARKS THE END OF MESSAGE & SIGNALS GO TO PIP2\r
+;NULL IS A FLAG TO RETURN TO THE NEXT LOCATION\r
+\r
+PTEXT: RELEAS DIR,     ;RELEASE DIRECTORY DEVICE\r
+       RELEAS TAPE,    ;RELEASE MAGTAPE\r
+       RELEAS OUT,     ;LET GO OF BOTH OUTPUT AND\r
+       RELEAS IN,      ;INPUT DEVICES\r
+       JSP T5,INICN1   ;INITIALIZE THE TTY\r
+PTEXT2:        HRLI T1,440700  ;GET SET TO SCAN 7-BIT DATA\r
+PTEXT1:        ILDB 0,T1       ;GET CHAR OF ERR MESSAGE\r
+       JUMPE 0,1(T1)   ;RETURN ON ZERO\r
+       CAIN 0,"!"      ;!?\r
+       JRST PIP2       ;YES, END OF MESSAGE, APPEND CAR.RET., LF\r
+       IDPB 0,TFO+1    ;DEPOSIT CHAR IN OUTBUFFER\r
+       JRST PTEXT1     ;GET NEXT CHAR\r
+\r
+;ROUTINE TO DEPOST CHARACTER IN TTY OUT BUFFER\r
+\r
+PUTCON:        SOSG TFO+2      ;STORED MORE THAN BUFFER HOLDS?\r
+       OUTPUT CON,0    ;YES\r
+       IDPB CHR,TFO+1\r
+       POPJ P,\r
+\r
+;ROUTINE TO CONVERT ONE WORD OF SIXBIT\r
+;FROM ADDRESS IN LOCATION AFTER CALL AND DEPOSIT INTO TTY OUT BUFFER\r
+\r
+P6BIT: MOVE T1,@0(P)   ;PICK UP WORD OF 6-BIT\r
+       HRLI T1,440600  ;SET UP POINTER\r
+P6BIT1:        ILDB CHR,T1\r
+       JUMPE CHR,P6BIT2\r
+       ADDI CHR,40\r
+       PUSHJ P,PUTCON  ;DEPOSIT IN TTY\r
+P6BIT2:        TLNE T1,770000  ;DONE SIX?\r
+       JRST P6BIT1     ;NO\r
+       JRST CPOPJ1     ;SKIP RETURN\r
+\r
+\f;ROUTINE TO CLEAR DSK OR DTA DIRECTORY (/Z SWITCH)\r
+\r
+DTCLR:\r
+IFN FTDSK,<TRNE        AUXFLG,DSKOUT   ;CLEAR DSK OR DTA DIR.\r
+       JRST    DSKZR0>\r
+       TRNN    AUXFLG,DTAOUT   ;MUST BE DTA\r
+       JRST    ERR5\r
+       UTPCLR  OUT,            ;CLEAR DIRECTORY\r
+       POPJ P,\r
+\f;ROUTINE TO SET UP TO COPY EVERYTHING\r
+\r
+PRECOP:        PUSHJ   P,ININIT        ;INIT INPUT FILE\r
+       TRNN    AUXFLG,DTAIN    ;DECTAPE INPUT\r
+       JRST    DTCOPY+1        \r
+       PUSHJ   P,DTCH2         ;YES, GET DIRECT, SET POINTER TO DIRECT\r
+\r
+DTCOPY:        PUSHJ   P,DTADI1                ;START (T5)\r
+IFN FTDSK,<TRNN        AUXFLG,DSKIN    ;DSK INPUT. ENTER HERE FROM DTD2\r
+       JRST    COPY1A\r
+       PUSHJ   P,DSKDIR                ;YES, PREPARE TO LOOKUP FILES>\r
+COPY1A:        SETZM   ZCNT            ;CLEAR COUNT FOR DSK ZERO REQUESTS\r
+       MOVEI   T2,6            ;FILL 0 CHARS. IN DEST-FILE\r
+       MOVE    T1,[POINT 6,DTON]       ;NAME WITH X'S. THIS IS\r
+XSS:   ILDB    0,T1            ;THEN THE BASE FOR GENERATED\r
+       SKIPN                   ;DESTATION FILES FROM\r
+       MOVEI   0,"X"-40                ;NON-DIR. DEVICES IN /X\r
+       DPB     0,T1\r
+       SOSLE   T2              ;DON'T YET KNOW IF ONE\r
+                               ;OF THE INPUT DEV. WILL\r
+       JRST    XSS\r
+       MOVE    0,DTON          ;BE NON-DIR\r
+       MOVEM   0,DTONSV\r
+       MOVE    0,DTON+1\r
+       MOVEM   0,DTONSV+1\r
+\r
+COPY1: PUSHJ   P,SR2           ;SET INIT. COPYING MODE\r
+       PUSHJ   P,LOOK          ;GET A FILE TO COPY\r
+       JRST    CAL6            ;NOT MORE\r
+IFN FTDSK,<PUSHJ P,XDDSK       ;GOT ONE, CHECK (XF) FROM DSK, NAMTAB\r
+       JRST    COPY1           ;IN LIST, DONT' COPY>\r
+       TRNN    AUXFLG,MTAIN+PPTIN+CDRIN+TTYIN  ;OK, COPY FILE\r
+       JRST    COPY6A          ;MUST BE DIRECTORY DEVICE\r
+       PUSHJ   P,MTPTCR                ;SET UP A DEST. FN\r
+       JRST    COPY6\r
+\fCOPY6A:       LOOKUP  IN,ZRF          ;LOOKUP INPUT FILE NAME\r
+       JRST    CAL5            ;INPUT FILE FILE PROTECTED\r
+COPY6: PUSHJ   P,FILTYP                ;CHECK FOR DMP,SAV,REL,CHN\r
+IFN WCH,<\r
+        TRNN    AUXFLG,DTAIN+DTAOUT\r
+        JRST    .+5\r
+        HLRZ    0,ZRF+1\r
+        CAIE    0,(SIXBIT /DMP/)\r
+IFN DISK30,<CAIN 0,(SIXBIT/SVE/)>\r
+IFE DISK30,<CAIN 0,(SIXBIT/SAV/)>\r
+        JRST    COPY1>\r
+       PUSHJ   P,COPY3\r
+COPY6B:        MOVE    0,ZRF           ;INPUT FILE NAME\r
+       MOVEM   0,DTON          ;IS OUTPUT FILE NAME\r
+       HLLZ    0,ZRF+1         ;LIKEWISE EXIT\r
+       HLLZM   0,DTON+1\r
+\r
+;THIS CODE OPERATES AS FOLLOWS - FOR E+2, SET = 0\r
+;TO START (ASSUMING /X)\r
+;DSK TO DSK IF EDIT SWITCHES PUT E+2 = 0 IF NO EDITS TRANSFER\r
+;       DATE, TIME, BITS 13-35\r
+;DSK TO DTA FOR EDITS E+2 = 0, NO EDITS TRANSFER 24-35 FOR\r
+;DATE, FOR"SAV" FILES TRANSLATE NO.  1K BLOCKS\r
+;DTA TO DSK FOR NO EDITS XFER BITS 24-35, ELSE E+2 = 0\r
+;DTA TO DTA ALWAYS XFER 18-23, (1K BLOCK) NO EDITS XFER 24-35(DATE)\r
+\r
+       SETZM   DTON+2          ;CLEAR DATE. OUTPUT FILE, DSK/DTA\r
+       LDB     0,DATE          ;GET DSK/DTA DATE CREATED\r
+       TDNN    FLAG,[XWD PFLG,LINE+TBMOD+NSMOD+SQMOD+SPMOD]\r
+       TLNE    AUXFLG,CDRFLG\r
+       JRST    COPY6C\r
+       DPB     0,DATED         ;DEPOSIT IF NO EDITS\r
+IFN FTDSK,<LDB 0,TIME\r
+       TRC     AUXFLG,DSKIN+DSKOUT\r
+       TRCN    AUXFLG,DSKIN+DSKOUT\r
+       DPB     0,TIMED         ;DSK TO DSK TIM>\r
+COPY6C:        IFE     WCH,<\r
+       PUSHJ   P,OKBLKS        ;SETUP 1K BLOCKS>\r
+       ENTER   OUT,DTON        ;GOT DATA, CREATE NEW FILE\r
+       JRST    ERR4            ;DIRECTORY FULL\r
+       MOVE    0,ZRO           ;GET ASCII/00000/AND\r
+       MOVEM   0,SQNUM         ;RESET SEQUENCE NO.\r
+       TLO     FLAG,NEWFIL     ;SET NEW FILE FLAG\r
+       SETZM   TOTBRK          ;CLEAR PAREN COUNTER\r
+       TLNN    AUXFLG,CDRFLG+SBIN      ;SPECIAL PROCESSING?\r
+       TDNE    FLAG,[XWD PFLG+IFLG+IBFLG,LINE+BMOD+TBMOD+NSMOD+SQMOD+SPMOD]\r
+       JRST    PSCAN           ;YES, DO IT\r
+COPY5: SOSGE   IBF+2           ;INPUT BUFFER EMPTY\r
+       JRST    COPY4           ;YES\r
+       ILDB    CHR,IBF+1       ;GET NEXT WORD AND\r
+       PUSHJ   P,PUT           ;OUTPUT IT\r
+       JRST    COPY5\r
+COPY4: PUSHJ   P,COPY3         ;GET NEXT FULL SOURCE BLOCK\r
+       PUSHJ   P,OUTP          ;OUPUT PREV. BLOCK-DONT ALTER DATA\r
+       AOS     OBF+2           ;MAKE PUT HAPPY BECAUSE OF\r
+       JRST    COPY5           ;OUTPUT HERE.\r
+COPY2A:        CLOSE   IN,\r
+       CLOSE   OUT,\r
+IFN FTDSK,<TLNE        AUXFLG,NSPROT   ;NON-STANDARD PROECTION?\r
+       TRNN    AUXFLG,DSKOUT   ;RENAME ALL OUTPUT FILES IF\r
+       JRST    COPY2B          ;NON-STANDARD PROTECTION\r
+       MOVE    0,PROTS         ;GET NEW PROTECTION\r
+       MOVEM   0,DTON+2\r
+\r
+       RENAME  OUT,DTON                ;RENAME OUTPUT FILE\r
+       JRST    DERR6>\r
+COPY2B:        PUSHJ   P,OUTP1\r
+       JRST    COPY1           ;GO GET NEXT FILE\r
+\r
+CAL5:  AOS     ZCNT            ;INPUT FILE READ PROT.\r
+       JRST    COPY1           ;COUNT READ FAILURES\r
+\r
+;NO    MORE FILES TO COPY\r
+\r
+CAL6:  TLZ     AUXFLG,NSPROT\r
+IFN FTDSK,<    SKIPN   ZCNT    ;FILES READ PROTECTED ?>        \r
+       JRST    MAIN1           ;NO\r
+IFN FTDSK,<    MOVEI   0,(SIXBIT /X/)  ;YES,PRINT FAILURE DURING   700000\r
+       JRST    DSKZ5   ;/X REQUEST>\r
+\r
+COPY3B:        SKIPE   IBF+2   ;EMPTY BLOCK?\r
+       POPJ    P,              ;NO, RETURN\r
+\r
+COPY3: PUSHJ   P,INP   ;READ NEXT BLOCK\r
+       TRZE    AUXFLG,READ1\r
+       PUSHJ   P,TTYZ          ;END OF FILE FROM TTY?\r
+       TRNN    IOS,EOFBIT              ;END OF FILE? IOS HAS STATUS BITS\r
+       JRST    COPY3B          ;NO.\r
+       TRNE    AUXFLG,MTAIN\r
+       MTAPE   TAPE,0\r
+       POP     P,0                     ;FIND WHERE CALLED FROM\r
+       HRRZS   0\r
+       TRNE    AUXFLG,MTAIN+CDRIN+TTYIN+PPTIN\r
+       CAIE    0,COPY6B                ;DID WE COME FROM COPY6B-1\r
+       JRST    COPY2A          ;NO, EOF NOT FIRST DATA IN FILE\r
+       SETZM   ALLCLF          ;END OF INFO ON NON-DIR. DEVICE\r
+       JRST    COPY1\r
+\r
+\f;CREATE DESTINATION FILE NAME. RANGE IS ...001 TO ...999\r
+\r
+MTPTCR:        AOS T1,NO.\r
+       CAILE T1,^D999\r
+       JRST MPC2\r
+       PUSHJ P,MTPTC1\r
+       MOVE 0,DTONSV   ;FILNAME=DTON IS ONLY WAY TO IDENTIFY \r
+       MOVEM 0,ZRF     ;INPUT FILE\r
+       MOVE 0,DTONSV+1\r
+       MOVEM 0,ZRF+1\r
+       POPJ P,\r
+MPC2:ERRPNT <Z?TERMINATE /X,  MAX. OF 999 FILES PROCESSED!Z>\r
+\r
+MTPTC1:        MOVEI DOUT,^D1000(T1)\r
+       MOVE T1,[POINT 6,DTONSV,17] ;404173\r
+       JSP T2,OUTDC1\r
+       AOJA T2,CPOPJ\r
+       SUBI CHR,40\r
+       IDPB CHR,T1\r
+       POPJ P,\r
+\r
+;ROUTINE TO RESTORE BYTE POINTERS TO INITED MODE\r
+;FOR INPUT AND OUTPUT DEVICES\r
+\r
+SR2:   MOVE 0,SVIBF\r
+       HLLM 0,IBF+1\r
+       MOVE 0,SVOBF\r
+       HLLM 0,OBF+1\r
+       POPJ P,\r
+\r
+;ROUTINE TO SEE IF ^Z FIRST CHAR ON TTY\r
+\r
+TTYZ:  TRNN AUXFLG,TTYIN       ;SEE IF FIRST CHAR. IS ^Z\r
+       POPJ P,                 ;NOT TTY INPUT\r
+       HRRZ T1,IBF+1           ;ON TTY\r
+       HLRZ 0,1(T1)            ;GET FIRST CHARACTER\r
+       CAIN 0,(<CZ>B6)         ;IS IT ^Z\r
+       TRO IOS,EOFBIT          ;YES,SET END OF FILE\r
+       POPJ P,                 ;NO\r
+\fIFE   WCH,<\r
+;DTA TO DTA MAINTAIN BITS 18-23 OF E+2 IF SET\r
+;DSK TO DSK NO TRANSLATION (E+2)\r
+;DSK TO DTA TRANSLATE E+3 (LHS) INTO E+2 (18-23)\r
+;DTA TO DSK NO TRANSLATION (E+2)\r
+;THIS ROUTINE ENSURES "SAVE" FILES MAINTAIN\r
+;CORRECT DATA FOR LOADING.  FOR DSK INPUT\r
+;A "SAVE" FILE IS ONE WITH THE EXTENSION\r
+;"SAV". E+3 = (-[(200XN)+NO. WDS IN LAST BLOCK]\r
+;IN LHS TRANSLATE TO NO. 1K BLOCKS NEEDED\r
+;TO LOAD FILE - BEFORE IT IS EXPANDED IN CORE.\r
+\r
+OKBLKS:        \r
+IFN FTDSK,<TRC AUXFLG,DSKOUT+DSKIN     ;DSK I/O\r
+       TRCN    AUXFLG,DSKOUT+DSKIN\r
+       POPJ    P,                      ;YES, EXIT\r
+       TRC     AUXFLG,DTAOUT+DTAIN     ;NO\r
+       TRCE    AUXFLG,DTAOUT+DTAIN     ;DTA I/O\r
+       JRST    OKBLK1                  ;NO>\r
+       LDB     0,OKB                   ;DEPOSIT IN DTON\r
+       DPB     0,OKBD\r
+       POPJ    P,\r
+\r
+IFN FTDSK,<\r
+OKBLK1:        TRC     AUXFLG,DTAIN+DSKOUT     ;DTA-TO-DSK\r
+       TRCN    AUXFLG,DTAIN+DSKOUT\r
+       POPJ    P,                      ;YES\r
+       TRC     AUXFLG,DSKIN+DTAOUT     ;NO,DSK-TO-DTA?\r
+       TRCE    AUXFLG,DSKIN+DTAOUT     ;NO\r
+       POPJ    P,\r
+       HLRZ    0,ZRF+1                 ;YES DSK-TO-DTA\r
+IFE DISK30,<\r
+       CAIE    0,(SIXBIT /SAV/)        ;GET LOOKED UP EXT,(INPUT).\r
+       >\r
+IFN DISK30,<CAIE       0,(SIXBIT /SVE/)>\r
+       POPJ    P,\r
+       HLRO    T1,ZRF+3                ;EXTENSION=SAV\r
+       MOVNS   T1                      ;WORD COUNT\r
+       IDIVI   T1,2000                 ;DIVIDE BY 1K CORE(OCTAL LOCS.)\r
+       SKIPN   T2\r
+       SOS     T1                      ;N-1\r
+       DPB     T1,OKBD\r
+       POPJ    P,>>\r
+\f\r
+\r
+IFN FTDSK,<\r
+;ARE WE DOING (XD) FROM DSK? IF NOT, EXIT.\r
+;SEE IF CURRENT FILE SELECTED IN ZRF IS IN THE\r
+;LIST OF FILES NOT TO BE COPIED. (POPJ IF IT IS)\r
+\r
+XDDSK: TRC     FLAG,XFLG+DFLG          ;COMPLEMENT\r
+       TRCN    FLAG,XFLG+DFLG          ;RESET AND TEST\r
+       TRNN    AUXFLG,DSKIN            ;/X AND /D WERE SET\r
+       JRST    CPOPJ1                  ;NOT DSK IN SO COPY FILE\r
+       HRROI   T1,-12                  ;SET TO LOOP NAMTAB\r
+XDDSK2:        MOVE    T2,ZRF                  ;GET FILE NAME\r
+       SKIPN   T3,NAMTAB+12(T1)        ;END OF TABLE ENTRIES?\r
+       JRST    CPOPJ1                  ;YES, EXIT\r
+       CAME    T2,T3                   ;FN IS * OR MATCH?\r
+       CAMN    T3,STAR\r
+       SKIPA                           ;YES, * OR MATCH?\r
+       JRST    XDDSK1                  ;NO MATCH\r
+       HLLZ    T2,ZRF+1                ;GET EXT\r
+       SKIPN   T3,NAMTAB+24(T1)        ;NO EXT MATCH WANTED\r
+       POPJ    P,                      ;EXIT THEN\r
+       CAME    T2,T3                   ;EXT IS * OR MATCH?\r
+       CAMN    T3,STAR\r
+       POPJ    P,                      ;FN EX MATCH, NO COPY\r
+XDDSK1:        AOJL    T1,XDDSK2               ;TRY ANOTHER FOR MATCH\r
+       JRST    CPOPJ1                  ;SEARCHED TABLE, NO MATCH>\r
+\f;ROUTINE TO DELETE OR RENAME FILES ON DTA OR DSK OR SET UP NAMTAB\r
+;FOR (DX) (DISK ONLY)\r
+\r
+DTDELE:        MOVE    0,ODEV          ;OUTPUT DEVICE\r
+       TRNE    FLAG,XFLG       ;/X\r
+       JRST    DELE1           ;YES\r
+       MOVEM   0,DEVICE        ;NO,SET DEVICE FOR INPUT\r
+       MOVEM   0,DEVA\r
+DELE1: TRZ     AUXFLG,DTAIN+CDRIN+TTYIN+PPTIN+MTAIN+DSKIN\r
+       PUSHJ   P,CHECK1        ;RESET INPUT DEVICE DESCRP\r
+       MOVEI   0,NAMTAB        ;FOR /R GET NEW NAME\r
+       HRLI    0,DTON          ;SET TO BLT OUTPUT DIRECT ENTRY\r
+       BLT     0,NAMTAB+3      ;TO NAMTAB\r
+\r
+       TRNN    AUXFLG,DTAIN+DSKIN\r
+       JRST    ERR5            ;NOT DTA OR DSK\r
+       PUSHJ   P,FNSET         ;SET UP CALFLG CORRECTLY\r
+IFN FTDSK,<TRNN        AUXFLG,DSKOUT   ;NO, HAS TO BE /D/ OR /R\r
+       JRST    DTD1            ;ON DSK\r
+       TRNN    FLAG,XFLG       ;OR DTA\r
+       JRST    DSKDR\r
+\r
+DTD1:\r
+       TRNE    FLAG,XFLG\r
+       TRNN    AUXFLG,DSKIN    ;DSK INPUT?>\r
+       JRST    DTADR           ;NO\r
+\r
+IFN FTDSK,<\r
+DTD1A: SETZM   NAMTAB          ;COLLECT NAMES FOR DX, DSK SOURCE\r
+       MOVE    T1,[XWD NAMTAB,NAMTAB+1]\r
+       BLT     T1,NAMTAB+23    ;FIRST CLEAR TABLE\r
+       MOVEI   T1,NAMTAB       ;LOCATION OF NAMTAB\r
+       MOVEM   T1,LOCNAM\r
+DTD4:  MOVE    0,FILNAM\r
+       JUMPE   0,ERR3AA        ;FN=0 ILLEGAL\r
+       MOVEM   0,(T1)          ;STORE FILE NAME FROM CS\r
+       MOVE    0,FILEX         ;STORE FILE EXT\r
+       MOVEM   0,12(T1)        ;TABLE FULL?\r
+       MOVEI   T2,NAMTAB+11\r
+       CAMN    T2,T1\r
+       SOS     ESWTCH          ;YES\r
+       SKIPE   ESWTCH          ;NO, END OF CS SCAN?\r
+       JRST    DTD2            ;END OF NAME PROCESSING\r
+       PUSHJ   P,DESCRP        ;NO, GET NEXT FILENAME FROM CS\r
+       MOVE    T2,ALLCLF\r
+       TRNE    T2,30\r
+       JRST    ERR5A\r
+       AOS     T1,LOCNAM\r
+       JRST    DTD4\r
+\r
+;END   OF CS OR NAMTAB FULL\r
+DTD2:  PUSHJ   P,ININIT        ;INIT INPUT FILE\r
+       MOVEI   T1,1            ;SET TO RETURN DTCOPY+1\r
+       JRST    DTD5>\r
+\f;ROUTINE      TO DELETE OR RENAME FILES ON DTA\r
+\r
+DTADR: PUSHJ   P,DTCHECK       ;GO GET DTA DIRECTORY\r
+       MOVE    T1,IBF          ;CURRENT INPUT BUFFER\r
+IFN WCH,<\r
+       USETO   OUT,1           ;TRY TO WRITE OUTPUT TAPE\r
+       >                       ;DETERMINE IF WRITE LOCKED\r
+IFE WCH,<\r
+       USETO   OUT,144>        ;THIS SHOULD GIVE ERRO MSG\r
+       OUTPUT  OUT,(T1)        ;IF DTA WRITE LOCKED\r
+       PUSHJ   P,DTCHECK       ;GO GET DTA DIRECTORY\r
+\r
+       PUSHJ   P,INFO          ;WRITE "FILES DELETED/RENAMED\r
+\r
+;*********************************************************************\r
+\r
+\r
+;LOOP TO DELETE/RENAME. FOR (DX) DELETE FILES FROM DTA DIR\r
+;THEN USE REVISED DIRECTORY TO COPY ALL REMAINING FILES\r
+\r
+\r
+DELE3: PUSHJ   P,LOOK          ;GET FILE TO DELETE OR RENAME FROM CS\r
+       JRST    DELES           ;NO MORE FILES\r
+       PUSHJ   P,INFO3         ;PRINT FILENAME-EXT\r
+       MOVE    T1,DIRST        ;GOT A MATCH - PROCESS IT\r
+       TRNE    FLAG,RFLG       ;AND IT IS AT (T5) IN (DTA) DIR\r
+       JRST    DTRNAM          ;RENAME\r
+IFN WCH,<\r
+        SKIPA   T2,T1\r
+        ADDI    T2,4\r
+        SKIPE   4(T2)\r
+        JRST    .-2\r
+        HRLS    T1\r
+        ADDI    T1,4            ;GET TO END OF NAMES\r
+        MOVSS   T1              ;BLOCK UP DIR\r
+        BLT     T1,-1(T2)       ;ZERO OUT LAST 4 WORDS\r
+        SETZM   (T2)\r
+        SETZM   1(T2)\r
+        SETZM   2(T2)\r
+        SETZM   3(T2)\r
+        MOVE    T1,DIRST1\r
+        MOVEM   T1,DIRST\r
+        JRST    DELE3>\r
+IFE WCH,<\r
+       SETZM   (T1)            ;DELETE FILENAME IN CORE DIRECT\r
+       SETZM   26(T1)          ;DELETE EXT\r
+       SUB     T1,DIRST1       ;GET FILE "NUMBER" (POS IN DIRECT)\r
+       MOVEI   T3,1102         ;TO LOOK AT ALL BLOCKS\r
+       MOVSI   T2,(POINT 5,0)\r
+       HRR     T2,DIRST1       ;TO CALCULATE ADDRESS OF FIRST WORD\r
+       SUBI    T2,122          ;OF BLOCK TABLE IN DIRECTORY\r
+DELE2: SOJLE   T3,DELE3        ;LOOK AT 1101 BLOCKS\r
+       ILDB    0,T2            ;GET BLOCK NUMBER\r
+       CAME    0,T1            ;IS IT SAME AS FILE "NUMBER"\r
+       JRST    DELE2           ;NO IGNORE\r
+       SETZM   0               ;FREE THE BLOCKS OF THIS FILE\r
+       DPB     0,T2            ;CLEAR OUT BLOCK NUMBER\r
+       JRST    DELE2>          ;LOOP ON 1102 BLOCKS\r
+DELES: MOVE    T1,IBF          ;LOC OF INPUT BUFFER\r
+       TRNE    FLAG,XFLG       ;DX SWITCH?\r
+       JRST    DTD6            ;YES, NOW MUST COPY REMAINING FILES\r
+IFN WCH,<\r
+        USETO   OUT,1>\r
+IFE WCH,<\r
+       USETO   OUT,144>\r
+       OUTPUT  OUT,(T1)                ;OUTPUT DTA DIRECTORY\r
+       RELEAS  CON,            ;OUTPUT DELETE OR RENAME INFO TO TTY\r
+       JRST    MAINB\r
+\f;ROUTINE TO RENAME FILE ON DECTAPE\r
+\r
+DTRNAM:        PUSHJ   P,RENAME\r
+       SETZM   DTON+2          ;MAKE MONITOR SUPPLY\r
+       SETZM   DTON+3          ;DATE TIME\r
+       LOOKUP  OUT,DTON        ;LOOK UP FILENAME-EXT ON OUTPUT DEV\r
+       SKIPA                   ;NO FILE ALREADY OF DESTINATION NAME\r
+       JRST    ERR9\r
+       MOVE    0,DTON          ;RENAME, FILENAME\r
+       MOVEM   0,(T1)          ;PUT IN DIRECTORY\r
+       MOVE    0,DTON+1        ;GET EXT\r
+IFE WCH,<\r
+       HLLM    0,26(T1)>       ;RENAME, EXT\r
+IFN WCH,<\r
+       HLLM    0,1(T1)>\r
+       JRST DELE3              ;RENAME DONE AT MAINB\r
+\r
+;END OF LOOP\r
+;*********************************************************************\r
+;DX SWITCH ON, COPY ALL BUT SPECIFIED FILES. I.E. THOSE NOT DELETED\r
+\r
+DTD6:  MOVEI   T1,0            ;SET TO RETURN TO DTCOPY\r
+DTD5:  MOVE    0,STAR\r
+       MOVEM   0,FILNAM        ;FORCE COPY-ALL\r
+       MOVEM   0,FILEX         ;BY MAKING FILE-EXT=*.*\r
+       PUSHJ   P,FNSET         ;FIND DETAILS OF FILE-EXT\r
+       TRNE    AUXFLG,DTAIN    ;DTA INPUT\r
+       PUSHJ   P,DTCH1         ;INIT DIRST,DIRST1\r
+IFN RIMSW,      <\r
+        TLNE    FLAG,RIMFLG     ;NO\r
+        JRST    RIMTB\r
+        >\r
+       JRST    DTCOPY(T1)\r
+\r
+;SET UP OUTPUT DIRECTORY ENTRY FOR RENAME\r
+;ONLY ONE FILE NAME ALLOWED, BUT MAY BE *.EXT OR FN.*\r
+\r
+RENAME:        SKIPL   ESWTCH          ;SKIP IF CR,LF SEEN IN C.S.\r
+       JRST    ERR6            ;ONLY 1 SOURCE FILE DESCIPTOR ALLOWED\r
+       HLRZ    0,NAMTAB+1      ;GET EXT\r
+       CAIN    0,(SIXBIT /*/)  ;USE SPEC. EXTENSION, BUT IF\r
+       HLRZ    0,ZRF+1         ;EXT.=*, USE SOURCE EXTENSION\r
+       HRLM    0,DTON+1        ;USE SPECIFIED EXT\r
+       MOVE    T2,NAMTAB       ;USE SPEC. FN, BUT IF\r
+       CAMN    T2,STAR         ;FN=* OR 0, USE SOURCE FILENAME\r
+       MOVE    T2,ZRF          ;SOURCE FILE NAME=DEST\r
+       MOVEM   T2,DTON         ;USE SPECIFIED FILENAME\r
+       POPJ    P,\r
+\r
+\r
+\f;THIS ROUTINE GETS NEXT FILENAME.EXT FROM CS\r
+;THEN SEES IF ONE IN DIRECTORY MATCHES\r
+;IF IT DOES - EXIT IS CPOPJ1\r
+;NO-MORE-FN.EX-TO-HANDLE-EXIT IS POPJ\r
+;PREPARE ZRF FOR A "LOOKUP" ON THE NEXT REQUESTED FILE.\r
+\r
+\r
+LOOK6D:        MOVEM   T4,ALLCLF\r
+LOOK:  MOVE    T3,ALLCLF       ;DOES FILNAM, FILEX CONTAIN\r
+       TRNE    T3,FNEX\r
+       JRST    LOOK6           ;A FILE TO THINK ABOUT? YES\r
+       PUSHJ   P,LOOKA         ;GET ONE (NOTE: DEVICE MAY ALTER)\r
+       POPJ    P,                      ;NONE, END OF CS\r
+\r
+       MOVE    T3,ALLCLF\r
+LOOK6: MOVE    T2,FILEX        ;GET FILE EXT INTO T2\r
+       SKIPN   T1,FILNAM       ;FILENAME AND EXT=0?\r
+       SKIPE   T2,FILEX\r
+       SKIPA                   ;EITHER FN OR EX N.E.0\r
+       JRST    LOOK7C          ;FN EX=0, ONE FILE COPY\r
+       CAME    T1,STAR         ;FILNAME OR EXT=*?\r
+       CAMN    T2,STAR\r
+       JRST    LOOK7A          ;FN OR EX=*, MANY FILES\r
+\r
+       TRNN    AUXFLG,DTAIN+DSKIN      ;DONT REQUIRE FILENAME\r
+       JRST    ERR3AA          ;HERE FOR 0.EX,FN.EX OR FN.0,0.EX ILLEGAL\r
+       JUMPE   T1,ERR3AA\r
+LOOK7B:        TRZ     T3,FNEX         ;IF HERE, ONLY ONE FILE WAS ENTAILED IN REQUEST.\r
+       MOVEM   T3,ALLCLF\r
+       TRNN    AUXFLG,DTAIN+DSKIN\r
+       JRST    LOOK4           ;GOT A FILE TO HANDLE\r
+\r
+LOOK8: PUSHJ   P,PICUP         ;GET A FILE (ANY) FROM DIRECTORY\r
+       JRST    LOOK2           ;WE GOT A FILE, DOES IT MATCH?\r
+       MOVE    T4,ALLCLF\r
+       TRZE    T4,FNEX         ;SET IF A PARTIC. FILE WAS REQUESTED?\r
+       JRST    LOOK6D          ;NO\r
+       TRC     FLAG,XFLG+DFLG  ;YES\r
+       TRCN    FLAG,XFLG+DFLG\r
+       JRST    LOOK\r
+       JRST    ERR3AA\r
+;CHECK IF FILE.EXT IN DIRECTORY MATCHES FILE TO /D,/R\r
+;NOTE WE MAY HAVE *.EXT,FIL.*, OR *.*\r
+\r
+\r
+LOOK2: MOVE    T4,ALLCLF       ;SHOULD FILENAMES MATCH\r
+       TRNN    T4,MATFN\r
+       JRST    LOOK3           ;NO\r
+       MOVE    T1,FILNAM       ;YES\r
+       CAME    T1,ZRF\r
+       JRST    LOOK8           ;NO MATCH\r
+\r
+LOOK3: TRNN    T4,MATEX        ;SHOULD EXTENSIONS MATCH\r
+       JRST    LOOK5A          ;NO\r
+       MOVE    T1,FILEX        ;YES\r
+       CAME    T1,ZRF+1\r
+       JRST    LOOK8           ;NO MATCH\r
+\r
+LOOK5A:        TRNN    AUXFLG,DSKIN    ;DSK INPUT?\r
+       JRST    LOOK4           ;NO\r
+LOOK4: TRO     AUXFLG,READ1    ;READY FOR FIRST READ\r
+       JRST    CPOPJ1          ;MATCH OR NO CARES\r
+\r
+;FILENAME OR EXT=*\r
+LOOK7A:        SKIPE   T2              ;EXT=0?\r
+       CAMN    T2,STAR         ;NO,\r
+       CAME    T1,STAR\r
+       SKIPA   \r
+       JRST    LOOK1           ;*.* ALWAYS O.K. AND *\r
+       TRNN    AUXFLG,DTAIN+DSKIN\r
+       JRST    ERR3AA          ;*.A OR * ON NON-DIRECT DEV\r
+       JRST    LOOK8\r
+\r
+LOOK7C:        TRNE    AUXFLG,DTAIN+DSKIN\r
+       JRST    ERR3AA          ;0.0 ON DIR DEVICE\r
+       SETZM   ZRF\r
+       SETZM   ZRF+1\r
+       JRST    LOOK7B          ;0.0 ON NON-DIR. DEV.\r
+\r
+LOOK1: TRNE    AUXFLG,DTAIN+DSKIN\r
+       JRST    LOOK8\r
+       SETZM   ZRF\r
+       SETZM   ZRF+1\r
+       JRST    LOOK4\r
+\f;ROUTINE TO GET NEXT FILE NAME FROM DIRECTORY\r
+;FILNAM, FILEX CONTAIN THE FILE NAME. EXT TO BE\r
+;MATCHED WITH DIR. NAMES. PUT SUGGESTED FILE\r
+;NAME EXT IN ZRF, ZRF+1 AND #P-P IN ZRF+3\r
+;NOTE THAT WE HAVE TO HANDLE *.EXT,FILE.*\r
+\r
+PICUP: \r
+IFN FTDSK,<TRNN        AUXFLG,DSKIN    ;DSK INPUT?\r
+       JRST    PICUP2          ;NO, DTA\r
+       SOSLE   UFDIN+2         ;YES\r
+       JRST    .+3\r
+PICUP1:        PUSHJ   P,UIN           ;INPUT USER'S FILE DIRECTORY\r
+       JRST    CPOPJ1          ;EOF ON DSK\r
+       ILDB    0,UFDIN+1       ;PICK UP FILENAME\r
+       JUMPE   0,PICUP1        ;IGNORE NULL\r
+       MOVEM   0,ZRF           ;SET FILE NAME\r
+       MOVE    0,FNPPN\r
+       MOVEM   0,ZRF+3         ;SET DSK #P-P\r
+       SOS     UFDIN+2         ;COUNT DONE FOR NEXT TIME\r
+       ILDB    0,UFDIN+1       ;SET FILE EX\r
+       HLLZM   0,ZRF+1\r
+IFN DISK30,<\r
+        IBP     UFDIN+1         ;INCREMENT POINTER TO GET PROJ,PROG #\r
+        IBP     UFDIN+1>\r
+       POPJ    P,>\r
+\r
+PICUP2:\r
+IFN WCH,<\r
+        MOVE    T5,DIRST        ;DIRST=LOC 4 FIRST TIME THRU\r
+        ADDI    T5,4            ;CALCULATE FIRST/NEXT FILENAME\r
+        MOVEM   T5,DIRST\r
+        MOVE    0,(T5)\r
+        JUMPE   0,CPOPJ1                ;NO MORE FILENAMES IN DIRECTORY\r
+        MOVEM   0,ZRF\r
+        MOVE    0,1(T5)>\r
+IFE WCH,<\r
+       MOVE    T3,DIRST1       ;SETUP TO CHECK ALL FILENAME SLOTS\r
+       ADDI    T3,26           ;IN DIRECTORY (22 FILE NAMES)\r
+       MOVE    T5,DIRST        ;LOC OF FIRST/NEXT FILE\r
+PICUP4:        ADDI    T5,1            ;\r
+       CAMLE   T5,T3           ;END OF FILE SLOTS?\r
+       JRST    CPOPJ1          ;END OF FILE NAMES\r
+       MOVEM   T5,DIRST        ;NEXT SLOT TO LOOK AT\r
+       MOVE    0,(T5)          ;GOT FILE NAME FROM DIRECT\r
+       JUMPE   0,PICUP4        ;IGNORE IF 0\r
+       MOVEM   0,ZRF\r
+       MOVE    0,26(T5)>       ;GET EXT ETC\r
+       HLLZM   0,ZRF+1\r
+       POPJ    P,\r
+\r
+\f;READ DTA DIR. AND PREPARE T5 TO PICK UP FIRST ENTRY.\r
+DTADIR:        PUSHJ   P,DTCH2         ;READ DTA DIR INTO INPUT BUF\r
+DTADI1:        MOVEI   T3,DBUF         ;SET BLT FROM INBUF TO DBUF\r
+       HRL     T3,T5           ;FIRST DATA WORD OF DIRECTORY IN T5\r
+IFN WCH,<\r
+        MOVNS   T2\r
+        BLT     T3,DBUF+176(T2)\r
+        SETZM   DBUF+177(T2)\r
+        MOVEI   T5,DBUF-4>\r
+IFE WCH,<\r
+       BLT     T3,DBUF+176     ;MOVE FROM INBUF TO DBUF\r
+       MOVEI   T5,DBUF+123-1>  ;LOC OF FIRST FILE NAME\r
+       MOVEM   T5,DIRST        ;T5 POINTS TO FILENAME JUST HANDLED\r
+       MOVEM   T5,DIRST1       ;TO RESTORE DIRST\r
+       POPJ    P,              ;(IE NONE BUT NEXT WILL BE FIRST)\r
+\r
+\f\r
+;ROUTINE TO OUTPUT FILENAMES THAT WERE DELETED OR RENAMED\r
+;PRINT "FILES DELETED:" OR "FILES RENAMED:"\r
+;ALSO USED TO PRINT "NO FILE NAMED XXX.XXX"\r
+\r
+\r
+INFO:  MOVEI   T1,LBUF         ;SET UP TTY FOR OUTPUT\r
+       EXCH    T1,JOBFF        ;SAVE BUFFER LOCS\r
+INFO0: INIT    CON,1\r
+       SIXBIT  /TTY/\r
+       XWD     TFO,0\r
+       HALT    INFO0\r
+       OUTBUF  CON,T1\r
+       MOVEM   T1,JOBFF\r
+       OUTPUT  CON,\r
+       TRNN    FLAG,DFLG       ;DELETE?\r
+       JRST    INFO1           ;NO, MUST BE RENAME\r
+       ERRPN2  </FILES DELETED:/>\r
+       JRST    INFO2\r
+INFO1: ERRPN2  </FILES RENAMED:/>\r
+INFO2: MOVEI   CHR,CR          ;OUTPUT CR/LF\r
+       PUSHJ   P,PUTCON        ;ON TTY\r
+       MOVEI   CHR,LF\r
+       JRST    PUTCON\r
+\r
+;**********************************************************************\r
+;PRINT FILENAME.EXT OR [P,P].UFD OF FILE DELETED\r
+\r
+INFO3: MOVEI   T6,ZRF          ;LOCATION OF FILENAME\r
+       PUSHJ   P,FN.EX\r
+       JRST    INFO2\r
+\f;/X OR /D. FIND OUT DETAILS OF FILE NAME AND\r
+;EXTENSION (0 FN.EX=*.*) AND ANY CHANGE IN\r
+;SOURCE DEV. SET BITS IN CALFLG.\r
+\r
+FNSET: MOVEI   T3,1            ;CLEAR FLAGS ON ENTRY\r
+       MOVE    0,STAR          ;* TO AC0\r
+       CAME    0,FILNAM        ;FILNAME=* OR 0?\r
+       SKIPN   FILNAM\r
+       SKIPA                   ;FILENAME = * OR 0\r
+       TRO     T3,MATFN        ;FILENAME MUST BE MATCHED\r
+       SKIPN   FILEX           ;EXT=0?\r
+       TRNN    AUXFLG,MTAIN+CDRIN+PPTIN+TTYIN ;YES\r
+       CAMN    0,FILEX         ;NO, EXT = *?\r
+       SKIPA                   ;YES\r
+       TRO     T3,MATEX        ;FILE EXTENSION MUST BE MATCHED\r
+IFN FTDSK,<TRNN        AUXFLG,DSKIN\r
+       JRST    FNSET1\r
+       SKIPN   T2,PP\r
+       JRST    FNSET2          ;IF #P-P=0 IT IS COUNTED AS UNCHANGED\r
+       CAME    T2,FNPPN\r
+       TRO     T3,NEWPP        ;CHANGE IN # P-P\r
+       JRST    FNSET1\r
+FNSET2:        MOVE    T2,FNPPN        ;IF P-P#=0, SET TO PREVIOUS VALUE\r
+       MOVEM   T2,PP>\r
+FNSET1:        MOVE    T2,DEVICE\r
+       CAME    T2,DEVA\r
+       TRO     T3,NEWDEV       ;CHANGE IN SOURCE DEV.\r
+       MOVEM   T2,DEVA         ;SET DEVA=DEVICE\r
+       MOVEM   T3,ALLCLF\r
+       POPJ    P,\r
+\f;POPJ EXIT IF END OF COMMAND STRING, OTHERWISE RESET\r
+;POINTER TO START OF DIRECTORY, READING IN NEW DIR.\r
+;IF DEV OR #P-P CHANGED (EXIT CPOPJ1)\r
+;IF DIR. IS ON DSK RESET BY REINIT.\r
+\r
+LOOKA: SKIPE   T4,ESWTCH       ;MORE C.S.?\r
+       POPJ    P,              ;NO\r
+       PUSHJ   P,DESCRP        ;YES, GET NEXT FN.EX FROM CS\r
+       PUSHJ   P,INLOOK        ;CHECK FOR MTA REQUESTS, MODE\r
+       PUSHJ   P,M4            ;CHECK FOR /I,/B,/H\r
+       HRRZM   T4,ININI1       ;SET MODE\r
+       MOVE    T3,ALLCLF\r
+       RELEAS  DIR,\r
+       TRNN    AUXFLG,MTAIN+CDRIN+PPTIN+TTYIN  ;NON-DIR DEVICE?\r
+       JRST    LOOKF\r
+\r
+       TRNE    T3,MATEX!MATFN  ;YES, NO FN EX BUT *.* OR * ALLOWED\r
+       JRST    ERR6\r
+\r
+LOOKF: TRNN    FLAG,DFLG       ;FOR DELETE, ONE SOURCE FILE\r
+       JRST    LOOKB           ;...\r
+\r
+       TRNE    T3,NEWDEV!NEWPP ;ONLY IS PERMITTED\r
+       JRST    ERR5A\r
+\r
+LOOKB: TRNN    T3,NEWDEV!NEWPP ;PREPARE TO LOOK FOR NEW FILE\r
+       JRST    LOOKC           ;NAME AT HEAD OF DIRECTORY\r
+\r
+       PUSHJ   P,ININIT        ;INIT INPUT FILE\r
+       TRNN    AUXFLG,DTAIN+DSKIN\r
+       JRST    CPOPJ1\r
+IFN FTDSK,<TRNN        AUXFLG,DTAIN    ;DTA INPUT?\r
+       JRST    LOOKD           ;NO, MUST BE DSK>\r
+       PUSHJ   P,DTADIR        ;YES, READ IN DTA DIRECTORY\r
+\r
+LOOKC:\r
+IFN FTDSK,<TRNE        AUXFLG,DSKIN    ;DSK INPUT?\r
+       JRST    LOOKD           ;YES>\r
+       MOVE    T5,DIRST1       ;NO, RESET DIRECTORY START\r
+       MOVEM   T5,DIRST\r
+       JRST    CPOPJ1\r
+\r
+IFN FTDSK,<\r
+LOOKD: PUSHJ   P,DSKDIR        ;GET USER'S FILE DIRECTORY\r
+       SETZM   UFDIN+2         ;DSK DIR BUF EMPTY\r
+       JRST    CPOPJ1>\r
+\f;ROUTINE TO LIST DTA OR DSK DIRECTORIES\r
+\r
+\r
+DTPDIR:        ENTER   OUT,DTON        ;OUTPUT DEV,NROCT ENTRY\r
+       JRST    ERR4            ;DIRECTORY FULL\r
+IFN FTDSK,<TRNE        AUXFLG,FFLG     ;/F? SHORT FORM?\r
+       SKIPE   DEVICE          ;INPUT DEVICE SPECIFIED?\r
+       JRST    PDIR1A          ;YES\r
+       HRRZI   0,(SIXBIT /DSK/) ;ASSUME DSK IF NO DEVICE GIVEN\r
+       HRLZM   0,DEVICE\r
+       TRO     AUXFLG,DSKIN    ;SET DSK INPUT\r
+PDIR1A:        TRNE    AUXFLG,DSKIN    ;DSK INPUT?\r
+       JRST    DSKLST          ;YES, GO AND TRY TO LIST DSK>\r
+       TRNN    AUXFLG,DTAIN    ;DECTAPE INPUT?\r
+       JRST    ERR5            ;NOT DSK OR DTA. ERROR\r
+\r
+;ROUTINE TO LIST DTA DIRECTORY. /L OR /F SWITCH\r
+\r
+DTALST:        PUSHJ   P,DTCHECK       ;CHECK FOR DTA INPUT-MUST BE DECTAPE AND\r
+                               ;GET DIRECTORY\r
+       PUSHJ   P,CRLF          ;PRINT NO. OF FREE BLOCKS LEFT\r
+PDIR1B:\r
+IFN WCH,<\r
+       MOVE    T1,IBF\r
+       HLRZ    DOUT,1(T1)      ;GET FREE BLOCK POINTER\r
+       MOVNS   DOUT\r
+       ADDI    DOUT,1101       ;GET NO. OF FREE BLOCKS LESS FREE BLOCK NO.\r
+       PUSHJ   P,OUTDEC        ;PRINT RESULT>\r
+IFE WCH,<\r
+       SETZM   DOUT            ;CLEAR NO. FREE BLOCKS\r
+       MOVEI   T4,1102         ;OCTAL NO. OF BLOCKS ON DECTAPE\r
+       MOVSI   T1,(POINT 5,0)  ;5 BIT BYTES\r
+       HRRZ    T5,IBF          ;CURRENT INPUT BUFFER\r
+       ADDI    T1,1(T5)        ;POINTER TO 1ST DATA WORD IN DIRECT\r
+\r
+\r
+PDIR8: SOJLE   T4,PDIR1        ;ALL THROUGH?\r
+       ILDB    T3,T1           ;CALCULATE NO. OF FREE BLOCKS\r
+       JUMPN   T3,PDIR8\r
+\r
+                               ;THIS BLOCK FULL\r
+       AOJA    DOUT,PDIR8      ;COUNT NO. WITH ZERO IN\r
+PDIR1: PUSHJ   P,OUTDEC        ;PRINT RESULT>\r
+       MOVE    0,[POINT 6,PDIR7]\r
+       MOVEI   T2,^D18         ;SET LOOP TO DEPOSIT 18 CHARS\r
+       PUSHJ   P,PDIR2         ;PRINT "FREE BLOCKS LEFT" MESSAGE\r
+       PUSHJ   P,CRLF          ;CARRIAGE RET, LINEFEED\r
+       PUSHJ   P,DTCH1         ;FIX T5, TO POINT AT BEGIN OF DIR\r
+\f;LOOP TO EXAMINE FILE NAMES DTA DIRECTORY\r
+PDIR4: \r
+IFE WCH,<\r
+       SKIPN 123(T5)           ;NULL (=0) FILE NAME?\r
+       JRST PDIR6              ;YES SO LOOK FOR ANOTHER>\r
+IFN WCH,<\r
+        SKIPN   (T5)            ;NULL (=0) FILE NAME?\r
+        JRST    MAIN1           ;YES, SO END OF DIR.>\r
+       MOVEI T2,6              ;TRANSMIT UP TO 6 CHARACTERS\r
+       MOVSI 0,440600+T5       ;SET UP SOURCE BYTE POINTER\r
+IFE WCH,<\r
+       HRRI 0,123>             ;SET UP PICK UP FILE NAME\r
+       SETZM T4\r
+;FOLLOWING CODE TO OUTPUT PROJ, PROG FILENAME\r
+;*****************************************************************\r
+IFE WCH,<\r
+       HLRZ CHR,151(T5)        ;GET EXT\r
+       CAIE CHR,(SIXBIT /UFD/)         ;UFD?\r
+       JRST PDIR4A             ;NO\r
+\r
+       HLRZ DOUT,123(T5)       ;PROJ NO.\r
+       MOVEI T2,PUT\r
+       PUSHJ P,OUTOCT\r
+\r
+       MOVEI CHR,COMMA         ;COMMA\r
+       PUSHJ P,PUT\r
+\r
+       HRRZ DOUT,123(T5)       ;PROG NO.\r
+       PUSHJ P,OUTOCT\r
+       JRST PDIR4B\r
+       >\r
+;*********************************************************************\r
+PDIR4A:        PUSHJ   P,PDIR2         ;OUTPUT 6-BIT DATA AND INCR DIRECTRORY PTR\r
+IFE WCH,<\r
+PDIR4B:        HLLZ    CHR,151(T5)>    ;PICK UP EXTENSION\r
+IFN WCH,<\r
+        HLLZ   CHR,(T5)>\r
+       MOVSI   0,440600+T5     ;SET BYTE POINTER\r
+IFE WCH,<\r
+       HRRI    0,151>          ;PICK UP EXTENSION\r
+       MOVEI   T2,4            ;PRINT UP TO 4 CHRS. (PERIOD+3*EXT)\r
+       JUMPN   CHR,.+3         ;EXTENSION NULL?\r
+       PUSHJ   P,PDIR2A+1      ;YES\r
+       JRST    .+3             ;NO\r
+       MOVEI   CHR,PERIOD-40   ;NO, SO PRINT A PERIOD\r
+PDIR3: PUSHJ   P,PDIR2A        ;OUTPT 6 BIT OR INCR T5\r
+IFE WCH,<\r
+       MOVEI   CHR,SPACE       ;OUTPUT 2 SPACES\r
+       PUSHJ   P,PUT\r
+       PUSHJ   P,PUT\r
+       TRNE AUXFLG,FFLG        ;SHORT FORM DIRECT ?\r
+       JRST PDIR3A             ;YES VJC 4/16/69\r
+\r
+       SETZM   DOUT            ;CALCULATE NBR OF BLOCK PER FILE\r
+       MOVEI   T4,1101\r
+       MOVSI   0,(POINT 5,0)\r
+       HRRZ    T2,IBF\r
+       ADDI    0,1(T2)\r
+       HRRZ    T7,T5\r
+       SUBI    T7,(T2)\r
+       ILDB    T6,0            ;LOAD CONTENTS OF S.A.T. BLOCK\r
+       CAMN    T6,T7           ;COMPARE WITH FILE SLOT NBR\r
+       ADDI    DOUT,1          ;ADD 1 TO COUNT IF EQUAL\r
+       SOJG    T4,.-3\r
+       PUSHJ   P,OUTDEC        ;OUTPUT NBR OF BLOCKS PER FILE\r
+       MOVEI   CHR,TAB\r
+>\r
+IFN WCH,<\r
+        AOJ     T5,             ;STEP DIR. POINTER\r
+        MOVEI   CHR,11\r
+        PUSHJ   P,PUT           ;OUTPUT A TAB\r
+        CAIG    T4,7>\r
+       PUSHJ P,PUT\r
+PDIR3B:        \r
+IFE WCH,<\r
+       MOVE    0,151(T5)       ;GET ENTRY DATE>\r
+IFN WCH,<\r
+       MOVE    0,-1(T5)        ;GET ENTRY DATE>\r
+       ANDI    0,7777          ;LEFT BITS ARE IRRELEVENT\r
+       PUSHJ   P,DATOUT        ;OUTPUT THE DATE\r
+PDIR3A:        PUSHJ   P,CRLF          ;GIVE CR,LF\r
+IFN WCH,<\r
+       AOJA    T5,PDIR4        ;PROCESS NEXT ENTRY>\r
+IFE WCH,<\r
+PDIR6: HRRZ    T1,IBF          ;PROCESS NEXT ENTRY\r
+       SUBM    T5,1\r
+       CAIL    T1,26           ;FILE "NUMBER" OK?\r
+       JRST    MAIN1           ;NO, END OF ENTRIES\r
+       AOJA    T5,PDIR4        ;END OF LOOP, GET NEXT FILENAME>\r
+\r
+CRLF:  MOVEI   CHR,CR          ;OUTPUT CAR. RET.\r
+       PUSHJ   P,PUT\r
+       MOVEI   CHR,LF          ;LINE FEED\r
+       JRST    PUT\r
+\r
+PDIR2: ILDB    CHR,0           ;ROUTINE TO OUTPUT 6-BIT DATA\r
+       TRNN    0,-1            ;PRINT SPACES WHEN PRINTING THE FREE BLOCKS\r
+PDIR2A:        JUMPE   CHR,PDIR21      ;TERMINATE ON SPACE\r
+       ADDI    CHR,40          ;CONVERT TO 7 BIT\r
+       PUSHJ   P,PUT           ;OUTPUT CHARACTER\r
+       ADDI    T4,1\r
+       SOJG    T2,PDIR2        ;COUNT DOWN MAX-CHARS COUNTER\r
+IFN    WCH,<\r
+PDIR21:        AOJA    T5,CPOPJ        ;STEP AND CONTINUE>\r
+IFE    WCH,<\r
+PDIR21:        POPJ    P,              ;CONTINUE>\r
+PDIR7: SIXBIT  /. FREE BLOCKS LEFT/\r
+;OUTPUT THE DATE FOUND IN AC 0.\r
+\r
+DATOUT:        MOVEI T2,PUT            ;PUT CHAR IN OUT\r
+       IDIVI 0,^D31\r
+       MOVEI T3,1(1)\r
+       IDIVI 0,^D12\r
+       MOVE DOUT,T3            ;DOUT=DAY\r
+       PUSHJ P,OUTDC1          ;PRINT DAY\r
+       PUSHJ P,DATO2           ;PRINT -MONTH-\r
+       MOVE DOUT,0\r
+       ADDI DOUT,^D64          ;DOUT=YEAR\r
+OUTDC1:        SKIPA DOUT+1,TWL        ;RADIX 10\r
+;*******************************************************************\r
+;ROUTINE TO CONVERT OCTAL TO ASCII\r
+;DOUT CONTAINS OCTAL VALUE ON ENTRY\r
+\r
+OUTOCT:        MOVEI DOUT+1,10         ;RADIX 8\r
+PRNUMA:        HRRZM DOUT+1,T4\r
+       MOVEI CHR,"0"\r
+       CAMGE DOUT,DOUT+1       ;PRINT AT LEAST 2 DIGITS\r
+       PUSHJ P,(T2)            ;PUT OR PUTCON\r
+PRN:   IDIVI DOUT,(T4)         ;DIVIDE BY RADIX\r
+       HRLM DOUT+1,(P)         ;SAVE NO. FOR PRINT\r
+       SKIPE DOUT              ;ENUF DIGITS\r
+       PUSHJ P,PRN             ;NO, GET MORE\r
+       HLRZ CHR,(P)            ;YES, GET LEFTMOST\r
+       ADDI CHR,60             ;CONVERT TO ASCII\r
+       JRST (T2)               ;PUT OR PUTCON\r
+\r
+OUTDEC:        MOVEI T2,PUT            ;PUT CHAR IN OUT BUF\r
+       JRST OUTDC1\r
+\r
+DATO2: MOVEI T4,5\r
+       MOVE T6,MNPT\r
+       ADDM T1,T6\r
+       ILDB CHR,T6\r
+       PUSHJ P,(T2)            ;PUT OR PUTCON\r
+       SOJG T4,.-2\r
+       POPJ P,\r
+\f;READ DTA DIRECTORY AND INITIALIZE DIRST AND DIRST1\r
+\r
+DTCHECK:PUSHJ P,ININIT ;INITIALIZE INPUT DEVICE\r
+DTCH2:\r
+IFN WCH,<\r
+       USETI IN,1      ;GET DTA DIR>\r
+IFE WCH,<\r
+       USETI IN,144    ;GET DTA DIR>\r
+       PUSHJ P,INP     ;INPUT DIRECTORY\r
+IFN WCH,<\r
+DTCH1:  MOVE T5,IBF\r
+        HRRZ T2,1(T5)\r
+        ADDI T5,1(T2)   ;GET ADD. OF FIRST ENTRY\r
+        MOVE 0,T5\r
+        SUBI 0,4>\r
+IFE WCH,<\r
+DTCH1: HRRZ T5,IBF     ;LOC. OF CURRENT BUF, 2ND WORD\r
+       MOVEI 0,123(T5) ;83 WORDS,7, FIVE-BIT BYTES\r
+       ADDI T5,1       ;COMPUTE ADD. OF DIR. START>\r
+       MOVEM 0,DIRST   ;FIRST FILE NAME LOC\r
+       MOVEM 0,DIRST1  ;TO RESTORE DIRST\r
+       POPJ P,\r
+\r
+;ROUTINE TO CHECK BRACKET COUNT/MATCHING\r
+\r
+OUTCHK:        SETZB T3,TLBRKT ;COUNT <> ON THIS LINE, CLEAR THINGS\r
+       MOVE T1,OPTRA   ;BYTE POINTER FOR READING OUT THE LINE\r
+OUTCH2:        CAMN T1,OPTR    ;LINE DONE?\r
+       JRST OUTCH3     ;YES, SO DECIDE WHETHER TO PRINT\r
+       ILDB T2,T1      ;GET CHAR\r
+       CAIN T2,"<"     ;LEFT BRACKET?\r
+       AOS TLBRKT      ;YES, SO INCREMENT BRACKET COUNT\r
+       CAIN T2,">"     ;RIGHT BRACKET?\r
+       SOSL TLBRKT     ;YES, SUBRACT BRACKET COUNT, GONE NEG?\r
+       JRST OUTCH2     ;NO, SO DO NEXT CHAR\r
+       AOJA T3,OUTCH2  ;YES, SO FLAG COUNT GONE NEG.\r
+\r
+OUTCH3:        SKIPN T2,TLBRKT ;BRACKET COUNT OFF THIS LINE?\r
+       JUMPE T3,CPOPJ  ;NO, WENT NEG.?\r
+       ADDM T2,TOTBRK  ;YES, SO ADD INTO CUMULATIVE COUNT\r
+       MOVEI CHR,"-"   ;PRINT MINUS FOR NEG TOTAL\r
+       SKIPGE TOTBRK\r
+       PUSHJ P,PUT\r
+       MOVM DOUT,TOTBRK;PRINT MAGNITUDE OF TOTAL\r
+       PUSHJ P,OUTDEC\r
+       MOVEI CHR,TAB   ;FOLLOW WITH TAB\r
+       PUSHJ P,PUT\r
+       JRST OUTCH1     ;AND PRINT THE LINE\r
+\fFILTYP:       TDNE FLAG,[XWD IFLG+IBFLG,BMOD]\r
+       POPJ P,                 ;BIN MODE DON'T CARE IF DMP, ETC\r
+FILL1: TLZ AUXFLG,SBIN         ;IS\r
+       HLRZ 0,ZRF+1            ; INPUT EXTENSION\r
+       CAIE 0,(SIXBIT /DMP/)   ;DMP?\r
+IFE DISK30,<CAIN 0,(SIXBIT /SAV/)      ;SAV?>\r
+IFN DISK30,<CAIN 0,(SIXBIT /SVE/)>\r
+       JRST FIL3               ;YES\r
+       CAIE 0,(SIXBIT /CHN/)   ;CHN?\r
+       CAIN 0,(SIXBIT /REL/)   ;REL?\r
+       JRST FIL3               ;YES\r
+       TRNN FLAG,XFLG          ;DO NORMAL PROCESSING ON ALL\r
+       JRST FIL2               ;BUT DMP ETC FILES IF NOT /X\r
+       TLNN AUXFLG,CDRFLG\r
+       TDNE FLAG,[XWD PFLG+IFLG+IBFLG,LINE+BMOD+TBMOD+NSMOD+SQMOD+SPMOD]\r
+       POPJ P,                 ;NO SIGNIFICANT SWITCHES\r
+FILL:  HRLZI 0,004400          ;FORCE 36-BIT\r
+       HLLM 0,IBF+1            ;INPUT BYTE POINTER\r
+       HLLM 0,OBF+1            ;OUTPUT BYTE POINTER\r
+       POPJ P,                 ;CHANGE TO FORCED BINARY\r
+FIL3:  TLO AUXFLG,SBIN         ;INPUT EXT = DMP,SAV,CHN,REL\r
+       TRNE FLAG,XFLG\r
+       JRST FILL\r
+       TLON AUXFLG,FRSTIN      ;NOT /X TEST FURTHER\r
+       JRST FIL4               ;IS THIS FIRST SOURCE, YES\r
+       TLOE AUXFLG,RSDCFL      ;NOT FIRST, WAS PERVIOS FILE RSCD?\r
+       JRST    FIL5            ;YES, NO CHANGE UNLESS DEVICE HAS CHANGED\r
+       OUTPUT OUT,             ;NO CHANGE TO 36-BIT\r
+       MOVE 0,OBF+2            ;CURRENTLY 7-BUT I/O, MUST CHANGE TO 36 BIT\r
+                               ;OUTPUT CURRENT BUFFER\r
+       IDIVI 0,5               ;DIVIDE OBF+2 BY 5 (CHAR. COUNT)\r
+       MOVEM 0,OBF+2\r
+       JRST FILL\r
+FIL2:  TLOE AUXFLG,FRSTIN      ;NOT A RSCD FILE\r
+       TLZN AUXFLG,RSDCFL      ;NO, WAS PREV. FILE RSCD?\r
+       POPJ P,                 ;NO, NO CHANGE\r
+       OUTPUT OUT,             ;YES, CHANGE 36-BIT TO 7-BIT\r
+       MOVEI 0,5\r
+       IMULM 0,OBF+2\r
+       MOVE 0,SVIBF            ;RESTORE 7-BIT\r
+       HLLM 0,IBF+1\r
+       MOVE 0,SVOBF\r
+       HLLM 0,OBF+1\r
+       POPJ P,\r
+FIL4:  TLO AUXFLG,RSDCFL       ;SET REL,SAV,DMP,CHN FLAG\r
+       JRST FILL\r
+FIL5:  MOVE T1,ALLCLF\r
+       HRLZI 0,004400          ;NEW DEVICE, SET 36-BIT INPUT\r
+       TRNE T1,NEWDEV          ;SOURCE DEVICE CHANGED\r
+       HLLM 0,IBF+1\r
+       POPJ P,                 ;OUTPUT ALREADY SET\r
+\fSUBTTL BLOCK 0 CODE\r
+\r
+IFE BLOC0,<\r
+IFE WCH,<;THIS CODE COPIES BLOCK 0,1,2 ONLY. I/O MUST BE DECTAPE.>\r
+IFN WCH,<;THIS CODE COPIES BLOCK 0 ONLY. I/O MUST BE DECTAPE.>\r
+;MODE SELECTED MUST BE BIT 100, 20 AND NOT DUMP MODE (134).\r
+\r
+BLOCK0:        TRC AUXFLG,DTAIN+DTAOUT\r
+       TRCE AUXFLG,DTAIN+DTAOUT;FORCE DTA I/O\r
+       JRST ERR7A\r
+       MOVEI 0,134\r
+       MOVEM 0,OMOD\r
+       MOVEM 0,ININI1\r
+       MOVSI 0,OBF\r
+       MOVEM 0,ODEV+1\r
+       MOVEI 0,IBF\r
+       MOVEM 0,DEVICE+1\r
+       OPEN OUT,OMOD\r
+       JRST ERR1               ;UNAVAILABLE\r
+       OUTBUF OUT,1\r
+       OUTPUT OUT,\r
+       OPEN IN,ININI1\r
+       JRST ERR1A\r
+       INBUF IN,1\r
+       SETZB T1,BL0CNT\r
+BL4:   USETI IN,(T1)\r
+       INPUT IN,               ;READ\r
+       GETSTS IN,IOS\r
+       TRNN IOS,740000         ;ANY ERRORS\r
+       JRST BL1                ;NO\r
+       JSP T5,INICN2\r
+       PUSHJ P,QUEST\r
+       ERRPN2 </INPUT DEVICE />\r
+       PUSHJ P,P6BIT\r
+               DEVICE\r
+       ERRPN2 </: />\r
+       MOVE T2,AUXFLG          ;DECTAPE FOR ERROR MESSAGE\r
+       ANDI T2,DTAIN\r
+       PUSHJ P,IOERR           ;PRINT ERROR TYPE\r
+BL1:   HRLZ T5,IBF+1\r
+       HRR T5,OBF+1\r
+       MOVEI T4,177(T5)\r
+       BLT T5,(T4)             ;SHIFT DATA TO OUTPUT BUFFER\r
+       USETO OUT,@BL0CNT\r
+       OUTPUT OUT,             ;WRITE BLOCK\r
+       PUSHJ P,OUTP1           ;CHECK ERRORS\r
+IFE WCH,<\r
+       AOS T1,BL0CNT\r
+       CAIGE T1,3\r
+       JRST BL4>\r
+BL3:   RELEAS OUT,             ;IF ANY, PDL IS RESET\r
+       JRST PIP2>\r
+\r
+IFN BLOC0,<\r
+BLOCK0:        ERRPNT  </?No block 0 copy!/>\r
+                >\r
+\fSUBTTL        MAGTAPE ROUTINES\r
+\r
+;TEST TO SEE IF MORE THAN ONE OF THE LOWEST EIGHT MTA FLAGS\r
+;HAVE BEEN SELECTED. IF SO ERROR. OTHERWISE, IMPLEMENT\r
+;REQUEST.  T1, T3, T6 SET AT ENTRY BY INLOOK OR OUTLOOK\r
+;TO EQUAL AUX/AUXOUT, AB/ABOUT,INIMTA/INOMTA\r
+\r
+MT1:   HRRZ T2,T1              ;T1 CONTAINS REQUEST\r
+       ANDI T2,-1(T2)          ;KNOCK OFF RIGHT MOST 1\r
+       TRNE T2,377\r
+       JRST MTR1               ;PRINT ERROR MESSAGE\r
+\r
+       TRNN T1,MTAFLG+MTBFLG+MTWFLG+MTTFLG+MTFFLG+MTUFLG+MTDFLG+MTPFLG\r
+       JRST MTC1\r
+       PUSHJ P,(T6)            ;THERE IS A  REQUEST\r
+                               ;GO TO INIMTA/INOMTA\r
+\r
+;PERFORM POSITIONING REQUESSTS\r
+       TRNE T1,MTUFLG\r
+       JRST UNLOAD\r
+\r
+       TRNE T1,MTWFLG\r
+       JRST REWIND\r
+\r
+       TRNE T1,MTFFLG\r
+       JRST MARKF\r
+\r
+       TRNE T1,MTTFLG\r
+       JRST SLEOT\r
+\r
+       TRNE T1,MTBFLG+MTPFLG   ;MULTIPLE REQUESTS ALLOWD\r
+       JRST BSPF\r
+\r
+       TRNE T1,MTDFLG+MTAFLG   ;MULTIPLE REQUESTS ALLOWD\r
+       JRST ADVF\r
+\r
+\f;T1=AUX,AUXOUT. T3=AB,ABOUT.  T6=INIMTA,INOMTA.\r
+\r
+MTCONT:        RELEAS TAPE,\r
+       TRNN T1,MTUFLG          ;UNLOAD?\r
+       SKIPE NSWTCH            ;IS THERE AN INPUT DEVICE?\r
+       CAIE T6,INOMTA          ;OUTPUT TAPE?\r
+       POPJ P,                 ;NO\r
+       JRST PIP2               ;YES, END OF COMMAND\r
+\r
+;ROUTINE TO CHECK AND SET DENSITY FOR NEW DEVICE\r
+\r
+MTC1:  MOVE T4,T1              ;GET AUX/AUXOUT\r
+       ANDI T4,MT2FLG+MT5FLG+MT8FLG\r
+       ANDI T4,-1(T4)          ;REMOVE RIGHT MOST 1\r
+       JUMPN T4,MTR1           ;MORE THAN 1 REQ, ERROR\r
+\r
+       MOVEI T4,1              ;ASCII LINE STANDARD MODE\r
+\r
+       TRNE T1,MT2FLG\r
+       TRO T4,DENS2            ;SET 200 BPI\r
+\r
+       TRNE T1,MT5FLG\r
+       TRO T4,DENS5            ;SET 556 BPI\r
+\r
+       TRNE T1,MT8FLG\r
+       TRO T4,DENS8            ;SET 800 BPI\r
+\r
+       TRNE T1,MTEFLG\r
+       TRO T4,PARE             ;EVEN PARITY\r
+\r
+       POPJ P,\r
+\r
+\f;REWIND AND UNLOAD\r
+\r
+UNLOAD:        MTAPE TAPE,11\r
+       JRST MTCONT\r
+\r
+;REWIND ONLY\r
+\r
+REWIND:        MTAPE TAPE,1\r
+MTWAIT:        WAIT TAPE,0\r
+       JRST MTCONT\r
+\r
+\r
+\r
+;MARK END OF FILE\r
+\r
+MARKF: MOVE T5,MTANAM\r
+       EXCH T5,ODEV\r
+       MTAPE TAPE,3\r
+       GETSTS TAPE,IOS\r
+       PUSHJ P,OUTP3\r
+       SETSTS TAPE,(IOS)\r
+       MOVEM T5,ODEV\r
+       JRST MTCONT\r
+\r
+\r
+\r
+;SKIP TO LOGICAL END OF TAPE.\r
+\r
+SLEOT: MTAPE TAPE,10\r
+       JRST MTWAIT\r
+\f;BACKSPACE MTA 1 FILE, T3=AB OR ABOUT\r
+;AB/ABOUT = INPUT/OUTPUT DEVICE\r
+\r
+BSPF:  HRRZ T3,T3      ;T3=NO. OF FILES/RECORDS TO BACK\r
+BSPF2: WAIT TAPE,      ;WAIT\r
+       GETSTS TAPE,IOS\r
+       TRNN IOS,LDP    ;AT LOAD POINT?\r
+       JRST BSPF3      ;NO LDP\r
+       ERRPNT </?LOAD POINT BEFORE END OF (MB) OR (MP) REQUEST!/>\r
+BSPF3: MOVEI T5,7      ;BSPR\r
+       TRNN T1,200     ;BSPR?\r
+       MOVEI T5,17     ;BSPF\r
+       MTAPE TAPE,(T5) ;BACKSPACE FILE/RECORD\r
+       SOJGE T3,BSPF2  ;MORE FILES/RECORDS TO BSP?\r
+                       ;NO, END OF LOOP\r
+       WAIT TAPE,\r
+       GETSTS TAPE,IOS\r
+       TRNN T1,MTBFLG  ;BACKSPACE FILE?\r
+       JRST MTCONT     ;NO\r
+       TRNN IOS,LDP    ;IF AT LOAD POINT\r
+       MTAPE TAPE,16   ;(MOVE FWD. OVER EOF)\r
+       JRST MTCONT     ;DON'T SKIP A RECORD\r
+\r
+\r
+;ADVANCE MTA 1 FILE, T3=AB OR ABOUT\r
+;AB/ABOUT = INPUT/OUTPUT DEVICE\r
+\r
+ADVF:  HLRZ T3,T3      ;T3=NO. FILES (OR REC) TO ADVANCE\r
+ADVF2: MOVEI T5,6      ;ADVR\r
+       TRNN T1,MTDFLG  ;ADVR ?\r
+       MOVEI T5,16     ;ADVF\r
+       MTAPE TAPE,(T5) ;ADVANCE FILE/RECORD\r
+       SOJG T3,ADVF2   ;MORE FILES/RECORDS TO ADV?\r
+                       ;NO, END OF LOOP\r
+       WAIT TAPE,      ;WAIT....\r
+       GETSTS TAPE,IOS\r
+       TRZE IOS,EOFBIT\r
+       SETSTS TAPE,(IOS)       ;END OF FILE\r
+       JRST MTCONT\r
+\f;ROUTINE TO INITIALIZE MAGTAPE FOR INPUT OR OUTPUT\r
+\r
+INOMTA:        SKIPA T2,ODEV   ;INIT OUTPUT DEVICE\r
+INIMTA:        MOVE T2,DEVICE  ;INIT INPUT DEVICE\r
+       SETZM MTANAM+1\r
+       MOVEM T2,MTANAM\r
+       MOVE 0,ALLCLF\r
+       TRNN 0,NEWDEV\r
+       JRST INMTA      ;SAME DEVICE\r
+       PUSHJ P,MTC1    ;NEW DEVICE\r
+       HRRZM   T4,INMTA1       ;SET MODE,DENSITY,PARITY\r
+\r
+INMTA: OPEN TAPE,INMTA1\r
+       JRST ERR1B\r
+       POPJ P,\r
+\r
+;ROUTINE TO PRINT ERROR MSG IF MORE THAN 1/8 FLAGS SET\r
+\r
+MTR1:  MOVE T2,DEVICE  ;TENTATIVELY SET I/DEV\r
+       CAIE T6,INIMTA  ;INPUT DEVICE\r
+       MOVE T2,ODEV    ;NO, SET O/DEV\r
+       MOVEM T2,TM1\r
+       ERRPNT </?TOO MANY REQUESTS FOR />\r
+       PUSHJ P,P6BIT\r
+             TM1\r
+       JRST    PIP2\r
+\f      SUBTTL  CONSTANTS/STORAGE/VARIABLES\r
+\r
+;CONSTANTS\r
+\r
+IFE WCH,<\r
+OKBD:  POINT 6,DTON+2,23       ;FOR NO. 1K BLOCKS\r
+OKB:   POINT 6,ZRF+2,23>\r
+DATE:  POINT 12,ZRF+2,35\r
+ZRO:   ASCII /00000/\r
+OPTMAX:        POINT 7,LBUFE-1,34\r
+OPTRA: XWD 700,LBUF-1          ;INITIAL POINTER TO LINE BUFFER\r
+K1:    432150643240            ;MAGIC ASCII INCREMENT BY 10\r
+K3:    375767737576            ;CHARACTER MASK 077\r
+K4:    432150643216            ;MAGIC ASCII INCREMENT BY 1\r
+QPIP:  SIXBIT /QPIP/           ;DATA FOR 1 SWITCH\r
+STAR:  SIXBIT /*/              ;LOOK FOR *.* FILNAM.EXT\r
+TWL:   OCT 12\r
+DPR:   OCT 55B8\r
+IFN FTDSK,<\r
+PRPTL: POINT 9,PROTS,8         ;PROTECTION FOR RENAME\r
+PRPTD: POINT 9,DTON+2,8\r
+PRNM:  POINT 9,ZRF+2,8         ;PROT FOR /R\r
+DATED: POINT 12,DTON+2,35      ;CREATION DATE /X\r
+TIME:  POINT 11,ZRF+2,23       ;CREATE TIME /X\r
+TIMED: POINT 11,DTON+2,23      ;DEPOSIT CREATE TIME>\r
+       LIT\r
+\f\r
+;PROGRAM STORAGE AREA\r
+\r
+IFN REENT,<LOC 140>\r
+IFN TEMP,<\r
+TMPFIL:        BLOCK   2 >\r
+IFE BLOC0,<\r
+BL0CNT:        BLOCK   1               ;COUNT>\r
+IFN CCLSW,<\r
+CFILE: BLOCK   4       ;NAME OF STORED CCL COMMAND FILE\r
+COMFLG:        BLOCK   1       ;-1 IF STORED COMMANDS,0 IF TTY>\r
+SVIBF: BLOCK   1       ;SAVE INIT MODE (INPUT)\r
+SVOBF: BLOCK   1       ;SAVE INIT MODE (OUTPUT)\r
+IBF:   BLOCK   3       ;INPUT BUFFER HEADER\r
+OBF:   BLOCK   3       ;OUTPUT BUFFER HEADER\r
+OBI:   BLOCK   3       ;OUTPUT BUFFER INPUT HEADER FOR DSK /Z\r
+TFI:   BLOCK   3       ;CONSOLE INPUT HEADER\r
+TFO:   BLOCK   3       ;CONSOLE OUTPUT HEADER\r
+IFN CCLSW,<\r
+CFI:   BLOCK   3       ;STORED COMMAND INPUT HEADER>\r
+SAVAC: BLOCK   5       ;SAVE SOME ACS\r
+NAMTAB:        BLOCK   24      ;FOR (XD) ON DSK OR RENAME\r
+IFN FTDSK,<\r
+LOCNAM:        BLOCK   1       ;POINTER FOR NAMTAB>\r
+DIRST: BLOCK   1       ;LOC. OF LAST DIR. FILE NAME REFERENCED\r
+DIRST1:        BLOCK   1       ;SAVE INITIAL DIRST\r
+ALLCLF:        BLOCK   1       ; 230\r
+SQNUM: BLOCK   1       ;CURRENT SEQUENCE NUMBER\r
+DTJBFF:        BLOCK   1       ;VALUE OF JOBFF AFTER CONSOLE I/O BUFFERS\r
+SVJBFF:        BLOCK   1       ;INITIAL VALUE OF JOBFF\r
+SVJBF1:        BLOCK   1       ;VALUE OF JOBFF AFTER OUTBUF UUO\r
+OPTR:  BLOCK   1       ;CURRENT POINTER FOR LINE PRESCAN\r
+DTONSV:        BLOCK   2       ;OUTPUT DIRECTORY ENTRY COPY\r
+SVPTR1:        BLOCK   1       ;POINTER TO LAST PRINTING CHARACTER\r
+SVPTR2:        BLOCK   1       ;POINTER TO LAST GENERATED TAB\r
+TLBRKT:        BLOCK   1       ;TOTAL PARENS ON THIS LINE\r
+TOTBRK:        BLOCK   1       ;TOTAL CUMULATIVE PARENS\r
+TABCT: BLOCK   1       ;SPACES TO NEXT TAB STOP\r
+SPCT:  BLOCK   1       ;CONSECUTIVE SPACES COUNTER\r
+ABOUT: BLOCK   1       ;AB FOR OURPUT UNIT\r
+AUXOUT:        BLOCK   1       ;AUX FOR OUTPUT UNIT\r
+PROTS: BLOCK   1       ;SAVE PROTECTION\r
+ZCNT:  BLOCK   1       ;COUNT FOR DSK ZRO REQ.\r
+CDRCNT:        BLOCK   1       ;COUNT CARD COLS.\r
+PTRPT: BLOCK   1       ;STORE SEQ. NO. POINTER\r
+CALFLG:        BLOCK   1       ;254\r
+\f;THIS IS A BLOCK OF VARIABLE LOCATIONS, ZEROED AT THE START OF EACH\r
+;PIP RUN, I.E EACH TIME PIP TYPES *.\r
+\r
+;*****  DO NOT SPLIT THIS BLOCK *****\r
+FILNAM:        BLOCK   1       ;FILE NAME FROM COMMAND SCANER\r
+FILEX: BLOCK   1       ;EXTENSION\r
+PR:    BLOCK   1       ;PROTECTION\r
+PP:    BLOCK   1       ;P-P NUMBER TYPED BY USER\r
+;*****  END OF BLOCK    *****\r
+DTON:  BLOCK   4       ;OUTPUT DIR. ENTRY\r
+DEVA:  BLOCK   1       ;SAVE INPUT DEV. NAME\r
+NO.:   BLOCK   1       ;GENERATE FILE NAMES\r
+ZRF:   BLOCK   4       ;LOOKUP FILE NAMES\r
+MTAREQ:        BLOCK   1       ;STORE MTA REQUESTS\r
+\r
+COMEOF:        BLOCK   1       ;EOF INDICATOR\r
+COMBUF:        BLOCK   ^D41    ;COMMAND BUFFER. ALLOES 205 CHARS.\r
+COMCNT:        BLOCK   1       ;COMBUF CHARS COUNT\r
+COMPTS:        BLOCK   1       ;POINTER FOR STORING/EXTRACTING CS\r
+SYSFLG:        BLOCK   1       ; 350\r
+\r
+AUX:   BLOCK   1       ;COPT AUXFLG (MTA)\r
+IFN FTDSK,<\r
+FNPPN: BLOCK   1       ;RESERVE #P-P\r
+FNPPNS:        BLOCK   1       ;COPY FNPPN FOR LATEST NON-SYS #P-P>\r
+NSWTCH:        BLOCK   1       ; 354\r
+SSWTCH:        BLOCK   1       ; 355\r
+ESWTCH:        BLOCK   1       ;-1 INDICATES END OF LINE\r
+XNAME: BLOCK   1       ;-1 INDICATES SCAN OVERSHOOT WITH A NULL NAME\r
+                       ;0  INDICATES NO SCAN OVERSHOOT\r
+                       ;CONTAINS OVERSHOOT NAME IF NOT FULL\r
+AB:    BLOCK   1       ;MTA VALUE SWITCHES\r
+                       ;THIS IS THE END OF THE INI. ZEROED BLOCK. \r
+       PURE\r
+\fMONTH:        ASCII /-Jan-/\r
+       ASCII /-Feb-/\r
+       ASCII /-Mar-/\r
+       ASCII /-Apr-/\r
+       ASCII /-May-/\r
+       ASCII /-Jun-/\r
+       ASCII /-Jul-/\r
+       ASCII /-Aug-/\r
+       ASCII /-Sep-/\r
+       ASCII /-Oct-/\r
+       ASCII /-Nov-/\r
+       ASCII /-Dec-/\r
+\r
+MNPT:  POINT 7,MONTH\r
+\r
+       IMPURE\r
+PDL:   BLOCK   20      ;PUSHDOWN LIST\r
+\r
+LBUF:  BLOCK   34      ;LINE BUFER. ALLOW FOR FORTRAN DATA\r
+LBUFE==.-1\r
+\r
+DBUF:  BLOCK   204     ;DIRECTORY BUFFER\r
+OMOD:  BLOCK   1       ;OUTPUT DEVICE MODE, STATUS\r
+ODEV:  BLOCK   2       ;OUTPUT DEVICE NAME\r
+                       ;BUFFER HEADERS(S) LOC\r
+\r
+ININI1:        BLOCK   1       ;INPUT DEVICE\r
+DEVICE:        BLOCK   2\r
+\r
+DEVERR:        BLOCK   1\r
+DERR2: BLOCK   2\r
+\r
+INMTA1:        BLOCK   1\r
+MTANAM:        BLOCK   2\r
+\r
+       PURE\r
+\fSUBTTL        RIM LOADER\r
+IFE RIMSW,<\r
+RIMTB: ERRPNT <Z? /Y switch option not available this assembly!Z>\r
+>\r
+IFN RIMSW,<\r
+LODAL==16                       ;LENGTH OF RIM LOADER\r
+HLTBIT==200                     ;CHANGES JRST TO HALT\r
+BLKSZ==17                       ;NORMAL BLOCK LENGTH IN RIM10B\r
+JOBDA==140                      ;START OF USER AREA\r
+        \r
+        IMPURE\r
+CHKSM: BLOCK   1               ;CHECKSUM ACCUMULATED (RIM10B)\r
+POINTA:        BLOCK   1               ;SAVE POINTER FOR RIM10B BLOCK\r
+LENGTH:        BLOCK   1               ;CALC. LENGTH OF RIM10 FILE\r
+ZERO:  BLOCK   1               ;NO OF 0'S NEEDED TO FILL SPACES IN\r
+COUNT: BLOCK   1               ;RIM10B COUNT WORDS OUT\r
+XFERWD:        BLOCK   1               ;RIM-10-B XFER WD. ;FILE.\r
+\r
+RIMTB:  TRNN    AUXFLG,DTAIN!DSKIN!MTAIN\r
+        JRST    ERR5B\r
+        PUSHJ   P,ININIT\r
+        OUTPUT  OUT,\r
+        TRNE    AUXFLG,DTAIN\r
+        PUSHJ   P,DTADIR\r
+IFN FTDSK,<\r
+        TRNE    AUXFLG,DSKIN\r
+        PUSHJ   P,DSKDIR>\r
+        PUSHJ   P,FNSET\r
+RIMTB0:        MOVEI   0,254000\r
+        HRLM    0,XFERWD        ;ASSUME JRST\r
+        PUSHJ   P,LOOK          ;GET FILE TO CONVERT\r
+        JRST    MAIN1           ;NONE LEFT\r
+        LOOKUP  IN,ZRF\r
+        JRST    ERR3\r
+        HLRZ    0,ZRF+1\r
+        CAIN    0,(SIXBIT ,RTB,)\r
+        JRST    RIMTB1\r
+        CAIE    0,(SIXBIT ,SAV,)\r
+        CAIN    0,(SIXBIT ,RMT,)\r
+        JRST    RIMTB2\r
+        JRST    ERR3B           ;NO LEGAL EXTENSION - SAVE JOBFF TOO\r
+\fRIMTB1:             MOVE    T1,OBF+1        ;PUNCH RIM10B LOADER\r
+        HRLI    T1,RMLODA\r
+        AOS     T2,T1           ;XFER IT TO OUTPUT BUFFER\r
+        BLT     T1,LODAL(T2)\r
+        ADDI    T2,LODAL\r
+        HRRM    T2,OBF+1        ;FIX BUFFER POINTER\r
+        MOVNI   T2,LODAL\r
+        ADDM    T2,OBF+2        ;AND COUNTER\r
+        CLOSE   OUT,            ;BLANK TAPE\r
+RIMTB2:        PUSHJ   P,RINP          ;GET FIRST BUFFER\r
+        JRST    ERR8A           ;FILE OF ZERO LENGTH\r
+        JUMPGE  CHR,ERR8A       ;FIRST WORD MUST BE POINTER\r
+        HLRZ    0,ZRF+1\r
+        CAIN    0,(SIXBIT ,SAV,)\r
+        JRST    RIMTB4          ;"SAV" FILE\r
+        MOVEI   T2,^D126(CHR)   ;FIND VALUE OF JOBSA\r
+        MOVEI   T3,JOBDA-1\r
+        CAMGE   T2,T3           ;(JOBDA) IS FIRST LOC. OF USER PROF,\r
+        JRST    ERR8A           ;NO, ERROR\r
+        MOVE    T1,IBF+1\r
+        MOVEI   T3,JOBSA\r
+        PUSHJ   P,RMS1\r
+        HRRM    CHR,XFERWD      ;SAVE TRANSFER WORD\r
+        MOVEI   T3,JOBFF\r
+        MOVE    T1,IBF+1\r
+        PUSHJ   P,RMS1\r
+        HRRZM   CHR,LENGTH      ;SAVE (JOBFF)\r
+        HLRZ    0,ZRF+1\r
+        CAIN    0,(SIXBIT .RTB.);RIM 10B CONVERSION\r
+        JRST    RIMTB4\r
+\f;RIM10 1ST WD IS -N,X X IS 1ST WORD IN DATA BLOCK\r
+;CONTAINING FIRST NON-ZERO WORD AFTER END\r
+;OF JOBDATA AREA, FROM THERE TO JOBFF GIVES\r
+;VALUE OF N. XFER ADD. COMES FROM JOBSA.\r
+\r
+RMT1:  MOVEI   T1,JOBDA        ;FIRST LOC. AVAILABLE TO USER\r
+        LDB     CHR,IBF+1\r
+        SUBI    T1,1(CHR)\r
+        JUMPLE  T1,RMT2 ;CURRENT "X" GT OR EQ JOBDA\r
+        HLRO    T2,CHR\r
+        MOVNS   T2              ;GET "N"\r
+        AOJ     T1,             ;GET REL. LOC. OF JOBDA IN BLOCK\r
+        CAMG    T1,T2\r
+        JRST    RMT2\r
+        AOJ     T2,             ;NOT IN BLOCK, TRY NEXT\r
+        ADDM    T2,IBF+1\r
+        MOVNS   T2\r
+        ADDM    T2,IBF+2        ;READY TO GET NEXT POINTER\r
+        JRST    RMT1\r
+RMT2:  LDB     CHR,IBF+1       ;POINTS TO FIRST USEFUL I/O WORD\r
+        MOVNI   T1,(CHR)\r
+        ADDB    T1,LENGTH\r
+        MOVNS   T1              ; -N\r
+        HRLM    T1,POINTA\r
+        HRRM    CHR,POINTA      ;(-N,X) IN POINTA\r
+        SETZM   ZERO\r
+\f;NOW OUTPUT RIM10 FILE.  IBF+1 POINTS TO FIRST I/O WORD.  POINTA HAS I/O\r
+;WORD FOR FILE.  LENGTH = NO. WDS TO GO OUT INCLUDING XFER WD.\r
+;COUNT COUNTS NO. WDS IN CURRENT LOGICAL BLOCK\r
+;ZERO COUNTS ZERO FILL\r
+\r
+        MOVE    CHR,POINTA\r
+        PUSHJ   P,PUT           ;PUNCH I/O WORD\r
+RMT8:  LDB     CHR,IBF+1       ;-N,X\r
+        MOVEM   CHR,POINTA\r
+        HLRO    T1,CHR\r
+        MOVNM   T1,COUNT\r
+RMT6:  SETZ    CHR,            ;PUNCH ZERO IF NECESSARY\r
+        SOSL    ZERO\r
+        JRST    RMT4            ;DEPOSIT ZERO\r
+        SOSGE   COUNT\r
+        JRST    RMT5            ;GET NEW LOGICAL BLOCK\r
+        PUSHJ   P,RINP1\r
+        JRST    ERR8A\r
+RMT4:  SOSG    LENGTH\r
+        JRST    RIMTB8\r
+        PUSHJ   P,PUT\r
+        JRST    RMT6\r
+RMT5:  HRRZ    T1,POINTA\r
+        HLRO    T2,POINTA\r
+        SUBM    T1,T2\r
+        PUSHJ   P,RINP1\r
+        JRST    RMT9\r
+        JUMPGE  CHR,ERR8A\r
+        HRRZ    CHR,CHR\r
+        SUB     CHR,T2\r
+        JUMPL   CHR,ERR8A\r
+        MOVEM   CHR,ZERO\r
+        JRST    RMT8\r
+RMT9:  MOVE    CHR,LENGTH\r
+        SOJ     CHR,\r
+        MOVEM   CHR,ZERO\r
+        SETZ    CHR,\r
+RMT10: SOSGE   ZERO\r
+        JRST    RIMTB8\r
+        PUSHJ   P,PUT\r
+        JRST    RMT10\r
+\f;RIM10B:      COMES FROM RTB AND SAV FILES. SAV=RTB EXCEPT IT HAS NO\r
+;RIM LOADER AND NO TRANSFER WORD\r
+\r
+RIMTB3:        PUSHJ   P,RINP1         ;NONE, GET NEW POINTER\r
+        JRST    RIMTB8          ;EOF\r
+        JUMPL   CHR,RIMTB4      ;POINTER WORD\r
+        CAME    CHR,XFERWD      ;IS IT FINAL JRST XXX\r
+        JRST    ERR8A           ;NO,ERROR\r
+        JRST    RIMTB8          ;YES,OUTPUT IT\r
+\r
+RIMTB4:        LDB     CHR,IBF+1\r
+        HRRZM   CHR,POINTA      ;LOAD WORDS HERE\r
+        HLROM   CHR,COUNT\r
+        MOVNS   COUNT           ;NO. WDS IN THIS BLOCK\r
+RIMTB7:        SKIPN   T1,COUNT        ;ANY WORDS LEFT IN BLOCK?\r
+        JRST    RIMTB3          ;NONE\r
+        SETZM   CHKSM           ;INITIALIZE CHECKSUM\r
+        CAIL    T1,BLKSZ\r
+        MOVEI   T1,17\r
+        MOVN    T2,T1           ;T1 HAS NO. OF WDS TO GO OUT\r
+        ADDM    T2,COUNT        ;ADJUST COUNT\r
+        HRL     CHR,T2\r
+        HRR     CHR,POINTA      ;I/O WD IN CHR\r
+        ADDM    T1,POINTA       ;SET POINTA FOR NEXT TIME\r
+        ADDM    CHR,CHKSM       ;ADD I/O WD TO CHECKSUM\r
+RIMTB5:        PUSHJ   P,PUT           ;PUTPUT I/O WORD\r
+        SOJL    T1,RIMTB6               ;FINISHED THIS BLOCK\r
+        PUSHJ   P,RINP1         ;GET DATA\r
+        JRST    ERR8A           ;EOF (ILLEGAL)\r
+        ADDM    CHR,CHKSM       ;CHECKSUM\r
+        JRST    RIMTB5\r
+RIMTB6:        MOVE    CHR,CHKSM\r
+        PUSHJ   P,PUT\r
+        OUTPUT  OUT,\r
+        JRST    RIMTB7\r
+RIMTB8:        MOVE    CHR,XFERWD      ;EOF HERE, XFERWD=JOBSA\r
+        TRNN    CHR,-1\r
+        TLO     CHR,HLTBIT\r
+        HLRZ    0,ZRF+1\r
+        CAIN    0,(SIXBIT .SAV.);NO XFER WD FOR "SAV" FILES\r
+        JRST    RIMA\r
+        PUSHJ   P,PUT\r
+        SETZ    CHR,\r
+        PUSHJ   P,PUT           ;TRAILING ZERO\r
+        OUTPUT  OUT,\r
+RIMA:  CLOSE   IN,\r
+        TRNE    FLAG,XFLG\r
+        CLOSE   OUT,\r
+        JRST    RIMTB0\r
+\r
+\f;THIS IS THE I/O SECTION\r
+\r
+RINP:  PUSHJ   P,INP\r
+        TRNE    IOS,EOFBIT      ;EOF?\r
+        POPJ    P,              ;EOF EXIT\r
+RINP1: SOSGE   IBF+2\r
+        JRST    RINP\r
+        ILDB    CHR,IBF+1\r
+        JRST    CPOPJ1\r
+\r
+RMS2:  SUB     T1,T4           ;(IBF+1)+N\r
+        AOJ     T1,\r
+RMS1:  LDB     CHR,T1          ;GET POINTER\r
+        HRRZ    T2,CHR          ;X\r
+        HLRO    T4,CHR          ;-N\r
+        SUB     T2,T4           ;X+N IN T2\r
+        CAMGE   T2,T3\r
+        JRST    RMS2\r
+        SUBI    T3,(CHR)        ;HOW FAR FROM POINTER?\r
+        ADD     T1,T3           ;INCREMENT POINTER\r
+        LDB     CHR,T1          ;(JOBSA/FF)\r
+        POPJ    P,\r
+\r
+\r
+;THIS IS THE RIM LOADER FOR THE PDP-10\r
+\r
+RMLODA:        PHASE   0\r
+\r
+        XWD     -16,0\r
+ST:    CONO    PTR,60\r
+ST1:   HRRI    A,RD+1\r
+RD:    CONSO   PTR,10\r
+        JRST    .-1\r
+        DATAI   PTR,@TBL1-RD+1(A)\r
+        XCT     TBL1-RD+1(A)\r
+        XCT     TBL2-RD+1(A)\r
+A:     SOJA    A,\r
+TBL1:  CAME    CKSM,ADR\r
+        ADD     CKSM,1(ADR)\r
+        SKIPL   CKSM,ADR\r
+TBL2:  JRST    4,ST\r
+        AOBJN   ADR,RD\r
+ADR:   JRST    ST1\r
+CKSM:  BLOCK   0\r
+\r
+       DEPHASE\r
+>\r
+\r
+IFE FTDSK,<     \r
+        IMPURE\r
+TM1:   BLOCK   1\r
+        VAR\r
+LOWTOP:\r
+        PURE\r
+        END     PIP1>\r
+\fSUBTTL        DISK ROUTINES\r
+;* * * ALL THE FOLLOWING ARE DISK ROUTINES * * *\r
+\r
+;DISK DELETE AND RENAME ROUTINES\r
+\r
+DSKDR: PUSHJ   P,ININIT        ;GET DSK AS INPUT DEVICE\r
+       PUSHJ   P,DSKDIR        ;GET USER'S FILE DIRECTORY\r
+       PUSHJ   P,INFO          ;PRINT FILES DELETED:/RENAMED:\r
+       SETZM   ZCNT            ;COUNT OF FAILURES\r
+DSKDR5:        PUSHJ   P,LOOK          ;PREPARE FOR LOOKUP/ENTER\r
+                               ;OF FILE TO /D OR /R\r
+       JRST    DSKDR1          ;ALL THROUGH WITH UFD\r
+       LOOKUP  IN,ZRF          ;IS SOURCE FILE THERE?\r
+       JRST    DERR5           ;ERROR\r
+       CLOSE   IN,             ;YES\r
+       TRNN    FLAG,DFLG       ;DELETE?\r
+       JRST    DSKDR4          ;NO, RENAME\r
+       SETZM   DTON            ;YES\r
+       MOVE    0,FNPPN         ;SET DEST. DEVICE SAME AS SOURCE FOR DELETE,\r
+       MOVEM   0,DTON+3        ;I.E. PROJ-PROG NUMBER\r
+       JRST    DSKDR7\r
+\r
+DSKDR4:        PUSHJ   P,RENAME\r
+       MOVEI   0,DTON+2        ;NO NAME SET SO USE LOOKUP NAME\r
+       HRLI    0,NAMTAB+2      ;AND EXT SO FILE NOT DELETED\r
+       BLT     0,DTON+3\r
+       LDB     0,PRNM\r
+       TLNN    AUXFLG,NSPROT   ;USE THE CURRENT PROTECTION\r
+       DPB     0,PRPTD         ;UNLESS NEW PROT. SPECIFIED\r
+DSKDR7:        RENAME  IN,DTON\r
+       AOSA    ZCNT            ;RENAME (OR DELETE) FAILS\r
+       PUSHJ   P,INFO3         ;PRINT FILENAME DELETED/RENAMED\r
+       JRST    DSKDR5\r
+\r
+DSKDR1:        TLZ     AUXFLG,NSPROT   ;NON-ST. PROT FIXED\r
+       SKIPE   ZCNT            ;SKIP IF NO FAILURES\r
+       JRST    DSKDR6          ;ERROR\r
+       SOS     ESWTCH          ;ENSURE ESWTCH NEGATIVE\r
+       RELEAS  CON,\r
+       JRST    MAIN1\r
+\f;ZERO DSK DIRECTORY OF ALL POSSIBLE FILES.  IF ANY ARE PROTECTED, GIVE\r
+;A MESSAGE AND DO NOT PROCESS ANY OTHER SWITCHES.\r
+\r
+DSKZR0:        PUSHJ   P,DSKSK1\r
+       SETZM   ZCNT\r
+       INBUF   OUT,1           ;FOR LOOKUPS ON OUT\r
+DSKZ1: SOSLE   UFDIN+2\r
+       JRST    .+3\r
+DSKZ3: PUSHJ   P,UIN\r
+       JRST    DSKZ2\r
+       ILDB    0,UFDIN+1\r
+       JUMPE   0,DSKZ3\r
+       MOVEM   0,ZRF\r
+       SOS     UFDIN+2\r
+       ILDB    0,UFDIN+1\r
+       HLLZM   0,ZRF+1         ;EXTENSION\r
+       MOVE    0,FNPPN\r
+       MOVEM   0,ZRF+3\r
+       LOOKUP  OUT,ZRF\r
+       AOS     ZCNT            ;COUTN REJECTS,TRY MORE FILES\r
+       CLOSE   OUT,\r
+       SETZM   ZRF\r
+       MOVE    0,FNPPN\r
+       MOVEM   0,ZRF+3\r
+       RENAME  OUT,ZRF\r
+       AOS     ZCNT\r
+       JRST    DSKZ1           ;REPEAT\r
+DSKZ2: SKIPN   ZCNT            ;ANY FAILURES\r
+       POPJ    P,              ;NO\r
+                               ;PRINT ERROR MESSAGE\r
+       MOVSI   0,(SIXBIT /Z/)\r
+       JRST    DSKZ5\r
+DSKDR6:        MOVSI   0,(SIXBIT /D/)\r
+       TRNN    FLAG,DFLG\r
+       MOVSI   0,(SIXBIT /R/)\r
+DSKZ5: MOVEM   0,TM2\r
+       ERRPNT  <X?Failure(s) during /X>\r
+       PUSHJ   P,P6BIT\r
+               TM2\r
+       ERRPN2  </ request!/>\r
+\f;PREPARE TO LOOKUP FILES IN PARTICULAR DISK DIRECTORY\r
+\r
+DSKSK1:        SKIPA   T1,DTON+3\r
+DSKDIR:        MOVE    T1,PP           ;GET [P,P] INTO T1\r
+       SKIPN   T1              ;IS IT ZERO?\r
+       GETPPN  T1,             ;YES, GET USER'S [P,P]\r
+       MOVEM   T1,UFD\r
+       MOVSI   0,(SIXBIT /UFD/)\r
+       MOVEM   0,UFD+1\r
+       MOVEM   T1,FNPPN\r
+       HLRZ    0,SYSFLG\r
+       SKIPN   0\r
+       MOVEM   T1,FNPPNS\r
+       MOVE    0,[XWD 1,1]\r
+       MOVEM   0,UFD+3\r
+       PUSHJ   P,DSKDST\r
+       LOOKUP  DIR,UFD\r
+       JRST    DERR5B\r
+       POPJ    P,\r
+\f;ROUTINE TO LIST DISK DIRECTORY. /L OR /F SWITCH\r
+\r
+DSKLST:        PUSHJ   P,ININIT        ;ASSIGN "IN" FOR RETRIEVAL INFO\r
+       SETZM   BLKSUM          ;CLEAR TOTAL BLOCKS FOR ALL FILES\r
+       SETZB   T2,LIN          ;SET UP APPROPRIATE CONTROLLS\r
+       HLRZ    T1,ODEV         ;FOR THIS LISTING DEVICE\r
+       CAIN    T1,(SIXBIT /TTY/);IF ODEV IS TTY\r
+       AOS     T2              ;SET LISTTY=1 (TTY)\r
+       MOVEM   T2,LISTTY\r
+       PUSHJ   P,DSKDIR\r
+       PUSHJ   P,HEADER        ;PUT OUT HEADER LINES\r
+LSTU1: SOSLE   UFDIN+2\r
+       JRST    .+3\r
+LSTU2: PUSHJ   P,UIN           ;GO READ DIRECTORY\r
+       JRST    BLKLST          ;(EOF) - OUTPUT BLOCKS USED\r
+       ILDB    0,UFDIN+1\r
+       JUMPE   0,LSTU2\r
+       MOVEM   0,FILNAM        ;PREPARE TO GET RETRIEVAL INFO\r
+       MOVE    T1,FNPPN        ;EACH LOOKUP DESTROYS P-P NO.\r
+       MOVEM   T1,PP           ;RESTORE P-P NO.\r
+       SKIPG   LIN\r
+       PUSHJ   P,HEDR3         ;YES, PUT OUT HEADER LINES\r
+       SOS     UFDIN+2\r
+       ILDB    DOUT,UFDIN+1    ;PICK UP EXTENSION\r
+       HLRZS   DOUT            ;CLEAR RIGHT HALF\r
+       HRLZM   DOUT,FILEX\r
+       CAIE    DOUT,(SIXBIT /UFD/)     ;IS FILE UFD\r
+       JRST    LSTU3           ;GO PRINT NAME HELD IN 0.\r
+       HLRZ    DOUT,FILNAM     ;HERE FOR UFD ONLY\r
+       MOVEI   T2,PUT\r
+       PUSHJ   P,OUTOCT        ;PRINT #,#. PROJ. NO.\r
+       MOVEI   CHR,COMMA       ;","\r
+       PUSHJ   P,PUT           ;...\r
+       HRRZ    DOUT,FILNAM     ;PROG. NO.\r
+       PUSHJ   P,OUTOCT\r
+       JRST    LSTU3A\r
+LSTU3: MOVEI   T4,6\r
+       MOVE    0,FILNAM\r
+       PUSHJ   P,SIXOUT        ;OUTPUT FILENAME\r
+       JUMPE   T4,LSTU3A\r
+       PUSHJ   P,SPACES\r
+LSTU3A:        MOVEI   T4,4            ;SET LOOP FOR OUTPT EXT\r
+       MOVE    0,FILEX\r
+       JUMPE   0,LSTU4\r
+       MOVEI   CHR,PERIOD\r
+       SKIPN   0,LISTTY\r
+       MOVEI   CHR,TAB\r
+       PUSHJ   P,PUT\r
+       SOJ     T4,\r
+       PUSHJ   P,SIXOUT        ;OUTPUT EXTENSION\r
+       JUMPE   T4,.+2\r
+LSTU4: PUSHJ   P,SPACES\r
+       TRNN    AUXFLG,FFLG     ;SHORTEST LISTING?\r
+       JRST    LSTU4B\r
+       PUSHJ   P,LINOUT        ;YES\r
+       JRST    LSTU1\r
+LSTU4B:        LOOKUP  IN,FILNAM\r
+       JRST    LSTU5\r
+       PUSHJ   P,TABOUT\r
+       PUSHJ   P,BLKS          ;DETERMINE NO. BLK IN FILE\r
+                               ;AND TOTAL FOR UFD\r
+       SKIPE   LISTTY          ;OUTPUT DEVICE A TTY?\r
+       JRST    LSTU7           ;YES, SKIP LONG DIRECTORY\r
+LSTU4A:        LDB     0,ADATE         ;PRINT ACCESS DATE\r
+       PUSHJ   P,DATOUT\r
+       PUSHJ   P,TABOUT\r
+       LDB     0,CTIME         ;PRINT CREATION TIME\r
+       PUSHJ   P,TIMOUT\r
+       LDB     0,CDATE\r
+       PUSHJ   P,DATOUT        ;PRINT CREATION DATE\r
+       PUSHJ   P,TABOUT\r
+       LDB     0,PROT\r
+       PUSHJ   P,PROTO\r
+       LDB     0,OWNER\r
+       PUSHJ   P,PROTO\r
+       LDB     0,MODE          ;PRINT MODE\r
+       PUSHJ   P,PROTO\r
+       PUSHJ   P,TABOUT\r
+       LDB     0,PROJ\r
+       PUSHJ   P,OCTLST\r
+       JRST    LSTU8\r
+LSTU5: PUSHJ   P,TABOUT        ;THE FILE WAS PROTECTED\r
+       HRRZ    T7,FILEX        ;GET PARICULAR ERROR TYPE\r
+       TRZ     T7,ETAB-ETABND  ;IS IT LEGAL ERROR\r
+       MOVE    T1,ETAB(T7)     ;NO,PICK UP CATCH ALL MESSAGE\r
+LSTU6: ILDB    CHR,T1          ;PICK UP CHAR FROM ERROR MSG\r
+       JUMPE   CHR,LSTU8       ;PRINT ERROR MESSAGE, END SEEN\r
+       CAIN    CHR,"!"\r
+       JRST    LSTU8           ;ALTERNATE END SEEN (!)\r
+IFE REENT,<\r
+       PUSHJ   P,CCASE>        ;DEPOSIT CHARACTER\r
+       PUSHJ   P,PUT\r
+       JRST    LSTU6\r
+\r
+\r
+LSTU7: LDB     0,CDATE\r
+       PUSHJ   P,DATOUT        ;PRINT CREATION DATE ONLY FOR TTY\r
+LSTU8: CLOSE   IN,0\r
+       PUSHJ   P,LINOUT\r
+       JRST    LSTU1\r
+\r
+\f\r
+\r
+;ROUTINE TO OUTPUT SPACES, T4=NO. TO OUTPUT\r
+\r
+SPACES:        MOVEI   CHR,40\r
+       PUSHJ   P,PUT\r
+       SOJG    T4,.-1\r
+       POPJ    P,\r
+\r
+;ROUTINE TO DEPOSIT T4.SIXBIT CHARACTERS\r
+;FROM AC0 INTO OUTPUT BUFFER\r
+SIXOUT:        MOVSI   T2,(POINT 6,0)\r
+       ILDB    CHR,T2\r
+       JUMPE   CHR,SIXO1\r
+       ADDI    CHR,40          ;MAKE ASCII\r
+       PUSHJ   P,PUT\r
+       SOJ     T4,0\r
+       TLNN    T2,770000\r
+SIXO1: POPJ    P,\r
+       JRST    SIXOUT+1\r
+\f;DETERMINE NUMBER OF BLOCKS PER FILE AND TOTAL NUMBER OF\r
+;BLOCKS USED BY USERS PROJECT,PROGRAMMER NUMBER\r
+\r
+BLKS:  SETZM   BLKTMP\r
+       HLRE    0,PP            ;GET WORD COUNT OF FILE\r
+       JUMPGE  0,BLKADD        ;IF POS = NO. OF BLOCKS\r
+       MOVNS   0,0             ;MAKE POSITIVE\r
+       JUMPLE  0,BLKOUT\r
+       TRZE    0,177           ;TAKE CARE OF PARIAL BLOCKS\r
+       ADDI    0,200\r
+       IDIVI   0,200           ;CALCULATE BLOCK COUNT\r
+BLKADD:        ADDM    0,BLKSUM        ;CALCULATE TOTAL FOR ALL FILES\r
+       MOVEM   0,BLKTMP\r
+BLKOUT:        MOVE    DOUT,BLKTMP\r
+       PUSHJ   P,OUTDEC        ;OUTPUT NUMBER OF BLOCKS IN DECIMAL\r
+       PUSHJ   P,TABOUT\r
+       POPJ    P,\r
+\r
+;END OF FILE ON UFD OUTPUT TOTAL BLOCKS XXX\r
+\r
+BLKLST:        SKIPN   BLKSUM          ;ANY INFORMATION TO OUTPUT\r
+       JRST    MAIN1           ;NO - FINISHED\r
+       PUSHJ   P,CRLF\r
+       LSTLIN  TOTAL           ;OUTPUT CR,LF "TOTAL BLOCKS"\r
+DIRFIN:        MOVE    DOUT,BLKSUM\r
+       SETZM   BLKSUM\r
+       PUSHJ   P,OUTDEC        ;PRINT TOTALS\r
+       JRST    MAIN1\r
+\r
+TOTAL: ASCIZ   /Total Blocks    /\r
+\r
+IFE REENT,<\r
+CCASE: CAIL    CHR,"a" ;FLUSH LOWER CASE LETTERS\r
+       CAILE   CHR,"z" ;FROM OUTPUT IN CASE PDP-6 LPT\r
+       POPJ    P,\r
+       SUBI    CHR,40\r
+       POPJ    P,>\r
+\f;INPUT USERS FILE DIRECTORY\r
+\r
+UIN:   INPUT   DIR,\r
+       GETSTS  DIR,IOS\r
+       TRNN    IOS,760000      ;NO ERRORS\r
+       JRST    CPOPJ1\r
+       TRZN    IOS,20000\r
+       JRST    UIN2            ;ERROR PRINT\r
+       SETSTS  DIR,(IOS)\r
+       POPJ    P,\r
+\r
+;INIT DIRECTORY DEVICE\r
+\r
+DSKDST:        MOVE    T2,JOBFF        ;SAVE JOBFF IN T2\r
+\r
+       MOVEI   T1,DBUF\r
+       MOVEM   T1,JOBFF        ;MAKE MONITOR USE DBUF FOR DISK DIR.\r
+\r
+       MOVEI   T1,14           ;BINARY MODE\r
+       MOVEM   T1,ADSK1\r
+\r
+       MOVEI   T1,UFDIN        ;LOC OF DIRECTORY ENTRY\r
+       MOVEM   T1,ADSK+1       ;FOR UFD\r
+\r
+       OPEN    DIR,ADSK1\r
+       JRST    ERR1A\r
+       INBUF   DIR,1           ;RESET JOBFF SAME AS ENTRY\r
+       MOVEM   T2,JOBFF\r
+       POPJ    P,\r
+\f;OUTPUT THE DIRECTORY LISTING HEADER\r
+\r
+HEADER:        PUSHJ   P,LINOUT\r
+       PUSHJ   P,HEDR4\r
+HEDR1: LSTLIN  HEDL1\r
+       HLRZ    0,FNPPN\r
+       PUSHJ   P,OCTLST        ;PROJ, PROG\r
+       MOVEI   CHR,COMMA\r
+       PUSHJ   P,PUT\r
+       HRRZ    0,FNPPN\r
+       PUSHJ   P,OCTLST\r
+       PUSHJ   P,TABOUT\r
+       PUSHJ   P,NOWOUT        ;PRINT CURRENT TIME, DATE\r
+       CALLI   0,CDATE         ;DATE REQ.\r
+       PUSHJ   P,DATOUT\r
+       PUSHJ   P,LINOUT\r
+       SKIPE   LISTTY\r
+       JRST    HEDR2           ;JUMP IF LISTING TO CONSOLE\r
+       PUSHJ   P,LINOUT\r
+       LSTLIN  HEDLIN\r
+HEDR2: JRST    LINOUT\r
+\r
+HEDR3: SKIPE   LISTTY\r
+       POPJ    P,\r
+       PUSHJ   P,HEDR4\r
+       LSTLIN  HEDL2 \r
+       JRST    HEDR1\r
+\fHEDLIN:       ASCIZ   /       File              Access            Creation                 Protection\r
+ Name   Ext     Blks      Date          Time      Date         Owner   Project  Other          Mode\r
+/\r
+HEDL1:  ASCIZ   /Directory /\r
+HEDL2:  ASCIZ   /Continuation of /\r
+\f\r
+ETAB:  POINT 7,E1+1\r
+       POINT 7,E2+1\r
+       POINT 7,E3+1\r
+       POINT 7,E4+1\r
+       POINT 7,E5+1\r
+       POINT 7,E6+1\r
+       POINT 7,E7+1\r
+       POINT 7,E8+1\r
+ETABND:\r
+\r
+UIN2:  PUSHJ   P,COMERR\r
+       JSP     T5,INICN2\r
+       ERRPN2  </?Disk directory read />\r
+       MOVEI   T6,UFD  ;LOCATION OF FILENAME(AND EXT)\r
+       PUSHJ   P,FN.EX ;PRINT FILE NAME EXTENSION\r
+       MOVE    T2,AUXFLG\r
+       ANDI    T2,DSKIN\r
+       PUSHJ   P,IOERR\r
+       SETSTS  DIR,(IOS)\r
+       JRST    CPOPJ1\r
+\r
+LINOUT:        SOS     LIN\r
+       JRST    CRLF\r
+TABOUT:        MOVEI   CHR,TAB\r
+       JRST    PUT\r
+\r
+;OUTPUT THE TIME FOUND IN AC 0\r
+\r
+NOWOUT:        MSTIME                  ;CALL MILLISEC TIMER\r
+       IDIVI   0,^D60000       ;CONVERT TO MINUTES\r
+TIMOUT:        IDIVI   0,^D60\r
+       MOVE    DOUT,0\r
+       PUSHJ   P,OUTDEC\r
+       MOVE    DOUT,1\r
+       PUSHJ   P,OUTDEC\r
+       JRST    TABOUT\r
+\f;SKIP TO HEAD OF FORM OR NEXT HALF PAGE, RESET COUNT\r
+\r
+HEDR4: SKIPE   LISTTY          ;EXIT IF TTY\r
+       POPJ    P,\r
+       SKIPLE  LIN\r
+       JRST    HEDR6           ;ANYTHING ON THIS PAGE?\r
+HEDR5: MOVEI   CHR,FF          ;FORM FEED IF FULL OR\r
+       MOVEI   T2,^D50\r
+HEDR5A:        MOVEM   T2,LIN          ;ALMOST FULL\r
+       PUSHJ   P,PUT\r
+       MOVEI   CHR,LF\r
+       PUSHJ   P,PUT\r
+       PUSHJ   P,PUT\r
+       JRST    PUT             ;PRINT LINEFEEDS AND EXIT\r
+HEDR6: CAIGE   T2,^D25\r
+       JRST    HEDR5\r
+       MOVEI   CHR,HPAGE\r
+       MOVEI   T2,^D16\r
+       JRST    HEDR5A\r
+\r
+;OUTPUT OCTAL WORD FOUND IN AC 0\r
+\r
+OCTLST:        MOVE    T1,[POINT 3,0]\r
+       ILDB    CHR,1\r
+       TLNE    T1,770000       ;ALLOW UPTO 12 OCTAL NOS\r
+       JUMPE   CHR,.-2         ;GET MOST SIG. NUMBER\r
+OCTL1: ADDI    CHR,60          ;CONVERT TO ASCII\r
+       PUSHJ   P,PUT           ;OUTPUT CHAR\r
+       ILDB    CHR,T1          ;GET SUCCEEDING CHARS\r
+       TLNN    T1,400000       ;WAIT TILL POINTING TO NEW\r
+       JRST    OCTL1           ;WORD, THEN EXIT. MEAN WHILE\r
+       POPJ    P,              ;PRINT OCTAL NUMBERS\r
+\r
+;OUTPUT PROTECTION BITS FOUND IN AC 0\r
+\r
+PROTO: JUMPE   0,TABOUT\r
+       MOVEI   CHR,40\r
+       PUSHJ   P,PUT\r
+       MOVEI   CHR,120\r
+       TRNE    0,4\r
+       PUSHJ   P,PUT\r
+       MOVEI   CHR,122\r
+       TRNE    0,2\r
+       PUSHJ   P,PUT\r
+       MOVEI   CHR,127\r
+       TRNE    0,1\r
+       PUSHJ   P,PUT\r
+       JRST    TABOUT          ;EXIT\r
+\r
+\f;THIS IS THE DISK ERROR ROUTINE.  CALL DERR4 WITH T3=FIRST WORD ADDRESS\r
+;OF LOOKUP OR ENTER. USE T7 FOR SAVING THE ERROR CODE.\r
+\r
+DERR6: MOVEI   T6,DTON         ;LOCATION OF FILENAME (OUTPUT)\r
+       SKIPA   \r
+DERR5: MOVEI   T6,ZRF          ;LOCATION OF FILENAME (INPUT)\r
+DERR5A:        HRRZ    T7,1(T6)        ;ERROR TYPE\r
+       TRZ     T7,TABLE-TABLND\r
+DERR4: ERRPNT  </? />\r
+       PUSHJ   P,FN.EX         ;PRINT FILE NAME .EXT\r
+       JRST    TABLE(14)       ;AND PRINT MESSAGE\r
+TABLE: JRST    E1\r
+       JRST    E2\r
+       JRST    E3\r
+       JRST    E4\r
+       JRST    E5\r
+       JRST    E6\r
+       JRST    E7\r
+       JRST    E8\r
+TABLND:\r
+DERR5B:        MOVEI   T6,UFD\r
+       JRST DERR5A\r
+E1:    ERRPN2 </(0) file was not found!/>\r
+E2:    ERRPN2 </(1) no such project-programmer number!/>\r
+E3:    ERRPN2 </(2) protection failure!/>\r
+E4:    ERRPN2 </(3) file was being modified!/>\r
+E5:    ERRPN2 </(4) rename file name already exists!/>\r
+E6:    ERRPN2 </(5) rename error!/>\r
+E7:    ERRPN2 </(6)!/>\r
+E8:    ERRPN2 </(7)!/>\r
+\r
+ADATE: POINT 12,FILNAM+1,35    ;ACCESS DATE\r
+CTIME: POINT 11,FILNAM+2,23    ;CREATION TIME\r
+CDATE: POINT 12,FILNAM+2,35    ;CREATION DATE\r
+PROT:  POINT 3,FILNAM+2,2      ;PROTECTION\r
+MODE:  POINT 3,FILNAM+2,8      ;RECORDING MODE\r
+OWNER: POINT 3,FILNAM+2,5\r
+PROJ:  POINT 4,FILNAM+2,12\r
+       IMPURE\r
+TM2:   BLOCK   1\r
+UFD:   BLOCK   4               ;[P,P] OR *FD*\r
+                               ;UFD OR SYS\r
+TM1:   BLOCK   1\r
+ADSK1: BLOCK   1               ;OPEN DIRECTORY, MODE\r
+ADSK:  BLOCK   2               ;FILENAME, EXT\r
+LIN:   BLOCK   1               ;COUNT FOR DISK DIR LIST\r
+LISTTY:        BLOCK   1               ;LISTING TO TTY\r
+UFDIN: BLOCK   3               ;HEADER FOR READING DISK DIRECTORY\r
+BLKSUM:        BLOCK   1               ;TOTAL NBR BLOCKS PER PROJ. PROG NBR\r
+BLKTMP:        BLOCK   1               ;HOLDS SUM\r
+IFN TEMP,<\r
+TMPEND:        BLOCK   1\r
+TMPFLG:        BLOCK   1\r
+TMPPNT:        BLOCK   1\r
+>\r
+LOWTOP:        \r
+       PURE\r
+       LIT\r
+PIPEND:        END PIP1\r
diff --git a/src/pip.opr b/src/pip.opr
new file mode 100644 (file)
index 0000000..4f052e9
--- /dev/null
@@ -0,0 +1,8 @@
+\r
+PIP ASSEMBLY AND LOADING INSTRUCTIONS\r
+SEE PAGE ONE OF PIP SOURCE FOR SPECIAL SWITCH SETTING\r
+\r
+THE FOLLOWING IS THE VERSION SUPPLIED BY DEC\r
+       .LOAD /MACRO PIP.NN\r
+       .SSAVE DSK PIP\r
+\f
\ No newline at end of file
diff --git a/src/systat.mac b/src/systat.mac
new file mode 100644 (file)
index 0000000..59cb521
--- /dev/null
@@ -0,0 +1,661 @@
+\fTITLE SYSTAT - V410\r
+SUBTTL R CLEMENTS /CHW DEC 24 69\r
+VSYSTAT==410\r
+\r
+LOC 137\r
+EXP VSYSTAT\r
+RELOC\r
+       loc     140\r
+\r
+;AC ASSIGNMENTS\r
+\r
+M=0\r
+A=1\r
+B=2\r
+C=3\r
+D=4\r
+J=5\r
+JS=6\r
+R=7\r
+N=10\r
+N1=11\r
+F=12\r
+BP=13\r
+WD=15\r
+CH=16\r
+P=17\r
+\r
+;I/O CHANNEL\r
+\r
+TTY=0\r
+\r
+IFNDEF STANSW,<        STANSW==0>\r
+\r
+IFNDEF HACKSW,<        HACKSW==0>\r
+\r
+IFNDEF JIFSEC,<JIFSEC==^D60>\r
+\r
+L.BDO="B"-"A"          ;B WAS TYPED\r
+L.DSO="D"-"A"          ;D  "    "\r
+L.FSO="F"-"A"          ;F  "    "\r
+L.SSO="S"-"A"          ;S  "    "\r
+L.JSO="J"-"A"          ;J  "    "\r
+L.EJS="H"-"A"          ;H  "    "\r
+\f;FLAGS (LH OF F)\r
+\r
+FL.HGH==1      ;HIGH SEG PARAGRAPH NEEDED\r
+FL.DEV==2      ;DEVICE HEADER OUTPUT\r
+FL.GOD==4      ;I AM [1,N]\r
+FL.LGI==10     ;I AM LOGGED IN\r
+FL.DTJ==20     ;THIS JOB DETACHED\r
+FL.DOR==40     ;DORMANT SEG TABLE BEING PRINTED\r
+FL.BRK==SIGN   ;NO MORE CHS. TO I/P OR BREAK CH. SEEN\r
+\r
+;STUFF WHICH HAS TO AGREE WITH MONITOR, ASIDE FROM GETTAB DEFNS\r
+\r
+JNA==40000\r
+JLOG==4\r
+ASSCON==400000\r
+ASSPRG==200000\r
+SNA==400000\r
+JSWP==2000\r
+SHRSEG==200000\r
+\r
+DEVSER==3\r
+DEVMOD==4\r
+DEVCHR==1\r
+DEVNAM==0\r
+\r
+;PARAMETERS\r
+\r
+SIGN=400000\r
+DVDSK==200000\r
+DVTTY==10\r
+OUTMSK==377000\r
+\r
+MLON\r
+\r
+;CALLI'S\r
+\r
+CI.RES==0\r
+CI.DDT==3\r
+CI.COR==11\r
+CI.EXI==12\r
+CI.LGO==17\r
+CI.PEK==33\r
+CI.GET==41\r
+\r
+EXTERN JOBDDT,JOBREL,JOBSYM,JOBFF\r
+\f;START HERE\r
+\r
+SYSTAT:        CALLI   CI.RES\r
+       MOVE    P,PDP           ;SETUP STACK PNTR.\r
+       MOVEI   M,0\r
+       INIT    TTY,0\r
+         SIXBIT /TTY/\r
+         XWD   TYOB,0\r
+         HALT  .\r
+       MOVE    A,[SIXBIT /SYSTAT/]\r
+       MOVSI   B,(SIXBIT /TXT/)\r
+       SETZB   C,D             ;CLEAR DATE & PPN\r
+       ENTER   TTY,A\r
+       JFCL\r
+       OUTBUF  TTY,1\r
+       MOVE    A,XSTATS        ;MY STATUS\r
+       PUSHJ   P,GETA\r
+       MOVEM   A,STATES\r
+       JUMPE   A,DNTSTO\r
+       MOVEI   B,JIFSEC\r
+       TLNE    A,4000\r
+       MOVEI   B,62\r
+       MOVEM   B,TCKSEC\r
+DNTSTO:        MOVE    A,XSEGPT        ;READ TTY STATUS DATA\r
+       PUSHJ  P,GETA   \r
+       MOVEM  A,SEGPTR   \r
+       HLRE   B,A      \r
+       MOVNM  B,SEGN   \r
+       HRRZM  A,JOBN   \r
+       ADD    A,SEGN   \r
+       HRRZM  A,BOTH   \r
+       HRRZ   A,JOBFF    \r
+       MOVEM  A,ZERLOW   \r
+       MOVEM  A,FREE   \r
+       HRRZ   A,JOBREL     \r
+       SKIPE  JOBDDT       \r
+SYS0A: HRRZ   A,JOBSYM    \r
+       MOVEM  A,ZERHGH   \r
+       HRROI  A,       \r
+       PUSHJ   P,GETA\r
+       HRROI   B,2             ;MY PPN\r
+       CALLI   B,CI.GET\r
+         SETO  B,              ;NON DISK SYSTEM-FLAG AS UNGODLY\r
+       TLNE    A,JLOG          ;LOGGED IN?\r
+       TLO     M,FL.LGI        ;YES-REMEMBER IT\r
+       TLNN    B,-2            ;PROJECT 1?\r
+       TLNN    A,JLOG          ;YES-LOGGED IN?\r
+       SKIPA                   ;NO\r
+       TLO     M,FL.GOD        ;WE'RE GOD\r
+       SETZM   MTTY\r
+       SETZM   @ZERLOW\r
+       MOVE    A,ZERLOW\r
+       HRLS    A\r
+       ADDI    A,1\r
+       BLT     A,@ZERHGH\r
+       MOVE    A,FREE\r
+       HRRM    A,.DDB\r
+       MOVSI   J,10\r
+SYS0L: MOVS    A,J\r
+       CALLI   A,CI.GET\r
+         JRST  SYS0X\r
+       SOS     MTTY\r
+       MOVEM   A,@.DDB\r
+       AOJA    J,SYS0L\r
+\fSYS0X:        MOVN    A,MTTY          ;GET NUMBER OF JOBS\r
+       ADDB    A,FREE          ;ADVANCE POINTER\r
+       HRRM    A,.TTY          ;SETUP TABLE OF LINE NUMBERS\r
+       HRLZ    N,MTTY\r
+SYS0Y: MOVE    J,N\r
+       MOVE    B,@.DDB\r
+       LDB     J,[POINT 8,B,11]\r
+       TLZ     B,-1\r
+       JUMPE   B,SYS0Z\r
+       CALLI   B,CI.PEK\r
+       MOVEM   B,@.TTY\r
+SYS0Z: AOBJN   N,SYS0Y\r
+       SUBTTL  READ JOB AND SEGMENT STATUS\r
+       MOVE    A,JOBN\r
+       ADDB    A,FREE\r
+       MOVE    B,[XWD -NTAB,TABPTR]\r
+       MOVE    C,(B)\r
+       HRRM    A,(C)\r
+       MOVE    A,JOBN\r
+       IMULI   A,NJOBT\r
+       MOVE    C,SEGN\r
+       IMULI   C,NSEGT\r
+       ADD     A,C\r
+       ADD     A,FREE\r
+       HRRZ    C,JOBREL\r
+       CAIL    C,(A)\r
+       JRST    INIT1\r
+       HRRZS   A\r
+       CALLI   A,CI.COR\r
+         JRST  NOCOR\r
+INIT1: MOVE    C,(B)\r
+       HRRZ    J,BOTH\r
+       TLZN    C,SIGN\r
+       HRRZ    J,JOBN\r
+       MOVE    A,FREE\r
+       ADDI    A,(J)\r
+       HRRM    A,1(C)\r
+       HRRZM   A,FREE\r
+       MOVNS   J\r
+       HRLZS   J\r
+INIT2: MOVS    A,C\r
+       PUSHJ   P,GETAJ\r
+       MOVEM   A,@0(C)\r
+       AOBJN   J,INIT2\r
+       AOBJN   B,INIT1\r
+\f      MOVE    A,FREE\r
+       ADD     A,SEGN\r
+       HRRZM   A,FREE\r
+       MOVE    A,.SEGCT\r
+       HRLS    A\r
+       SETZM   (A)\r
+       ADDI    A,1\r
+       BLT     A,@FREE\r
+       MOVE    A,XCORMX        ;GET SIZE OF USER CORE\r
+       PUSHJ   P,GETA\r
+       MOVEM   A,CORMAX\r
+       MOVE    A,XVIRTL\r
+        PUSHJ   P,GETA\r
+        MOVEM   A,VIRTAL\r
+       MOVEI   F,[ASCIZ /\r
+Status of /]\r
+       PUSHJ   P,MSG\r
+       MOVEI   B,0\r
+CONST: MOVEI   C,11\r
+SYS2:  MOVEI   F,1\r
+       MOVE    A,C\r
+       PUSHJ   P,GETA\r
+       PUSHJ   P,MSG\r
+       AOBJN   C,.+1\r
+       TRNE    A,376\r
+       SOJA    C,SYS2\r
+       MOVEI   F,[ASCIZ / at /]\r
+       PUSHJ   P,MSG\r
+       MOVE    A,XTIME\r
+       PUSHJ   P,GETA\r
+       PUSHJ   P,TCKTIM\r
+       MOVEI   F,[ASCIZ / on /]\r
+       PUSHJ   P,MSG\r
+       MOVE    A,XDATE         ;GET TODAY'S DATE\r
+       PUSHJ   P,GETA\r
+       MOVEM   A,DATE\r
+       IDIVI   A,^D31\r
+       MOVEI   N,1(B)\r
+       PUSHJ   P,DECPR2\r
+       IDIVI   A,^D12\r
+       MOVE    B,MONTAB(B)\r
+       MOVEI   C,0\r
+       MOVEI   F,B\r
+       PUSHJ   P,MSG\r
+       MOVEI   N,^D64(A)\r
+       PUSHJ   P,DECPRT        ;PRINT MESSAGE FOLLOWED BY DECIMAL NO.\r
+       PUSHJ   P,CRLF2\r
+\f      MOVEI   F,[ASCIZ /Uptime /]\r
+       PUSHJ   P,MSG\r
+       MOVE    A,XUPTIM\r
+       PUSHJ   P,GETA          ;GET UPTIME\r
+       PUSH    P,A\r
+       PUSHJ   P,TCKTIM\r
+       MOVEI   F,[ASCIZ /, /]\r
+       PUSHJ   P,MSG\r
+       MOVEI   J,0\r
+       MOVE    A,@.TIM         ;GET NULL TIME\r
+       IMULI   A,^D100\r
+       POP     P,N             ;SAVE FOR COMPUTING IDLE & LOST TIME\r
+       IDIV    A,N             ;COMPUTE % NULL TIME\r
+       MOVE    N,A             ;SAVE IT\r
+       PUSHJ   P,DECPRT        ;PRINT MESSAGE FOLLOWED BY DECIMAL NO.\r
+       MOVEI   F,[ASCIZ /% Null time\r
+\r
+Job    Who     Where   What    Size    State   Runtime\r
+\r
+/]\r
+       PUSHJ   P,MSG\r
+SYS4A: MOVN    J,JOBN\r
+       HRLZS   J\r
+       SETZM   CORUSE          ;CLEAR TOTAL VIRT. CORE USED\r
+\fSYSL1:        MOVE    JS,@.STS\r
+       TLNN    JS,JNA\r
+       JRST    DUNJOB\r
+        MOVE    A,@.SGN\r
+       JUMPLE  A,SYSL1E\r
+       SUB     A,JOBN\r
+       AOS     @.SEGCT         ;INCREMENT HISEG USE COUNT\r
+       TLO     M,FL.HGH\r
+SYSL1E:        HRRZ    N,J\r
+       PUSHJ   P,DECPRT\r
+       PUSHJ   P,TAB\r
+       TLZ     FL.DTJ\r
+       TLO     FL.DTJ\r
+       SKIPN   A,@.TTY\r
+       SKIPA   A,[SIXBIT /DET/]\r
+       TLZ     M,FL.DTJ\r
+       MOVEM   A,JOBTTY\r
+       TLNN    M,FL.DTJ\r
+       TLNN    JS,JLOG\r
+       JRST    NOWHO\r
+SYSL1C:        MOVE    A,@.PPN         ;\r
+       HLRZ    N,A\r
+       PUSHJ   P,OCTPRT                ;PRINT PRJ-PRG #\r
+\fSYSL1D:       PUSHJ   P,COMMA\r
+       HRRZ    N,A\r
+       PUSHJ   P,OCTPRT\r
+SYS5:  PUSHJ   P,TAB\r
+       MOVE    A,JOBTTY\r
+       PUSHJ   P,SIXBP         ;PRINT SIXBIT MSG FOLLOWED BY TAB\r
+       PUSHJ   P,TAB\r
+       MOVE    A,@.PRG\r
+       PUSHJ   P,SIXBP         ;PRINT SIXBIT MSG FOLLOWED BY TAB\r
+       PUSHJ   P,TAB\r
+       MOVE    A,@.ADR\r
+       JUMPN   A,SYS6\r
+       TLNN    JS,JSWP\r
+       JRST    SYS6\r
+       MOVE    A,@.SWP\r
+       ANDI    A,777\r
+       JRST    SYS6A\r
+SYS6:  TLNE    A,1777\r
+       TLO     A,1777\r
+       ADD     A,[XWD 1,0]\r
+       ASH     A,-^D28\r
+SYS6A: MOVEI   N,(A)\r
+       ADDM    N,CORUSE\r
+       PUSHJ   P,DECPRT\r
+       MOVEI   F,[ASCIZ /K     /]\r
+       PUSHJ   P,MSG\r
+       MOVSI   A,(SIXBIT /^C/)\r
+       JUMPGE  JS,TSTATE\r
+       TLNE    JS,JSWP\r
+       TLNE    JS,170\r
+       JRST    SYS7\r
+       MOVSI   A,(SIXBIT /SW/)\r
+       JRST    TSTATE\r
+SYS7:  LDB     B,[POINT 4,JS,14]\r
+       MOVE    A,QTAB(B)\r
+TSTATE:        PUSHJ   P,SIXBP\r
+       PUSHJ   P,TAB           ;PRINT STATE AND "SW"/"SF" IF SWAPPED/& FRAGMENTED\r
+       MOVE    A,@.TIM\r
+       PUSHJ   P,TCKTIM\r
+RET2:  PUSHJ   P,CRLF\r
+DUNJOB:        AOBJN   J,SYSL1\r
+       TLNN    M,FL.HGH\r
+       JRST    DORMNT\r
+\fHIGH: MOVEI   F,[ASCIZ /\r
+High Segments\r
+\r
+Program        Owner   High K  Users\r
+\r
+/]\r
+       PUSHJ   P,MSG\r
+       MOVE    J,SEGPTR\r
+HIGH00:        MOVE    JS,@.STS\r
+       TLNN    JS,SNA\r
+       JRST    DUNHGH\r
+       SKIPN   A,@.PRG\r
+       JRST    [MOVE   A,[SIXBIT /(PRIV)/]\r
+               TLNE    JS,SHRSEG\r
+               MOVE    A,[SIXBIT /(OBS)/]\r
+               JRST    .+1]\r
+HIGH01:        PUSHJ   P,SIXBP\r
+HIGH1A:        PUSHJ   P,TAB\r
+       MOVE    A,@.PPN\r
+       JUMPN   A,HIGH03\r
+        hrrz    D,.PPN\r
+\f;SUBROUTINE TO FIND 1ST. JOB USING A SEGMENT\r
+;CALL  MOVE    J,SEGMENT NO.\r
+;      PUSHJ   P,SEGSCN\r
+;      NONE FOUND RETURN\r
+;      FOUND\r
+;AC'S B & C DESTROYED\r
+;AC J IS RESPECTED\r
+\r
+SEGSCN:        MOVN    B,JOBN\r
+       HRLZS   B\r
+       HRR     B,.SGN          ;PREPARE AOBJN PTR. FOR SCANNING JBTSGN\r
+HIGH04:        ADDI    D,1\r
+       HRRZ    C,(B)           ;GET SEGMENT NO.\r
+HIGH06:        CAIN    C,(J)           ;DOES IT MATCH WITH CURRENT ONE?\r
+       SKIPA\r
+       AOBJN   B,HIGH04        ;NO-DO AGAIN\r
+HIGH03:        SKIPGE  M,B\r
+       JUMPE   A,[     MOVEI   F,[ASCIZ /Job /]\r
+                       PUSHJ   P,MSG\r
+                       SUB     B,.SGN\r
+                       HRRZ    N,B\r
+                       PUSHJ   P,DECPRT\r
+                       JRST    HIGH08]\r
+       JUMPLE  A,HIGH07\r
+       HLRZ    N,A\r
+       PUSHJ   P,OCTPRT\r
+       PUSHJ   P,COMMA\r
+       HRRZ    N,A\r
+       PUSHJ   P,OCTPRT\r
+       JRST    HIGH08\r
+HIGH07: PUSHJ  P,SIXBP\r
+HIGH08:        PUSHJ   P,TAB\r
+       MOVE    A,@.ADR\r
+       JUMPN   A,HIGH10\r
+       TLNN    J,2000\r
+       JRST    HIGH10\r
+HIGH09:        MOVE    A,@.SWP\r
+       JRST    HIGH11\r
+HIGH10:        TLNE    A,1777\r
+       TLO     A,1777\r
+       ADD     A,[1000000]\r
+       ASH     A,-34\r
+HIGH11:        ANDI    A,377\r
+       MOVEI   N,0(A)\r
+       ADDM    N,CORUSE\r
+       PUSHJ   P,DECPRT\r
+       MOVEI   F,[ASCIZ /K     /]\r
+       PUSHJ   P,MSG\r
+       MOVEI   A,0(J)\r
+       SUB     A,JOBN\r
+       MOVE    N,@.SEGCT\r
+       PUSHJ   P,DECPRT\r
+       PUSHJ   P,CRLF\r
+DUNHGH:        AOBJN   J,HIGH00\r
+DORMNT:        MOVE    N,CORMAX\r
+       ASH     N,-12\r
+       SUB     N,CORUSE\r
+       JUMPL   N,HIGH12\r
+       PUSHJ   P,CRLF\r
+       PUSHJ   P,DECPRT\r
+       MOVEI   F,[ASCIZ /K Core left,/]\r
+       PUSHJ   P,MSG\r
+       JRST    HIGH13\r
+HIGH12:        MOVNS   M,N\r
+       MOVEI   F,[ASCIZ /\r
+Swapping /]\r
+       PUSHJ   P,MSG\r
+       PUSHJ   P,DECPRT\r
+       MOVEI   F,[ASCIZ /K,/]\r
+       PUSHJ   P,MSG\r
+HIGH13:        MOVEI   F,[ASCIZ / Virt. core left = /]\r
+       PUSHJ   P,MSG\r
+       MOVE    N,VIRTAL\r
+       PUSHJ   P,DECPRT\r
+       PUSHJ   P,CRLF2\r
+\fDEVQ: MOVE    D,XDVLST\r
+       CALLI   D,CI.GET\r
+         JRST  FINIS\r
+DEVLP: TLNN    D,-1\r
+       JRST    DEVEND\r
+       HLRZS   D\r
+       MOVEI   B,DEVMOD(D)\r
+       CALLI   B,CI.PEK\r
+       TRNE    B,ASSCON+ASSPRG\r
+       TLNE    B,DVTTY+DVDSK\r
+       JRST    NXTDEV\r
+       MOVEI   C,DEVCHR(D)\r
+       CALLI   C,CI.PEK\r
+       MOVEI   A,DEVNAM(D)\r
+       CALLI   A,CI.PEK\r
+       MOVEI   F,[ASCIZ /Busy devices:\r
+\r
+Device Job     Why\r
+\r
+/]\r
+       TLON    M,FL.DEV\r
+       PUSHJ   P,MSG\r
+       PUSHJ   P,SIXBP         ;PRINT SIXBIT MSG FOLLOWED BY TAB\r
+       PUSHJ   P,TAB\r
+       LDB     N,[POINT 6,C,5]\r
+       PUSHJ   P,DECPRT\r
+       PUSHJ   P,TAB\r
+       MOVEI   F,[ASCIZ /AS/]\r
+       TRNE    B,ASSCON\r
+       PUSHJ   P,MSG\r
+       TRNN    B,ASSPRG\r
+       JRST    DVCRLF\r
+       MOVEI   CH,"+"\r
+       TRNE    B,ASSCON\r
+       PUSHJ   P,TYO\r
+       MOVEI   F,[ASCIZ /INIT/]\r
+       PUSHJ   P,MSG\r
+DVCRLF:        PUSHJ   P,CRLF\r
+NXTDEV:        MOVEI   D,DEVSER(D)\r
+       CALLI   D,CI.PEK\r
+       JRST    DEVLP\r
+\r
+\fDEVEND:       MOVEI   F,[ASCIZ /No busy devices\r
+/]\r
+       TLNN    M,FL.DEV\r
+       PUSHJ   P,MSG\r
+       PUSHJ   P,CRLF2\r
+FINIS: JRST    KILL            ;YES-GO SEE IF WE SHOULD EXIT OR INTERPRET MORE CHS.\r
+\r
+\r
+\r
+NOCOR: MOVEI   F,[ASCIZ /?NEED MORE CORE FOR DATA\r
+\r
+/]\r
+       PUSHJ   P,MSG\r
+KILL:  TLNE    M,FL.LGI\r
+       CALLI   0,CI.EXI        ;MONRET\r
+       MOVEI   F,KJMSG\r
+       CALLI   F,CI.DDT\r
+       CALLI   CI.LGO\r
+\r
+KJMSG: ASCII   /.KJOB/\r
+       BYTE    (7) 15,12,".",4,0\r
+\fGETAJ:        HRLI    A,(J)\r
+GETA:  CALLI   A,CI.GET\r
+         TDZA  A,A\r
+       POPJ    P,0\r
+       MOVEI   CH,77\r
+       JRST    TYO\r
+\r
+NOWHO: TLNE    M,FL.GOD\r
+       JRST    SYSL1C          ;SKIP RETURN ONLY IF GOD\r
+       MOVE    A,[SIXBIT /**,**/]\r
+       PUSHJ   P,SIXBP\r
+       JRST    SYS5\r
+\r
+CRLF2: PUSHJ   P,CRLF\r
+CRLF:  MOVEI   F,[ASCIZ /\r
+/]\r
+MSG:   HRLI    F,440700\r
+MSG1:  ILDB    CH,F\r
+       JUMPE   CH,CPOPJ\r
+       PUSHJ   P,TYO\r
+       JRST    MSG1\r
+\r
+COLON: MOVEI   CH,":"\r
+       JRST    TYO\r
+COMMA: MOVEI   CH,","\r
+       JRST    TYO\r
+\r
+;SIXTAB:       PUSHJ   P,SIXBP\r
+TAB:   MOVEI   CH,11\r
+TYO:   SOSG    TYOB+2\r
+       OUTPUT  TTY,0\r
+       IDPB    CH,TYOB+1\r
+       CAIN    CH,12\r
+       OUTPUT  TTY,0\r
+       POPJ    P,0\r
+\fTCKTIM:       IDIV    A,TCKSEC        ;JUNK JIFFIES\r
+       IDIVI   A,^D60*^D60\r
+       MOVE    N,A\r
+       PUSHJ   P,DECPR2\r
+       PUSHJ   P,COLON\r
+       IDIVI   B,^D60\r
+       MOVE    N,B\r
+       PUSHJ   P,DECPR2\r
+       PUSHJ   P,COLON\r
+       MOVE    N,C\r
+       JRST    DECPR2\r
+SIXBP: MOVE    BP,[XWD 440600,A]\r
+SIXBP1:        ILDB    CH,BP\r
+       JUMPE   CH,CPOPJ\r
+       ADDI    CH,40\r
+       PUSHJ   P,TYO\r
+       TLNE    BP,770000\r
+       JRST    SIXBP1\r
+CPOPJ: POPJ    P,0\r
+DECPR2:        MOVEI   CH,60\r
+       CAIG    N,11\r
+       PUSHJ   P,TYO\r
+DECPRT:        MOVEI   R,12\r
+RDXPRT:        MOVEI   CH,"-"\r
+       SKIPGE  N\r
+       PUSHJ   P,TYO\r
+       MOVMS   N\r
+RADIX1:        IDIVI   N,(R)\r
+       HRLM    N1,0(P)\r
+       SKIPE   N\r
+       PUSHJ   P,RADIX1\r
+       HLRZ    CH,0(P)\r
+       ADDI    CH,60\r
+       JRST    TYO\r
+OCTPRT:        MOVEI   R,10\r
+       JRST    RDXPRT\r
+\f;CONSTANTS FOR GETTAB UUO\r
+\r
+XTIME: XWD     10,11\r
+XDATE: XWD     11,11\r
+XSEGPT:        XWD     15,11\r
+XUPTIM:        XWD     15,12\r
+XDVLST:        XWD     14,11\r
+XVIRTL:        XWD     4,13\r
+XCORMX:        XWD     10,12\r
+XSTATS:        XWD     17,11\r
+\r
+QTAB:  SIXBIT /RN/\r
+       SIXBIT /WS/\r
+       SIXBIT /TS/\r
+       SIXBIT /ST/\r
+       SIXBIT /AU/\r
+       SIXBIT /MQ/\r
+       SIXBIT /DA/\r
+       SIXBIT /DT/\r
+       SIXBIT /DC/\r
+       SIXBIT /MT/\r
+       SIXBIT /IO/\r
+       SIXBIT /TT/\r
+       SIXBIT /SL/\r
+       SIXBIT /NL/\r
+       SIXBIT /^C/\r
+       BLOCK   1\r
+\r
+MONTAB:        ASCII /-Jan-/\r
+       ASCII /-Feb-/\r
+       ASCII /-Mar-/\r
+       ASCII /-Apr-/\r
+       ASCII /-May-/\r
+       ASCII /-Jun-/\r
+       ASCII /-Jul-/\r
+       ASCII /-Aug-/\r
+       ASCII /-Sep-/\r
+       ASCII /-Oct-/\r
+       ASCII /-Nov-/\r
+       ASCII /-Dec-/\r
+\fTABPTR:       XWD     SIGN+0,.STS\r
+       XWD     SIGN+2,.PPN\r
+       XWD          4,.TIM\r
+       XWD         14,.SGN\r
+       XWD     SIGN+3,.PRG\r
+       XWD     SIGN+1,.ADR\r
+       XWD     SIGN+7,.SWP\r
+NTAB==.-TABPTR\r
+       XWD          0,.SEGCT\r
+\r
+NSEGT==6\r
+NJOBT==7\r
+\r
+.DDB:  XWD     J,0\r
+.TTY:  XWD     J,0     ;L\r
+.STS:  XWD     J,0\r
+.PPN:  XWD     J,0     ;L+H\r
+.TIM:  XWD     J,0     ;L\r
+.SGN:  XWD     J,0     ;L\r
+.PRG:  XWD     J,0     ;L+H\r
+.ADR:  XWD     J,0     ;L+H\r
+.SWP:  XWD     J,0     ;L+H\r
+.SEGCT:        XWD     A,0     ;H\r
+\r
+\r
+;TEMPORARIES\r
+\r
+PDP:   XWD     -20,.\r
+       BLOCK   21\r
+\r
+TYOB:  BLOCK   3\r
+\r
+JOBN:  0\r
+SEGN:  0\r
+BOTH:  0\r
+\r
+CORMAX:        0\r
+VIRTAL:        0\r
+SEGPTR:        0\r
+CORUSE:        0\r
+\r
+MTTY:  0\r
+FREE:  0\r
+ZERLOW:        0\r
+ZERHGH:        0\r
+\r
+JOBTTY:        0\r
+DATE:  0\r
+TCKSEC:        JIFSEC\r
+STATES:        0\r
+\r
+XLIST  ;AVOID PRINTING LITERALS\r
+\r
+LIT\r
+LIST\r
+\r
+SYSEND:        END     SYSTAT\r
diff --git a/src/systat.opr b/src/systat.opr
new file mode 100644 (file)
index 0000000..b1bdc5f
--- /dev/null
@@ -0,0 +1,12 @@
+TO LOAD AND SAVE SYSTAT, TYPE:\r
+\r
+       .LOAD  SYSTAT\r
+       .SSAVE DSK:SYSTAT\r
+\r
+THE FOLLOWING ASSEMBLY OPTIONS ARE SUPPORTED:\r
+\r
+PURESW    (0)     ;IF 1, MAKES REENTRANT VERSION, 0 USES SPY\r
+HACKSW    (-1)    ;IF 1, INCLUDE HACKS ON ALL SYSTEMS, 0 ON NONE,\r
+                       -1 JUST ON DEC IN-HOUSE SYSTEMS\r
+JIFSEC    (60)    ;JIFFIES/SECOND FOR OLD MONITORS\r
+NSPMEM    (1000)  ;NANO-SECONDS/MEMORY CYCLE FOR OLD MONITORS\r