--- /dev/null
+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