TITLE BACKRS -- MODULE TO DO THE WORK FOR BACKUP -- %5A(625) SUBTTL FRANK NATOLI/FJN/PFC/KCM/JEF/MEB/CLRH/VLR/CGN/WMG/DC/BPK/MS/BAH/EDS 18-FEB-88 DECVER==5 ;MAJOR VERSION DECMVR==1 ;MINOR VERSION DECEVR==624 ;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 5A ;.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 SETDEN: SKIPL S.OPER## ;WRITING? JRST SETDE1 ;NO MOVEI T2,.TFSTS ;FUNCTION CODE MOVEI T3,F.MTAP ;TAPE CHANNEL MOVE T1,[2,,T2] ;SET UP UUO AC TAPOP. T1, ;READ STATUS JRST SETDE1 ;TAKE A GUESS TRNN T1,TF.BOT ;SITTING AT BOT? JRST SETDE1 ;NO--DENSITY CAN EASILY BE READ MTBLK. F.MTAP, ;ELSE WRITE A LONG GAP MTWAT. F.MTAP, ;WAIT FOR THE DRIVE TO SETTLE DOWN MTREW. F.MTAP, ;AND PUT US BACK AT THE LOAD POINT SETDE1: MOVEI T2,.TFDEN ;INDICATE DENSITY MOVEI T3,F.MTAP ;TAPE CHANNEL MOVE T1,[XWD 2,T2] ;ARG FOR UUO 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,MTADEV ;READ PHYSICAL DEVICE NAME 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 ;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 SETOM UNIQUE ;RESET UNIQUE EXTENSION NUMBER NEWFL2: MOVX T1,RB.NSE ;NON-SUPERSEDING ENTER BIT MOVX T2,FX.SUP ;SCAN SUPERSEDE BIT SKIPG S.UNIQ## ;UNIQUE EXTENSIONS? TDNE T2,.FXMOD(SP) ;/ERSUPERSEDE? IORM T1,EXLFIL+.RBCNT ;YES 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 SKIPGE UNIQUE ;WAS A UNIQUE EXTENSION GENERATED? JRST NORMAL ;NO WARN$N (UEG,) PUSH P,P1 ;SAVE P1 MOVEI P1,EXLFIL ;POINT TO ENTER BLOCK PUSHJ P,GUUO ;TYPE FILESPEC POP P,P1 ;RESTORE P1 ;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 ;+ ; RSTANT: MOVE T3,A$NOTE(P1) ;GET BP TO ASCIZ STRING (.RBSPL) JUMPE T3,RSTMTI ;NONE ADD T3,P1 ;ADD START ADDRESS PUSHJ P,GETSIX ;CONVERT TO SIXBIT MOVE T2,(P) ;WHERE TO STORE MOVEM T1,.RBSPL(T2) ;STORE RSTMTI: MOVE T3,A$BKID(P1) ;GET RELATIVE BP TO SAVE NAME JUMPE T3,RSTAUT ;NONE ADD T3,P1 ;ADD START ADDRESS PUSHJ P,GETSIX ;CONVERT TO SIXBIT MOVE T2,(P) ;WHERE TO STORE MOVEM T1,.RBMTA(T2) ;STORE RSTAUT: MOVE T3,A$CUSR(P1) ;GET RELATIVE BP TO AUTHOR JUMPE T3,RSTUSR ;NONE ADD T3,P1 ;ADD START ADDRESS PUSHJ P,GETPPN ;CONVERT TO PPN MOVE T2,(P) ;WHERE TO STORE MOVEM T1,.RBAUT(T2) ;STORE RSTUSR: POP P,P2 ;RESTORE P2 MOVE T1,A$USRW(P1) ;GET CUSTOMER WORDS FROM TAPE MOVEM T1,.RBNCA(P2) ; ... MOVE T1,A$PCAW(P1) ; ... MOVEM T1,.RBPCA(P2) ; ... MOVEI T1,0 ;ZILCH MOVE T2,A$FLGS(P1) ;GET BACKUP FLAGS FROM TAPE MOVSI T3,-LN$FLG ;LENGTH OF FLAG TABLES RSTFLG: TDNE T2,BKPFLG(T3) ;IF BACKUP FLAG SET, IOR T1,RIBFLG(T3) ; SET CORRESPONDING RIB FLAG AOBJN T3,RSTFLG ;LOOP MOVEM T1,.RBSTS(P2) ;STORE FLAGS TXNE T1,RP.BFA ;[427] DID SAVE HAD BAD FILE TXO F,FL$TPE ;[427] YES, SET UP TAPE ERROR MOVE T1,A$RADR(P1) ;GET REQUESTED DISK ADDRESS IDIVI T1,200 ;CONVERT TO LOGICAL BLOCK NBR MOVEM T1,.RBPOS(P2) ;STORE POPJ P, ;RETURN ;+ ;;END IFLE F-7 MOVEI 7,S.CRYP## ;LOC OF PASSWORD PUSHJ P,CRASZ.## ;CALL CODER MOVEM 5,SVCODE ;SAVE SEED CLSCRM: MOVSI 7,-200*N ;HOW MANY WORDS HRRI 7,M(MH) ;WHERE IT'S AT MOVE 1,G$LND(MH) ;GET LENGTH OF NON-DATA SECTION HRLS 1 ;PUT IN LH ALSO ADD 7,1 ;DON'T ENCRYPT NON-DATA MOVE 6,F$RDW(MH) ;GET RELATIVE WORD ADDI 6,200 ;FORCE OVERFLOW ASH 6,-7 ;GET RELATIVE BLOCK MOVE 5,SVCODE ;GET SEED BACK PUSHJ P,CRYPT.## ;CALL ENCRIPTER MOVSI 7,SAVACS ;RESTORE REGISTERS BLT 7,7 ; .. MTAOU1: AOS T1,NSEQ ;GET SEQUENCE NUMBER MOVEM T1,G$SEQ(MH) ;STORE MOVE T1,S.NTPE## ;GET TAPE NUMBER MOVEM T1,G$RTNM(MH) ;STORE IFE FT$CHK < MOVX T1,GF$NCH ;INDICATE NO CHECKSUM IORM T1,G$FLAG(MH) ;SET FLAG IN RECORD HEADER >;END IFE FT$CHK IFN FT$CHK < PUSHJ P,CHKSUM ;COMPUTE CHECKSUM >;END IFN FT$CHK DUMOUT: TXOE F,FL$SV1 ;[310] FIRST OUTPUT? JRST DUMOU1 ;[310] NO, GO DO REGULAR OUT MTBLK. F.MTAP, ;[310] YES, WRITE BLANK TAPE FIRST MTWAT. F.MTAP, ;[310] AND WAIT GETSTS F.MTAP,P1 ;[310] SEE IF WE HAVE ANY ERRORS TXC P1,IO.ERR ;[612][402] REMOVE ALL BUT ERROR BITS TXCN P1,IO.ERR ;[612][402] SEE IF A TAPE LABEL ERROR OCCURED JRST LABERR ;[402] YES, GO AWAY NEVER TO RETURN... ;No error was detected by the tape labeling process. Now ;make sure the tape is not write-locked, then continue. ; WLOCK: TRNN P1,IO.IMP ;[402][310] TO CHECK IF TAPE WRITE-LOCKED JRST DUMOU2 ;[310] NO, GO DO REGULAR OUTPUT SETSTS F.MTAP,.IOBIN ;[310] CLEAR STATUS OPER$ (TWL,tape write locked--add write ring then type "GO") ;[310] PUSHJ P,TYI ;[310] WAIT FOR GO DUMOU2: SETSTS F.MTAP,.IOBIN ;[310] CLEAR STATUS AFTER WRITING BLANK TAPE DUMOU1: SETZB P3,S.MBPT##+.BFCTR ;[310] ZERO COUNT AND ERROR POSITION POINTER MOVEI T1,MTBBKP ;LOAD OUTPUT BLOCK SIZE ADDM T1,S.MBPT##+.BFPTR ;INCREMENT BYTE POINTER OUT F.MTAP, ;EXECUTE OUTPUT UUO JRST MTASET ;SUCCESSFUL OUTPUT GETSTS F.MTAP,P1 ;[440] GET ERROR STATUS BITS WAIT F.MTAP, ;[440] WAIT FOR I/O TO FINISH TRNN P1,IO.EOT ;CHECK END OF TAPE BIT JRST [ ;[407] TXC P1,IO.ERR ;[612][407] REMOVE ALL BUT ERROR BITS TXCN P1,IO.ERR ;[612][407] TAPE LABEL ERROR? JRST LABERR ;[407] YES, GO AWAY NEVER TO RETURN... JRST NOTEOT] ;[407] NO--CHECK OTHERS TXNE F,FL$EOV ;SEE IF EOV SENT JRST MTASET ;IT HAS. FINISH THIS TAPE UP TXO F,FL$END ;INDICATE END OF SAVE PUSHJ P,MTASET ;FORCE OUTPUT OF REMAINING BUFFERS MOVEI T1,T$EOV ;FORM EOV RECORD MOVEM T1,G$TYPE(MH) ;STORE TXO F,FL$END!FL$EOV ;WILL FORCE OUT EOV RECORD PUSHJ P,MTAOU1 ;SEND EOV ;HERE TO HANDLE REEL SWITCHING TXZ F,FL$EOV ;CLEAR EOV FLAG TXNN F,FL$RCV ;SEE IF RECOVERY CODE AVAILABLE JRST [CLOSE F.MTAP, ;NO--WRITE THE REST OF THE BLOCKS SETSTS F.MTAP,.IOBIN ;[221] CLEAR STATUS PUSHJ P,DUMOUT;DO A DUMMY OUTPUT JRST MULTR2] ;PROCEED MTEOF. F.MTAP, ;WRITE 2 EOFS MTEOF. F.MTAP, ; .. MULTR2: SKIPE S.MULT## ;SEE IF /NOMULTIREEL JRST NEWTAP ;NO, GO ASK FOR NEW TAPE OUTSTR [ASCIZ/ ?BKPRES Reached EOT on single reel save /] MONRT. ;.CONTINUE WILL WORK NEWTAP: AOS S.NTPE## ;INCREMENT TAPE NUMBER MOVE T1,S.NTPE## ;[266][311] GET TAPE NO. FOR HEADER MOVEM T1,G$RTNM(MH) ;[266][311] PUT IT IN HEADER PUSHJ P,NEXTAP ;GET NEXT TAPE SETZM ERRCNT ;INITIALIZE COUNT FOR NEW REEL TXNE F,FL$KIL ; WAS KILL TYPED? [200] POPJ P, ; YEP - SO EXIT [200] MOVEI T1,T$CON ;CONTINUATION OF SAVE SET TXZ F,FL$SV1 ;[310] ZERO FIRST-WRITE FLAG PUSHJ P,GENSAV ;WRITE T$CON ON NEW TAPE SKIPE S.INTR## ;SEE IF /INTERCHANGE POPJ P, ;YES, DON'T WRITE T$UFD RECORDS MOVSI T1,-.FXLND ;HOW MANY LEVELS HRRZS ADRLST(T1) ;CLEAR LH(ADRLST) AOBJN T1,.-1 ; ... PUSHJ P,WRTUFD ;WRITE T$UFD RECORDS POPJ P, ;RETURN NEXTAP: SKIPE CNAMSW ;[416] FILE SPLIT ACCROSS REELS? PUSHJ P,TYEFIL ;YES, TYPE FILE SPEC AND BLOCK NBR MOVE T1,TAPLBL## ;[426] GET THE LABEL TYPE CAXN T1,.TFLNV ;[345] IS IT SPECIAL UNLABELED TAPE? JRST NXTMDA ;[345] YES, ASK THE MDA NXTT.1: MTUNL. F.MTAP, ;START UNLOADING THE TAPE OPER$ (EOT,Reached EOT--mount new tape then type "GO") PUSHJ P,TYI ;WAIT FOR GO MTREW. F.MTAP, ;MAKE SURE TAPE AT LOAD POINT NXTT.2: SETSTS F.MTAP,.IOBIN ;CLEAR ERRORS POPJ P, ;RETURN ;Here to get the next volume via the correct fashion NXTMDA: OUTSTR [ASCIZ/ [BKPAMD Asking MDA for next volume] /] MOVE T1,[XWD 2,T2] ;[345] AIM AT THE ARG BLOCK MOVEI T2,.TFFEV ;[345] FORCE END-OF-VOLUME PROCESSING MOVEI T3,F.MTAP ;[345] ON THIS OPEN CHANNEL TAPOP. T1, ;[345] GET THE NEXT VOLUME SKIPA ;[345] CAN'T... SEE WHY JRST NXTT.2 ;GO FINISH UP OUTSTR CRLF ;[405] SOME TYPE OF ERROR OUTSTR [ASCIZ\?BKPCGT Can't get next tape\] ;[405] GENERAL ERROR OUTSTR CRLF ;[405] MESSAGE GETSTS F.MTAP,P1 ;[405] SEE IF LABERR CAN HANDLE IT TXC P1,IO.ERR ;[612][405] REMOVE ALL BUT ERROR BITS TXCN P1,IO.ERR ;[612][405] CAN WE GIVE IT TO LABERR? JRST LABER2 ;[405] YES, GO AWAY NEVER TO RETURN... ;[405] ONLY ONE OTHER POSSIBILITY OUTSTR [ASCIZ\?BKPINS Insufficient number of reels specified\] ;[405] OUTSTR CRLF ;[405] MONRT. ;[345] CAN'T SO COMPLAIN JRST NXTT.1 ;[345] ADVENTUROUS USER.. TRY THE OLD WAY ;HERE TO SAVE THE RING HEADER'S POSITION AFTER THE FIRST ERROR NOTEOT: SKIPN P3 ;SEE IF FIRST TIME THRU HRRZ P3,S.MBPT## ;YES--SAVE CURRENT POSITION IN RING ;HERE TO FIND THE BUFFER WHICH HAD THE OUTPUT PROBLEM PUSHJ P,FNDBUF ;FIND THE BUFFER JRST NOFIND ;LOSE ;HERE WHEN PROBLEM BUFFER FOUND FOUND: ANDCAM P1,-1(P2) ;CLEAR ERROR BITS IN BUFFER STATUS WORD TXNE P1,IO.DER!IO.DTE!IO.BKT ;DATA ERRORS? JRST DATERR ;YES NOREPT: SETSTS F.MTAP,.IOBIN ;NO--ONLY EOT, CLEAR STATUS HRRZ P2,(P2) ;FORCE OUT FOLLOWING BUFFER CAME P2,P3 ; UNLESS DONE WITH RING JRST FRCOUT ;FORCE OUT NEXT BUFFER TXNN F,FL$EOV ;WROTE EOV ALREADY? JRST MTASET ;NO JRST NORCOV ;YES DATERR: MOVEI MH,2(P2) ;SET POINTER PUSHJ P,MASTER ;REPORT ERROR MOVE T1,ERRCNT ;GET COUNT OF TAPE ERRORS TXNE P1,IO.EOT ;PASSED EOT? CAIGE T1,EOTEMX ;YES--TIME TO GIVE UP ON REPEATERS? SKIPA ;NO, PROCEED JRST NOREPT ;YES IFN FT$EMX,< CAMGE T1,S.EMAX## ;[506] SEE IF MAXIMUM REACHED JRST CNTOUT ;NO--CONTINUE OUTPUTTING OUTSTR [ASCIZ / ?BKPRTE Reached tape error maximum /] MONRT. ;EXIT TO MONITOR SETZM ERRCNT ;.CONTINUE WILL KEEP TRYING >;END IFN FT$EMX ;READY TO WRITE REPEATER RECORD--WRITE 3 INCHES BLANK TAPE FIRST ;TO PASS BAD SPOT ON TAPE. CNTOUT: MTBLK. F.MTAP, ;WRITE 3 IN. BLANK TAPE SETSTS F.MTAP,.IOBIN ;CLEAR STATUS AFTER WRITING BLANK TAPE ;SEE IF REALLY CAN USE RECOVERY CODE SKIPE (MH) ;SEE IF MONITOR ZEROED BUFFER IN SPITE OF UU.IBC TXNN F,FL$RCV ;OR IF MONITOR DOESN'T SUPPORT UU.SOE JRST MTARST ;NO RECOVERY POSSIBLE ;TO PREVENT RUNNING OFF THE END OF TAPE, WRITE ONLY ONE REPEATER ;OF A BAD RECORD AFTER IO.EOT IS SEEN IFN FT$RCV,< MOVX T1,GF$RPT ;REPEATER FLAG TDNE T1,G$FLAG(MH) ;SEE IF THIS IS A REPEATER TXNN P1,IO.EOT ; AND NEAR END OF TAPE SKIPA ;NO--WRITE A REPEATER RECORD JRST NOREPT ;YES--GIVE UP ON THIS RECORD IORM T1,G$FLAG(MH) ;SET REPEATER FLAG IN RECORD HEADER IFN FT$CHK < PUSHJ P,CHKSUM ;CORRECT CHECKSUM FOR REPEATER RECORD >;END IFN FT$CHK ;CLEAR ALL USE BITS TO INSURE THAT THE REPEATER RECORD IS THE NEXT ;RECORD ACTUALLY OUTPUT TO TAPE FRCOUT: MOVSI T1,(1B0) ;USE BIT MOVE T2,P2 ;WHERE TO START CLRUSE: ANDCAM T1,(T2) ;CLEAR USE BIT HRR T2,(T2) ;GO AROUND RING CAME T2,P2 ;DONE? JRST CLRUSE ;NO MOVSI T1,(BF.VBR) ;[420] SET VIRGIN BUFFER BIT IORM T1,S.MBPT## ;[420] PUT IT INTO BUFFER CONTROL BLOCK OUTPUT F.MTAP, ;[420] INFORM THE MONITOR ;READY TO DO OUTPUT. RESET RING HEADER BYTE POINTER TO FAKE OUT MONITOR HRRM P2,S.MBPT## ;POINT RING HEADER TO ERROR BUFFER MOVEI T1,1(P2) ;PRETEND JUST FINISHED FILLING ADDI T1,MTBBKP ;THIS BUFFER HRRM T1,S.MBPT##+.BFPTR;SET BYTE POINTER SETZM S.MBPT##+.BFCTR ;ZILCH COUNT ;IF THIS OUTPUT WINS, MAKE SURE ALL CURRENTLY FILLED BUFFERS ;IN RING ARE OUTPUT BEFORE FILLING ANY NEW BUFFER. OUT F.MTAP,(P2) ;WRITE REPEATER RECORD JRST BUFOUT ;WON--SEE IF MONITOR HAS CAUGHT UP YET CHKERR: GETSTS F.MTAP,P1 ;[440][407] GET DEVICE STATUS WAIT F.MTAP, ;[440] WAIT FOR I/O TXC P1,IO.ERR ;[612][407] REMOVE ALL BUT ERROR BITS TXCN P1,IO.ERR ;[612][407] SEE IF A TAPE LABEL ERROR OCCURED JRST LABERR ;[407] YES, GO AWAY NEVER TO RETURN... PUSHJ P,FNDBUF ;FIND ERROR BUFFER SKIPA ;LOSE--JUST RESET STATUS AND CONTINUE JRST FOUND ;GO TAKE CARE OF IT SETSTS F.MTAP,.IOBIN ;CLEAR ERROR STATUS ;FALL INTO BUFOUT BUFOUT: HRRZ T2,S.MBPT## ;GET CURRENT BUFFER ADDRESS CAMN T2,P3 ;CAUGHT UP YET TO ORIGINAL POSITION? JRST MTASET ;YES--CAN CONTINUE FILLING BUFFERS ;HERE TO CONTINUE DOING OUTPUT UNTIL MONITOR ADVANCES RING HEADER ;POINTER TO ITS POSITION AFTER THE FIRST ERROR. SETZM S.MBPT##+.BFCTR ;ZERO COUNT MOVEI T1,MTBBKP ;LOAD OUTPUT BLOCK SIZE ADDM T1,S.MBPT##+.BFPTR;INCREMENT BYTE POINTER OUT F.MTAP, ;DO OUTPUT UNTIL CAUGHT UP JRST BUFOUT ;SUCCESSFUL OUTPUT JRST CHKERR ;CHECK ERROR >;END IFN FT$RCV NOFIND: SETSTS F.MTAP,.IOBIN ;[220] CLEAR STATUS & REPORT STRANGE ERROR WARN$ (UOE,Untraceable output error) ;IF END OF SAVE, FORCE OUTPUT OF REMAINING BUFFERS BEFORE CLOSING ;THE CHANNEL TO TAKE ADVANTAGE OF TAPE ERROR RECOVERY CODE. MTASET: TXNN F,FL$END ;SEE IF END OF SAVE SET JRST MTARST ;NO, GO CLEAR RECORD HEADER IFN FT$RCV,< TXNN F,FL$RCV ;SEE IF RECOVERY CODE AVAILABLE JRST NORCOV ;NO GETSTS F.MTAP,T1 ;[440] GET STATUS WAIT F.MTAP, ;[440] WAIT FOR ANY I/O IN PROGRESS TRNE T1,IO.DER!IO.DTE!IO.BKT ;IF DATA ERRORS, JRST NOTEOT ;GO WRITE A REPEATER RECORD TRNN T1,IO.EOT ;[525] EOT? JRST MTAST1 ;[525] NO. PUSHJ P,FNDBUF ;[525] FIND THE BUFFER MARKED WITH EOT SKIPA ;[525] PUZZLING. CAN'T FIND EOT ANDCAM P1,-1(P2) ;[525] CLEAR THE EOT BIT IN BUFFER STATUS WORD SETSTS F.MTAP,.IOBIN ; MUST CLEAR EOT BEFORE DOING OUTPUT MTAST1: MOVSI T1,(1B0) ;[525] USE BIT SKIPN P3 ;FIRST TIME THRU? HRRZ P3,S.MBPT## ;YES--GET CURRENT POSITION MOVE P2,P3 ;WHERE TO START FINRNG: TDNE T1,(P2) ;RECORD OUTPUT TO TAPE YET? JRST FRCOUT ;NO--FORCE OUT HRRZ P2,(P2) ;GO AROUND RING CAME P2,P3 ;DONE? JRST FINRNG ;NO--CONTINUE >;END IFN FT$RCV NORCOV: TXZ F,FL$END ;CLEAR ;HERE TO CLEAR RECORD HEADER OF NEW RECORD MTARST: HRRZ MH,S.MBPT##+.BFPTR;GET NEW BUFFER POINTER ADDRESS ADDI MH,1 ;ADJUST ADDRESS SETZM (MH) ;CLEAR RECORD HEADER MOVSI T1,(MH) ;MAKE BLT POINTER HRRI T1,1(MH) ; ... BLT T1,M-1(MH) ;ZILCH HEADER POPJ P, ;RETURN ;+ ;; END IFN FT$FRS ;[335] DOINPT: TXZE F,FL$INP ;INPUT DONE ALREADY? JRST BUFSTS ;YES IFN FT$EMX,< SKIPLE T1,ERRCNT ;GET CURRENT ERROR COUNT CAMGE T1,S.EMAX## ;[506] SEE IF MAXIMUM REACHED JRST CNTINP ;NO, CONTINUE INPUT OUTSTR [ASCIZ / ?BKPRTE Reached tape error maximum /] MONRT. ;EXIT TO MONITOR SETZM ERRCNT ;.CONTINUE WILL KEEP TRYING >;END IFN FT$EMX CNTINP: SETZM S.MBPT##+.BFCTR ;ZERO HEADER MOVEI T1,MTBFSZ ;LOAD BUFFER SIZE ADDM T1,S.MBPT##+.BFPTR;INCREMENT BYTE POINTER IN F.MTAP, ;[402] EXECUTE IN UUO JRST BUFSTS ;[402] ALL IS OK GETSTS F.MTAP,P1 ;[402] GET FILE STATUS WORD WAIT F.MTAP, ;[612] WAIT UNTIL MOVEMENT HAS SETTLED DOWN TXC P1,IO.ERR ;[612][402] REMOVE ALL BUT ERROR BITS TXCN P1,IO.ERR ;[612][402] SEE IF A TAPE LABEL ERROR JRST LABERR ;[402] YES, GO AWAY NEVER TO RETURN... BUFSTS: MOVE T1,S.MBPT## ;[257] CURRENT BUFFER ADDRESS HRLZI T1,2(T1) ;[257] PLUS TWO HRRI T1,TAPHLD+1 ;[257] AREA FOR SAFEKEEPING BLT T1, ;[257] MOVE DATA HRRZ P2,S.MBPT## ;[257] GET BUFFER ADDRESS MOVE P1,-1(P2) ;GET STATUS FROM BUFFER HEADER MOVEM P1,TAPHLD ;[257] SAVE STATUS BITS TLNN P1,IO.END ;END OF FILE? JRST NIEOF ;NO--SKIP CLOSE F.MTAP, ;YES--CLEAR STATUS TXOE F,FL$EF1 ;ADJUST FLAGS TXO F,FL$EF2 ; ... TXNE F,FL$EF2 ;IF SECOND EOF, MTBSF. F.MTAP, ; BACKSPACE OVER IT POPJ P, ;EOF RETURN NIEOF: MOVEI MH,TAPHLD+1 ;[257] SET BUFFER POINTER MOVEI T1,M(MH) ;POINT TO DATA AREA MOVEM T1,MDATA ;STORE FOR LATER USERS MOVE T1,G$RTNM(MH) ;[311] MOVEM T1,S.NTPE## ;[311] MOVE T1,G$TYPE(MH) ;GET RECORD TYPE CAIE T1,T$EOV ;SEE IF END-OF-VOLUME JRST NOTEOV ;NO, CONTINUE TXNN F,FL$PRN ;[322] FL$PRN SET ALREADY? TXO F,FL$EPR ;[322] NO - FLAG FL$PRN-BY-EOV TXO F,FL$PRN ;[227] FLAG RENAME TXO F,FL$EOV ;FLAG EOV TXNE F,FL$OPN ;SKIP IF NOT WRITING ON DISK PUSHJ P,RSTCK1 ;PRESERVE DISK FILE JFCL ;LOSE (WARNING ISSUED) CLOSE F.MTAP, ;RESET STATUS TXZ F,FL$EF1!FL$EF2!FL$EOV ;RESET EOF BITS PUSHJ P,NEXTAP ;GET NEXT TAPE SETZM PREPPN ;WILL CAUSE PPN TO BE RETYPED SETZM ERRCNT ;CLEAR COUNT OF TAPE ERRORS FOR NEW TAPE TXNE F,FL$KIL ; WAS KILL TYPED? [200] POPJ P, ; YEP - SO EXIT [200] JRST DOINPT ;GO GET NEXT RECORD NOTEOV: TXZ F,FL$EF1!FL$EF2 ;ZERO EOF BITS TRNE P1,IO.DER!IO.DTE!IO.BKT ;SEE IF DATA ERRORS SETSTS F.MTAP,.IOBIN ;CLEAR ERROR STATUS TXNN F,FL$PSI ;SEE IF PSI ENABLED JRST [PUSHJ P,OPRCMD##;NO--HANDLE ANY TTY INPUT TXO F,FL$KIL;HERE IF OPERATOR SAID KILL JRST .+1] ;CONTINUE TXNE F,FL$KIL ;SEE IF OPERATOR SAID KILL POPJ P, ;YES--GIVE ERROR RETURN MOVEI T1,MTBBKP ;INDICATE BACKUP TAPE BLOCK LENGTH MOVE T2,0(MH) ;GET FIRST WORD OF TAPE BLOCK IFE FT$FRS,< ;[335] TDNN T2,[-1,,777760] ;[335] SEE IF BACKUP TRNN T2,000017 ;[335] SKIPA ;[335] >; END IFE FT$FRS ;[335] IFN FT$FRS,< ;[335] TLNN T2,777770 ;SEE IF FRS OR BACKUP >; END IFN FT$FRS ;[335] JRST TSTIBL ;OK--CHECK FOR IBL TXOE F,FL$NBF ;WARNING ISSUED ALREADY? JRST DOINPT ;YES, JUST SKIP THE RECORD WARN$N (NBF,Not BACKUP format) PUSHJ P,MASTRX ;TYPE FILE SPEC JRST DOINPT ;LOOP UNTIL ONE FOUND TSTIBL: TXZ F,FL$NBF ;GOOD--CLEAR FLAG IFN FT$FRS,< ;[335] TLNE T2,-1 ;IF FRS, PUSHJ P,CNVFRS ; GO CONVERT TO BACKUP HEADER >; END IFN FT$FRS ;[335] CAMN T1,S.MBPT##+.BFCTR ;SEE IF CORRECT BLOCK LENGTH JRST TSTCHK ;OK--GO TEST CHECKSUMMING AOS ERRCNT ;STEP COUNT OF TAPE ERRORS WARN$N (IBL,Incorrect block length) PUSHJ P,MASTRX ;TYPE FILE SPEC SKIPN SUSDF ;DOES OLDER FILE EXIST? [206] JRST DOINPT ;NO - SKIP OVER FLAKY DATA [206] POPJ P, ;DONT SUPERSEDE OLD FILE WITH BAD FILE [206] TSTCHK: MOVX T1,GF$NCH ;NO CHECKSUM FLAG TDNN T1,G$FLAG(MH) ;WAS IS CHECKSUMED? JRST CMPCKS ;YES--GO COMPARE CHECKSUMS IFN FT$RCV,< TRNN P1,IO.DER!IO.DTE!IO.BKT ;ANY DATA ERRORS? JRST USEREC ;NO, USE THE RECORD PUSHJ P,RPTNXT ;IS THERE A REPEATER NEXT? SKIPA ; NO [206] JRST DOINPT ;YES--CAN DROP THIS RECORD SKIPN SUSDF ;IS THERE AN OLDER FILE? [206] JRST USEREC ;NO - USE THIS RECORD [206] POPJ P, ;YES - SO DONT SUPERSEDE [206] >;END IFN FT$RCV CMPCKS: MOVE T3,G$CHK(MH) ;GET TAPE CHECKSUM FOR COMPARISON IFN FT$CHK,< PUSHJ P,CHKSUM ;RECOMPUTE CHECKSUM >;END IFN FT$CHK CAMN T3,G$CHK(MH) ;COMPARE JRST USEREC ;MATCH--USE IT IFN FT$RCV,< PUSHJ P,RPTNXT ;REPEATER NEXT? SKIPA ;NO JRST DOINPT ;YES--CAN DROP THIS RECORD >;END IFN FT$RCV WARN$N (CHK,Checksum inconsistency) PUSHJ P,MASCHK ;TELL WHERE SKIPE SUSDF ; SUPERSEDING NOW? [206] POPJ P, ; YES - ABORT TO SAVE OLD FILE [206] ;FALL INTO USEREC ;HERE TO USE THE RECORD POINTED TO BY MH. USEREC: ;[257] USERC1: TRNE P1,IO.DER!IO.DTE!IO.BKT;[257] IF WORD ERRORS, PUSHJ P,MASTER ;REPORT THEM ;HERE TO TEST FOR ENCRYPTION AND DO UNSCRAMBLING. MOVE T1,G$TYPE(MH) ;GET RECORD TYPE CAIN T1,T$FIL ;FILE DATA? SKIPN S.CRYP## ;PASSWORD TYPED? JRST CPOPJ1 ;RETURN NOW MOVEM 7,SAVACS+7 ;SAVE REGISTERS MOVEI 7,SAVACS ; .. BLT 7,SAVACS+6 ; .. MOVE 7,SAVACS+7 ;RESTORE IF NEEDED TXOE F,FL$INI ;INITIALIZED? JRST UNSCRM ;CALL UNSCRAMBLER IFLE F-7,< MOVEM F,SAVACS+F ;STORE NEWLY SET FLAG >;END IFLE F-7 MOVEI 7,S.CRYP## ;ARGS PUSHJ P,CRASZ.## ; .. MOVEM 5,SVCODE ;STORE UNSCRM: MOVSI 7,-200*N ;GET NEGATIVE NBR WORDS HRR 7,MDATA ;WHERE TO FIND THEM MOVE 1,G$LND(MH) ;GET LENGTH OF NON-DATA SECTION HRLS 1 ;PUT IN LEFT HALF ALSO ADD 7,1 ;ONLY DATA IS ENCRYPTED MOVE 6,F$RDW(MH) ;GET RELATIVE DATA WORD ADDI 6,200 ;FORCE OVERFLOW ASH 6,-7 ;GET RELATIVE BLOCK MOVE 5,SVCODE ;GET SEED BACK PUSHJ P,CRYPT.## ;GO TRANSLATE MOVSI 7,SAVACS ;RESTORE REGISTERS BLT 7,7 ; .. JRST CPOPJ1 ;SKIP RETURN ; ; IFN FT$FRS,< ;[335] ;ROUTINE TO CONVERT FRS TAPES TO BACKUP CNVFRS: WARN$ (FRS,FRS tapes not supported) ;***TEMP*** POPJ P, ;***TEMP*** PUSHJ P,SAVE2 ;MAKE SOME EXTRA ROOM TXO F,FL$FRS ;FOR MINOR AFFECTS HANDLED ELSEWHERE STORE T1,FRSHDR,FRSHDE,0 ;CLEAR CONVERSION AREA TRO T2,(GF$NCH) ;SET NO CHECKSUM FLAG HRLZM T2,FRSHDR+G$FLAG;RH(WORD 0) ARE LH FLAGS HLRZM T2,FRSHDR+G$TYPE ;LH(WORD 0) IS RECORD TYPE MOVE T1,1(MH) ;WORD 1 IS MOVEM T1,FRSHDR+G$RTNM ; TAPE COUNTER MOVEI T2,2(MH) ;POINT TO TYPE SPECIFIC REGION MOVE T4,FRSHDR+G$TYPE ;GET TYPE MOVE T4,FRSTBL-1(T4) ;GET POINTER OF WORK TO DO CNVFR1: MOVE T3,(T4) ;GET POINTER FOR TRANSFERS CNVFR2: MOVE T1,(T2) ;GET NEXT INPUT MOVEM T1,FRSHDR(T3) ;STORE IN NEXT OUTPUT AOS T2 ;INCREMENT INPUT AOBJN T3,CNVFR2 ;LOOP OVER CONSECUTIVE STORES AOBJN T4,CNVFR1 ;LOOP OVER ALL STORES MOVSI P2,-FRSDTL ;GET LOOP OF DATES TO CONVERT CNVFR3: MOVE P1,FRSDTM(P2) ;GET NEXT INSTRUCTION HLRZ T2,P1 ;GET ADDRESS OF DATE TRZE T2,1B18 ;CLEAR FLAG TDZA T1,T1 ;CLEAR TIME IF SET MOVE T1,-1(T2) ; ELSE, GET TIME IMULI T1,^D60000 ;CONVERT TIME TO MILLISECONDS SKIPN T2,(T2) ;GET DATE JRST CNVFR4 ;NOT SET--IGNORE PUSHJ P,CONVDT ;CONVERT IT MOVEM T1,FRSHDR(P1) ;STORE RESULT CNVFR4: AOBJN P2,CNVFR3 ;LOOP OVER DATES SKIPE T1,FRSSTK ;GET 7-TRACK FLAG MOVX T1,MT.7TR ;SET FOR MTCHR. LDB T2,[POINTR (FRSSMD,IO.DEN)] ;GET DENSITY DPB T2,[POINTR (T1,MT.DEN)] ;SET FOR MTCHR. MOVEM T1,FRSHDR+S$MTCH ;SET WHERE BACKUP DOES IT MOVE T2,FRSHDR+G$TYPE;GET TYPE CAIE T2,T$FIL ;SEE IF FILE, JRST CNVFR5 ;NO MOVX T1,GF$SOF ;SET START OF FILE FLAG SKIPN FRSRDB ;SEE IF FIRST DATA BLOCK IORM T1,FRSHDR+G$FLAG;SET FLAG IF SO MOVE T1,FRSSDB ;GET NBR SDB JUMPE T1,CNVFIL ;SKIP IF NULL SUBI T1,1 ;CALCULATE G$SIZ IMULI T1,200 ; .. ADD T1,FRSSIZ ;ADD ON SIZE OF LAST BLOCK CNVFIL: MOVEM T1,FRSHDR+G$SIZ ;STORE SKIPE T1,FRSRDB ;GET RELATIVE DATA BLOCK SUBI T1,1 ;CALCULATE RELATIVE DATA WORD IMULI T1,200 ; ... MOVEM T1,FRSHDR+F$RDW;STORE MOVEI T1,177+24(MH) ;POINT TO UFD SUB T1,FRSLVL ;SUBTRACT LEVEL SETZM -1(T1) ;ZILCH ONE HIGHER ;***TEMP*** CREATE ASCIZ NAME CNVFR5: SKIPN T1,FRSSTR ;LOAD FS NAME JRST CNVFR6 ;IF NONE, NOT FILE OR UFD TYPE MOVE T3,[POINT 7,FRSHDR+F$PTH];INITIAL PATH POINTER CAIN T2,T$UFD ;SEE IF UFD TYPE MOVE T3,[POINT 7,FRSHDR+D$STR];CORRECT POINTER MOVEI T2,.FCDEV ;INDICATE DATA TYPE PUSHJ P,SETPTH ;SET IN PATH BLOCK SKIPN T1,FRSPPN ;GET FRS PPN JRST CNVFR6 ;MUST BE UFD TYPE MOVEI T2,.FCDIR ;INDICATE DATA TYPE PUSHJ P,SETPTH ;SET IN PATH BLOCK MOVE T1,FRSNAM ;GET FILE NAME MOVEI T2,.FCNAM ;DAT TYPE PUSHJ P,SETPTH ;STORE MOVE T1,FRSEXT ;EXTENSION MOVEI T2,.FCEXT ;DATA TYPE PUSHJ P,SETPTH ;STORE CNVFR6: MOVEI T1,24(MH) ;SET DATA POINTER MOVEM T1,MDATA ; FOR ALL USERS MOVEI MH,FRSHDR ;POINT TO CONVERTED HEADER MOVEI T1,MTBFRS ;INDICATE FRS BLOCK SIZE POPJ P, ;RETURN ;TABLE OF TRANSLATIONS BY RECORD TYPE FRSTBL: -FRSLLB,,FRSTLB ;1=LABEL -FRSLSS,,FRSTSS ;2=START SAVE SET -FRSLSS,,FRSTSS ;3=END SAVE SET -FRSLFL,,FRSTFL ;4=FILE -FRSLDR,,FRSTDR ;5=DIRECTORY -FRSLJK,,FRSTJK ;6=JUNK -FRSLJK,,FRSTJK ;7=JUNK ;TABLES CONTAINING -NO WORDS (0=1),,ADDRESS TO STORE FRSTLB: ;LABEL L$RLNM ;TAPE REEL NAME -3,,FRSTIM-FRSHDR ;TIME, DATE, DESTROY DATE ;-16 CONTAIN NOTHING FRSLLB==.-FRSTLB FRSTSS: ;START/END SAVE SET -5,,S$BVER+2 ;SYSTEM NAME***TEMP*** S$SVER ;VERSION -2,,S$FMT ;FORMAT VERSION, FRS VERSION -4,,FRSSTM-FRSHDR ;TIME, DATE, MODE, TRACKS S$BVER+1 ;SAVE SET NAME***TEMP*** S$DEV ;DEVICE ;-4 CONTAIN NOTHING FRSLSS==.-FRSTSS FRSTFL: ;FILE -5,,FRSSTR-FRSHDR ;STR, NAME, EXT, PPN, REL DATA BLK G$CHK ;CHECKSUM -3,,FRSSDB-FRSHDR ;BLKS IN REC, WRDS IN L.BLK, LVL ;-11 CONTAIN NOTHING FRSLFL==.-FRSTFL FRSTDR: ;DIRECTORY FRSSTR-FRSHDR ;UFD STRUCTURE D$LVL ;DIRECTORY LEVEL ;-20 CONTAIN NOTHING FRSLDR==.-FRSTDR FRSTJK: ;UNKNOWN TYPE -22,,G$FLAG+1 ;STRAIGHT TRANSLATION FRSLJK==.-FRSTJK ;TABLE OF DATE CONVERSIONS ;FORMAT: BYTE (1)NO TIME (17)SOURCE DATE (18) RESULT FRDUM1==0B18+FRSDAT ;[330] FRDUM2==1B18+FRSDSD ;[330] FRDUM3==0B18+FRSSDT ;[330] FRSDTM: BYTE (18)FRDUM1 (18)L$DATE ;[330]LABEL CREATION BYTE (18)FRDUM2 (18)L$DSTR ;[330]DESTROY DATE BYTE (18)FRDUM3 (18)S$DATE ;[330]SAVE SET DATE FRSDTL==.-FRSDTM >; END IFN FT$FRS ;[335] ;+ ;;END IFN FT$CHK ;+ ;; END IFN FT$FRS ;[335] IFE FT$FRS,< ;[335] TDNN T2,[-1,,777760] ;[335] SEE IF BACKUP TRNN T2,000017 ;[335] >; END IFE FT$FRS ;[335] POPJ P, ;NO GOOD--GIVE BAD RETURN MOVEI T1,MTBBKP ;BACKUP BUFFER SIZE IFN FT$FRS,< ;[335] TLNE T2,-1 ;SEE IF FRS MOVEI T1,MTBFRS ;LOAD FRS BUFFER SIZE >; END IFN FT$FRS ;[335] HRRZ T2,-1(P1) ;[353] LEFT HALF IS BOOKKEEPING STUFF CAME T1,T2 ;[353] CHECK BUFFER COUNT POPJ P, ;NO GOOD--GIVE BAD RETURN MOVX T1,GF$RPT ;REPEATER FLAG TDNN T1,G$FLAG(P1) ;[321] SEE IF ON POPJ P, ;RETURN MOVE T1,F$RDW(P1) ;[321] GET REPEATER'S RDW CAMN T1,F$RDW(MH) ;[321] MATCHES THE OTHER BUFFER? AOS (P) ;[321] YES - ADVANCE RETURN POPJ P, ;[321] RETURN >;END IFN FT$RCV ;+ ;) ;[254] OUTPUT UUO SETZ T2, ;[254] ZERO C(T2) EXCH T2,DSKHDR+.BFCTR;ZERO BYTE COUNT ALTDSK: ADDM T2,DSKHDR+.BFPTR;INCREMENT BYTE POINTER XCT T1 ;[254] DO OUT UUO JRST DSKSET ;OK GETSTS FILE,T1 ;[440] GET ERROR STS WAIT FILE, ;[440] WAIT FOR I/O TO CEASE TRNE T1,IO.DER!IO.BKT!IO.DTE ;[276] DATA ERRORS? JRST DSKOU1 ;[276] YES TRNE T1,IO.EOF ;SKIP IF NOT EOF JRST CPOPJ1 ;RETURN DSKOU1: WARN$N (DOE,Disk output error) ;[254] [276] PUSHJ P,OCTOUT ;TYPE STATUS OUTSTR [ASCIZ / during/] ;TELL WHEN SAVE$ P1 ;SAVE C(P1) MOVEI P1,EXLFIL ;ADDRESS OF LOOKUP/ENTER BLOCK PUSHJ P,GUUO ;TYPE OUT RSTR$ P1 ;RESTORE C(P1) POPJ P, ;RETURN DSKSET: PUSHJ P,DSKBLK ;CALCULATE # OF BLOCKS IN THIS BUFFER (NDBLIB) HRRZ DBUF,DSKHDR+.BFPTR;FIRST DATA WORD MINUS ONE AOJA DBUF,CPOPJ2 ;RETURN DSKIN: SETZ T2, ;[254] ZERO C(T2) EXCH T2,DSKHDR+.BFCTR ;[254] ZERO BYTE COUNT ADDM T2,DSKHDR+.BFPTR ;[254] INCREMENT BYTE POINTER IN FILE,0 ;[254] DO IN UUO JRST DSKSE1 ;[254] OK GETSTS FILE,T1 ;[440][254] GET ERROR STATUS WAIT FILE, ;[440][254] WAIT FOR I/O TO CEASE TRNE T1,IO.EOF ;[254] SKIP IF NOT EOF JRST CPOPJ1 ;[254] RETURN MOVE T2,DSKHDR+.BFADR ;[254] GET CURRENT BUFFER MOVE T3,-1(T2) ;[254] GET ITS STATUS BITS ANDI T3,IO.ERR ;[254] ANY ERRORS HERE? JUMPN T3,DSKSE2 ;[254] YES TRO T1,IO.SYN ;[254] NO, SET IO.SYN--ERROR FURTHER ON SETSTS FILE,(T1) ;[254] SET IN STATUS BITS JRST DSKSE1 ;[254] CONTINUE AS IF OK DSKSE2: SAVE$ T1 ;[254] SAVE STATUS FOR ERROR MSG TRZ T1,(T3) ;[254] IN STS, TURN OFF ERROR FOR THIS BUF TRNN T1,IO.ERR ;[254] ANY ERRORS LEFT? TRZA T1,IO.SYN ;[254] ALL CLEAR--CLEAR IO.SYN TRO T1,IO.SYN ;[254] NOT ALL CLEAR, SET IO.SYN SETSTS FILE,(T1) ;[254] SETSTS TO CLEAR ;[254] SPECIAL CASE FOR IO.IMP: ;[254] ALL OTHER ERRORS ARE IN ONLY ONE BUFFER, BECAUSE DEVICE STOPS ;[254] AFTER ERROR, BUT IO.IMP PROPOGATES INTO ALL OTHER BUFFERS ;[254] READ BY THE MONITOR AT THIS READ. (THESE HAVE THE USE BITS ON.) ;[254] IO.IMP IS THE ERROR FOR CHECKSUM ERRORS. TRNN T3,IO.IMP ;[254] WAS IT IO.IMP? JRST DSKSE3 ;[254] NO - CONTINUE DSKSE4: SKIPL T2,(T2) ;[254] TO NEXT BUFFER JRST DSKSE3 ;[254] NOT IN USE--CONTINUE MOVE T1,-1(T2) ;[254] GET STATUS WORD TRZN T1,IO.IMP ;[254] IO.IMP ON? JRST DSKSE3 ;[254] NO--DONE MOVEM T1,-1(T2) ;[254] YES, TURN IT OFF JRST DSKSE4 ;[254] LOOP THROUGH BUFFER RING DSKSE3: WARN$N (DIE,Disk input error) ;[254] RSTR$ T1 ;[254] GET ORIGINAL STATUS WORD BACK PUSHJ P,OCTOUT ;[254] PRINT IT OUTSTR [ASCIZ / (block=/] ;[254] MOVE T1,THSRDB ;[254] GET BLOCK NUMBER ADDI T1,2 ;[254] PLUS TWO TO CURRENT BLOCK PUSHJ P,DECOUT ;[254] PRINT IT OUTCHR [")"] ;[254] CLOSE PARENTHESIS OUTSTR [ASCIZ / during/] ;[254] SAVE$ P1 ;[254] SAVE C(P1) MOVEI P1,EXLFIL ;[254] GET FILE SPEC PUSHJ P,GUUO ;[254] PRINT IT RSTR$ P1 ;[254] RESTORE C(P1) HRRZ DBUF,DSKHDR+.BFPTR ;[254] PUSHJ P,DSKBLK ;[613] CALCULATE NUMBER OF BLOCKS IN THIS BUFFER AOS DBUF ;[254] POPJ P, ;[254] RETURN DSKSE1: PUSHJ P,DSKBLK ;CALCULATE # OF BLOCKS IN THIS BUFFER (NDBLIB) HRRZ DBUF,DSKHDR+.BFPTR ;[254] AOJA DBUF,CPOPJ2 ;[254] RETURN ;+ ; PUSHJ P,LSTMSG ;SEND TO FILE ;HERE TO LIST THE THIRD LINE OF THE SAVE SET HEADER LDB T1,[POINTR (S$MTCH(MH),MT.DEN)] ;GET DENSITY BYTE MOVE T1,DNSTBL(T1) ;GET ADDRESS OF DENSITY STRING PUSHJ P,LSTMSG ;SEND TO FILE MOVEI CH,"9" ;ASSUME 9 TRACK MOVEI T1,MT.7TR ;SEE IF SEVEN TRACK TDNE T1,S$MTCH(MH) ;SKIP IF OFF MOVEI CH,"7" ;LOAD ASCII SEVEN PUSHJ P,LSTOUT ;SEND MOVEI T1,[ASCIZ / track /] PUSHJ P,LSTMSG ;SEND MOVE T1,S$DATE(MH) ;GET DATE/TIME IN UNIVERSAL FORMAT PUSHJ P,CONTDT ;CONVERT TO SYSTEM FORMAT PUSH P,T1 ;SAVE TIME FOR LATER MOVE T1,T2 ;GET DATE PUSHJ P,LSTDAT ;LIST DATE MOVEI CH," " ;SPACE PUSHJ P,LSTOUT ;SEND POP P,T1 ;GET TIME BACK PUSHJ P,LSTTIM ;LIST TIME MOVEI T1,[ASCIZ / BACKUP /] PUSHJ P,LSTMSG ;SEND TO FILE MOVE P1,S$BVER(MH) ;GET VERSION PUSHJ P,LSTVER ;TYPE VERSION MOVEI T1,[ASCIZ / tape format /] ; .. PUSHJ P,LSTMSG ; .. MOVE T1,S$FMT(MH) ;GET FORMAT PUSHJ P,LSTDEC ;TYPE DECIMAL MOVEI T1,CRLF ;SEND CR-LF PUSHJ P,LSTMSG ;SEND TO FILE ;HERE TO LIST THE FOURTH LINE OF THE SAVE SET HEADER MOVEI T1,[ASCIZ /Tape number /] PUSHJ P,LSTMSG ;SEND MOVE T1,S.NTPE## ;[311] PUSHJ P,LSTDEC ;SEND MOVEI T1,[ASCIZ / ********************************************************************** /] MOVEI T2,T$CON ;ASTERISK OFFSET FOR CONTINUATION HEADER CAMN T2,G$TYPE(MH) ; ... PUSHJ P,LSTMSG ;SEND ASTERISK LINE MOVEI T1,CRLF ;SEND ONE CR-LF PUSHJ P,LSTMSG ;SEND TO FILE MOVEI T1,CRLF ;FINISH WITH SECOND CR-LF JRST LSTMSG ;SEND TO FILE ;+ ;" ; .. PUSHJ P,LSTOUT ; .. LSTFCD: PUSHJ P,LSTTAB ;TAB OVER MOVE T1,A$WRIT(P1) ;GET DATE/TIME PUSHJ P,CONTDT ;CONVERT TO SYSTEM FORMAT MOVE T1,T2 ;GET DATE PUSHJ P,LSTDAT ;LIST DATE PUSHJ P,LSTTAB ;[512] ADJUST LISTING PUSH P,P1 ;[512] SAVE P1 SKIPE P1,A$VERS(P1) ;[512] IS THERE A VERSION NUMBER? PUSHJ P,LSTVER ;[512] YES. GO LIST IT POP P,P1 ;[512] RESTORE P1 JUMPE P2,LSTFLX ;BRANCH IF NO STR-PATH CHANGE SKIPE S.INTR## ;SEE IF /INTERCHANGE JRST LSTFLX ;SKIP PATH INFO IF SO ;HERE TO LIST THE FULL FILE PATH PUSHJ P,LSTTAB ;TAB OVER MOVE T1,LSTSTR ;GET STR NAME PUSHJ P,LST6 ;SEND TO FILE MOVEI CH,":" ;END OF STR PUSHJ P,LSTOUT ;SEND TO FILE PUSHJ P,LSTTAB ;TAB OVER MOVEI CH,"[" ;START OF PATH PUSHJ P,LSTOUT ;SEND TO FILE HLRZ T1,LSTPTH ;GET PROJECT PUSHJ P,LSTOCT ;SEND TO FILE MOVEI CH,"," ;COMMA PUSHJ P,LSTOUT ;SEND TO FILE HRRZ T1,LSTPTH ;GET PROGRAMMER PUSHJ P,LSTOCT ;SEND TO FILE MOVE P2,[XWD -.FXLND+1,LSTPTH+1] ;[366] GET ADDRESS OF SFD NAMES ;[366] AND LENGTH SFDLST: SKIPN T1,(P2) ;SEE IF ONE IS THERE JRST CLSPTH ;BRANCH IF DONE MOVEI CH,"," ;LOAD COMMA PUSHJ P,LSTOUT ;SEND TO FILE PUSHJ P,LST6 ;SEND SFD NAME TO FILE AOBJN P2,SFDLST ;[366] CONTINUE UNLESS HIT MAX CLSPTH: MOVEI CH,"]" ;END OF PATH PUSHJ P,LSTOUT ;SEND TO FILE LSTFLX: MOVEI T1,CRLF ; JRST LSTMSG ;SEND TO FILE SUBTTL DATE CONVERSION SUBROUTINES ;+.CHAPTER DATE CONVERSION SUBROUTINES ;- RADIX 10 ;***NOTE WELL*** ;+ ;*365+<1964-1859>/4+<31-18>+31(T2) ;T4=DAYS BEFORE JAN 1,1964 +SINCE JAN 1 ; +ALLOWANCE FOR ALL LEAP YEARS SINCE 64 MOVE T2,T1 ;RESTORE YEARS SINCE 1964 IMULI T2,365 ;DAYS SINCE 1964 ADD T4,T2 ;T4=DAYS EXCEPT FOR 100 YR. FUDGE HRREI T2,64-100-1(T1) ;T2=YEARS SINCE 2001 JUMPLE T2,GETNW1 ;ALL DONE IF NOT YET 2001 IDIVI T2,100 ;GET CENTURIES SINCE 2001 SUB T4,T2 ;ALLOW FOR LOST LEAP YEARS CAIE T3,99 ;SEE IF THIS IS A LOST L.Y. GETNW1: ADD T4,P1 ;ALLOW FOR LEAP YEAR THIS YEAR CAILE T4,^O377777 ;SEE IF TOO BIG GETNW2: SETOM T4 ;YES--SET -1 RSTR$ T1 ;GET MILLISEC TIME MOVEI T2,0 ;CLEAR OTHER HALF ASHC T1,-17 ;POSITION DIV T1,[24*60*60*1000] ;CONVERT TO 1/2**18 DAYS HRL T1,T4 ;INCLUDE DATE POPJ P, ;RETURN ;+ ;*365+<1857-1500>/4-<1857-1500>/100+<1857-1500>/400+31+28+31+30+31+30+31+31+30+31+17 ;T1=DAYS SINCE JAN 1, 1501 IDIVI T1,400*365+400/4-400/100+400/400 ;SPLIT INTO QUADRACENTURY LSH T2,2 ;CONVERT TO NUMBER OF QUARTER DAYS IDIVI T2,<100*365+100/4-100/100>*4+400/400 ;SPLIT INTO CENTURY IORI T3,3 ;DISCARD FRACTIONS OF DAY IDIVI T3,4*365+1 ;SEPARATE INTO YEARS LSH T4,-2 ;T4=NO DAYS THIS YEAR LSH T1,2 ;T1=4*NO QUADRACENTURIES ADD T1,T2 ;T1=NO CENTURIES IMULI T1,100 ;T1=100*NO CENTURIES ADDI T1,1501(T3) ;T1 HAS YEAR, T4 HAS DAY IN YEAR MOVE T2,T1 ;COPY YEAR TO SEE IF LEAP YEAR TRNE T2,3 ;IS THE YEAR A MULT OF 4? JRST CNTDT0 ;NO--JUST INDICATE NOT A LEAP YEAR IDIVI T2,100 ;SEE IF YEAR IS MULT OF 100 SKIPN T3 ;IF NOT, THEN LEAP TRNN T2,3 ;IS YEAR MULT OF 400? TDZA T3,T3 ;YES--LEAP YEAR AFTER ALL CNTDT0: MOVEI T3,1 ;SET LEAP YEAR FLAG ;T3 IS 0 IF LEAP YEAR SUBI T1,1964 ;SET TO SYSTEM ORIGIN IMULI T1,31*12 ;CHANGE TO SYSTEM PSEUDO DAYS JUMPN T3,CNTDT2 ;IF NOT LEAP YEAR, PROCEED CAIGE T4,31+29 ;LEAP YEAR--SEE IF BEYOND FEB 29 JRST CNTDT5 ;NO--JUST INCLUDE IN ANSWER SOS T4 ;YES--BACK OFF ONE DAY CNTDT2: MOVSI T2,-11 ;LOOP FOR 11 MONTHS CNTDT3: CAMGE T4,MONTAB+1(T2) ;SEE IF BEYOND THIS MONTH JRST CNTDT4 ;YES--GO FINISH UP ADDI T1,31 ;NO--COUNT SYSTEM MONTH AOBJN T2,CNTDT3 ;LOOP THROUGH NOVEMBER CNTDT4: SUB T4,MONTAB(T2) ;GET DAYS IN THIS MONTH CNTDT5: ADD T1,T4 ;INCLUDE IN FINAL RESULT CNTDT6: EXCH T1,(P) ;SAVE ANSWER, GET TIME TLZ T1,-1 ;CLEAR DATE MUL T1,[24*60*60*1000] ;CONVERT TO MILLI-SEC. ASHC T1,17 ;POSITION RESULT POP P,T2 ;RECOVER DATE POPJ P, ;RETURN MONTAB: EXP 0,31,59,90,120,151,181,212,243,273,304,334,365 RADIX 8 ;***NOTE WELL*** SUBTTL FILE VERIFICATION SUBROUTINES ;+ ;.CHAPTER FILE VERIFICATION ROUTINES ;- ;+ ; POPJ P, ;AND RETURN ;+ ; POPJ P, ;RETURN ;+ ; POPJ P, ;THAT'S ALL ;+ ; POPJ P, ;RETURN ;+ ; ;SAVE ALL TEMP ACS PUSHJ P,OPRCMD## ;SERVICE TTY INPUT TXO F,FL$KIL ;RETURN HERE IF OPERATOR SAID KILL RSTR$ ;RESTORE ALL TEMP ACS DEBRK. ;DISMISS INTERUPT HALT TTYSER ;ERROR RETURN HALT TTYSER ;UNIMPLEMENTED RETURN ;+ ;;END IFN FT$IND RSMERR: WARN$ (RIC,Resume at invalid checkpoint attempted) SETZM S.RSUM## ;ZILCH ;FALL INTO EAFIL EAFIL: PUSHJ P,SAVE1 MOVEI P1,EXLFIL WARN$N (ABT,Abort) JRST GUUO ERFIL: PUSHJ P,SAVE1 ;[260] SAVE P1 MOVEI P1,EXLFIL ;[260] GET FILE SPECS WARN$N (FRE,File RENAME error) ;[260] GIVE MESSAGE JRST EGUUO ;[260] PRINT OTHER INFO ELUFD: PUSHJ P,SAVE1 MOVEI P1,EXLUFD JRST LMSG ELFIL: PUSHJ P,SAVE1 MOVEI P1,EXLFIL LMSG: HRRZ T1,.RBEXT(P1) ;LOAD ERROR CODE LDB T2,[POINTR (.FXMOD(SP), FX.PRT)] CAIN T1,2 ;PROTECTION FAILURE? JUMPN T2,CPOPJ ;IF /OKPROTECTION DON'T MUMBLE WARN$N (FLE,File LOOKUP error) JRST EGUUO EEUFD: PUSHJ P,SAVE1 MOVEI P1,EXLUFD JRST EMSG EEFIL: PUSHJ P,SAVE1 MOVEI P1,EXLFIL EMSG: HRRZ T1,.RBEXT(P1) ;LOAD ERROR CODE LDB T2,[POINTR (.FXMOD(SP), FX.PRT)] CAIN T1,2 ;PROTECTION FAILURE? JUMPN T2,CPOPJ ;IF /OKPROTECTION DON'T MUMBLE WARN$N (FEE,File ENTER error) EGUUO: HRRZ T1,.RBEXT(P1) ;GET ERROR CODE PUSHJ P,OCTOUT ;TYPE IT HRRZ T2,.RBEXT(P1) ;GET ERROR CODE AGAIN CAIL T2,ERRLTH ;RANGE CHECK JRST GUUO ;OUT OF RANGE, SKIP ABREV OUTCHR LPAREN ROT T2,-1 ;GET ABREVIATION FROM TABLE MOVE T1,ERRTBL(T2) ; .. TLNE T2,(1B0) MOVSS T1 HLLZS T1 PUSHJ P,SIXOUT OUTCHR RPAREN GUUO: OUTCHR SPACE MOVE T1,CSTR SKIPL S.OPER## MOVE T1,ACSTR CAIN P1,S.LENT## ;[307] LIST-FILE ERROR? MOVE T1,S.LIST+.FXDEV ;[307] YES, USE LIST DEVICE PUSHJ P,SIXOUT OUTCHR COLON HLRZ T1,.RBEXT(P1) CAIE T1,'UFD' JRST NOTUFD HLRZ T1,.RBNAM(P1) PUSHJ P,OCTOUT OUTCHR COMMA HRRZ T1,.RBNAM(P1) PUSHJ P,OCTOUT JRST JOIN1 NOTUFD: MOVE T1,.RBNAM(P1) PUSHJ P,SIXOUT JOIN1: HLLZ T1,.RBEXT(P1) JUMPE T1,JOIN2 OUTCHR DOT PUSHJ P,SIXOUT JOIN2: SKIPE S.INTR## JRST EDONE+1 OUTCHR LBR ;[244] HLRZ T1,.RBPPN(P1) ;[244] JUMPE T1,JOIN3 ;[244] PUSHJ P,OCTOUT OUTCHR COMMA HRRZ T1,.RBPPN(P1) PUSHJ P,OCTOUT EDONE: OUTCHR RBR OUTSTR CRLF POPJ P,0 JOIN3: HRRZ P1,.RBPPN(P1) HLRZ T1,2(P1) PUSHJ P,OCTOUT OUTCHR COMMA HRRZ T1,2(P1) PUSHJ P,OCTOUT JOIN4: SKIPN T1,3(P1) JRST EDONE OUTCHR COMMA PUSHJ P,SIXOUT AOJA P1,JOIN4 SAVE1: EXCH P1,(P) PUSH P,.+3 HRLI P1,-1(P) JRA P1,(P1) CAIA . AOS -1(P) JRST POP1 SAVE2: EXCH P1,(P) PUSH P,P2 PUSH P,.+3 HRLI P1,-2(P) JRA P1,(P1) CAIA . AOS -2(P) JRST POP2 SAVE3: EXCH P1,(P) PUSH P,P2 PUSH P,P3 PUSH P,.+3 HRLI P1,-3(P) JRA P1,(P1) CAIA . AOS -3(P) JRST POP3 SAVE4: EXCH P1,(P) PUSH P,P2 PUSH P,P3 PUSH P,P4 PUSH P,.+3 HRLI P1,-4(P) JRA P1,(P1) CAIA . AOS -4(P) POP4: POP P,P4 POP3: POP P,P3 POP2: POP P,P2 POP1: POP P,P1 POPJ P,0 CPOPJ2: AOS (P) CPOPJ1: AOS (P) CPOPJ: POPJ P,0 ERRTBL: SIXBIT /FNFIPP/ SIXBIT /PRTFBM/ SIXBIT /AEFISU/ SIXBIT /TRNNSF/ SIXBIT /NECDNA/ SIXBIT /NSDILU/ SIXBIT /NRMWLK/ SIXBIT /NETPOA/ SIXBIT /BNFNSD/ SIXBIT /DNESNF/ SIXBIT /SLELVL/ SIXBIT /NCESNS/ SIXBIT /FCULOH/ ERRLTH==<.-ERRTBL>*2 MONTBL: ASCIZ /-Jan/ ASCIZ /-Feb/ ASCIZ /-Mar/ ASCIZ /-Apr/ ASCIZ /-May/ ASCIZ /-Jun/ ASCIZ /-Jul/ ASCIZ /-Aug/ ASCIZ /-Sep/ ASCIZ /-Oct/ ASCIZ /-Nov/ ASCIZ /-Dec/ DOT: "." COLON: ":" COMMA: "," LPAREN: "(" RPAREN: ")" LBR: "[" RBR: "]" TAB: EXP .CHTAB SPACE: EXP " " CRLF: BYTE(7).CHCRT,.CHLFD,0 ;&.DO INDEX END ;&.SKIP2;[^END OF