TITLE MTFILE - MAGTAPE FILE HANDLER SUBTTL R. Freedman(First Data)/DMC/J Chan UWO 08 Nov 74 ENTRY MTFILE IFNDEF %%SCNM, VFILE==4 VUPDATE==0 VEDIT==43 ;[43] RNF 6-DEC-74 DATE75 FIXES ;[43] ALSO CHECK FOR DV.TTY SINCE ;[43] DV.M14 DOES NOT PRECLUDE DV.TTY AT FDC ;[42] RNF 08-Nov-74 include AECL edits ;[41] RNF 9-AUG-74 FIX TO USE DEFAULT ;[41] OUTPUT PATH INSTEAD OF [PRJ,PRG] ;[40] RNF 5-AUG-74 DATE75 CHANGES ;[40] DEFAULT PROT IF GETPPN FAILS IS 057 VCUSTOM==8 COMMENT ! [AECL.001] PUT FTELL (FILE NAME OUTPUT) IN RIGHT PLACE [AECL.002] STORE INPUT FILE NAME FOR REPORTING [AECL.003] FIX FLAG FOR 'NOT FIRST FILE' (IE ONE FILE ALREADY CLOSED) [AECL.004] USE PHYSICAL NAMES [AECL.005] IF YOU WANT /ALL MAKE LKWILD DO ALL STRUCTURS [AECL.006] FIX INITIAL SET UP OF REGISTER F [AECL.007] COUNT WORDS IN FILE RATHER THAT USE RIB BECAUSE RIB MAY BE FROM FIRST OF SEVERAL FILES [AECL.008] RECOGNIZE PHYSICAL EOT AS A KNOWN ERROR CONDITION END OF COMMENT ! LOC <.JBVER==137> B2+B11+B17+VEDIT F=0 ;AC DEFINITIONS T= T2=2 T3=3 T4=4 P1= P2= P3= P4=10 CH=11 G=12 H=13 I=14 J=15 P=17 ICHN==1 OCHN==2 XX==0 ;DENOTES BYTE TO BE STORED MAGSIZ==203 ;BUFFER SIZE FOR MTA DSKSIZ==203 ;BUFFER SIZE FOR DSK CSIZE==5 ;CLUSTER SIZE FOR DSK ;MTFILE will ask for buffers for DSK, and as many buffers ;for tape as will fill up the last K of low segment core (at least two). ;LEFT HALF FLAG BITS S.ALL==1 ;GET ALL OCCURRENCES OF FILENAME S.FAST==2 ;FAST DIRECTORY S.G==4 ;GARBAGE COLLECT S.IGN==10 ;IGNORE PPN ON MTFILE TAPE S.LIST==20 ;DIRECTORY S.NORM==40 ;NOT AN MTFILE DEVICE S.TIME==100 ;LONG DIRECTORY S.Q==200 ;ALLOW NUMERIC FILE NAMES S.W==400 ;REWIND S.X==1000 ;ONE-TO-ONE COPY S.Z==2000 ;CLEAR DIRECTORY S.NTFR==4000 ;[AECL.003]SET NOT FIRST CLOSE ON INPUT (PROBLY MERGING FILES) ;RIGHT HALF FLAG BITS F.TTY==1 ;TTY USED FOR IO F.AIN==2 ;INPUT IN ASCII F.AOU==4 ;OUTPUT IN ASCII F.SI==10 ;INPUT SPECIFICATION HAS BEEN SEEN F.SO==20 ;OUTPUT SPECIFICATION HAS BEEN SEEN F.SP==40 ;OUTPUT DEVICE IS SPOOLED (ENTER IS OPTIONAL) F.I==100 ;INPUT MAGTAPE IS A MTFILE DEVICE F.O==200 ;OUTPUT MAGTAPE IS A MTFILE DEVICE F.STAR==400 ;FILE SPECIFICATION INCLUDES WILD CARD F.DI==1000 ;INPUT DEVICE HAS A DIRECTORY F.DO==2000 ;OUTPUT DEVICE HAS A DIRECTORY F.FSTI==4000 ;FIRST BUFFER OF INPUT FILE - LONG HEADER F.FSTO==10000 ;FIRST BUFFER OF OUTPUT FILE - LONG HEADER F.FFLI==20000 ;FIRST INPUT FILE F.ERR==40000 ;INPUT ERROR DURING GARBAGE COLLECTION (PASS 1) F.PRT==100000 ;NON-STANDARD PROTECTION, REMEMBER TO RENAME F.DTI==200000 ;INPUT DEVICE IS A DECTAPE F.NEW==400000 ;NEW STAR-SEARCH BEGUN IFNDEF PURE, IFN PURE,< TWOSEG RELOC 400000> IFE PURE, IFNDEF CHK, IFNDEF SFD, IFNDEF NSPEC, DEFINE SYSGET (TABLE,INDEX,STORE,DEFAULT) < MOVE T,[INDEX,,TABLE] GETTAB T, MOVE T,[DEFAULT] MOVEM T,STORE> SUBTTL COMMAND DECODER MTFILE: TDZA T1,T1 MOVEI T1,1 MOVEM T1,OFFSET RESET MOVEI T,B.DC## ;INPUT BUFFER HEADER MOVEM T,IBLCK+2 MOVE T,[OBUF,,OBUFI] MOVEM T,OBLCK+2 MOVE P,[XWD CLEAR,CLEAR+1] MOVSI F,S.IGN ;[AECL.006]WE WANT S.IGN NOT LEFT HALF OF AC 10 SETZM CLEAR BLT P,CLREND-1 DATE T, MOVEM T,THSDAT SETOM PTHARG ;GET USER'S DEFAULT PATH MOVE T,[PTHLEN,,PTHARG] PATH. T, SETZM PTHARG GETPPN T, MOVEM T,USRPPN ;SAVE USER'S PPN SKIPN PTHARG MOVEM T,PTHDIR SYSGET (16,0,MFDPPN,) SYSGET (16,2,FSFPPN,) SYSGET (16,12,STPROT,057B8);[40] SYSGET (16,13,UFDPRT,775B8) MOVE T,.JBFF## MOVEM T,TTYBF MOVE P,PDP MOVE T1,[3,,[IOWD 1,['MTFILE'] OFFSET,,'MTF' TYPE]] PUSHJ P,.ISCAN## ;INITIALIZE COMMAND SCANNER TYIB: MOVE T,[11,,[IOWD MTSWTL,MTSWTN MTSWTD,,MTSWTM MTSWTP -1 CLANS,,CLFIL AIN,,AOUT 0 0 0]] PUSHJ P,.TSCAN## SKIPN ODEV ;HAS INPUT SPEC BEEN SEEN? PUSHJ P,INITO SKIPN ISPEC1 ;HAS INPUT SPEC BEEN SEEN? JRST TYIB ;NO, COMMAND LIKE "MTA:/W=" TLNE F,S.FAST!S.TIME TLO F,S.LIST PUSHJ P,CONEND TLNN F,S.X PUSHJ P,CLOSEO JRST TYIB CLANS: SETZM ZERB MOVE T,[ZERB,,ZERB+1] BLT T,ZERND SETZM B.DC RELEASE OCHN, RELEASE ICHN, SETZM DEVO SETZM DEVI MOVEI T,ISPEC1 ;SET POINTER FOR + SET MOVEM T,INZR SETZM NXZR HRRZ T,TTYBF MOVEM T,.JBFF ADDI T,DSKSIZ*+MAGSIZ*2 CAMLE T,.JBREL## CORE T, JFCL AND F,[S.ALL!S.IGN!S.Q,,0] ;CLEAR ALL TEMPORARY FLAG BITS POPJ P, CLFIL: TRZE F,F.SO ;OUTPUT SPEC JUST SEEN? PUSHJ P,INITO ;YES, USE IT BEFORE LOCAL SWITCHES GO AWAY TRNE F,F.SI PUSHJ P,CONSET ;GO DO INPUT SPEC SET SKIPE CONFLG ;WAS A + TERMINATOR POPJ P, ;YES SETZM LOCAL MOVE T,[LOCAL,,LOCAL+1] BLT T,LOCEND POPJ P, AIN: SKIPN OSPEC ;HAS AN OUTPUT SPEC BEEN SEEN? JRST NOOUT ;NO, MUST BE AN ERROR TRO F,F.SI ;FLAG INPUT SEEN MOVEI T,ILSPEC SKIPN NXZR MOVE T,INZR ADDB T,NXZR CAIL T,SPECLM JRST ERRTMI MOVEI T2,ILSPEC POPJ P, AOUT: TRO F,F.SO MOVEI T,OSPEC MOVEI T2,OLSPEC POPJ P, ;HERE AFTER AN INPUT SPEC IS FOUND ;CONSET -- SEE IF TERMINATOR IS '+'AND DETERMINE WHEN TO PROCESS ; THE INPUT SPECS CONEND: TLNN F,S.G JRST CONSET ;G SW NOT SET SKIPE NISPEC ;ONLY ONE INPUT MTFILE JRST MULG ;MORE THAN ONE CONSET: AOS NISPEC MOVE T,NXZR MOVE T2,.FXMOD(T) ;CHK TERMINATOR TLNE T2,(FX.TRM) JRST CONST1 ;+ SIGN SEEN SKIPE CONFLG ;WAS A +SET FOUND JRST CONST2 ;YES SETZM NXZR MOVE T,[ISPEC1,,ISPEC] BLT T,ISPEC+ILSPEC-1 MOVEI T,ISPEC1 ;POINT TO ISPEC MOVEM T,XINZR MOVEM T,XNXZR SETZM XCONFG JRST CONST7 ;GO DO THIS SPEC CONST1: AOS CONFLG POPJ P, CONST2: PUSHJ P,CONST1 ;MUST BE LAST SPEC OF A SET MOVE T,INZR CONST3: MOVEM T,XINZR SETOM XCONFG CONST4: AOS XCONFG MOVE T2,XINZR ;FIRST OF A SET MOVSI T3,(FX.NOM) ORB T3,.FXMOD(T) MOVSI T4,(FX.PHY) AND T3,T4 ;/PHYSICAL FOUND IN THE SET ORM T3,.FXMOD(T2) MOVE T3,.FXDEV(T) ADDI T,ILSPEC CAMG T,NXZR CAME T3,.FXDEV(T) JRST CONST5 HRLI T2,-2*.FXLND MOVE T4,T ;SAVE T FOR NEXT TIME THRU CONSTA: MOVE T3,.FXDIR(T4) AOS T4 CAMN T3,.FXDIR(T2) AOBJN T2,CONSTA JUMPGE T2,CONST4 ;HERE PROCESS ONE SET OF INPUT SCANNER SPECS CONST5: SUBI T,ILSPEC ;RESET POINTER MOVEM T,XNXZR HRRI T,ISPEC HRL T,XINZR BLT T,ISPEC+ILSPEC-1 TLNN F,S.Q ;NO FILE NUMBER SKIPN XCONFG ;ONLY ONE SPEC JRST CONST7 ;YES - SKIP FOLLOWING LINES MOVE T,XINZR MOVE T3,.FXMOD(T) MOVE T2,.FXDEV(T) ;CHK IF MTA TLNE T3,(FX.PHY) DEVCHR T2,UU.PHY TLNN T3,(FX.PHY) DEVCHR T2, TLNN T2,(DV.MTA) JRST CONST7 ;NOT A MTA MOVE T2,S.BEG MOVEM T2,XBEG MOVE T3,S.END MOVEM T3,XEND JUMPE T3,CONST6 ;CHK IF S.BEG GR S.END CAMGE T3,T2 JRST ILLBEG CONST6: MOVE T3,.FXNAM(T) ;LOOP TO FIND ID NAM NUMERIC MOVEM T3,NUMCHK ;ADJUST S.BEG AND S.END IF NECESSARY PUSHJ P,CHKNUM ;CHK NAM IS NUMERIC JRST CONSTB ;NO PUSH P,T2 PUSHJ P,GETSPT POP P,T3 MOVEM T3,INUM-1(T2) ;SAVE IT FOR CHKFNM CAMG T3,S.BEG MOVEM T3,S.BEG MOVE T4,S.END JUMPE T4,CONSTB CAML T3,T4 MOVEM T3,S.END CONSTB: ADDI T,ILSPEC CAMG T,XNXZR JRST CONST6 CONST7: PUSHJ P,INITI0 ;PROCESS IT MOVE T,XNXZR ADDI T,ILSPEC CAMG T,NXZR JRST CONST3 SETZM CONFLG SETZM NXZR SETZM ISPEC MOVE T,[ISPEC,,ISPEC+1] BLT T,SPECLM POPJ P, SUBTTL DEVICE INITIALIZATION INITO: SKIPN T,ODEV MOVSI T,'DSK' MOVEM T,ODEV MOVEM T,DEVO MOVE T3,OPROT TLNE T3,(FX.PHY) DEVCHR T,UU.PHY TLNN T3,(FX.PHY) DEVCHR T, MOVEM T,DVCHRO MOVE T2,DEVO ;GET NAME BACK [AECL.004] DEVNAM T2, ;FIND OUT ITS REAL NAME [AECL.004] JFCL ;WE'LL CATCH THIS LATER [AECL.004] MOVEM T2,DEVONM ;SAVE FOR IN=OUT COMPARE [AECL.004] TLNE T,(DV.TTY) ;OUTPUT TO TTY? TRO F,F.TTY ;YES, SUPPRESS INFO OUTPUT ANDI T3,FX.PAR!FX.DEN LSH T3,^L-^L<7B28> TDNN F,[S.LIST+F.TTY];[43] DIRECTORY LISTING? TRNN T,DV.M14 ;[43] NO,IS BINARY ILLEGAL? TROA F,F.AOU ;YES, USE ASCII SKIPA T2,[.IOBIN] MOVEI T2,.IOASC OR T2,T3 MOVE T3,OPROT TLNE T3,(FX.PHY) HRLI T2,(UU.PHS) MOVEM T2,OBLCK OPEN OCHN,OBLCK JSP T2,NOTAVL TLZE F,S.W MTREW. OCHN, SKIPN T2,MTOP JRST NOMTOP MTAPE OCHN,@MTAPES-1(T2) CAIE T2,MTOPB JRST NOMTOP MTWAT. OCHN, STATO OCHN,IO.BOT MTSKF. OCHN, NOMTOP: TLZN F,S.NORM TLNN T,(DV.MTA) SKIPA TRO F,F.O TLNN T,(DV.DIR) TRNE F,F.O TRO F,F.DO ;ENTER'S WILL BE NECESSARY MOVE T2,DEVO ;IS DEVICE SPOOLED? MOVE T4,[DEVTYP T2,] TLNE T3,(FX.PHY) TRO T4,UU.PHY XCT T4 JRST NOTSPL TLNE T2,(TY.SPL) TRO F,F.SP NOTSPL: TLZN F,S.Z ;CLEAR DIRECTORY? JRST INITO3 ;NO TLNE T,(DV.DTA) UTPCLR OCHN, ;CLEAR DECTAPE TLNE T,(DV.DSK) JRST USEPIP ;DON'T CLEAR DISK TRNN F,F.O ;MTFILE TAPE? JRST INITO3 MTREW. OCHN, MOVEI T2,1 MOVEM T2,S.BEG MTWAT. OCHN, MTEOF. OCHN, INITO3: MOVEI T2,OBLCK ;GET BUFFER SIZE DEVSIZ T2, JRST NOOBUF JUMPLE T2,NOOBUF TLNE T,(DV.DSK) ;IS OUTPUT DEVICE A DISK? JRST [OUTBUF OCHN,CSIZE+1 JRST NOOBUF] HRRZ T,.JBREL SUBI T,DSKSIZ* SUB T,.JBFF IDIVI T,(T2) SKIPG T MOVEI T,2 TRNN F,F.O ;FILE OUTPUT DEVICE? AOSA T INBUF OCHN,1 ;YES, INPUT MAY BE NEEDED FOR POSITIONING OUTBUF OCHN,-1(T) NOOBUF: MOVE T2,.JBFF ;SAVE PRESENT LIMIT IN CASE OF HRLM T2,TTYBF ;SEVERAL INPUT DEVICES SKIPN T2,S.BEG ;B SWITCH? POPJ P, ;NO MOVEM T2,RECNUM ;YES, SKIP TO FILE NUMBER GIVEN PJRST SEEKD INITI0: MOVE T,IDEV ;IS THERE A NEW INPUT DEVICE? CAMN T,DEVI JRST INITI2 MOVEM T,DEVI TRZ F,F.AIN!F.I!F.DI!F.DTI MOVE T3,IMOD MOVE T2,T ;GET THE NAME [AECL.004] DEVNAM T2, ;FIND ITS REAL NAME [AECL.004] JFCL ;WE'LL GET THIS LATER [AECL.004] TLNE T3,(FX.PHY) DEVCHR T,UU.PHY TLNN T3,(FX.PHY) DEVCHR T, ;GET ITS CHARACTER TLNN T,(DV.DSK) ;IF DISK, ALWAYS OK [AECL.004] CAME T2,DEVONM ;SEE IF SAME DEVICE? [AECL.004] CAIA ;ALL OK [AECL.004] JRST TTYERR ;OOPS [AECL.004] TLNE T,(DV.TTY) TRO F,F.TTY ;SUPPRESS INFO OUTPUT ANDI T3,FX.PAR!FX.DEN LSH T3,^L-^L<7B28> TRNN F,F.TTY ;[43] TRNN T,DV.M14 ;[43] TROA F,F.AIN SKIPA T2,[.IOBIN] MOVEI T2,.IOASC OR T2,T3 MOVE T3,IMOD TLNE T3,(FX.PHY) HRLI T2,(UU.PHS) MOVEM T2,IBLCK OPEN ICHN,IBLCK JSP T2,NOTAVL TLZN F,S.NORM ;MTFILE-FORMAT INPUT? TLNN T,(DV.MTA) ;MAYBE,IS IT A MAGTAPE? JRST INITI3 ;NO TRO F,F.I JRST INITI1 INITI3: TLNE F,S.G!S.LIST ;LISTING OR GARBAGE COLLECT? JRST ILLIN ;YES,MUST BE MTFILE TAPE INITI1: TLNN T,(DV.DIR) TRNE F,F.I TRO F,F.DI ;LOOKUP'S WILL BE NECESSARY TLNE T,(DV.DTA) TRO F,F.DTI HLRZ T2,TTYBF MOVEM T2,.JBFF MOVEI T2,IBLCK DEVSIZ T2, JRST INITI2 JUMPLE T2,INITI2 HRRZ T,.JBREL SUB T,.JBFF IDIVI T,(T2) SKIPG T MOVEI T,2 INBUF ICHN,(T) INITI2: TLZE F,S.W MTREW. ICHN, SKIPN T,MTOP JRST NIMTOP MTAPE ICHN,@MTAPES-1(T) CAIE T,MTOPB JRST NIMTOP MTWAT. ICHN, STATO ICHN,IO.BOT MTSKF. ICHN, NIMTOP: TLZE F,S.Z JRST CLERR SKIPE T2,S.BEG JRST [PUSHJ P,SEEKDI JRST PROCESS] TLNE F,S.G!S.LIST ;REWIND IF /G OR /L UNLESS /BEG:# MTREW. ICHN, SUBTTL FILE MANAGEMENT PROCESS:MOVEM P1,SAVP1 MOVEM P2,SAVP2 MOVEM P3,SAVP3 MOVEM P4,SAVP4 TLNE F,S.LIST JRST LISTER TLNE F,S.G JRST GC TRNN F,F.FFLI SETZM ASAV TRON F,F.FFLI TRNE F,F.TTY JRST NHEAD OUTSTR [ASCIZ /FILES TRANSFERRED: /] NHEAD: TRO F,F.NEW HLLZ T2,IEXT OR T2,INAM TRNN F,F.DI ;DOES INPUT DEVICE HAVE A DIRECTORY? JUMPE T2,PROC2 ;NO, THEN NULL NAME IS NOT WILD MOVE T3,INAMN ;CHECK FOR "WILD" FILE NAME HRRO T2,IEXT AOSN T3 AOSE T2 TRO F,F.STAR PROC2: JRST LOOKI LOOKOK: TLNE F,S.LIST ;DIRECTORY LISTING? JRST [PUSHJ P,LSTFIL JRST STRCHK] PUSHJ P,FTELL ;TYPE THE NAME OF THE FILE TO BE COPIED [AECL.001] TLNE F,S.X ;ONE-TO-ONE COPY? JRST PROC1 ;YES, ENTER MUST BE PERFORMED MOVE T,ASAV ;[AECL.003]GET IT TLNN F,S.NTFR ;[AECL.003]SEE IF NEED OUTPUT ENTER PROC1: PUSHJ P,ENTO TRNN F,F.I ;FILE INPUT DEVICE? PUSHJ P,INP ;NO, LOOKUP DID NOT INCLUDE AN INPUT PROCG: PUSHJ P,HDRI ;SET UP AOBJN POINTER IN T3 PROC3: SOSG OBUF+2 PUSHJ P,[PUSHJ P,OUP PJRST HDRO] MOVE T2,(T3) IDPB T2,OBUF+1 AOBJN T3,PROC3 PUSHJ P,INP PUSHJ P,HDRI JRST PROC3 SUBTTL FILE MANAGEMENT - LOOKUPS LOOKI: TRNE F,F.I ;INPUT FROM MTFILE DEVICE? JRST SEEKR ;YES, DO MANUAL LOOKUP TRNN F,F.DI JRST SETPPN MOVSI T1,(FX.NOM) ;SUPPRESS "NO SUCH" MESSAGE FROM WILD TLNE F,S.ALL ;/ALL SPECIFIED?[AECL.005] TLO T1,(FX.STR) ;YES, TELL LKWLD TO LOOK EVERYWHERE[AECL.005] ORM T1,IMOD ;BY SETTING /OKNONE ALOOK: MOVE T1,[4,,[XINZR,,XNXZR IBLCK,,ERIB ILSPEC,,RIBLEN 400000,,PFSPEC]] PUSHJ P,.LKWLD## JRST [AOJE T1,ESTAR PUSHJ P,REOPE JRST ALOOKB] ALOOKB: MOVEI T2,FNAMI-1 PUSH T2,ERIB+.RBNAM PUSH T2,ERIB+.RBEXT PUSH T2,ERIB+.RBPRV PUSH T2,ERIB+.RBPPN TRNE F,F.DTI ;INPUT FROM DECTAPE? JRST ALOOKD ;YES LOOKUP ICHN,ERIB JRST FNTFNE PUSHJ P,.CHKTM## JRST ALOOK TRZ F,F.NEW HRRZ T2,ERIB+.RBEXT ;[43] HRRM T2,FNAMI+1 ;[43] MOVE T2,ERIB+.RBPRV MOVEM T2,FNAMI+2 JRST LOOKOK NODIR: MSTIME T3, ;GENERATE CREATION TIME,PROTECTION IDIVI T3,^D1000*^D60 ;MSECS TO MINUTES ASH T3,^D12 DATE T4, LDB T1,[POINT 3,T4,23] ;[43] HI DATE DPB T4,[POINT 12,T3,35] ;[40] LO DATE NODIR2: OR T3,STPROT TRNN F,F.O ;[41] DEFAULT PPN IF TO MTFILE TAPE TDZA T4,T4 ;[41] OTHERWISE LET MONITOR SUPPLY IT MOVE T4,PTHDIR ;[41] POPJ P, SETPPN: MOVEI T2,FNAMI-1 PUSH T2,INAM PUSH T2,IEXT TRNE F,F.STAR ;"WILD" FILE NAME? JRST ILLWI ;NOT ALLOWED ON NON-DIRECTORY DEVICE PUSHJ P,NODIR SKIPN FNAMI ;NULL FILE NAME? TLNN F,S.X ;NOT ALLOWED ON /X COPYING JRST OKFNI M.FAIL ALOOKD: TRNE F,F.NEW ;COULD THIS BE FIRST FILE FOUND? PUSHJ P,REOPE ;IF SO, DTA WAS INITED BY WILD (FOR DIRECTORY) LOOKUP ICHN,FNAMI JRST FNTFND LDB T3,[POINT 3,FNAMI+1,20] ;[40] MOVE T2,FNAMI+2 PUSHJ P,CHKTM JRST ALOOK LDB T1,[POINT 3,FNAMI+1,20] ;[40] LDB T3,[POINT 12,FNAMI+2,35];[40] PUSHJ P,NODIR2 OKFNI: TRZ F,F.NEW DPB T1,[POINT 3,FNAMI+1,20] ;[40] MOVEM T3,FNAMI+2 MOVEM T4,FNAMI+3 SETZM ERIB JRST LOOKOK ESTAR: TRZ F,F.STAR TRNE F,F.NEW ;ANY FILES FOUND? JRST NSUCH ;NO,LOOKUP FAILURE TLNE F,S.LIST PUSHJ P,ELIST POPJ P, CHKTM: LDB T1,[POINT 11,T2,23] ;GET CREATION TIME IMULI T1,^D60000 ;IN MILLISECONDS ANDI T2,RB.CRD DPB T3,[POINT 3,T2,23] ;[40] PUSHJ P,.CNVDT## ;CONVERT TO INTERNAL FORMAT CAMGE T1,ISNC ;TOO OLD? POPJ P, SKIPLE IBFR CAMGE T1,IBFR ;TOO RECENT? AOS (P) POPJ P, REOPE: TRNE F,F.AIN IFE .IOASC,< TDZA T2,T2> IFN .IOASC,< SKIPA T2,[.IOASC]> MOVEI T2,.IOBIN DPB T2,[POINT 4,IBLCK,35] OPEN ICHN,IBLCK JSP T2,NOTAVL POPJ P, ;ROUTINE TO PRINT FILE AND EXTENSION IN FNAMI,FNAMI+1 [AECL.001] FTELL: TRNE F,F.TTY ;TYPE FILE NAME IF TTY AVAILABLE POPJ P, ;RETURN MOVE T2,FNAMI PUSHJ P,QTYPE HLLZ T2,FNAMI+1 JUMPE T2,CROUT ;FINISH WITH PUSHJ P,DOT PUSHJ P,QTYPE PJRST CROUT SUBTTL FILE MANAGEMENT - ENTERS ENTO: TRNN F,F.DO!F.SP ;DOES OUTPUT DEVICE HAVE A DIRECTORY? JRST SPEAK MOVE T2,OPROT MOVEI T4,0 TLNN F,S.X ;ONE-TO-ONE COPY? JRST [MOVS T3,ONAMN AOJN T3,ILLFNO HRLO T3,OEXT TLNN T2,(FX.NUL) AOJN T3,ILLFNO MOVE T3,ONAM MOVEM T3,FNAMO HLLZ T3,OEXT MOVEM T3,FNAMO+1 PUSHJ P,NODIR JRST ENTX] MOVE T3,ONAM ;INPUT NAME REPLACES OUTPUT IF AND T3,ONAMN ;OUTPUT IS WILD OR NULL MOVEM T3,FNAMO MOVE T3,FNAMI ANDCM T3,ONAMN ORM T3,FNAMO HRLZ T3,OEXT AND T3,OEXT MOVEM T3,FNAMO+1 HRLZ T3,OEXT ANDCA T3,FNAMI+1 ORM T3,FNAMO+1 TRNE F,F.O ;OUTPUT TO TAPE? MOVE T4,PTHDIR ;YES, MONITOR WILL NOT SUPPLY DEFAULT MOVE T3,FNAMI+2 ;GET INPUT PROT,MODE,TIME,DATE LDB T1,[POINT 3,FNAMI+1,20] ;[40] ENTX: DPB T1,[POINT 3,FNAMO+1,20] ;[40] MOVEM T3,FNAMO+2 ;STORE PROT,MODE,TIME,DATE TLNE T2,(FX.DIR) ;DIRECTORY SPECIFIED? PUSHJ P,GETPTH ;YES, CHECK IT OUT MOVEM T4,FNAMO+3 TRNE T2,FX.PRO ;PROTECTION SPECIFIED? DPB T2,[POINT 9,FNAMO+2,8] SPEAK: NSPEAK: SKIPE FNAMO ;DO WE HAVE A FILE NAME FOR ENTER? TRNN F,F.DO!F.SP ;YES, CAN THE DEVICE USE IT? POPJ P, ;NO,FORGET THE ENTER TRNE F,F.O ;OUTPUT TO MTFILE DEVICE? JRST EPCHK ;YES, DO MANUAL ENTER LDB T3,[POINT 4,FNAMO+2,12] CAIE T3,14 JRST RNN HLLZ T3,FNAMO+2 TLZ T3,000777 CAIE T3,STPROT ;NON-STANDARD PROTECTION? RNN: TRO F,F.PRT ;YES,REMEMBER TO RENAME MOVE T3,DVCHRO TLNE F,S.X ;ONE-TO-ONE COPY? TLNN T3,(DV.DSK) ;YES, OUTPUT TO DISK? JRST NORIBO ;NO, DON'T ATTEMPT EXTENDED ENTER SKIPN ERIB ;DO WE HAVE A RIB? JRST NORIBO ;NO MOVEI T2,ERIB PUSH T2,FNAMO+3 PUSH T2,FNAMO PUSH T2,FNAMO+1 PUSH T2,FNAMO+2 ENRIB: ENTER OCHN,ERIB JRST [HRRZ T2,ERIB+.RBEXT CAIE T2,ERPOA% JRST FULL+1 MOVE T2,FNAMO+1 MOVEM T2,ERIB+.RBEXT MOVEI T2,0 EXCH T2,ERIB+.RBALC MOVEM T2,ERIB+.RBEST JRST ENRIB] POPJ P, NORIBO: MOVEI T2,7777 TLNE T3,(DV.DTA) ;TO DTA? ANDM T2,FNAMO+2 ;YES, SCRAP PROT, MODE, TIME MOVE T2,FNAMO+1 ENTER OCHN,FNAMO JRST FULL MOVEM T2,FNAMO+1 POPJ P, EPCHK: LDB T2,[POINT 9,STPROT,8] HRLI T2,2 MOVE T3,FNAMO+3 MOVE T4,USRPPN IFN CHK,< MOVEI T,T2 CHKACC T, ;CAN USER WRITE THIS PPN? JRST MANUFD JUMPE T,SEEKW ;YES JRST ENOK MANUFD:> MOVE T2,UFDPRT ;CHKACC WON'T SAY, LET'S FIGURE IT OUT TLNE T2,(2B8) ;CAN PUBLIC CREATE IN UFD? JRST SEEKW ;YES, WHAT A FRIENDLY INSTALLATION! CAMN T4,FSFPPN ;PRIVILEGED PPN CAN CREATE ANYWHERE JRST SEEKW XOR T4,FNAMO+3 TRNN T4,-1 ;IS USER THE OWNER? JRST SEEKW ;YES, HE CAN CREATE TRNN T4,-1 ;IS USER THE SAME PROJECT? TLNE T2,(20B8) ;YES, DOES PROJECT HAVE PRIVILEGE? JRST SEEKW ENOK: M.FAIL GETPTH: MOVE T4,FNAMI+3 ANDCM T4,ODIRM OR T4,ODIRM AND T4,ODIR ;CHANGE [*,X] TO [INPUT,X] TRNN T4,-1 HRR T4,PTHDIR TLNN T4,-1 HLL T4,PTHDIR ;CHANGE [,X] TO [DEFAULT,X] IFN SFD,< MOVEM T4,EDIR PUSH P,T2 MOVEI T2,0 MOVSI T3,-<.FXLND-1> PTHLP: SKIPE T4,ODIR+3(T2) AOJN T4,ILLPO SKIPN T4,ODIR+2(T2) MOVE T4,PTHDIR+1(T3) MOVEM T4,EDIR+1(T3) JUMPE T4,NOPTH ADDI T2,2 AOBJN T3,PTHLP NOPTH: JUMPE T2,T2POPJ TRNE F,F.O JRST ILLPO ;CAN'T SPECIFY PATH TO MTFILE-TAPE SKIPA T4,[EARG] T2POPJ: MOVE T4,EDIR POP P,T2> POPJ P, SUBTTL FILE MANAGEMENT - DATA HDRI: TRNN F,F.I ;MTFILE TAPE OR NORMAL DEVICE? JRST NORMI MOVE T2,B.DC+1 ;MTFILE TAPE HLLZ T3,1(T2) ;LH(HEADER WORD 1)=-DATA WORD COUNT JUMPE T3,CLOSEN ;QUIT IF NULL FILE HRRI T3,2(T2) TRZN F,F.FSTI POPJ P, ADDI T3,4 ;FIRST RECORD HAS BIGGER HEADER HRRZ T4,3(T2) JUMPE T4,CPOPJ ADD T3,6(T2) ;ADD RIBLEN TO DATA OFFSET IF EXTENDED RIB POPJ P, NORMI: MOVN T4,B.DC+2 ;NORMAL DEVICE AOS T3,B.DC+1 ;DATA WORD COUNT FROM MONITOR TRNE F,F.AIN IDIVI T4,5 HRL T3,T4 POPJ P, HDRO: TRNN F,F.O ;MTFILE TAPE OR NORMAL DEVICE? JRST NORMO AOS T,OBUF+1 ;MTFILE TAPE, GENERATE HEADER TRZE F,F.FSTO JRST HDRO1 SOS T2,OBUF+2 ;HEADER (EXCEPT FOR FIRST BLOCK) MOVNS T2 ; -DATA WORD COUNT,,FILE NUMBER HRL T2,NUMSAV MOVSM T2,(T) POPJ P, HDRO1: MOVSI T2,FNAMO ;HEADER (FOR FIRST BLOCK) HRRI T2,1(T) ; -DATA WORD COUNT,,FILE NUMBER BLT T2,4(T) ; FILENAME MOVEI T2,1 ;[40] ;B17+B20+B35 ANDCAM T2,2(T) ;[40] ;RIBFLAG=1 IF RIB IS PRESENT SKIPE ERIB JRST EHDRO ; B8+B12+