Trailing-Edge
-
PDP-10 Archives
-
decuslib10-02
-
43,50245/rdmt11.mac
There are 2 other files named rdmt11.mac in the archive. Click here to see a list.
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)
<Y= X+1
G= MTNMBF-X
IFE G, <Y=1>
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 ;<CR>?
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 <CR> 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: =,_,<CR>
;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, <CR> AND <LF>.
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