TITLE RDMT11- PDP-11 MAGTAPE UTILITY/W. J. MESERVE/WJM 25 AUG 72. SUBTTL MAIN ROUTINE. F= 0 ;LH=FLAGS AS LISTED BELOW. FEOF= 1B18 ;EOF SEEN ON MTA. FAST= 1B19 ;ASTERISK SEEN IN FILE SPEC. FDEL= 1B20 ;OUTPUT DELIMITER SEEN IN CMD. ;RH=ERROR NUMBERS WHEN RETURNING TO CALLER. P1= 1 P2= 2 P3= 3 A1= 4 ;AC'S TO PASS ARGUMENTS BETWEEN ROUTINES. A2= 5 A3= 6 A4= 7 A5= 10 T1= 11 ;TEMPORARY AC'S. T2= 12 T3= 13 T4= 14 T5= 15 T6= 16 P= 17 ;PUSHDOWN POINTER. ;ERROR NUMBERS STORED IN RH(F) WHEN ERROR DETECTED. SEQR= 1 ;CHAR SEQUENCE ERROR IN INPUT CMD STRING. ILCR= 2 ;ILLEGAL CHAR IN INPUT CMD STRING. DELR= 3 ;ILLEGAL DELIMITER IN FILE SPEC. FLDR= 4 ;UNEXPECTED FIELD IN INPUT STRING. INPR= 5 ;NO INPUT DATA-SET SPECIFICATION. CHCR= 6 ;TOO MANY CHARACTERS IN COMMAND. MTIR= 7 ;CAN'T INIT MTA. DKIR= 10 ;CAN'T INIT DSK. BHDN= 11 ;NON-FATAL BAD HDR FOUND, SKIPS TO NEXT FILE. BTPR= 12 ;FATAL MTA READ ERRORS. DKEN= 13 ;CAN'T ENTER A FILE ON DSK. QUON= 14 ;DISK RAN OVER QUOTA. DKHR= 15 ;HARD DATA ERROR ON DISK. DUPR= 16 ;TOO MANY OUTPUT SPECS SEEN. PDLSIZ= 30 ;SIZE FO PUSHDOWN LIST. FILMAX= 30 ;MAX NUMBER OF FILES ALLOWED IN DATA-SET SPEC. TTBFSZ= 17 ;NUMBER OF WORDS PER TTY BUFFER. TTCHMX= TTBFSZ*5;MAX NUMBER OF CHARS PER TTY BUFFER. ;STATUS BITS FOR ALL DEVICES. IOIMPM= 1B18 ;IMPROPER MODE. IODERR= 1B19 ;HARD DATA ERROR. IODTER= 1B20 ;DATA ERROR. IOBKTL= 1B21 ;BLOCK TOO LARGE OR QUOTA PROBLEM. IOEOF= 1B22 ;EOF SEEN ON INPUT. ;STATUS BITS FOR MTA. IOBOT= 1B24 ;BEGINNING OF TAPE. IOTEND= 1B25 ;END OF TAPE. ;MTAPE UUO'S MTASLP= 0 ;MAKE MTA WAIT FOR END OF OP. MTAREW= 1 ;REWIND MTA. MTABKR= 7 ;BACKSPACE MTA ONE RECORD. MTABKF= 17 ;BACKSPACE MTA ONE FILE. MTASFL= 16 ;SKIP FORWARD ONE FILE. MTAIND= 101 ;INIT MTA FOR INDUSTRY COMPATIBLE MODE. ;DATA MODES IMBIN= 13 ;BUFFERED IMAGE BINARY FOR DISK. IMODE= 10 ;IMAGE MODE FOR MTA. ;I/O CHANNELS MTACH= 0 DSKCH= 1 ;OTHER I/O PARAMETERS. MTBYT= 10 ;MTA BYTSIZE. MTNMBF= 10 ;NUMBER OF MTA BUFFERS. MTBFSZ= 200 ;SIZE OF MTA BUFFERS. ;MACRO FOR GENERATING MTNMBF MTA BUFFERS. DEFINE XWDBUF(PARAM) < XWD MTBFSZ+1,MTAB'PARAM+1 > DEFINE BLDBUF(X) MTAB'X: 0 XWDBUF (\Y) BLOCK MTBFSZ+1 > ZERO= 0 ;LISTED SO THAT IMPORTANT REFERENCES TO ONE= 1 ;NUMBERS WILL BE INDICATED IN CREF. TWO= 2 THREE= 3 FOUR= 4 FIVE= 5 SIX= 6 SEVEN= 7 TEN= 10 TWENTY= 20 THIRTY= 30 FORTY= 40 FIFTY= 50 SIXTY= 60 SEVENT= 70 HUNDRE= 100 APOST= "'" ASTER= "*" BARRO= "_" COLON= ":" CONTZ= 32 COMMA= "," CRRET= 15 EQUAL= "=" LINFD= 12 PERCT= "%" PRIOD= "." QUEST= "?" QUOTE= 42 SLASH= "/" SPACE= " " PARB= 200 ;PARITY BIT IN MTA BYTE. (ALWAYS IGNORED.) OPDEF PJRST [JRST 0] INIPRO: RESET MOVE P,PDINWD ;INIT PD LIST. INIFLG: SETZM F ;RETURN HERE ON FATAL ERROR. INITAB: MOVE T1,DATINI ;INIT DATA TABLE SETZM DATTAB BLT T1,DATEND PUSHJ P,INICCT ;INIT BUFFER CHAR CNTR. HRRZI T1,ASTER OUTCHR T1 ;OUTPUT ASTERISK. PUSHJ P,PRESCN ;GET INPUT STRING. JRST INIFLG ;ERROR RETURN. PUSHJ P,CMDCDR ;NOW DECODE CMD. JRST INIFLG ;ERROR RETURN. PUSHJ P,MAKFLG ;SET FLAGS FOR WILD CARD CHARS. PAGE SUBTTL MAIN ROUTINE FOR FILE TRANSFER. INIMTA: MOVEI T1,IMODE ;IMAGE MODE FOR MTA. MOVE T2,DEVTAB+1 ;PICK UP INPUT DEVICE NAME. MOVEI T3,MTAHDR ;BFR HEADER ADR. OPEN MTACH,T1 ;INIT MTA. JRST ERMTIR ;(ERROR RETURN, FATAL)CAN'T INIT DEVICE. INIHDR: MOVE T1,MTAIN1 ;INIT MTA BUFFER HEADER FOR 8 BIT BYTES MOVEM T1,MTAHDR MOVE T1,MTAIN2 MOVEM T1,MTAHDR+1 MTAPE MTACH,MTAREW ;REWIND TAPE. WAITMR: MTAPE MTACH,MTASLP ;WAIT A WHILE. STATO MTACH,IOBOT ;BEGINNING OF TAPE? JRST WAITMR ;NO, GO WAIT SOME MORE. MTAPE MTACH,MTAIND ;INIT FOR IND COMP MODE. INIDSK: MOVEI T1,IMBIN ;SET FOR IMAGE BINARY MODE. MOVE T2,DEVTAB ;OUTPUT DEVICE NAME. HRLZI T3,DSKHDR ;BUFFER HDR ADR FOR OUTPUT BUFFER. OPEN DSKCH,T1 ;INIT THE DEVICE. JRST ERDKIR ;(FATAL ERROR) CAN'T INIT. RDMTHD: PUSHJ P,RDHDRC ;READ MTA HEADER RECORD. JRST HDRERR ;EOF OR ERROR RET (BHDN, BTPR). PUSHJ P,CHKMTH ;SEARCH FOR A MATCH AGAINST FILTAB JRST NOMTCH ;NO MATCH FOUND. MOVE T1,HDRFIL ;FOUND A MTACH. HLLZ T2,HDREXT ;PREPARE FOR AN ENTER ON DSK. SETZB T3,T4 ;USER'S PPN ONLY. ENTER DSKCH,T1 ;ENTER SAME NAME ON DSK. JRST ERDKIN ;FATAL ERROR ON ENTER FAILURE. NXTWRD: SETZM P3 ;GOOD ENTER, INIT CHAR COLLECTOR. HRREI P2,-5 ;INIT CHAR COUNTER. NXTBYT: PUSHJ P,GETBYT ;GET MTA BYTE IN A1. JRST RECERR ;EOF OR ERROR RET. TRZ A1,PARB ;IGNORE PARITY. JUMPE A1,NXTBYT ;FORGET NULLS. CAIE A1,177 ;AND DELETES. CAIN A1,32 ;AND ^Z'S. JRST NXTBYT LSH P3,7 ;MAKE ROOM FOR ASCII CHAR. OR P3,A1 ;OR CHAR INTO COLLECTOR. AOJL P2,NXTBYT ;GET NEXT BYTE IF MORE ROOM. LSH P3,1 ;LEFT JUSTIFY 5 ASCII CHARS. PUSHJ P,OUTWRD ;OUTPUT THE WORD. JRST DSKERR ;NON-RECOVERABLE I/O PROBS (DKHR,QUON). JRST NXTWRD ;GET NEXT FIVE BYTES. PAGE ;INPUT ROUTINE FOR MTA. GETBYT: SOSLE MTAHDR+2 ;BUFFER EMPTY? JRST LOADBT ;NO. IN MTACH, ;YES, GET A BUFFER. JRST LOADBT ;NORMAL RET. STATZ MTACH,IOEOF ;ERROR OR EOF. TLOA F,FEOF ;EOF SEEN. HRRI F,BTPR ;MUST BE HARD DATA ERROR POPJ P, ;ERROR RET. LOADBT: ILDB A1,MTAHDR+1 ;GET BYTE. JRST POP2 ;NORMAL RET. ;ROUTINE TO WRITE DISK. OUTWRD: SOSLE DSKHDR+2 ;BUFFER EMPTY? JRST PUTWRD ;NO, IDPB WORD AND RETURN. OUT DSKCH, ;YES, DO AN OUTPUT. JRST PUTWRD ;GOOD RET. HRRI F,DKHR ;ERROR RET, ASSUME DATA ERROR. STATZ DSKCH,IOBKTL ;IS IT QUOTA? HRRI F,QUON ;YES, SET ERROR NUMBER. POPJ P, ;ERROR RET. PUTWRD: IDPB P3,DSKHDR+1 ;DEPOSIT WORD. JRST POP2 ;AND GIVE NORMAL RET. PAGE ;ROUTINE TO GET FILENAME FROM MTA HEADER. ;EXIT WITH NAME STORED IN HDRFIL AND HDREXT. ;NON-SKIP RETURN MEANS EOF OR MTA ERROR OR HEADER ERROR. RDHDRC: JSP P3,GETBT2 ;GET FIRST 3 CHAR OF FILENAME. HLLZM A1,HDRFIL ;STORE THEM. MOVE A1,MTAHDR+2 CAIE A1,^D15 ;SHOULD BE 14 CHARS LEFT IN HDR. JRST BDHDR1 ;NOT A GOOD HEADER BLOCK. JSP P3,GETBT2 ;GET LAST 3 CHARS FO FILENAME. HLRM A1,HDRFIL JSP P3,GETBT2 ;GET EXTENSION. HLLZM A1,HDREXT SETZM MTAHDR+2 ;DONE WITH THIS RECORD. JRST POP2 ;GOOD RETURN. BDHDR1: HRRI F,BHDN ;NOT A HEADER RECORD. POPJ P, ;SKIPS TO NEXT FILE. ;ROUTINE TO PIC UP TWO RADIX50 BYTES AND ;CONVERT THEM TO SIXBIT. ;ROUTINE NORMALLY EXITS TO CALLER. ;IF MTA ERROR CONDITION ROUTINE POP'S UP ONE LEVEL. ;CALLED WITH JSP P3,GETBT2. ;RETURNS TWO BYTES LEFT ADJUSTED IN A1. GETBT2: MOVEI A3,2 ;CNTR TO GET BYTE TWICE. SETZM A2 ;COLLECTOR. GETBT3: PUSHJ P,GETBYT ;GET A BYTE IN A1. POPJ P, ;MTA ERROR OUT. PUSH P,A1 ;SAVE BYTE. SOJG A3,GETBT3 ;GET SECOND BYTE. POP P,A1 ;RETRIEVE EVEN BYTE. LSH A1,10 ;SHIFT EVEN BYTE. POP P,A2 ;RETRIEVE ODD BYTE. OR A1,A2 ;COMBINE TWO BYTES. PUSHJ P,RAD50X ;CONVERT AND JRST (P3) ;RETURN WITH SIXBIT BYTES LEFT ADJUSTED. PAGE ;ROUTINE TO SEARCH FILTAB AND EXTTAB TO SET MASKING FLAGS ; FOR WILD CHARS. ;A4 IS USED AS INDEX INTO FILTAB. ;A NULL FILENAME SIGNALS END OF FILENAMES. MAKFLG: SETOM A4 NXTFGS: AOS A4 ;INCREMENT INDEX. SKIPN A2,FILTAB(A4) ;GET NEXT FILE. POPJ P, ;DONE IF NULL. SETZM A3 HRRM A3,EXTTAB(A4) ;INIT RH(EXTTAB) TRO A3,1B23 ;INIT SLIDING BIT MOVEI A5,6 ;INIT COUNTER FOR UP TO SIX CHARS. PUSHJ P,MAKBIT ;SET FLAGS FOR WILD CHARS SEEN. HLLZ A2,EXTTAB(A4) ;GET EXT AS ARG FOR MAKBIT. MOVEI A5,3 ;INIT COUNTER FOR UP TO 3 CHARS. PUSHJ P,MAKBIT ;SET FLAGS FOR WILD CHARS SEEN IN EXT. MOVEI A2,7 ORM A2,EXTTAB(A4) ;TURN ON RIGHT MOST BITS. SKIPGE A3,CMDFLS ;ANY WILD CHARS YES? JRST NXTFGS ;YES, WILL SEARCH WHOLE TAPE. MOVEI A2,7770 ;NO, TEST FOR WILD CHARS ON THIS FLNM. TDNN A2,EXTTAB(A4) ;WILD CHAR SEEN? AOSA A3 ;NO, INCREMENT FILE COUNT. SETOM A3 ;YES, MAKE INFINITE FILE CNT, MUST SEARCH ENTIRE TAPE. MOVEM A3,CMDFLS ;RESTORE FILE COUNT. JRST NXTFGS MAKBIT: TLZ F,FAST ;INIT ASTERISK SEEN FLAG. NXTTST: SETZM A1 ;INIT CHARACTER REGISTER. LSH A3,-1 ;SLIDE OVER FLAG MASK. TLNE F,FAST ;ASTERISK SEEN? JRST SETBIT ;YES, SO ALL CHARS ARE WILD. LSHC A1,6 ;NO, PICK UP NEXT CHAR. JUMPE A1,SETBT1 ;DONE IF NULL, BUT CONT TO SHIFT BIT. CAIN A1,'?' ;IF QUESTION MARK, SET FLAG FOR MASK. JRST SETBIT CAIE A1,'*' ;IF ASTERISK, SET FLAG AND NOTE IT. JRST SETBT1 TLO F,FAST SETBIT: ORM A3,EXTTAB(A4) ;SET "WILD CHAR BIT". SETBT1: SOJG A5,NXTTST ;CHECK ALL CHARS BEFORE FIRST NULL. POPJ P, PAGE ;ROUTINE TO CHECK FOR A MATCH BETWEEN FILE NAMES. ;FILTAB AND EXTTAB CONTAIN FILES SPECIFIED BY USER COMMAND. ;RH(EXTTAB)=A 12 BIT BYTE WHICH SPECIFIES WILD CARDS. CHKMTH: SETOM A1 ;SET INDEX FOR FILTAB. NXTFNM: AOS A1 ;INCREMENT INDEX. SKIPN A4,FILTAB(A1) ;MORE COMPARISONS TO MAKE? POPJ P, ;NO, FAILURE TO FIND A MATCH. MOVE A3,HDRFIL ;PICK UP FILENAME READ FROM MTA. XOR A3,A4 ;TRY FOR A MATCH. JUMPE A3,TSTEXT ;GOOD IF ZERO, GO TEST EXT. MOVEI A2,7700 ;OTHERWISE BUILD MASK OF WILD CHARS. AND A2,EXTTAB(A1) ;GET BITS THAT SPECIFY BYTE MASK. LSH A2,-6 ;RIGHT JUSTIFY THEM. PUSHJ P,MKBYTM ;GO MAKE BYTE MASK. ANDCM A3,A2 ;BYTE MASK RETURNED IN A2. JUMPN A3,NXTFNM ;NO LUCK, TRY NEXT FILENAME. TSTEXT: HLLZ A3,HDREXT ;HERE TO TEST EXT FOR MATCH. HLLZ T5,EXTTAB(A1) ;GET THE CORRESPONDING EXT. XOR A3,T5 JUMPE A3,FNDMTC ;MATCH IF ZERO. MOVEI A2,77 AND A2,EXTTAB(A1) ;GET BITS THAT SPECIFY WILD CHAR BYTE MASK. PUSHJ P,MKBYTM ;MAKE BYTE MASK. ANDCM A3,A2 ;MASK OUT WILD CHAR POSN'S. JUMPN A3,NXTFNM ;NO MATCH IF NON-ZERO. FNDMTC: MOVEI A4,400000 ;HERE IF MATCH. ORM A4,EXTTAB(A1) ;MARK IT AS A "FOUND FILE". JRST POP2 ;SKIP-RETURN TO INDICATE MATCH. ;HERE TO MAKE BYTE MASK. ;A2 CONTAINS 6 BITS RIGHT ADJUSTED TO SPEC CHAR MASK. MKBYTM: SETZM T1 ;T1 COLLECTS MASK. MOVEI T2,6 ;SET COUNTER. MKBYT1: LSH T1,6 ;SHIFT CHAR MASK. TRZE A2,40 ;IF BIT=1 CHAR POSN IS WILD. ADDI T1,77 LSH A2,1 SOJG T2,MKBYT1 ;REPEAT SEQUENCE 6 TIMES. MKBYDN: MOVE A2,T1 ;RETURN WITH MASK IN A2. POPJ P, PAGE SUBTTL PRESCAN ROUTINE. ;ROUTINE TO PRESCAN THE COMMAND STRING, CHECK FOR ;ILLEGAL CHARACTER SEQUENCES, ILLEGAL CHARACTERS AND ISOLATE ;INPUT AND OUTPUT FILE SPECIFICATIONS. ;(A1)= XWD(FIRST WRD OF CURRENT FILE SPEC, CHAR CNT) ;(A2)= PTR TO CURRENT CHAR. ;(A3)= PREVIOUS CHARACTER PROCESSED. ;(A4)= CURRENT CHARACTER BEING PROCESSED. PRESCN: HRLZI A1,TTIBUF ;INIT BUFFER PTR. TLZ F,FDEL ;INIT DELIMITER SEEN FLAG. PRESC1: HLRZ A2,A1 ;MAKE ILDB PTR. HRLI A2,440700 SETZM A3 ;MAKE LAST CHAR NULL. NXTCHS: PUSHJ P,GETCHR ;GET CHAR IN A4. JRST FLDDEL ;RETURN HERE IF FIELD DELIMITER. JRST ALPCHR ;HERE IF ALPHA-NUMERIC OF SPECIAL JRST ILLCHR ;HERE IF ILLEGAL CHAR. JRST CHCTER ;HERE IF NO MORE ROOM IN BUFFER. ALPCHR: PUSHJ P,CHKSEQ ;CHECK CHR SEQUENCE. JRST SEQERR ;ERROR IN SEQUENCE OF CHARS. JUMPE A3,XFRCHR ;NORMAL RETURN IDPB A3,A2 ;DEPOSIT LAST CHR IF NOT NULL. AOS A1 ;COUNT IT. XFRCHR: HRRZ A3,A4 ;MAKE OLD CHAR=NEW CHAR. JRST NXTCHS ;HERE IF FILE SPEC DELIMITER: _ = (CR) FLDDEL: JUMPE A3,FLDDL1 ;DEPOSIT LAST CHAR IF NOT NULL. IDPB A3,A2 ;DEPOSIT LAST CHAR SEEN. AOS A1 ;COUNT IT. FLDDL1: HRRZM A1,P3 ;SAVE CHAR CNT SKIPE P3 ;IF CHAR CNT=0 MAKE PTR=0. MOVEM A1,P3 HRRZ A1,A1 ADDI A1,FOUR ;CALCULATE ADR FOR NEW PTR. IDIVI A1,FIVE ADDI A1,TTIBUF ;ADD BUFFER ADR. HRLZ A1,A1 ;AND SET FOR NEW PTR. SETZM T1 ;ASSUME OUTPUT SPEC. SUBI A4,CRRET ;SET TO ZERO IF CR. JUMPE A4,CRRETS ;? TLOE F,FDEL ;NO, HAVE WE SEEN OUTPUT SPEC ALREADY? JRST DUPERR ;YES, FATAL ERROR. SKIPA ;NO, JUST NOTE IT AND CONTINUE. CRRETS: AOS T1 ;YES, MUST BE INPUT SPEC. MOVEM P3,TTFLPT(T1) ;PLACE OLD PTR PROPERLY. JUMPN A4,PRESC1 ;GET NXT FLC SPEC IF NOT CR. JRST POP2 ;SKIP RET TO CALLER. DUPERR: HRRI F,DUPR ;ERROR TYPE. CLRBFI ;CLEAR INPUT BUFFER. MOVEI A5,QUEST ;FATAL ERROR. OUTCHR A5 OUTSTR ERDTS ;TOO MANY DATA SETS ERROR MSG. PJRST TTPRCR ;TYPE AND DO NON-SKIP RETURN. ;HERE WHEN ILLEGAL CHAR DETECTED IN INPUT CMD. ILLCHR: HRRI F,ILCR ;SET ERROR NUMBER. CLRBFI ;CLEAR INPUT BUFFER. MOVEI A5,QUEST OUTCHR A5 ;OUTPUT QUESTION MARK FOR FATAL ERROR. OUTSTR ERCSQ MOVEI A5,SPACE OUTCHR A5 MOVEI A5,APOST OUTCHR A5 OUTCHR A4 ;OUTPUT ILL CHAR. OUTCHR A5 OUTSTR ERCS1 PJRST TTPRCR ;OUTPUT CRLF, DO NON-SKIP RET. ;HERE IF TOO MANY CHARS IN CMD. CHCTER: HRRI F,CHCR ;SET ERROR NUMBER. CLRBFI ;CLEAR INPUT BUFFER. MOVEI A5,QUEST OUTCHR A5 OUTSTR ERCHC OUTSTR ERCS1 PJRST TTPRCR ;HERE WHEN ILLEGAL SEQUENCE OF CHARS DETECTED. SEQERR: HRRI F,SEQR CLRBFI ;CLEAR INPUT BUFFER. MOVEI A5,QUEST OUTCHR A5 OUTSTR ERCSQ OUTSTR ERCS2 MOVEI A5,SPACE OUTCHR A5 MOVEI A5,APOST OUTCHR A5 OUTCHR A3 OUTCHR A4 OUTCHR A5 OUTSTR ERCS1 PJRST TTPRCR ;NON-SKIP RET FOR FATAL ERROR. PAGE SUBTTL COMMAND DECODER. ;ROUTINE TO DECODE COMMAND AFTER PRESCN ROUTINE. ;ENTER WITH NO ARGUMENTS. ;(A1) IS ILDB PTR TO FILE SPEC. ;(A2) IS CTR FOR NUMBER OF CHARS LEFT IN FILE SPEC. CMDCDR: SKIPN A2,TTFLPT ;ANY OUTPUT SPEC'S? JRST MAKSPC ;NO, GO MAKE THEM. PUSHJ P,MAKPTR ;YES, MAKE ILDB PTR AND CTR IN A1,A2. PUSHJ P,GETSPC ;GET FIRST FIELD. CAIE A4,COLON ;MUST BE DEL FOR OUTPUT SPEC. JRST DELERR ;ERROR OUT (DELR). MOVEM A3,DEVTAB ;STORE OUTPUT DEVICE. JUMPE A2,INSPEC ;DONE IF NO MORE CHARS. MORFLD: PUSHJ P,GETSPC ;GET CHARS FOR ERROR TYPE-OUT. JRST FLDERR ;ERROR OUT (FLDR). MAKSPC: MOVEI T1,'DSK' ;MAKE OUTPUT DEVICE. HRLZM T1,DEVTAB ;STORE IT. INSPEC: MOVE P1,ININFL ;INIT FILTAB INDEX. SKIPN A2,TTFLPT+1 ;GET INPUT SPEC PTR. JRST IN1ERR ;EMPTY, ERROR OUT (INPR). PUSHJ P,MAKPTR ;MAKE PTR AND CTR. PUSHJ P,GETSPC ;GET FIRST FIELD. CAIE A4,COLON ;IS IT DEV SPEC? JRST IN1ERR ;NO, ERROR OUT (DELR) MOVEM A3,DEVTAB+1 ;YES, SAVE INPUT DEVICE. NXTFIL: JUMPE A2,IN1ERR ;ERROR IF NO FILE SPEC. PUSHJ P,GETSPC ;GET A FIELD. CAIE A4,COMMA ;A COMPLETE FILE NAME? JRST CHKPER ;NO. SETZM A4 ;YES, MAKE NULL EXTENSION. PUSHJ P,STOFIL ;AND STORE FILENAME AWAY. JRST NXTFIL CHKPER: CAIE A4,PRIOD ;IS IT A PERIOD? JRST CHKNUL ;NO, SEE IF NULL. PUSH P,A3 ;YES, SAVE FILENAME. PUSHJ P,GETSPC ;GET NEXT FIELD. CAIE A4,COMMA ;END OF EXTENSION? JRST CHKNL1 ;MAYBE. POP P,A4 ;RETRIEVE FILENAME. EXCH A3,A4 PUSHJ P,STOFIL ;STORE FILENAME. JRST NXTFIL ;GET ANOTHER FILE. CHKNUL: PUSH P,A3 ;SAVE FILENAME. MOVE T1,A4 ;GET DELIMITER. SETZM A4 ;ZERO EXTENSION NAME. JRST CHKNL2 CHKNL1: MOVE T1,A4 ;GET DELIMITER. MOVE A4,A3 ;SET EXTENSION FOR STOFIL. CHKNL2: JUMPN T1,DELER1 ;ILLEGAL DELIM IF NOT NULL. POP P,A3 ;RETRIEV FILENAME. PUSHJ P,STOFIL ;STORE FILE AND EXIT. JRST POP2 ;NORMAL RETURN. ;ERROR ROUTINE FOR ILLEGAL DELIMITER. ;ENTER WITH (A3)= SIXBIT CHARS PRECEDING DEL. ; (T1)= ASCII DELIMITER. DELER1: EXCH T1,A4 POP P,T2 ;POP THE STACK. DELERR: HRRI F,DELR ;ERROR NUMBER. MOVEI A5,QUEST OUTCHR A5 OUTSTR ERDEL MOVEI A5,SPACE OUTCHR A5 PUSHJ P,OUTSIX ;TYPES OUT CONTENTS OF A3. OUTCHR A4 ;TYPE OUT DELIMITER. OUTSTR ERCS1 PJRST TTPRCR PAGE ;ROUTINE TO INPUT TTY COMMAND CHARACTERS AND DETERMINE CLASS. ;RETURN WITH CHAR IN A4 ;NON-SKIP RET FOR A FIELD DELIMITER: =,_, ;SKIP RET FOR A-N CHAR OR SUB-DEL OR ? OR * ;SKIP 2 RET FOR AN ILLEGAL CHAR ;SKIP 3 RET FOR BUFFER OVERFLOW. GETCHR: AOSLE INCHCT ;INCREMENT CHAR CNT. JRST POP4 ;AVOID BUFFER OVERFLOW. INCHWL A4 ;GET CHR. MOVEI T1,BARRO CAILE A4,"Z" ;ALPHA-NUM? JRST ILLCH1 ;NO, MUST BE DEL OR ILLEGAL. MOVEI T1,CRRET CAIGE A4,"*" ;LARGER THAN LOWEST BOUND? JRST ILLCH1 ;NO, EITHER ILL CHAR OR CR. CAIE A4,"+" ;ELIMINATE A COUPLE MORE POSSIBILITIES. CAIN A4,"-" JRST POP3 ;+ AND - ARE ILLEGAL CHARS. CAILE A4,":" ;NUMERIC OR SPECIAL? CAIL A4,"A" ;ALPHA? JRST POP2 ;MUST BE A-N OR SPECIAL. CAIN A4,"?" ;IF NOT ?, MUST BE DEL OR ILLEGAL. JRST POP2 ;ITS A SPECIAL. MOVEI T1,EQUAL ;SET UP FOR DATA-SET DEL TEST. ;HERE WHEN EITHER FIELD DEL OR ILLEGAL CHAR. ILLCH1: CAME A4,T1 ;IS IT A DELIMITER? JRST POP3 ;NO, MUST BE ILLEGAL. CAIE A4,15 ;FLD DELIMITER A CR? POPJ P, INCHRW T1 ;YES, SWALLOW LF. INICCT: HRROI T1,-TTCHMX ;RE-INIT INPUT CTR. MOVEM T1,INCHCT JRST POP1 PAGE ;ROUTINE TO CHECK CHAR SEQ FOR COMMAND DECODER. ;ENTER WITH (A3)= OLD CHAR. ; (A4)= NEW CHAR. ;NON-SKIP RET FOR ILL SEQ OF CHARS. ;SKIP-RET FOR GOOD SEQ OF CHARS. CHKSEQ: MOVE T3,A4 PUSHJ P,GETVAL ;GET ASSOC VALUE OF NEW CHAR. SOS T4 ;SINCE ROWS NUMBER FROM 0 TO 7. IMULI T4,^D8 ;SETS PTR TO PROPER ROW OF MATRIX. PUSH P,T4 ;SAVE IT. MOVE T3,A3 ;GET ASSOC VALUE OF OLD CHAR. PUSHJ P,GETVAL POP P,T3 ;RESTORE ASSOC VALUE OF NEW CHARS. ADD T3,T4 ;SHIFTS TO PROPER ELEMENT IN THE ROW. IDIVI T3,^D32 ;GET WORD NUMBER IN T4. MOVEI T2,1 MOVNS T4 ;TO ROTATE RIGHT. ROT T2,(T4) ;SHIFT INTO PROPER COLUMN. AND T2,SEQTAB(T3) ;USE MASK TO DETERMINE VALUE OF ELEMENT. SKIPE T2 ;SEQ OK IF BIT = 1. JRST POP2 ;GOOD SEQUENCE OF CHARS. POPJ P, ;BAD SEQUENC RET. ;THE FOLLOWING 8 BY 8 MATRIX IS USED FOR CHECKING CHAR SEQ. ;A 1 INDICATES THAT THE SEQ IS GOOD. TMP1= ^B11111011B35 ;ALPHA-NUMERIC TMP2= ^B10100111B35 ;SLASH TMP3= ^B10000001B35 ;COLON TMP4= ^B10000111B35 ;COMMA TMP5= ^B10000111B35 ;PERIOD TMP6= ^B00111001B35 ;ASTERISK TMP7= ^B10111011B35 ;QUESTION MARK TMP8= ^B11111111B35 ;NULL SEQTAB: BYTE (8) TMP1,TMP2,TMP3,TMP4 BYTE (8) TMP5,TMP6,TMP7,TMP8 PAGE ;ROUTINE TO GET ASSOCIATIVE VALUE FOR A CLASS OF CHARS. ;ENTER WITH CHAR IN T3 ;EXIT WITH ASSOC VALUE IN T4. GETVAL: MOVEI T4,1 ;ASSUME ALPHA-NUMERIC. MOVE T2,T3 ;SAVE CHAR. CAIGE T2,"0" ;NUMERIC? JRST LOWNUM ;NO, GO INDEX INTO TABLE. CAIL T2,"A" ;ALPHA? POPJ P, ;YES. CAIG T2,"9" ;NO, NUMERIC? POPJ P, ;YES. SUBI T2,70 ;NO, MUST BE 72 OR 77. JRST HGHVAL LOWNUM: SKIPE T2 ;NULL? SUBI T2,51 ;NO, MUST BE 60 OR LESS. HGHVAL: MOVE T4,CHRTAB(T2) ;PICK UP ASSOC VALUE. POPJ P, ;1 IS THE ASSOC VALUE FOR ALPHANUMERIC. CHRTAB: EXP 10 ;ASSOC VALUE FOR NULL. EXP 6 ;ASSOC VALUE FOR "52" ASTERISK. EXP 3 ;ASSOC VALUE FOR "72" COLON. EXP 4 ;ASSOC VALUE FOR "54" COMMA. 0 ;WASTED WORD. EXP 5 ;ASSOC VALUE FOR "56" PERIOD. EXP 2 ;ASSOC VALUE FOR "57" SLASH. EXP 7 ;ASSOC VALUE FOR "77" QUESTION MARK. PAGE ;ROUTINE TO PICK UP AT MOST 6 SIX BIT CHARS AND DELIMITER. ;ENTER WITH PTR IN A1. ; CHAR CNT IN A2. ;EXIT WITH FROM 0 TO SIX SIXBIT CHARS IN A3 LESFT ADJUSTED. ; ASCII DELIMITER IN A4. GETSPC: SETZB A3,A4 ;ZERO OUT COLLECTORS. MOVEI T1,6 ;SET CTR. SKIPG A2 ;EXIT IF CHAR CNT=0. POPJ P, ;CHAR CNT =0. NXTCHR: ILDB T3,A1 ;PICK UP CHAR. PUSHJ P,GETVAL ;GET ASSOC VALUE. CAIGE T4,6 ;CONSIDER * AND ? TO BE ALPHA. CAIN T4,1 JRST ALPHAN ;PROCESS ALPHA-NUMERIC. FAKDEL: SOS A2 ;MUST BE DELIMITER, COUNT IT. MOVE A4,T3 ;RETURN DELIMITER PROPERLY. ALLDON: IMULI T1,6 ;CALCULATE SHIFT. LSH A3,(T1) ;LEFT JUSTIFY. POPJ P, ALPHAN: SOJL T1,FAKDEL ;CONSIDER CHAR DEL IF NO MORE ROOM. SUBI T3,40 ;CONVERT TO SIXBIT. LSH A3,6 ;MAKE ROOM. OR A3,T3 ;COLLECT CHAR. SOJG A2,NXTCHR ;GET NEXT CHAR. JRST ALLDON ;RETURN WITH NULL DEL IF NO MORE CHARS. PAGE SUBTTL I/O ERROR ROUTINES. ;HERE ON FAILURE TO ENTER DSK FILE. ERDKIN: HRRI F,DKEN ;FATAL ERROR. MOVEI A5,QUEST ;QUEST TO INDICATE FATAL ERROR. OUTCHR A5 OUTSTR EDKEN ;PRINT ENTER FAILURE. XFRMSG: MOVEI A5,SPACE ;OUTPUT SPACE. OUTCHR A5 HLLZS T2 ;FOR PRINTING EXT. PUSHJ P,PRTFIL ;PRINT FILENAME FROM T1 AND T2. JRST DONXFR ;TYPE # FILES XFRD. ;HERE TO PRINT FILENAME, SKIP MSG AND SKIP TO NEXT FILE ON MTA. FILSKP: MOVEI A5,SPACE OUTCHR A5 ;PRINT SPACE. PUSHJ P,PRTFIL ;PRINT FILENAME FROM T1 AND T2. PUSHJ P,SKPFIL ;SKIP MTA FORWARD TO NXT FILE. SKPMSG: OUTSTR EHDR1 ;MSG FOR SKIPPING TO NEXT FILE. MOVEI T1,RDMTHD PUSH P,T1 ;SET RET ADR. JRST TTPRCR ;OUTPUT CR. ;HERE TO PRINT A FILENAME. ;ENTER WITH NAME IN T1 AND T2. PRTFIL: MOVE A3,T1 PUSH P,T2 ;SAV EXTENSION. PUSHJ P,OUTSIX ;CONVERT TO ASCII AND PRINT. JUMPE T2,POP1 ;RETURN IF NO EXT. MOVEI A5,PRIOD OUTCHR A5 POP P,A3 ;RETRIEV AND PRINT EXTENSION. PJRST OUTSIX ;AND RETURN. ;HERE IF ERROR OR EOF ON MTA. RECERR: TLNN F,FEOF ;IS IT AN EOF? JRST HRCERR ;NO, MUST BE NON-RECOV ERROR. MOVMS P2 IMULI P2,7 ;SHIFTING ASCII CHARS. LSH P3,1(P2) ;LEFT ADJUST REMAINING CHARS. PUSHJ P,OUTWRD ;OUTPUT THE WORD. JRST DSKERR ;OUTPUT PROB, NON-RECOVERABLE. NOCHAR: CLOSE DSKCH, ;GOOD RETURN, CLOSE DISK FILE. CLOSE MTACH, ;RE-INIT THE CHANNEL ON FIRST INPUT. AOS NUMFIL ;COUNT THE FILE. MOVEI A5,QUOTE ;INDICATE OPERATING MSG. OUTCHR A5 OUTSTR FILXF ;SEND MSG OF GOOD XFR. MOVEI A5,SPACE OUTCHR A5 MOVE T1,HDRFIL ;PRINT FILENAME. HLLZ T2,HDREXT ;AND EXTENSION. PUSHJ P,PRTFIL PUSHJ P,TTCRLF ;PRINT CRLF. SOSE CMDFLS ;ARE WE DONE? JRST RDMTHD ;NO, GO READ NEXT FILE. MOVEI A5,QUOTE ;YES, PREPARE TO TERMINATE PROG. OUTCHR A5 JRST DONXFR ;GO TO CLOSE OUT ROUTINE. ;HERE FOR NON-RECOV MTA READING ERRORS. HRCERR: MOVEI A5,PERCT OUTCHR PERCT ;WARNING MSG ONLY OUTSTR ERRDM ;HARD DATA ERROR MSG. PUSHJ P,RENFIL ;DELETE THE OUTPUT FILE. MOVE T1,HDRFIL HLLZ T2,HDREXT JRST FILSKP ;PRT FILE, SKIP TO NEXT FILE ;HERE ON ERROR WRITING DISK. DSKERR: HRRZ T1,F ;GET ERROR NUMBER. CAIE T1,QUON ;IS IT A QUOTA PROBLEM? JRST WRTERR ;NO, MUST BE DATA ERROR. MOVEI A5,QUEST ;YES, THIS WILL STOP PROGRAM OUTCHR A5 OUTSTR EQUON ;OUTPUT MSG ABOUT QUOTA PROB. MOVE T1,HDRFIL HLLZ T2,HDREXT JRST XFRMSG ;GO PRNT NAME, NUM FILES AND RE-INIT PROG. ;HERE FOR HARD DATA ERROR ON DISK. WRTERR: MOVEI A5,PERCT OUTCHR A5 ;NOT FATAL SINCE WE SKIP TO NEXT FILE. OUTSTR ERWRT ;HARD DATA ERROR MSG. MOVEI A5,SPACE OUTCHR A5 MOVE T1,HDRFILE HLLZ T2,HDREXT PUSHJ P,PRTFIL ;PRINT FILENAME. MOVEI A5,SPACE OUTCHR A5 OUTSTR ERWR1 PUSHJ P,RENFIL ;DELETE FILE. PUSHJ P,BCKFIL ;BACK UP ONE FILE. MOVEI T1,RDMTHD PUSH P,T1 ;START OVER ON SAME FILE. JRST TTPRCR ;PRINT CRLF AND GO READ HEADER. ;HERE ON FAILURE TO INIT DEVICES. ERMTIR: HRRI F,MTIR ;ERROR NUMBER. MOVE A3,T2 ;DEVICE NAME FOR TYPE-OUT. JRST ERDVIR ERDKIR: HRRI F,DKIR ;ERROR NUMBER. MOVE A3,T2 ;DEVICE NAME FOR TYPE OUT. ERDVIR: MOVEI A5,QUEST ;FATAL ERROR. OUTCHR A5 OUTSTR ERDVI ;INIT ERROR MSG. MOVEI A5,SPACE OUTCHR A5 PUSHJ P,OUTSIX ;TYPE OUT DEVICE. MOVEI T1,INIFLG PUSH P,T1 ;SET RETURN ADR. JRST TTPRCR ;TYPE CRLF AND RETURN. ;SKIP MTA FORWARD TO NEXT FILE. NOMTCH: MOVEI T1,RDMTHD ; PUSH P,T1 ;SET RETURN ADR. SKPFIL: MTAPE MTACH,MTASFL ;SKIP FILE. MTAPE MTACH,MTASLP ;WAIT FOR COMPLETION. CLOSE MTACH, ;RE-INIT THE CHANNEL ON FIRST INPUT. POPJ P, BCKFIL: MTAPE MTACH,MTABKF ;BACK UP ONE FILE. MTAPE MTACH,MTASLP ;WAIT TILL DONE. STATO MTACH,IOBOT ;IF BEGINNING OF TAPE NO PROB. MTAPE MTACH,MTASFL ;IF NOT, SKIP OVER FILE MARK. CLOSE MTACH, ;RE-INIT CHANNEL ON FIRST INPUT. POPJ P, ;HERE WHEN ERROR RETURN READNG MTA FILE HDR. HDRERR: TLNE F,FEOF ;EOF SEEN ON TAPE? JRST EOFRTN ;PRINT MSG AND STOP. HRRZ T1,F ;NO, GET ERROR NUMBER. CAIE T1,BHDN ;BAD HDR? JRST MTDERR ;NO, MUST BE HARD DATA ERROR. MOVEI A5,PERCT OUTCHR A5 OUTSTR EHDRM ;TELL USER BAD HEADER. OUTSTR EHDR1 SKPFRD: PUSHJ P,SKPFIL ;SKIP TO NEXT FILE. MOVEI T1,RDMTHD PUSH P,T1 ;SET RET ADR. JRST TTPRCR ;OUTPUT CRLF. ;HERE ON MTA HARD DATA ERROR. MTDERR: MOVEI A5,PERCT OUTCHR A5 OUTSTR EHDAT OUTSTR EHDA1 ;TELL USER HARD DATA ERROR. OUTSTR EHDR1 JRST SKPFRD ;SKIP FORWARD TO NEXT FILE. ;HERE ON LOGICAL END OF MTA. EOFRTN: MOVEI A5,QUOTE OUTCHR A5 ;COMMENT TO USER. OUTSTR EOFMG DONXFR: RELEASE DSKCH, ;RELEASE DEVICES. RELEASE MTACH, MOVEI A5,SPACE OUTCHR A5 MOVE A3,NUMFIL PUSHJ P,DECPNT ;PRINT NUMBER OF FILES XFRD. OUTSTR EOFM1 SETZM A1 ;SET INDEX FOR SRCH OF FILTAB. NXTENT: PUSHJ P,TTPRCR AOS A1 ;INCREMENT INDEX. SKIPN T1,FILTAB(A1) ;ACTIVE ENTRY. JRST INIFLG ;NO, RETURN FOR NEXT CMD. MOVE T2,EXTTAB(A1) ;YES, GET EXT AND FLAGS. TRNE T2,40000 ;WAS THIS FILE FOUND? JRST NXTENT ;YES, TRY NEXT ONE. MOVEI A5,PERCT ;NO, PRINT WARNING MSG. OUTCHR A5 HLLZS T2 ;ZERO OUT FLAGS FOR PRT OUT. OUTSTR FILNT ;TYPE FILE NOT FOUND MSG. PUSHJ P,PRTFIL ;PRINT FILE NAME FM T1 AND T2 JRST NXTENT ;TEST NEXT ENTRY NAME. ;HERE TO DELETE A FILE. RENFIL: SETZB T1,T2 SETZB T3,T4 RENAME DSKCH,T1 ;DELETE CURRENTLY OPEN FILE. HALT . CLOSE DSKCH, ;CLOSE THE CURRENT CHANNEL. POPJ P, SUBTTL MISCELLANIOUS SUBROUTINES. ;SUBROUTINE FOR STORING FILE AND EXT IN TABLES. STOFIL: AOBJP P1,NFLERR ;TOO MANY FILE SPECS. MOVEM A3,FILTAB(P1) ;SAVE FILE NAME. HLLZM A4,EXTTAB(P1) ;SAVE EXT NAME. POPJ P, ;ERROR ROUTINE. NFLERR: MOVEI A5,QUEST OUTCHR A5 OUTSTR ERNLF MOVE P,PDINWD ;RE-INIT PDP MOVEI T1,INIFLG PUSH P,T1 ;SET RET ADR. JRST TTCRLF ;AND RET. ;ERROR ROUTINE. FLDERR: MOVEI A5,QUEST OUTCHR A5 OUTSTR ERFLD MOVEI A5,SPACE OUTCHR A5 PUSHJ P,OUTSIX OUTSTR ERFL1 PJRST TTPRCR ;ERROR ROUTINE. IN1ERR: MOVEI A5,QUEST OUTCHR A5 OUTSTR ERFL2 OUTSTR ERFL3 PJRST TTPRCR ;ROUTINE TO OUTPUT PERIOD, AND . TTPRCR: MOVEI A5,PRIOD OUTCHR A5 TTCRLF: MOVEI A5,CRRET OUTCHR A5 MOVEI A5,LINFD OUTCHR A5 POPJ P, POP4: AOS (P) POP3: AOS (P) POP2: AOS (P) POP1: POPJ P, ;ROUTINE TO MAKE ILDB PTR FROM XWD PTR. MAKPTR: HLRZ A1,A2 HRLI A1,440700 HRRZS A2 POPJ P, ;ROUTINE TO TYPE OUT SIXBIT CONTENTS OF A3. OUTSIX: HRLZI T1,-4 ;4 CHARS AT A TIME. OUTSX1: SETZM T2 NXTSIX: SETZM A2 LSHC A2,6 ;SHIFT SIXBIT CHAR INTO A2. ADDI A2,40 ;CONVERT TO ASCII. LSH T2,7 ;MAKE ROOM. OR T2,A2 JUMPE A3,NOMOR1 ;NO MORE CHARS TO OUTPUT? AOBJN T1,NXTSIX ;MORE, DO WE HAVE ROOM? PUSHJ P,NOMORE ;NO, OUTPUT UP TO FOUR CHARS. HRLZI T1,-2 ;RESET COUNTER FOR AT MOST 2 MORE CHARS. JRST OUTSX1 ;GET REMAINING CHARS. NOMOR1: AOS T1 NOMORE: MOVNS T1 ;RH(T1)= # CHARS IN COLLECTOR. IMULI T1,7 ;7 BITS/ASCII-BYTE. ROT T2,(T1) ;ROTATE TO LEFT JUSTIFY. OUTSTR T2 POPJ P, ;ROUTINE TO TYPE OUT DECIMAL NUMBER FROM A3. DECPNT: MOVE T1,A3 DECPN1: IDIVI T1,^D10 ;DEVIDE BY THE RADIX 10. PUSH P,T2 ;SAVE REMAINDER. SKIPE T1 ;DONE? PUSHJ P,DECPN1 ;NO, GO DIVIDE AGAIN. DECPN2: POP P,T1 ;YES, POP DIGITS BACK. ADDI T1,60 ;CONVERT OCTAL TO ASCII. OUTCHR T1 POPJ P, ;POP BACK FOR ANOTHER NUMBER. ;ROUTINE TO CONVERT RADIX 50 TO ASCII. ;ENTER WITH NUMBER IN A1. ;EXIT WITH CONVERSION IN A1 LEFT ADJUSTED. RAD50X: SETZM T3 ;WILL GET RESULT IN T3. MOVE T1,A1 PUSHJ P,RAD50Y MOVE A1,T3 POPJ P, RAD50Y: SKIPN T1 ;ANY MORE NUMBERS? POPJ P, ;NO. IDIVI T1,50 ;YES, DEVIDE BY RADIX. PUSHJ P,CONSEV ;CONVERT REM TO 7 BIT. SUBI T2,40 ;CONVERT TO SIXBIT. LSHC T2,-6 ;SHIFT INTO T3 WHICH IS COLLECTOR. JRST RAD50Y CONSEV: CAIGE T2,33 ;ADD 11 OR 22? JRST SMALNM ;NO. ADDI T2,11 ;YES. CAIGE T2,34 ;ADD 11 MORE? POPJ P, ;NO, ALL DONE. ADDI T2,11 ;YES. POPJ P, SMALNM: SKIPE T2 ;HERE TO ADD 40 OR 100. ADDI T2,40 ;HERE IF ALPHA. ADDI T2,40 ;HERE IF SPACE. POPJ P, PAGE SUBTTL VARIOUS TTY MESSAGES TO USER. ERCHC: ASCIZ / TOO MANY CHARACTERS/ ERCSQ: ASCIZ / ILLEGAL CHARACTER/ ERCS1: ASCIZ / IN INPUT STRING/ ERCS2: ASCIZ / SEQUENCE/ ERDEL: ASCIZ / ILLEGAL DELIMITER/ ERNLF: ASCIZ / TOO MANY FILE SPECS/ ERFLD: ASCIZ / UNEXPECTED FIELD/ ERFL1: ASCIZ / IN OUTPUT SPEC/ ERFL2: ASCIZ / MISSING FIELD/ ERFL3: ASCIZ / IN INPUT SPEC/ ERDTS: ASCIZ / TOO MANY DATA SET SPECS IN COMMAND/ PAGE SUBTTL I/O ERROR MSGS TO USER. ERDVI: ASCIZ / CAN'T INIT DEVICE/ EOFMG: ASCIZ / END OF TAPE,/ EOFM1: ASCIZ / FILES TRANSFERRED/ EHDRM: ASCIZ / BAD HEADER DETECTED,/ EHDAT: ASCIZ / HARD DATA ERROR/ EHDA1: ASCIZ / READING HEADER,/ EHDR1: ASCIZ / SKIPPING TO NEXT FILE/ EDKEN: ASCIZ / ENTER FAILURE ON/ FILXF: ASCIZ / FILE TRANSFERRED:/ FILNT: ASCIZ / FILE NOT FOUND:/ ERRDM: ASCIZ / DATA ERROR READING:/ EQUON: ASCIZ / QUOTA ERROR WRITING:/ ERWRT: ASCIZ / HARD ERROR WRITING:/ ERWR1: ASCIZ / TRYING SAME FILE AGAIN/ PAGE SUBTTL TABLE DATA FOR PROGRAM. MTAIN1: XWD 400000,MTAB1+1 ;INIT WORD FOR BUF HDR. MTAIN2: POINT MTBYT,0 ;INIT BUFFER ILDB PTR. PDLILM: EXP -1 ;SAFETY VALVE FOR POPPING. PDLBEG: BLOCK PDLSIZ PDLLEN= .-PDLBEG PDINWD: IOWD PDLLEN,PDLBEG ININFL: IOWD FILMAX,0 DATINI: XWD DATTAB,DATTAB+1 DATTAB= . DEVTAB: BLOCK 2 ;I/O DEVICE NAMES SPEC'D BY USER. FILTAB: BLOCK FILMAX ;TABLE OF FILE NAMES. EXTTAB: BLOCK FILMAX HDRFIL: BLOCK 1 ;STORAGE WORD FOR FILE AS READ FROM MTA. HDREXT: BLOCK 1 ;XWD EXT,FLAGS FOR MAKING MASKS FOR WILD CHARS. TTIBUF: BLOCK TTBFSZ ;TTY INPUT BUFFER. TTOBUF: BLOCK TTBFSZ ;TTY OUTPUT BUFFER. TTFLPT: BLOCK 2 ;XWD PTR'S TO FILE SPECS FOR DECODER. INCHCT: BLOCK 1 ;CHAR CTR FOR TTYIN BUFFER. CMDFLS: BLOCK 1 ;NUM FILES SPECF'D IN CMD, (MAY BE INFINITE.) NUMFIL: BLOCK 1 ;NUMBER OF FILES XFRD. DSKHDR: BLOCK 3 ;DISK BUFFER HEADER. MTAHDR: BLOCK 3 ;MTA BUFFER HEADER. DATEND= . BUFPAR= 1 REPEAT MTNMBF, < BLDBUF \BUFPAR BUFPAR=BUFPAR+1 > END INIPRO