TITLE MAFIA SUBTTL MAG-TAPE-FILER-ADVANCED; AUTHORS:M.RICHTER, H.-P.ROTHER ; IFNDEF OLDSW, ;5 SERIES MONITOR: OLDSW = 0 ;4 SERIES MONITOR: OLDSW = 1 ; ;FLAGS IN AC F ; ;SWITCHES: ZEROFL=1B35 ;ZERO-FLAG LH /Z LISTFL=1B34 ;LIST-FLAG LH /L REWOFL=1B33 ;REWIND-FLAG FOR OUTPUT-DEVICE LH /W GENFL=1B32 ;GENERATE-DIRECTORY-FLAG LH /G COPYFL=1B31 ;COPY-FLAG LH /X ENDFL=1B30 ;END-FLAG (EXIT) LH /E DELFL=1B29 ;DELETE-FLAG LH /D RENFL=1B28 ;RENAME-FLAG LH /R NTAOFL=1B27 ;NEW-TAPE-FLAG FOR OUTPUT-DEVICE LH /N FILIFL=1B24 ;FILENAME LISTING (SHORT DIR.) FLAG RH /F ;COMCOD CONTROL: LAFL=1B26 ;LEFT-ARROW-FLAG LH DEVFL=1B25 ;DEVICE-FLAG LH FIFL=1B24 ;FILE-FLAG LH ASTFL=1B23 ;ASTERIX-FLAG LH OEXAST=1B22 ;OUTPUT-EXTENSION-ASTERIX-FLAG LH OFIAST=1B21 ;OUTPUT-FILE-ASTERIX-FLAG LH CRFL=1B20 ;CARRIAGE-RETURN-FLAG LH SWFL=1B19 ;SWITCH-FLAG LH NWIC=1B18 ;FLAG TO MARK THAT INPUT-COUNTER WAS INCREMENTED LH PROFL=1B23 ;PROTECTION FLAG RH QUEFL=1B21 ;QUESTION MARK FLAG RH ;IO FLAGS MOUT=1B35 ;MAGTAPE FOR OUTPUT FLAG RH MOD1=1B34 ;MAGTAPE FOR OUTPUT DIRECTORY FLAG, 1=DIR1, 0=DIR2 RH MIN=1B33 ;MAGTAPE FOR INPUT FLAG RH MID1=1B32 ;MAGTAPE FOR INPUT DIRECTORY FLAG, 1=DIR1, 0=DIR2 RH DOUT=1B31 ;DTA OR DSK FOR OUTPUT FLAG RH DIN=1B30 ;DTA OR DSK FOR INPUT FLAG RH ASCIOU=1B29 ;OUTPUT CHANNEL IN ASCII MODE FLAG RH ASCIN=1B28 ;INPUT CHANNEL IN ASCII MODE FLAG RH FIDEL=1B27 ;MARK THAT "FILES DELETED:" WAS WRITTEN ALREADY RH DSKIN=1B26 ;DISK FOR INPUT FLAG RH DSKOUT=1B25 ;DISK FOR OUTPUT FLAG RH LPTOUT=1B22 ;LPT FOR OUTPUT FLAG RH PAGE ;ERROR BIT DEFINITIONS IOIMPM=1B18 ;IMPROPER MODE IODERR=1B19 ;HARDWARE ERROR IODTER=1B20 ;CHECKSUM OR PARITY ERROR IOBKTL=1B21 ;BLOCK TOO LARGE OR DTA FULL IOEOF=1B22 ;END OF FILE IOEOT=1B25 ;END OF TAPE PAGE ;AC-DEFINITIONS AC0=0 ;TEMPOR. ACS AC1=1 AC2=2 AC3=3 AC4=4 AC5=5 AC6=6 AC7=7 AC8=10 CC=11 ;CHARACTER-COUNTER C=12 ;TEMPORARY-CHARACTER-BUFFER IC=13 ;INPUT-COUNTER CP=14 ;CHARACTER-BUFFER-POINTER CB=15 ;CHARACTER-BUFFER F=16 ;FLAG PDP=17 ;PUSH-DOWN-POINTER ;CHANNEL DEFINITIONS OCH=1 ;OUTPUT-CHANNEL ICH=2 ;INPUT-CHANNEL OCHD=3 ;OUTPUT-CHANNEL FOR DIRECTORY ICHD=4 ;INPUT-CHANNEL FOR DIRECTORY ; EXTERN JOBFF,JOBSA,JOBREN SEARCH JOBDAT ;JOBXXX BECOMES .JBXXX IFNDEF ICMAX, ;MAXIMUM NUMBER OF INPUT-FILES IFNDEF MDIRFN, ;MAX. NUMBER OF FILES IN MAGTAPE-DIRECTORY DIRLEN=MDIRFN*3+1 ;LENGTH OF MAGTAPE-DIRECTORY PAGE ;PROGRAMM-START ;COMMAND-DECODER MAFIA: CALLI 0 ;RESET SYSTEM SETZB IC,CB ;CLEAR IC, CB MOVEI C,ICMAX ;SET UP MAXNUMBER OF INPUT-FILES FOR ERROR-MESSAGE IDIVI C,12 ADDI IC,60 ADDI C,60 CAIN C,60 MOVEI C,40 MOVE CP,[POINT 7,ICMASC] IDPB C,CP IDPB IC,CP IDPB CB,CP SETOM MDIR10 ;SET DIRECTORY-HEADER = -1 SETOM MDIR20 MOVEI AC0,COMRET-1 ;CHANGE START-ADDR. TO COMRET-1 HRRM AC0,.JBSA HRRM AC0,.JBREN ;ALSO FOR REENTER SETZ AC8, COMRET: JUMPN AC8,COMRT1 ;TTY INPUT ALREADY READ ? TTCALL 5,C ;NO, READ IN A LINE AND CLEAR ^O SKIPA SETO AC8, ;MARK THAT A LINE IS READ IN COMRT1: MOVE PDP,[IOWD ^D10,PDL] ;SET UP PUSH-DOWN-POINTER MOVE CP,P6QB ;SET UP QUESTION-MARK-BUFFER-POINTER MOVEM CP,QP MOVE CP,P6CB ;SET UP CHARACTER-BUFFER-POINTER MOVNI IC,ICMAX ;RESET COUNTER FOR INPUT DEVICES + FILES MOVEI CC,6 ;RESET CHARACTER-COUNTER SETZM ODEV ;RESET BUFFERS MOVE F,[ODEV,,OFIL] BLT F,QB SETZB F,CB ;RESET FLAGS AND CHARACTER-BUFFER PAGE TTCALL 1,["*"] ;TYPE * SKIPN AC8 ;TTY INPUT ALREADY DONE ? TTCALL 4,C ;NO, GET 1ST CHAR. SETZ AC8, ;CLEAR FLAG FOR TTY COMMAND-INPUT CAIE C,15 ;ONLY CR ? JRST GTNXT1 ;NO, GO ON TTCALL 0,C ;YES, GET LF JRST COMRET ;START AGAIN GETNXT: TTCALL 0,C ;GET NEXT CHAR. GTNXT1: CAIE C," " ;IGNORE BLANKS AND TABS CAIN C,11 JRST GETNXT CAIN C,"/" ;"/" ? JRST SLASH ;YES CAIN C,"_" ;"_" ? JRST LARROW ;YES CAIN C,":" ;":" ? JRST COLON ;YES CAIN C,"." ;"." ? JRST DOT ;YES CAIN C,15 ;CR ? JRST CARRY ;YES CAIN C,"," ;"," ? JRST COMMA ;YES CAIN C,"<" ;"<" ? JRST BRA ;YES CAIN C,"*" ;"*" ? JRST ASTER ;YES TLNE F,ASTFL ;ASTERIX PENDING ? JRST ERRASN ;YES, ERROR SOJL CC,ERRSIX ;INCREMENT CHAR.-COUNT, MORE THAN 6 CHARS. ? CAIN C,"?" ;NO, "?" ? JRST QUEM ;YES CAIL C,60 ;NO, IS THIS REALLY A CHAR. OR A NUMBER ? CAILE C,132 JRST ERRILC ;NO, ERROR CAIL C,101 JRST CHAROK ;YES CAILE C,71 JRST ERRILC ;NO, ERROR CHAROK: SUBI C,40 ;CONVERT TO SIXBIT IDPB C,CP ;STORE CHAR. SETZ C, ;CLEAR C IDPB C,QP ;STORE 6 BIT 0 IN "?"-BUFFER JRST GETNXT ;GET NEXT CHARACTER QUEM: TLNN F,LAFL ;"?" ON OUTPUT SIDE ? JRST ERRQLA ;YES, ERROR TLNE F,ASTFL ;NO, * ALREADY GIVEN ? JRST ERRQAS ;YES, ERROR TRO F,QUEFL ;NO, SET "?"-FLAG SUBI C,40 ;CONVERT "?" TO SIXBIT AND STORE IT IDPB C,CP SETO C, ;C = -1 IDPB C,QP ;STORE 6 BIT 1 IN "?"-BUFFER JRST GETNXT ;GET NEXT CHARACTER PAGE ;HERE WHEN CHARACTER = / SLASH: TLOE F,SWFL ;FIRST SWITCH ? JRST SLAWN ;NO, LOOK FOR W OR N TTCALL 0,C ;YES, SWFL SET, GET NEXT CHAR. CAIN C,"Z" ;Z ? JRST ZSW ;YES CAIN C,"L" ;L ? JRST LSW ;YES CAIN C,"W" ;W ? JRST WSW ;YES CAIN C,"G" ;G ? JRST GSW ;YES CAIN C,"X" ;X ? JRST XSW ;YES CAIN C,"E" ;E ? JRST ESW ;YES CAIN C,"D" ;D ? JRST DSW ;YES CAIN C,"F" ;F ? JRST FSW ;YES CAIN C,"N" ;N ? JRST NSW ;YES CAIE C,"R" ;R ? JRST ERRSWI ;NO, ERROR TLOA F,RENFL ;YES, SET RENAME-FLAG=1 AND SKIP ALWAYS ZSW: TLO F,ZEROFL ;SET ZERO-FLAG=1 JRST GETNXT ;GET NEXT CHARACTER LSW: TLOA F,LISTFL ;SET LIST-FLAG=1 AND SKIP ALWAYS ESW: TLO F,ENDFL ;SET END-FLAG (EXIT) =1 JRST GETNXT ;GET NEXT CHARACTER GSW: TLOA F,GENFL ;SET GENERATE-FLAG=1 AND SKIP ALWAYS XSW: TLO F,COPYFL ;SET COPY-FLAG=1 JRST GETNXT ;GET NEXT CHARACTER FSW: TROA F,FILIFL ;SET FILENAME LISTING FLAG = 1 DSW: TLO F,DELFL ;SET DELETE-FLAG=1 JRST GETNXT ;GET NEXT CHARACTER SLAWN: TTCALL 0,C ;GET NEXT CHARACTER CAIN C,"W" ;W ? JRST WSW1 ;YES CAIE C,"N" ;N ? JRST ERRSLA ;NO, ERROR SKIPA NSW: TLZ F,SWFL ;SET ZERO SWITCH FLAG TLNE F,LAFL ;YES, FOR OUTPUT-DEVICE ? JRST NSWI ;NO TLO F,NTAOFL ;YES, SET NEW-TAPE-OUTPUT-FLAG = 1 JRST GETNXT ;GET NEXT CHARACTER NSWI: TLNN F,DEVFL ;INPUT-COUNTER ALREADY INCREMENTED ? TLNE F,FIFL ;INPUT-COUNTER ALREADY INCREMENTED ? JRST NSWI1 ;YES TLON F,NWIC ;NO, ALREADY REWIND FOR THIS INPUT-DEVICE ? AOJG IC,ERRIC ;NO, INCREMENT INPUT-COUNTER, >ICMAX ? NSWI1: HLLOS IEXASN+ICMAX-1(IC) ;YES, SET NEW-TAPE-INPUT-FLAG = -1 JRST GETNXT ;GET NEXT CHARACTER WSW: TLZ F,SWFL ;SET ZERO SWITCH FLAG WSW1: TLNE F,LAFL ;REWIND FOR OUTPUT-DEVICE ? JRST WSWI ;NO TLO F,REWOFL ;YES, SET REWIND-OUTPUT-DEVICE-FLAG = 1 JRST GETNXT ;GET NEXT CHARACTER WSWI: TLNN F,DEVFL ;INPUT-COUNTER ALREADY INCREMENTED ? TLNE F,FIFL ;INPUT-COUNTER ALREADY INCREMENTED ? JRST WSWI1 ;YES TLON F,NWIC ;NO, ALREADY NEW-TAPE-FLAG FOR THIS INPUT-DEVICE ? AOJG IC,ERRIC ;NO, INCREMENT INPUT-COUNTER, >ICMAX ? WSWI1: HLLOS IFIASW+ICMAX-1(IC) ;YES, SET INPUT-REWIND-FLAG = 1 JRST GETNXT ;GET NEXT CHARACTER PAGE ;HERE WHEN CHARACTER = < BRA: TLNE F,LAFL ;FOR OUTPUT FILE ? JRST ERRPR ;NO, ERROR TROE F,PROFL ;YES, FIRST PROTECTION ? JRST ERRPR ;NO, ERROR MOVEM CB,SAVAC ;YES, SAVE CHAR.-BUFFER MOVEM CP,SAVAC+1 ;SAVE CHAR.-BUFFER-POINTER SETZB CB,CP ;CLEAR CB, CP MOVNI AC0,3 ;COUNTER => AC0 BRA1: TTCALL 0,C ;GET NEXT CHARACTER => C CAIL C,60 ;NUMBER < 8 ? CAILE C,67 JRST ERRPR ;NO, ERROR SUBI C,60 ;YES, CONVERT TO BINARY PUSH PDP,C ;SAVE IT TEMP. AOJL AC0,BRA1 ;3 CHAR. DONE ? TTCALL 0,C ;YES, GET NEXT CHAR. => C CAIE C,">" ;">" ? JRST ERRPR ;NO, ERROR MOVNI AC0,3 ;YES, COUNTER => AC0 BRA2: POP PDP,CP ;GET NUMBERS BACK LSHC CP,-3 ;SHIFT IT INTO CHARACTER-BUFFER AOJL AC0,BRA2 ;3 TIMES DONE ? EXCH CB,PROTEC ;SAVE IT IN PROTEC AND CLEAR CHAR.-BUFFER MOVE CB,SAVAC ;RESTORE CB AND CP MOVE CP,SAVAC+1 JRST GETNXT ;GET NEXT CHARACTER PAGE ;HERE WHEN CHARACTER = _ LARROW: TLCE F,LAFL ;FIRST LEFT-ARROW ? JRST ERRLAR ;NO, ERROR TLZE F,DEVFL ;YES, SET LEFT-ARROW-FLAG=1, CLEAR DEVICE FLAG ;OUTPUT-DEVICE ALREADY GIVEN ? JRST LARFIL ;YES MOVE C,SIXDSK ;NO, STORE SIXBIT/DSK/ IN ODEV MOVEM C,ODEV LARFIL: TLZE F,FIFL ;CLEAR FILE-FLAG, WAS A FILENAME ALREADY STORED ? JRST LAREXT ;YES TLZE F,ASTFL ;NO, CLEAR ASTFL, WAS AN ASTERIX GIVEN ? JRST LAROFA ;YES EXCH CB,OFIL ;NO, STORE OUTPUT-FILENAME AND CLEAR CHAR.-BUFFER RESCB: MOVEI CC,6 ;SET CHAR.-COUNT=6 MOVE CP,P6QB ;SET UP QUESTION-MARK-BUFFER-POINTER MOVEM CP,QP MOVE CP,P6CB ;RESTORE CHAR.-POINTER JRST GETNXT ;GET NEXT CHAR. LAREXT: TLZE F,ASTFL ;CLEAR ASTFL, WAS AN ASTERIX GIVEN ? JRST LAROEA ;YES CAIGE CC,3 ;NO, MORE THAN 3 CHARS. ? JRST ERRTHR ;YES, ERROR EXCH CB,OEXT ;NO, STORE OUTPUT-EXTENSION ; AND CLEAR CHAR.-BUFFER JRST RESCB ;GO TO RESET CHAR.-BUFFER LAROFA: TLOA F,OFIAST ;SET OUTPUT-FILENAME-AST.-FLAG=1 LAROEA: TLO F,OEXAST ;SET OUTPUT-EXTENT.-AST.-FLAG=1 JRST GETNXT ;GET NEXT CHAR. PAGE ;HERE WHEN CHARACTER = : COLON: TLCE F,DEVFL ;SET DEVICE-FLAG=1 ; IS IT A 2ND COLON WITHOUT _ OR , BETWEEN ? JRST ERRCOL ;YES, ERROR TLNE F,ASTFL ;NO, IS AN ASTERIX WITHIN THE DEVICE-NAME ? JRST ERRASD ;YES, ERROR TRNE F,QUEFL ;NO, "?" GIVEN ? JRST ERRQDE ;YES, ERROR TLNE F,LAFL ;NO, INPUT-DEVICE ? JRST COLIN ;YES EXCH CB,ODEV ;NO, STORE OUTPUT-DEVICE-NAME AND CLEAR CHAR.-BUFFER JRST RESCB ;RESET CHAR.-BUFFER COLIN: TLNN F,NWIC ;IC ALREADY INCREMENTED ? AOJG IC,ERRIC ;NO, INCREMENT INPUT-COUNT, >ICMAX ? EXCH CB,IDEV+ICMAX-1(IC) ;NO, STORE INPUT-DEVICE-NAME ; AND CLEAR CHAR.-BUFFER JRST RESCB ;RESET CHAR.-BUFFER PAGE ;HERE WHEN CHARACTER = . DOT: TLCE F,FIFL ;ANOTHER . WITHIN THE EXTENSION ? JRST ERRFIL ;YES, ERROR TLNE F,LAFL ;NO, SET FILE-FLAG, INPUT FILENAME ? JRST DOTIN ;YES TLZN F,ASTFL ;NO, CLEAR ASTERIX-FLAG, ASTERIX FOR FILENAME ? JRST DOTOUT ;NO TLO F,OFIAST ;YES, SET OUTPUT-FILENAME-ASTERIX-FLAG=1 JRST GETNXT ;GET NEXT CHARACTER DOTOUT: EXCH CB,OFIL ;STORE OUTPUT-FILENAME AND CLEAR CHAR.-BUFFER JRST RESCB ;RESET CHAR.-BUFFER DOTIN: TLZE F,DEVFL ;CLEAR DEVICE-FLAG, WAS A DEVICE STORED ALREADY ? JRST DOTAST ;YES TLNN F,NWIC ;NO, IC ALREADY INCREMENTED ? AOJG IC,ERRIC ;NO, INCREMENT INPUT-COUNT, >ICMAX ? CAME IC,MINUIC ;NO, 1ST INPUT-FILENAME ? SKIPA C,IDEV+ICMAX-2(IC) ;NO, GET OLD DEVICE-NAME MOVE C,SIXDSK ;YES, GET SIXBIT/DSK/ MOVEM C,IDEV+ICMAX-1(IC) ;STORE DEVICE-NAME DOTAST: TLZE F,ASTFL ;ASTERIX FOR INPUT-FILENAME ? JRST DOTFA ;YES EXCH CB,IFIL+ICMAX-1(IC) ;STORE INPUT-FILENAME AND CLEAR CHAR.-BUFFER EXCH CB,QB ;STORE MASK FOR "?" AND CLEAR QB EXCH CB,QFMASK+ICMAX-1(IC) TRZ QUEFL ;CLEAR "?"-FLAG JRST RESCB ;RESET CHAR.-BUFFER DOTFA: HRROS IFIASW+ICMAX-1(IC) ;SET INPUT-FILENAME-ASTERIX-FLAG=-1 JRST GETNXT ;GET NEXT CHAR. PAGE ;HERE WHEN CHARACTER = * ASTER: TLOE F,ASTFL ;1ST * WITHIN A NAME ? JRST ERRAST ;NO, ERROR CAIE CC,6 ;YES, SET ASTERIX-FLAG=1, FIRST CHAR. OF A NAME ? JRST ERRASN ;NO, ERROR JRST GETNXT ;YES, GET NEXT CHAR. PAGE ;HERE WHEN CHARACTER = CARRIAGE-RETURN CARRY: TLO F,CRFL ;SET CRFLAG=1 TTCALL 0,C ;GET NEXT CHAR. CAIE C,12 ;LF ? JRST ERRCR ;NO, ERROR ;HERE WHEN CHARACTER = , COMMA: TLNN F,LAFL ;YES, COMMA OR CR ON RIGHT SIDE ? JRST EX ;NO, CHECK FOR /E TLZE F,FIFL ;YES, CLEAR FILE-FLAG, FILENAME ALREADY STORED ? JRST COMEXA ;YES TLZE F,DEVFL ;NO, CLEAR DEVICE-FLAG, DEVICE-NAME ALREADY STORED ? JRST COMFIA ;YES TLNN F,NWIC ;NO, IC ALREADY INCREMENTED ? AOJG IC,ERRIC ;NO, INCREMENT INPUT-COUNT, >ICMAX ? CAME IC,MINUIC ;NO, FIRST INPUT FILENAME ? SKIPA C,IDEV+ICMAX-2(IC) ;NO, GET OLD DEVICE-NAME MOVE C,SIXDSK ;YES, GET SIXBIT/DSK/ MOVEM C,IDEV+ICMAX-1(IC) ;STORE DEVICE-NAME COMFIA: TLZN F,ASTFL ;CLEAR ASTERIX-FLAG, ASTERIX FOR FILENAME ? JRST COMFI ;NO HRROS IFIASW+ICMAX-1(IC) ;YES, SET INPUT-FILENAME-ASTERIX-FLAG=-1 JRST COMCR ;CHECK FOR CRFL COMFI: EXCH CB,IFIL+ICMAX-1(IC) ;STORE INPUT-FILENAME AND CLEAR CHAR.-BUFFER EXCH CB,QB ;STORE MASK FOR "?" AND CLEAR QB EXCH CB,QFMASK+ICMAX-1(IC) TRZ QUEFL ;CLEAR "?"-FLAG JRST COMRES ;RESTORE CHAR.-POINTER COMEXA: TLZN F,ASTFL ;CLEAR ASTERIX-FLAG, ASTERIX FOR EXTENSION ? JRST COMCC ;NO HRROS IEXASN+ICMAX-1(IC) ;SET INPUT-EXT.-ASTERIX-FLAG=-1 JRST COMCR ;CHECK FOR CRFL COMCC: CAIGE CC,3 ;MORE THAN 3 CHAR. FOR EXTENSION ? JRST ERRTHR ;YES, ERROR EXCH CB,IEXT+ICMAX-1(IC) ;NO, STORE INPUT-EXTENSION ; AND CLEAR CHAR.-BUFFER EXCH CB,QB ;STORE MASK FOR "?" AND CLEAR QB EXCH CB,QEMASK+ICMAX-1(IC) TRZ QUEFL ;CLEAR "?"-FLAG COMRES: MOVEI CC,6 ;SET CHAR.-COUNT = 6 MOVE CP,P6QB ;SET UP QUESTION-MARK-BUFFER-POINTER MOVEM CP,QP MOVE CP,P6CB ;RESTORE CHAR. POINTER COMCR: TLZ F,NWIC ;RESET NWIC-FLAG TLZN F,CRFL ;END OF STRING ? JRST GETNXT ;NO, GET NEXT CHAR. ADDI IC,ICMAX ;YES MOVEM IC,ICSAV ;SAVE INPUT-COUNTER SETZ IC, ;CLEAR INPUT-COUNTER PAGE TLNE F,ENDFL ;/E ? JRST EX ;YES MOVE 0,ODEV ;NO, GET OUTPUT-DEVICE-NAME FOR INIT MOVEM 0,INIODV ;STORE IT PUSHJ PDP,INIO ;INIT INRET: MOVE 0,IDEV(IC) ;GET INPUT-DEVICE-NAME FOR INIT MOVEM 0,INIIDV ;STORE IT PUSHJ PDP,INII ;INIT SETZM ODATE ;CLEAR OUTPUT DATE TLZE F,NTAOFL ;NEW OUTPUT TAPE ? (CLEAR FLAG) PUSHJ PDP,NTAOUT ;YES MOVE 0,IEXASN(IC) ;NO, NEW INPUT TAPE ? TRNE 0,-1 PUSHJ PDP,NTAIN ;YES TLZE F,REWOFL ;NO, OUTPUT-TAPE REWIND ? (CLEAR FLAG) PUSHJ PDP,REWOUT ;YES MOVE 0,IFIASW(IC) ;NO, REWIND INPUT TAPE ? TRNE 0,-1 PUSHJ PDP,REWIN ;YES TLNE F,LISTFL ;NO, LIST DIRECTORY ? JRST LIST ;YES TRNE F,FILIFL ;NO, LIST FILENAMES ? JRST LIST ;YES TLNE F,ZEROFL ;NO, ZERO THE DIRECTORY ? JRST ZERO ;YES TLNE F,GENFL ;GENERATE TAPE ? JRST GENER ;YES TLNE F,DELFL ;DELETE FILES ? JRST DELETE ;YES TLNE F,RENFL ;RENAME FILES ? JRST ERRSWI ;YES PAGE ;HERE FOR IO SETZB AC7,AC6 ;YES, CLEAR AC7, RETURN ADDR. FOR * MOVEI AC3,ODEV ;ADDR. OF ODEV => AC3 PUSHJ PDP,DEVCHE ;CHECK FOR OUTPUT DEVICE JRST I1 ;NO MTA, DTA OR DSK FOR OUTPUT JRST DO1 ;DTA OR DSK FOR OUTPUT JUMPE AC0,MO1 ;MTA FOR OUTPUT, DIRECTORY IN CORE ? MTAPE OCH,1 ;NO, REWIND TAPE PUSHJ PDP,NTAOUW ;READ IN DIRECTORY MO1: TRO F,MOUT ;SET MTA FOR OUTPUT FLAG = 1 CAIE AC3,MFILP2 ;MAGTAPE DIR2 FOR OUTPUT ? TRO F,MOD1 ;NO, SET MAGTAPE DIR FOR OUTPUT FLAG = 1 JRST I1 DO1: TRO F,DOUT ;SET DTA OR DSK FOR OUTPUT FLAG = 1 TRZ F,DSKOUT ;CLEAR DISK FOR OUTPUT FLAG SKIPN AC1 ;DISK FOR OUTPUT ? TRO F,DSKOUT ;YES, SET DISK FOR OUTPUT FLAG = 1 I1: TRZ F,MIN+MID1+DIN ;CLEAR MTA FOR INPUT, MTA FOR INPUT DIR1 ; AND DTA OR DSK FOR INPUT FLAGS MOVEI AC3,IDEV(IC) ;ADDR. OF IDEV(IC) => AC3 PUSHJ PDP,DEVCHE ;CHECK FOR INPUT DEVICE JRST I2 ;NO MTA, DTA OR DSK FOR INPUT JRST DI1 ;DTA OR DSK FOR INPUT JUMPE AC0,MI1 ;MTA FOR INPUT, DIRECTORY IN CORE ? MTAPE ICH,1 ;NO, REWIND TAPE PUSHJ PDP,NTAINW ;READ IN DIRECTORY MI1: TRO F,MIN ;YES, SET MTA FOR INPUT FLAG = 1 CAIE AC3,MFILP2 ;MTA DIR2 FOR INPUT ? TRO F,MID1 ;NO, SET MTA DIR FOR INPUT FLAG = 1 JRST I2 DI1: TRO F,DIN ;SET DTA OR DSK FOR INPUT FLAG = 1 TRZ F,DSKIN ;CLEAR DSK FOR INPUT FLAG SKIPN AC1 ;DSK FOR INPUT ? TRO F,DSKIN ;YES, SET DISK FOR INPUT FLAG = 1 I2: TRNE F,DIN ;NO, DTA OR DSK FOR INPUT ? JRST DI2 ;YES TRNE F,MIN ;NO, MTA FOR INPUT ? JRST MI2 ;YES TRNE F,DOUT ;NO, DTA OR DSK FOR OUTPUT ? JRST DO2 ;YES TRNE F,MOUT ;NO, MTA FOR OUTPUT ? JRST MO2 ;YES JRST IO ;NO, MAKE IO PAGE ;IO ROUTINE IO: SETZM MTERR4 ;MARK THAT NOT EOT MOVE AC0,INIIDV ;YES, CAN INPUT DEVICE PERFORM INPUT ? CALL AC0,SIXDCH TLNN AC0,1B34 JRST ERRIDV ;NO, ERROR MOVE AC0,INIODV ;NO, CAN OUTPUT DEVICE PERFORM OUTPUT ? CALL AC0,SIXDCH TLNN AC0,1B35 JRST ERRODV ;NO, ERROR TRNE F,ASCIOU ;YES, OUTPUT IN ASCII MODE ? JRST IO1 ;YES TRNN F,ASCIN ;NO, INPUT IN ASCII MODE ? JRST IO3 ;NO, MAKE IO JRST IO2 ;YES IO1: TRNE F,ASCIN ;INPUT IN ASCII MODE ? JRST IO3 ;YES, MAKE IO TLNE F,COPYFL ;NO, /X ? JRST IO01 ;YES JUMPE IC,IO01 ;NO, 1ST DEVICE ? TLNE AC0,1B32 ;NO, OUTPUT-DEVICE TTY ? JRST IO01 ;YES TLNN AC0,1B21 ;NO, LPT ? JRST ERRMIX ;NO, ERROR IO01: PUSHJ PDP,RELI ;YES, RELEASE INPUT CHANNEL PUSHJ PDP,INII1 ;INIT INPUT IN ASCII MODE LOOKUP ICH,LOOK ;LOOKUP AGAIN JRST ERRLOO ;FILENAME NOT FOUND JRST IO3 ;MAKE IO IO2: TLNN F,COPYFL ;/X ? JUMPN IC,ERRMIX ;NO, 1ST DEVICE ? PUSHJ PDP,RESYS ;YES, RESET SYSTEM PUSHJ PDP,INIO1 ;INIT OUTPUT IN ASCII MODE ENTER OCH,ENT ;ENTER AGAIN JRST ERRENT ;ERROR PUSHJ PDP,INII ;INIT INPUT AGAIN IO3: PUSHJ PDP,INP ;IO JRST IO4 ;EOF PUSHJ PDP,OUTP ;OUTPUT WORD JRST IO03 ;ERROR JRST IO3 ;GO ON IO03: SKIPE MTERR ;MTA FOR OUTPUT ? SETOM MTERR4 ;YES, MARK THAT EOT JRST ERROUT ;NO IO4: CLOSE ICH, ;CLOSE INPUT-CHANNEL TLNN F,COPYFL ;/X ? JRST IO8 ;NO IO5: TRNN F,DSKOUT ;YES, DSK FOR OUTPUT ? JRST IO7 ;NO TRNE F,PROFL ;YES, PROTECTION GIVEN ? JRST IO6 ;YES TLNN F,COPYFL ;NO, /X ? JRST IO7 ;NO TRNN F,DSKIN ;YES, DISK FOR INPUT ? JRST IO7 ;NO IO6: RENAME OCH,RENA ;YES, SET PROTECTION JRST ERRPRO ;ERROR IO7: CLOSE OCH, ;CLOSE OUTPUT-CHANNEL STATZ OCH,IOEOT ;END OF TAPE ? JRST IO03 ;YES SETZM MTERR ;NO, CLEAR MTERR, MTERR1, MTERR2, MTERR3, MTERR4 PUSHJ PDP,SETZMT JUMPN AC7,(AC7) ;NO, RETURN IF * PUSHJ PDP,RELI ;RELEASE INPUT CHANNEL AOJ IC, ;ALL INPUT DONE ? CAMGE IC,ICSAV JRST INRET ;NO, LOOK FOR MORE PUSHJ PDP,RELO ;YES, RELEASE OUTPUT-CHANNEL JRST COMRET ;RETURN TO COMMAND DECODER IO8: JUMPN AC7,(AC7) ;RETURN IF * AOJ IC, ;ALL INPUT DONE ? CAMN IC,ICSAV JRST IO9 ;YES PUSHJ PDP,RELI ;NO, RELEASE INPUT-CHANNEL JRST INRET ;LOOK FOR MORE INPUT IO9: CAIN IC,1 ;ONLY 1 DEVICE FOR INPUT ? JRST IO5 ;YES, LOOK FOR PROTECTION TRNN F,DSKOUT ;NO, DISK FOR OUTPUT ? JRST IO7 ;NO TRNE F,PROFL ;YES, PROTECTION GIVEN ? JRST IO6 ;YES JRST IO7 ;NO PAGE ;DTA OR DSK FOR OUTPUT DO2: TLNE F,COPYFL ;/X ? JRST DO02 ;YES JUMPN IC,IO ;NO, 1ST DEVICE ? SKIPE FIRFIL ;YES, FIRST FILE ? JRST IO ;NO SETOM FIRFIL ;YES, MARK IT DO02: MOVE AC0,OFIL ;STORE FILENAME AND EXTENSION FOR ENTER MOVEM AC0,ENT ; AND FOR RENAME MOVEM RENA MOVE AC0,OEXT MOVEM AC0,ENT+1 MOVEM AC0,RENA+1 MOVE AC0,ODATE ;STORE OUTPUT DATE FOR ENTER AND RENAME MOVEM AC0,ENT+2 TRNN F,PROFL ;PROTECTION GIVEN ? JRST DO3 ;NO TLZ AC0,777000 ;YES, SET PROTECTION ADD AC0,PROTEC DO3: MOVEM AC0,RENA+2 ENTER OCH,ENT ;ENTER JRST ERRENT ;DIR. FULL JRST IO ;MAKE IO ;DTA OR DSK FOR INPUT DI2: JSR DAS ;MAKE LOOKUP TLNN F,COPYFL ;/X ? JRST DI6 ;NO TRNN F,DSKIN ;YES, DSK FOR INPUT ? JRST DI4 ;NO, DTA MOVE AC0,LOOK+2 ;YES, SETUP OLD PROTECTION IN ODATE JRST DI5 DI4: HRRZ AC0,LOOK+2 ;YES, STORE DATE IN ODATE TRZ AC0,770000 DI5: MOVEM AC0,ODATE MOVE AC0,IFIL(IC) ;STORE FILENAME AND EXTENSION IN OFIL, OEXT MOVEM AC0,OFIL MOVE AC0,IEXT(IC) MOVEM AC0,OEXT DI6: TRNE F,MOUT ;MTA FOR OUTPUT ? JRST MO2 ;YES TRNE F,DOUT ;NO, DTA OR DSK FOR OUTPUT ? JRST DO2 ;YES JRST IO ;NO, MAKE IO PAGE ;MTA FOR OUTPUT MO2: TLNE F,COPYFL ;/X ? JRST MO02 ;YES JUMPN IC,IO ;NO, 1ST FILE ? SKIPE FIRFIL ;YES, 1ST FILE ? JRST IO ;NO SETOM FIRFIL ;YES, MARK IT MO02: TRNN F,MOD1 ;DIRECTORY 1 ? JRST MO3 ;NO, DIR2 MOVE AC1,PMDI11 ;YES, FILENAME POINTER => AC1 MOVEI AC4,MFILP1 ;ADDR. OF FILE POSITION => AC4 JRST MO4 MO3: MOVE AC1,PMDI21 ;SAME FOR DIR2 MOVEI AC4,MFILP2 MO4: SKIPN (AC1) ;LOOK FOR FREE FILE JRST MO5 ;FOUND AOBJN AC1,MO4 ;THROUGH ? JRST ERRMFU ;YES, NO ROOM MO5: HLRO AC2,AC1 ;GET FILENUMBER => AC2 ADDI AC2,MDIRFN+1 LSH AC2,1 SUB AC2,(AC4) ;NUMBER OF FILES TO SKIP => AC2 ADDM AC2,(AC4) ;FILE POSITION (FILENUMBER+2) => MFILP AOS (AC4) AOS (AC4) JUMPL AC2,ERRFIP ;NUMBER OF FILES TO SKIP < 0 ? JUMPE AC2,MO7 ;NO, = 0 ? MOVNS AC2 ;NO, MAKE IT NEGATIVE MO6: MTAPE OCH,16 ;SKIP FORWARD 1 FILE MTAPE OCH,0 ;WAIT AOJL AC2,MO6 ;DONE ? MO7: MOVE AC3,(AC4) ;YES, FILE NUMBER => AC3 SOJ AC3, SETZ AC5, ;CLEAR 1ST BYTE COUNTER MO8: IDIVI AC3,^D10 ;CONVERT FILE NUMBER TO DECIMAL ASCII ADDI AC4,60 PUSH PDP,AC4 ;STORE IT AOJ AC5, ;INCREMENT 1ST BYTE COUNTER JUMPN AC3,MO8 ;DONE ? MOVNI AC3,5 ;YES, 2ND BYTE COUNTER AC3 <= -5 HLL AC1,PMDI12 ;GET FILENUMBER POINTER => AC1 MO9: POP PDP,AC0 ;GET FILE NUMBER BYTE => AC0 IDPB AC0,AC1 ;STORE IT IN DIR AOJ AC3, ;INCREMENT 2ND BYTE COUNTER SOJG AC5,MO9 ;DECREMENT 1ST BYTE COUNTER, NUMBER STORED ? AOJE AC3,MO09 ;YES, GT 1000 ? MOVEI AC0,"." ;NO, STORE ASCII/.TAB/ IN DIR IDPB AC0,AC1 MO09: MOVEI AC0,11 IDPB AC0,AC1 MO10: AOJGE AC3,MO11 ;DIR. WORD FILLED ? SETZ AC0, ;NO, FILL REST WITH 0 IDPB AC0,AC1 JRST MO10 MO11: MOVE AC0,(AC1) ;YES, GET WORD BACK INTO AC0 PUSHJ PDP,OUTP ;WRITE IT ON TAPE JRST EREOT3 ;ERROR ADDI AC1,MDIRFN ;AC1 <= ADDR. OF CORRESPONDING FILENAME SKIPN AC2,OFIL ;GET OUTPUT FILENAME, = 0 ? JRST MO17 ;YES, ERROR MOVE AC0,AC2 MOVEM AC0,(AC1) ;NO, STORE IT IN DIR PUSHJ PDP,OUTP ;WRITE IT ON TAPE JRST EREOT2 ;ERROR ADDI AC1,MDIRFN ;AC1 <= ADDR. OF CORRESPONDING EXTENSION CALLI AC0,14 ;GET DATE => AC0 SKIPE ODATE ;ODATE ? MOVE AC0,ODATE ;NO, STORE ODATE => AC0 HLL AC0,OEXT ;YES, AC0 <= MOVEM AC0,(AC1) ;STORE IT IN DIR MOVEM AC1,MTERR ;STORE ADDR. OF EXT. IN MTA DIR. IN MTERR PUSHJ PDP,OUTP ;WRITE IT ON TAPE JRST EREOT1 ;ERROR CLOSE OCH, ;CLOSE OUTPUT CHANNEL, WRITE 2 EOF STATZ OCH,IOEOT ;END OF TAPE ? JRST EREOT1 ;YES HRRZ AC5,AC1 ;SAVE EXTENSION ADDR. IN AC5 TRNN F,MOD1 ;DIR1 ? JRST MO12 ;NO, DIR2 MOVE AC1,PMD1F ;YES, GET FILENAME POINTER => AC1 MOVEI AC2,MDIRE1 ;GET ADDR. OF EXTENSION => AC2 JRST MO13 MO12: MOVE AC1,PMD2F ;SAME FOR DIR2 MOVEI AC2,MDIRE2 MO13: MOVE AC0,OFIL ;OUTPUT FILENAME => AC0 HLLZ AC3,OEXT ;OUTPUT EXTENSION => AC3 PUSHJ PDP,SETZMT ;CLEAR MTERR1, MTERR2, MTERR3, MTERR4 MO14: CAMN AC0,(AC1) ;OUTPUT FILENAME = DIR FILENAME ? JRST MO16 ;YES MO15: AOJ AC2, ;NO, INCR. EXTENSION ADDR. AOBJN AC1,MO14 ;INCREMENT FILENAME POINTER, THROUGH ? JRST IO ;YES MO16: HLLZ AC4,(AC2) ;OUTPUT EXTENSION = DIR EXT ? CAME AC3,AC4 JRST MO15 ;NO HRRZ AC4,AC2 ;YES, FILE JUST WRITTEN ? CAMN AC5,AC4 JRST MO15 ;YES MOVEM AC2,MTERR1 ;STORE EXTENSION POINTER FOR ERROR MOVEM AC0,MTERR2 ;STORE ALSO FILE.EXT MOVE AC5,(AC2) MOVEM AC5,MTERR3 SETZM (AC1) ;NO, ZERO FILENAME AND EXTENSION IN DIR SETZM (AC2) JRST IO MO17: SUBI AC1,MDIRFN ;HERE ON ZERO FILENAME SETZM (AC1) ;ZERO FILENUMBER IN DIR. PUSHJ PDP,EOT ;RESET FILEPOSITION AND DELETE HEADERFILE JRST ERRZFI PAGE ;MTA FOR INPUT MI2: JSR MAS ;NO, GET FILE TLNN F,COPYFL ;/X ? JRST MI4 ;NO HRRZ AC5,(AC2) ;YES, STORE DATE IN ODATE MOVEM AC5,ODATE MOVE AC0,IFIL(IC) ;INPUT FILE.EXT => OFIL.OEXT MOVEM AC0,OFIL MOVE AC0,IEXT(IC) MOVEM AC0,OEXT MI4: HLRO AC0,AC1 ;GET FILE NUMBER => AC0 ADDI AC0,MDIRFN+1 LSH AC0,1 AOJ AC0, SUB AC0,(AC3) ;GET NUMBER OF FILES TO SKIP => AC0 ADDM AC0,(AC3) ;SET MFILP TO RIGHT FILENUMBER AOS (AC3) MOVEM AC3,SAVAC+12 ;SAVE AC3 JUMPLE AC0,MI6 ; > 0 ? MOVNS AC0 ;YES, MAKE IT NEGATIVE MI5: MTAPE ICH,16 ;SKIP FORWARD 1 FILE MTAPE ICH,0 ;WAIT AOJL AC0,MI5 ;DONE ? JRST MI8 ;YES, MAKE IO MI6: JUMPE AC0,MI8 ;SKIP BACK ? SOJ AC0, ;YES, SKIP OVER EOF MI7: MTAPE ICH,17 ;SKIP BACK 1 FILE MTAPE ICH,0 ;WAIT AOJL AC0,MI7 ;DONE ? JRST MI5 ;YES, SKIP OVER EOF MI8: TRNE F,MOUT ;MTA FOR OUTPUT ? JRST MI9 ;YES TRNE F,DOUT ;NO, DTA OR DSK FOR OUTPUT ? JRST DO2 ;YES JRST IO ;NO, MAKE IO MI9: MOVE AC0,ODEV ;SAME MTA# FOR INPUT AND OUTPUT ? CAME AC0,IDEV(IC) JRST MO2 ;NO MOVEI AC1,MFILP2 ;YES, ERROR, SET FILEPOSITION AGAIN TRNE F,MID1 ;DIRECTORY 1 ? MOVEI AC1,MFILP1 ;YES SOS (AC1) JRST ERRMM PAGE ;HERE ON /N (NEW TAPE) FOR OUTPUT-DEVICE NTAOUT: MOVEI AC3,ODEV ;ADDR. OF ODEV => AC3 PUSHJ PDP,DEVCHE ;CHECK FOR DEVICE, MTA ? JRST ERRDSW ;NO, ERROR JRST ERRDSW ;NO, ERROR MTAPE OCH,1 ;YES, REWIND TAPE NTAOUW: MOVE 0,INIODV ;STORE DEVICE NAME INTO INIT FOR DIR.-READIN MOVEM 0,INIIDD MTAPE OCH,0 ;WAIT FOR REWIND PUSHJ PDP,RESYS ;RELEASE INPUT AND OUTPUT CHANNELS PUSHJ PDP,INIID ;INIT FOR INPUT DIRECTORY PUSHJ PDP,INDIR ;GET FIRST WORD OF DIRECTORY => AC0 JRST ERRDIM ;END OF FILE, ERROR CAME 0,MDIR1W ;IS IT A MTA WITH DIRECTORY ? JRST ERRDIM ;NO, ERROR HRL AC4,AC1 ;CLEAR DIRECTORY HRR AC4,AC1 HRRZ AC5,AC4 AOJ AC4, ADDI AC5,DIRLEN-1 SETZM (AC1) BLT AC4,(AC5) MOVEM 0,(AC1) ;YES, STORE IT IN CORE AOBJN AC1,NTGMDO ;INCREMENT POINTER NTGMDO: PUSHJ PDP,INDIR ;GET NEXT DIRECTORY-WORD FROM TAPE => AC0 JRST ERRDID ;ERROR MOVEM 0,(AC1) ;STORE IT IN CORE AOBJN AC1,NTGMDO ;GET NEXT WORD MOVEI 0,2 ;SET FILEPOSITION = 2 MOVEM 0,(AC3) PUSHJ PDP,RELID ;RELEASE INPUT-DIRECTORY-CHANNEL PUSHJ PDP,INIO ;INIT FOR OUTPUT AND INPUT AGAIN PUSHJ PDP,INII POPJ PDP, ;RETURN ;HERE ON /N (NEW TAPE) FOR INPUT-DEVICE NTAIN: MOVEI AC3,IDEV(IC) ;ADDR. OF IDEV(IC) => AC3 PUSHJ PDP,DEVCHE ;CHECK FOR DEVICE, MTA ? JRST ERRDSW ;NO, ERROR JRST ERRDSW ;NO, ERROR MTAPE ICH,1 ;YES, REWIND TAPE NTAINW: MTAPE ICH,0 ;WAIT FOR REWIND PUSHJ PDP,INP ;GET FIRST DIRECTORY-WORD FROM TAPE => AC0 JRST ERRDIM ;END OF FILE, ERROR CAME 0,MDIR1W ;IS IT A MTA WITH DIRECTORY ? JRST ERRDIM ;NO, ERROR HRL AC4,AC1 ;CLEAR DIRECTORY HRR AC4,AC1 HRRZ AC5,AC4 AOJ AC4, ADDI AC5,DIRLEN-1 SETZM (AC1) BLT AC4,(AC5) MOVEM 0,(AC1) ;YES, STORE IT IN CORE AOBJN AC1,NTGMDI ;INCREMENT POINTER NTGMDI: PUSHJ PDP,INP ;GET NEXT DIRECTORY-WORD FROM TAPE => AC0 JRST ERRDIN ;ERROR MOVEM 0,(AC1) ;STORE IT IN CORE AOBJN AC1,NTGMDI ;GET NEXT WORD MOVEI 0,2 ;SET FILE POSITION = 2 MOVEM AC0,(AC3) PUSHJ PDP,RELI PUSHJ PDP,INII POPJ PDP, ;RETURN ERRDIM: SETZM -1(AC1) ;CLEAR MTA-NUMBER AND "MTADI" SETZM (AC1) ; IN MTA DIRECTORY TO MARK THAT NO DIRECTORY THERE JRST ERRDI ;TYPE ERROR MESSAGE PAGE ;HERE ON /W (REWIND TAPE) FOR OUTPUT-DEVICE ; IF COMMAND "MTA#:/W_" IS GIVEN, WRITE OUT DIRECTORY ON TAPE REWOUT: MOVEI AC3,ODEV ;ADDR. OF ODEV => AC3 PUSHJ PDP,DEVCHE ;CHECK FOR DEVICE, MTA ? POPJ PDP, ;NO, JUST RETURN POPJ PDP, ;NO, JUST RETURN MTAPE OCH,1 ;YES, REWIND TAPE JUMPE AC0,REWOU1 ;DIRECTORY IN CORE ? SETOM -1(AC1) ;NO, SET DIRECTORY-HEADER = -1 AGAIN MOVE AC4,INIODV ;RESTORE ODEV MOVEM AC4,ODEV REWOU1: MOVEI AC4,1 ;SET MAGTAPE FILE POSITION = 1 MOVEM AC4,-2(AC1) MTAPE OCH,0 ;WAIT FOR REWIND MOVE AC4,IDEV(IC) ;LOOK FOR "MTA#:/W_" MOVE AC5,ICSAV ;MORE THEN 1 INPUT DEVICE ? CAIN AC5,1 SKIPGE IFIASW(IC) ;NO, * FOR INPUT FILENAME ? POPJ PDP, ;YES, RETURN SKIPL IEXASN(IC) ;NO, * FOR INPUT EXTENSION ? SKIPE IFIL(IC) ;NO, INPUT FILENAME NON ZERO ? POPJ PDP, ;YES, RETURN SKIPN IEXT(IC) ;NO, INPUT EXTENSION NON ZERO ? CAME AC4,SIXDSK ;NO, INPUT DEVICE NON DISK ? POPJ PDP, ;YES, RETURN MOVEI AC3,ODEV ;NO, HERE ON "MTA#:/W_", ADDR. OF ODEV => AC3 PUSHJ PDP,DEVCHE ;CHECK FOR OUTPUT DEVICE AGAIN, MTA ? POPJ PDP, ;NO, RETURN POPJ PDP, ;NO, RETURN JUMPE AC0,REWOU2 ;YES, DIR IN CORE ? PUSHJ PDP,NTAINW ;NO, GET IT INTO CORE JRST REWOU3 ;RETURN REWOU2: MOVE AC0,(AC1) ;YES, GET DIR WORD PUSHJ PDP,OUTP ;WRITE IT ON TAPE JRST ERROUT ;ERROR AOBJN AC1,REWOU2 ;ALL DONE ? OUT OCH, ;YES, OUTPUT LAST BUFFER SKIPA JRST ERROUT ;ERROR REWOU3: PUSHJ PDP,EX2 ;SKIP BACK DIRECTORY JRST COMRET ;RETURN TO COMMAND DECODER ;HERE ON /W (REWIND TAPE) FOR INPUT DEVICE REWIN: MOVEI AC3,IDEV(IC) ;ADDR. OF IDEV(IC) => AC3 PUSHJ PDP,DEVCHE ;CHECK FOR DEVICE, MTA ? POPJ PDP, ;NO, JUST RETURN POPJ PDP, ;NO, JUST RETURN MTAPE ICH,1 ;YES, REWIND TAPE JUMPE AC0,REWIN1 ;DIRECTORY IN CORE ? SETOM -1(AC1) ;NO, SET DIRECTORY HEADER = -1 AGAIN MOVE AC0,INIIDV ;RESTORE IDEV(IC) MOVEM AC0,IDEV(IC) REWIN1: MOVEI AC0,1 ;SET MAGTAPE FILE POSITION = 1 MOVEM AC0,-2(AC1) MTAPE ICH,0 ;WAIT FOR REWIND POPJ PDP, ;RETURN PAGE ;HERE ON /L (LIST DIRECTORY) AND /F (LIST FILENAMES, SHORT DIRECTORY) LIST: MOVE 0,ODEV ;GET OUTPUT-DEVICE-NAME IFE OLDSW,< CALLI 0,64 ;GET DEVICE-NAME JUMP HLLZS 0 CAMN 0,SIXTTY ;TTY ? JRST LIST1 ;YES CAME 0,SIXLPT ;NO, LPT ? > IFN OLDSW,< CALL 0,SIXDCH TLNE 0,1B32 JRST LIST1 TLNN 0,1B21 > JRST ERRLTL ;NO, ERROR, ONLY TTY OR LPT FOR OUTPUT TRO F,LPTOUT ;YES, MARK THAT LPT FOR OUTPUT LIST1: MOVEI AC3,IDEV(IC) ;ADDR. OF IDEV(IC) => AC3 PUSHJ PDP,DEVCHE ;CHECK FOR DEVICE JRST ERRDI ;NO MTA, DTA OR DSK FOR INPUT, ERROR JRST LISTD ;DTA OR DSK FOR INPUT ;LIST MTA DIRECTORY JUMPE 0,LISTM1 ;MTA, DIRECTORY IN CORE ? MTAPE ICH,1 ;NO, REWIND TAPE PUSHJ PDP,NTAINW ;GET DIRECTORY LISTM1: PUSHJ PDP,RELI ;YES, RELEASE INPUT CHANNEL MOVE AC1,-4(AC3) ;AC1 <= <-MDIRFN,,MDIR1+1 OR MDIR2+1> SETZ AC0, ;CLEAR AC0, FREE FILE COUNTER LISTM2: SKIPN (AC1) ;GET FILE-NO, = 0 ? AOJ AC0, ;YES, INCREMENT FREE FILE COUNTER AOBJN AC1,LISTM2 ;NO, INCREMENT FILE-NUMBER-POINTER, DONE ? PUSHJ PDP,CRLF ;PRINT CRLF PUSHJ PDP,LISTAS ;YES, PRINT OUT THE NUMBER OF FREE FILES MOVE AC1,PMFITX ;PRINT OUT ASCII TEXT PUSHJ PDP,LISTTX MOVE AC1,-3(AC3) ;AC1 <= ASCII POINTER FOR FILE NUMBERS MOVE AC2,-2(AC3) ;AC2 <= SIXBIT POINTER FOR FILENAMES MOVE AC3,-1(AC3) ;AC3 <= SIXBIT POINTER FOR EXTENSION HRRM AC3,LISTM4 ;STORE ADDR. OF MDIRE1-1 OR MDIRE2-1 SOS LISTM4 ; FOR COMPARE LISTM3: SKIPN (AC2) ;FILENAME ZERO ? JRST LISTM4-1 ;YES PUSHJ PDP,SAVEAC ;NO, SAVE AC0-AC5 MOVE AC1,(AC2) ;FILENAME => AC1 HLLZ AC4,(AC3) ;EXTENSION => AC4 TDZ AC1,QFMASK(IC) ;MASK OUT "?" BITS TDZ AC4,QEMASK(IC) SKIPL IFIASW(IC) ;* FOR FILENAME ? JRST LSTM45 ;NO SKIPGE IEXASN(IC) ;YES, * FOR EXTENSION TOO ? JRST LSTM25 ;YES JRST LSTM15 ;NO LSTM45: SKIPGE IEXASN(IC) ;* FOR EXT ? JRST LSTM05 ;YES SKIPN IFIL(IC) ;NO, FILENAME ZERO ? JRST LSTM25 ;YES LSTM05: MOVE AC5,IFIL(IC) ;NO, INPUT FILENAME => AC5 TDZ AC5,QFMASK(IC) ;MASK OUT "?" BITS CAME AC1,AC5 ;INPUT FILENAME=DIR FILENAME ? JRST LSTM35 ;NO, DON'T PRINT IT SKIPGE IEXASN(IC) ;YES, * FOR EXT ? JRST LSTM25 ;YES LSTM15: HLLZ AC5,IEXT(IC) ;NO, INPUT EXT => AC5 TDZ AC5,QEMASK(IC) ;MASK OUT "?" BITS CAME AC4,AC5 ;INPUT EXT = DIR EXT ? JRST LSTM35 ;NO, DON'T PRINT IT LSTM25: MOVE AC1,(AC2) ;YES, GET CORRECT FILENAME.EXT MOVE AC4,(AC3) EXCH AC1,SAVAC+3 ;GET OLD AC1, AC4 EXCH AC4,SAVAC+6 MOVNI AC4,5 ;BYTE COUNTER LISTM5: ILDB AC0,AC1 ;FILENUMBER ASCII-TEXT => AC0 PUSHJ PDP,OUTP ;PRINT IT OUT JRST ERROUT ;ERROR AOJL AC4,LISTM5 ;DONE ? HRLI AC1,440700 ;YES, RESTORE LEFT HALF OF FILENUMBER POINTER EXCH AC1,SAVAC+3 EXCH AC4,SAVAC+6 PUSHJ PDP,PRFIEX ;PRINT OUT FILE.EXT TRNN F,FILIFL ;YES, ONLY FILENAME LISTING ? PUSHJ PDP,LIMDAT ;NO, LIST DATE TOO PUSHJ PDP,CRLF ;YES, PRINT CR LF SKIPA LSTM35: PUSHJ PDP,RESTAC ;RESTORE AC0-AC5 IF NO PRINT HRRZ AC4,AC2 LISTM4: CAIN AC4, ;RIGHT HALF SET OBOVE, ALL DONE ? JRST MOREIN ;YES AOJ AC1, ;NO, INCREMENT FILENUMBER POINTER AOJ AC2, ;INCREMENT FILENAME POINTER AOJA AC3,LISTM3 ;INCREMENT EXTENSION POINTER AND GO ON MOREIN: AOJ IC, ;YES, INCREMENT INPUT COUNTER CAME IC,ICSAV ;ALL INPUT DONE ? JRST INRET ;NO PUSHJ PDP,RELI ;YES, RELEASE INPUT AND OUTPUT CHANNEL PUSHJ PDP,RELO JRST COMRET ;RETURN TO COMMAND DECODER LIMDAT: PUSHJ PDP,TWOSPA ;PRINT 2 SPACES HRRZ AC0,(AC3) ;GET CREATION DATE OF FILE => AC0 TRZ AC0,770000 PUSHJ PDP,DATE ;LIST DATE POPJ PDP, ;RETURN PAGE ;LIST DTA DIRECTORY LISTD: JUMPE AC1,LISTDS ;DEVICE DTA ? PUSHJ PDP,DTADIR ;YES, READ DTA DIRECTORY INTO CORE MOVE AC2,PDIR ;GET DIR.-BLOCK POINTER => AC2 SETZ AC0, ;CLEAR FREE BLOCK COUNTER LISDT2: CAMN AC2,PEODB ;END OF DIR.-BLOCK ? JRST LISDT3 ;YES ILDB AC1,AC2 ;GET BLOCK-BYTE => AC1 JUMPN AC1,LISDT2 ;ZERO ? AOJA AC0,LISDT2 ;YES, INCREMENT FREE BLOCK COUNTER LISDT3: PUSHJ PDP,CRLF ;PRINT CR LF PUSHJ PDP,LISTAS ;CONVERT TO ASCII AND PRINT MOVE AC1,PBLKTX ;GET BLOCK-TEXT POINTER PUSHJ PDP,LISTTX ;PRINT OUT TEXT MOVE AC1,PDIRF ;POINTER TO FILENAMES => AC1 MOVEI AC2,DIRE ;POINTER TO EXTENSIONS => AC2 LISDT8: SKIPN (AC1) ;FILENAME ZERO ? JRST LISDT9 ;YES PUSHJ PDP,SAVEAC ;NO, SAVE AC0-AC5 MOVE AC6,(AC1) ;FILENAME => AC1 + AC6 MOVE AC1,AC6 HLLZ AC4,(AC2) ;EXT,,0 => AC4 TDZ AC1,QFMASK(IC) ;MASK OUT "?" BITS TDZ AC4,QEMASK(IC) SKIPL IFIASW(IC) ;* FOR FILENAME ? JRST LSDT48 ;NO SKIPGE IEXASN(IC) ;YES, * FOR EXTENSION TOO ? JRST LSDT28 ;YES JRST LSDT18 ;NO LSDT48: SKIPGE IEXASN(IC) ;* FOR EXT ? JRST LSDT08 ;YES SKIPN IFIL(IC) ;NO, FILENAM ZERO ? JRST LSDT28 ;YES LSDT08: MOVE AC7,IFIL(IC) ;NO, INPUT FILENAME => AC7 TDZ AC7,QFMASK(IC) ;MASK OUT "?" BITS CAME AC1,AC7 ;INPUT FILENAME = DIR FILENAME ? JRST LSDT38 ;NO, DON'T PRINT IT SKIPGE IEXASN(IC) ;YES, * FOR EXT ? JRST LSDT28 ;YES LSDT18: HLLZ AC7,IEXT(IC) ;NO, INPUT EXT => AC7 TDZ AC7,QEMASK(IC) ;MASK OUT "?" BITS CAME AC4,AC7 ;INPUT EXT = DIR EXT ? JRST LSDT38 ;NO, DON'T PRINT IT LSDT28: MOVE AC1,AC6 ;YES, GET OLD FILENAME.EXT HLLZ AC4,(AC2) PUSHJ PDP,PRFIEX ;PRINT IT OUT TRNN F,FILIFL ;YES, ONLY FILENAME LISTING ? PUSHJ PDP,LIDDAT ;NO, LIST BLOCK NUMBERS AND DATE TOO SETO AC3, ;MARK THAT NO TTCALL PUSHJ PDP,CRLF ;YES, PRINT CRLF SKIPA LSDT38: PUSHJ PDP,RESTAC ;RESTORE AC0-AC5 IF NO PRINT LISDT9: AOJ AC2, ;INCREMENT POINTERS AOBJN AC1,LISDT8 ;ALL DONE ? JRST MOREIN ;YES, LOOK FOR MORE INPUT ;ROUTINE TO LIST BLOCK NUMBERS AND CREATION DATES FOR DTA DIRECTORY LIDDAT: MOVE AC3,PDIR ;BLOCK POINTER => AC3 SETZ AC0, ;CLEAR BLOCK COUNTER AC0 HRRZ AC5,AC1 ;FILENUMBER => AC5 SUBI AC5,DIRF-1 LIDDA1: CAMN AC3,PEODB ;DONE ? JRST LIDDA2 ;YES ILDB AC4,AC3 ;NO, GET BLOCK SLOT => AC4 CAMN AC4,AC5 ;= FILE NUMBER ? AOJA AC0,LIDDA1 ;YES, INCREMENT BLOCK COUNTER, GO ON JRST LIDDA1 ;NO, GO ON LIDDA2: PUSHJ PDP,LISTAS ;PRINT OUT BLOCK COUNTER MOVEI AC0,11 ;PRINT TAB PUSHJ PDP,OUTP JRST ERROUT ;ERROR HRRZ AC0,(AC2) ;GET DATE => AC0 TRZ AC0,770000 PUSHJ PDP,DATE ;LIST DATE POPJ PDP, ;RETURN PAGE ;LIST DISK DIRECTORY LISTDS: CALLI AC0,24 ;GET PROJ.-PROGR. NUMBER => AC0 MOVEM AC0,LOOK ; TO GET UFD MOVE AC0,SIXUFD ;SIXBIT/UFD/ => LOOK+1 MOVEM AC0,LOOK+1 MOVE AC0,PP11 ;SETUP PRO,PRO NO 1,1 MOVEM AC0,LOOK+3 MOVE AC0,SIXDSK ;INIT ICH ON DSK MOVEM AC0,INIIDV PUSHJ PDP,RELI PUSHJ PDP,INII LOOKUP ICH,LOOK ;GET UFD JRST ERRDIN ;ERROR TRNE F,FILIFL ;SHORT DIRECTORY ? JRST LSTDS1 ;YES MOVE AC1,PDSDIR ;NO, TEXT POINTER => AC1 PUSHJ PDP,LISTTX ;PRINT "DIRECTORY" CALLI AC2,24 ;GET PROJ.-PROGR. NUMBER HLRZ AC1,AC2 PUSHJ PDP,LISTOC ;PRINT PROJ.,,PROGR. MOVEI AC0,"," PUSHJ PDP,OUTP JRST ERROUT HRRZ AC1,AC2 PUSHJ PDP,LISTOC MOVEI AC0,11 ;PRINT TAB PUSHJ PDP,OUTP JRST ERROUT CALLI AC0,23 ;GET TIME => AC0 PUSHJ PDP,TIME ;PRINT IT OUT MOVEI AC0,11 ;PRINT TAB PUSHJ PDP,OUTP JRST ERROUT CALLI AC0,14 ;DATE => AC0 PUSHJ PDP,DATE ;PRINT IT OUT PUSHJ PDP,CRLF ;PRINT CR LF MOVE AC1,PDSTXT TRNE F,LPTOUT ;LPT FOR OUTPUT ? PUSHJ PDP,LISTTX ;YES, PRINT OUT DIRECTORY HEADER MOVE AC0,SIXDSK ;NO, INIT DISK ON DIR.-CHANNEL TOO MOVEM AC0,INIIDD PUSHJ PDP,INIID SETZM DSKBLK ;CLEAR TOTAL DISK BLOCK LOC. LSTDS1: SETO AC3, PUSHJ PDP,CRLF ;PRINT CR LF LSDS31: PUSHJ PDP,INP ;GET FILENAME JRST LSTDS2 ;END OF FILE JUMPE AC0,LSDS31 ;FILENAME = 0 ? MOVE AC1,AC0 ;NO, FILENAME => AC1 MOVEM AC1,LOOKD ;FILENAME => LOOKD PUSHJ PDP,INP ;GET EXTENSION JRST ERRIN ;ERROR HLLZ AC4,AC0 ;EXT,,0 => AC4 MOVEM AC4,LOOKD+1 ;EXT. => LOOKD+1 TDZ AC1,QFMASK(IC) ;MASK OUT "?" BITS TDZ AC4,QEMASK(IC) SKIPL IFIASW(IC) ;* FOR FILENAME ? JRST LSDS41 ;NO SKIPGE IEXASN(IC) ;YES, * FOR EXTENSION TOO ? JRST LSDS21 ;YES JRST LSDS11 ;NO LSDS41: SKIPGE IEXASN(IC) ;* FOR EXT ? JRST LSDS01 ;YES SKIPN IFIL(IC) ;NO, FILENAME ZERO ? JRST LSDS21 ;YES LSDS01: MOVE AC6,IFIL(IC) ;NO, INPUT FILENAME => AC6 TDZ AC6,QFMASK(IC) ;MASK OUT "?" BITS CAME AC1,AC6 ;INPUT FILENAME = DIR FILENAME ? JRST LSDS31 ;NO, DON'T PRINT IT SKIPGE IEXASN(IC) ;YES, * FOR EXT ? JRST LSDS21 ;YES LSDS11: HLLZ AC6,IEXT(IC) ;NO, INPUT EXT => AC6 TDZ AC6,QEMASK(IC) ;MASK OUT "?" BITS CAME AC4,AC6 ;INPUT EXT = DIR EXT ? JRST LSDS31 ;NO, DON'T PRINT IT LSDS21: MOVE AC1,LOOKD ;YES, GET CORRECT FILENAME.EXT HLLZ AC4,LOOKD+1 PUSHJ PDP,PRFIEX ;PRINT IT OUT TRNE F,FILIFL ;SHORT DIR. ? JRST LSTDS1 ;YES, GO ON LOOKUP ICHD,LOOKD ;NO, LOOKUP FILE.EXT JRST ERRDIN ;ERROR MOVEI AC0,11 ;PRINT TAB PUSHJ PDP,OUTP JRST ERROUT ;ERROR SKIPL LOOKD+3 ;- WORD COUNT ? JRST LSTDS3 ;NO, BLOCK NUMBER HLRO AC0,LOOKD+3 ;YES, MAKE IT POSITIVE MOVN AC0,AC0 SETZ AC1, LSHC AC0,-7 ;DIVIDED BY 128 SKIPE AC1 AOJ AC0, ;ROUND IT ADDM AC0,DSKBLK ;ADD IT TO TOTAL DISK BLOCK PUSHJ PDP,LISTAS ;PRINT IT OUT JRST LSTDS4 ;GO ON LSTDS3: HLRZ AC0,LOOKD+3 ;GET BLOCK NUMBER ADDM AC0,DSKBLK ;ADD IT TO TOTAL DISK BLOCK PUSHJ PDP,LISTAS ;PRINT IT OUT LSTDS4: MOVEI AC0,11 ;PRINT TAB PUSHJ PDP,OUTP JRST ERROUT ;ERROR MOVEI AC0,"<" ;PRINT "<" PUSHJ PDP,OUTP JRST ERROUT ;ERROR MOVNI AC2,3 ;COUNTER => AC2 MOVE AC1,LOOKD+2 ;GET PROTECTION => AC0 LSTDS5: SETZ AC0, ;CLEAR AC0 LSHC AC0,3 ADDI AC0,60 ;CONVERT IT TO ASCII PUSHJ PDP,OUTP ;PRINT IT OUT JRST ERROUT ;ERROR AOJL AC2,LSTDS5 ;DONE ? MOVEI AC0,">" ;YES, PRINT ">" PUSHJ PDP,OUTP JRST ERROUT MOVEI AC0,11 ;PRINT TAB PUSHJ PDP,OUTP JRST ERROUT ;ERROR TRNN F,LPTOUT ;LPT FOR OUTPUT ? JRST LSTDS7 ;NO, SHORT FOR TTY HRRZ AC0,LOOKD+1 ;YES, GET DATE => AC0 TRZ AC0,770000 PUSHJ PDP,DATE MOVEI AC0,11 ;PRINT TAB PUSHJ PDP,OUTP JRST ERROUT ;ERROR MOVE AC1,LOOKD+2 ;GET TIME => AC0 LSHC AC0,^D13 SETZ AC0, LSHC AC0,^D11 PUSHJ PDP,TIME1 ;PRINT IT OUT MOVEI AC0,11 ;PRINT TAB PUSHJ PDP,OUTP JRST ERROUT ;ERROR LSTDS7: HRRZ AC0,LOOKD+2 ;CREATION DATE => AC0 TRZ AC0,770000 PUSHJ PDP,DATE ;PRINT IT OUT TRNN F,LPTOUT ;LPT FOR OUTPUT ? JRST LSTDS1 ;NO, SHORT FOR TTY MOVEI AC0,11 ;YES, PRINT TAB PUSHJ PDP,OUTP JRST ERROUT ;ERROR MOVE AC2,LOOKD+2 ;MODE =>AC1 LSHC AC1,^D9 SETZ AC1, LSHC AC1,4 PUSHJ PDP,LISTOC ;TYPE IT OUT JRST LSTDS1 ;GO ON LSTDS2: PUSHJ PDP,CRLF TRNE F,FILIFL ;SHORT DIR. ? JRST LSTDS6 ;YES MOVE AC1,PBKTXT PUSHJ PDP,LISTTX ;PRINT "TOTAL BLOCKS" MOVE AC0,DSKBLK ;GET TOTAL DISK BLOCKS PUSHJ PDP,LISTAS ;PRINT IT OUT PUSHJ PDP,CRLF ;PRINT CR LF PUSHJ PDP,RELID ;RELEASE DIRECTORY-INPUT-CHANNEL LSTDS6: PUSHJ PDP,RELI ;RELEASE INPUT CHANNEL JRST MOREIN ;LOOK FOR MORE INPUT PAGE ;HERE ON /Z (ZERO THE DIRECTORY) ZERO: MOVEI AC3,ODEV ;ADDR. OF ODEV => AC3 PUSHJ PDP,DEVCHE ;CHECK FOR DEVICE JRST ERRDI ;NO MTA, DTA OR DSK FOR OUTPUT, ERROR JRST ZERODT ;DTA OR DSK MTAPE OCH,1 ;MTA, REWIND TAPE MOVE 0,MDIR1W ;MARK THAT MAGTAPE HAS A DIRECTORY MOVEM 0,(AC1) AOJ AC1, SETZB 0,(AC1) ;ZERO DIRECTORY IN CORE HRLS AC2,AC1 AOJ AC1, ADDI AC2,DIRLEN-2 BLT AC1,(AC2) MOVNI AC1,DIRLEN MOVE 0,MDIR1W ;GET DIRECTORY IDENTIFICATION WORD (ASCII/MTADI/) MTAPE OCH,0 ;WAIT FOR REWIND PUSHJ PDP,OUTP ;STORE IT ON TAPE JRST ZERO2 ;END OF TAPE, ERROR SETZ AC0, ZEROM2: PUSHJ PDP,OUTP ;ZERO DIRECTORY ON TAPE JRST ZERO2 ;END OF TAPE, ERROR AOJL AC1,ZEROM2 ;ALL DONE ? CLOSE OCH, ;YES, WRITE 2 END OF FILES MOVEI AC0,2 ;SET FILE POSITION = 2 MOVEM AC0,(AC3) JRST ZERO1 ;RELEASE CHANNELS ZERODT: JUMPE AC1,ERRNZD ;DTA ? CALL OCH,[SIXBIT/UTPCLR/] ;YES, CLEAR DTA-DIRECTORY ZERO1: PUSHJ PDP,RELI ;RELEASE INPUT AND OUTPUT CHANNELS PUSHJ PDP,RELO TTCALL 3,[ASCIZ/ZERO DIRECTORY ! /] JRST COMRET ;ALL DONE ZERO2: MOVEI AC0,1 ;ERROR, SET FILEPOSITION = 1 MOVEM AC0,(AC3) JRST ERROUT PAGE ;HERE ON /E (WRITE OUT DIRECTORY ON TAPES, REWIND TAPES AND EXIT) EX: TLNN F,ENDFL ;/E ? JRST ERRCMA ;NO, ERROR SKIPL AC1,MDIR10 ;DIR1 IN CORE ? PUSHJ PDP,EXD1 ;YES, WRITE IT OUT SKIPGE AC1,MDIR20 ;NO, DIR2 IN CORE ? CALLI 12 ;NO, JUST EXIT TO MONITOR PUSHJ PDP,EXNU ;YES, INIT TAPE AND REWIND EXD2L: MOVE AC0,MDIR2(AC1) ;GET DIR2-WORD => AC0 PUSHJ PDP,OUTP ;WRITE IT ON TAPE JRST ERROUT ;ERROR AOBJN AC1,EXD2L ;ALL DONE ? PUSHJ PDP,EX1 ;YES, REWIND TAPE, RELEASE CHANNEL CALLI 12 ;EXIT TO MONITOR ;WRITE DIRECTORY 1 ONTO TAPE EXD1: PUSHJ PDP,EXNU ;INIT TAPE AND REWIND IT EXD1L: MOVE AC0,MDIR1(AC1) ;GET DIR1 WORD => AC0 PUSHJ PDP,OUTP ;WRITE IT ON TAPE JRST ERROUT ;ERROR AOBJN AC1,EXD1L ;ALL DONE ? PUSHJ PDP,EX1 ;YES, REWIND TAPE, RELEASE CHANNEL POPJ PDP, ;RETURN ;INIT TAPE FOR OUTPUT AND REWIND IT EXNU: ADDI AC1,17 ;SIXBIT MTA NUMBER => AC1 LSH AC1,^D12 ;STORE SIXBIT/MTA#/ FOR INIT HLL AC1,SIXMTA MOVEM AC1,INIODV PUSHJ PDP,INIO ;INIT OUTPUT MTAPE OCH,1 ;REWIND TAPE MOVNI AC1,DIRLEN ;<-DIRLEN,,0> => AC1 HRLZS AC1 MTAPE OCH,0 ;WAIT FOR REWIND POPJ PDP, ;RETURN ;OUTPUT LAST BUFFER, SKIP BACK AND RELEASE SYSTEM EX1: OUT OCH, ;OUTPUT LAST BUFFER JRST EX2 JRST ERROUT ;ERROR EX2: MTAPE OCH,17 ;SKIP BACK DIRECTORY MTAPE OCH,0 ;WAIT PUSHJ PDP,RESYS ;RELEASE OUTPUT CHANNEL POPJ PDP, ;RETURN PAGE ;HERE ON /D (DELETE FILES) DELETE: PUSHJ PDP,RELI ;RELEASE INPUT CHANNEL SETO AC6, ;MARK THAT DELETE IS WANTED SKIPL IFIASW(IC) ;* FOR INPUT FILENAME ? JRST DEL1 ;NO SKIPGE IEXASN(IC) ;YES, * FOR INPUT EXTENSION ? JRST DEL2 ;YES, ZERO DIRECTORY DEL1: TRON F,FIDEL ;NO, WAS "FILES DELETED:" WRITTEN ALREADY ? TTCALL 3,[ASCIZ/FILES DELETED : /] MOVEI AC3,ODEV ;YES, ADDR. OF ODEV => AC3 PUSHJ PDP,DEVCHE ;CHECK FOR DEVICE JRST ERRDI ;NO MTA, DTA OR DSK JSR DAS ;DTA OR DSK DELETE JUMPE AC0,MAS+1 ;MTA, DIRECTORY IN CORE ? MTAPE OCH,1 ;NO, REWIND TAPE PUSHJ PDP,NTAOUW ;GET DIRECTORY JSR MAS ;DELETE FILES ;HERE FOR DELETE *.* DEL2: MOVEI AC3,ODEV ;ADDR. OF ODEV => AC3 PUSHJ PDP,DEVCHE ;CHECK FOR DEVICE JRST ERRDI ;ERROR, DEVICE HAS NO DIR. SKIPA ;DTA OR DSK JSR MAS ;MTA JUMPN AC1,ZERO ;DTA JRST DEL1 ;DISK PAGE ;ROUTINE TO HANDLE ASTERIX FOR FILENAME AND EXTENSION AND TO DELETE FILES ; FOR MAGTAPES MAS: 0 ;ENTER BY JSR MAS MOVE AC1,-5(AC3) ;FILENAME POINTER => AC1 HRRZ AC2,-1(AC3) ;ADDR. OF MDIRE => AC2 SKIPGE IFIASW(IC) ;* FOR FILENAME ? JRST MAS5 ;YES SKIPGE IEXASN(IC) ;NO, * FOR EXTENSION ? JRST MAS13 ;YES SKIPN AC4,IFIL(IC) ;NO, INPUT FILENAME => AC4, = 0 ? JRST ERRZFI ;YES, ERROR SKIPN QFMASK(IC) ;NO, QUESTION MARK WITHIN FILENAME OR EXTENSION ? SKIPE QEMASK(IC) JRST MQ ;YES MOVE AC0,IEXT(IC) ;NO, INPUT EXTENSION => AC0 MAS1: CAMN AC4,(AC1) ;INPUT FILENAME = DIR FILENAME ? JRST MAS3 ;YES MAS2: AOJ AC2, ;NO, INCREMENT EXTENSION ADDR. AOBJN AC1,MAS1 ;INCREMENT FILENAME POINTER, THROUGH ? JRST ERRLOO ;YES, FILENAME NOT FOUND MAS3: HLLZ AC5,(AC2) ;INPUT EXT = DIRECTORY EXT ? CAME AC0,AC5 JRST MAS2 ;NO, GO ON JUMPE AC6,@MAS ;YES, DELETE ? ;HERE FOR DELETE FILE.EXT ON MTA PUSHJ PDP,TYDEF1 ;YES, TYPE OUT DELETED FILE JRST DASRET ;LOOK FOR MORE INPUT ;HERE ON *. FOR FILES ON MTA MAS5: SKIPGE IEXASN(IC) ;*.* ? JRST MAS21 ;YES MOVEI AC4,12 ;NO, STORE * IN IFIL HRLZM AC4,IFIL(IC) MAS6: MOVE AC0,IEXT(IC) ;EXTENSION => AC0 HLLZ AC5,(AC2) ;INPUT EXTENSION = DIR. EXT ? TDZ AC0,QEMASK(IC) ;MASK OUT "?"-BITS TDZ AC5,QEMASK(IC) CAMN AC0,AC5 ;INPUT EXTENSION = DIR. EXTENSION ? JRST MAS9 ;YES MAS7: AOJ AC2, ;NO, INCREMENT POINTER FOR EXT. AND FILENAME AOBJN AC1,MAS6 ;THROUGH ? MAS8: JRST ERRLOO ;YES, INSTRUCTION CHANGED MAS9: MOVE AC4,(AC1) ;FILENAME => AC4 JUMPE AC4,MAS7 ;FILENAME ZERO ? MOVEM AC4,IFIL(IC) ;NO, STORE IT IN IFIL MOVE AC5,(AC2) ;SET UP CORRECT EXTENSION HLLZM AC5,IEXT(IC) MOVEI AC4,MAS12 ;CHANGE JRST IN MAS8 HRRM AC4,MAS8 JUMPN AC6,MAS11 ;DELETE ? JSR MTSAV ;NO, DO INPUT JRST MAS7 ;GO ON ;HERE FOR DELETE *. ON MTA MAS11: PUSHJ PDP,TYDEF1 ;TYPE OUT DELETED FILE JRST MAS7 MAS12: MOVEI AC3,ERRLOO ;YES, RESTORE ERROR JRST IN MAS8 HRRM AC3,MAS8 JRST DASRET ;LOOK FOR MORE INPUT ;HERE FOR .* ON MTA MAS13: MOVEI AC4,12 ;STORE * IN IEXT HRLZM AC4,IEXT(IC) MAS14: SKIPN AC4,IFIL(IC) ;FILENAME ZERO ? JRST ERRZFI ;YES, ERROR MOVE AC5,(AC1) ;NO, DIR FILENAME => AC5 JUMPE AC5,MAS15 ;FILENAME = 0 ? TDZ AC5,QFMASK(IC) ;NO, MASK OUT "?" BITS TDZ AC4,QFMASK(IC) CAMN AC4,AC5 ;INPUT FILENAME = DIR. FILENAME ? JRST MAS17 ;YES MAS15: AOJ AC2, ;NO, INCREMENT POINTERS FOR EXT. AND FILENEME AOBJN AC1,MAS14 ;THROUGH ? MAS16: JRST ERRLOO ;YES, INSTRUCTION CHANGED MAS17: MOVE AC0,(AC2) ;EXTENSION => IEXT HLLZM AC0,IEXT(IC) MOVE AC5,(AC1) ;STORE CORRECT FILENAME MOVEM AC5,IFIL(IC) MOVEI AC0,MAS20 ;CHANGE JRST IN MAS16 HRRM AC0,MAS16 JUMPN AC6,MAS19 ;DELETE ? JSR MTSAV ;NO, DO INPUT JRST MAS15 ;GO ON ;HERE FOR DELETE FILES .* ON MTA MAS19: PUSHJ PDP,TYDEF1 ;TYPE OUT DELETED FILE JRST MAS15 MAS20: MOVEI AC3,ERRLOO ;RESTORE ERROR JRST IN MAS16 HRRM AC3,MAS16 JRST DASRET ;LOOK FOR MORE INPUT ;HERE FOR *.* ON MTA MAS21: JUMPN AC6,MAS27 ;INPUT ? SKIPE AC4,(AC1) ;YES, FILENAME ZERO ? JRST MAS24 ;NO MAS22: AOJ AC2, ;YES, INCREMENT POINTERS AOBJN AC1,MAS21 ;THROUGH ? MAS23: JRST ERRZDI ;YES, INSTRUCTOIN CHANGED MAS24: MOVEI AC0,MAS26 ;CHANGE ERROR JRST IN MAS23 HRRM AC0,MAS23 MOVEM AC4,IFIL(IC) ;STORE FILE.EXT IN IFIL AND IEXT MOVE AC0,(AC2) HLLZM AC0,IEXT(IC) JRST MAS22 ;GO ON MAS26: MOVEI AC0,ERRZDI ;RESTORE ERROR JRST IN MAS23 HRRM AC0,MAS23 JRST DASRET ;LOOK FOR MORE INPUT ;HERE FOR DELETE *.* ON MTA MAS27: SKIPE AC4,(AC1) ;FILENAME ZERO ? JRST MAS29 ;NO MAS28: AOJ AC2, ;YES, INCREMENT POINTERS AOBJN AC1,MAS27 ;THROUGH ? JRST DASRET ;YES MAS29: MOVEM AC4,IFIL(IC) ;STORE FILE.EXT IN IFIL AND IEXT HLLZ AC4,(AC2) MOVEM AC4,IEXT(IC) PUSHJ PDP,TYDEF1 ;TYPE IT OUT JRST MAS28 ;GO ON ;HERE FOR "?" WITHIN FILENAME OR EXTENSION WITHOUT "*" FOR MTA MQ: SKIPN AC4,IFIL(IC) ;INPUT FILENAME => AC4, = 0 ? JRST ERRZFI ;YES, ERROR MOVE AC0,(AC1) ;DIR FILENAME => AC0, = 0 ? JUMPE AC0,MQ1 TDZ AC0,QFMASK(IC) ;NO, MASK OUT "?" BITS TDZ AC4,QFMASK(IC) CAMN AC0,AC4 ;INPUT FILENAME = DIR FILENAME ? JRST MQ3 ;YES MQ1: AOJ AC2, ;INCREMENT POINTERS FOR FILENAME AND EXT AOBJN AC1,MQ ;THROUGH ? MQ2: JRST ERRLOO ;YES, INSTRUCTION CHANGED MQ3: HLLZ AC0,IEXT(IC) ;INPUT EXT => AC0 HLLZ AC4,(AC2) ;DIR EXT => AC4 TDZ AC0,QEMASK(IC) ;MASK OUT "?" BITS TDZ AC4,QEMASK(IC) CAME AC0,AC4 ;INPUT EXT = DIR EXT ? JRST MQ1 ;NO, GO ON MOVE AC0,(AC1) ;YES, STORE CORRECT FILENAME.EXT HLLZ AC4,(AC2) MOVEM AC0,IFIL(IC) MOVEM AC4,IEXT(IC) MOVEI AC4,MQ5 ;CHANGE JRST IN MQ2 HRRM AC4,MQ2 JUMPN AC6,MQ4 ;DELETE ? JSR MTSAV ;NO, DO INPUT JRST MQ1 ;GO ON ;HERE FOR DELETE FILES WITH "?" WITHOUT "*" MQ4: PUSHJ PDP,TYDEF1 ;TYPE OUT DELETED FILES JRST MQ1 ;GO ON MQ5: MOVEI AC3,ERRLOO ;RESTORE JRST IN MQ2 HRRM AC3,MQ2 JRST DASRET ;LOOK FOR MORE INPUT ;ROUTINE TO SAVE AC1 + AC2 THEN DO INPUT AND RESTORE AC1, AC2 + AC3 MTSAV: 0 ;ENTER BY JSR MTSAV MOVEM AC1,SAVAC+10 ;INPUT, SAVE AC1, AC2 MOVEM AC2,SAVAC+11 MOVEI AC7,MTSAV1 ;RETURN ADDR. => AC7 JRST @MAS ;MAKE INPUT MTSAV1: MOVE AC1,SAVAC+10 ;RESTORE AC1, AC2 AND AC3 MOVE AC2,SAVAC+11 MOVE AC3,SAVAC+12 JRST @MTSAV ;RETURN PAGE ;ROUTINE TO HANDLE ASTERIX FOR FILENAME AND EXTENSION AND DELETE FILES FOR DTA AND DSK DAS: 0 ;ENTER BY JSR MOVEI AC0,12 ;* => AC0 SKIPGE IFIASW(IC) ;* FOR FILENAME ? JRST DAS2 ;YES SKIPGE IEXASN(IC) ;NO, * FOR EXTENSION ? JRST DAS3 ;YES SKIPN QFMASK(IC) ;NO, "?" WITHIN FILENAME OR EXTENSION ? SKIPE QEMASK(IC) JRST DQ ;YES MOVE AC0,IFIL(IC) ;NO, STORE INPUT FILENAME AND EXT FOR LOOKUP MOVEM AC0,LOOK MOVE AC0,IEXT(IC) MOVEM AC0,LOOK+1 TLNE F,DELFL ;DELETE ? JRST DAS1 ;YES LOOKUP ICH,LOOK ;NO, LOOKUP FOR INPUT JRST ERRLOO ;ERROR JRST @DAS ;RETURN ;HERE FOR DELETE FILES WITHOUT * ON DTA AND DISK DAS1: JUMPN AC1,DTAS23 ;DTA ? LOOKUP OCH,LOOK ;NO, DSK, LOOKUP FOR DELETE JRST ERRLOO ;FILENAME NOT FOUND SETZM RENA ;CLEAR FILENAME FOR RENAME (DELETE) RENAME OCH,RENA ;DELETE JRST ERRPRO ;ERROR DAS01: PUSHJ PDP,TYDEF2 ;TYPE OUT DELETED FILE JRST MOREIN ;LOOK FOR MORE INPUT ;HERE FOR DELETE FILE WITHOUT * ON DTA DTAS23: PUSHJ PDP,DTADI1 ;GET DTA DIRECTORY MOVE AC4,IEXT(IC) ;IEXT => AC4 SKIPN AC3,IFIL(IC) ;IFIL => AC3, = 0 ? JRST ERRZFI ;YES, ERROR DTAS24: CAMN AC3,(AC1) ;NO, IFIL = DIR. FILE ? JRST DTAS26 ;YES DTAS25: AOJ AC2, ;NO, INCREMENT POINTERS AOBJN AC1,DTAS24 ;THROUGH ? JRST ERRLOO ;YES, ERROR DTAS26: HLLZ AC5,(AC2) ;IEXT = DIR EXT ? CAME AC5,AC4 JRST DTAS25 ;NO, GO ON PUSHJ PDP,DELDTA ;YES, DELETE FILE.EXT IN DIR PUSHJ PDP,DTDIOU ;WRITE OUT NEW DIR JRST DAS01 ;TYPE IT OUT ;HERE FOR DTA OR DSK FILES WITH * DAS2: HRLZM AC0,IFIL(IC) ;STORE * IN IFIL SKIPA DAS3: HRLZM AC0,IEXT(IC) ;STORE * IN IEXT JUMPE AC1,DSAS1 ;DEVICE DTA ? PUSHJ PDP,DTADI1 ;YES, GET DIR SKIPGE IFIASW(IC) ;* FOR FILENAME ? JRST DTAS10 ;YES SKIPN IFIL(IC) ;NO, FILNAME ZERO ? JRST ERRZFI ;YES, ERROR DTAS4: MOVE AC3,IFIL(IC) ;NO, FILENAME => AC3 MOVE AC5,(AC1) ;DIR FILENAME => AC5 JUMPE AC5,DTAS40 ;FILENAME = 0 ? TDZ AC3,QFMASK(IC) ;NO, MASK OUT "?" BITS TDZ AC5,QFMASK(IC) CAMN AC3,AC5 ;INPUT FILENAME = DIR. FILENAME ? JRST DTAS6 ;YES DTAS40: AOJ AC2, ;INCREMENT FILENAME AND EXT. POINTERS AOBJN AC1,DTAS4 ;THROUGH ? DTAS5: JRST ERRLOO ;YES, INSTRUCTION CHANGED DTAS6: HLLZ AC4,(AC2) ;EXTENSION => AC4 MOVE AC3,(AC1) ;STORE CORRECT FILENAME MOVEM AC3,IFIL(IC) MOVEM AC3,LOOK ;STORE FILE.EXT FOR LOOKUP MOVEM AC4,LOOK+1 MOVEM AC4,IEXT(IC) ;STORE EXTENSION IN IEXT MOVEI AC3,DTAS9 ;CHANGE JRST IN DTAS5 HRRM AC3,DTAS5 JUMPN AC6,DTAS8 ;DELETE ? JSR DTSAV ;NO, DO INPUT JRST DTAS40 ;GO ON ;HERE FOR DELETE .* ON DTA DTAS8: PUSHJ PDP,DELDTA ;DELETE FILE.EXT IN DIR PUSHJ PDP,TYDEF1 ;TYPE OUT DELETED FILE JRST DTAS40 DTAS9: MOVEI AC3,ERRLOO ;RESTORE ERROR JRST IN DTAS5 HRRM AC3,DTAS5 JUMPE AC6,DASRET ;DELETE ? PUSHJ PDP,DTDIOU ;YES, WRITE OUT NEW DIR DASRET: JUMPN AC6,MOREIN ;HERE FROM INPUT ? SETZ AC7, ;CLEAR AC7 (RETURN ADDR.) JRST IO8 ;LOOK FOR MORE INPUT ;HERE ON * FOR FILENAME ON DTA DTAS10: SKIPGE IEXASN(IC) ;*.* ? JRST DTAS18 ;YES DTAS11: HLLZ AC3,IEXT(IC) ;NO, EXTENSION => AC3 HLLZ AC0,(AC2) ;INPUT EXT. = DIR. EXT. ? TDZ AC0,QEMASK(IC) ;MASK OUT "?" BITS TDZ AC3,QEMASK(IC) CAMN AC0,AC3 JRST DTAS14 ;YES DTAS12: AOJ AC2, ;INCREMENT FILENAME AND EXT. POINTERS AOBJN AC1,DTAS11 ;THROUGH ? DTAS13: JRST ERRLOO ;YES DTAS14: MOVE AC4,(AC1) ;FILENAME => AC4 JUMPE AC4,DTAS12 ;FILENAME ZERO ? MOVEM AC4,IFIL(IC) ;NO, STORE IT IN IFIL MOVEM AC4,LOOK ;STORE FILE.EXT FOR LOOKUP HLLZ AC3,(AC2) ;STORE CORRECT EXTENSION MOVEM AC3,IEXT(IC) MOVEM AC3,LOOK+1 MOVEI AC3,DTAS17 ;CHANGE JRST IN DTAS13 HRRM AC3,DTAS13 JUMPN AC6,DTAS16 ;DELETE ? JSR DTSAV ;NO, DO INPUT JRST DTAS12 ;GO ON ;HERE FOR DELETE *. ON DTA DTAS16: PUSHJ PDP,DELDTA ;DELETE FILE.EXT IN DIR PUSHJ PDP,TYDEF1 ;TYPE OUT DELETED FILE JRST DTAS12 DTAS17: MOVEI AC3,ERRLOO ;RESTORE ERROR JRST IN DTAS13 HRRM AC3,DTAS13 JUMPE AC6,DASRET ;DELETE ? PUSHJ PDP,DTDIOU ;YES, WRITE OUT NEW DIR. JRST DASRET ;LOOK FOR MORE INPUT ;HERE ON *.* FOR DTA DTAS18: SKIPE AC3,(AC1) ;HERE ON *.*, FILENAME ZERO ? JRST DTAS20 ;NO AOJ AC2, ;YES, INCREMENT POINTERS AOBJN AC1,DTAS18 ;THROUGH ? DTAS19: JRST ERRZDI ;YES, INSTRUCTION CHANGED DTAS20: MOVE AC0,(AC2) ;STORE FILE.EXT IN IFIL, IEXT AND FOR LOOKUP MOVEM AC3,IFIL(IC) MOVEM AC3,LOOK MOVEM AC0,IEXT(IC) MOVEM AC0,LOOK+1 MOVEI AC0,DTAS22 ;CHANGE ERROR JRST IN DTAS19 HRRM AC0,DTAS19 JSR DTSAV ;DO INPUT AOJ AC2, ;INCREMENT POINTERS AOBJN AC1,DTAS18 ;THROUGH ? DTAS22: MOVEI AC3,ERRZDI ;YES, RESTORE JRST IN DTAS19 HRRM AC3,DTAS19 JRST DASRET ;LOOK FOR MORE INPUT ;HERE FOR "?" WITHIN FILENAME OR EXTENSION WITHOUT "*" ON DTA DQ: JUMPE AC1,DSQ ;DEVICE DTA ? PUSHJ PDP,DTADI1 ;YES, GET DTA DIRECTORY DTQ1: SKIPN AC3,IFIL(IC) ;INPUT FILENAME => AC3, = 0 ? JRST ERRZFI ;YES, ERROR MOVE AC0,(AC1) ;NO, DIR FILENAME => AC0, = 0 ? JUMPE AC0,DTQ2 TDZ AC0,QFMASK(IC) ;NO, MASK OUT "?" BITS TDZ AC3,QFMASK(IC) CAMN AC0,AC3 ;INPUT FILENAME = DIR FILENAME ? JRST DTQ4 ;YES DTQ2: AOJ AC2, ;NO, INCREMENT POINTERS AOBJN AC1,DTQ1 ;THROUGH ? DTQ3: JRST ERRLOO ;YES, INSTRUCTION CHANGED DTQ4: HLLZ AC4,(AC2) ;DIR EXT => AC4 HLLZ AC5,IEXT(IC) ;INPUT EXT => AC5 TDZ AC4,QEMASK(IC) ;MASK OUT "?" BITS TDZ AC5,QEMASK(IC) CAME AC4,AC5 ;INPUT EXT = DIR EXT ? JRST DTQ2 ;NO, GO ON MOVE AC3,(AC1) ;YES, STORE CORRECT FILENAME.EXT HLLZ AC4,(AC2) MOVEM AC3,IFIL(IC) MOVEM AC3,LOOK MOVEM AC4,IEXT(IC) MOVEM AC4,LOOK+1 MOVEI AC3,DTQ6 ;CHANGE JRST IN DTQ3 HRRM AC3,DTQ3 JUMPN AC6,DTQ5 ;DELETE ? JSR DTSAV ;NO, DO INPUT JRST DTQ2 ;GO ON ;HERE TO DELETE FILES WITH "?" BUT WITHOUT "*" FOR DTA DTQ5: PUSHJ PDP,DELDTA ;DELETE FILE.EXT IN DIR PUSHJ PDP,TYDEF1 ;TYPE OUT DELETED FILE.EXT JRST DTQ2 ;GOON DTQ6: MOVEI AC3,ERRLOO ;RESTORE JRST IN DTQ3 HRRM AC3,DTQ3 JUMPE AC6,DASRET ;DELETE ? PUSHJ PDP,DTDIOU ;YES, WRITE OUT NEW DIRECTORY JRST DASRET ;DOOK FOR MORE INPUT ;ROUTINE TO MAKE LOOKUP, SAVE AC1+AC2, MAKE INPUT AND RESTORE AC1+AC2 DTSAV: 0 ;ENTER BY JSR DTSAV LOOKUP ICH,LOOK ;LOOKUP FOR INPUT JRST ERRLOO ;ERROR MOVEI AC7,DTSAV1 ;RETURN ADDR. => AC7 MOVEM AC1,SAVAC+10 ;SAVE AC1, AC2 MOVEM AC2,SAVAC+11 JRST @DAS ;MAKE INPUT DTSAV1: MOVE AC1,SAVAC+10 ;RESTORE AC1, AC2 MOVE AC2,SAVAC+11 JRST @DTSAV ;RETURN PAGE ;HERE FOR DSK DSAS1: JSR DSDI ;INIT DIRECTORY INPUT SKIPGE IFIASW(IC) ;* FOR FILENAME ? JRST DSAS8 ;YES SKIPN IFIL(IC) ;NO, FILENAME ZERO ? JRST ERRZFI ;YES, ERROR DSAS2: MOVE AC3,IFIL(IC) ;NO, FILENAME => AC3 TDZ AC3,QFMASK(IC) ;MASK OUT "?" BITS DSAS4: PUSHJ PDP,INDIR ;GET DIR. FILENAME => AC0 DSAS3: JRST ERRLOO ;END OF FILE, INSTRUCTION CHANGED JUMPE AC0,DSAS4 ;NO, FILENAME ZERO ? MOVE AC5,AC0 ;SAVE FILENAME IN AC5 TDZ AC0,QFMASK(IC) ;MASK OUT "?" BITS CAMN AC3,AC0 ;NO, INPUT FILENAME = DIR. FILENAME ? JRST DSAS5 ;YES PUSHJ PDP,INDIR ;NO, GET EXTENSION JRST ERRDIN ;ERROR JRST DSAS2 ;GO ON DSAS5: PUSHJ PDP,INDIR ;GET EXTENSION => AC0 JRST ERRDIN ;ERROR MOVEM AC0,IEXT(IC) ;STORE EXTENSION IN IEXT MOVEM AC5,IFIL(IC) MOVEM AC5,LOOK ;STORE FILE.EXT FOR DELETE MOVEM AC0,LOOK+1 MOVEI AC3,DSAS7 ;CHANGE JRST IN DSAS3 HRRM AC3,DSAS3 JUMPN AC6,DSAS6 ;INPUT ? LOOKUP ICH,LOOK ;YES, LOOKUP FOR INPUT JRST ERRLOO ;ERROR MOVEI AC7,DSAS2 ;RETURN ADDR. => AC7 JRST @DAS ;RETURN ;HERE FOR DELETE FILES .* ON DSK DSAS6: SETZM RENA LOOKUP OCH,LOOK ;LOOKUP JRST ERRLOO ;ERROR RENAME OCH,RENA ;DELETE JRST ERRPRO ;ERROR PUSHJ PDP,TYDEF2 ;TYPE OUT DELETED FILE JRST DSAS2 ;GO ON DSAS7: MOVEI AC3,ERRLOO ;RESTORE ERROR JRST IN DSAS3 HRRM AC3,DSAS3 JRST DSAS17 ;RELEASE DIR.-INPUT CHANNEL ;HERE ON * FOR FILENAME ON DSK DSAS8: SKIPGE IEXASN(IC) ;* ALSO FOR EXTENSION ? JRST DSAS14 ;YES, ZERO DIRECTORY DSAS9: HLLZ AC3,IEXT(IC) ;NO, EXTENSION => AC3 TDZ AC3,QEMASK(IC) ;MASK OUT "?" BITS DSAS11: PUSHJ PDP,INDIR ;GET FILENAME DSAS10: JRST ERRLOO ;END OF FILE, INSTRUCTION CHANGED JUMPE AC0,DSAS11 ;FILENAME ZERO ? MOVE AC1,AC0 ;NO, FILENAME => AC1 PUSHJ PDP,INDIR ;GET DIR. EXTENSION JRST ERRDIN ;ERROR HLLZS AC0 MOVE AC5,AC0 ;SAVE EXT IN AC5 TDZ AC0,QEMASK(IC) ;MASK OUT "?" BITS CAME AC0,AC3 ;INPUT EXT. = DIR. EXT. ? JRST DSAS9 ;NO, GO ON MOVEM AC1,IFIL(IC) ;YES, STORE FILENAME IN IFIL MOVEM AC1,LOOK ;STORE FILE.EXT FOR DELETE MOVEM AC5,IEXT(IC) ;STORE CORRECT EXT MOVEM AC5,LOOK+1 MOVEI AC3,DSAS13 ;CHANGE JRST IN DSAS10 HRRM AC3,DSAS10 JUMPN AC6,DSAS12 ;INPUT ? LOOKUP ICH,LOOK ;YES, LOOKUP FOR INPUT JRST ERRLOO ;ERROR MOVEI AC7,DSAS9 ;RETURN ADDR. => AC7 JRST @DAS ;RETURN ;HERE FOR DELETE *. ON DSK DSAS12: SETZM RENA LOOKUP OCH,LOOK ;LOOKUP JRST ERRLOO ;ERROR RENAME OCH,RENA ;DELETE JRST ERRPRO ;ERROR PUSHJ PDP,TYDEF2 ;TYPE OUT DELETED FILE JRST DSAS9 ;GO ON DSAS13: MOVEI AC3,ERRLOO ;RESTORE ERROR JRST IN DSAS10 HRRM AC3,DSAS10 JRST DSAS17 ;RELEASE DIR. INPUT CHANNEL ;HERE FOR *.* ON DSK DSAS14: PUSHJ PDP,INDIR ;GET FILENAME => AC0 JRST DSAS17 ;END OF FILE JUMPE AC0,DSAS14 ;FILENAME ZERO ? MOVEM AC0,IFIL(IC) ;NO MOVEM AC0,LOOK PUSHJ PDP,INDIR ;EXTENSION => AC0 JRST ERRIND ;ERROR MOVEM AC0,IEXT(IC) MOVEM AC0,LOOK+1 JUMPN AC6,DSAS16 ;INPUT ? LOOKUP ICH,LOOK ;YES, LOOKUP FOR INPUT JRST ERRLOO ;ERROR MOVEI AC7,DSAS14 ;RETURN ADDR. => AC7 JRST @DAS ;RETURN ;HERE FOR ZERO DSK DIRECTORY VIA /D_*.* DSAS16: SETZM RENA LOOKUP OCH,LOOK ;LOOKUP JRST ERRLOO ;ERROR RENAME OCH,RENA ;DELETE JRST ERRPRO ;ERROR PUSHJ PDP,TYDEF2 ;TYPE OUT DELETED FILENAME JRST DSAS14 ;GO ON DSAS17: PUSHJ PDP,RELID ;RELEASE DIRECTORY INPUT JRST DASRET ;LOOK FOR MORE INPUT ;HERE FOR "?" WITHIN FILENAME OR EXTENSION BUT WITHOUT "*" ON DSK DSQ: JSR DSDI ;INIT DSK DIRECTORY INPUT DSQ1: SKIPN AC3,IFIL(IC) ;INPUT FILNAME => AC3, = 0 ? JRST ERRZFI ;YES, ERROR TDZ AC3,QFMASK(IC) ;NO, MASK OUT "?" BITS DSQ2: PUSHJ PDP,INDIR ;DIR FILENAME => AC0 DSQ3: JRST ERRLOO ;END OF FILE, INSTRUCTION CHANGED JUMPE AC0,DSQ2 ;FILENAME = 0 ? MOVE AC5,AC0 ;NO, SAVE FILENAME IN AC5 TDZ AC0,QFMASK(IC) ;MASK OUT "?" BITS CAMN AC0,AC3 ;INPUT FILENAME = DIR FILENAME ? JRST DSQ4 ;YES PUSHJ PDP,INDIR ;NO, READ IN EXT JRST ERRDIN ;ERROR JRST DSQ1 ;GO ON DSQ4: PUSHJ PDP,INDIR ;DIR EXT => AC0 JRST ERRDIN ;ERROR HLLZS AC3,AC0 ;SAVE EXT IN AC3 TDZ AC0,QEMASK(IC) ;MASK OUT "?" BITS HLLZ AC4,IEXT(IC) ;INPUT EXT => AC4 TDZ AC4,QEMASK(IC) ;MASK OUT "?" BITS CAME AC0,AC4 ;INPUT EXT = DIR EXT ? JRST DSQ1 ;NO, GO ON MOVEM AC5,IFIL(IC) ;YES, STORE FILE.EXT MOVEM AC5,LOOK MOVEM AC3,IEXT(IC) MOVEM AC3,LOOK+1 MOVEI AC3,DSQ6 ;CHANGE JRST IN DSQ3 HRRM AC3,DSQ3 JUMPN AC6,DSQ5 ;DELETE ? LOOKUP ICH,LOOK ;NO, DO INPUT JRST ERRLOO ;ERROR MOVEI AC7,DSQ1 ;RETURN ADDR. => AC7 JRST @DAS ;MAKE INPUT ;HERE TO DELETE FILES WITH "?" BUT WITHOUT "*" ON DSK DSQ5: SETZM RENA ;CLEAR FILENAME IN RENA FOR DELETE LOOKUP OCH,LOOK ;OPEN FILE JRST ERRLOO ;ERROR RENAME OCH,RENA ;DELETE JRST ERRPRO ;ERROR PUSHJ PDP,TYDEF2 ;TYPE OUT DELETED FILE JRST DSQ1 ;GO ON DSQ6: MOVEI AC3,ERRLOO ;RESTORE JRST IN DSQ3 HRRM AC3,DSQ3 JRST DSAS17 ;LOOK FOR MORE INPUT ;ROUTINE TO INIT DSK DIRECTORY INPUT DSDI: 0 ;ENTER BY JSR DSDI MOVE AC0,SIXDSK ;STORE DEVICE NAME DSK FOR DIR. INIT MOVEM AC0,INIIDD PUSHJ PDP,INIID ;INIT DIRECTORY INPUT CALLI AC0,24 ;GET PROJ. PROGR. NUMBER MOVEM AC0,LOOKD ;STORE IT FOR DIR. INPUT MOVE AC0,SIXUFD MOVEM AC0,LOOKD+1 MOVE AC0,PP11 ;SETUP PRO,PRO NO 1,1 MOVEM AC0,LOOKD+3 LOOKUP ICHD,LOOKD ;GET DIRECTORY JRST ERRDIN ;ERROR JRST @DSDI ;;RETURN PAGE ;ROUTINE TO CLEAR MTA-FILENAMES AND EXTENSION ; AND TO TYPE OUT DELETED FILE.EXT ; SAVE AC0-AC5 TYDEF1: SETZM (AC1) ;CLEAR FILENAME AND EXTENSION IN DIRECTORY SETZM (AC2) TYDEF2: PUSHJ PDP,SAVEAC ;SAVE AC0-AC5 MOVE AC1,IFIL(IC) ;TYPE OUT DELETED FILES SETZ AC3, MOVNI AC2,6 ;CHAR. COUNTER PUSHJ PDP,SIXASC HLLZ AC1,IEXT(IC) JUMPE AC1,TYDEF3 ;EXTENSION ZERO ? HRRI AC1,"N" ;NO, TYPE . ROT AC1,-6 MOVNI AC2,4 PUSHJ PDP,SIXASC TYDEF3: PUSHJ PDP,TCRLF PUSHJ PDP,RESTAC ;RESTORE AC0-AC5 POPJ PDP, ;RETURN ;ROUTINE TO READ DTA DIRECTORY INTO CORE DTADIR: USETI ICH,144 ;GET DIRECTORY MOVNI AC1,200 ;DIR. LENGTH => AC1 HRLZS AC1 IN ICH, ;INPUT 1 BUFFER, ERROR ? SOSA AC2,IBUF+1 ;NO, DECREMENT POINTER, => AC2 JRST ERRDIN ;YES DTAD: ILDB AC0,AC2 ;GET WORD MOVEM AC0,DIR(AC1) ;STORE IT IN CORE AOBJN AC1,DTAD ;DONE ? PUSHJ PDP,RELI ;YES, RELEASE INPUT CHANNEL POPJ PDP, ;RETURN ;ROUTINE TO READ IN DTA DIRECTORY DTADI1: JUMPE AC6,DTADI2 ;INPUT ? PUSHJ PDP,RELI ;NO, RESET SYSTEM PUSHJ PDP,RELO MOVE AC0,INIODV ;STORE DTA# FOR INPUT MOVEM AC0,INIIDV PUSHJ PDP,INII ;INIT DTA FOR INPUT DTADI2: PUSHJ PDP,DTADIR ;GET DIRECTORY JUMPN AC6,DTADI3 ;INPUT ? PUSHJ PDP,INII ;YES, INIT INPUT CHANNEL AGAIN SKIPA DTADI3: PUSHJ PDP,INIO ;NO, INIT DTA FOR OUTPUT AGAIN MOVE AC1,PDIRF ;FILENAME-POINTER => AC1 MOVEI AC2,DIRE ;EXT.-POINTER => AC2 POPJ PDP, ;RETURN ;ROUTINE TO DELETE FILE.EXT IN DTA DIRECTORY IN CORE DELDTA: SETZM (AC1) ;CLEAR FILENAME AND EXTENSION SETZB AC0,(AC2) PUSHJ PDP,SAVEAC ;SAVE AC0-AC5 SUBI AC2,DIRE-1 ;FILENUMBER => AC2 MOVE AC1,PDIR ;DIR. BLOCK NUMBER POINTER => AC1 DELDT1: CAMN AC1,PEODB ;THROUGH ? JRST DELDT2 ;YES ILDB AC3,AC1 ;GET BLOCK NUMBER CAMN AC3,AC2 ;= FILENUMBER ? DPB AC0,AC1 ;YES, CLEAR BLOCKNUMBER JRST DELDT1 ;NO, GO ON DELDT2: PUSHJ PDP,RESTAC ;RESTORE AC0-AC5 POPJ PDP, ;RETURN ;ROUTINE TO WRITE DIRECTORY ON DTA DTDIOU: USETO OCH,144 ;OUTPUT ON BLOCK 100. MOVNI AC1,200 ;COUNTER => AC1 HRLZS AC1 HRRZ AC2,OBUF ;ADDR. OF OUTPUT-BUFFER+2 => AC2 AOJ AC2, DTDIO1: MOVE AC0,DIR(AC1) ;DIRECTORY WORD => AC0 MOVEM AC0,(AC2) ;STORE IT INTO OUTPUT-BUFFER AOJ AC2, ;INCREMENT POINTERS AOBJN AC1,DTDIO1 ;DONE ? HRRZS OBUF ;RESET USE BIT SETZM OBUF+2 ;YES, CLEAR BYTE-COUNTER SETZM OBUF+1 ; AND BYTE POINTER OUT OCH, ;WRITE IT OUT POPJ PDP, ;RETURN JRST ERROUT ;ERROR PAGE ;ROUTINE TO GENERATE THE DIRECTORY OF A MTA FROM THE FILE-HEADERS ; STORES IT IN CORE AND WRITE IT ON TAPE . GENER: MOVEI AC3,ODEV ;OUTPUTDEVICE NAME => AC3 PUSHJ PDP,DEVCHE ;CHECK FOR OUTPUT DEVICE JRST ERRDSW ;NO MTA, ERROR JRST ERRDSW ;NO MTA, ERROR MTAPE OCH,1 ;REWIND TAPE HRL AC4,AC1 ;CLEAR DIRECTORY HRR AC4,AC1 HRRZ AC5,AC1 AOJ AC4, ADDI AC5,DIRLEN-1 SETZM (AC1) BLT AC4,(AC5) MOVEI AC4,1 ;SET FILEPOSITION = 1 MOVEM AC4,(AC3) MOVE AC4,INIODV MOVEM AC4,INIIDV MTAPE OCH,0 ;WAIT FOR REWIND PUSHJ PDP,RESYS ;RESET SYSTEM PUSHJ PDP,INII ;INIT MTA FOR INPUT PUSHJ PDP,INP ;GET 1ST WORD OF MTA DIRECTORY JRST ERRDI ;ERROR CAME AC0,MDIR1W ;MTA WITH DIRECTORY ? JRST ERRDI ;NO, ERROR MOVEM AC0,(AC1) ;YES, STORE IT IN CORE AOBJN AC1,.+1 ;INCREMENT POINTER CLOSE ICH, ;CLOSE INPUT MTAPE ICH,16 ;SKIP EOF MTAPE ICH,0 ;WAIT GEN1: PUSHJ PDP,INP ;GET 1ST WORD OF FILE HEADER JRST GEN2 ;EOF, = LOGICAL END OF TAPE MOVEM AC0,(AC1) ;STORE IT PUSHJ PDP,INP ;GET FILENAME JRST ERRIN ;ERROR MOVEM AC0,MDIRFN(AC1) ;STORE IT PUSHJ PDP,INP ;GET EXTENSION JRST ERRIN ;ERROR MOVEM AC0,MDIRFN+MDIRFN(AC1) ;STORE IT CLOSE ICH, ;CLOSE INPUT MTAPE ICH,16 ;SKIP FORWARD 2 FILES MTAPE ICH,0 ;WAIT AOBJN AC1,GEN1 ;DIRECTORY FILLED ? GEN2: MTAPE ICH,1 ;YES, REWIND TAPE MTAPE ICH,0 ;WAIT PUSHJ PDP,RESYS ;RESET SYSTEM PUSHJ PDP,INIO ;INIT OUTPUT AGAIN MOVNI AC1,DIRLEN ;DIR.-POINTER => AC1 HRLS AC1 HRRI AC1,2(AC3) JRST REWOU2 ;WRITE DIRECTORY ON TAPE PAGE ;ROUTINE TO CHECK IF DEVICE-NAME FOR MAGTAPE IS LEGAL ; STORE THEN MAGTAPE-NUMBER+1 INTO AC1 ; AC0/ <0,,LEFT HAND HALF OF DEVICE-NAME> ; AC1/ <0,,RIGHT HAND HALF OF DEVICE-NAME (MTA-NUMBER)> COMMTA: CAIE 0,556441 ;NAME LEGAL (SIXBIT/MTA/) ? JRST ERRMTA ;NO, ERROR TRNE AC1,7777 ;MAYBE, MTA-NO 0-7 ? JRST ERRMTA ;NO, ERROR CAIL AC1,200000 CAIL AC1,300000 JRST ERRMTA ;NO, ERROR LSH AC1,-^D12 ;YES, GET NUMBER+1 INTO AC1 SUBI AC1,17 POPJ PDP, ;RETURN ;ROUTINE TO STORE MAGTAPE-NUMBER+1 INTO DIRECTORY-HEADER ; AND TO STORE DIRECTORY-POINTER INTO AC1 ; IF TAPE IS NEW (NO DIRECTORY FOR THIS TAPE IN CORE) SET AC0=-1 ; OTHERWISE AC0=0 ; SET AC3 <= ; AC1/ MTANUM: SETZ 0, ;CLEAR AC0 CAMN AC1,MDIR20 ;DIRECTORY FOR THIS MAGTAPE IN CORE ? JRST MND2A ;YES, DIRECTORY 2 SKIPL MDIR10 JRST MND2 ;MAYBE MOVEM AC1,MDIR10 ;NO, STORE MTA-NO+1 INTO DIR1-HEADER SETO 0, ;MARK THAT DIR IS NOT IN CORE, AC0=-1 MND1: MOVNI AC1,DIRLEN ;GET DIRECTORY1-POINTER INTO AC1 HRLS AC1 HRRI AC1,MDIR1 MOVEI AC3,MFILP1 POPJ PDP, ;RETURN MND2: CAMN AC1,MDIR10 ;DIRECTORY FOR THIS MAGTAPE IN CORE ? JRST MND1 ;YES, DIRECTORY 1 MOVEM AC1,MDIR20 ;NO, STORE MTA-NO+1 INTO DIR2-HEADER SETO AC0, ;MARK THAT DIR IS NOT IN CORE, AC0=-1 MND2A: MOVNI AC1,DIRLEN ;GET DIRECTORY2-POINTER INTO AC1 HRLS AC1 HRRI AC1,MDIR2 MOVEI AC3,MFILP2 POPJ PDP, ;RETURN PAGE ;ROUTINE TO CHECK FOR DEVICE ; INPUT: AC3/ ADDR. OF ODEV OR IDEV(IC) ; 1ST RETURN DEVICE IS NOT A MTA, DTA OR DSK ; 2ND RETURN: AC1 = -1 DEVICE IS A DTA ; AC1 = 0 DEVICE IS A DSK ; 3RD RETURN: DEVICE IS A MTA ; AC0 = -1 DIRECTORY IS NOT IN CORE ; AC0 = 0 DIRECTORY IS IN CORE ; AC1/ <-DIRLEN,,ADDR. OF MDIR1 OR MDIR2> ; AC3/ ADDR. OF MFILP1 OR MFILP2 DEVCHE: MOVE 0,(AC3) ;GET DEVICE-NAME => AC0 HRRZ AC1,0 ;RIGHT HAND HALF OF DEVICE-NAME (MTA-N0) => AC1 CAIL AC1,1 ;MTA WITH DIRECTORY IN CORE ? CAIL AC1,11 JRST DEVC1 ;NO JRST DEVCM ;YES DEVC1: CALL 0,SIXDCH ;GET DEVICE CHARACTERISTICS TLNE 0,1B33 ;DEVICE WITH DIRECTORY ? JRST DEVCD ;YES TLNN 0,1B31 ;NO, MTA ? POPJ PDP, ;NO, 1ST RETURN HLRZ 0,(AC3) ;YES, LEFT HAND HALF OF DEVICE-NAME => AC0 PUSHJ PDP,COMMTA ;CHECK FOR CORRECT NAME, MTA-NO+1 => AC1 MOVEM AC1,(AC3) ;MTA-NO+1 => ODEV OR IDEV(IC) DEVCM: PUSHJ PDP,MTANUM ;STORE MTA-NO+1 INTO DIR.-HEADER, DIR.-POINTER => AC1 AOS (PDP) ;INCREMENT RETURN ADDR. BY 2 FOR 3RD RETURN AOS (PDP) POPJ PDP, ;3RD RETURN DEVCD: AOS (PDP) ;INCREMENT RETURN ADDR. BY 1 FOR 2ND RETURN SETZ AC1, ;CLEAR AC1 TLNN AC0,1B29 ;DTA ? POPJ PDP, ;NO, DSK, 2ND RETURN SETO AC1, ;YES, -1 => AC1 POPJ PDP, ;2ND RETURN PAGE ;INITIALISATION-ROUTINES INIO: MOVE 0,INIODV ;STORE DEVICE-NAME FOR ASCII MODE MOVEM 0,INIO2 PUSHJ PDP,TTYLPT ;DEVICE TTY OR LPT ? INIT OCH,13 ;NO, INIT FOR OUTPUT IN IMAGE-BINARY-MODE INIODV: 0 ;DEVICE-NAME OBUF,,0 JRST NOTAVO ;ERROR, DEVICE NOT AVAILABLE JRST INIO3 INIO1: INIT OCH,0 ;INIT FOR OUTPUT IN ASCII MODE INIO2: 0 ;DEVICE-NAME OBUF,,0 JRST NOTAVO ;ERROR, DEVICE NOT AVAILABLE TRO F,ASCIOU ;SET OUTPUT IN ASCII MODE FLAG = 1 INIO3: MOVE 0,.JBFF ;SAVE .JBFF MOVEM 0,SVJFO OUTBUF OCH,2 ;SET UP A BUFFER-RING OF 2 BUFFERS POPJ PDP, ;RETURN INIOD: INIT OCHD,13 ;INIT FOR OUTPUT-DIRECTORY IN IMAGE-BINARY-MODE INIODD: 0 ;DEVICE-NAME OBUFD,,0 JRST NTAVOD ;ERROR, DEVICE NOT AVAILABLE MOVE 0,.JBFF ;SAVE .JBFF MOVEM 0,SVJFOD OUTBUF OCHD,2 ;SET UP A BUFFER-RING OF 2 BUFFERS POPJ PDP, ;RETURN INII: MOVE 0,INIIDV ;STORE DEVICE-NAME FOR ASCII MODE MOVEM 0,INII2 PUSHJ PDP,TTYLPT ;DEVICE TTY OR LPT ? INIT ICH,13 ;NO, INIT FOR INPUT IN IMAGE-BINARY-MODE INIIDV: 0 ;DEVICE-NAME 0,,IBUF JRST NOTAVI ;ERROR, DEVICE NOT AVAILABLE JRST INII3 INII1: INIT ICH,0 ;INIT FOR INPUT IN ASCII MODE INII2: 0 ;DEVICE-NAME 0,,IBUF JRST NOTAVI ;ERROR, DEVICE NOT AVAILABLE TRO F,ASCIN ;SET INPUT IN ASCII MODE FLAG = 1 INII3: MOVE 0,.JBFF ;SAVE .JBFF MOVEM 0,SVJFI INBUF ICH,2 ;SET UP A BUFFER-RING OF 2 BUFFERS POPJ PDP, ;RETURN INIID: INIT ICHD,13 ;INIT FOR INPUT-DIRECTORY IN IMAGE-BINARY-MODE INIIDD: 0 ;DEVICE-NAME 0,,IBUFD JRST NTAVID ;ERROR, DEVICE NOT AVAILABLE MOVE 0,.JBFF ;SAVE .JBFF MOVEM 0,SVJFID INBUF ICHD,2 ;SET UP A BUFFER-RING OF 2 BUFFERS POPJ PDP, ;RETURN TTYLPT: IFE OLDSW,< CALLI 0,64 ;GET DEVICE-NAME JUMP HLLZS 0 CAMN 0,SIXTTY ;TTY ? JRST TTLP1 ;YES CAME 0,SIXLPT ;NO, LPT ? > IFN OLDSW,< CALL 0,SIXDCH TLNE 0,1B32 JRST TTLP1 TLNN 0,1B21 > POPJ PDP, ;NO, INIT DEVICE IN IMAGE-BINARY-MODE TTLP1: MOVEI 0,5 ;YES, INIT DEVICE IN ASCII-MODE, INCREMENT RETURN-ADDR. ADDM 0,(PDP) POPJ PDP, ;RETURN NOTAVO: MOVE AC1,INIODV ;DEVICE-NAME => AC1 JRST NOTAVL NTAVOD: MOVE AC1,INIODD JRST NOTAVL NOTAVI: MOVE AC1,INIIDV JRST NOTAVL NTAVID: MOVE AC1,INIIDD NOTAVL: TTCALL 3,[ASCIZ/?DEVICE: /] SETZ AC3, MOVNI AC2,6 PUSHJ PDP,SIXASC ;TYPE DEVICE NAME TTCALL 3,[ASCIZ/ NOT AVAILABLE ? /] PUSHJ PDP,RELID PUSHJ PDP,RELOD PUSHJ PDP,RESYS JRST COMRET PAGE ;OUTPUT-ROUTINES FOR CONTENTS OF AC0 OUTP: SOSG OBUF+2 ;DECREMENT BYTE-COUNTER, BUFFER FULL ? JRST OUTPBU ;YES, OUTPUT BUFFER OUTPWR: IDPB 0,OBUF+1 ;NO, STORE CONTENTS OF AC0 INTO OBUF AOS (PDP) ;INCREMENT RETURN-ADDR. POPJ PDP, ;NORMAL RETURN OUTPBU: OUT OCH, ;OUTPUT BUFFER, ERROR ? JRST OUTPWR ;NO, GO ON STATZ OCH,IOEOT ;YES POPJ PDP, ;END OF TAPE, ERROR RETURN JRST ERROUT ;OUTPUT ERROR OUTDIR: SOSG OBUFD+2 ;DIRECTORY OUTPUT,DECREMENT BYTE COUNTER, BUFFER FULL ? JRST OUDIBU ;YES, OUTPUT BUFFER OUDIWR: IDPB 0,OBUFD+1 ;NO, STORE CONTENTS OF AC0 INTO OBUFD AOS (PDP) ;INCREMENT RETURN ADDR. POPJ PDP, ;NORMAL RETURN OUDIBU: OUT OCHD, ;OUTPUT BUFFER, ERROR ? JRST OUDIWR ;NO, GO ON STATZ OCHD,IOEOT ;YES POPJ PDP, ;END OF TAPE, ERROR RETURN JRST ERROUD ;OUTPUT ERROR ENT: 0 ;ENTER 0 0 0 PAGE ;INPUT-ROUTINES, FILL AC0 INP: SOSG IBUF+2 ;DECREMENT BYTE-COUNTER, BUFFER EMPTY ? JRST INPBUF ;YES, GET NEXT BUFFER INPWRD: ILDB 0,IBUF+1 ;NO, GET NEXT WORD INTO AC0 AOS (PDP) ;INCREMENT RETURN ADDR. POPJ PDP, ;NORMAL RETURN INPBUF: IN ICH, ;INPUT BUFFER, ERROR ? JRST INPWRD ;NO, GO ON STATZ ICH,IOEOF ;YES POPJ PDP, ;END OF FILE, ERROR RETURN JRST ERRIN ;INPUT ERROR INDIR: SOSG IBUFD+2 ;DIRECTORY INPUT,DECREMENT BYTE-COUNTER, BUFFER EMPTY ? JRST INDIBU ;YES, GET NEXT BUFFER INDIWR: ILDB 0,IBUFD+1 ;NO, GET NEXT WORD INTO AC0 AOS (PDP) ;INCREMENT RETURN ADDR. POPJ PDP, ;NORMAL RETURN INDIBU: IN ICHD, ;INPUT BUFFER, ERROR ? JRST INDIWR ;NO, GO ON STATZ ICHD,IOEOF ;YES POPJ PDP, ;END OF FILE, ERROR RETURN JRST ERRIND ;INPUT ERROR LOOK: 0 ;LOOKUP 0 0 0 LOOKD: 0 0 0 0 RENA: 0 ;RENAME 0 0 0 PAGE ;RELEASE-ROUTINES RELO: RELEAS OCH, ;RELEASE OUTPUT-CHANNEL MOVE 0,SVJFO ;RESTORE .JBFF MOVEM 0,.JBFF POPJ PDP, ;RETURN RELOD: RELEAS OCHD, ;RELEASE OUTPUT-DIRECTORY-CHANNEL MOVE 0,SVJFOD ;RESTORE .JBFF MOVEM 0,.JBFF POPJ PDP, ;RETURN RELI: RELEAS ICH, ;RELEASE INPUT-CHANNEL MOVE 0,SVJFI ;RESTORE .JBFF MOVEM 0,.JBFF POPJ PDP, ;RETURN RELID: RELEAS ICHD, ;RELEASE INPUT-DIRECTORY-CHANNEL MOVE 0,SVJFID ;RESTORE .JBFF MOVEM 0,.JBFF POPJ PDP, ;RETURN RESYS: CALLI 0 ;RESET SYSTEM WITHOUT CLOSE MOVE AC0,SVJFO ;RESET .JBFF MOVEM AC0,.JBFF POPJ PDP, ;RETURN PAGE ;ROUTINE TO SAVE AC0-AC5 SAVEAC: MOVEM AC0,SAVAC+2 MOVE AC0,BLTSVA BLT AC0,SAVAC+7 MOVE AC0,SAVAC+2 POPJ PDP, ;RETURN ;ROUTINE TO RESTORE AC0-AC5 RESTAC: MOVS AC0,BLTSVA BLT AC0,AC5 MOVE AC0,SAVAC+2 POPJ PDP, ;RETURN BLTSVA: AC1,,SAVAC+3 ;BLT POINTER FOR SAVEAC AND RESTAC ;ROUTINE TO CLEAR MTERR1, MTERR2, MTERR3, MTERR4 SETZMT: SETZM MTERR1 SETZM MTERR2 SETZM MTERR3 SETZM MTERR4 POPJ PDP, PAGE ;ROUTINE TO PRINT OUT CR LF CRLF: MOVEM AC0,SAVAC ;SAVE AC0 MOVEI 0,15 ;CR => AC0 PUSHJ PDP,OUTP ;PRINT IT OUT JRST ERROUT ;ERROR MOVEI 0,12 ;LF => AC0 PUSHJ PDP,OUTP ;PRINT IT OUT JRST ERROUT ;ERROR MOVE AC0,SAVAC ;RESTORE AC0 POPJ PDP, ;RETURN TCRLF: TTCALL 3,[ASCIZ/ /] POPJ PDP, ;RETURN ;ROUTINE TO PRINT OUT TO SPACES TWOSPA: MOVEI AC0," " ;ASCII SPACE => AC0 PUSHJ PDP,OUTP ;PRINT IT OUT JRST ERROUT ;ERROR PUSHJ PDP,OUTP ;PRINT IT OUT AGAIN JRST ERROUT ;ERROR POPJ PDP, ;RETURN ;ROUTINE TO PRINT OUT FILENAME AND EXTENSION ; AC0 DESTROYED ; AC1 FILENAME ; AC2, AC3 DESTOYED ; AC4 EXT,,0 PRFIEX: SETO AC3, ;MARK THAT NO TTCALL MOVNI AC2,6 PUSHJ PDP,SIXASC ;PRINT OUT FILENAME MOVNI AC2,6 SKIPE AC1,AC4 ;EXTENSION ZERO ? HRRI AC1,16 ;NO, PRINT .EXT ROT AC1,-6 PUSHJ PDP,SIXASC ;PRINT OUT EXTENSION PUSHJ PDP,RESTAC ;RESTORE AC0-AC5 POPJ PDP, ;RETURN PAGE ;ROUTINE TO TYPE OUT SIXBIT TEXT FROM AC1 ; AC2/-NUMBER OF SIXBIT BYTES TO BE TYPED ; AC3 = 0 :TTCALL ; = 1 :OUTPUT ; AC0 IS USED SIXASC: SETZ AC0, ;CLEAR AC0 LSHC AC0,6 ;FIRST BYTE => AC0 ADDI AC0,40 ;CONVERT TO ASCII JUMPE AC3,SIXAS1 ;TTCALL ? PUSHJ PDP,OUTP ;NO JRST ERROUT ;ERROR SKIPA ;SKIP ALWAYS SIXAS1: TTCALL 1,AC0 AOJL AC2,SIXASC ;ALL DONE ? POPJ PDP, ;YES, RETURN PAGE ;ROUTINE TO CONVERT CONTENTS OF AC0 TO ASCII AND PRINT IT OUT LISTAS: MOVEM AC1,SAVAC ;SAVE AC1, AC2 MOVEM AC2,SAVAC+1 SETZB AC2,AC1 ;CLEAR AC2 AND AC1 LISTA1: IDIVI AC0,^D10 ;CONVERT CONTENTS OF AC0 TO ASCII DEC. ADDI AC1,60 PUSH PDP,AC1 AOJ AC2, JUMPN AC0,LISTA1 ;DONE ? LISTA2: POP PDP,AC0 ;GET ASCII BLOCK COUNTER PUSHJ PDP,OUTP ;PRINT IT OUT JRST ERROUT SOJG AC2,LISTA2 ;DONE ? MOVE AC1,SAVAC ;RESTORE AC1, AC2 MOVE AC2,SAVAC+1 POPJ PDP, ;RETURN ;ROUTINE TO TYPE OUT CONTENTS OF AC1 IN OCTAL LISTOC: JUMPN AC1,LISOC1 ;AC1 = 0 ? MOVEI AC0,40 ;YES, PRINT " 0" PUSHJ PDP,OUTP JRST ERROUT MOVEI AC0,60 PUSHJ PDP,OUTP JRST ERROUT POPJ PDP, ;RETURN LISOC1: SETZ AC0, ;NO, CLEAR AC0 ROTC AC0,3 ;3 BIT-BYTE => AC0 JUMPE AC0,LISOC1 ;AC0 = 0 ? JRST LISOC3 LISOC2: SETZ AC0, ;CLEAR AC0 ROTC AC0,3 ;3 BIT BYTE => AC0 LISOC3: ADDI AC0,60 ;NO, CONVERT TO ASCII PUSHJ PDP,OUTP ;PRINT IT OUT JRST ERROUT ;ERROR JUMPN AC1,LISOC2 ;DONE ? LISOC4: POPJ PDP, ;YES, RETURN ;ROUTINE TO TYPE OUT ASCIZ TEXT FOUND VIA POINTER IN AC1 LISTTX: ILDB AC0,AC1 ;PRINT OUT TEXT JUMPE AC0,LISTT1 PUSHJ PDP,OUTP JRST ERROUT JRST LISTTX LISTT1: POPJ PDP, ;RETURN PAGE ;ROUTINE TO LIST THE DATE FROM AC0 DATE: PUSHJ PDP,SAVEAC ;SAVE AC0-AC5 MOVE AC1,AC0 ;DATE => AC1 IDIVI AC1,^D31 ;DAY-1 => AC2 AOJ AC2, IDIVI AC2,^D10 ;CONVERT TO ASCII ADDI AC3,60 ADDI AC2,60 MOVE AC0,AC2 ;LIST DAY PUSHJ PDP,OUTP JRST ERROUT ;ERROR MOVE AC0,AC3 PUSHJ PDP,OUTP JRST ERROUT ;ERROR IDIVI AC1,^D12 ;MONTH => AC2 MOVNI AC4,5 ;CHAR. COUNTER => AC4 MOVE AC5,PMONLI ;POINTER TO MONTH-LIST => AC5 DATE1: ILDB AC0,AC5 ;GET ASCII BYTE => AC0 PUSHJ PDP,OUTP ;LIST IT JRST ERROUT ;ERROR AOJL AC4,DATE1 ;DONE ? MOVEI AC0,^D64(AC1) ;YES, YEAR-1900 => AC0 PUSHJ PDP,LISTAS ;LIST IT PUSHJ PDP,RESTAC ;RESTORE AC0-AC5 POPJ PDP, ;RETURN PAGE ;ROUTINE TO TYPE OUT TIME FROM AC0 TIME: MOVEM AC1,SAVAC ;SAVE AC1 AND AC2 MOVEM AC2,SAVAC+1 IDIVI AC0,^D60000 TIME1: IDIVI AC0,^D60 ;HOURS => AC0 MOVE AC2,AC1 ;MIN => AC2 IDIVI AC0,^D10 ;CONVERT HOURS => ASCII ADDI AC0,60 ADDI AC1,60 PUSHJ PDP,OUTP ;PRINT IT OUT JRST ERROUT ;ERROR MOVE AC0,AC1 PUSHJ PDP,OUTP JRST ERROUT ;ERROR MOVEI AC0,":" ;PRINT ":" PUSHJ PDP,OUTP JRST ERROUT ;ERROR MOVE AC0,AC2 IDIVI AC0,^D10 ;CONVERT MIN => ASCII ADDI AC0,60 ADDI AC1,60 PUSHJ PDP,OUTP ;PRINT IT OUT JRST ERROUT ;ERROR MOVE AC0,AC1 PUSHJ PDP,OUTP JRST ERROUT ;ERROR MOVE AC1,SAVAC ;RESTORE AC'S MOVE AC2,SAVAC+1 POPJ PDP, ;RETURN PAGE ;ERROR TEXT COMERR: ASCIZ/?COMMAND ERROR. / ERRQAS: PUSHJ PDP,ERRC TTCALL 3,[ASCIZ/"*" AND "?" DON'T MATCH/] JRST ERRCOM ERRQLA: PUSHJ PDP,ERRC TTCALL 3,[ASCIZ/"?" ONLY FOR INPUT/] JRST ERRCOM ERRQDE: PUSHJ PDP,ERRC TTCALL 3,[ASCIZ/"?" WITHIN DEVICE NAME/] JRST ERRCOM ERRASN: PUSHJ PDP,ERRC TTCALL 3,[ASCIZ/* WITHIN NAME/] JRST ERRCOM ERRSIX: PUSHJ PDP,ERRC TTCALL 3,[ASCIZ/MORE THAN 6 CHARS. FOR A NAME/] JRST ERRCOM ERRILC: PUSHJ PDP,ERRC TTCALL 3,[ASCIZ/ILLEGAL CHAR./] JRST ERRCOM ERRSLA: PUSHJ PDP,ERRC TTCALL 3,[ASCIZ/ONLY ONE SWITCH ALLOWED/] JRST ERRCOM ERRSWI: PUSHJ PDP,ERRC TTCALL 3,[ASCIZ/ILLEGAL SWITCH/] JRST ERRCOM ERRLAR: PUSHJ PDP,ERRC CALL 3,[ASCIZ/ONLY ONE _ ALLOWED/] JRST ERRCOM ERRTHR: PUSHJ PDP,ERRC TTCALL 3,[ASCIZ/MORE THAN 3 CHARS. FOR EXT./] JRST ERRCOM ERRCOL: PUSHJ PDP,ERRC TTCALL 3,[ASCIZ/ONLY ONE : FOR ONE DEVICE/] JRST ERRCOM ERRASD: PUSHJ PDP,ERRC TTCALL 3,[ASCIZ/* WITHIN DEVICE-NAME/] JRST ERRCOM ERRIC: PUSHJ PDP,ERRC TTCALL 3,[ASCIZ/ONLY /] TTCALL 3,ICMASC TTCALL 3,[ASCIZ/ INPUT-FILES ALLOWED/] JRST ERRCOM ICMASC: 0 ERRFIL: PUSHJ PDP,ERRC TTCALL 3,[ASCIZ/. WITHIN EXT./] JRST ERRCOM ERRAST: PUSHJ PDP,ERRC TTCALL 3,[ASCIZ/ONLY ONE * FOR FILENAME OR EXT. ALLOWED/] JRST ERRCOM ERRCR: PUSHJ PDP,ERRC TTCALL 3,[ASCIZ/CR WITHOUT LINE-FEED/] JRST ERRCOM ERRCMA: PUSHJ PDP,ERRC TTCALL 3,[ASCIZ/NO _ OR , ON LEFT SIDE/] JRST ERRCOM ERRODV: PUSHJ PDP,ERRC ;OUTPUT DEVICE CAN'T DO OUTPUT PUSHJ PDP,ODTYP ;TYPE OUTPUT DEVICE NAME TTCALL 3,[ASCIZ/ CAN'T DO OUTPUT/] JRST ERR2 ERRIDV: SETZ AC5, ;MARK THAT INPUT CHANNEL ICH SKIPE AC1,MTERR ;MTA FOR OUTPUT ? PUSHJ PDP,MTAERR ;YES, DELETE FILE PUSHJ PDP,ERRC ;NO, TYPE COMMAND ERROR AND CLEAR ^O PUSHJ PDP,IDTYP ;TYPE OUT INPUT-DEVICE-NAME TTCALL 3,[ASCIZ/ CAN'T DO INPUT/] JRST ERR2 IDTYP: MOVE AC1,INIIDV ;TYPE INPUT DEVICE-NAME FROM ICH SKIPE AC5 MOVE AC1,INIIDD ;DEVICE-NAME FROM ICHD MOVNI AC2,6 SETZ AC3, PUSHJ PDP,SIXASC POPJ PDP, ;RETURN EREOT1: SETZM -MDIRFN-MDIRFN(AC1) ;END OF TAPE, CLEAR WRITTEN NAMES IN DIR. EREOT2: SETZM -MDIRFN(AC1) EREOT3: SETZM (AC1) SETOM MTERR4 ;MARK THAT EOT PUSHJ PDP,EREOT4 JRST ERR2 ERREOT: MTAPE OCH,17 ;SKIP BACK ONE FILE EREOT4: PUSHJ PDP,EOT SKIPN MTERR4 ;EOT ? POPJ PDP, ;NO PUSHJ PDP,ERR1 ;YES, TYPE MTA# PUSHJ PDP,ODTYP TTCALL 3,[ASCIZ/ END OF TAPE, TAPE FULL/] POPJ PDP, ;RETURN EOT: MTAPE OCH,17 ;DELETE FILE ON TAPE MOVEI AC1,MFILP2 ;RESET FILEPOSITION POINTER TRNE F,MOD1 MOVEI AC1,MFILP1 MTAPE OCH,0 SOS (AC1) SOS (AC1) SETZM MTERR ;CLEAR MTERR CLOSE OCH, STATZ OCH,740000+IOEOT ;ERROR ? JRST ERROUT ;YES POPJ PDP, ;NO, RETURN ERRLOO: SKIPE AC1,MTERR ;MTA FOR OUTPUT ? PUSHJ PDP,MTAERR ;YES, DELETE FILE PUSHJ PDP,ERR1 ;NO, FILENAME NOT FOUND PUSHJ PDP,IFITYP ;TYPE OUT FILE.EXT TTCALL 3,[ASCIZ/ NOT FOUND/] ERLOO1: TTCALL 3,QUEMAR PUSHJ PDP,RESYS PUSHJ PDP,INIO JRST MOREIN ;LOOK FOR MORE INPUT IFITYP: MOVE AC1,IFIL(IC) SETZ AC3, MOVNI AC2,6 PUSHJ PDP,SIXASC ;TYPE OUT FILE.EXT MOVE AC1,IEXT(IC) MOVNI AC2,4 SKIPE AC1 HRRI AC1,"N" ROT AC1,-6 PUSHJ PDP,SIXASC POPJ PDP, ;RETURN ERRPRO: PUSHJ PDP,ERR1 ;FILE IS WRITE-PROTECTED PUSHJ PDP,IFITYP ;TYPE OUT FILE.EXT TTCALL 3,[ASCIZ/ EXISTS ALREADY OR IS WRITE PROTECTED/] JRST ERLOO1 ERROUD: SETO AC5, ;MARK THAT DIRECTORY OUTPUT CHANNEL OCHD SKIPA ERROUT: SETZ AC5, ;MARK THAT OUTPUT CHANNEL OCH SKIPE AC1,MTERR ;MTA FOR OUTPUT ? PUSHJ PDP,MTAERR ;YES, DELETE FILE SKIPE MTERR4 ;NO, EOT ? JRST ERR2 ;YES PUSHJ PDP,ERR1 ;NO PUSHJ PDP,ODTYP ;TYPE OUT OUTPUT DEVICE NAME TTCALL 3,[ASCIZ/ OUTPUT ERROR/] TRZ F,MIN ;CLEAR MAGTAPE FOR INPUT FLAG JUMPE AC5,ERROU1 ;OCHD ? GETSTS OCHD,AC1 ;YES, GET STATUS OF OCHD => AC1 JRST ERRIO ERROU1: GETSTS OCH,AC1 ;NO, GET STATUS OF OCH => AC1 JRST ERRIO ERRIND: SETO AC5, ;MARK THAT DIRECTORY INPUT CHANNEL ICHD SKIPA ERRIN: SETZ AC5, ;MARK THAT INPUT CHANNEL ICH SKIPE AC1,MTERR ;MTA FOR OUTPUT ? PUSHJ PDP,MTAERR ;YES, DELETE FILE PUSHJ PDP,ERR1 ;NO, INPUT ERROR PUSHJ PDP,IDTYP ;TYPE OUT INPUT DEVICE NAME TTCALL 3,[ASCIZ/ INPUT ERROR/] TRZ F,MOUT ;ZERO MTA FOR OUTPUT FLAG JUMPE AC5,ERRIN1 ;ICHD ? GETSTS ICHD,AC1 ;YES, GET STATUS OF ICHD => AC1 JRST ERRIO ERRIN1: GETSTS ICH,AC1 ;NO, GET STATUS OF ICH => AC1 ERRIO: SETZ AC4, ;CLEAR TEXT POINTER TRNE AC1,IOIMPM ;IMPROPER MODE ? JRST ERRIO1 ;YES MOVEI AC4,2 ;NO, SET TEXT POINTER AC4 = 2 TRNE AC1,IODERR ;HARDWARE ERROR ? JRST ERRIO2 ;YES AOJ AC4, ;NO, SET TEXT POINTER AC4 = 3 TRNE AC1,IODTER ;CHECKSUM OR PARITY ERROR ? JRST ERRIO2 ;YES AOJ AC4, ;NO, SET TEXT POINTER AC4 = 4 TRNN AC1,IOBKTL ;BLCK TOO LARGE OR DTA FULL ? AOJA AC4,ERRIO2 ;NO, SET TEXT POINTER AC4 = 5 JRST ERRIO2 ;YES ERRIO1: TRNE F,MOUT ;MTA FOR OUTPUT ? AOJA AC4,ERRIO2 ;YES, SET TEXT POINTER AC4 = 1 TRNE F,MIN ;NO, MTA FOR INPUT ? AOJ AC4, ;YES, SET TEXT POINTER AC4 = 1 ERRIO2: MOVE AC1,IOERTX(AC4) ;NO, ADDR. OF ERROR TEXT => AC1 CAIE AC4,5 ;AC4 = 5 ? TTCALL 3,(AC1) ;NO, LIST ERROR TEXT JRST ERR2 ;YES, DON'T LIST ANY MORE ERRMFU: PUSHJ PDP,ERR1 ;MTA DIRECTORY FULL PUSHJ PDP,ODTYP ;TYPE OUT OUTPUT DEVICE NAME TTCALL 3,[ASCIZ/ TAPE DIRECTORY FULL/] JRST ERR2 ERRFIP: PUSHJ PDP,ERR1 ;FILEPOSITION ERROR MTAPE OCH,1 ;REWIND TAPE MOVEI AC1,1 ;SET FILEPOSITION = 1 MOVEM AC1,(AC4) PUSHJ PDP,ODTYP ;TYPE OUTPUT-DEVICE NAME TTCALL 3,[ASCIZ/ FILE POSITION ERROR, TAPE REWINDED, TRY AGAIN/] MTAPE OCH,0 ;WAIT FOR REWIND JRST ERR2 ODTYP: MOVE AC1,INIODV MOVNI AC2,6 SETZ AC3, PUSHJ PDP,SIXASC ;TYPE OUT MTA # POPJ PDP, ;RETURN ERRMM: PUSHJ PDP,ERRC ;SAME MTA FOR IO TTCALL 3,[ASCIZ/DON'T USE SAME MTA FOR IN-AND OUTPUT SIMULT./] JRST ERR2 ERRDID: SETO AC5, ;MARK THAT INPUT CHANNEL ICHD SKIPA ERRDIN: SETZ AC5, ;MARK THAT INPUT CHANNEL ICH PUSHJ PDP,ERR1 ;BAD DIRECTORY TTCALL 3,[ASCIZ/? BAD DIRECTORY DEVICE:/] PUSHJ PDP,IDTYP ;TYPE INPUT DEVICE NAME PUSHJ PDP,TCRLF ;TYPE CR LF JRST ERR2 ERRDI: PUSHJ PDP,ERRC ;DEVICE HAS NO DIRECTORY TTCALL 3,[ASCIZ/DEVICE HAS NO DIRECTORY/] JRST ERR2 ERRDSW: PUSHJ PDP,ERRC TTCALL 3,[ASCIZ/DEVICE AND SWITCH DON'T MATCH/] JRST ERR2 ERRMTA: PUSHJ PDP,ERRC TTCALL 3,[ASCIZ/DON'T USE LOGICAL NAME FOR MTA/] JRST ERR2 ERRLTL: PUSHJ PDP,ERRC TTCALL 3,[ASCIZ/DIR. LISTING ONLY ON TTY OR LPT/] JRST ERR2 ERRZFI: PUSHJ PDP,ERRC TTCALL 3,[ASCIZ/INPUT-FILENAME ZERO/] JRST ERLOO1 ERRENT: SKIPE AC1,MTERR ;MTA FOR OUTPUT ? PUSHJ PDP,MTAERR ;YES, DELETE FILE PUSHJ PDP,ERR1 ;NO, DIR. FULL OR WRITE PROT. TRNN F,MIN ;MTA FOR INPUT ? JRST ERENT1 ;NO MOVEI AC1,MFILP2 ;YES, RESET FILEPOSITION TRNE F,MID1 ;DIRECTORY 1 ? MOVEI AC1,MFILP1 ;YES SOS (AC1) ERENT1: PUSHJ PDP,ODTYP ;TYPE OUT OUTPUT DEVICE NAME TTCALL 3,[ASCIZ/: /] MOVNI AC2,6 SETZ AC3, MOVE AC1,ENT PUSHJ PDP,SIXASC ;TYPE OUT OUTPUT DEVICE NAME HLLZ AC1,ENT+1 JUMPE AC1,ERENT2 ;EXTENSION ZERO ? MOVNI AC2,4 ;NO HRRI AC1,"N" ROT AC1,-6 PUSHJ PDP,SIXASC ERENT2: TTCALL 3,[ASCIZ/ DIR. FULL OR WRITE PROTECTION/] JRST ERR2 ERRPR: PUSHJ PDP,ERRC ;ERROR DURING PROTECTION TTCALL 3,[ASCIZ/ILLEGAL PROTECTION/] JRST ERRCOM ERRMIX: SKIPE AC1,MTERR ;MTA FOR OUTPUT ? PUSHJ PDP,MTAERR ;YES, DELETE FILE PUSHJ PDP,ERRC ;NO, MIXED IO-MODES TTCALL 3,[ASCIZ/MIXED IO MODES/] CLOSE OCH, JRST ERR2 ERRNZD: PUSHJ PDP,ERRC ;NO /Z FOR DISK TTCALL 3,[ASCIZ"NO /Z FOR DSK"] JRST ERLOO1 ERRZDI: PUSHJ PDP,ERR1 ;DIRECTORY ZERO TTCALL 3,[ASCIZ/? DIRECTORY ZERO/] JRST ERLOO1 MTAERR: SETZM (AC1) ;DELETE FILE.EXT IN DIR. SETZM -MDIRFN(AC1) SETZM -MDIRFN-MDIRFN(AC1) SETZM MTERR ;CLEAR MTERR SKIPN AC2,MTERR1 ;OLD FILENAME DELETED ? JRST MTAER1 ;NO MOVE AC0,MTERR2 ;YES, STORE FILE.EXT AGAIN MOVEM AC0,-MDIRFN(AC2) MOVE AC0,MTERR3 MOVEM AC0,(AC2) MTAER1: PUSHJ PDP,ERREOT ;DELETE FILE ON TAPE POPJ PDP, ;RETURN ERRCOM: SETZ AC8, ;CLEAR COMMAND INPUT STRING FLAG TLNE F,CRFL ;END OF STRING ? JRST ERR2 ;YES, GO TO START AGAIN TTCALL 0,C ;NO, GET NEXT CHAR. CAIN C,15 ;CR ? JRST ERR3 ;YES CAIN C,12 ;NO, LF ? JRST ERR2 ;YES ERRLOP: TTCALL 0,C ;NO, GET NEXT CHAR. CAIE C,15 ;CR ? JRST ERRLOP ;NO ERR3: TTCALL 0,C ;YES, GET LF ERR2: TTCALL 3,QUEMAR PUSHJ PDP,RESYS ;RESET SYSTEM WITHOUT CLOSE JRST COMRET ;START AGAIN ERR1: TTCALL 5,C ;CLEAR ^O SKIPA SETO AC8, ;MARK THAT A LINE IS READ IN POPJ PDP, ;RETURN ERRC: TTCALL 5,C ;CLEAR ^O SKIPA SETO AC8, ;MARK THAT A LINE IS READ IN TTCALL 3,COMERR ;TYPE COMMAND ERROR POPJ PDP, ;RETURN IOERTX: IMPM ;ADDR. OF IO ERROR TEXT FOR ERRIN, ERROUT IMPMT DERR DTER BKTL ;IO ERROR TEXT IMPM: ASCIZ/, IMPROPER MODE/ IMPMT: ASCIZ/, WRITE LOCK OR ILLEGAL OPERATION/ DERR: ASCIZ/, HARDWARE ERROR/ DTER: ASCIZ/, CHECKSUM OR PARITY ERROR/ BKTL: ASCIZ/, BLOCK TOO LARGE OR DTA FULL/ PAGE MINUIC: -ICMAX+1 ;MINUS MAX. NUMBER OF INPUT FILES P6CB: POINT 6,CB ;CHARACTER-BUFFER-POINTER P6QB: POINT 6,QB ;QUESTION-MARK-BUFFER-POINTER QP: 0 PDIR: POINT 5,DIR ;DECTAPE BLOCK NUMBER POINTER PEODB: 010500,,DIRF-1 ;DECTAPE POINTER AT END OF BLOCK PDIRF: -^D22,,DIRF ;DECTAPE FILENAME POINTER PBLKTX: POINT 7,BLKTXT ;ASCII TEXT POINTERS PMFITX: POINT 7,MFILTX PDSDIR: POINT 7,DSKDIR PDSTXT: POINT 7,DSKTXT PBKTXT: POINT 7,BKTXT PMONLI: POINT 7,MONLST(AC2) MDIR1W: ASCII/MTADI/ PP11: 1,,1 SIXUFD: SIXBIT/UFD/ SIXDCH: SIXBIT/DEVCHR/ SIXDSK: SIXBIT/DSK/ SIXMTA: SIXBIT/MTA/ SIXTTY: SIXBIT/TTY/ SIXLPT: SIXBIT/LPT/ QUEMAR: ASCIZ/ ? / BLKTXT: ASCIZ/. FREE BLOCKS LEFT / MFILTX: ASCIZ/. FREE FILES ON TAPE LEFT / DSKDIR: ASCIZ/DIRECTORY / DSKTXT: ASCIZ/ FILE PROTECTION ACCESS CREATION NAME EXT BLKS DATE TIME DATE MODE / BKTXT: ASCIZ/TOTAL BLOCKS / MONLST: ASCII /-JAN-/ ASCII /-FEB-/ ASCII /-MAR-/ ASCII /-APR-/ ASCII /-MAY-/ ASCII /-JUN-/ ASCII /-JUL-/ ASCII /-AUG-/ ASCII /-SEP-/ ASCII /-OCT-/ ASCII /-NOV-/ ASCII /-DEC-/ SVJFO: 0 ;SAVED .JBFFS SVJFOD: 0 SVJFI: 0 SVJFID: 0 PAGE ODEV: 0 ;OUTPUT DEVICE NAME OFIL: 0 ;OUTPUT FILE NAME OEXT: 0 ;OUTPUT FILE EXTENSION ODATE: 0 ;OUTPUT DATE MTERR: 0 ;ADDR. OF EXT. IN MTA-DIR. FOR ERRORS MTERR1: 0 ;ADDR. OF DELETED EXT. IN MTA-DIR. FOR ERROR MTERR2: 0 ;DELETED FILE IN MTA DIR. FOR ERROR MTERR3: 0 ;DELETED EXT,,CREATION-TIME IN MTA-DIR FOR ERROR MTERR4: 0 ; = 1 IF EOT FOR ERROR DSKBLK: 0 ;TOTAL DISK BLOCKS PROTEC: 0 ;PROTECTION FOR OUTPUT-FILE FIRFIL: 0 ;MARK FOR FIRST FILE FOR OUTPUT = 1 ICSAV: 0 ;INPUT FILE AND DEVICE COUNTER SAVED IDEV: BLOCK ICMAX ;INPUT DEVICE NAMES IFIL: BLOCK ICMAX ;INPUT FILE NAMES IEXT: BLOCK ICMAX ;INPUT EXTENSIONS IFIASW: BLOCK ICMAX ; IEXASN: BLOCK ICMAX ; QFMASK: BLOCK ICMAX ;MASK FOR QUESTION MARK CONSTRUCTION IN FILENAMES QEMASK: BLOCK ICMAX ;MASK FOR QUESTION MARK CONSTRUCTION IN EXTENSION QB: 0 ;QUESTION MARK BUFFER PMD1F: -MDIRFN,,MDIRF1 ;FILENAME POINTER PMDI11: -MDIRFN,,MDIR1+1 ;FILE NUMBER POINTER PMDI12: POINT 7,MDIR1+1 ;FILE NUMBER ASCII POINTER PMDIF1: POINT 6,MDIRF1 ;FILENAME SIXBIT POINTER PMDIE1: POINT 6,MDIRE1 ;EXTENSION SIXBIT POINT MFILP1: 0 ;FILE POSITION MDIR10: 0 ;MTA-NUMBER+1 MDIR1: 0 ;ASCII/MTADI/ BLOCK MDIRFN ;FILE NUMBERS IN ASCII/###.TAB/ MDIRF1: BLOCK MDIRFN ;FILENAMES IN SIXBIT MDIRE1: BLOCK MDIRFN ; PMD2F: -MDIRFN,,MDIRF2 ;SAME FOR DIR2 PMDI21: -MDIRFN,,MDIR2+1 PMDI22: POINT 7,MDIR2+1 PMDIF2: POINT 6,MDIRF2 PMDIE2: POINT 6,MDIRE2 MFILP2: 0 MDIR20: 0 MDIR2: 0 BLOCK MDIRFN MDIRF2: BLOCK MDIRFN MDIRE2: BLOCK MDIRFN DIR: BLOCK ^D83 ;DECTAPE BLOCK NUMBERS DIRF: BLOCK ^D22 ;DECTAPE FILENAMES IN SIXBIT DIRE: BLOCK ^D23 ;DECTAPE OBUF: BLOCK 3 ;OUTPUT AND INPUT BUFFER HEADERS OBUFD: BLOCK 3 IBUF: BLOCK 3 IBUFD: BLOCK 3 SAVAC: BLOCK 20 ;SAVED ACS PDL: BLOCK ^D11 ;PUSH DOWN LIST PAGE END MAFIA