TITLE BACKRS -- MODULE TO DO THE WORK FOR BACKUP -- %5(614) SUBTTL FRANK NATOLI/FJN/PFC/KCM/JEF/MEB/CLRH/VLR/CGN/WMG/DC/BPK/MS/BAH/EDS 22-AUG-85 DECVER==5 ;MAJOR VERSION DECMVR==0 ;MINOR VERSION DECEVR==614 ;EDIT NUMBER CUSTVR==0 ;CUSTOMER VERSION ;+ ;.AUTOPARAGRAPH.FLAG INDEX.FLAG CAPITAL.LOWER CASE ;.TITLE ^PROGRAM ^LOGIC ^MANUAL FOR ^^BACKRS\\ ;.SKIP 10.CENTER;^^BACKRS\\ ;.SKIP 1.CENTER;^PROGRAM ^LOGIC ^MANUAL ;.SKIP 1.CENTER;^VERSION 5 ;.SKIP -20.CENTER; HOLD==UFD+.FXLND ;[337] UFD-HOLDING CHANNEL. ;+ ;.AUTOP.LOWER CASE ;.HL1 MACROS ;- ;+ ; PUSHS THE LIST OF LOCATIONS ;ONTO THE STACK. ;- DEFINE SAVE$ (LIST$),< XLIST IRP (LIST$),< PUSH P,LIST$ > LIST > ;+ ; POPS THE LIST OF LOCATIONS FROM THE STACK. ;- DEFINE RSTR$ (LIST$),< XLIST IRP (LIST$),< POP P,LIST$ > LIST > ;+ ; ;+ ; ;+ ; ;+ ;.HL1 OTHER DEFINITIONS ;.UPPER CASE.TS8,16,24 ;-.NOFILL.NOAUTOPARAGRAPH.NOFLAGS.END SELECT IFNDEF PS.RSW, ;INCASE NOT IN UUOSYM YET MTBBKP==M+<200*N> ;SIZE OF BACKUP RECORD ON TAPE MTBFSZ==MTBBKP ;SIZE OF INPUT READ IFN FT$FRS,< ;[335] MTBFRS==24+5*200 ;SIZE OF FRS BLOCK ON TAPE IFG MTBFRS-MTBFSZ, ;[300] **DUPLICATED IN BACKUP** >; END IFN FT$FRS ;[335] NM$TBF==6 ;NUMBER OF TAPE BUFFERS **DUPLICATED IN BACKUP** CP$INC==^D1000 ;CHECKPOINT INCREMENT CP$MRG==*N+10 ;CHECKPOINT MARGIN NRIB==.RBTIM+1 ;NUMBER OF RIB ARGS USED IFN FT$USG,< NRIB==.RBAC8+1 ;READ ACCOUNT STRINGS FROM RIB > NDCH==.DCBSC+1 ;[601] NUMBER OF DSKCHR ARGS USED LN$SYS==5 ;LENGTH OF SYSTEM NAME BLOCK LN$SSN==6 ;LENGTH OF SAVE SET NAME BLOCK **DUPLICATED IN BACKUP** LN$STR==^D36 ;MAX NBR OF STRUCTURES **DUPLICATED IN BACKUP** FX$MBF==.FXLEN+0 ;/MBEFORE **DUPLICATED IN BACKUP** FX$MSN==.FXLEN+1 ;/MSINCE **DUPLICATED IN BACKUP** FX$CNT==.FXLEN+2 ;COUNTS MATCHES **DUPLICATED IN BACKUP** FX$STR==.FXLEN+3 ;STRUCTURE FLAGS **DUPLICATED IN BACKUP** FX$LEN==.FXLEN+4 ;LENGTH OF SCAN BLOCK **DUPLICATED IN BACKUP** ZERO5==0 ;NO ARGS ALLOWED IN LOW ORDER FIVE BITS IO.END==40 ;END OF FILE BIT IN LH OF BUFFER STATUS WORD VR.CUS==7B2 ;CUSTOMER VERSION MASK VR.MAJ==777B11 ;MAJOR VERSION MASK VR.MIN==77B17 ;MINOR VERSION MASK VR.EDT==777777B35 ;EDIT VERSION MASK ;&.PAGE IFN FT$RCV,< IFE NM$TBF-1, < PRINTX ? TAPE ERROR RECOVERY CODE REQUIRES MULTIPLE BUFFERS PASS2 END>> ;+ ;.HL1 FLAG BITS IN AC F ;-.NOFILL.END SELECT FL$IND==1B0 ;INDEPENDENT DISK IO FL$UFD==1B1 ;FIRST FILE USED IN UFD FL$FLP==1B2 ;BUBBLE INVERSION FL$STR==1B3 ;FIRST TIME STRUCTURE USED FL$EF1==1B4 ;FIRST TAPE EOF FL$EF2==1B5 ;SECOND TAPE EOF FL$INI==1B6 ;ENCRIPTION CODE INITIALIZED FL$PAO==1B7 ;PARTIAL ALLOCATION ONLY FL$MAT==1B8 ;FILE SPEC MATCHED FL$EOV==1B9 ;END-OF-VOLUME RECORD BEING SENT FL$SLE==1B10 ;SLE MESSAGE ISSUED FL$D75==1B11 ;MATCH ONLY BECAUSE OF /DATE75 FL$CHK==1B12 ;/CHECK FL$NBF==1B13 ;ISSUED NBF MESSAGE IFN FT$FRS,< ;[335] FL$FRS==1B14 ;DOING FRS CONVERSION >; END IFN FT$FRS ;[335] FL$KIL==1B15 ;ABORT OPERATION FL$TPE==1B16 ;FILE HAD TAPE I/O ERROR FL$PSI==1B17 ;PSI ENABLED FL$INP==1B18 ;INPUT FORCED FL$RCV==1B19 ;RECOVERY CODE FL$END==1B20 ;END TAPE OUTPUT FL$OPN==1B21 ;DISK OUTPUT FILE IS OPEN FL$PRN==1B22 ;PROTECTION RENAME BIT FL$FN==1B23 ;[231] PRINTING FILENAME FLAG FL$EST==1B24 ;[232] .RBEST RENAME FLAG FL$SKP==1B25 ;[232] SKIP .RBEST RENAME KLUDGE FL$DFE==1B26 ;[254] DISK FILE HAD ERROR ON SAVE FL$SV1==1B27 ;[310] TO WRITE BLANK TAPE ON FIRST OUTPUT FL$EPR==1B28 ;[322] IF FL$PRN IS SET BECAUSE OF EOV FL$HUF==1B29 ;[337] UFD PPB IS BEING HELD FL$ABS==1B30 ;[522] ABORT STRUCTURE SINCE /INITIAL NOT FOUND ;& ;+.HL1 /INITIAL BIT MASK DEFINITIONS ;.NOFILL.FLAG CONTROL # ;#END SELECT ;- IB$STR==1 ;[522] LOOKING FOR SPECIFIC /INITIAL FILE STRUCTURE IB$NAM==2 ;[522] LOOKING FOR /INITIAL FILENAME AND EXTENSION IB$UFD==4 ;[522] LOOKING FOR /INITIAL UFD IB$SF1==10 ;[522] LOOKING FOR /INITIAL SFD LEVEL 1 IB$SF2==20 ;[522] LOOKING FOR /INITIAL SFD LEVEL 2 IB$SF3==40 ;[522] LOOKING FOR /INITIAL SFD LEVEL 3 IB$SF4==100 ;[522] LOOKING FOR /INITIAL SFD LEVEL 4 IB$SF5==200 ;[522] LOOKING FOR /INITIAL SFD LEVEL 5 ;&#FLAG CONTROL ;+.HL1 HOME BLOCK WORDS ;.NOFILL.FLAG CONTROL # ;#END SELECT ;- .HMNAM==0 ;SIXBIT HOM .HMCNP==16 ;BP CLUSTER COUNT (E=7) .HMCKP==17 ;BP CHECKSUM (E=7) .HMCLP==20 ;BP CLUSTER ADDRESS (E=7) .HMMFD==46 ;LOGICAL BLOCK NUMBER WITHIN STRUCTURE OF 1ST RIB FOR MFD NHOM==.HMMFD+1 ;NUMBER OF HOME BLOCK WORDS USED ;&#FLAG CONTROL . SUBTTL IMPURE STORAGE ;+ ;.TS8,16,24 ;.CHAPTER IMPURE STORAGE ;-.NOFILL.NOAUTOPARAGRAPH.NOFLAGS.END SELECT TSTBLK:: BLOCK 1 ; FLAG WORD FOR LOWSEG PASSAGE. [344] STOBEG==. ;BEGINNING OF STORAGE USYSNM: BLOCK LN$SYS ;SYSTEM NAME UMONTP: BLOCK 1 ;MONITOR TYPE UMONVR: BLOCK 1 ;MONITOR VERSION MFDPPN: BLOCK 1 ;MFD PPN UAPRSN: BLOCK 1 ;APR SERIAL NUMBER UPHYN: BLOCK 1 ;PHYSICAL DEVICE NAME UMTCHR: BLOCK 1 ;TAPE CHARACTERISTICS REELID: BLOCK 1 ;CURRENT REELID PSIVCT:! ;BASE ADDRESS OF PSI VECTORS PSITTY::BLOCK 4 ;PSI VECTOR FOR TTY PSIMTA::BLOCK 4 ;PSI VECTOR FOR MTA IFN FT$IND,< CMDHMB: BLOCK 2 ; HMBBLK: BLOCK NHOM ;HOME BLOCK CMDRIB: BLOCK 2 ; BLKRIB: BLOCK 200 ;RIB BLOCK >;END IFN FT$IND DSKHDR: BLOCK 3 ;DISK BUFFER HEADER MDATA: BLOCK 1 ;POINTS TO INPUT TAPE DATA AREA XMTABF: BLOCK 1 ;POINTS TO BUFFER TAKEN OUT OF RING ERRCNT: BLOCK 1 ;COUNT OF TAPE ERRORS SUSDF: BLOCK 1 ;SUPERSEDE DISK FILE [206] LSTFOP: BLOCK .FOMAX ;[520] FILOP. BLOCK FOR LISTING FILE IFN FT$FRS,< ;[335] FRSHDR: BLOCK M ;CONVERTED FRS BLOCK HEADER FRSTIM: BLOCK 1 ;LABEL TIME **DON'T CHANGE ORDER** FRSDAT: BLOCK 1 ;LABEL DATE **DON'T CHANGE ORDER** FRSDSD: BLOCK 1 ;LABEL DESTROY DATE **DON'T CHANGE ORDER** FRSSTM: BLOCK 1 ;SAVE SET TIME **DON'T CHANGE ORDER** FRSSDT: BLOCK 1 ;SAVE SET DATE **DON'T CHANGE ORDER** FRSSMD: BLOCK 1 ;SAVE SET MODE **DON'T CHANGE ORDER** FRSSTK: BLOCK 1 ;SAVE SET TRACKS **DON'T CHANGE ORDER** FRSSTR: BLOCK 1 ;STR NAME **DON'T CHANGE ORDER** FRSNAM: BLOCK 1 ;FILE NAME **DON'T CHANGE ORDER** FRSEXT: BLOCK 1 ;EXTENSION **DON'T CHANGE ORDER** FRSPPN: BLOCK 1 ;FRS PPN **DON'T CHANGE ORDER** FRSRDB: BLOCK 1 ;RELATIVE DATA BLOCK **DONT' CHANGE ORDER** FRSSDB: BLOCK 1 ;NBR SDB **DON'T CHANGE ORDER** FRSSIZ: BLOCK 1 ;SIZE LAST BLOCK **DON'T CHANGE ORDER** FRSLVL: BLOCK 1 ;SFD DEPTH **DON'T CHANGE ORDER** FRSHDE==.-1 ;END OF FRS CONVERSION BLOCKS >; END IFN FT$FRS ;[335] HCSTR: BLOCK 1 ;[342] HELD STRUCTURE HCPPN: BLOCK 1 ;[342] HELD PPN CSTR: BLOCK 1 ;STRUCTURE CSTRFL: BLOCK 1 ;STRUCTURE FLAGS ACSTR: BLOCK 1 ;ALIAS STRUCTURE CNAM: BLOCK 1 ;FILE CNAMSW: BLOCK 1 ;[416] FILE NAME SWITCH ACNAM: BLOCK 1 ;ALIAS FILE CEXT: BLOCK 1 ;EXT ACEXT: BLOCK 1 ;ALIAS EXT CBLOCK: BLOCK 1 ;LOGICAL BLOCK ON STRUCTURE CCDATI: BLOCK 1 ;CREATION DATE/TIME CADATI: BLOCK 1 ;ACCESS DATE CMDATI: BLOCK 1 ;MODIFY DATE/TIME CWSIZE: BLOCK 1 ;BLOCK SIZE LSTSTR: BLOCK 1 ;LAST STRUCTURE FOR LIST FILE COMPARISON LSTPTH: BLOCK .FXLND+1;PATH FOR LIST FILE COMPARISON NSEQ: BLOCK 1 ;RELATIVE SEQUENCE NUMBER SAVADR: BLOCK 1 ;ORIGINAL MATCHED FILE SPECIFICATION D75ADR: BLOCK 1 ;DITTO DUE TO /DATE75 SRTDIR: BLOCK 1 ;WHERE TO GO TO SORT DIRECTORIES SRTFIL: BLOCK 1 ;WHERE TO GO TO SORT FILES CHKCNT: BLOCK 1 ;COUNT OF CHECK DIFFERENCES PTHCHK: BLOCK 1 ;CHECKSUM OF ASCIZ FULL PATH BLOCK CURTAP: BLOCK 1 ;[355] CURRENT TAPE NUMBER PRESTR: BLOCK 1 ;LAST STRUCTURE PREPPN: BLOCK 1 ;LAST PPN SAVACS: BLOCK 10 ;PLACE TO SAVE REGISTERS SVCODE: BLOCK 1 ;SEED WORD THSRDB: BLOCK 1 ;RELATIVE DATA BLOCK OF FILE CHKPNT: BLOCK 1 ;CHECKPOINTS BKSCLS: BLOCK 1 ;BLOCKS PER CLUSTER DCHBLK: BLOCK NDCH ;FOR DSKCHR UUO DCHARG: BLOCK 5 ;[503] FOR DSKCHR UUO PRNAME: BLOCK 1 ;[227] RENAME PROTECTION STORAGE EST: BLOCK 1 ;[232] .RBEST STORAGE NRPS: BLOCK 1 ;[240] STORAGE TO INSURE ONE REPETITION WITH / IFN FT$USG,< EXLFIL: BLOCK 200 ;EXTENDED LOOKUPS/ENTERS/RENAMES (200 WORDS FOR /USETI) > EXLUFD: BLOCK NRIB ; .. EXLUF1: BLOCK NRIB ;[530] PRESERVE UFD LOOKUP BLOCK FOR USAGE DSKBLT: BLOCK 1 ;EITHER BLT OR PUSHJ P,COMPAR DSKIO: BLOCK 1 ;EITHER DSKIN OR DSKOUT PTHBLK: BLOCK .FXLND+3;ROOM FOR PATHING UPTBLK: BLOCK .FXLND+3;ROOM FOR PATHING APATH: BLOCK .FXLND+3;ROOM FOR PATHING ADRLST: BLOCK .FXLND ;ADDRESS OF RIBS TAPHLD: BLOCK ;[257] AREA FOR CURRENT TAPE RECORD ;[257] AND ITS STATUS BITS IFN FT$DBG,< ;[323] FSZWDS: BLOCK 1 ;[323] SAVE AREA FOR FILE SIZE IN WORDS >;END IFN FT$DBG ;[323] NWPBLK: BLOCK 1 ;NUMBER OF WORDS/DISK BUFFER NDBPMR: BLOCK 1 ;NUMBER OF DISK BUFFERS/MAGTAPE RECORD NDBLIB: BLOCK 1 ;NUMBER OF DISK BLOCKS LEFT IN THIS DISK BUFFER INIBTS::BLOCK 1 ;[522] BIT MASK FOR /INITIAL FILESPEC SAVBTS: BLOCK 1 ;[522] SAVED COPY OF ABOVE STOEND==.-1 ;END OF STORAGE ;& SUBTTL TAPE FORMAT ;+.AUTOPA.FLAGS.TS8,16,24,32,,,,,,,,,.P0,-1.FILL.LOWER CASE ;.CHAPTER BACKUP TAPE FORMAT ; 2_^35-1) [<.RBSIZ] ;.LE;;END IFN FT$IND MOVE T1,S.TPFG## ; GET FLAG BITS FOR TEST. [347] JUMPN T1,BACKB ; IF = THEN /TPNUM WASN'T SET. [347] SKIPE TSTBLK ; HAVE WE BEEN HERE BEFORE? [344] SKIPN S.MULT## ; MULTI-REEL SET? [344] SKIPA ;[371] NO SO GO ON AS PLANNED. JRST BACKB ; SKIP TAPE NUMBER INITIALIZING [344] MOVEI T1,1 ;[371] INITIALIZE TAPE COUNTER MOVEM T1,S.NTPE## ; STORE ;HERE TO COPY SYSTEM NAME INTO MY CORE AREA BACKB: SETOM TSTBLK ; TURN ALL BITS ON. [344] MOVSI T1,-LN$SYS ; FIVE WORDS MOVX T2,%CNFG0 ; GETTAB WORD LOOP1: MOVE T3,T2 ; GET GETTAB GETTAB T3, ; ACCESS SETZ T3, ; LOSE MOVEM T3,USYSNM(T1) ; STORE ADD T2,[1,,0] ; NEXT WORD AOBJN T1,LOOP1 ; LOOP ;HERE TO COPY VARIOUS OTHER MONITOR WORDS MOVX T1,%CNMNT ;MONITOR TYPE GETTAB T1, ;ACCESS SETZ T1, ;LOSE MOVEM T1,UMONTP ;STORE MOVX T1,%CNDVN ;MONITOR VERSION GETTAB T1, ;ACCESS SETZ T1, ;LOSE MOVEM T1,UMONVR ;STORE IFN FT$RCV,< TXZ T1,VR.WHO!VR.MIN;LEAVE MAJOR VERSION NBR LSH T1,-^D24 ;POSITION CAIL T1,602 ;SEE IF 6.02 OR LATER TXO F,FL$RCV ;YES, CAN USE RECOVERY CODE >;END IFN FT$RCV MOVX T1,%LDMFD ;MFD PPN GETTAB T1, ;ACCESS MOVE T1,[1,,1] ;DEFAULT MOVEM T1,MFDPPN ;STORE MOVX T1,%CNSER ;GET SERIAL NUMBER GETTAB T1, ;ACCESS SETZ T1, ;LOSE MOVEM T1,UAPRSN ;STORE ;HERE TO ESTABLISH BIG BUFFERS MOVE T1,[.STDEF,,T2] ;SET DEFAULT MOVE T2,[2,,.STDSB] ; BIGBUF NUMBER OF BLOCKS MOVEI T3,N ;NUMBER OF DISK BLOCKS IN A MAGTAPE RECORD MOVEI T4,200*N ;NUMBER OF WORDS IF THIS SUCCEEDS SETUUO T1, ;SET PROGRAM DEFAULT MOVEI T4,200 ;SIGH, NO BIG BUFFERS MOVEM T4,NWPBLK ;SAVE NUMBER OF WORDS PER DISK BUFFER IDIVI T4,200 ;NUMBER OF BLOCKS PER DISK BUFFER MOVEM T4,NDBPMR ;SAVE FOR DSKIN ;HERE TO ENABLE PSI IF AVAILABLE MOVX T1,%CNST2 ;SOFTWARE CONFIGURATION GETTAB T1, ;ACCESS SETZ T1, ;LOSE TXNN T1,ST%PSI ;PSISER AVAILABLE? JRST SETSRT ;SKIP FOLLOWING IF NOT TXO F,FL$PSI ;FLAG PSI MOVEI T1,TTYSER ;TTY SERVICE ROUTINE ADDRESS MOVEM T1,PSITTY+.PSVNP;STORE NEW PC IN PSI VECTOR MOVEI T1,MTASER ;MTA SERVICE ROUTINE MOVEM T1,PSIMTA+.PSVNP;STORE NEW PC IN PSI VECTOR MOVX T1,PS.VTO ;DISABLE WITH DEBRK. UUO MOVEM T1,PSITTY+.PSVFL;STORE MOVEM T1,PSIMTA+.PSVFL;STORE MOVEI T1,PSIVCT ;BASE ADDRESS PIINI. T1, ;INITIALIZE PSI JRST SETERR ;ERROR--CLEAR PSI FLAG MOVE T1,[PS.FON!PS.FAC+[EXP <'TTY '>,<,,PS.RID>,0]] PISYS. T1, ;TURN PSI ON FOR TTY JRST SETERR ;FAILED--CLEAR PSI FLAG MOVE T1,[PS.FON!PS.FAC+[EXP F.MTAP,<,,PS.RSW>,0]] PISYS. T1, ;TURN PSI ON FOR MTA JFCL ;MAYBE RUNNING UNDER A PRE-7.03 MONITOR SKIPA ;IN ANY CASE DON'T COUNT THIS AS NO PSI SETERR: TXZ F,FL$PSI ;ERROR--ZILCH PSI FLAG SETSRT: MOVE T1,S.SRTD## ;GET SORT INDEX HRRZ T1,SRTDSP(T1) ;GET ADDRESS TO DISPATCH TO MOVEM T1,SRTDIR ;STORE MOVE T1,S.SRTF## ;GET SORT INDEX HRRZ T1,SRTDSP(T1) ;GET ADDRESS TO DISPATCH TO MOVEM T1,SRTFIL ;STORE MOVEI T1,F.MTAP ;POINT TO TAPE CHANNEL DEVNAM T1, ;GET PHYSICAL UNIT NAME MOVE T1,S.MOPN##+.OPDEV ; (LOGICAL IF UUO FAILS) MOVEM T1,UPHYN ;STORE FOR LATER MOVEI T2,.TFDEN ;INDICATE DENSITY MOVEI T3,F.MTAP ;TAPE CHANNEL MOVE T1,[XWD 2,T2] ;ARG FOR TAPEOP TAPOP. T1, ;READ DENSITY SETZ T1, ;LOSE (NO INFO) DPB T1,[POINTR (UMTCHR, MT.DEN)];STORE MOVEI T2,.TFTRK ;TRACK MOVE T1,[XWD 2,T2] ;RESET ARG TAPOP. T1, ;GET TRACK SETZ T1, ;LOSE DPB T1,[POINTR (UMTCHR, MT.7TR)];STORE TRACK SKIPN UMTCHR ;SEE IF TAPOP. LOST JRST [MOVEI T1,F.MTAP ;CHANNEL MTCHR. T1, ;TRY MTCHR. FOR TAPE CHARACTERISTICS SETZ T1 ;LOSE ANDX T1,MT.DEN!MT.7TR ;CLEAR JUNK MOVEM T1,UMTCHR;SAVE JRST .+1] ;PROCEED PUSHJ P,MTARID ;READ REELID SKIPGE S.OPER## ;IF WRITE OPERATION, PUSHJ P,DUMOUT ; ISSUE DUMMY OUTPUT MOVE T1,S.OPER## ;RETRIEVE FUNCTION PJRST @CMDTBL-1(T1) ;DISPATCH AND RETURN CMDTBL: XWD ZERO5,CHKALL XWD ZERO5,RSTALL XWD ZERO5,SAVALL SRTDSP: EXP CPOPJ,APHSRT,LOCSRT SUBTTL DISK TO TAPE MAIN ROUTINES ;+ ;.CHAPTER DISK TO TAPE MAIN ROUTINES ;- ;+ ; ;HERE TO SETUP THE INITIAL FILESPEC BIT MASK BEFORE THE SAVE SETZB T1,INIBTS ;[522] CLEAR THE WORKING BITS MOVEM T1,SAVBTS ;[522] AND THE SAVED COPY SKIPE S.INIT##+.FXDEV ;[522] ANY DEVICE SPECIFIED? TXO T1,IB$STR ;[522] YES, REMEMBER SKIPN S.INIT##+.FXNAM ;[522] ANY FILENAME SPECIFIED? SKIPE S.INIT##+.FXEXT ;[522] NO, ANY EXTENSION? TXO T1,IB$NAM ;[522] YES, FLAG THAT MOVEI T2,.FXDIR+S.INIT## ;[522] POINT AT THE FIRST DIRECTORY WORD MOVEI T3,6 ;[522] GET THE NUMBER OF DIRECTORY WORDS MOVX T4,IB$UFD ;[522] GET THE FIRST BIT SETINT: SKIPN (T2) ;[522] DIRECTORY SPECIFIED AT THIS LEVEL? JRST SETI01 ;[522] NO, EXIT THIS LOOP TDO T1,T4 ;[522] YES, LITE THE CORRESPONDING BIT ADDI T2,2 ;[522] POINT TO THE NEXT DIRECTORY LEVEL LSH T4,1 ;[522] SHIFT THE BIT FOR THE NEXT LEVEL SOJG T3,SETINT ;[522] LOOP FOR ALL SPECIFIED LEVELS SETI01: MOVEM T1,SAVBTS ;[522] STORE THE INITIAL FILESPEC BITS MOVEM T1,INIBTS ;[522] IN BOTH PLACES. ;HERE TO WRITE BEGINNING-OF-SAVE RECORD ON TAPE MOVEI T1,T$BEG ;INDICATE START OF SAVE SKIPE S.RSUM## ;SEE IF /RESUME JRST [MTBSR. F.MTAP, ;BACKSPACE IN CASE CRASH WROTE MTBSR. F.MTAP, ;JUNK ON TAPE JRST .+2] ;NO T$BEG RECORD IF RESUMING PUSHJ P,GENSAV ;FILL IN REST OF CHARS MOVE P1,S.NGST## ;AOBJN WORD FOR STRUCTURE LIST ;HERE TO SELECT A STRUCTURE GETSTR: SKIPN T1,S.STRS##(P1) ;GET STRUCTURE NAME JRST FINSTR ;NULL--LIST FINISHED MOVSI T2,(1B0) ;START WITH BIT 0 MOVNI T3,(P1) ;SET ARG FOR SHIFTING RIGHT LSH T2,(T3) ;SHIFT TO CORRECT BIT FOR THIS STR SKIPE INIBTS ;[522] ANY /INITIAL SPECIFIER? SKIPN S.INIT+.FXDEV ;ANY INITIAL DEVICE? JRST GETST1 ;NO CAME T1,S.INIT##+.FXDEV;SEE IF EXACT MATCH TDNE T2,S.INIT##+FX$STR;OR IF THIS STR INDICATED BY FLAG SKIPA ;YES JRST NXTSTR ;NO. DROP THIS STRUCTURE MOVX T4,IB$STR ;[522] YES, GET THE DIRECTORY SPECIFIER ANDCAM T4,INIBTS ;[522] CLEAR THE DEPENDENCY GETST1: MOVEM T1,CSTR ;STORE MOVEM T1,DCHBLK ; .. MOVEM T2,CSTRFL ; .. ;HERE TO CHECK IF ANY FILE SPEC ASKS FOR STRUCTURE MOVE SP,S.FRST## ;LOAD ADDRESS OF SPECS CHKSTR: CAME T1,FX$LEN+.FXDEV(SP);CHECK FOR EXACT MATCH TDNE T2,FX$LEN+FX$STR(SP); OR IF THIS STR FLAGGED BY SPEC DEVICE JRST GOTSTR ;OK. USE THIS STRUCTURE ADDI SP,FX$LEN*2 ;NEXT FILE SPEC CAMGE SP,S.LAST## ;SKIP IF DONE JRST CHKSTR ;CONTINUE JRST NXTSTR ;CHECK NEXT STRUCTURE ;HERE IF AT LEAST ONE FILE SPEC NEEDS THIS STRUCTURE GOTSTR: PUSH P,.JBFF## ;SAVE JOBFF PUSH P,.JBREL## ;SAVE JOBREL PUSHJ P,SAVSTR ;SAVE STRUCTURE POP P,T1 ;RESTORE JOBREL PUSHJ P,DRPCOR ;DROP CORE USED FOR THIS STR POP P,.JBFF## ;RESTORE JOBFF MOVE T1,SAVBTS ;[522] GET THE SAVED INITIAL BITS SKIPE INIBTS ;[522] DID WE FIND THE INITIAL FILE? MOVEM T1,INIBTS ;[522] NO, RESET THE SEARCH BITS TXZ F,FL$ABS ;[522] CLEAR STRUCTURE ABORT FLAG TXNE F,FL$KIL ;SEE IF OPERATOR SAID KILL POPJ P, ; YES--QUIT NOW NXTSTR: AOBJN P1,GETSTR ;LOOP FOR ALL STRUCTURES ;HERE TO WRITE END-OF-SAVE RECORD ON TAPE FINSTR: TXO F,FL$END ;WILL FORCE OUTPUT OF ALL BUFFERS MOVEI T1,T$END ;INDICATE END OF SAVE PUSHJ P,GENSAV ;WRITE REST OF RECORDS CLOSE F.MTAP, ;CLOSE CHANNEL SKIPE INIBTS ;[522] DID WE EVER FIND THE /INITIAL FILE? JRST CPOPJ1 ;[522] YES, RETURN TO BACKUP WITH OPERATION DONE SETZM S.INIT## ;[522] CLEAR THE MOVE T1,[S.INIT##,,S.INIT##+1] ;[522] INITIAL BLT T1,S.INIT##+FX$LEN-1 ;[522] FILESPEC JRST CPOPJ1 ;RETURN TO BACKUP WITH OPERATION DONE ;+ ; MOVE T1,[NDCH,,DCHBLK] ;CALL TO DSKCHR UUO DSKCHR T1,UU.PHY ;GET STATUS OF STRUCTURE TDZA T1,T1 ;ASSUME NO SUPER I/O SKIPE T1,DCHBLK+.DCBSC;[601] BLOCKS/SUPERCLUSTER SKIPA ;[601] LDB T1,[POINTR (DCHBLK+.DCUCH,DC.UCC)] ;GET BLOCKS PER CLUSTER MOVEM T1,BKSCLS ;STORE ;HERE TO INITIALIZE ALL STRUCTURE CHANNELS MOVE T1,[EXP UU.PHS+.IODMP] ;DUMP MODE MOVE T2,CSTR ;CURRENT STRUCTURE SETZ T3, ;NO BUFFERS OPEN MFD,T1 ;OPEN CHANNEL FOR MFD JRST DVFAIL ;LOSE OPEN STR,T1 ;OPEN CHANNEL FOR SCREWING AROUND JRST DVFAIL ;LOSE OPEN HOLD,T1 ;[337] OPEN CHANNEL FOR HOLDING ONTO PPB JRST DVFAIL ;[337] LOSE MOVE P1,[-.FXLND,,UFD] ;LEVELS AND CHANNELS OPNCHN: HRLZ T4,P1 ;GET LEVEL LSH T4,5 ;SHIFT TO AC FIELD IOR T4,[OPEN T1] ;FORM OPEN UUO XCT T4 ;OPEN LEVEL JRST DVFAIL ;LOSE AOBJN P1,OPNCHN ;LOOP FOR ALL LEVELS MOVX T1,UU.PHS+UU.LBF+.IOBIN ;LARGE BUFFERS + BUFFERED BINARY MODE MOVE T2,CSTR ;CURRENT STRUCTURE MOVEI T3,DSKHDR ;BUFFER HEADER OPEN FILE,T1 ;OPEN CHANNEL FOR DISK FILE JRST DVFAIL ;LOSE MOVEI T1,NDSKBF ;NBR DISK BUFFERS SKIPE S.FFA## ;SEE IF [1,2] MOVEI T1,OPRNDB ;USE LARGER NBR DISK BUFFERS INBUF FILE,(T1) ;GENERATE DISK BUFFERS IFN FT$IND,< TXNN F,FL$IND ;INDEPENDENT IO? JRST CONT1 ;NO--CONTINUE MOVE T1,[STR_5,,[EXP HMBNBR]] ;ARG FOR SUPER USETI SUSET. T1, ;SET TARGET BLOCK HALT . ;***TEMP*** INPUT STR,CMDHMB ;READ INTO CORE MOVSI T1,'HOM' ;INSURE HOME BLOCK CAME T1,HMBBLK+.HMNAM; .. JRST NOHOME ;TELL HIM IT IS INACCESSABLE MOVE T1,[STR_5,,HMBBLK+.HMMFD] ;ARG FOR SUPER USETI SUSET. T1, ;SET TARGET BLOCK HALT . ;***TEMP*** INPUT STR,CMDRIB ;READ IN RIB >;END IFN FT$IND ;HERE TO READ MFD INTO CORE CONT1: SETZM EXLUFD ;ZERO EXTENDED BLOCK MOVE T1,[EXLUFD,,EXLUFD+1] ; .. BLT T1,EXLUFD+NRIB-1; .. MOVEI T1,NRIB-1 ;SET BLOCK FOR LOOKUP MOVEM T1,EXLUFD+.RBCNT; .. MOVE T1,MFDPPN ; .. MOVEM T1,EXLUFD+.RBPPN; .. MOVEM T1,EXLUFD+.RBNAM; .. MOVSI T1,'UFD' ; .. MOVEM T1,EXLUFD+.RBEXT; .. LOOKUP MFD,EXLUFD ;EXTENDED LOOKUP JRST ELUFD ;LOSE SKIPG T1,EXLUFD+.RBSIZ;HOW BIG IS IT? JRST RLSSTR ;NULL--DROP IT PUSHJ P,UCORE ;GET CORE TO READ MFD SKIPA ;CORE NOT AVAILABLE JRST CONT2 ;CONTINUE WARN$N (CCM,Cannot copy MFD for) MOVE T1,CSTR ;TYPE STR NAME PUSHJ P,SIXOUT ; ... OUTSTR CRLF ; JRST RLSSTR ;DROP THIS STR CONT2: MOVNS T1 ;NEGATE HRL P1,T1 ;PUT NEGATIVE SIZE IN LH P1 SUBI P1,1 ;ADJUST IOWD FOR INPUT CMD SETZ P2, ;ZERO NEXT CMD WORD INPUT MFD,P1 ;TRY TO READ MFD INTO CORE PUSHJ P,@SRTDIR ;SORT IT ;HERE TO SELECT A UFD GETUFD: SKIPE T1,1(P1) ;GET FIRST UFD CAMN T1,MFDPPN ;DO NOT REPEAT MFD JRST NXTUFD ;LOSE HLRZ T2,2(P1) ;GET EXTENSION CAIE T2,'UFD' ;IT HAD BETTER BE UFD JRST NXTUFD ;NOT--FORGET THIS ONE SKIPE INIBTS ;[522] ANY /INITIAL SPECIFIER? SKIPN S.INIT##+.FXDIR ;ANY INITIAL PPN? JRST GETUF1 ;NO CAME T1,S.INIT##+.FXDIR;MATCH? JRST NXTUFD ;NO--DROP PPN MOVX T4,IB$UFD ;[522] YES, GET THE UFD SPECIFIER BIT ANDCAM T4,INIBTS ;[522] CLEAR THE DEPENDENCY GETUF1: MOVEM T1,PTHBLK+.PTPPN;STORE IN PATH BLOCK SETZM PTHBLK+.PTPPN+1 ;ZILCH NEXT WORD ;HERE TO CHECK IF ANY FILE SPEC ASKS FOR THIS UFD ON THIS STRUCTURE MOVE SP,S.FRST## ;GET ADDRESS OF SPECS CHKUFD: MOVE T1,CSTRFL ;GET STRUCTURE FLAG TDNN T1,FX$LEN+FX$STR(SP);CHECK INPUT STR SPEC JRST CHKUF1 ;STR NO GOOD MOVE T3,PTHBLK+.PTPPN;GET CURRENT PPN XOR T3,FX$LEN+.FXDIR(SP) ;GET DIFF AND T3,FX$LEN+.FXDIM(SP) ;ZERO DON'T CARES JUMPE T3,GOTUFD ;BRANCH IF GOOD PPN CHKUF1: ADDI SP,FX$LEN*2 ;NEXT SPEC CAMGE SP,S.LAST## ;SKIP IF DONE JRST CHKUFD ;CHECK NEXT SPEC JRST NXTUFD ;NO ONE WANTS IT ;HERE IF AT LEAST ONE FILE SPEC NEEDS THIS UFD ON THIS STR GOTUFD: MOVEI LVL,0 ;START AT LEVEL ZERO TXZ F,FL$UFD ;UFD USE FLAG PUSH P,.JBFF## ;SAVE JOBFF PUSH P,.JBREL## ;SAVE JOBREL TXZ F,FL$HUF ;[337] TURN OFF UFD-PPB-HELD FLAG PUSHJ P,SAVUFD ;SAVE FILES IFN FT$USG,< SKIPN S.USG## ;USAGE ACCOUNTING WANTED? JRST GOTUF1 ;[413] NO PUSHJ P,USGEND## ;YES, TELL WE ARE AT END OF A UFD RENAME UFD,EXLUF1 ;[530][413] RENAME FOR ACCOUNTING PURPOSES JFCL ;[413] RENAME FAILED > GOTUF1: TXZE F,FL$HUF ;[413] TURN OFF UFD-PPB-HELD. WAS IT HELD? CLOSE HOLD,CL.ACS ;[337] YES - CLOSE THE FILE POP P,T1 ;RESTORE JOBREL PUSHJ P,DRPCOR ;DROP CORE USED FOR THIS UFD POP P,.JBFF## ;RESTORE JOBFF SKIPE INIBTS ;[522] DID WE FIND THE /INITIAL FILE? TXO F,FL$ABS ;[522] ONLY GOT PART OF IT - BLOW THIS STR OFF TXNE F,FL$KIL!FL$ABS ;[522] SEE IF OPERATOR SAID KILL OR ABORT SET JRST RLSSTR ;YES NXTUFD: AOBJN P1,.+1 ;SKIP ONE WORD AOBJN P1,GETUFD ;CHECK NEXT UFD ;HERE TO RELEASE ALL STR CHANNELS RLSSTR: RELEAS FILE, ;DONE RELEAS STR, ; .. RELEAS MFD, ; .. RELEAS HOLD, ;[376][337] .. MOVE T1,[-.FXLND,,UFD] ;LEVELS AND CHANNELS RLSUFD: HRLZ T2,T1 ;GET CHANNEL INTO LH LSH T2,5 ;SHIFT TO AC POSITION TLO T2,() ;FORM RELEASE UUO XCT T2 ;EXECUTE AOBJN T1,RLSUFD ;LOOP FOR ALL POPJ P, ;RETURN ;+ ; IFN FT$USG,< JRST [SKIPN S.USG## ;DOING USAGE ACCOUNTING JRST ELUFD ;NO, JUST REPORT ERROR MOVEI T1,EXLUFD ;POINT TO LOOKUP BLOCK THAT FAILED PUSHJ P,USGNDI## ;FIRST SAY IT IS A NEW DIRECTORY SKIPN LVL ;[530] IS THIS A UFD LOOKUP? PUSHJ P,UFDCOP;[530] YES. SAVE EXLUFD FOR RENAME IN GOTUFD PUSHJ P,USGDIP## ;THEN SAY DIRECTORY PROTECTION FAILURE JRST ELUFD] ;THEN REPORT IT TO THE OPERATOR MOVEI T1,EXLUFD ;POINT TO THE EXTENDED LOOKUP BLOCK SKIPN S.USG## ;[530] WANT USAGE ENTRIES JRST SETFI1 ;[530] NO. PUSHJ P,USGNDI## ;YES, CALL ACCOUNTING PACKAGE SKIPN LVL ;[530] IS THIS A UFD LOOKUP? PUSHJ P,UFDCOP ;[530] YES. SAVE EXLUFD FOR RENAME IN GOTUFD SETFI1: > ;HERE TO SAVE A COPY OF THE UFD RIB FOR LATER USE. ;THE RIB INFO IS WRITTEN ON TAPE IN A T$UFD RECORD AND IS USED WHEN ;IN ORDER TO ENTER A SUBSEQUENT FILE ON TAPE THIS UFD IS NEEDED MOVEI T1,NRIB ;NEED CORE PUSHJ P,UCORE ;GET IT SKIPA ;CORE NOT AVAILBLE JRST CNTUFD ;CONTINUE WARN$N (CCR,Cannot copy UFD/SFD RIB for) UFDERR: MOVEI P1,EXLUFD ;INDICATE WHICH PUSHJ P,GUUO ;TYPE SPEC IFN FT$USG,< MOVEI T1,EXLUFD ;POINT TO LOOKUP BLOCK WE CAN'T COPY SKIPE S.USG## ;DOING USAGE ACCOUNTING PUSHJ P,USGDIP## ;YES, TELL DOWNSTREAM BILLING OF PROBLEM > JRST CLSUF1 ;LOSE CNTUFD: MOVEM P1,ADRLST(LVL) ;STORE FOR LATER REF MOVE T1,P1 ;WHERE TO SAVE IT HRLI T1,EXLUFD ;WHERE IT NOW IS BLT T1,NRIB(P1) ;XFR ;HERE TO READ THE DIRECTORY INTO CORE SKIPG T1,EXLUFD+.RBSIZ;SEE IF SIZABLE JRST CLSUF1 ;DROP IT IF NULL PUSHJ P,UCORE ;EXPAND CORE SKIPA ;CORE NOT AVAILABLE JRST CNTLVL ;CONTINUE WARN$N (CCU,Cannot copy UFD/SFD for) JRST UFDERR ;TAKE COMMON ERROR EXIT CNTLVL: MOVNS T1 ;NEGATE LENGTH HRL P1,T1 ;MAKE DUMP MODE IO COMMAND WORD SUBI P1,1 ;COMPUTE IOWD SETZ P2, ;ZERO NEXT CMD WORD MOVSI T1,UFD(LVL) ;GET CHANNEL IN LH LSH T1,5 ;PUT IN AC FIELD IOR T1,[INPUT P1] ;FORM UUO XCT T1 ;EXEC IT PUSHJ P,@SRTFIL ;SORT IT ;HERE TO SELECT A FILE GETFIL: SKIPN T1,1(P1) ;GET A FILE NAME JRST NXTFIL ;NOT INTERESTED IN NULLS MOVEM T1,CNAM ;STORE SETOM CNAMSW ;[416] STORE SETZM THSRDB ;[421] SET BLOCK SIZE TO ZERO HLRZ T1,2(P1) ;GET EXTENSION CAIE T1,'SFD' ;SFD? JRST NOTSFD ;NO--DO NORMAL HANDLING ;***START OF SFD NESTING HANDLER*** CAIGE LVL,.FXLND-1 ;LEVEL EXCEEDED? AOJA LVL,SAFE1 ;NO--CONTINUE TXON F,FL$SLE ;ISSUE ONCE WARN$ (SLE,SFD level exceeded) JRST NXTFIL ;GET NEXT FILE SAFE1: MOVE T2,LVL ;COPY LEVEL IMULI T2,2 ;MAKE INDEX FOR S.INIT SPEC SKIPN INIBTS ;[524][522] ANY /INITIAL SPECIFIER? JRST SAFE2 ;[524] NO SKIPN T3,S.INIT+.FXDIR(T2) ;ANY INITIAL SFD? JRST NXTFIL ;[524] NO CAME T3,CNAM ;SEE IF MATCH SOJA LVL,NXTFIL ;NO, DROP IT MOVX T4,IB$UFD ;[522] YES, GET THE DIRECTORY SEEN BIT LSH T4,(LVL) ;[522] SHIFT TO THE RIGHT SFD LEVEL ANDCAM T4,INIBTS ;[522] CLEAR THE BIT FOR THIS LEVEL SAFE2: HRLZM T1,CEXT ;SAVE 'SFD' EXTENSION MOVE T2,CNAM ;GET SFD NAME MOVEM T2,PTHBLK+.PTPPN(LVL) ;STORE IN PATH BLOCK SETZM PTHBLK+.PTPPN+1(LVL) ;ZILCH NEXT ENTRY MOVE SP,S.FRST## ;ADDRESS OF SPECS CHKSFD: PUSHJ P,VER1 ;VERIFY STR,UFD,SFD'S JRST CHKSF1 ;NO GOOD--SKIP THIS SPEC PUSH P,.JBFF## ;SAVE C(JOBFF) PUSH P,.JBREL## ;SAVE JOBREL PUSHJ P,SAVUFD ;MATCH--CALL UFD(SFD) HANDLER POP P,T1 ;RESTORE JOBREL PUSHJ P,DRPCOR ;DROP CORE IF SAVINGS OF 2K POP P,.JBFF## ;RESTORE C(JOBFF) SKIPE INIBTS ;[522] DID WE FIND THE /INITIAL FILE? TXO F,FL$ABS ;[522] NO, YES - ABORT THIS STRUCTURE SETZM PTHBLK+.PTPPN(LVL) ;ZERO TXNE F,FL$KIL!FL$ABS ;[522] SEE IF OPERATOR SAID KILL OR ABORT SET SOJA LVL,CLSUF1 ;YES--UNNEST SOJA LVL,NXTFIL ;CONTINUE CHKSF1: ADDI SP,FX$LEN*2 ;UP ADDRESS CAMGE SP,S.LAST## ;SKIP IF DONE JRST CHKSFD ;CHECK NEXT SETZM PTHBLK+.PTPPN(LVL) ;ZERO SOJA LVL,NXTFIL ;CONTINUE ;***END OF SFD NESTING HANDLER*** ;HERE IF THE CURRENT FILE IS NOT AN SFD NOTSFD: SKIPN T4,INIBTS ;[522] LOOKING FOR /INITIAL FILE? JRST SETEXT ;[522] NO, GO AHEAD WITH THIS FILE CAXE T4,IB$NAM ;[522] YES, JUST LOOKING FOR FILENAME? JRST NXTFIL ;[522] NO, DROP THIS FILE HLRZ T3,S.INIT+.FXEXT;GET INITIAL EXTENSION MOVE T2,S.INIT+.FXNAM;[522] GET THE /INITIAL FILENAME CAMN T2,CNAM ;MATCH? CAME T3,T1 ;EXTENSION MUST MATCH TOO JRST NXTFIL ;NO, DROP IT SETZM INIBTS ;[522] YES, NO MORE /INITIAL SPEC SETEXT: HRLZM T1,CEXT ;STORE HRRZ T1,2(P1) ;GET COMPRESSED-FILE-POINTER IMUL T1,BKSCLS ;COMPUTE LOGICAL BLOCK ON STR MOVEM T1,CBLOCK ;STORE TLNE T1,(77774B14) ;MAKE SURE IT FITS IN SUSET. SETZM CBLOCK ;IF NOT, CLEAR ;HERE TO CHECK IF ANY FILE SPEC ASKS FOR THIS FILE MOVE SP,S.FRST## ;ADDRESS OF SPECS SETZ P2, ;FLAG INITIAL READ OF FILE RIB CHKFIL: PUSHJ P,VER1 ;CHECK FILE ID JRST CHKFI1 ;NO GOOD PUSHJ P,VER2 ; .. JRST CHKFI1 ; .. JUMPL P2,CHKSWT ;IF READ & DECODED ALREADY, GO CHECK SWITCHES SKIPN S.USET## ;SKIP IF SHOULD USE SUPER USETIS JRST STNCHK ;NO--USE LOOKUP UUO MOVSI T1,STR_5 ;GET CHANNEL ADD T1,CBLOCK ;GET BLOCK NUMBER SKIPE CBLOCK ;IF SET, SUSET. T1, ;SET TARGET BLOCK JRST STNCHK ;FAILURE IFE FT$USG,< MOVE T1,[IOWD NRIB,EXLFIL] ;MAKE COMMAND WORD > IFN FT$USG,< MOVE T1,[IOWD 200,EXLFIL] ;MAKE COMMAND WORD > SETZ T2, ;ZILCH SECOND COMMAND WORD INPUT STR,T1 ;READ INTO CORE MOVE T1,EXLFIL+.RBPPN;VERIFY RIB BLOCK CAME T1,PTHBLK+.PTPPN; .. JRST STNCHK ; .. MOVE T1,EXLFIL+.RBNAM; .. CAME T1,CNAM ; .. JRST STNCHK ; .. HLLZ T1,EXLFIL+.RBEXT; .. IFE FT$USG,< CAMN T1,CEXT ; .. JRST DECODE ;GO DECODE RIB > IFN FT$USG,< CAME T1,CEXT ; .. JRST STNCHK ; .. MOVE T2,EXLFIL+.RBACT ;GET AOBJN POINTER TO ACCOUNT STRING SETZM EXLFIL+.RBACT ;CLEAR OUT WORDS FOR IT IN RIB MOVE T1,[EXLFIL+.RBACT,,EXLFIL+.RBACT+1] BLT T1,EXLFIL+.RBACT+7 ;CLEAR IT JUMPGE T2,DECODE ;IF NO POINTER, PROCEED, ACCT STR = 0 HLRZ T3,T2 ;[417] GET NEG. WORD LENGTH HRRZ T1,T2 ;[417] GET OFFSET FROM RIB START CAIGE T1,200 ;[417] GREATER THAN MAX. RIB SIZE? CAIGE T3,-10 ;[417] GREATER THAN MAX. ACCT. STRING LENGTH? JRST DECODE ;[417] YES, IGNORE POINTER SETZ T3, ;CLEAR INDEX CHKFI2: MOVE T1,EXLFIL(T2) ;PICK UP WORD OF ACCOUNT STRING MOVEM T1,EXLFIL+.RBACT(T3) ;STORE WHERE LOOKUP WOULD HAVE PUT IT AOS T3 ;BUMP INDEX AOBJN T2,CHKFI2 ;MOVE ALL THE WORDS JRST DECODE ;AND PROCEED > STNCHK: SETZM EXLFIL ;ZERO LOOKUP BLOCK MOVE T1,[EXLFIL,,EXLFIL+1] ; .. BLT T1,EXLFIL+NRIB-1; .. MOVEI T1,NRIB-1 ;LIMIT OF ARGS MOVEM T1,EXLFIL+.RBCNT; .. CAIGE LVL,1 ;SEE IF FILE ACTUALLY IN SFD SKIPA T1,PTHBLK+.PTPPN;IT IS IN UFD. DO NOT SUPPLY PATH ADDR MOVEI T1,PTHBLK ;PPN AND SFD PATH MOVEM T1,EXLFIL+.RBPPN; .. MOVE T1,CNAM ;NAME MOVEM T1,EXLFIL+.RBNAM; .. MOVE T1,CEXT ;EXT MOVEM T1,EXLFIL+.RBEXT; .. LOOKUP STR,EXLFIL ; .. IFE FT$USG,< JRST GOTFIL ;ASSUME FILE IS GOOD > IFN FT$USG,< JRST [MOVEI T1,EXLFIL ;POINT TO FAILING LOOKUP BLOCK SKIPE S.USG## ;DOING USAGE ACCOUNTING PUSHJ P,USGFIP## ;YES, TELL DOWNSTREAM BILLING OF LOOKUP FAILURES JRST GOTFIL] ;AND ASSUME FILE IS GOOD > CLOSE STR,CL.ACS ; .. ;HERE TO CHECK IF FILE SATISFIES USER SWITCH RESTRICTIONS DECODE: IFN FT$USG,< MOVEI T1,EXLFIL ;POINT TO RIB OF FILE SKIPE S.USG## ;WANT DISK SPACE ACCOUNTING PUSHJ P,USGFIL## ;YES, TELL ACCOUNTING PACKAGE OF NEW FILE > MOVEI T1,RP.NFS ;CHECK NO SAVE BIT MOVEI T2,1 ;[241] PRIME THE PUMP FOR NFS CHECK TDNE T1,EXLFIL+.RBSTS;ON? CAMN T2,S.NFS## ;[241] NFS SET? SKIPA ;[241] YES-- CONTINUE WITH FILE JRST NXTFIL ;YES--SKIP THIS ONE MOVE T1,EXLFIL+.RBSIZ;GET FILE SIZE MOVEM T1,CWSIZE ;STORE SETZ T1, ;ZERO ACCESS TIME LDB T2,[POINTR (EXLFIL+.RBEXT,RB.ACD)] ;GET ACCESS DATE PUSHJ P,CONVDT ;CONVERT TO SMITHSONIAN DATE/TIME MOVEM T1,CADATI ;STORE LDB T1,[POINTR (EXLFIL+.RBPRV,RB.CRT)] ;GET CREATION TIME IMULI T1,^D60000 ;CONVERT TO MILLISECONDS LDB T2,[POINTR (EXLFIL+.RBEXT,RB.CRX)] ;GET EXTENSION OF CREATION LSH T2,^D12 ;SHIFT OVER LDB T3,[POINTR (EXLFIL+.RBPRV,RB.CRD)] ;GET BASE CREATION DATE IOR T2,T3 ;UNITE PUSHJ P,CONVDT ;CONVERT TO SMITHSONIAN DATE/TIME MOVEM T1,CCDATI ;STORE MOVE T1,EXLFIL+.RBTIM ;GET INTERNAL DATE/TIME MOVEM T1,CMDATI ;SET FOR CHECKER SETO P2, ;FLAG DECODING DONE CHKSWT: PUSHJ P,CHKLIM ;CHECK LIMITS JRST CHKFI1 ;NO GOOD JRST [TXON F,FL$D75 ;ONLY GOOD BECAUSE DATE75 MOVEM SP,D75ADR; SAVE FOR LATER JRST CHKFI1] ;CONTINUE LOOP, NOT COUNTING MATCH TXON F,FL$MAT ;FLAG FIND MOVEM SP,SAVADR ;SAVE ADDRESS AOS FX$CNT(SP) ;COUNT MATCH CHKFI1: ADDI SP,FX$LEN*2 ;ADVANCE TO NEXT SPEC CAMGE SP,S.LAST## ;SKIP IF DONE JRST CHKFIL ;CHECK NEXT SPEC TXZN F,FL$MAT ;ANY FILE MATCH? JRST [TXZN F,FL$D75 ;NOT MATCH, SEE IF DATE75 WORKS JRST NXTFIL ;NO--JUST IGNORE FILE MOVE SP,D75ADR ;YES--USE DATE75 MATCH JRST GOTFIL] ;AND PROCEED MOVE SP,SAVADR ;YES. RESTORE C(SP) ;HERE IF AT LEAST ONE FILE SPEC NEEDS THIS FILE GOTFIL: SETOM NRPS ;[240] INITIALIZE ONE REPETITION SWITCH GOTFL2: SKIPE S.TYMS## ;[240] SKIP IF TYPE OUT WANTED TXOE F,FL$UFD ;FIRST FILE--ANY PREVIOUS? JRST GOTFL1 ;YES--GO SAVE IT HLRZ T1,PTHBLK+.PTPPN;GET PROJECT PUSHJ P,OCTOUT ;TYPE OUTCHR COMMA ; .. HRRZ T1,PTHBLK+.PTPPN;GET PROGRAMMER PUSHJ P,OCTOUT ;TYPE TXOE F,FL$STR ;SEE IF FIRST TIME FOR STR JRST RECUFD ;NOPE--FORGET THIS OUTCHR TAB ;TAB OVER MOVE T1,CSTR ;GET STR NAME PUSHJ P,SIXOUT ;TYPE IT RECUFD: OUTSTR CRLF ; GOTFL1: PUSHJ P,XALIAS ;DO ALIASING SKIPN S.INTR## ;SEE IF /INTERCHANGE PUSHJ P,WRTUFD ;NO--WRITE T$UFD RECORDS ON TAPE MOVEI T1,2 ;SEE IF FILE NAMES WANTED CAMN T1,S.TYMS## ;SKIP IF NOT PUSHJ P,TYPFIL ;TYPE FILE NAME MOVE T1,S.NTPE## ;[355] SAVE CURRENT TAPE NUMBER MOVEM T1,CURTAP ;[355] PUSHJ P,SAVFIL ;SAVE THE FILE MOVE T1,CURTAP ;[355] GET TAPE NUMBER BACK TXNE F,FL$KIL ;SEE IF OPERATOR SAID KILL JRST CLSUF1 ;YES, STOP NOW CAMN T1,S.NTPE## ;SEE IF TAPE NUMBER CHANGED JRST NXTFIL ;NO, PROCEED TXZ F,FL$UFD ;ZILCH SO PPN WILL BE TYPED SKIPN S.REPT## ;[240] /REPEAT? JRST NXTFIL ;[240] YES--SAVE THIS FILE AGAIN SETZM THSRDB ;[432] Init block for WHAT and routine CONREC AOSG NRPS ;[240] DEFENSE AGAINST ENDLESS REPETITION JRST GOTFL2 ;[240] REPEAT ONLY ONCE NXTFIL: AOBJN P1,.+1 ;ONE WORD AOBJN P1,GETFIL ;TWO ;HERE TO TERMINATE I/O TO THIS UFD CLSUF1: MOVSI T1,UFD(LVL) ;GET CHANNEL IN LH LSH T1,5 ;PUT IN AC FIELD IOR T1,[CLOSE CL.ACS] ;FORM UUO XCT T1 ;EXEC IT SETZM ADRLST(LVL) ;ZILCH IN CASE NO FILE FOUND SKIPN S.LIST## ;SEE IF /LIST, POPJ P, ;NO--RETURN ;AVOID SPAWNING A ZILLION FILES - I.E. ONE/PPN [176] MOVEI T1,F.LIST ;MUST USE CHANNEL 1 [217] DEVTYP T1, ; GET DEVICE TYPE BITS [176] JRST CLSUF2 ; ERROR RET - IGNORE [176] JUMPE T1,CLSUF2 ; NOT A DEVICE OR NOT INITED [176] LDB T1,[POINT 6,T1,35]; GET DEVICE TYPE [176] CAIN T1,.TYLPT ; IS IT A LPT? [176] POPJ P, ; YES, AVOID PRESERVE CODE [176] ;HERE TO PRESERVE LISTING FILE IN CASE OF SYSTEM CRASH CLSUF2: HRLI T1,F.LIST ;[520] CHANNEL NUMBER OF LISTING FILE HRRI T1,.FOURB ;[520] CHECKPOINT FUNCTION MOVEM T1,LSTFOP+.FOFNC;[520] FIRST WORD OF FILOP BLOCK MOVEI T1,S.LENT## ;[520] LOOKUP/ENTER BLOCK ADDRESS MOVEM T1,LSTFOP+.FOLEB;[520] MOVE T1,[.FOMAX,,LSTFOP] ;[520] FILOP. T1, JRST LSTERR ;[520] REPORT THE ERROR POPJ P, ;[520] RETURN LSTERR: WARN$N (LF,Listing file error) SETZM S.LIST## ;ZILCH TO PREVENT FURTHER TROUBLE MOVEI P1,S.LENT## ;SPEC ADDRESS JRST EGUUO ;TYPE OUT ERROR MESSAGE & RETURN ;UFDCOP - Routine to preserve the LOOKUP block of the UFD if doing /USAGE ; accounting so that the RENAME in GOTUFD does the correct thing instead ; of renaming the last SFD looked up. UFDCOP: MOVE T1,[EXLUFD,,EXLUF1];[530] SET UP THE BLT BLT T1,EXLUF1+NRIB-1;[530] POPJ P, ;[530] ;+ ; SETANT: SKIPE T1,.RBSPL(P2) ;GET ANNOTATION IN SIXBIT MOVEM T3,A$NOTE(P1) ;STORE ANNOTATION STRING BYTE POINTER ADDI T3,M+201(MH) ;ADJUST FOR PHYSICAL ADDRESS PUSHJ P,SETASZ ;STORE ASCIZ STRING MOVE T2,T3 ;COPY BYTE POINTER SUBI T2,M+201(MH) ;MAKE RELATIVE BYTE POINTER SKIPE T1,.RBAUT(P2) ;GET AUTHOR PPN MOVEM T2,A$CUSR(P1) ;STORE CREATOR STRING BYTE POINTER PUSHJ P,SETPPN ;STORE ASCIZ STRING SKIPN T1,.RBMTA(P2) ;GET REEL ID OF LAST TAPE POPJ P, ;IF NULL, DONE MOVE T2,T3 ;COPY NEW BYTE POINTER SUBI T2,M+201(MH) ;MAKE RELATIVE BYTE POINTER MOVEM T2,A$BKID(P1) ;STORE BP TO LAST BACKUP TAPE ;FALL INTO SETASZ ;+ ; 1 ADDI T4,5 ;NO, INCREMENT ACCESS FIELD SKIPG T2 ;SEE IF EQUAL TO ZERO SUBI T4,1 ;YES--ACCESS = 6 DPB T4,[POINTR (T1,PR$ATR)];SET ATTRIBUTE SUBFIELD ;HERE TO SET THE WRITE PROTECTION BITS MOVEI T4,0 ;START WITH ZERO CAIG T2,4 ;SEE IF RIB PROTECTION > 4 ADDI T4,1 ;INCREMENT WRITE ACCESS SUBFIELD CAIG T2,3 ;CHECK RIB PROTECTION ADDI T4,1 ;INCREMENT WRITE ACCESS SUBFIELD CAIG T2,2 ;CHECK RIB PROTECTION ADDI T4,1 ;INCREMENT WRITE ACCESS SUBFIELD DPB T4,[POINTR (T1, PR$WRT)];SET WRITE ACCESS SUBFIELD ;HERE TO SET READ PROTECTION BITS MOVEI T4,0 ;START WITH ZERO CAIG T2,6 ;CHECK RIB PROTECTION ADDI T4,1 ;INCREMENT READ ACCESS SUBFIELD CAIG T2,5 ;CHECK RIB PROTECTION ADDI T4,1 ;STEP READ ACCESS SUBFIELD DPB T4,[POINTR (T1, PR$RED)];SET READ ACCESS SUBFIELD POPJ P, ;RETURN ;+ ; JRST RSTREC ;GET NEXT ;HERE IF HAVE T$END TYPE RECORD IN BUFFER HAVEND: PUSHJ P,LSTXXX ;LIST RECORD MOVE T1,S.SSNM## ;SAVE SET SPECIFIED? CAME T1,[ASCII/all/] ;[237] NOT "all" CAMN T1,[ASCII/ALL/] ; AND NOT "ALL" JRST RSTREC ;NO--KEEP GOING PUSHJ P,HOLDRL ;[342] RELEASE ANYTHING ON HOLD CHANNEL JRST CPOPJ1 ;YES--THIS MUST BE END ;+ ; TROA T1,377 ;[356] YES, NEED PROT. RENAME LBL1: MOVEI T1,100 ;[356] NON-OPR RENAMED PROTECTION TXO F,FL$PRN ;[356] FLAG RENAME NEEDED LBL: DPB T1,[POINTR (EXLFIL+.RBPRV,RB.PRV)] ;[356] SET IN FILE SKIPE T1,.FXVER(SP) ;[316] GET /VERSION FROM USER, IF SET CAMN T1,[-1] ;[316] SKIPA ;[316] MOVEM T1,EXLFIL+.RBVER ;SET IN ENTER BLOCK SKIPLE T1,.FXEST(SP) ;IF /ESTIMATE, JRST [IDIVI T1,200 ;CONVERT TO BLOCKS SKIPE T2 ;SEE IF OVERFLOW AOS T1 ; YES, ONE MORE BLOCK MOVEM T1,EXLFIL+.RBEST; SET IN ENTER BLOCK JRST .+1] ;PROCEED SKIPE S.RSUM## ;SEE IF /RESUME, JRST TYPOUT ; YES--ASSUME NORMAL HANDLING LDB T1,[POINTR (.FXMOM(SP), FX.SUP)];SEE IF SCAN SUPERSEDE SWITCH SKIPE T1 ;IF NOT TYPED, TXNE F,FL$CHK ; OR /CHECK, JRST CHKSUP ; CHECK BACKUP SUPERSEDE SWITCHES LDB T1,[POINTR (.FXMOD(SP), FX.SUP)];TYPED--GET SCAN SETTING JUMPN T1,CLSFL1 ;/ERSUPERSEDE JRST TYPOUT ;/OKSUPERSEDE ;HERE TO CHECK WHETHER COPY ON DISK (IF ANY) SHOULD BE SUPERSEDED CHKSUP: SETZM SUSDF ;CLEAR THE SUPERSEDING DSK FILE FLAG [206] MOVEI T1,1 ;SEE IF SUPERSEDE ALLOWED CAMN T1,S.SUPR## ;SKIP IF NOT ALWAYS TXNE F,FL$CHK ;OR IF /CHECK SKIPA ;YES--NEED LOOKUP JRST TYPOUT ;NO--MUCH FASTER MOVX T1,.PTSCN ;[501] NO SCAN MOVEM T1,APATH+.PTSWT ;[501] SET PATH SWITCH MOVE T1,EXLFIL+.RBNAM;GET FILE NAME HLLZ T2,EXLFIL+.RBEXT;GET EXT MOVEI T3,0 ;ZERO PRIV WORD MOVE T4,EXLFIL+.RBPPN ;GET DIRECTORY LOOKUP FILE,T1 ;FILE THERE? JRST NOFILE ;NOPE--GOODIE TXNN F,FL$HUF ;[436][342] IF NOT ALREADY HELD, PUSHJ P,HOLDIT ;[436][342] HOLD THIS PPN TXNE F,FL$CHK ;IF /CHECK JRST TYPOUT ;ASSUME NORMAL HANDLING MOVE T1,S.SUPR## ;GET SUPERSEDE CODE CAIN T1,3 ;SKIP IF NOT SUPERSEDE NEVER JRST CLSFL1 ;CLOSE FILE CORRECTLY LDB T1,[POINTR (T3,RB.CRT)] ;GET CREATION TIME IMULI T1,^D60000 ;CONVERT TO MILLISECONDS LDB T2,[POINTR (T2,RB.CRX)] ;GET EXTENSION LSH T2,^D12 ;SHIFT OVER LDB T3,[POINTR (T3,RB.CRD)] ;GET BASE IOR T2,T3 ;UNITE PUSHJ P,CONVDT ;CONVERT TO SMITHSONIAN DATE/TIME CAML T1,CCDATI ;SKIP IF DISK FILE OLDER THAN TAPE FILE [203] JRST CLSFL1 ;DO NOT OVER-WRITE SETOM SUSDF ;SET "SUPERSEDE DSK FILE" FLAG [206] CLOSE FILE, ;DONE WITH FILE NOFILE: TXNN F,FL$CHK ;NEW FILE--SEE IF /CHECK JRST TYPOUT ;NOT /CHECK WARN$N (CNF,Check file not on disk) MOVEI P1,EXLFIL ;ADDRESS OF LOOKUP BLOCK PUSHJ P,GUUO ;TYPE INFO ;HERE TO CLOSE FILE CHANNEL AND NOT DISTURB FILE CLSFL1: CLOSE FILE,CL.ACS ;CLOSE POPJ P, ;RETURN TYPOUT: SKIPN S.TYMS## ;SKIP IF TYPE OUT NEEDED JRST TYPE2 ;FORGET IT SKIPE S.INTR## ;SEE IF INTERCHANGE MODE JRST TYPE1 ;SKIP TYPING PATH INFO IF SO MOVE T1,CSTR ;GET CURRENT STR MOVE T2,PTHBLK+.PTPPN;GET CURRENT PPN CAMN T1,PRESTR ;SAME AS LAST? JRST STRSAM ;STRUCTURE IS THE SAME MOVEM T1,PRESTR ;STORE NEW LAST STR MOVEM T2,PREPPN ;STORE PUSHJ P,TYLPPN ;TYPE LAST PPN OUTCHR TAB ;TAB OVER MOVE T1,PRESTR ;GET STR NAME PUSHJ P,SIXOUT ;TYPE STR NAME JRST TYPE0 ;TYPE AND RESTORE STRSAM: CAMN T2,PREPPN ;SAME AS LAST? JRST TYPE1 ;YES--RESTORE MOVEM T2,PREPPN ;NO--REPLACE PUSHJ P,TYLPPN ;TYPE LAST PPN TYPE0: OUTSTR CRLF ; TYPE1: MOVEI T1,2 ;SEE IF FILE NAMES WANTED CAMN T1,S.TYMS## ;SKIP IF NOT PUSHJ P,TYPFIL ;TYPE FILE NAME TYPE2: SKIPE S.WRIT## ;UNLESS /NOWRITE SKIPN T1,S.RSUM## ;[357] SEE IF RESUMING JRST NEWFIL ;NOT. ASSUME NORMAL HANDLING MOVEI T2,4 ;[357] NBR ARGS FOR LOOKUP MOVEM T2,EXLFIL ;[357] STORE MOVE T2,EXLFIL+.RBPPN ;[357][261] SAVE PATH TO FILE LOOKUP FILE,EXLFIL ;FILE SHOULD BE THERE JRST [MOVEM T2,EXLFIL+.RBPPN ;[357][261] RESTORE PATH SETZM S.RSUM## ;[261] NOT. ZILCH CAIG T1,1 ;[357] IF REALLY NEW FILE, JRST NEWFIL ;THAT'S OK JRST ELFIL] ;OTHERWISE DIE MOVEM T2,EXLFIL+.RBPPN ;[357][261] RESTORE PATH TXNN F,FL$HUF ;[342] IF NOT ALREADY HELD, PUSHJ P,HOLDIT ;[342] HOLD THIS PPN TXNE F,FL$CHK ;SEE IF /CHECK, JRST POSITN ;YES, GO POSITION ENTER FILE,EXLFIL ;RE-ENTER TO UPDATE JRST [MOVEM T2,EXLFIL+.RBPPN ;[357][261] RESTORE PATH SETZM S.RSUM## ;[261] ZILCH JRST EEFIL] ;ABORT FILE MOVEM T2,EXLFIL+.RBPPN ;[261] RESTORE PATH POSITN: PUSHJ P,.USETI ;[357] POSITON USING FILOP PUSHJ P,GENDBF ;GENERATE DISK BUFFERS ;HERE TO READ IN THE DISK BLOCK OR DO A DUMMY OUTPUT PUSHJ P,@DSKIO ;EXEC JRST XFRERR ;DISK I/O ERROR JRST RSMERR ;EOF--MEANS USER GAVE INVALID CHECKPOINT PUSHJ P,TYPRSM ;TYPE RESUMING MESSAGE MOVE T1,S.RSUM## ;BLOCK NBR WE ARE STARTING AT MOVEM T1,THSRDB ;STORE ADDI T1,CP$INC ;ADD ON CHECKPOINT INCREMENT MOVEM T1,CHKPNT ;SET NEW CHECKPOINT MOVE T1,F$PCHK(MH) ;GET PATH CHECKSUM FROM TAPE RECORD HEADER MOVEM T1,PTHCHK ;SAVE IT SETZM S.RSUM## ;ZILCH JRST CNTFIL ;CONTINUE WITH FILE NEWFIL: MOVE T1,MDATA ;GET START OF DATA AREA ADDI T1,200 ;POINT TO O$FILE BLOCK PUSHJ P,LSTFIL ;LIST THIS FILE TXNN F,FL$PSI ;SKIP FOLLOWING IF PSI ENABLED JRST [PUSHJ P,OPRCMD##;HANDLE ANY TTY INPUT TXO F,FL$KIL;RETURN HERE IF OPERATOR SAID KILL JRST .+1] ;CONTINUE TXNE F,FL$CHK ;IF /CHECK, JRST NORMAL ; SKIP ENTER SKIPN S.WRIT## ;IF /NOWRITE, POPJ P, ; QUIT NOW ;HERE TO ENTER TAPE FILE ON DISK ADDI P1,1 ;ADJUST TO POINT TO ATTRIBUTE DATA MOVE T1,A$MODE(P1) ;GET CREATION MODE MOVEI T2,FILE ;[510] CHANNEL DEVCHR T2, ;[510] GET LEGAL DATA MODES FOR THIS DEVICE MOVEI T3,1 ;[510] ADJUST TO THE BIT POSITION OF THE GIVEN LSH T3,(T1) ;[510] DATA MODE TO COMPARE WITH BITS RETURNED TDNE T2,T3 ;[510] BY THE DEVCHR. IS THE DATA MODE KNOWN? JRST NEWFL1 ;[510] YES WARN$N (IDM,Illegal data mode) ;[510] NO. REPORT IT PUSHJ P,OCTOUT ;[510] DISPLAY ILLEGAL DATA MODE OUTSTR [ASCIZ / for file /] ;[510] PUSHJ P,TYSPEC ;[510] DISPLAY FILE SPEC OUTSTR [ASCIZ/, assuming image mode. /] MOVEI T1,.IOIMG ;[510] USE BINARY MODE INSTEAD NEWFL1: SETSTS FILE,(T1) ;FAKE OUT FILSER PUSHJ P,SETFIL ;SET UP FILE ENTER BLOCK MOVE T1,EXLFIL+.RBPPN ;[261] SAVE PATH ENTER FILE,EXLFIL ;TRY TO ENTER FILE JRST [MOVEM T1,EXLFIL+.RBPPN ;[261] RESTORE PATH JRST CHKWHY ] ;[261] LOSE--TRY TO RECOVER MOVEM T1,EXLFIL+.RBPPN ;[261] RESTORE PATH ;FILE IS ENTERED. HERE TO TRANSFER ACTUAL DATA. NORMAL: PUSHJ P,GENDBF ;GENERATE DISK BUFFERS MOVE P2,MDATA ;GET ADDRESS OF START OF DATA ADD P2,G$LND(MH) ;SKIP NON-DATA SECTION MOVE P1,G$SIZ(MH) ;GET NUMBER OF WORDS OF DATA CAILE P1,400 ;SEE IF IN RANGE MOVEI P1,400 ;NOT. USE MAX FOR FIRST TAPE BLOCK MOVEI T1,CP$INC ;CHECKPOINT INCREMENT MOVEM T1,CHKPNT ;SET INITIAL CHECKPOINT MOVEI T1,1 ;START WITH RELATIVE-DATA-BLOCK 1 MOVEM T1,THSRDB ;STORE MOVE T1,F$PCHK(MH) ;GET FILE PATH CHECKSUM MOVEM T1,PTHCHK ;SAVE FOR LATER CHECKING PUSHJ P,@DSKIO ;GET FIRST BUFFER OR DO DUMMY OUTPUT JRST XFRERR ;ERROR RETURN JRST DSKEO1 ;EOF RETURN--NULL DISK FILE JUMPLE P1,CHKEND ;MAY BE 0 BLOCKS ON TAPE XFR1: MOVSI T1,(P2) ;TAPE BUFFER ADDRESS HRRI T1,(DBUF) ;DISK BUFFER ADDRESS MOVEI T2,177(T1) ;USUALLY 200 WORDS CAIL P1,200 ;SEE IF LAST BLOCK IN THIS TAPE BLOCK JRST XFR2 ;NO MOVEI T2,-1(T1) ;OFFSET ADD T2,P1 ;POINT TO END XFR2: XCT DSKBLT ;COPY OR COMPARE DATA TXNN F,FL$CHK ;SEE IF /CHECK CAIL P1,200 ;IS THIS THE LAST BLOCK? JRST NOTLST ;NO--CONTINUE ;HERE IF LAST DISK BLOCK TO BE WRITTEN MOVE T1,[CLOSE FILE,CL.ACS!CL.DAT] ;[304]WILL DO OUTPUT MOVN T2,P1 ;NEGATE WORD COUNT ADDM T2,DSKHDR+.BFCTR;DECREMENT BYTE COUNT MOVNS T2 ;NEGATE AGAIN PUSHJ P,ALTDSK ;PERFORM SPECIAL OUTPUT JRST XFRERR ;ERROR RETURN HALT . ;***TEMP*** JRST ENDBLK ;DONE ;HERE TO CONTINUE TRANSFERING FILE NOTLST: MOVEI T1,200 ;ADJUST BYTE POINTER ADDM T1,DSKHDR+.BFPTR MOVE T1,DSKHDR+.BFCTR;ADJUST BYTE COUNT SUBI T1,200 MOVEM T1,DSKHDR+.BFCTR ADDI DBUF,200 ;NEXT BLOCK IN DISK BUFFER SOSE NDBLIB ;IS THIS THE LAST BLOCK OF THE DISK BUFFER? JRST ENDBLK ;NO. CONTINUE TRANSFERRING PUSHJ P,@DSKIO ;ADVANCE DISK BUFFER JRST XFRERR ;ERROR RETURN JRST DSKEOF ;EOF RETURN ENDBLK: ADDI P2,200 ;ADVANCE TO NEXT BLOCK IN RECORD SUBI P1,200 ;SUBTRACT BLOCK FROM DATA COUNT AOS T1,THSRDB ;COUNT OF BLOCKS+1 SO FAR PUSHJ P,RSTCKP ;DO CHECKPOINTING, IF NEEDED JRST XFRERR ;ERROR DURING CHECKPOINTING JUMPG P1,XFR1 ;SEE IF ANY MORE TO GO CHKEND: MOVX T1,GF$EOF ;EOF BIT TDNN T1,G$FLAG(MH) ;SKIP IF ON JRST NOTNEW ;GO GET NEXT TAPE RECORD TXNN F,FL$CHK ;SEE IF /CHECK, JRST XFRDON ;NO--TRANSFER DONE ;HERE IF /CHECK AND TAPE EOF WARN$N (CTS,Check tape file shorter) PUSHJ P,DOWHAT ;TYPE FULL FILE PATH MOVEI T1,[ASCIZ/ % Check tape file shorter /] SKIPE S.LIST ;SEE IF LISTING NEEDED PUSHJ P,LSTMSG ;SEND MESSAGE TO LISTING FILE JRST XFRDON ;DONE ;HERE TO GET ANOTHER TAPE RECORD NOTNEW: PUSHJ P,XMTAIN ;GET NEXT RECORD JRST XFRERR ;EOF OR KILL--ABORT FILE MOVE T1,G$TYPE(MH) ;GET RECORD TYPE CAIE T1,T$BEG ;START OF SAVE SET? CAIN T1,T$CON ;CONTINUATION OF SAVE SET? JRST [PUSHJ P,LSTXXX;YES, LIST IT JRST NOTNEW] ;AND CONTINUE CAIN T1,T$UFD ;SEE IF DIRECTORY RECORD JRST [PUSHJ P,HAVUFD;CREATE RIB JRST NOTNEW] ;CONTINUE CAIN T1,T$LBL ;SEE IF LABEL RECORD JRST NOTNEW ;***TEMP*** CAIE T1,T$FIL ;SHOULD BE FILE DATA JRST XFRERR ;NO GOOD ;HERE TO CONTINUE WITH FILE SINCE RECORD CONTAINS FILE DATA. CNTFIL: MOVE T1,G$FLAG(MH) ;[254] GET FLAG WORD TXNE T1,GF$DFE ;[254] DFE BIT ON? PUSHJ P,DSKDFE ;[254] YES, PRINT MESSAGE SKIPG P1,G$SIZ(MH) ;[254] ANY SIGNIFICANT DATA? JRST CHKEND ;NO--SHOULD BE END CAILE P1,200*N ;SEE IF IN RANGE MOVEI P1,200*N ;NOT. USE MAX NBR WORDS MOVE P2,MDATA ;START OF DATA MOVX T1,GF$SOF ;SEE IF START OF FILE, TDNE T1,G$FLAG(MH) ;TEST FLAG IN HEADER JRST MISMAT ;YES--MISSED EOF MOVE T1,F$PCHK(MH) ;GET PATH CHECKSUM CAME T1,PTHCHK ;MAKE SURE STILL ON SAME FILE JRST MISMAT ;NOT. BAD NEWS MOVE T1,F$RDW(MH) ;GET TAPE RELATIVE DATA WORD ASH T1,-7 ;CALCULATE RELATIVE DATA BLOCK AOS T1 ; ... CAMN T1,THSRDB ;[321] BLOCK EXPECTED? JRST XFR1 ;[321] YES - GO USE IT MOVE T2,THSRDB ;LOAD NEEDED DISK BLOCK NUMBER CAML T2,T1 ;[321] NEEDED BLOCK GE FIRST BLOCK IN RECORD? CAIL T2,N(T1) ;[321] AND ALSO LT FIRST BLOCK IN NEXT RECORD? JRST NOTINB ;[321] NO - GO RESET DISK POINTERS SUB T2,T1 ;YES, GET DIFFERENCE ASH T2,7 ;MULTIPLY BY 200 WORDS ADD P2,T2 ;ADD TO DATA ADDRESS POINTER SUB P1,T2 ;AND SUBTRACT FROM WORD COUNT JUMPG P1,XFR1 ;GO TRANSFER OVER JRST CHKEND ;FOUL UP? NOTINB: CAML T1,THSRDB ;[321] PREVIOUS BLOCK? JRST RSTMSD ;[321] NO - WE MISSED A BLOCK MOVEM T1,THSRDB ;[321] YES - RESET FILE INDEX WARN$N (PBR,Prior block repeated) ;[321] WARN USER MOVEI T2,[ASCIZ/rewriting from /] ;[321] MESSAGE TXNE F,FL$CHK ;[321] CHECKING? MOVEI T2,[ASCIZ/rereading from /] ;[321] YES - OTHER MSG OUTSTR @T2 ;[321] PUSHJ P,TYEFIL ;[321] TELL USER FILE AND BLOCK JRST RSTUST ;[321] GO USE IT RSTMSD: PUSH P,T1 ;[321] SAVE THIS RDB WARN$N (BMT,Block missed on tape, expected) ;[321] WARN PUSHJ P,TYEFIL ;[321] DISPLAY FILE AND BLOCK POP P,THSRDB ;[321] UPDATE FILE INDEX WARN$N (FLC,File continuing with) ;[321] SHOW WHAT'S HAPPENING PUSHJ P,TYEFIL ;[321] DITTO RSTUST: MOVE T1,THSRDB ;[321] GET BLOCK NUMBER TXNN F,FL$CHK ;[321] CHECKING? JRST [PUSHJ P,.USETO ;[357] NO, USETO DISK FILE (USE FILOP) JRST XFR1] ;[321] GO USE THE BLOCK WAIT FILE, ;[521] WAIT FOR DISK ACTIVITY TO SETTLE DOWN MOVSI T2,400000 ;[321] CHECKING - MUST RESET INPUT BUFFERS IORB T2,DSKHDR ;[321] FLAG BUFFER RING AS EMPTY MOVEI T3,NDSKBF ;[321] PREPARE TO INVALIDATE ALL BUFFERS RSTUS1: SOJL T3,RSTUS2 ;[321] ANY MORE BUFFERS? MOVE T4,(T2) ;[321] YES - GET NEXT .BFHDR TXZ T4,BF.IOU ;[321] CLEAR THE USE BIT MOVEM T4,(T2) ;[321] PUT IT BACK MOVE T2,T4 ;[321] POINT TO NEXT BUFFER IN RING JRST RSTUS1 ;[321] GO CHECK FOR MORE RSTUS2: PUSHJ P,.USETI ;[357] RING INVALIDATED, USETI DISK FILE PUSHJ P,@DSKIO ;[321] READ THE NEEDED DISK BLOCK JRST XFRERR ;[321] PROBLEM WITH DISK JRST DSKEO1 ;[321] NO MORE DISK FILE JRST XFR1 ;[321] GO COMPARE DSKEOF: SUBI P1,200 ;COUNT LAST DATA XFR DSKEO1: MOVX T1,GF$EOF ;SEE IF LAST TAPE BLOCK TDNE T1,G$FLAG(MH) ;EOF BIT SHOULD BE ON JUMPLE P1,XFRDON ;IF NO TAPE DATA LEFT, OK WARN$N (CDS,Check disk file shorter) MOVEI P1,EXLFIL ;ADDRESS OF LOOKUP BLOCK PUSHJ P,GUUO ;TYPE FULL FILE PATH MOVEI T1,[ASCIZ/ % Check disk file shorter /] SKIPE S.LIST ;SKIP IF LISTING NOT NEEDED PUSHJ P,LSTMSG ;SEND MESSAGE TO LISTING ;FALL INTO XFRDON ;HERE WHEN RESTORE OR CHECK DONE. CLOSE DISK FILE AND CHECK. XFRDON: SKIPLE .FXEST(SP) ;[232] /ESTIMATE SET? SKIPA T1,[CLOSE FILE,CL.ACS!CL.DLL!CL.DAT]; [236] YES,LOAD PROPER CLOSE MOVE T1,[CLOSE FILE,CL.ACS!CL.DAT] ;[236] NO,LOAD PROPER CLOSE TXNE F,FL$PAO ;[232] PAO FLAG ON? TRZ T1,CL.DLL ;[232] YES,CLEAR CL.DLL XCT T1 ;[232] EXECUTE UUO TXNE F,FL$HUF ;[342] PPN HELD ALREADY? JRST XFRDO2 ;[342] YES - SKIP HOLDING STUFF PUSHJ P,SETFIL ;[342] NO - RESET LOOKUP BLOCK PUSHJ P,HOLDIT ;[342] AND CALL PPN HOLDER XFRDO2: ;[342] IFN FT$DBG,< ;[323] SETOM FSZWDS ;[323] FLAG # WORDS UNDETERMINED >;END IFN FT$DBG ;[323] TXNN F,FL$CHK ;[260] SKIP IF /CHECK TXNN F,FL$PRN!FL$EST ;[232] EITHER PROT. OR .RBEST TO BE RENAMED? JRST CONT ;[232] NO,SKIP AROUND RENAME LOGIC PUSHJ P,SETFIL ;[232] YES,RESET ENTER BLOCK MOVE T2,EXLFIL+.RBPRV ;[315] SAVE REAL CREATION DATE MOVE T1,EXLFIL+.RBPPN ;[324] SAVE PATH MOVE T3,EXLFIL+.RBEXT ;[354] SAVE HIGH ORDER CREATION BITS LOOKUP FILE,EXLFIL ;[232] LOOKUP FILE JRST ELFIL ;[232] TELL USER BAD NEWS MOVEM T3,EXLFIL+.RBEXT ;[354] REPLACE HIGH ORDER CREATION BITS MOVEM T1,EXLFIL+.RBPPN ;[324] RESTORE PATH MOVEM T2,EXLFIL+.RBPRV ;[315] REPLACE REAL CREATION DATE IFN FT$DBG,< ;[323] MOVE T2,EXLFIL+.RBSIZ ;[323] GET FILE SIZE IN WORDS MOVEM T2,FSZWDS ;[323] SAVE IT >;END IFN FT$DBG ;[323] TXNN F,FL$PRN ;[354][232] PROTECTION TO BE RENAMED? JRST XFRDO3 ;[354] NO... SKIPE T2,PRNAME ;[354] YES, GET ORIGINAL PROTECTION JRST STPROT ;[354] JUMP IF NOT ZERO TXZE F,FL$EPR ;[354] EOV? JRST XFRDO3 ;[354] YES SKIPN S.INTR ;[354] INTERCHANGE MODE? STPROT: DPB T2,[POINTR(EXLFIL+.RBPRV,RB.PRV)] ;[354][232] NO, SET IN BLOCK XFRDO3: TXNE F,FL$EST ;[232] .RBEST TO BE RENAMED? JRST [MOVE T2,EST ;[232] YES,GET ORIGINAL .RBEST SKIPG .FXEST(SP) ;[232] IF /ESTIMATE SET RETURN MOVEM T2,EXLFIL+.RBEST ;[232] SET IN ENTER BLOCK JRST .+1] ;[232] RETURN MOVEI T2,12 ;[232] SHORTEN ENTE BLOCK MOVEM T2,EXLFIL ;[232] SET IN BLOCK RENAME FILE,EXLFIL ;[232] RENAME THE FILE PUSHJ P,ERFIL ;[260] [232] GIVE WARNING MESSAGE MOVEM T1,EXLFIL+.RBPPN ;[324] RESTORE PATH TXZ F,FL$PRN!FL$EST ;[232] RESET RENAME FLAGS CONT: TXZE F,FL$DFE ;[254] ANY DISK ERRORS WHEN SAVED? PUSHJ P,DFETST ;[424][254] YES, PRINT ERROR MESSAGE TXNE F,FL$CHK ;[254] SEE IF /CHECK JRST [SKIPE T1,CHKCNT;SEE IF ANY DIFFERENCES SKIPN S.LIST ;AND IF LISTING NEEDED JRST RLSFIL ;NO, SKIP LISTING COUNT PUSHJ P,LSTTAB;TAB OVER PUSHJ P,LSTDEC;LIST COUNT OF DIFFERENCES MOVEI T1,[ASCIZ \ difference(s) found \] PUSHJ P,LSTMSG;SEND TO FILE JRST RLSFIL] ;SKIP SIZE CHECK IFN FT$DBG,< SKIPE S.INTR ;[323] INTERCHANGE MODE? JRST TAPERR ;[323] YES - SKIP SIZE CHECK IN CASE DUMPER MOVE T1,FSZWDS ;[323] NO - GET FILE SIZE IN WORDS CAME T1,[-1,,-1] ;[323] DO WE REALLY HAVE IT? JRST SIZCHK ;[323] YES - GO COMPARE SIZES. ;[323] NO - MUST DO A LOOKUP PUSHJ P,SETFIL ;RESET LOOKUP/ENTER BLOCK MOVE T1,EXLFIL+.RBPPN ;[324] SAVE PATH LOOKUP FILE,EXLFIL ;GET IT AGAIN JRST ELFIL ;OUCH MOVEM T1,EXLFIL+.RBPPN ;[324] RESTORE PATH MOVE T1,EXLFIL+.RBSIZ;GET FILE SIZE IN WORDS SIZCHK: CAMN T1,CWSIZE ;SAME AS TAPE'S? JRST TAPERR ;YES WARN$N (SCE,Size copy error) MOVEI P1,EXLFIL ;LOAD ADDRESS OF BLOCK PUSHJ P,GUUO ;TYPE NAME >;END IFN FT$DBG TAPERR: TXNN F,FL$TPE ;TAPE READ ERROR? JRST RLSFIL ;NO, OK PUSHJ P,SETFIL ;RESET LOOKUP/ENTER BLOCK MOVX T1,RP.BFA ;INDICATE BACKUP READ ERROR IORM T1,EXLFIL+.RBSTS;SET FLAG IN FILE STATUS WORD RENAME FILE,EXLFIL ;RENAME TO STORE FLAG JFCL ;NICE TRY RLSFIL: RELEAS FILE, ;RELEASE CHANNEL RELEAS UFD, ; .. POPJ P, ;RETURN DFETST: WARN$N (DFE,Disk file had errors when SAVEd) ;[254] MOVEI P1,EXLFIL ;[254] LOAD ADDRESS OF BLOCK PUSHJ P,GUUO ;[254] TYPE NAME POPJ P, ;[424] RETURN MISMAT: WARN$ (HSI,Header file spec inconsistency) SOS FX$CNT(SP) ;DON'T COUNT MATCH OF PARTIAL FILE XFRERR: CLOSE FILE,CL.RST ;ABORT FILE RELEAS FILE, ; .. RELEAS UFD, ; .. JRST EAFIL ;TYPE OUT BAD NEWS & RETURN SUBTTL TAPE TO DISK SUBROUTINES ;+ ;.CHAPTER TAPE TO DISK SUBROUTINES ;- ;+ ; MOVEI P1,EXLFIL ;ADDRESS OF LOOKUP BLOCK PUSHJ P,GUUO ;TYPE FULL FILE PATH SKIPN S.LIST ;SEE IF LISTING WANTED JRST CHKDF1 ;LISTING NOT NEEDED MOVEI T1,[ASCIZ/ % FIRST DIFFERENCE AT WORD /] PUSHJ P,LSTMSG ;SEND MESSAGE MOVE T1,THSRDB ;RELATIVE DATA BLOCK FOR DISK BUFFER SOS T1 ;CALCULATE DISK WORD ASH T1,7 ; ... ADDI T1,(T4) ;ADD POSITION IN BUFFER SUBI T1,(DBUF) ;SUBTRACT START ADDRESS OF BUFFER PUSHJ P,LSTDEC ;SEND TO FILE MOVEI T1,CRLF ; PUSHJ P,LSTMSG ;SEND TO FILE MOVEI T1,[ASCIZ/ DISK: /] PUSHJ P,LSTMSG ;SEND TO FILE HLRZ T1,(T4) ;GET LEFT HALF OF DISK WORD PUSHJ P,LSTOCT ;SEND TO FILE MOVEI T1,[ASCIZ/,,/] PUSHJ P,LSTMSG ;HALF WORD FORMAT HRRZ T1,(T4) ;GET RIGHT HALF OF DISK WORD PUSHJ P,LSTOCT ;SEND TO FILE MOVEI T1,[ASCIZ/ TAPE: /] PUSHJ P,LSTMSG ;SEND TO FILE MOVSS T4 ;POINT TO TAPE WORD HLRZ T1,(T4) ;GET LEFT HALF OF TAPE WORD PUSHJ P,LSTOCT ;SEND TO FILE MOVEI T1,[ASCIZ/,,/] ;HALF WORD FORMAT PUSHJ P,LSTMSG ;SEND TO FILE HRRZ T1,(T4) ;GET RIGHT HALF OF TAPE WORD PUSHJ P,LSTOCT ;SEND TO FILE MOVEI T1,CRLF ; PUSHJ P,LSTMSG ;SEND TO FILE CHKDF1: RSTR$ POPJ P, ;RETURN ;+ ;