TITLE DIRECT %7A(502) DIRECTORY LISTING CUSP SUBTTL P.CONKLIN/PFC/JBC/DCE/MD/JEF/LLN/LCR/MHK/WCL/RDH 19-JAN-87 SEARCH JOBDAT, MACTEN, UUOSYM ;STANDARD DEFINITIONS SEARCH SWIL ;SWIL PACKAGE DEFINITIONS .REQUE REL:SWIL ;SWIL PACKAGE ROUTINES SALL ;PRETTY LISTINGS .DIREC FLBLST ;PRETTIER LISTINGS TWOSEG 400000 COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1984,1987. ALL RIGHTS RESERVED. \;END OF COPYRIGHT MACRO COMMENT \ DIRECT -- Perform directory listings ;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1984,1987. ALL RIGHTS RESERVED. ; ; ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ONLY ;IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF ;THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER COPIES THEREOF MAY ;NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE ;TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED. ; ;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND ;SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. ; ;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. \ ;DIRECT VERSION IDENTIFICATION MAJVER==7 ;MAJOR VERSION LEVEL MINVER==1 ;MINOR (MAINTENANCE RELEASE) LEVEL CSTVER==0 ;CUSTOMER VERSION (WHO LAST . . .) EDTVER==503 ;EDIT LEVEL %%DIRE==: IF2,< PURGE CSTVER,MAJVER,MINVER,EDTVER> SUBTTL TABLE OF CONTENTS ; TABLE OF CONTENTS FOR DIRECT ; ; ; SECTION PAGE ; 1. REVISION HISTORY...................................... 4 ; 2. STANDARD MNEMONICS--REGISTERS, BITS, UUOS............. 7 ; 3. INITIALIZE............................................ 13 ; 4. MAIN LOOP FOR COMMAND SCANNING........................ 14 ; 5. FILL IN DEFAULTS AFTER COMMAND SCANNING............... 16 ; 6. PERFORM ONE DISK DIRECTORY LISTING.................... 21 ; 7. PERFORM MAG TAPE DIRECTORY LISTING.................... 25 ; 8. PERFORM MAG TAPE DIRECTORY LISTING--BACKUP/RESTORE.... 34 ; 9. PERFORM MAG TAPE DIRECTORY LISTING--FAILSAFE.......... 38 ; 10. PERFORM MAG TAPE DIRECTORY LISTING--SUBROUTINES....... 43 ; 11. ROUTINE FOR DISK AND MAGTAPE DIRECTORY LINE........... 47 ; 12. PERFORM DECTAPE DIRECTORY LISTING..................... 72 ; 13. PERFORM TMPCOR DIRECTORY LISTING...................... 75 ; 14. MISC. DIRECTORY SUBROUTINES........................... 77 ; 15. SUBROUTINES FOR LISTING OUTPUT........................ 84 ; 16. STORAGE............................................... 102 SUBTTL REVISION HISTORY ;%1 -- 6/71 WITH 5.03 MONITOR ;A) REARRANGE TO USE SCAN.MAC AND ELIMINATE THE ; BUILT IN SCANNER. THIS GIVES INDIRECT FILES AND ALL ; THE SCAN IMPROVEMENTS OVER SCANER. ;B) EXPAND TOTAL LINE TO INCLUDE NUMBER OF LOOKUP FAILURES ;C) FIX BUG ASSOCIATED WITH SYS: AND + UNDER 5.03 ;D) EXPAND TO HANDLE SUB-FILE DIRECTORIES. ;E) REARRANGE TO USE REVAMPED LOKWLD (WILD) ;F) IN /SORT, GIVE DATES AS " YYYYMMDD" ;G) IN /SORT, LIST DIRECTORY IF AND ONLY IF THE REQUEST HAS ; WILD CARDS IN THE DIRECTORY ;H) IN /WIDTH, LIST STR OR DIRECTORY AS A SEPARATE LINE ;I) IN /SORT, LIST STR IF AND ONLY IF DSK OR WILDCARDS ;J) CHANGE DTA TO USE 300 MODE ;K) ADD SWITCH /WORDS TO PRINT DISK LENGTHS IN WORDS NOT BLOCKS ;L) IF MAG TAPE, INTERPRET FAILSAFE TAPE AS DISK DIRECTORY ;M) OUTPUT VERSION IN FRONT OF STRUCTURE AND DIRECTORY ;N) OUTPUT SPOOLED NAME (IF NON-ZERO) AT RIGHT END ;O) /F/SUM WILL GIVE FAST LIST PLUS A SUMMARY ;P) ADD FREE SPACE TO TMP: DIRECTORY ;Q) /DETAIL WILL GIVE A LISTING LIKE LOOKFL DID (IE, ALL INTERESTING ; ITEMS FROM THE EXTENDED LOOKUP ;R) SUPPORT /DENSITY, /PROTECT, /PARITY SWITCHES FROM SCAN ;S) DETECT ANSI-LIKE LABELS AND BACKUP TAPES ;T) CORRECT A BUG WHICH GAVE EXTRA NON-EX. MESSAGES ;U) ADD SUBTOTALS FOR EACH DIRECTORY AND STRUCTURE ;V) INCLUDE CHECKSUM IN TOTALS ;W) SUPPORT /BEFORE AND /SINCE ;X) ADD /MARKS ;Y) HANDLE + ON MTA, DTA, TMPCOR ;Z) USE VERSION FROM RIB IF PRESENT. IN /DETAIL, GIVE BOTH IF ; DIFFERENT. ;AA) REMOVE 'UFD' IN REGULAR LISTING SO COLUMNS LINE UP. ;AB) USE 317 MODE ON DECTAPES. ;AC) EXPAND ALL TABS IN /SORT MODE ;AD) FIX TYPE/LIST LOGIC TO NOT TYPE TITLES, OR DOUBLE TYPE SUMMARIES. ;AE) FIX BUG TO CORRECTLY SUPPRESS TRAILING TABS. ;%2(125) -- 5/72 WITH SCAN AND WILD ;126 (7613) LIST DIRECTORIES IF WILD AND /SORT ;127 MOVE SWITCHES AIMED AT F TO WORD FLAGS FOR SCAN %3 ; ALSO MOVE S.LODV AND S.TITL TO S.MIN AREA. ;130 CALL .OSCAN TO IMPLEMENT USER OPTIONS ; ALSO ADD /NORMAL TO OVERRIDE /FAST IN OPTIONS FILE ;131 (8314) SUMMARY OF LOOKUP ERRORS WAS PREMATURE ;132 (8280) DIRECTORY CHECKSUMS WERE INCORRECT IN SUMMARY ;133 (QAR 149) NEEDED 3 EOFS TO END MAG TAPE ;134 (7635) CORRECT MAG TAPE SUB-TOTALS TO COME AT RIGHT TIME ;135 HANDLE FILE NOT MATCHING ON MAG TAPE ;136 OUTPUT RIB INTERNAL FORMAT CREATION TIME IN HUMAN TERMS ;137 (7613) IF /SORT, LIST DIRECTORIES AS 2*6 DIGITS ;140 CORRECT FORMATTING ERROR IN FIXED FORMAT OCTAL 7. ;141 ADD /NOREWIND, /NOEOT, /FILES:N (QAR 177) ;142 FIX /MARKS TO INDICATE LAST EOF AS WELL (IE, EOT) ;143 CORRECT NULL DEVICE BUG INTRODUCED BY 127. ;144 CORRECT INF.0 BUG INTRODUCED BY 140. ;145 RESTORE .JBFF EACH OPEN. ALSO USE 10. BUFFER RING ON DISK INPUT ;146 ADD /NOSUMMARY, /NODETAIL, AND /NOUNITS. ;147 IF /DETAIL/SUMMARY, DO BOTH. IF /NOSUM NEVER GIVE ONE. IF ; /NOUNITS, ALWAYS GIVE STR. ;150 IF /SORT, ALLOCATE 15 COLUMNS FOR VERSION ;151 /SORT OF MTA FAILED TO INCLUDE STRUCTURE ;152 IF /SUM, ALWAYS INCLUDE SUMMARIES ;%3(152) 12/72 ;153 (10-9943) GET LAST SUB-TOTAL ;154 (10-10979) AVOID ILL UUO ON SOME COMMAND ERRORS ;155 (10-10590) AVOID "NO FILES" ON MTA:/F ;156 MTA BUFFER HEADER INDICATED LENGTH WAS 2 TOO BIG ;157 DEFAULT /OKPROT IF WILDCARDS IN UFD ;160 IF OUTPUT NOT TO TTY:, FORCE ALL SUMMARIES ;161 (10-9981) REJECT NUL: GRACEFULLY IN 5.07 ;162 SUPPORT DATE75 ;163 HANDLE INDEFINITE NUMBER OF INPUT FILES IN SPEC ;164 STANDARDIZE ERROR MESSAGES ;165 CHANGE TO USE .STOPN TO SUPPORT OUTPUT SFD ;166 GIVE RIGHT MESSAGE ON MTA ERRORS ;167 HANDLE NULL COMMAND (BUG IN EDIT 163) ;170 FIX BUG IN 155 ;171 (10-XXXX) PRINT LH(.RBELB) AS CONI IN OCTAL ;172 PICK UP 507 MTCHR. DATA ON TAPES ;173 (10-10324) USE % PREFIX ON FILE NOT FOUND ;174 (10-11580) ADD /AUTHOR /PRDIRECTORY /PRDEVICE ;175 SUPPRESS TOTAL OF 0 FILES MESSAGE ;176 FIX BUGS IN EDIT 162 ;177 FIX FORMAT BUG IN 173 ;200 (10-11,233) PRINT RIB BLOCK NUMBER IN /DETAIL ;201 COUNT BLOCKS ON DTA FOR /SUM LINE ;202 SUPPRESS TITLES ON DTA, TMP LISTINGS ;203 COMMENT OUT BACKUP/RESTORE CODE ;204 USE C,SCNMAC AS UNIVERSALS ;205 PRINT SUMMARIES BEFORE SUBSEQUENT ERROR MESSAGES ;206 PRINT UFD NAME AS [P,PN] IN FILE READING ERROR MESSAGE ;207 LIST SFD CONTENTS AFTER DIRECTORY CONTAINING SFD ;210 EXTEND 164 TO SUPPORT /MESSAGE LEVEL ;211 REMOVE BUG OF LISTING [,,SFD] TWICE ;212 IN /F WITHOUT /W, GIVE NAME.EXT FOR SPEED ;213 RECOGNIZE SIXBIT TAPE LABELS ;214 (10-11,493) FORCE OUTPUT AT END OF DIRECTORY IN /F ;215 (10-12,805) INDICATE THAT /DEN/PAR ARE AS READ, NOT AS WRITTEN ;216 (10-12,995) WARN OF PARITY ERROR ON DTA, BUT STILL GIVE DIRECTORY ;217 DON'T FORCE OUTPUT ON A TAB ;220 (10-13049) IMPLEMELT /SUM IF DTA, TMP ;221 (10-13048) IMPLEMELT /CHECK, /AUTH, /ACCESS IF IN /F ;222 EXCLUDE THE RIBS FROM MTA CHECKSUM ;223 HANDLE /F/SUM TO NOT SAY 0 BLOCKS ;224 FIX MISC BUGS SINCE V. 3 ;225 (10-13458) ADD /FDTA ;226 (QAR 2173) ALLOW DTA3:=DTA3:, ETC. ;227 CANCEL 157 ;230 ADD FRS FORMAT AND PRELIMINARY BACKUP FORMAT ;231 ADD FS.NFS ;232 SUPPORT .OSDFS ;233 SUPPORT /OKPROTECTION ;234 (Q2811-2) CANCEL 227 WITH FT$IPF ;%4(234) 11/74 ;235 (10-14824) CORRECTION FOR FRS FORMAT ;236 (10-14820) REMOVE DOT IN F.EXT WHEN /F/SORT ;237 (10-14828) FIX PROBLEM WITH FILE CONSTRAINTS BEING IGNORED ;240 (10-14942) FIX PROBLEM WITH JUNK LABELS CAUSING ILL MEM REF ;241 (10-14972) FIX BAD MFS ERROR MESSAGE DURING FRS DIRECTORIES ;242 (10-14975) FIX FRS TAPE ERROR PROCESSING FOR ILL UUO, ETC. ;243 (10-15399) FIX FRS %DRTJFS ERROR FOR NULL FILES ;244 (10-15717) FIX BUG CAUSING ALL FILE OUTPUT TO BE ; DUPLICATED ON TTY AFTER PREFIX-ONLY "DRTLKE" ;245 (10-16555) BREAK FOR SUBTOTALS CORRECTLY AND ; SHOW UNIT ONLY WHEN /UNITS ;246 (10-16552) /SORT SUPPRESS PUTTING DIRECTORY AND ; STRUCTURE ON SEPARATE LINE IN /WIDTH ;300 (10-15,415) IMPROVE EDIT 243 ;301 FIX BACKUP BUGS ;302 SUPPORT REWORKED BACKUP FORMAT TO /INTERCHANGE LEVEL ;303 CHANGE ASSEMBLY PROCEEDURE TO USE .REQUEST ;304 CHANGE SYMBOLS F$???? TO B$???? ;305 FIX BUG IN FRS/CHECKSUM IF DISK FILE WAS 4(MOD 5) BLOCKS ;306 SUPPORT .EXE FILES ;307 (S70-427) BUG-SUPPRESS DIRECTORY FROM SUMMARY ; IF 2 ONE FILE OUTPUTS ;310 (Q2489) LIST VERSION Z, AZ, BZ CORRECTLY ;311 (Q2990) SPEED UP BY LETTING WILD KEEP CHANNEL 0 OPEN ;312 DON'T FORCE LINES ON LPT: ;313 (S55-134) CLEAR INITIAL FLAGS SO TCHR OK FROM .ISCAN ;314 (S70-152) CHANGE "INPUT" TO "SOURCE" IN MESSAGES ;315 ADD FEATURE TESTS FOR MAGTAPE CODE ;316 EXTEND 302 TO FILES NOT STARTING AT 0 ;317 ADD /COMPARE TO SUPPRESS ALL OVERHEAD LINES ;320 (SER 55-219) IMPROVE /W WITH /N, ETC. ;321 REMOVE WAIT FOR LPT (VIA FT$LPW) ;322 ADD /INDIRECT TO MAKE AN INDIRECT FILE ;323 (QAR 3647) FIX PRINT DECISION ON /UNITS ;324 REMOVE EXTRA BLANK LINES INADVERTENTLY INSERTED ; BY EDIT 307 ;325 USE JOBDAT AS A UNIVERSAL; CHANGE EXTERNS TO ## ;326 CORRECT BUG IN WHICH OUTPUT FILE DIRECTORY WAS IGNORED ;327 REMOVE BLANK LINES ON /SUMMARY ;330 PERMIT /W FOR DECTAPES TOO ;331 FIX LISTING OF BACKUP FORMAT MAG-TAPE WITH SFD'S ;332 (SPR-17317) SEARCH SYS AFTER NEW IF ERSATZ DEVICE SYS ; REQUESTED AND /NEW ENABLED. ;333 MAKE VERSION CHECKING FOR .EXE FILES WORK ;334 MAKE [226] WORK WHEN EXPLICIT EXTENSION GIVEN (OR NOT A DISK) ;335 CLEAN UP LISTINGS UNDER /TITLE (NOTE THAT THE "SPOOLING" ; WORD IS NOT REALLY HANDLED - SPACED - CORRECTLY YET) ;336 FIX /NOPRDEVICE & /NOPRDIRECTORY WITH /INDIRECT ; ;%5(336) 5/76 ; ;337 (10-19832) Fix problems with edit 221 to allow /ACCESS ; when running /F mode. ;340 (10-19987) If /L is being used, always send ; output to the LPT:, unless an explicit output ; device is specified. ; ;341 SPR # 10-20668 L.C.R 28-Oct-76. ; Allow for a file length of up to 8 digits so that the /SORT ; /WORDS switches can be used together. ; Areas affected: FLEXT5+4, LDEC8:, to LDEC5: ; ;342 SPR # 10-21432 L.C.R 18-Jan-77. ; Make DIRECT ignore /AUTHOR when using /INDIRECT. ; Areas affected: INDEF2 +15(6). ; NOTE:: Also changed DIRECT to search MACTEN & UUOSYM ; instead of C. ; ;343 SPR # 10-21445 L.C.R. 18-JAN-77. ; Allow for a 'UFD' of up to four digits so that the listing ; is aligned when using the /SORT switch even when combined ; with the /WORDS switch. ; Areas affected: FLEXT3: + 4. ; ;344 SPR # 10-21921 L.C.R. 15-FEB-77. ;EDITS 344-357 ARE RESERVED FOR MAINTENANCE FIXES ; ; Make DIRECT check the concatenation requirements ; before counting any lookup errors. ; Areas affected: E.DFLL. ; ;345 SPR #10-21653 AND 10-21654 LCR. 28-FEB-77. ; Make direct give the correct file lenght when the format is unknown, ; also clear the R.MTOH bit when done with a mag tape ; DIRECT will give the correct checksum if the file comes from DISK. ; Areas affected: MTSVST, ; MTDONX, ADD LABEL KCHKSM TO HOLD THE CURRENT CHECKSUM TEPMORARALY. ; ;346 When printing the length of a file, check to see ; if the /WORDS switch was specified ; before spacing to 8 places. ; ;347 SPR # 10-22018 LCR. 07-JUN-77. ; Teach DIRECT to check the file requirements before doing the LOOKUP ; in order to avoid unnecesary LOOKUPs when using the construct ; .DIRECT SYS:'NOT'.EXE ; Areas affected: DOLOK1:. ; ;350 SPR # 10-22319 LCR 27-JUN-77. ; Make /COMPARE more intelligent when doing a directory of ; non-standard file names IE: [1,1] ; Areas affected: FLUFD:,LCHR1:. also create new label S.FUFD ; ;351 SPR # 10-22614 LCR. 30-JUN-77. ; Teach DIRECT not to print a line over the WIDTH limit when using /F/W:x. ; Areas affected: GLDEF2:, FILEND:, ; create label S.LENT to hold the maximun length of an entry ; ;352 SPR # 10-23040 MHK 30-AUG-77 ; TEACH DIRECT TO RECOGNIZE THE /NOPRDEV AND /NOPRDIR SWITCHES ; WHEN THE /WIDTH SWITCH IS SET. ; AREAS AFFECTED: SSTRD7+11 ; ;%6(400) ; ;400 ADD SUPPORT FOR NEW WORDS DEFINED IN THE RIB BY 6.03 ; UNITS WRITTEN WORD, LAST ACCOUNTING DATE/TIME (UFD), EXPIRATION ; DATE/TIME (UFD), AND ACCOUNT STRING (FILE RIB) ; ;401 NO SPR LCR 09-06-77. ; FIX THE /TIME SWITCHES. THIS CODE WAS BROKEN BY EDIT 347. ; AREAS AFFECTED: DOLOK1 + 3. ; ;402 SPR # 10-22690 LCR 09-SEP-77. ; Eliminate the multiple printing of crlf's ; as well as title lines on empty pages. ; Areas affected: TITLEX,LCRLF,LCHR1 ; Create new flag L.CRLF ; ;403 NO SPR # LCR 16-SEP-77. ; Move the label S.FUFD down from the S.MIN area ; so that /COMPARE is not ignored. ; Area affected: S.FUFD ; ;404 NO SPR # LCR 21-SEP-77. ; Move three lines of code at DOLOK1 down to DOLOK3 ; before the LOOKUP. ; This will insure that AC T1 has the correct information ; for the LOOKUP. ; This cures the problem of DIRECT printing garbage on the ; lenght field when using the "OR" or the "+" notation. ; Areas affected: DOLOK1, DOLOK3 ; ;405 SPR # 10-25184 WCL 30-MAY-78. ; Avoid checksumming files when searching for Version No. unless ; specifically requested ; Areas affected: NEXDT3 ; ;406 SPR # 10-24955 WCL 31-MAY-78. ; Make PDL 20 words longer (LN$PDL) ; ;407 SPR # 10-24595 WCL 1-JUNE-78. ; Much time wasted looking for 1776 identification code in block header ; preparatory to searching for .JBVER if file is null (CRASH.EXE for example); ; make it ignore version search if first word of file = 0 ; Areas affected: VERE.1 ; ;410 SPR # 10-25016 WCL 23-JUNE-78 ; Make aware of new format of RIBELB (same as BAFELB) ; Areas affected: DLERRB ; ;411 SPR # 10-26027 WCL 11-JULY-78 ; Checksums taken incorrectly under certain circumstances; CHKSUM ; not zeroed after every file ; Areas affected: LCHECK ; ;412 RDH 22-AUG-78 ; ADD /FNDDAT SWITCH TO GENERATE FIND DATABASE OUTPUT. ADD ; /DIRECT TO GENERATE ASCII LISTING OUTPUT. ADD /MVOLUM TO ; ASK OPERATOR TO MOUNT MULTI VOLUMES FOR BACKUP SAVESETS. ; DEFAULT /WID FOR TTY TO TTY-WIDTH ELSE AD.WID; ADD NEW ; SWITCHS /FLSDIR TO PRINT FIRST-LINE STR/DIR (CURRENT DE- ; FAULT) AND /HDSDIR TO PRINT STR/DIR AS "HEADER" (AS CUR- ; RENTLY DOES ON /WID). ADD /PRVERS TO FORCE PRINTING ; (/NOPRVE TO SUPPRESS ALWAYS) THE VERSION FIELD. SPEED ; UP CHECKSUMMING. ; ;413 RDH 14-SEP-78 ; [412] MESSED UP /INDIRECT ; ;414 RDH 24-NOV-78 ; [412] CONFUSED TOTALS IF /WORDS; MAKE /ACCESS TAKE LARGE ; VALUES. ; ;415 VLR 14-SEP-78 SPR # 10-26384 ; "+" Notation not working for directories of Mag tapes. ; Areas affected: MTDONX ; ;416 RDH 22-DEC-78 ; ADD /[NO]RETRY TO CONTROL AUTOMATIC MONITOR RETRY ON I/O ERROR ; SO CAN FIND SOFT ERROR FILES WHICH BOOTS CAN'T READ. ; ;417 RDH 21-JAN-79 ; HANDLE MORE GRACEFULLY (THAN ?ILL MEM REF) INTERCHANGE TAPES ; WRITTEN BY DUMPER (WHICH LEAVES ALL SORTS OF JUNK ON THE TAPE). ; ;420 RDH 3-NOV-79 ; CHANGE /FNDDAT TO /FNDBLD, ADD /FIND TO READ THE DATA FILES ; WRITTEN BY /FNDBLD, ADD /FNDDAT: TO SPECIFY THE DATA FILES ; TO READ ON /FIND (DEFAULT IS SYS:FNDDAT). ; ;421 RDH 8-NOV-79 ; FIX CASE OF "ACCOUNT" IN DETAILED LISTING. KEEP DIRECTORY OPENED ; ON SEPARATE CHANNEL. THIS SPEEDS UP DIRECTORY LISTINGS OF AREAS ; OTHER THAN JOB'S PATH BY ABOUT 20%. ; ;422 RDH 20-NOV-79 ; /NOMARKS TYPED EXPLICITLY AS COMMAND GETS OVER-RIDDEN BY /MARKS ; IN SWITCH.INI; JUNK TAPES (E.G., WRITTEN BY PIP) ATTEMPT TO LIST ; CHECKSUM EVEN IF NO CHECKSUM HAS BEEN CALCULATED. ; ;423 RDH 4-JAN-80 ; 421 DIDN'T QUITE WORK. ELAPSED TIME FOR DIRECTORIES OTHER THAN ; JOB'S PATH IS REDUCED BY APPROXIMATELY ONE HALF (SINGLE RP04, LOTS ; OF SMALL (TYPICALLY 10-20 FILES) DIRECTORIES. ; ;424 RDH 2-FEB-80 ; FIND DATA FILES CREATED WITH BUM CREATION DATE BY ZAPPING RH(.RBEXT). ; ;425 DC 4-MAR-80 ; ON MAGTAPES, TRY TO PRINT HEADER INFO FROM .TFLPR TAPOP. ; ;426 RDH 11-MAY-80 ; ALLOW FILE LENGTHS TO BE 5 DIGITS WIDE ; ;427 TARL 21-JULY-80 SPR 10-29355 ; INCORRECT PATH WHEN GIVING A FULL FILE-SPECIFICATION AND ; /SCAN, /LIB, /SYS, OR /SEARCH ARE SET. DO PATH. UUOS ; MORE OFTEN. ; ;430 RDH 22-JUL-80 ; C(.RBDED) = .INFIN MEANS "ETERNITY". ; ;431 RDH 15-SEP-80 QAR 10-04624 ; .RBXTR OFF BY ONE (TOO SMALL) ; ;432 RDH 24-SEP-80 QAR ; TYPE OUT MORE INFORMATION ON I/O ERRORS, IN PARTICULAR, READ ; AND LIST THE "EXTENDED I/O ERROR" STATUS. ADD /[NO]ERLOG TO ; CONTROL ERROR LOGGING. SUPPRESS TAPE LABEL GENERATION AND ; VERSION IF ZERO. ; ;433 RDH 27-OCT-80 QAR 10-04838 ; EMBEDDED BLANKS IN /INDIRECT OUTPUT. ; ;434 RDH 27-OCT-80 QAR 10-04841 ; -1 DOESN'T SUCCESSFULLY FOOL WILD IF USER HAS SETSRC-STYLE LIB: ; DEFINED. ; ;435 RDH 20-NOV-80 QAR 10-04971 ; EDIT 427 DOESN'T WORK; "MOVEI" SHOULD BE A "MOVE" ; ;436 RDH 7-JAN-81 QAR 10-05221 ; IF ON A LABELED TAPE (MEANING PROCESSED BY PULSAR) NO GENERATION ; IS PRESENT THE TRAILING QUOTE GETS LEFT OFF OF THE NAME STRING. ; ;437 RDH 13-JAN-81 QAR 10-05244/05265 ; DEFEAT EDIT 427 UNTIL WILD VERSION 7 B GETS TO THE FIELD ; (ERSATZ:FILE.EXT FAILS) ; ;440 RDH 2-JUN-81 QAR 10-05956 ; /FNDBLD/NODIRECT NOT AS FAST AS IT SHOULD BE ; ;441 AWC 12-JUN-81 QAR 10-06068 ; FIX DIRECTORIES OF LABELED MAG TAPES ; ;DIRECT %6(441) RELEASED JUNE, 1981 ;442 AH 3-MAY-82 SPR # 10-32298 ; DIRECT/WIDTH:80 DOES NOT DISPLAY IN 2 COLUMNS ; This edit undoes [412] in so far as the default width of the ; /NORMAL directory listing is concerned - [412] made DIRECT assume ; a default of 8 spaces for the version field if no /[NO]PRVERSION, ; 0 if /NOPRVERSION, and 16 if /PRVERSION. Revert to simply 0 unless ; /PRVERSION, in which case use 16. This will mean /NORMAL listing ; will try to fit into 40-space columns (so that 2 will fit into ; 80-column TTYs), but if a version field gets typed then the column ; will be messed up (this is what DIRECT used to do prior to [412]). ; ; ;443 AH 08-JUL-82 SPR 10-32768 ; DIRECT/WIDTH:80 EXTENDED PAST COLUMN 80 AND WRAPPED AROUND ; EDIT [351] dealt with DIRECT/F/W:X so that it would not wrap around. ; DIRECT/W:X now acknowledges the width if /F is or is not used ; If a directory is going to be larger than 80 columns ; a new directory line is output. ; ;444 RDH 16-Aug-82 SPR 10-31928 ; /INDIRECT of a magtape confused the structure name of the first ; file for each structure. ; ;445 ERS 20-SEP-82 SPR 10-32184 ; Make DIRECT/ACCOUNT/SORT space correctly. ; ;446 ERS 20-SEP-82 ; DIRECT/SORT/NOPRDEV (or DIRECT/SORT dev:) does not create fixed length ; records which is useful in SORTing. ; ;447 RDH 1-FEB-83 SPR 10-33339 ; More tape-label-error message problems. ; NO SPR ; Address check if /FNDBLD/DIRECT - OUTIN set E.LC one too large. ; ;450 BAH 11-Mar-83 SPR 10-33633 ; A directory of an FRS-formatted tape containing SFDs does not print ; the SFD on the summary line. ; ;451 RDH 3-Jan-84 SPR 10-33907 ; /TITLE misaligned if /WORDS specified. ; ;452 RDH 3-Jan-84 SPR 10-33368 ; /PRDIR/PRDEV confuses multi-column listing (/WIDTH) if /HDSDIR ; ;453 AQH/RDH 3-Jan-84 SPR 10-34256 ; /MVOLUME doesn't work with MDA-controlled tapes (/LABEL:USER-EOT) ; ;454 RDH 12-Jan-84 SPR 10-32532 ; /FNDBLD of a BACKUP/INTERCHANGE tape writes garbage for directories. ; ;455 RDH 12-Jan-84 ; Add new DEVOP. error codes ; ;456 RDH 20-Mar-84 SPR 10-34253 ; /MVOLUME confused by multiple save-set names on continuation tapes ;457 RDH 25-Mar-84 ; Create DIRECT version 7 from "DIR" sources, consolidate all directory ; listing formats, add /DTA and /TMPCOR switches to get "old" DECtape ; and TMPCOR listing formats, remove /FDTA, use SWIL (supersedes %7 ; SCAN/WILD/HELPER). ; ;460 RDH 23-Oct-84 ; Make /ALLOCATE switch "*" unique, as it conflicts with the SWIL ; switch of the same name; remove /BLOCKS switch as it conflicts ; with the SWIL switch of the same name, instead make /NOWORDS do ; the same thing. Teach DIRECT to respect the /BLOCKSIZE and /BUFFERS ; switches for magtape support. ; ;461 RDH 22-Jan-85 ; Add .RBTYP/BSZ/RSZ/FFB fields to /DETAIL listing format. ; ;462 RDH 2-Feb-85 SPR 10-35076 ; Issue the "Attributes May be Wrong" message no more than once ; per tape save set. ; ;463 RDH 13-Feb-85 SPR 10-34249 ; Spurious "%Tape mark..." messages ; ;464 RDH 13-Feb-85 SPR 10-34253 ; Inform user of BACKUP file which crosses volume boundry, and ; list the file only when actual EOF is reached. ; ;465 RDH 14-Feb-85 No SPR ; BACKUP doesn't light GF$RPT for repeater records, so look for ; record number being repeated (otherwise reported file checksum ; is wrong). Add DRTSBR Skipping record message to indicate that ; a BACKUP/FRS repeater record was encountered. Add /SBRMSG to ; control issuance of said message (default is no message). ; ;466 RDH 15-Feb-85 SPR 10-34255 ; /MVOLUME may fail for INTERCHANGE tapes. ; ;467 RDH 8-JUN-85 QAR 868067 ; /DETAIL heading for .RBIDT wrong. ; ;470 RDH 25-Jul-85 SPR 10-35230 ; /ACCOUNT doesn't work for listing BACKUP-format tapes - the ; account string is not copied from the file attributes block ; on tape into the "LOOKUP" block for typeout. Also setup .RBIDT. ; ;471 RDH 25-Jul-85 ; Setup .RBIDT, and .RBTYP and friends from BACKUP tape. Other mis- ; cellaneous code "cleanup". ; ;472 RDH 14-Aug-85 SPR 10-35276 ; The automatic-buffer-expansion code didn't get along well with PULSAR. ; Remove a "CLOSE" that doesn't seem to do anything. ; ;473 RDH 14-Aug-85 ; AN MTBSR. operation on a labeled tape causes the label info to be lost, ; causing bad label typeout from DIRECT. This is a MONITOR/PULSAR problem, ; but not likely to be fixed immediately, so provide a workaround in ; DIRECT until the real problem is fixed (and this edit can be removed). ; ;474 LEO 16-AUG-85 ; DO COPYRIGHTS. ; ;475 RDH 26-Dec-85 ; Summaries wrong if first file(s) in a directory is(are) protected. ; ;476 RDH 26-Dec-85 ; [443] leads to premature if /F/W and listing a file with ; a non-null version (e.g., SYS:*.EXE/F/W/LENGTH:1). ; ;477 RDH 26-Dec-85 ; MCO 12262 complicated DIRECT/WILD's handling of DECtapes. Make sure ; to always RELEASe the DTA before each call to .LKWLD. Always RELEASe ; the device when finally done (DIRED/DIRDON). Requires SWIL edit 1032 ; or later. ; ;500 RDH 28-Dec-85 ; File type (extension) should default to "*", not previous spec's ; extension. ; ;501 RDH 18-Feb-86 ; Edit [475] lost leading error character ("%", "?", etc.) on error ; messages. ; ;502 RDH 19-Feb-86 ; /DETAIL confused on (e.g.,) RP20/CI disks where unit number is ; greater than 7(8) (the monitor leaves the unit field blank). ; ;503 BAH 19-JAN-87 ; Begin Version 7A. Report the reelid stored in the records written ; by BACKUP. ; ; End of Revision History VERWRD==<12,,%%FXVE> ;SCAN/WILD INTERFACE PROTOCOL VERSION LOC .JBVER EXP %%DIRECT RELOC SUBTTL MACRO DEFINITIONS ;N$FAIL SENDS FOO WITH PREFIX "DRTXYZ" AS A FATAL ERROR DEFINE N$FAIL ($PFX,$TEXT),< E$$'$PFX': MOVEI T1,''$PFX'' PJSP T2,ERROR XLIST ASCIZ \$TEXT\ LIST > ;N$FAIX SEND FOO WITH PREFIX "DRTXYZ" AS START OF A FATAL MESSAGE ;FINAL CALL TO .TCRLF MUST BE LABELLED "X$$XYZ" DEFINE N$FAIX ($PFX,$TEXT),< E$$'$PFX': MOVEI T1,''$PFX'' XLIST IFNB <$TEXT>,< MOVEI T2,[ASCIZ \$TEXT \] > IFB <$TEXT>,< MOVEI T2,0 > PUSHJ P,ERRORC TXNN T1,JWW.FL JRST X$$'$PFX' LIST > ;N$FAIN SENDS FOO WITH PREFIX "DRTXYZ" AS A FATAL ERROR ;WITH P3 IN SIXBIT DEFINE N$FAIN ($PFX,$TEXT),< E$$'$PFX': MOVEI T1,''$PFX'' XLIST IFNB <$TEXT>,< MOVEI T2,[ASCIZ \$TEXT \] > IFB <$TEXT>,< MOVEI T2,0 > PUSHJ P,ERRORC TXNN T1,JWW.FL JRST LFERX MOVE T1,P3 PUSHJ P,.TSIXN## JRST LFERX LIST > ;N$FAID SENDS FOO WITH PREFIX "DRTXYZ" AS A FATAL ERROR ;WITH P3 IN DECIMAL DEFINE N$FAID ($PFX,$TEXT) < E$$'$PFX': MOVEI T1,''$PFX'' XLIST IFNB <$TEXT>,< MOVEI T2,[ASCIZ \$TEXT \] > IFB <$TEXT>,< MOVEI T2,0 > PUSHJ P,ERRORC TXNN T1,JWW.FL JRST LFERX MOVE T1,P3 PUSHJ P,.TDECW## JRST LFERX LIST > ;N$FAIO SENDS FOO WITH PREFIX "DRTXYZ" AS A FATAL ERROR ;WITH P3 IN OCTAL DEFINE N$FAIO ($PFX,$TEXT),< E$$'$PFX': MOVEI T1,''$PFX'' XLIST IFNB <$TEXT>,< MOVEI T2,[ASCIZ \$TEXT \] > IFB <$TEXT>,< MOVEI T2,0 > PUSHJ P,ERRORC TXNN T1,JWW.FL JRST LFERX MOVE T1,P3 PUSHJ P,.TOCTW## JRST LFERX LIST > ;N$FAII SENDS FOO WITH PREFIX "DRTXYZ" AS A FATAL ERROR ;WITH P3 IN I/O CHANNEL STATUS DEFINE N$FAII ($PFX,$TEXT),< E$$'$PFX': MOVEI T1,''$PFX'' XLIST IFNB <$TEXT>,< MOVEI T2,[ASCIZ \$TEXT \] > IFB <$TEXT>,< MOVEI T2,0 > PUSHJ P,ERRORC TXNN T1,JWW.FL JRST LFERX MOVE T1,P3 PUSHJ P,IOERM JRST LFERX LIST > ;N$WARN SEND FOO WITH PREFIX "DRTXYZ" AS A WARNING MESSAGE DEFINE N$WARN ($PFX,$TEXT),< E$$'$PFX': MOVEI T1,''$PFX'' XLIST MOVEI T2,[ASCIZ \$TEXT\] PUSHJ P,WARN PUSHJ P,.TCRLF## LIST > ;N$WRNX SEND FOO WITH PREFIX "DRTXYZ" AS START OF A WARNING MESSAGE ;FINAL CALL TO .TCRLF MUST BE LABELLED "X$$XYZ" DEFINE N$WRNX ($PFX,$TEXT),< E$$'$PFX': MOVEI T1,''$PFX'' XLIST IFNB <$TEXT>,< MOVEI T2,[ASCIZ \$TEXT \] > IFB <$TEXT>,< MOVEI T2,0 > PUSHJ P,WARN TXNN T1,JWW.FL JRST X$$'$PFX' LIST > SUBTTL ASSEMBLY PARAMETERS ;ASSEMBLY INSTRUCTIONS: ; ; .LOAD DIRECT ; .NSSAVE ; ;ASSUMES MACTEN.UNV, JOBDAT.UNV, UUOSYM.UNV, AND NSCAN.UNV ON UNV: ; SCAN.REL, HELPER.REL, AND WILD.REL ON REL: ;ASSEMBLY PARAMETERS ND FT$LPW,0 ;1=WAIT IF LPT NOT AVAILABLE ND FT$MTA,-1 ;INCLUDE MAGTAPE FEATURES IN GENERAL ND FT$MTB,-1 ;INCLUDE MAGTAPE FEATURES FOR BACKUP ND FT$MTF,-1 ;INCLUDE MAGTAPE FEATURES FOR FAILSAFE ND FT$MTL,-1 ;INCLUDE MAGTAPE LABELING FEATURES (.TFLPR) ND FT$MTR,0 ;INCLUDE MAGTAPE FEATURES FOR OLD BACKUP/RESTORE ND FT$MTS,-1 ;INCLUDE MAGTAPE FEATURES FOR FRS ND LN$LPP,^D55 ;LINES PER PAGE OF DATA ND LN$PDL,200 ;LENGTH OF PUSH-DOWN LIST ND LN$RIB,55 ;LENGTH OF DIRECTORY LOOKUP BLOCK ND LN$BLK,200 ;LENGTH OF SCRATCH BLOCK - MIN:200 (DECTAPE, ETC.) ND LN$DBF,^D128 ;LENGTH OF "STANDARD" DISK/ETC. BUFFER ND LN$LBS,^D1024 ;LENGTH OF "LARGE" DISK BUFFER ND LN$MRC,^D674 ;LENGTH OF DEFAULT MINIMUM MAG TAPE RECORD ND NM$DBF,^D10 ;NUMBER OF "STANDARD" DISK BUFFERS FOR INPUT ND NM$LBS,^D04 ;NUMBER OF "LARGE" DISK BUFFERS FOR INPUT ND NM$MBF,^D05 ;NUMBER OF MAGTAPE BUFFERS FOR INPUT IFE FT$MTA,< FT$MTB==0 FT$MTF==0 FT$MTR==0 FT$MTS==0> IFN FT$MTS,< FT$MTB==-1> IFL LN$RIB-41, ;SWITCH DEFAULTS RADIX 10 DM ACC,^O1777777777,0,5 DM FIL,100000,0,1 DM WID,250,132,0 RADIX 8 SUBTTL SYMBOLS - REGISTERS; I/O CHANNELS ;AC NAMES F=0 ;FLAGS (LH=PERMANENT, RH=TEMPORARY) T1=1 ;TEMPORARIES T2=2 T3=3 T4=4 P1=5 ;PRESERVED P2=6 P3=7 P4=10 I=11 ;GENERAL INDEX REGISTERS J=12 C=14 ;TEMP DEFS FOR LISTING ROUTINES N=15 M=16 P=17 ;PUSH-DOWN POINTER .XCREF F, T1, T2, T3, T4, P1, P2, P3 ;CONSERVE PAPER .XCREF P4, I, J, C, N, M, P ;CONSERVE TREES ;I/O CHANNELS DC==1 ;READ DATA FILE LC==2 ;OUTPUT (DIRECTORY LISTING) DF==3 ;DATA FILE OUTPUT (/FNDBLD OUTPUT) PF==4 ;POINTER FILE OUTPUT (/FNDBLD OUTPUT) DG==5 ;DATA FILE INPUT (/FIND) PG==6 ;POINTER FILE INPUT (/FIND) TW==7 ;DIRECTORY CHANNEL TO HOLD ACCESS TABLE OPEN SUBTTL SYMBOLS - FLAG BITS IN "F" ;FLAGS (LH) L.SVST==(1B0) ;SAVE SET FLAG FOR MT UNTANGLING L.FKEF==(1B1) ;FAKE EOF TO TRICK DISK CODE L.BKSS==(1B2) ;OLD BACKUP/RESTORE STYLE SAVE SET L.SVDW==(1B3) ;SAVED WORD IN INPUT AREA L.FEOF==(1B4) ;END OF FIND DATA FILE (IN DFGET) L.ILEN==(1B5) ;INCORRECT LENGTH L.IMLB==(1B6) ;IMBEDDED LABEL L.LENT==(1B7) ;LONG ENTER OK L.FRSS==(1B8) ;BACKUP/FRS SAVE SET L.FRMT==(1B9) ;FORMAT OUTPUT (I.E., EITHER /SORT OR /TITLES) L.CRLF==(1B10) ;SUPPRESS MULTIPLE CRLF'S. L.SBTT==(1B11) ;LAST LINE WAS SUB/TOTAL (WANT BLANK LINE) L.BPOP==(1B12) ;POPJ FLAG USED BY NEXDV L.MLBL==(1B14) ;TAPE IS LABELLED NICELY L.MLBP==(1B15) ;TAPE CONTROLLED BY LABEL PROCESSOR ;FLAGS (RH) R.WORD==1B18 ;QUANTITIES ARE IN WORDS NOT BLOCKS R.TYPE==1B19 ;FORCE TYPEOUT AS WELL AS LISTING R.ACCS==1B20 ;FORCE A FILE ACCESS R.LSOM==1B21 ;SOME OUTPUT SENT R.OUTD==1B22 ;OUTPUT DEVICE INITTED R.OUTL==1B23 ;FORCE OUTPUT AFTER EACH LINE R.SLOW==1B24 ;SLOW FORMAT --DO NOT MOVE OR INTERCHANGE R.FAST==1B25 ;FAST FORMAT --THIS ORDER REQUIRED R.OUTO==1B26 ;OUTPUT DEVICE OPEN AND IT IS OUR TTY: R.LPTB==1B27 ;LPT BUSY--WAITING R.LTAB==1B28 ;SET IF TAB TO BE LISTED NEXT R.FEAT==1B27 ;EAT FILES (SPECIAL DTA MODE IN DIRLP) R.NDSK==1B30 ;SET IF NOT A DISK DIRECTORY R.LBSX==1B31 ;SET IF SIXBIT LABELS R.MTOH==1B32 ;MT OVERHEAD WORD COMING NEXT R.NSF==1B33 ;NOT START OF FILE R.SPLN==1B34 ;SUPPRESS LINE R.STAB==1B35 ;SUPPRESS NEXT TAB (AT CALL TO LTAB) SUBTTL SYMBOLS - FILE BLOCK NAMES IF2,< ;ONLY PASS 2 SINCE LOCATION OF LOOKUP BLOCK DEFINED AT END DEFINE DR(A,B),> DEFINE DQ(A), DR RIBLEN,CNT; BLOCK LENGTH DR UFDPPN,PPN; PROJECT-PROGRAMMER NUMBER OR POINTER TO DIRECTORY DQ NAM; FILE NAME DQ EXT; FILE EXTENSION FACD==FEXT; ACCESS DATE FCRX==FEXT; CREATION DATE EXTENSION BITS DQ PRV; PROTECTION, CREATION, ETC. FMOD==FPRV; FILE I/O MODE FCRE==FPRV; CREATION DATE/TIME (MOST OF IT ANYWAYS) DQ SIZ; FILE SIZE/LENGTH DQ VER; VERSION DQ SPL; SPOOLED NAME DQ EST; ESTIMATED LENGTH DQ ALC; ALLOCATED LENGTH DQ POS; POSITION ALLOCATED DQ UFW; UNITS WHICH WROTE FILE (UNIT,, CONTROLLER-APR SERIAL #) DQ NCA; CUSTOMER NON-PRIV DQ MTA; DISK BACKUP TAPE DQ DEV; LOGICAL UNIT DQ STS; FILE STATUS BITS DQ ELB; ERROR LOGICAL BLOCK DQ EUN; ERROR UNIT AND LENGTH DQ QTF; FCFS QUOTA (DIRECTORY FILE) DQ TYP; -- OR -- FILE DATA TYPE, ETC. (DATA FILE) DQ QTO; LOGGED OUT QUOTA (DIRECTORY FILE) DQ BSZ; -- OR -- BYTE/ETC. SIZES (DATA FILE) DQ QTR; RESERVED QUOTA (DIRECTORY FILE) DQ RSZ; -- OR -- RECORD/ETC. SIZES (DATA FILE) DQ USD; BLOCKS USED (DIRECTORY FILE) DQ FFB; -- OR -- FIRST FREE BYTE (DATA FILE) DQ AUT; AUTHOR DQ NXT; CONTINUED STR DQ IDT; BACKUP INCREMENTAL DATE/TIME DQ PCA; PRIV CUSTOMER ARG DQ UFD; POINTER BACK TO UFD DQ FLR; RELATIVE BLOCK IN FILE COVERED BY THIS RIB DQ XRA; POINTER TO NEXT RIB IN CHAIN DQ TIM; CREATION DATE,,TIME IN INTERNAL FORMAT DQ LAD; LAST ACCOUNTING DATE/TIME DQ DED; DIRECOTRY EXPIRATION DATE/TIME DQ ACT; FIRST WORD OF THE ACCOUNT STRING DQ AC2; SECOND WORD OF THE ACCOUNT STRING DQ AC3; THIRD WORD OF THE ACCOUNT STRING DQ AC4; FOURTH WORD OF THE ACCOUNT STRING DQ AC5; FIFTH WORD OF THE ACCOUNT STRING DQ AC6; SIXTH WORD OF THE ACCOUNT STRING DQ AC7; SEVENTH WORD OF THE ACCOUNT STRING DQ AC8; EIGHTH WORD OF THE ACCOUNT STRING .RBXTR==.RBAC8+1 ;LAST THING WE KNOW ABOUT DQ XTR; EXTRA RIB WORDS START HERE > ;END IF2 SUBTTL SYMBOLS - MAGTAPE -- BACKUP FORMAT ;Each tape record has a 32(10) word header: G$TYPE==0 ;RECORD TYPE T$LBL==1 ;TAPE LABEL T$SSS==2 ;START SAVE SET T$ESS==3 ;END SAVE SET T$FIL==4 ;DISK FILE DATA T$DIR==5 ;DIRECTORY RECORD T$EOV==6 ;END OF VOLUME T$CMT==7 ;COMMENT T$CSS==10 ;CONTINUE SAVE SET T$MAX==10 ;LARGEST RECORD TYPE G$SEQN==1 ;RECORD SEQUENCE NUMBER G$RTNM==2 ;RELATIVE TAPE NUMBER G$FLAG==3 ;RECORD DEPENDENT BITS GF$EOF==1B0 ;LAST RECORD OF FILE GF$RPT==1B1 ;REPEAT OF LAST RECORD WRITE ERROR GF$NCH==1B2 ;THIS RECORD NOT CHECKSUMMED GF$SOF==1B3 ;THIS RECORD IS START OF FILE GF$DF0==1B4 ;FIRST DISK FILE BLOCK (ON TAPE) HAD ERROR GF$DF1==1B5 ;SECOND DISK FILE BLOCK (ON TAPE) HAD ERROR GF$DF2==1B6 ;THIRD DISK FILE BLOCK (ON TAPE) HAD ERROR GF$DF3==1B7 ;FOURTH DISK FILE BLOCK (ON TAPE) HAD ERROR G$CHK==4 ;CHECKSUM G$SIZ==5 ;NUMBER OF DATA WORDS G$LND==6 ;TOTAL LENGTH OF NON-DATA SECTION G$CUSW==13 ;RESERVED FOR CUSTOMER USE A$FHLN==0 ;ATTRIBUTE HEADER FIXED LENGTH REGION A$FLGS==1 ;ATTRIBUTE FLAGS A$WRIT==2 ;LAST WRITE DATE A$ALLS==3 ;ALLOCATED SIZE A$MODE==4 ;MODE A$LENG==5 ;LENGTH A$BSIZ==6 ;BYTE SIZE A$VERS==7 ;VERSION A$PROT==10 ;PROTECTION PR$ATR==7B31 ;ATTRIBUTES PR$WRT==3B33 ;WRITE PR$RED==3B35 ;READ A$ACCT==11 ;[470] ACCOUNT STRING (BYTE POINTER) A$NOTE==12 ;ANNOTATION A$CRET==13 ;CREATION DATE/TIME A$REDT==14 ;LAST READ (ACCESS) DATE/TIME A$MODT==15 ;LAST WRITE DATE/TIME A$ESTS==16 ;ESTIMATED SIZE (WORDS) A$RADR==17 ;REQUESTED ADDRESS A$FSIZ==20 ;MAXIMUM FILE SIZE (WORDS) A$MUSR==21 ;WHO LAST MODIFIED STRING (BYTE POINTER) A$CUSR==22 ;AUTHOR STRING (BYTE POINTER) A$BKID==23 ;LAST BACKUP TAPE SAVE SET (BYTE POINTER) A$BKDT==24 ;LAST BACKUP DATE/TIME A$NGRT==25 ;GENERATION RETENTION COUNT A$NRDS==26 ;NUMBER OF OPEN-FOR-READS A$NWRT==27 ;NUMBER OF OPEN-FOR-WRITES A$USRW==30 ;NON-PRIVILEGED CUSTOMER WORD A$PCAW==31 ;PRIVILEGED CUSTOMER WORD A$FTYP==32 ;FILE TYPE AND FLAGS A$FBSZ==33 ;BYTE SIZES A$FRSZ==34 ;RECORD AND BLOCK SIZES A$FFFB==35 ;APPLICATION/CUSTOMER WORD .FCDEV==1 ;DEVICE .FCNAM==2 ;NAME .FCEXT==3 ;EXTENSION .FCVER==4 ;VERSION .FCGEN==5 ;GENERATION .FCDIR==40 ;TOP LEVEL DIRECTORY .FCSFD==41 ;SFD NAME ;ALSO SEE STORAGE BLOCKS B$???? IN STORAGE SECTION SUBTTL STARTUP AND INITIALIZATION ;HERE AFTER START OR RUN OR DIRECTORY COMMAND OR RUN UUO DIRECT: TDZA T1,T1 ;CLEAR OFFSET MOVEI T1,1 ;SET OFFSET MOVEM T1,OFFSET ;STORE IT RESET ;RESET ANY EXTERNAL I/O SETZB F,ZCOR ;CLEAR CORE MOVE T1,[ZCOR,,ZCOR+1] BLT T1,EZCOR MOVE P,[IOWD LN$PDL,PDLST] ;ESTABLISH PUSH-DOWN LIST MOVE T1,[ 4,,[VERWRD IOWD 1,['DIRECT'] OFFSET,,'DIR' 0,,TCHR]] PUSHJ P,.ISCAN## ;INITIALIZE COMMAND SCANNER MOVE T1,.JBFF ;SAVE ORIGINAL VALUE HRL T1,.JBREL ; OF .JBREL AND MOVEM T1,ORGFF ; OF .JBFF ;CONTINUED ON NEXT PAGE SUBTTL MAIN LOOP FOR COMMAND SCANNING ;FALL HERE FROM PREVIOUS PAGE MAINLP: MOVE P,[IOWD LN$PDL,PDLST] MOVE T1,[ 7,,[VERWRD IOWD DRSWTL,DRSWTN DRSWTD,,DRSWTM 0,,DRSWTP 'DIRECT' CLANS,,0 AIN,,AOUT]] PUSHJ P,.TSCAN## ;GET THE COMMAND SKIPN I.NXZR ;SEE IF ANYTHING JRST [PUSHJ P,.CLRFL## ;NO--CLEAR FILE AREA PUSHJ P,AIN ;ALLOCATE ONE SPEC PUSHJ P,.GTSPC## ;COPY IT IN JRST .+1] ;AND PROCEED MOVE T1,[ 6,,[VERWRD IOWD DRSWTL,DRSWTN DRSWTD,,DRSWTM 0,,DRSWTP 'DIRECT' 'DIRECT']] PUSHJ P,.OSCAN## ;SCAN USER OPTIONS MOVE F,FLAGS ;GET INITIAL FLAGS JRST DEFAUL ;GO FILL IN DEFAULTS ;SUBROUTINE TO CLEAR ANSWER AREA CLANS: SETZM S.ZER ;ZERO OUT COMMAND ACCUMULATORS MOVE T1,[S.ZER,,S.ZER+1] BLT T1,S.EZER SETOM S.MIN ;PRESET SWITCH PARAMETERS MOVE T1,[S.MIN,,S.MIN+1] BLT T1,S.EMIN SETZM I.NXZR ;AND FOR SCANING CLOSE LC,CL.ACS!CL.DAT;TERMINATE LISTING IF OPEN RELEAS LC, ; IN CASE OF ERROR RESTART CLOSE DF,CL.ACS!CL.DAT;CLOSE OFF DATA FILE RELEAS DF, ;AND DUMP DEVICE CLOSE PF,CL.ACS!CL.DAT;CLOSE OFF POINTER FILE RELEAS PF, ;AND DITCH IT TOO. SETZM B.LC+.BFPTR ;SET FLAG FOR LISTING CLOSED TRZ F,-1 ;CLEAR ALL LOCAL FLAGS HRRZ T1,ORGFF ;RESTORE ORIGINAL VALUE MOVEM T1,.JBFF ; OF .JBFF MOVEM T1,I.INZR ; FOR .WILD HLRZ T1,ORGFF ;RESTORE .JBREL CAME T1,.JBREL ; UNLESS OK CORE T1, ; TELL MONITOR JFCL ;(IGNORE ERROR) POPJ P, ;RETURN ;SUBROUTINE TO ALLOCATE OUTPUT FILE AREA AOUT: MOVEI T1,O.BLK ;POINT TO IT MOVEI T2,.FXLEN ;AND LENGTH POPJ P, ;AND RETURN ;SUBROUTINE TO ALLOCATE INPUT FILE AREA AIN: MOVEI T1,.FXLEN ;ADVANCE ALLOCATION SKIPN I.NXZR ;SEE IF STARTED YET MOVE T1,I.INZR ;NO--START AT BEGINNING ADDB T1,I.NXZR ;AND STORE NEW VALUE MOVEI T2,.FXLEN(T1) ;COMPUTE NEXT FREE MOVEM T2,.JBFF ; STORE FOR LATER SOS T2 ;GET END CAMG T2,.JBREL ;SEE IF IN CORE JRST AINX ;YES--NO SWEAT CORE T2, ;NO--GET MORE CORE JRST E$$TMI ;ERROR IF NO ROOM AINX: HRLZ T2,T1 ;POINT TO START HRRI T2,1(T1) ;SETUP NEXT ADDR SETZM (T1) ;CLEAR NEW BLT T2,.FXLEN-1(T1) ; AREA MOVEI T2,.FXLEN ;SET LENGTH POPJ P, ;RETURN SUBTTL FILL IN DEFAULTS AFTER COMMAND SCANNING ;HERE AT END OF COMMAND -- SUPPLY ABSENT FILE DEFAULTS DEFAUL: MOVEI P1,O.BLK ;ADDRESS OF OUTPUT FILE SPEC BLOCK OUDEF0: MOVE T1,P1 ;ADDRESS OF OUTPUT FILE SPEC BLOCK MOVEI T2,O.LZER ;LENGTH OF OUTPUT FILE SPEC BLOCK PUSHJ P,.OSDFS## ;APPLY SWITCH.INI DEFAULTS AS NEEDED MOVE P2,O.BLK+.FXFLD ;GET FIELD FLAGS TXNE P2,FX.WXX ;WERE ANY WILDCARDS TYPED? JRST E.OWI ;YES, BOMB OUT NOW SKIPLE S.FBLD ;IF /FNDBLD, SETOM S.DODV ; THEN DON'T ALLOW /L TXNE P2,FX.UDV ;DID USER SUPPLY A DEVICE? JRST OUDEF1 ;YES SKIPG S.FBLD ;IF /FNDBLD, OR TXNE P2,FX.UND!FX.UDR!FX.UNM!FX.UEX ;ANYTHING ELSE TYPED, SKIPA T1,['DSK '] ;THEN LIST ON DISK MOVSI T1,'TTY' ;NO, THEN LIST ON CONTROLLING TTY SKIPLE S.DODV ;SEE IF /L SWITCH MOVSI T1,'LPT' ;YES, DEFAULT OUTPUT DEVICE TO LPT: SETO T2, ;FULLY NON-WILD DMOVEM T1,.FXDEV(P1) ;SET OUTPUT DEVICE IN FILE SPEC BLOCK OUDEF1: HRLOI T1,'DIR' ;DEFAULT OUTPUT EXTENSION SKIPLE S.IND ;IF /INDIRECT, HRLOI T1,'CCL' ;USE DIFFERENT DEFAULT SKIPN .FXEXT(P1) ;HAVE AN EXTENSION? MOVEM T1,.FXEXT(P1) ;NO, SET DEFAULT MOVE T4,.FXDEV(P1) ;GET "LISTING" DEVICE MOVE T1,.FXMOD(P1) ;GET PHYSICAL FLAG TXNN T1,FX.PHY ;SEE IF /PHY DEVCHR T4, ;NO, LOGICAL DEVICE REFERENCE TXNE T1,FX.PHY ;SEE IF /PHY DEVCHR T4,UU.PHY ;YES, PHYSICAL DEVICE REFERENCE TXNE T4,DV.DSK ;SEE IF DISK TLOA F,L.LENT ;YES--INDICATE LONG ENTER TLZ F,L.LENT ;NO TXNN T4,DV.LPT ;SEE IF TYPE LPT JRST OUDEF2 ;NO--PROCEED TRNN F,R.FAST!R.SLOW ;SEE IF ANY SPEED SWITCH TRO F,R.SLOW ;NONE--SET TO SLOW MODE MOVEI T1,1 ; (PRESET VALUE) SKIPGE S.TITL ; AND NO TITLE SWITCH MOVEM T1,S.TITL ;YES--SET DEFAULT TITLE ON OUDEF2: MOVE T1,S.SUM ;GET /SUMMARY TXNE T4,DV.TTA ;SEE IF CONTROLLING TTY TROA F,R.OUTO ;YES--SET FLAG JRST [SKIPGE T1 ;UNLESS USER SET /SUM, FORCE SUMMARIES MOVEI T1,1 ; OK--SET SUMMARIES JRST .+1] ;PROCEED MOVEM T1,FLFSUM ;STORE FLAG FOR FORCED SUMMARIES TXNE T4,DV.TTY ;SEE IF LINE MODE DEVICE TRO F,R.OUTL ;YES, DO OUTPUT ON EVERY LINE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE SKIPN .FXNAM(P1) ;WAS OUTPUT FILE NAME GIVEN? TXNN T4,DV.DIR ;NO, SEE IF FILE NAME NEEDED JRST OUDEF8 ;NO--GO ON TLC T4,-1-<(DV.TTA)>;SEE IF NUL: TLCN T4,-1-<(DV.TTA)>; .. JRST OUDEF8 ;YES--ENTER NOT NEEDED SKIPLE S.FBLD ;/FNDBLD? JRST [MOVE T1,['FNDDAT'] ;YES, DEFAULT FILENAME SETO T2, ;INDICATE NON-WILD DMOVEM T1,.FXNAM(P1) ;STORE IN SCAN BLOCK JRST OUDEF6] ;FINISH DEFAULTS MSTIME T1, ;YES--MANUFACTURE NAME HHMMSS IDIVI T1,^D1000 ;GET SECONDS MOVE T4,[POINT 6,.FXNAM(P1)] ;SETUP BYTE POINTER MOVSI T3,-6 ;INITIALIZE LOOP COUNTER OUDEF4: IDIV T1,[^D36000 ^D3600 ^D600 ^D60 ^D10 ^D1](T3) ;GET NEXT DIGIT ADDI T1,'0' ;CONVERT TO SIXBIT DIGIT IDPB T1,T4 ;STORE INTO NAME MOVE T1,T2 ;RESTORE REMAINDER AOBJN T3,OUDEF4 ;LOOP SETOM .FXNMM(P1) ;INDICATE NOT WILD OUDEF6: N$WRNX (DLF,Directory listing to file /) MOVE T1,P1 ;ADDRESS OF OUTPUT FILE SPEC BLOCK PUSHJ P,.TFBLK## ;TYPE IT OUT X$$DLF: PUSHJ P,.TCRLF## ;CAP OFF "WARNING" WITH A CRLF OUDEF8: SETZM H.ZER ;CLEAR OUT SUMMARY AREA FOR OUTPUT MOVE T1,[H.ZER,,H.ZER+1] BLT T1,H.EZER SETOM LNPP ;PRESET TO FORCE PAGE EJECT ;OUTPUT FILE DEFAULTED, SET IT UP FOR LISTING OUTPUT OUDEF9: PUSHJ P,OUTIN ;OPEN OUTPUT FILE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;HERE TO SUPPLY INPUT SIDE DEFAULTS INDEF: MOVE P1,I.INZR ;INITIALIZE BLOCK POINTER INDEF0: MOVE T1,P1 ;POINT TO SPEC MOVEI T2,.FXLEN ;INDICATE LENGTH PUSHJ P,.OSDFS## ;APPLY SWITCH.INI DEFAULTS AS NEEDED SKIPLE S.FIND ;/FIND? SKIPA T1,['* '] ;YES, DEFAULT DEVICE TO MATCH ANYTHING MOVSI T1,'DSK' ;FORCE DEFAULT DEVICE MOVE T4,.FXMOD(P1) ;GET THE SWITCHES AND BITS WORD ;SCAN BUG - AT THIS POINT FX.NDV WILL BE SET FOR CONSTRUCTIONS OF THE FORM ; "BLKC:*.* ([*,*])" WHICH CAUSE US ALL SORTS OF TROUBLE . . . THEREFORE WE ;USE A STUPID SKIP INSTEAD. SIGH. -RDH SKIPN T2,.FXDEV(P1) ;SIGH. JRST .+4 ;SIGH. TXZE T4,FX.NDV ;NO DEVICE GIVEN (HA!)? CAME T2,['DSK '] ;MAYBE, SCAN LEAVE US A "DSK:" JRST INDEF1 ;NO, THEN SCAN GOT DEVICE FROM USER, KEEP IT CAMN T1,['* '] ;WHAT SORT OF DEFAULT DEVICE? TDZA T2,T2 ;A WILD ONE SETO T2, ;A NON-WILD ONE DMOVEM T1,.FXDEV(P1) ;USE OUR DEFAULT DEVICE MOVX T1,FX.WDV ;THE WILDCARDS-IN-DEVICE BIT AOJE T2,.+2 ;WILDCARDS PRESENT? IORM T1,.FXFLD(P1) ;YES INDEF1: SKIPLE S.FIND ;/FIND? SKIPE .FXDIR(P1) ;YES, USER GIVE A DIRECTORY? JRST INDEF4 ;NOT /FIND OR USER SUPPLIED A DIRECTORY MOVEI T3,.FXDIR(P1) ;ADDRESS OF DIRECTORY WORDS HRLI T3,-.FXLND ;LENGTH (COUNTING UFD) SETZ T2, ;ALL DIRECTORY LEVELS TO BE FULLY-WILD SKIPA T1,[377777,,377777] ;UFD WILDCARD INDEF2: MOVSI T1,'* ' ;SFD WILDCARD DMOVEM T1,(T3) ;DEFAULT DIRECTORY ENTRY ADDI T3,1 ;POINT TO WILDCARD MASK AOBJN T3,INDEF2 ;FILL OUT FULL DIRECTORY BLOCK MOVX T2,FX.WDR ;THE DIRECTORY WILDCARDS BIT IORM T2,.FXFLD(P1) ;SET IN FIELDS FLAGS ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE INDEF4: SKIPE .FXNAM(P1) ;SEE IF FILE NAME JRST INDEF6 ;YES--NO DEFAULT MOVSI T1,'* ' ;NO--SET WILD DEFAULT SETZ T2, ;FULL WILD MASK CAME P1,I.INZR ; FOR FIRST ONE DMOVE T1,.FXNAM-.FXLEN(P1) ;PREVIOUS FOR REST DMOVEM T1,.FXNAM(P1) ;STORE IN ARRAY MOVX T1,FX.WNM ;THE FILE NAME WILDCARDED FLAG AOSE T2 ;WILDCARDS PRESENT IN FILE NAME? IORM T1,.FXFLD(P1) ;YES, SET IN THE SCAN BLOCK INDEF6: SKIPN T2,.FXEXT(P1) ;SIGH. JRST .+4 ;SIGH. TXZE T4,FX.NUL ;NULL EXTENSION? TLNE T2,-1 ;MAYBE - ANYTHING THERE? JRST INDEF7 ;TRUST ALREADY EXTANT EXTENSION MOVSI T1,'* ' ;DEFAULT EXTENSION MOVEM T1,.FXEXT(P1) ;SET DEFAULT EXTENSION MOVX T2,FX.WEX ;THE WILDCARDED EXTENSION FLAG IORM T2,.FXFLD(P1) ;REMEMBER FOR WILD INDEF7: MOVX T1,FX.STR ;SET MULTIPLE STR CODE TDNN T1,.FXMOM(P1) ;UNLESS USER HAS DEFEATED IT IORM T1,.FXMOD(P1) ;SET IN THE MOD WORD MOVX T1,FX.PRT ;DEFAULT TO /ERPROT TDNN T1,.FXMOM(P1) ; .. IORM T1,.FXMOM(P1) ; .. ADDI P1,.FXLEN ;ADVANCE POINTER CAMG P1,I.NXZR ;SEE IF DONE YET JRST INDEF0 ;NO--LOOP BACK ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;HERE TO SUPPLY DEFAULTS FOR GLOBAL SWITCHES GIDEF: SKIPG S.FIND ;/FIND SPECIFIED? JRST GIDEF1 ;NO, NORMAL INPUT SKIPLE S.ACCS ;/ACCESS ALSO? PUSHJ P,[N$WARN (IF1,/ACCESS ignored in conjunction with /FIND) SETOM S.ACCS ;ZAPETH THE SWITCH POPJ P,] ;NO MORE /ACCESS SKIPLE S.ACCT ;OR /ACCOUNT? PUSHJ P,[N$WARN (IF2,/ACCOUNT ignored in conjunction with /FIND) SETOM S.ACCT ;ZAPETH THE SWITCH POPJ P,] ;NO MORE /ACCOUNT SKIPLE S.ALC ;OR /ALLOCATE? PUSHJ P,[N$WARN (IF3,/ALLOCATE ignored in conjunction with /FIND) SETOM S.ALC ;ZAPETH THE SWITCH POPJ P,] ;NO MORE /ACCOUNT SKIPLE S.AUT ;OR /AUTHOR? PUSHJ P,[N$WARN (IF4,/AUTHOR ignored in conjunction with /FIND) SETOM S.AUT ;ZAPETH THE SWITCH POPJ P,] ;NO MORE /AUTHOR SKIPLE S.DTL ;OR /DETAIL? PUSHJ P,[N$WARN (IF5,Not all /DETAIL file information available with /FIND) POPJ P,] ;BUT DO WHAT WE CAN SKIPL S.UNIT ;OR /UNIT? PUSHJ P,[N$WARN (IF6,/UNIT ignored in conjunction with /FIND) SETOM S.UNIT ;ZAPETH THE SWITCH POPJ P,] ;NO MORE /UNIT MOVEI T1,1 ;"ON" SWITCH SETTING SKIPGE S.PRDE ;USER GIVE EXPLICIT DEVICE/ SKIPL S.PRDI ;DIRECTORY PRINTING CONTROL? JRST GIDEF1 ;YES, LEAVE IT ALONE THEN ; SKIPGE S.PRVE ;OR USER GIVE VERSION/ SKIPL S.CHK ;CHECKSUM PRINTING CONTROL? JRST GIDEF1 ;YES, LEAVE IT ALONE THEN MOVEM T1,S.PRDE ;NO, DEFAULT TO /PRDEVICE AND MOVEM T1,S.PRDI ;/PRDIRECTORY ON /FIND ; MOVEM T1,S.PRVE ;/PRVERSION ALSO MOVEM T1,S.CHK ;/CHECKSUM AS WELL ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;SET UP SWITCHS FOR /INDIRECT OUTPUT GIDEF1: SKIPG S.IND ;/INDIRECT SPECIFIED? JRST GIDEF3 ;NO TRZ F,R.SLOW ;CLEAR /S TRO F,R.FAST ;SET /F MOVEI T1,1 ;SET VALUE SETZM S.ACCT ;CLEAR /ACCOUNT SETZM S.AUT ;CLEAR /AUTHOR MOVEM T1,S.CMP ;SET /COMPARE (KILL HEADERS) SETZM S.DTL ;CLEAR /DETAIL MOVEM T1,S.FLSD ;SET /FLSDIR (PRINT STR/DIR) SETZM S.HDSD ;CLEAR /HDSDIR SKIPGE S.PRDE ;/[NO]PRDEVICE? MOVEM T1,S.PRDE ;NO, DEFAULT /PRDEVICE SKIPGE S.PRDI ;/[NO]PRDIRECTORY? MOVEM T1,S.PRDI ;NO, DEFAULT /PRDIRECTORY SETZM S.SORT ;CLEAR /SORT SETZM S.WDTH ;SET /WIDTH:0 GIDEF3: SKIPLE S.CMP ;IF /COMPARE, SKIPL S.TITL ; AND NO /TITLE SKIPA ;NO SETZM S.TITL ; SET /NOTITLE SKIPLE S.DTL ;SEE IF /DETAIL TRZ F,R.FAST!R.SLOW ;YES--CLEAR /FAST/SLOW SKIPGE S.SORT ;IS SORT MODE SPECIFIED SETZM S.SORT ;NO--CLEAR FLAG MOVEI T1,1 SKIPGE S.REWS ;SEE IF /NOREW MOVEM T1,S.REWS ;NO--SET /REW SKIPGE S.EOT ;SEE IF /NOEOT MOVEM T1,S.EOT ;NO--SET /EOT SKIPLE S.FBLD ;/FNDBLD? MOVEM T1,S.CHK ;YES, FORCE /CHECKSUM SKIPLE S.FBLD ;/FNDBLD? SKIPL S.MVOL ;AND /MVOL OR /NOMVOL? SKIPA ;NO TO ONE OF ABOVE MOVEM T1,S.MVOL ;YES, DEFAULT TO /MVOLUM ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE MOVN T2,S.FLSD ;/FLSDIR SUB T2,S.HDSD ;/HDSDIR SUB T2,S.PRDE ;/PRDEVICE SUB T2,S.PRDI ;/PRDIRECTORY CAIE T2,4 ;IF ANY OF ABOVE GIVEN JRST GLDEF2 ;AT LEAST ONE OF ABOVE SKIPL S.WDTH ;/WIDTH OF SOME FORM? JRST GLDEF1 ;YES, DEFAULT /HDSDIR MOVEM T1,S.FLSD ;NO, DEFAULT /FLSDIR SETZM S.HDSD ;NO, DEFAULT /NOHDSDIR JRST GLDEF2 ;GO CHECK FOR /DETAIL GLDEF1: SETZM S.FLSD ;DEFAULT /NOFLSDIR MOVEM T1,S.HDSD ;DEFAULT /HDSDIR GLDEF2: SKIPG S.DTL ;/DETAIL? JRST GLDEF3 ;NO SETZM S.FLSD ;YES, FORCE /NOFLSDIR SETZM S.HDSD ;YES, FORCE /NOHDSDIR GLDEF3: SKIPN S.PRDE ;IF NOT /NOPRDEVICE SKIPE S.PRDI ;AND NOT /NOPRDIRECTORY JRST GLDEF4 ;(IT'S NOT) SETZM S.FLSD ;/NOPRDE/NOPRDI, FORCE SETZM S.HDSD ;/NOFLSDIR/NOHDSDIR GLDEF4: SKIPGE S.FLSD ;IF NOT SOME FORM OF SKIPL S.HDSD ;/[NO]FLSDIR OR /[NO]HDSDIR SKIPA ;(AT LEAST ONE SPECIFIED) MOVEM T1,S.FLSD ;DEFAULT TO /FLSDIR SKIPL S.FLSD ;IF /[NO]FLSDIR SKIPL S.HDSD ;AND NOT /[NO]HDSDIR SKIPA ;(IT'S NOT) SETZM S.HDSD ;FORCE /NOHDSDIR SKIPGE S.FLSD ;IF NOT /[NO]FLSDIR SKIPGE S.HDSD ;AND /[NO]HDSDIR SKIPA ;(IT'S NOT) SETZM S.FLSD ;FORCE /NOFLSDIR ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE GLDEG: SKIPLE S.IND ;/INDIRECT? JRST GLDEW ;YES, LEAVE /WIDTH ALONE MOVEI T1,AD.WID ;DEFAULT LINE WIDTH TRNN F,R.OUTL ;OUTPUT TO A TTY? JRST GLDEG2 ;NO, USE CURRENT DEFAULT MOVEI T3,LC ;YES, I/O CHANNEL IONDX. T3, ;FROM WHICH TO GET UDX JRST GLDEG2 ;??? MOVE T1,[2,,T2] ;TRMOP. POINTER TO MOVEI T2,.TOWID ;READ TTY WIDTH TRMOP. T1, ;ASK MONITOR FOR TTY WIDTH MOVEI T1,AD.WID ;??? GLDEG2: SKIPN S.WDTH ;/WIDTH WITH NO VALUE? MOVEM T1,S.WDTH ;YES, USE DEFAULT SKIPGE S.WDTH ;/WIDTH OF ANY TYPE? SETZM S.WDTH ;NO, SET FOR INTERNAL USE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE GLDEW: TRNN F,R.FAST ;/FAST? JRST GLDEW3 ;NO MOVEI T1,^D16 ;YES, BASIC /FAST WIDTH SKIPLE S.CHK ;/CHECKSUM? ADDI T1,^D8 ;YES SKIPLE S.HDSD ;DOING /HDSDIR FORMAT LISTING? JRST GLDEW6 ;YES, THEN /PRDIR/PRDEV DON'T COUNT SKIPLE S.PRDE ;/PRDEVICE? ADDI T1,^D8 ;YES SKIPLE S.PRDI ;/PRDIRECTORY? ADDI T1,^D24 ;YES, USUALLY FITS IN 24 SPACES JRST GLDEW6 ;GO CHECK ON NUMBER OF COLUMNS GLDEW3: MOVEI T1,^D40 ;WIDTH IF /N TRNE F,R.SLOW ; MOVEI T1,^D64 ;/S SKIPLE S.CHK ; ADDI T1,^D8 ;/CHECKSUM SKIPLE S.AUT ; ADDI T1,^D16 ;/AUTHOR SKIPLE S.PRDE ;/PRDEVICE? SKIPLE S.HDSD ;DOING /HDSDIR FORMAT LISTING? JRST GLDEW4 ;YES, THEN /PRDIR/PRDEV DON'T COUNT ADDI T1,^D8 ;YES SKIPLE S.PRDI ;/PRDIRECTORY? ADDI T1,^D24 ;YES, USUALLY FITS IN 24 SPACES GLDEW4: ; ; SKIPE S.PRVE ;[442] /NOPRVERSION? ; ADDI T1,^D8 ;[442] NO, USUALLY FITS IN 8 SPACES ; SKIPLE S.PRVE ;[442] /PRVERSION? ; ADDI T1,^D8 ;[442] YES, FITS IN 16 SPACES TOTAL ; SKIPLE S.PRVE ;[442] [443] /PRVERSION? ; ADDI T1,^D16 ;[442] [443] YES, ASSURE 16 SPACES FOR VERSION GLDEW6: MOVEM T1,S.LENT ;SAVE THE MAX LENGTH OF AN ENTRY SKIPLE T2,S.WDTH ;GET /WIDTH SUB T2,T1 ;REMOVE LENGTH OF AN ENTRY SKIPL T2 ;IF NEGATIVE SKIPLE S.DTL ; OR /DETAIL MOVEI T2,0 ; KILL WIDTH MOVEM T2,MXWDTH ;STORE AS RIGHTMOST BEFORE NEW LINE SKIPG S.TITL ;IF TITLE'ING, OR SKIPLE S.SORT ;IF SORT'ING TLO F,L.FRMT ;THEN FLAG FORMATTED OUTPUT ;CONTINUED ON NEXT PAGE SUBTTL DIRECTORY LISTING LOOP ;CONTINUED FROM PREVIOUS PAGE ;HERE TO RUN OVER THE INPUTS, AND DO THE WORK DOIT: MOVE T1,I.INZR ;INITIALIZE POINTER MOVEM T1,I.NXRD ; TO INTERP. COMMANDS MOVE T1,.JBFF ;SAVE INPUT MOVEM T1,SVJBFF ; .JBFF ISLOOP: PUSHJ P,DIR ;GO DO A DIRECTORY JFCL ;HOHUM SKIPN B.LC+.BFPTR ;SEE IF OPEN JRST ISLOP1 ;NO--SKIP THE CLOSE CLOSE LC, ;CLOSE OFF LISTING FILE STATZ LC,IO.ERR ;SEE IF ANY ERROR PUSHJ P,LCHRWR ;YES--REPORT IT RELEAS LC, ;AND RELEASE DEVICE ISLOP1: SETZM B.LC+.BFPTR ;CLEAR INITED FLAG SKIPG S.FBLD ;/FNDBLD? JRST ISLOP4 ;NO, DON'T CLOSE FIND FILES THEN WAIT DF, ;FLUSH OUT ALL DATA FILE DATA STATZ DF,IO.ERR ;ANY LAST MOMENT ERRORS? JRST DFERR ;OOPS - GIVE ERROR MESSAGE WAIT PF, ;FLUSH OUT ALL POINTER FILE DATA STATZ PF,IO.ERR ;ANY LAST MOMENT ERRORS JRST PFERR ;YES, ABORT AND GIVE MESSAGE CLOSE DF, ;CLOSE OFF DATA FILE RELEAS DF, ;DITCH DEVICE CLOSE PF, ;CLOSE OFF POINTER FILE RELEAS PF, ;GET RID OF DEVICE ISLOP4: JRST MAINLP ;ALL DONE ;FILE SCANNING ERRORS E$$TMI: MOVE T1,['DRTTMI'] ;INDICATE DIRECT MESSAGE CODE MOVE T2,["?",,[ ASCIZ \Too many source files\ ] ] ; MOVEI T3,E$$TMI ;POINT TO ERROR CODE PUSHJ P,.ERMSA## ;ISSUE MESSAGE PJRST .FMSGE## ;COMPLETE ERROR PROCESSING SUBTTL DIRECTORY LISTING ;DIR -- PERFORM A DIRECTORY LISTING ;CALL: PUSHJ P,DIR ; RETURN WHEN DONE ;OUTPUT FILE ALREADY OPENED; INPUT POINTED TO BY I.NXRD DIR: SETZM H.ZER1 ;CLEAR OUT COUNTERS MOVE T1,[H.ZER1,,H.ZER1+1] BLT T1,H.EZER SETZM ABORTI ;CLEAR ABORTION BLAG MOVEI I,0 ;FLAG LOKWLD TO START SKIPLE S.WORD ;SEE IF /WORD TROA F,R.WORD ;YES--SET WORD MODE TRZ F,R.WORD ;NO--CLEAR WORD MODE SKIPLE S.FIND ;/FIND? JRST FNDIR ;YES, SPECIAL FILE SERVICE ;HERE TO LOOP ON USER-SPECIFIED FILE SPECIFICATIONS, HANDLING ANY ;SPECIAL CASES (SUCH AS MAGTAPE OR TMPCOR) AS THEY ARISE IN THE ;INPUT FILE STREAM. DIRLP: DMOVE P3,FOBLK+.FOIOS ;GET PREVIOUS /PHYSICAL AND DEVICE TRNN F,R.NDSK ;[477] LOOPING ON DECTAPE? JRST DIRLP0 ;[477] NO RELEAS DC, ;[477] YES, ALWAYS RELEASE BEFORE CALL TO WILD SETZ P4, ;[477] AND ALWAYS FORCE A/NOTHER OPEN DIRLP0: MOVE T1,[6,,[VERWRD ;PROTOCOL VERSION I.NXRD,,I.NXZR ;POINTER TO FIRST,,LAST FSB FOBLK+.FOIOS,,LBLOCK ;OPEN,,LOOKUP BLOCK ADDRESS .FXLEN,,LN$RIB+1 ;LENGTH OF FSB,,LOOKUP FW.ADO!FW.DBS + I ;ALL DEVS; DIR BEFORE SUBDIR; WLDEOD ]] ;END OF DIRECTORY ROUTINE PUSHJ P,.LKWLD## ;GET NEXT FILE JRST DIRED ;ALL DONE--OUTPUT TOTALS ;RDH PUSHJ P,CHKNXF ;CHECK FOR NON-EXISTENT PREVIOUS FILE XOR P3,FOBLK+.FOIOS ;COMPARE /PHYS JUMPL P3,DIRLP3 ;IF /PHYS DIFFERENT, DO OPEN CAMN P4,FOBLK+.FODEV ;SEE IF DEVICE IS DIFFERENT JRST DSDEV ;DEVICE SPECIFICATION UNCHANGED, THEREFORE ; IT IS A DISK (OR DECTAPE), SO JUST PROCESS ; THE NEXT FILE RETURNED FROM WILD ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;A DIFFERENT DEVICE SPECIFICATION, MUST OPEN IT TO SEE WHAT TO DO NEXT DIRLP3: TRZ F,R.FEAT!R.NDSK ;DON'T KNOW ABOUT DEVICE YET SETZM FFPRV ; ANOTHER STICKY FLAG TO BE CLEARED MOVX T1,IO.MOD ;THE I/O MODE FIELD ANDCA T1,FOBLK+.FOIOS ;GET OPEN BLOCK I/O STATUS WORD IORI T1,.IOBIN ;READ IN BINARY MODE SKIPE S.RETR ;/NORETRY? TXZA T1,UU.DER ;NO, LET MONITOR RETRY ON ERROR TXO T1,UU.DER ;YES, FIND SOFT ERRORS TOO SKIPE S.ERLO ;/NOERLOG? TXZA T1,UU.DEL ;NO, ALLOW ERROR LOGGING TXO T1,UU.DEL ;YES, DISABLE ERROR LOGGING TXO T1,UU.SOE ;SYNCHRONIZE ON ERRORS MOVEM T1,FOBLK+.FOIOS ;SET OPEN BLOCK MOVEI T1,BFHD ;SET FOR OUR MOVEM T1,FOBLK+.FOBRH ; BUFFERS MOVE T1,SVJBFF ;RESTORE INPUT MOVEM T1,.JBFF ; .JBFF SETZM BFHD+.BFADR ;NO BUFFERS YET SETZM FOBLK+.FONBF ;NO BUFFERS TO BE BUILT (YET) SETZM FOBLK+.FOLEB ;NO LOOKUP BLOCK (YET) SETZM FOBLK+.FOPAT ;NO PATH BLOCK (YET) SETZM FOBLK+.FOPPN ;NO ON-BEHALF-OF PPN MOVE T1,[FO.PRV+] ;READ ONLY FUNCTION ON DATA CHANNEL MOVEM T1,FOBLK+.FOFNC ;SET FILOP. FUNCTION WORD ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE DIRLP5: MOVE T1,[.FONBF+1,,FOBLK] ;FILOP. ARG POINTER TO FILOP. T1, ;OPEN WILD'S SUGGESTED NEW DEVICE JRST [MOVS T4,FOBLK+.FODEV ;COPY OF DEVICE THAT FAILED CAIN T4,'TMP' ;WANT TMP:? JRST TMDEV ;YES, FAKE IT OUT PUSHJ P,E.DFF## ;ISSUE OPEN ERROR MESSAGE AOSE T1 ;IS THIS AN IGNORABLE ERROR? AOS SNFILR ;NO, COUNT AS FILE ERROR SETZM FOBLK+.FODEV ;ENSURE DEVICE IS DIFFERENT JRST DIRLP] ;GO BACK AND TRY FOR MORE MOVEI T1,DC ;DATA FILE CHANNEL DEVCHR T1, ;SEE WHAT WE ACTUALLY GOT TLC T1,-1-<(DV.TTA)>;SEE IF TLCN T1,-1-<(DV.TTA)>; NUL: JRST E.NDD ;YES--ERROR TXNE T1,DV.DSK ;LOOKING AT A DISK? JRST DSDEV ;YES TXNE T1,DV.DTA ;SEE IF DECTAPE JRST DTDEV ;YES--GO OUTPUT IT IFN FT$MTA,< ;MAGTAPES TXNE T1,DV.MTA ;SEE IF MAG TAPE JRST MTDEV ;YES--GO OUTPUT IT >;END IFN FT$MTA TXNN T1,DV.DIR ;UNKNOWN--SEE IF DIRECTORY TYPE JRST E.NDD ;NO--ISSUE MESSAGE E.UDV: N$WRNX (UDV,Unknown device type ) MOVE T1,FOBLK+.FODEV ;GET OFFENDING DEVICE PUSHJ P,.TSIXN## ;TYPE IT OUT X$$UDV: PUSHJ P,.TCRLF## ;CAP OFF THE MESSAGE SETZM FOBLK+.FODEV ;FORCE A NEW LOOKUP JRST DIRLP ;LOOK FOR MORE TO DO E.NDD: N$WRNX (NDD,Not a directory device) MOVE T1,FOBLK+.FODEV ;GET OFFENDING DEVICE PUSHJ P,.TSIXN## ;TYPE IT OUT X$$NDD: PUSHJ P,.TCRLF## ;CAP OFF THE MESSAGE SETZM FOBLK+.FODEV ;FORCE A NEW LOOKUP JRST DIRLP ;LOOK FOR MORE TO DO ;HERE ON DISK (THE NORMAL CASE) DSDEV: TRNE F,R.FEAT ;EATING .LKWLD'S DECTAPE FILES? JRST DIRLP ;YES, IGNORE THIS FILE THEN PUSHJ P,DSDIR ;DO A DISK-BASED DIRECTORY (OF ONE FILE) JFCL ;HOHUM JRST DIRLP ;TRY FOR MORE ;HERE FOR DECTAPE DTDEV: PUSHJ P,DTDIR ;DO A DECTAPE DIRECTORY JFCL ;HOHUM JRST DIRLP ;TRY FOR MORE ;HERE FOR MAGTAPE MTDEV: PUSHJ P,MTDIR ;DO A MAGTAPE DIRECTORY JFCL ;HOHUM SETZM FOBLK+.FODEV ;ENSURE A NEW OPEN IS DONE JRST DIRLP ;TRY FOR MORE ;HERE FOR TMPCOR TMDEV: PUSHJ P,TMDIR ;DO A TMP: DIRECTORY (LIST TMPCOR) JFCL ;HOHUM SETZM FOBLK+.FODEV ;ENSURE A NEW OPEN IS ATTEMPTED JRST DIRLP ;TRY FOR MORE TO DO SUBTTL DIRECTORY LISTING - DISK ;HERE FOR A DISK-BASED DIRECTORY (ONE FILE AT A TIME) DSDIR: TRZ F,R.ACCS ;CLEAR ACCESS NEEDED FLAG MOVE T3,.WIFIR## ;GET FIRST SPEC OF CURRENT SET CAMN T3,LWIFIR ;SAME AS LAST TIME WE WERE HERE? JRST DSLOK ;YES MOVEM T3,LWIFIR ;NO, NOTE WE GOT THIS FAR SETZM FRCLOK ;ASSUME NO LOOKUP REALLY NEEDED TRNE F,R.FAST ;SEE IF SUPER-SPEEDY MODE SKIPL .WLDFL## ;YES--SEE IF WILD CARD SETOM FRCLOK ;NO--NEED A LOOKUP SKIPG S.SUM ;SEE IF/SUM SKIPLE S.AUT ; OR IF /AUTHOR SETOM FRCLOK ;YES--FORCE LOOKUP SKIPG S.CHK ;SEE IF /CHECKSUM SKIPL S.ACCS ;SEE IF /ACCESS SETOM FRCLOK ;YES--FORCE LOOKUP SKIPLE S.ACCT ;SEE IF /ACCOUNT SETOM FRCLOK ;YES--FORCE LOOKUP SKIPE FRCLOK ;DIRECTORY MODE REQUIRE A LOOKUP? JRST DSLOK ;YES ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;HERE IF FAST LISTING MODE NOT NEEDING A LOOKUP (JUST WANT FILE NAME ;AND EXTENSION) - UNLESS ANY SWITCH CONSTRAINTS WERE SPECIFIED ;(SUCH AS /BEFORE OR /LENGTH). MOVE T3,.WIFIR## ;START AT START DSDIR3: SETO T4, ;NO-VALUE VALUE CAMN T4,.FXBFR(T3) ;SEE IF /BEFORE CAME T4,.FXSNC(T3) ; OR /SINCE SETOM FRCLOK ;YES--NEED A LOOKUP CAMN T4,.FXABF(T3) ;SEE IF /ABEFORE CAME T4,.FXASN(T3) ; OR /ASINCE SETOM FRCLOK ;YES--NEED A LOOKUP CAMN T4,.FXPBF(T3) ;SEE IF /PBEFORE CAME T4,.FXPSN(T3) ; OR /PSINCE SETOM FRCLOK ;YES--NEED A LOOKUP CAMN T4,.FXFLI(T3) ;SEE IF MIN /LENGTH CAME T4,.FXFLM(T3) ; OR MAX /LENGTH SETOM FRCLOK ;YES--NEED A LOOKUP LDB T4,[POINTR .FXMOD(T3),FX.TRM] ;GET FILE SPEC TERMINATOR CAIE T4,.FXTIS ;'IFSAME' ? CAIN T4,.FXTID ;'IFDIFFERENT' ? SETOM FRCLOK ;YES--NEED A LOOKUP CAIE T4,.FXTIO ;'IFOLDER' ? CAIN T4,.FXTIY ;'IFNEWER' ? SETOM FRCLOK ;YES--NEED A LOOKUP CAIE T4,.FXTIL ;'IFSMALLER' ? CAIN T4,.FXTIB ;'IFBIGGER' ? SETOM FRCLOK ;YES--NEED A LOOKUP ADDI T3,.FXLEN ;ON ONE FILE SPEC CAMG T3,.WILAS## ;SEE IF DONE ALL JRST DSDIR3 ;NO, LOOP ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;LOOKUP THE FILE IF NEEDED DSLOK: SKIPE FRCLOK ;IS A LOOKUP NECESSARY? JRST DSLOK2 ;YES, DO IT THE HARD AND SLOW WAY ;HERE IF NO LOOKUP NEEDED, JUST VERIFY THE BASIC FILE SPECIFICATION TRNE F,R.NDSK ;LOOKING AT A DISK? SETZM UFDPPN ;NO, DECTAPE, DON'T MISLEAD .CHKTA PUSHJ P,.CHKTA## ;SEE IF FILE IS REALLY OK POPJ P, ;NO, FILE REJECTED JRST DSLOK8 ;FILE IS OK, GO LIST IT ;HERE WHEN A LOOKUP IS NEEDED FOR THE FILE DSLOK2: MOVEI T1,LBLOCK ;ADDRESS OF FILE LOOKUP BLOCK MOVEM T1,FOBLK+.FOLEB ;SET IN FILOP. BLOCK MOVE T1,[.PTMAX,,THSPTH] ;ADDRESS OF FILE PATH BLOCK MOVEM T1,FOBLK+.FOPAT ;SET IN FILOP. BLOCK SETZM FOBLK+.FOPPN ;NO ON-BEHALF-OF PPN MOVX T1,FO.PRV!FO.UOC+ ;LOOKUP FILE ON OPENED CHANNEL MOVEM T1,FOBLK+.FOFNC ;SET FILOP. FUNCTION WORD MOVE T1,[.FOPAT+1,,FOBLK] ;FILOP. ARG POINTER TO TRNE F,R.NDSK ;*** LOOKING AT A DECTAPE? JRST [LOOKUP DC,LBLOCK ;*** YES, FILOP. SCREWS UP CAIA ;*** LOOKUP FAILED JRST .+3 ;*** CONTINUE WITH SUCCESSFUL LOOKUP HRRZ T1,FEXT ;*** POSITION ERROR CODE JRST .+2] ;*** PRETEND FILOP. CORRECTLY FAILED FILOP. T1, ;LOOKUP WILD'S LATEST SUGGESTED FILE PJRST DSLOE ;[475] FILOP/LOOKUP ERROR, GO PLAY WITH IT MOVEI T2,THSPTH ;ADDRESS OF RETURNED PATH BLOCK MOVEM T2,UFDPPN ;SET TRUE FILE PATH TRNE F,R.NDSK ;IS THIS REALLY A DISK FILE? JRST [SETZM UFDPPN ;DECTAPE, NO DIRECTORY EVER SETOM FFPRV ;NO PROTECTION EITHER SKIPG T2,FSIZ ;GET A POSITIVE WORD COUNT? HLRE T2,FSIZ ;NO, NEGATIVE IN LH (DTA'S ARE WIERD) MOVMM T2,FSIZ ;SET POSITIVE WORD COUNT JRST .+1] ;AND KEEP PRETENDING TO BE A DISK PUSHJ P,.CHKTA## ;GOT THE FILE, SEE IF WE REALLY WANTED IT JRST [MOVEI T3,CL.ACS ;DON'T UPDATE ACCESS DATE MOVE T2,[DC,,.FOCLS] ;WITH THE FILOP. CLOSE FUNCTION MOVE T1,[2,,T2] ;FILOP. ARG POINTER TO FILOP. T1, ;CLOSE THE SUCCESSFULLY-LOOKUP'ED FILE JFCL ;DUH? POPJ P,] ;TOSS THIS FILE AND LOOK FOR ANOTHER ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;NOW ALLOCATE DISK BUFFERS, IF NOT ALREADY SETUP SKIPE BFHD+.BFADR ;GOT A BUFFER RING? JRST DSLOK4 ;YES HRROI T3,.GTLBS ;GETTAB ARGUMENT TO GETTAB T3, ;READ DEFAULT LARGE BUFFER SIZE SKIPA T1,[NM$DBF,,LN$DBF] ;UNDEFINED, REVERT TO STANDARD BUFFERING MOVE T1,[NM$LBS,,LN$LBS] ;SELECT LARGE BUFFERING TRNE F,R.NDSK ;ACTUALLY GOT A DECTAPE? HRRI T1,LN$BLK ;YES, USE SMALL BUFFERS SKIPLE .FXBLS(I) ;DID USER GIVE /BLOCKSIZE? HRR T1,.FXBLS(I) ;YES, USE HIS VALUE THEN SKIPLE .FXBFN(I) ;DID USER GIVE /BUFFERS? HRL T1,.FXBFN(I) ;YES, USE HER VALUE THEN MOVEI T2,BFHD ;ADDRESS OF BUFFER RING HEADER PUSHJ P,MAKBUF ;BUILD DISK INPUT BUFFER RING DSLOK4: TRNN F,R.NDSK ;IF LOOKING AT A DISK SKIPG S.DTL ;SEE IF /DETAIL JRST DSLOK8 ;NOT A DISK, OR NOT /DETAIL USETI DC,0 ;POSITION TO RIB IN DC, ;READ RIB SKIPA T1,BFHD+.BFPTR ;GET BUFFER POINTER JRST DSLOK8 ;ERROR--CAN'T READ RIB MOVE T1,200(T1) ;GET POINTER TO SELF MOVEM T1,FRIBLK ;SAVE FOR OUTPUT MOVNI T1,200 ;SIZE OF BLOCK 0 (RIB) ADDM T1,BFHD+.BFCTR ;SKIP IT (WANT TO CHECKSUM ONLY USER DATA) MOVEI T1,200 ;SIZE OF BLOCK 0 (RIB) ADDM T1,BFHD+.BFPTR ;ADVANCE BYTE POINTER PAST BLOCK 0 ;FILE IS GOOD, GO LIST IT DSLOK8: PUSHJ P,ANALYZ ;GO ANALYZE AND PRINT RESULTS JFCL ;IGNORE SKIPE FRCLOK ;WAS A LOOKUP PERFORMED? CLOSE DC,CL.ACS ;YES, MAKE SURE IT GOES AWAY PEACEABLY JRST .POPJ1## ;RETURN FOR ANOTHER FILE ;[475] HERE IF FILOP./LOOKUP ERROR DSLOE: PUSH P,T1 ;SAVE FILOP. ERROR CODE MOVEI T1,DSLOF ;SPECIAL OUTPUT INTERCEPT ROUTINE (GROAN) PUSHJ P,.TYOCH## ;IN CASE ERROR MESSAGE OUTPUT MOVEM T1,DSLOET ;SAVE ORIGINAL OUTPUT ROUTINE POP P,T1 ;RESTORE FILOP. ERROR CODE PUSHJ P,E.DFF## ;NOTE FILE ACCESS FAILURE AOSE T1 ;WAS IT AN IGNORABLE ERROR? AOS SNFILR ;NO, COUNT AS FILE ERROR SKIPE T1,DSLOET ;NEED TO RESTORE TYPEOUT ROUTINE? PUSHJ P,.TYOCH## ;YES POPJ P, ;SO MUCH FOR THAT FILE ;HERE IF ABOUT TO OUTPUT AN ERROR MESSAGE (?PROT FAILURE, ETC.), MUST FIRST ;CALL SSTRDR TO MAKE SURE ANY DEV/DIR HEADER IS DONE, AND ENSURE THAT THE ;ERROR SUMMARY IS KEPT REASONABLY ACCURATE DSLOF: PUSHJ P,.PSH4T## ;SAVE THE T'S PUSH P,P1 ;AND P1 TOO SETZ T1, ;CLEAR TYPEOUT ROUTINE EXCH T1,DSLOET ;AND FETCH ORIGINAL PUSHJ P,.TYOCH## ;MAKE OUTPUT HAPPEN AGAIN TRNE F,R.NDSK ;DISK OR OTHERWISE? JRST [SETZM UFDPPN ;OTHERWISE (DECTAPE), NO DIRECTORY JRST DSLOF6] ;LET SSTRDR DO ITS THING MOVEI T1,THSPTH ;ADDRESS WHERE WE WANT THE PATH MOVE P1,UFDPPN ;GET REAL (MAYBE) PPN/PATH POINTER TLNE P1,-1 ;PPN OR PATH? JRST [MOVEM P1,.PTPPN(T1) ;PPN, SET IN PATH BLOCK SETZM .PTSFD(T1) ;NO SFD'S THIS TIME JRST DSLOF5] ;GO POINT TO PATH BLOCK HRL T1,P1 ;PATH, CONCOCT BLT POINTER TO BLT T1,THSPTH+.PTMAX-1 ;COPY OVER PATH SPECIFICATION DSLOF5: MOVEI T1,THSPTH ;ADDRESS OF PATH BLOCK MOVEM T1,UFDPPN ;SET SO AS NOT TO CONFUSE SSTRDR DSLOF6: SETZ P1, ;CLEAR FOR FOLLOWING CALL TO SSTRDR TO PUSHJ P,SSTRDR ;TRACK DIRECTORIES CORRECTLY FOR SUMMARIES POP P,P1 ;RESTORE P1 PUSHJ P,.POP4T## ;RESTORE THE T'S PJRST .TCHAR## ;[501] NOW GO DO THE ERROR MESSAGE ;HERE AT END OF DISK DIRECTORY DIRED: PUSH P,T1 ;SAVE .LKWLD TERMINATION CODE MOVEM I,I.NXRD ;STORE PROGRESS JUMPE P4,DIRDON ;IF NO DISKS PENDING, GO WRAP UP DIREDF: PUSHJ P,DIRET ;GO OUTPUT TOTALS LINE ;HERE WHEN DONE WITH DISKS--SEE IF NEXT DEVICE IS REASONABLE AND GO DISPATCH DIRDON: CLOSE DC,CL.ACS ;[477] MAKE SURE FILE (IF ANY) IS LEFT IN PEACE RELEAS DC, ;[477] AND GET RID OF THE DEVICE (IF ANY) MOVE T1,SVJBFF ;RESTORE INPUT MOVEM T1,.JBFF ; .JBFF SETZM H.ZER1 ;CLEAR ACCUMULATION AREA MOVE T2,[H.ZER1,,H.ZER1+1] ; .. BLT T2,H.EZER ; .. POP P,T1 ;RESTORE DEVCHR OF NEXT DEVICE CAMN T1,[-1] ;SEE IF ALL DONE POPJ P, ;YES--RETURN N$FAIL (LEU,.LKWLD returned unknown termination reason) ;CALLED FROM WILD AT END OF DIRECTORY WLDEOD:;RDH PUSHJ P,CHKNXF ;CHECK FOR NON-EX FILE ERROR TRNE F,R.FAST ;IF /F SKIPLE S.SUM ; AND NOT /SUM SKIPN .WLDFL## ;SEE IF MULTIPLE DIRECTORIES PJRST .TNEWL ;RETURN PJRST SUBTOT ;YES--ISSUE SUBTOTALS SUBTTL DIRECTORY LISTING - DECTAPE ;HERE WHEN DEVICE IS A DECTAPE ; ;UNLESS /DTA WAS SPECIFIED, TREAT DECTAPE JUST LIKE DISKS, PUTTING ;WHATEVER SMARTS ARE NEEDED IN "NORMAL" DISK SERVICE TO HANDLE DECTAPES' ;VARIOUS IDIOSYNCASIES . . . DTDIR: TRO F,R.NDSK ;INDICATE NOT A DISK SKIPG S.DTA ;/DTA (OLD COMPACT LISTING FORMAT)? JRST DSDIR ;NO, TREAT AS "NORMAL" DIRECTORY DEVICE TRO F,R.FEAT ;YES, MUST EAT SOME .LKWLD RETURNS SETSTS DC,IO.SSD!IO.NSD!.IODMP ;CHANGE TO SPECIAL MODE USETI DC,^D100 ;READ DIRECTORY BLOCK MOVE T1,[IOWD 200,DIRB] MOVEI T2,0 IN DC,T1 ;READ IN THE DIRECTORY BLOCK JRST .+2 ;IF OK PUSHJ P,DTERR ;IF ERROR READING ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE DTDIR4: SETSTS DC,.IOASC ;SET TO ASCII (BUFFER) IN CASE ; SAME DEVICE IS LISTING DEVICE SKIPE T2,DIRB+177 ;SEE IF TAPE IDENT FIELD CAMN T2,[-1] ;IS 0 OR -1 JRST DTDIR5 ;YES--DON'T PRINT MOVEI M,[ASCIZ /Tape ID: /] PUSHJ P,LSTR ;LIST NAME PUSHJ P,LSIX ;LIST IDENTIFICATION PUSHJ P,LCRLF ;END OF LINE DTDIR5: MOVEI M,[ASCIZ /Free: /] PUSHJ P,LSTR ;LIST LABEL FOR SPACE MOVSI J,-27 ;COUNT FREE BLOCKS ; ALSO PRESET J FOR LATER PUSHJ P,DTCNT ;FREE IF IN FILE #0 PUSH P,T1 ;SAVE BLOCK COUNT PUSHJ P,LDEC3 ;PRINT AS 3 DIGITS POP P,T1 ;RESTORE BLOCK COUNT MOVEI M,[ASCIZ\ blocks, \] ;ASSUME PLURAL CAIN T1,1 ;EXACTLY ONE BLOCK? MOVEI M,[ASCIZ\ block, \] ;YES, USE SINGULAR FORM INSTEAD PUSHJ P,LSTR ;IDENTIFY COUNT FIELD MOVEI T1,0 ;INITIALIZE FREE FILE COUNTER MOVEI T2,26 ;INITIALIZE FILE COUNTER DTDIR6: SKIPN DIRB+122(T2) ;LOOK AT FILE NAME FIELD ADDI T1,1 ;IF =0, COUNT FREE SOJG T2,DTDIR6 ;LOOP FOR 22 FILES PUSH P,T1 ;SAVE FILE COUNT PUSHJ P,LDEC2 ;PRINT RESULT POP P,T1 ;RETRIEVE FREE-FILE COUNT MOVEI M,[ASCIZ\ files\] ;ASSUME PLURAL CAIN T1,1 ;EXACTLY ONE FILE? MOVEI M,[ASCIZ\ file\];YES, SINGULAR THEN PUSHJ P,LSTR ;AND FINISH LABELING PUSHJ P,LCRLF ;AND FINISH LINE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;HERE TO LOOP OVER FILES AND PRINT ONE LINE EACH DTFIL0: AOBJP J,DTDON ;INCREMENT TO NEXT FILE SKIPN T1,DIRB+122(J) ;SEE IF IN USE JRST DTFIL0 ;NO--LOOP BACK MOVEM T1,FNAM ;SAVE FILE NAME HLLZ T1,DIRB+150(J) ;GET EXTENSION MOVEM T1,FEXT ;SAVE SETZM UFDPPN ;CLEAR DIRECTORY WORD AOS NOFIL ;COUNT A FILE SEEN PUSHJ P,.CHKTA## ;SEE IF THIS FILE MATCHES JRST DTFIL0 ;NO, REJECT IT AND TRY ANOTHER ONE AOS NOFILF ;GOOD FILE, COUNT IT AS FILE FOUND AOS NXFCNT ;AND AS FILE PROCESSED ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE DTFIL1: TRNN F,R.FAST ;SEE IF /FAST SKIPG S.SUM ; OR NOT /SUM SKIPA ;YES--PROCEED JRST DTFIL4 ;NO--SKIP OUTPUT MOVE T2,FNAM ;GET FILE NAME MOVEI T3,6 ;USE 6 SPACES PUSHJ P,LSIXC ;LIST IT MOVEI C,"." ;USE . AS SEPARATOR PUSHJ P,LCHR ;PRINT IT HLLZ T2,FEXT ;GET EXTENSION MOVEI T3,3 ;USE 3 SPACES PUSHJ P,LSIXC ;LIST IT DTFIL4: PUSHJ P,DTCNT ;COUNT BLOCKS ADDM T1,NOBLKS ;COUNT FOR SUMMARY SKIPG S.SUM ;IF /SUMMARY TRNE F,R.FAST ;SEE IF /FAST SWITCH JRST DTFIL6 ;YES--THAT'S ALL PUSHJ P,LSPC ;NO--ADD A SPACE PUSHJ P,LDEC3 ;TYPE AS THREE DIGITS PUSHJ P,LSPC2 ;TYPE TWO SPACES LDB T4,[POINT 12,DIRB+150(J),35] ;GET CREATION HRRZ T1,J ;GET FILE NUMBER (1-22.) MOVEI T2,1 ;GET A TEST BIT TDNE T2,DIRB+^D43(J) ;TEST THE EXTENSION BITS TRO T4,1B21 ; AND COPY TO RESULT TDNE T2,DIRB+^D21(J) ; .. TRO T4,1B22 ; .. TDNE T2,DIRB-1(J) ; .. TRO T4,1B23 ; .. PUSHJ P,LDATE ;LIST CREATION DATE DTFIL6: TRNE F,R.FAST ;IF /F JRST DTFIL7 ;THEN DON'T TEST /SUM SKIPLE S.SUM ;IF /SUM JRST DTFIL0 ;BACK FOR MORE FILES DTFIL7: MOVE T2,NOCHRS ;GET # CHARS SO FAR CAMG T2,MXWDTH ;END OF LINE? JRST DTFIL8 ;NO, OUTPUT TAB PUSHJ P,LCRLF ;FINISH OFF LINE JRST DTFIL0 ;LOOP BACK FOR MORE DTFIL8: PUSHJ P,LTAB ;OUTPUT TAB JRST DTFIL0 ;LOOP BACK FOR MORE DTDON: RELEASE DC, ;GIVE DEVICE BACK NOW SETZM FOBLK+.FODEV ;ENSURE A NEW OPEN IS ATTEMPTED JRST DIREND ;CAP OFF THE DIRECTORY ;DTCNT -- ROUTINE TO COUNT NUMBER OF BLOCKS IN A FILE ;CALL: HRRI J,FILE NUMBER (0-22) ; PUSHJ P,DTCNT ; RETURN WITH T1=NUMBER OF BLOCKS ALLOCATED ;USES T2, T3, T4 DTCNT: MOVEI T1,0 ;PRESET COUNT MOVE T2,[POINT 5,DIRB] ;PRESET POINTER TO ALLOCATION TABLE MOVEI T3,1101 ;PRESET COUNT OF NUMBER ON TAPE DTCNT1: ILDB T4,T2 ;PICK UP FILE OF NEXT BLOCK ON TAPE CAIN T4,(J) ;COMPARE WITH REQUEST ADDI T1,1 ;MATCHES--COUNT SOJG T3,DTCNT1 ;LOOP OVER ENTIRE TAPE POPJ P, ;RETURN ;ERRORS DTERR: GETSTS DC,P3 ;GET STATUS SETSTS DC,.IOASC ;SET TO ASCII (BUFFER) FOR LISTING TXNN P3,IO.DTE!IO.DER;UNLESS PAR.ERR. OR DEV.ERR., PJRST E.TFR ; GO GIVE FATAL ERROR TXNN P3,IO.DTE ;SEE IF PARITY ERROR JRST E$$DDM ;NO--MUST BE DEVICE ERROR N$WRNX (DPE,) JRST DTERR1 ;GO DO COMMON STUFF N$WRNX (DDM,) DTERR1: HRRZ T1,P3 ;GET STATUS PUSHJ P,.TOCTW## ;ISSUE IN OCTAL MOVEI T1,[ASCIZ \, in directory block on \] PUSHJ P,.TSTRG## ;ISSUE EXPLANATION MOVE T1,.FXDEV(I) ;GET DEVICE PUSHJ P,.TSIXN## ;ISSUE IN SIXBIT PUSHJ P,.TCOLN## ;INDICATE IT'S A DEVICE X$$DDM:! X$$DPE: PJRST .TCRLF## ;END MESSAGE E.TFR: N$FAIO (TFR,Data error reading DECtape directory, status) SUBTTL DIRECTORY LISTING - MAGTAPE IFN FT$MTA,< ;MAGTAPES ;HERE WHEN MAG TAPE IS DISCOVERED MTDIR: TLZ F,L.MLBL!L.MLBP ;DON'T KNOW ABOUT LABELS YET SKIPE S.REWS ;UNLESS /NOREW MTREW. DC, ;REWIND TAPE TO START SKIPLE S.WORD ;SEE IF /WORD TRO F,R.WORD ;YES--SET FLAG ;SETUP FOR .CHKTA CALLS TO VERIFY SELECTED FILE SOS .CTFLS## ;BACKOFF WILD'S "FILES SEEN" FLAG SOS .CTFLF## ;BACKOFF WILD'S "FILES FOUND" FLAG ; LEAVE THE OTHER COUNTERS ALONE. WILD WILL ; CHOOSE AN APPROPRIATE ERROR MESSAGE LATER ; FROM "NO SUCH FILES" OR "ALL FILES REJECTED" ; SHOULD ANY BE NEEDED SETOM .WXPRC## ;FORCE FULL FILE SPECIFICATION CHECK MOVE T3,.WIFIR## ;ADDRESS OF [PRESUMED] FILE SPEC BLOCK DMOVE T1,.FXDEV(T3) ;GET ACTUAL DEVICE SPEC DMOVEM T1,MTXDEV ;SAVE IT AWAY MOVSI T1,'* ' ;FULL WILD NAME SETZ T2, ;FULL WILD MASK DMOVEM T1,.FXDEV(T3) ;INDICATE ANY "STR" ACCEPTABLE TO START WITH MOVX T1,FX.WDV ;THE WILDCARDS-IN-DEVICE FLAG IORM T1,.FXFLD(T3) ;SET THAT ON G.P.'S SKIPN T1,.WLDFL## ;SEE IF NO WILD FILE OR STR AOS T1,.WLDFL## ;YES--MAKE WILD STR ONLY CAMN T1,[-1] ;SEE IF WILD FILE ONLY SOS .WLDFL## ;YES--MAKE WILD FILE AND STR MOVE T1,.JBFF ;SAVE .JBFF TO AVOID MOVEM T1,MTSVFF ; CORE GROWTH ON REOPENS MOVEI T1,DC ;GET PHYSICAL DEVNAM T1, ; NAME OF TAPE MOVE T1,FOBLK+.FODEV ;(OR LOGICAL IF UNKNOWN) MOVEM T1,MTNAME ;DRIVE FOR MESSAGES MOVE T1,S.FILE ;SET /FILE MOVEM T1,MTFLCT ;INTO FILE COUNTER ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;ALLOCATE I/O BUFFERS FOR TAPE READING MOVE T1,FOBLK+.FOIOS ;GET "OPEN" BLOCK STATUS MOVEI T2,DC ;AND "DEVICE" MOVEI T4,T1 ;ADDRESS OF "OPEN" BLOCK DEVSIZ T4, ;ASK FOR A FALL-BACK BUFFERING SIZE MOVEI T4,LN$MRC+3 ;??? ASSUME A DEFAULT MOVEI T3,DC ;"ADDRESS" OF MAGTAPE DEVICE MOVEI T2,.TFBSZ ;RETURN BUFFER SIZE FUNCTION MOVE T1,[2,,T2] ;TAPOP. ARG POINTER TO TAPOP. T1, ;ASK FOR TAPE BLOCKSIZE MOVEI T1,-2(T4) ;USE DEVSIZ DEFAULT THEN SUBI T1,1 ;ACCOUNT FOR RING OVERHEAD WORD IN TAPOP. CAIGE T1,LN$MRC ;SEE IF MIN TAPE OR BIGGER SIZE MOVEI T1,LN$MRC ;NO--FORCE UP SKIPLE .FXBLS(I) ;DID USER SAY /BLOCKSIZE ??? HRRZ T1,.FXBLS(I) ;YES, ASSUME HE KNOWS BETTER THAN WE DO MOVEM T1,MTFBSZ ;SAVE BUFFERSIZE PUSH P,[-1] ;[473] INIT THE KRUFTY LABEL BUG WORKAROUND MTDIR4: HRLI T1,NM$MBF ;NUMBER OF BUFFERS SKIPLE .FXBFN(I) ;DID USER SPECIFY NUMBER OF BUFFERS? HRL T1,.FXBFN(I) ;YES, TAKE HER WORD FOR IT. MOVEI T2,BFHD ;POINT TO HEADER PUSHJ P,MAKBUF ;MAKE A BUFFER RING ;NOW DO A "DUMMY" IN TO FORCE THE TAPE DENSITY CORRECT GETSTS DC,T1 ;CURRENT I/O STATUS TXO T1,IO.SYN ;FORCE SYCHRONOUS MODE SETSTS DC,(T1) ;TELL MONITOR TO READ ONLY ONE BUFFER MTWAT. DC, ;WAIT FOR THE TAPE TO SETTLE DOWN IN DC, ;READ FIRST BLOCK (SET DENSITY, CHECK BLOCKSIZE) JRST MTDRH ;EVERYBODY SEEMS HAPPY ENOUGH . . . AOSN 0(P) ;[473] FIRST TIME HERE? PUSHJ P,MTLBIN ;[473] READ LABEL INFO NOW, MTBSR. DESTROYS IT! GETSTS DC,T4 ;SOMEBODY IS UNHAPPY TXNE T4,IO.EOF ;START OFF WITH END OF FILE? JRST [CLOSE DC, ;YES, CLEAR END OF FILE MTBSF. DC, ;BACKSPACE OVER IT JRST MTDRH] ;AND BLUNDER ONWARDS TXC T4,IO.ERR ;NOT END OF FILE, MUST BE ERROR OF SOME SORT MTBSR. DC, ;BACKSPACE OVER THE OFFENDING RECORD TXCE T4,IO.ERR ;EXTENDED I/O ERROR STATUS? TXNN T4,IO.BKT ;NO, NORMAL - BLOCK TOO LARGE? JRST MTDRH ;NOT BLOCK TOO LARGE, GO SEE WHAT HAPPENS SKIPLE .FXBLS(I) ;DID USER EXERT EXPLICIT CONTROL OVER BLOCKSIZE? JRST MTDRH ;YES, NO DEFAULTING ON OUR PART THEN (HE LOSES) ;CONTINUED ON NEXT PAGE ;CONTINUED ON NEXT PAGE ;OUR TAPE BUFFERS ARE NOT BIG ENOUGH, TRY TO GROW THEM TXZ T4,IO.BKT ;CLEAR ERROR BIT SETSTS DC,(T4) ;AND TELL THE MONITOR TO CLEAR ITS COPY ;[472] CLOSE DC, ;TRY TO SYNC WITH TAPE SERVICE MOVE T1,MTFBSZ ;GET CURRENT BLOCKSIZE ADDI T1,2000 ;ADVANCE A K ANDCMI T1,1777 ;ESTHETICALLY PLEASING BIT PATTERN(S) MOVEM T1,MTFBSZ ;SET NEW PROPOSED BLOCK SIZE N$WRNX (XMB,Expanding magtape I/O buffers to ) MOVE T1,MTFBSZ ;GET NEW SIZE PUSHJ P,.TDECW## ;TELL USER MOVEI T1,[ASCIZ\ words\] ;A HARMLESS NOISE WORD PUSHJ P,.TSTRG## ;PUT IT OUT TOO X$$XMB: PUSHJ P,.TCRLF## ;CAP OFF THE WARNING MESSAGE MOVE T1,MTSVFF ;GET BACK OLD START OF BUFFER ALLOCATION MOVEM T1,.JBFF ;RESET FOR NEW BUFFER ALLOCATION ATTEMPT MOVE T1,MTFBSZ ;RETRIEVE NEW PROPOSED BUFFERSIZE JRST MTDIR4 ;GO REBUILD BUFFERS AND TRY AGAIN MTDRH: GETSTS DC,T1 ;READ CURRENT I/O STATUS TXZ T1,IO.SYN!IO.EOF!IO.ERR ;CLEAR OUT OBNOXIOUS BITS SETSTS DC,(T1) ;AND TELL THE MONITOR TO TAKE OFF MTWAT. DC, ; (NOT THAT I DON'T TRUST TAPSER, BUT . . .) POP P,T1 ;[473] RETRIEVE MTLBIN COUNTER AOSN T1 ;[473] CALL MTLBIN IF HAVEN'T ALREADY DONE SO PUSHJ P,MTLBIN ;SETUP TAPE LABEL PARAMETERS (IF ANY) SETZB P1,P2 ;CLEAR REGISTERS FOR LATER MOVE T4,[2,,T2] ;SETUP FOR 5.07 MTCHR. MOVEI T2,DC ;POINT TO RIGHT CHANNEL MTCHR. T4, ;TRY IT JRST MTDN57 ;NOT 5.07 YET MOVE T2,T4 ;OK--COPY AC BITS MOVE P2,T3 ;SAVE REELID TRNE T4,1B32 ;COPY 7-TRACK FLAG TRO P1,1B32 ;(SAME AS DEVSTS) TRNE T4,1B31 ;COPY RING STATUS TRO P1,1B33 ;(SAME AS DEVSTS) JRST MTDI57 ;AND PROCEED MTDN57: SETOM P1 ;FLAG DEVSTS NEEDED MOVEI T2,DC ;GET TAPE DENSITY MTCHR. T2, ; FROM MONITOR JRST [GETSTS DC,T2 ;NO--FROM INIT ANDI T2,IO.DEN ;JUST GET DENSITY JUMPE T2,MTNODN ;JUMP IF UNKNOWN LSH T2,^D33-^L ;POSITION JRST .+1] ;PROCEED MTDI57: MOVEI T1,[ASCIZ / Read Density:/] PUSHJ P,.TSTRG## ;LIST LABEL ANDI T2,7 ;MASK TO DENSITY MOVE T2,[ASCIZ /???/ ASCIZ /200/ ASCIZ /556/ ASCIZ /800/ ASCIZ /1600/ ASCIZ /6250/ ASCIZ /(6)/ ASCIZ /(7)/](T2) MOVEI T1,T2 ;SET MESSAGE PUSHJ P,.TSTRG## ;LIST IT >;END IFN FT$MTA ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE IFN FT$MTA,< ;MAGTAPES MTNODN: MOVEI T1,[ASCIZ / Parity:/] PUSHJ P,.TSTRG## ;LABEL MOVEI T1,[ASCIZ /Odd/] STATZ DC,IO.PAR MOVEI T1,[ASCIZ /Even/] PUSHJ P,.TSTRG## ;LIST PARITY JUMPGE P1,MTNODO ;SKIP DEVSTS IF 5.07 MOVEI P1,DC ;NOW GET DEVICE STATUS DEVSTS P1, ;(HARDWARE STATUS SINCE SOFTWARE LOOSES) JRST MTNODS ;GIVE UP IF WE CAN'T MTNODO: MOVEI T1,[ASCIZ / 7-Track/] TRNN P1,1B33 ;CHECK NUMBER OF TRACKS MOVEI T1,[ASCIZ / 9-Track/] PUSHJ P,.TSTRG## ;LIST THAT MOVEI T1,[ASCIZ / Read only/] TRNN P1,1B32 ;CHECK WRITE LOCK MOVEI T1,[ASCIZ / Write enabled/] PUSHJ P,.TSTRG## ;LIST THAT JUMPE P2,MTNODS ;DONE IF NO REELID MOVEI T1,[ASCIZ / REELID:/] PUSHJ P,.TSTRG## ;ISSUE PREFIX MOVE T1,P2 ;GET ID PUSHJ P,.TSIXN## ;OUTPUT IT MTNODS: PUSHJ P,.TCRLF## ;END LINE TLZN F,L.FKEF ;CHECK IF EOF JRST MTFIND ;NO--GO HANDLE DATA SKIPGE ABORTI ;TIME TO ABORT INPUT OPERATIONS? JRST MTABO ;YES - TAPE IS USELESS NOW PUSHJ P,MTLPRT ;PRINT FILE INFO IF ANY N$WARN (TSM,Tape starts with tape mark) MTSTEF: CLOSE DC, ;CLEAR END-OF-FILE SOSN MTFLCT ;DO /FILE ACCOUNTING JRST MTDONX ;EXIT IF /FILE COUNTED OUT PUSHJ P,NEXOVW ;AGAIN, TRY TO READ A WORD JRST .+2 ;ANOTHER EOF JRST MTEXAM ;NO--GO EXAMINE TAPE N$WARN (ATM, and another tape mark) TLNE F,L.MLBP ;CONTROLLED BY TAPE LABEL PROCESSOR JRST MTDONE ;YES, THEN THERE IS NO HOPE JRST MTSTEF ;LOOP UNTIL WE GET SOME DATA >;END IFN FT$MTA IFN FT$MTA,< ;MAGTAPES ;HERE WHEN DEVICE IS OPEN AND TIME TO LOOK AT NEXT FILE TO SEE IF ;IT IS A SAVE SET ;FORMATS: IF THE FIRST WORD IS NON-ZERO AND, ; 0-17 = 0, THEN BACKUP FORMAT ; 0-14 = 0, 15-17 NOT 0, THEN FRS FORMAT ; 0-17 = 1???, THEN .EXE OR SOME SUCH ; 0-17 GE 27, THEN FAILSA (LEVEL-D) FORMAT ; [ 0-5 NOT 0, 6-17 = 0, THEN OLD BACKUP/RESTORE FORMAT ] ; 0-17 NEGATIVE, THEN EITHER: ; ASCII OR SIXBIT LABEL ; HRI FORMAT ; SAVE FORMAT MTFIND: PUSHJ P,NEXOVW ;GET NEXT WORD JRST MTEOF ;END OF FILE--GO HANDLE THAT CASE MTEXAM: MOVEM T1,CHKSUM ;SETUP CHECKSUM IN CASE THAT'S IMPORTANT IFN FT$MTL< ;LABELS/VIA TAPOP PUSHJ P,MTLPRT ;TRY TO TELL ABOUT FILE MOVE T1,CHKSUM ;GET BACK FIRST DATA WORD >;END IFN FT$MTL MOVEI T2,1 ;SET WORD COUNTER IFN FT$MTB,< ;BACKUP/FRS TLNN T1,777770 ;SEE IF FRS OR BACKUP JUMPN T1,MTFRSS ;YES--GO HANDLE >;END IFN FT$MTB IFN FT$MTR,< ;OLD BACKUP/RESTORE TLNN T1,7777 ;SEE IF OLD BACKUP/RESTORE SAVE SET JRST MTBKSS ;YES--GO PROCESS >;END IFN FT$MTR TLNN T1,776000 ;IF 1??? TLNN T1,1000 ; .. SKIPA ;NO--PROCEED JRST MTIOW ;YES--HANDLE AS SAVE FILE IFN FT$MTF, JUMPG T1,MTSVST ;JUMP IF LOOKS LIKE FAILSA SAVE SET >;END IFN FT$MTA ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE IFN FT$MTA,< ;MAGTAPES MOVE T3,T1 ;GET COPY OF WORD TRZ T3,77777 ;REDUCE TO FIRST THREE ASCII CHARS MOVSI T4,-LNLBLT ;POINT TO LABEL TYPES TABLE CAME T3,LABTYP(T4) ;SEE IF ASCII LABEL AOBJN T4,.-1 ;LOOP TO MATCH JUMPL T4,MTLABL ;YES--GO READ ASCII LABEL TRZ T3,-1 ;CLEAR DOWN TO SIXBIT TYPE MOVSI T4,-LNLB6T ;POINT TO SIXBIT LABELS TABLE CAME T3,LABTY6(T4) ;SEE IF SIXBIT LABEL AOBJN T4,.-1 ;LOOP TO MATCH JUMPL T4,MTLAB6 ;YES--GO READ SIXBIT LABEL JRST MTIOW ;ELSE, GO READ AS SAVE OR HRI FILE ;ASCII LABELS LABTYP: ASCII /VOL/ ;BEGINNING OF VOLUME ASCII /UVL/ ;USER VOLUME ASCII /EOV/ ;END OF VOLUME ASCII /UTL/ ;USER TRAILER ASCII /HDR/ ;BEGINNING OF FILE ASCII /UHL/ ;USER HEADER ASCII /EOF/ ;END OF FILE LNLBLT==.-LABTYP ;SIXBIT LABELS LABTY6: SIXBIT /VOL/ ;BEGINNING OF VOLUME SIXBIT /UVL/ ;USER VOLUME SIXBIT /EOV/ ;END OF VOLUME SIXBIT /UTL/ ;USER TRAILER SIXBIT /HDR/ ;BEGINNING OF FILE SIXBIT /UHL/ ;USER HEADER SIXBIT /EOF/ ;END OF FILE LNLB6T==.-LABTY6 >;END IFN FT$MTA IFN FT$MTL,< ;IF DOING LABEL INFO VIA TAPOP... ;This routine will try to print information about a labeled tape ; which can be obtained via the .TFLPR TAPOP. ; The magtape should be open on DC ; The tape is not moved. MTLBIN: PUSHJ P,.SAVE4## ;PRESERVE THE P ACS MOVE P1,[2,,P2] ;POINT AT THE ARG BLOCK MOVEI P2,.TFLBL ;CODE TO GET LABEL TYPE MOVEI P3,DC ;GET OPEN CHANNEL MOVEM P3,M.MTLB+.TPDEV;SAVE DEVICE SPECIFIER (CHAN #) TAPOP. P1, ;FIND OUT THE LABEL TYPE POPJ P, ;CAN'T, SO GET OUT CAIN P1,0 ;CONTROLLED BY LABEL PROCESSOR POPJ P, ;NO, NOTHING TO DO WITH LABELS TLO F,L.MLBP ;YES, EVEN IF "UNLABELED" CAIL P1,.TFLAL ;IS IT ANSI ? CAILE P1,.TFLIU ;OR EBCDIC (IBM) POPJ P, ;NO, NO LABELS TO READ MOVEI P1,.TFLPR ;FUNCTION CODE - LABEL PARAMETERS MOVEM P1,M.MTLB+.TPFUN;SAVE FUNCTION CODE MOVE P1,[.TPLEN,,M.MTLB] ;AIM AT THE LABEL PARAMETER BLOCK TAPOP. P1, ;READ THE LABEL PARAMS OF THE NEXT FILE POPJ P, ;CAN'T, SO GET OUT NOW! TLO F,L.MLBL ;TAPE CONTROLLED BY LABEL PROCESSOR POPJ P, ;NOW RETURN ;RINT OUT THE TAPE LABEL INFORMATION AS SUPPLIED BY MTLBIN MTLPRT: SKIPN M.MTLB+.TPFNM ;ANY DATA THERE ??? POPJ P, ;NO, RETURN PUSHJ P,.SAVE4## ;PRESERVE THE P ACS TLZ F,L.CRLF ;DAMMIT, A NEW LINE! PUSHJ P,LCRLF ;BLANK LINE MOVEI M,[ASCIZ/ Labeled tape file information:/] PUSHJ P,LSTR ;TYPE THAT PUSHJ P,LCRLF ;START A NEW LINE MOVEI M,[ASCIZ/ File Name:"/] PUSHJ P,LSTR ;TYPE THAT MOVEI M,M.MTLB+.TPFNM ;AIM AT FILENAME PUSHJ P,LSTR ;TYPE FILENAME STRING MOVEI C,"""" ;TRAILING QUOTE PUSHJ P,LCHR ;ALWAYS CLOSE OFF THE FILENAME LDB T1,[POINTR M.MTLB+.TPGEN,TP.GEN] ;GET GENERATION NUMBER JUMPE T1,MTLPR3 ;SKIP IF NOT GENERATION DATASET MOVEI M,[ASCIZ/, Generation:/] PUSHJ P,LSTR ;LIST DESCRIPTOR PUSHJ P,LDEC ;LIST GENERATION AS DECIMAL MTLPR3: LDB T1,[POINTR M.MTLB+.TPGEN,TP.VER] ;GET VERSION NUMBER JUMPE T1,MTLPR4 ;SKIP IF NO VERSION FIELD MOVEI M,[ASCIZ/, Version:/] PUSHJ P,LSTR ;LIST DESCRIPTOR PUSHJ P,LDEC ;LIST VERSION AS DECIMAL MTLPR4: PUSHJ P,LCRLF ;CAP OFF THIS LINE MOVEI M,[ASCIZ/ Protection:/] PUSHJ P,LSTR ;TYPE THAT MOVE T1,M.MTLB+.TPPRO;GET PROTECTION PUSHJ P,LOCT3Z ;LIST WITH LEADING ZEROS MOVEI M,[ASCIZ/, Creation Date:/] PUSHJ P,LSTR ;DELIMIT CREATION FIELD LDB T4,[POINTR M.MTLB+.TPEXP,TP.ECR] ;GET THE CREATION DATE PUSHJ P,LDATE ;CONVERT AND OUTPUT DATE MOVEI M,[ASCIZ/, Expiration Date:/] PUSHJ P,LSTR ;DELIMIT EXPIRATION FIELD LDB T4,[POINTR M.MTLB+.TPEXP,TP.EEX] ;GET THE EXPIRATION DATE PUSHJ P,LDATE ;CONVERT AND OUTPUT DATE PUSHJ P,LCRLF ;CLEAN LINE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE MOVEI M,[ASCIZ/ Block size:/] PUSHJ P,LSTR ;LIST DESCRIPTOR MOVE T1,M.MTLB+.TPBSZ;GET THE BLOCK SIZE PUSHJ P,LDEC ;LIST THAT MOVEI M,[ASCIZ/, Record size:/] PUSHJ P,LSTR ;LIST DESCRIPTOR MOVE T1,M.MTLB+.TPRSZ;GET THE RECORD SIZE PUSHJ P,LDEC ;LIST THAT PUSHJ P,LCRLF ;CLEAN LINE MOVEI M,[ASCIZ/ Record Format:/] PUSHJ P,LSTR ;LIST DESCRIPTOR LDB T1,[POINTR M.MTLB+.TPREC,TR.RFM] ;GET THE RECORD FORMAT CODE MOVE M,MTRCFM(T1) ;AIM AT RECORD FORMAT STRING PUSHJ P,LSTR ;AND LIST THE RECORD FORMAT TYPE MOVEI M,[ASCIZ/, Form control:/] PUSHJ P,LSTR ;IDENTIFY NEXT FIELD LDB T1,[POINTR M.MTLB+.TPREC,TR.FCT] ;GET THE FORM CONTROL MOVE M,MTFCTL(T1) ;AIM AT FORM CONTROL STRING PUSHJ P,LSTR ;AND TYPE IT OUT TOO PUSHJ P,LCRLF ;CLEAN LINE SETZM M.MTLB ;CLEAR THE FIRST WORD MOVE T1,[M.MTLB,,M.MTLB+1] ;GET BLT PARMS BLT T1,M.MTLB+.TPLEN-1 ;ZERO THE PARAMETER BLOCK POPJ P, ;ALL DONE! ;LERTAB: [ASCIZ/No errors/] ; [ASCIZ/Continue processing/] ; [ASCIZ/EOF/] ; [ASCIZ/Label type error/] ; [ASCIZ/Header label error/] ; [ASCIZ/Trailer label error/] ; [ASCIZ/Volume label error/] ; [ASCIZ/Device error/] ; [ASCIZ/Data error/] ; [ASCIZ/Write-lock error/] ; [ASCIZ/Positioning error/] ; [ASCIZ/BOT/] ; [ASCIZ/Illegal operation/] ; [ASCIZ/File not found/] ;Table of record format names MTRCFM: [ASCIZ/Default/] [ASCIZ/Fixed/] [ASCIZ/Variable/] [ASCIZ/Spanned/] [ASCIZ/Undefined/] ;Table of form control names MTFCTL: [ASCIZ/????/] [ASCIZ/None/] [ASCIZ/ANSI/] [ASCIZ/Embedded/] > ;END INF FT$MTL IFN FT$MTA,< ;MAGTAPES ;HERE WHEN THE FILE IS AN IOWD (IE, SAVE OR HRI FORMAT) OR .EXE MTIOW: SETOM P1 ;SET FLAG FOR FIRST IOWD SETZM FVER ;CLEAR VERSION NUMBER JUMPG T1,MTEXE ;IF .EXE, GO HANDLE MTIOWD: MOVE T3,T1 ;GET COUNT OF IOWD JUMPE T1,MTIOHR ;IF ZERO, JUNK OR HRI FORMAT AOS P1 ;ADVANCE IOWD COUNTER JUMPG T1,MTIOJK ;JUMP IF JUNK FORMAT MTIODT: PUSHJ P,NEXDTW ;GET DATA WORD JRST MTIOJF ;JUMP IF EOF AOS T2 ;COUNT WORD READ MOVEI T4,1(T3) ;GET LOCATION OF DATA CAIN T4,.JBVER ;SEE IF VERSION NUMBER MOVEM T1,FVER ;YES--SAVE FOR LATER MOVE T4,T1 ;SAVE DATA WORD IN CASE OF HRI FORMAT AOBJN T3,MTIODT ;COUNT OFF WORDS IN IOWD PUSHJ P,NEXDTW ;GET NEXT IOWD OR JRST JRST MTIOHE ;SEE IF HRI FORMAT AOS T2 ;COUNT WORD READ JUMPLE T1,MTIOWD ;LOOP IF ANOTHER IOWD MOVE T4,T1 ;NO--SAVE DATA WORD (MAYBE JRST WORD) MTIODN: PUSHJ P,NEXDTW ;GET ANY MORE OF RECORD JRST .+2 ;JUMP TO OUTPUT AOJA T2,MTIODN ;LOOP UNTIL DONE TLNE F,L.MLBL ;HAVE WE TYPED LABEL INFO? PUSHJ P,LSPC2 ;YES, ANOTHER LEVEL OF INDENTATION THEN MOVEI P1,[ASCIZ / Save format: length = /] JRST MTIOJM ;GO CHECK FOR JRST WORD ;HERE IF LOOKS LIKE HRI FORMAT MTIOHR: PUSHJ P,NEXDTW ;IF ONLY ZEROS TO EOF JRST MTIOHE ; THEN MUST BE OK JUMPN T1,MTIOJK ;NO--JUNK AOJA T2,MTIOHR ;LOOP TO EOF MTIOHE: JUMPN P1,MTIOJK ;JUNK IF NOT FIRST IOWD MOVE T1,T4 ;RESTORE LAST DATA WORD TLNE F,L.MLBL ;HAVE WE TYPED LABEL INFO? PUSHJ P,LSPC2 ;YES, ANOTHER LEVEL OF INDENTATION THEN MOVEI P1,[ASCIZ / HRI format: length = /] SETZM FVER ;CLEAR VERSION NUMBER JRST MTIOJM ;GO FINISH UP ;STILL IN IFN FT$MTA MTEXE: MOVEI T3,0 ;CLEAR PROGRESS COUNT JRST MTEX.1 ;START WITH FIRST WORD MTEX.0: PUSHJ P,NEXDTW ;GET BLOCK TYPE OF HEADER JRST MTIOJF ;NONE IF EOF AOS T2 ;COUNT WORD AOS T3 ;COUNT WORD MTEX.1: HLRZ P1,T1 ;GET BLOCK TYPE CAIN P1,1776 ;SEE IF EXE DIRECTORY JRST MTEX.3 ;YES--GO LOOKUP PAGE 0 CAIL P1,1776 ;IF NOT VALID TYPE, JRST MTIOJK ; EXIT WITHOUT VERSION HRRZ P1,T1 ;OK--GET BLOCK SIZE MTEX.2: SOJLE T1,MTEX.0 ;(ALLOW FOR FIRST WORD) PUSHJ P,NEXDTW ;SKIP THIS BLOCK JRST MTIOJF ;GIVE UP IF EOF AOS T2 ;COUNT WORD AOS T3 ;COUNT PROGRESS JRST MTEX.2 ;LOOP MTEX.3: HRRZ T4,T1 ;DIRECTORY--GET SIZE LSH T4,-1 ;GET COUNT OF BIWORDS MTEX.4: SOJL T4,MTIOJK ;GIVE UP IF NOT IN DIRECTORY PUSHJ P,NEXDTW ;GET FIRST WORD OF PAIR JRST MTIOJF ;GIVE UP IF END AOS T2 ;COUNT WORD MOVE P1,T1 ;SAVE FOR A MINUTE PUSHJ P,NEXDTW ;GET SECOND WORD OF PAIR JRST MTIOJF ;GIVE UP AOS T2 ;COUNT WORD ADDI T3,2 ;COUNT PROGRESS TRNE T1,-1 ;SEE IF PAGE 0 JRST MTEX.4 ;NO--LOOP OVER DIRECTORY HRRZ T4,P1 ;GET POSITION IN FILE LSH T4,^D9 ;CONVERT TO WORDS SUB T4,T3 ;ALLOW FOR CURRENT POSITION JUMPLE T4,MTIOJK ;ERROR IF BEHIND US ADDI T4,.JBVER ;SET TO VERSION LOCATION MTEX.5: PUSHJ P,NEXDTW ;ADVANCE TO WORD JRST MTIOJF ;GIVE UP IF END AOS T2 ;COUNT WORD SOJGE T4,MTEX.5 ;LOOP THROUGH .JBVER MTEX.9: PUSHJ P,NEXDTW ;LOOP TO END SKIPA ;DONE AOJA T2,MTEX.9 ;LOOP TLNE F,L.MLBL ;HAVE WE TYPED OUT LABEL INFO? PUSHJ P,LSPC2 ;YES, ANOTHER LEVEL OF INDENT THEN MOVEI P1,[ASCIZ / .EXE format: length = /] MOVEI T4,0 ;INDICATE NO START ADDRESS KNOWN JRST MTIOJN ;OUTPUT MESSAGE ;STILL IN IFN FT$MTA ;HERE WHEN DONE WITH HRI OR SAVE FORMAT READ MTIOJM: HLRZ T3,T4 ;SEE IF START TRZ T3,(-) ;CLEAR HALT BITS CAIE T3,(JRST) ;TEST FOR JUMP JRST MTIOJK ;NO--JUNK MTIOJN: MOVE M,P1 ;FETCH CORRECT MESSAGE PUSHJ P,LSTR ;TYPE LABEL MOVE T1,T2 ;GET LENGTH IN WORDS PUSHJ P,LDEC ;LIST DECIMAL MOVEI M,[ASCIZ /, start = /] SKIPE T4 ;IF KNOWN, PUSHJ P,LSTR ;LIST LABEL HRRZ T1,T4 ;GET START ADDRESS SKIPE T4 ;IF KNOWN, PUSHJ P,LOCT ;LIST OCTAL MOVEI M,[ASCIZ /, checksum = /] SKIPG S.CHK ;/CHECKSUM GIVEN? JRST .+3 ;NO PUSHJ P,LSTR ;LIST LABEL PUSHJ P,LCHECK ;LIST CHECKSUM MOVEI M,[ASCIZ /, version = /] SKIPE T4,FVER ;SEE IF VERSION PUSHJ P,LSTR ;YES--PREFIX IT PUSHJ P,LVER ;AND LIST IT PUSHJ P,LCRLF ;END LINE AOS .CTFLS## ;COUNT THIS AS A FILE SEEN AOS .CTFLF## ;AND FOUND JRST MTEF ;JUMP TO END OF FILE PROCESSING ;STILL IN IFN FT$MTA ;HERE IF JUNK BUT NOT YET EOF MTIOJK: PUSHJ P,NEXDTW ;GET NEXT WORD JRST MTIOJF ;JUMP WHEN DONE AOJA T2,MTIOJK ;LOOP COUNTING WORDS ;HERE IF JUNK AT EOF MTIOJF: AOS .CTFLS## ;COUNT A FILE SEEN AOS .CTFLF## ;AND FOUND ; THIS RATHER QUESTIONABLE TACTIC SUPRESSES ; "SPURIOUS" %WLDNSD NO SUCH DIRECTORY MES- ; SAGES . . . TLNE F,L.MLBL ;HAVE WE TYPED LABEL INFO? PUSHJ P,LSPC2 ;YES, ANOTHER LEVEL OF INDENTATION THEN MOVEI M,[ASCIZ / Unknown format: length =/] PUSHJ P,LSTR ;LIST LABEL MOVE T1,T2 ;GET LENGTH PUSHJ P,LDEC ;LIST DECIMAL MOVEI M,[ASCIZ /, checksum = /] SKIPG S.CHK ;/CHECKSUM GIVEN? JRST .+3 ;NO PUSHJ P,LSTR ;LIST LABEL PUSHJ P,LCHECK ;LIST CHECKSUM PUSHJ P,LCRLF ;END LINE ;HERE AT EOF AFTER JUNK OR IOWD FILE MTEF: SKIPGE ABORTI ;TIME TO ABORT INPUT? JRST MTABO ;YES MOVEI M,[ASCIZ / /] MTEFM: SKIPLE S.MARK ;/MARKS? PUSHJ P,LSTR ;YES--TELL USER MTEFX: REPEAT 0,< ;NEED THIS ONLY IF TAPE ENDS WITH 3 EOFS CLOSE DC, ;CLEAR END-OF-FILE SOSN MTFLCT ;DO /FILE ACCOUNTING JRST MTDONX ;EXIT IF /FILE COUNTED OUT JRST MTFIND ;NEW FILE--GO PROCESS IT > JRST MTEOFH ;HANDLE EOF ;HERE AFTER NEW FILE FOUND EOF MTEOF: SKIPGE ABORTI ;TAPE USELESS? JRST MTABO ;YES, ABORT TAPE DIRECTORY MOVEI M,[ASCIZ / /] SKIPLE S.MARK ;/MARKS? PUSHJ P,LSTR ;YES--LIST COMMENT MTEOFH: CLOSE DC, ;CLEAR END-OF-FILE SOSN MTFLCT ;ACCOUNT FOR /FILE JRST MTDONX ;JUMP IF DONE WITH /FILES PUSHJ P,NEXOVW ;READ WORD TO SEE IF DOUBLE EOF JRST .+2 ;YES--CLEAN UP JRST MTEXAM ;NO--START OVER MOVEI M,[ASCIZ / /] SKIPLE S.MARK ;/MARKS? PUSHJ P,LSTR ;YES--LIST COMMENT JRST MTDONE ;AND GO FINISH UP ;HERE TO ABORT THE TAPE OPERATIONS MTABO: N$FAIX (ADE,) X$$ADE: PUSHJ P,.TCRLF## ;CAP OFF THE ERROR MESSAGE JRST MTDONY ;AND LEAVE THIS VALE OF TEARS ;STILL IN IFN FT$MTA ;HERE WHEN ANSI-LIKE TAPE LABEL SEEN MTLAB6: MOVEI M,[ASCIZ / SIXBIT Label "/] TROA F,R.LBSX ;INDICATE SIXBIT LABEL MTLABL: MOVEI M,[ASCIZ / Label "/] MTLABR: MOVE T4,BFHD+.BFCTR ;GET LENGTH MTLABS: PUSHJ P,LSTR ;LIST PREFIX MOVEI T2,^D80/5 ;GET ASCII LABEL LENGTH TRNE F,R.LBSX ;SEE IF SIXBIT MOVEI T2,^D80/6 ;YES--GET SIXBIT LABEL LENGTH ;NOTE--COBOL WRITES 78 CHARS, NOT 84 CAIE T4,-1(T2) ;SEE IF STANDARD LABEL LENGTH TLO F,L.ILEN ;NO--SET FLAG MOVEI P1,1(T4) ;SET END TO LENGTH CAILE P1,(T2) ;BUT NOT BEYOND MOVEI P1,(T2) ; STANDARD LENGTH MOVEI T2,1 ;PRESET WORD COUNT MTLAB1: MOVE T4,T1 ;MOVE WORD TO PAIR MOVEI T1,5 ;SET TO COUNT CHARS TRNE F,R.LBSX ;IF SIXBIT, MOVEI T1,6 ; GET 6 CHARS PER WORD ;HERE FOR EACH CHARACTER IN LABEL MTLAB2: MOVEI T3,0 ;CLEAR RESULT TRNE F,R.LBSX ;SEE IF SIXBIT LABEL JRST [LSHC T3,6 ;YES--GET NEXT CHAR ADDI T3,40 ;CONVERT TO ASCII JRST MTLAB4] ;AND GO OUTPUT IT LSHC T3,7 ;GET CHAR CAILE T3,37 ;SEE IF CONTROL CHAR (OR NULL) JRST MTLAB3 ;NO--PROCEED MOVEI C,"^" ;YES--LIST FLAG PUSHJ P,LCHR ; FOR USER ADDI T3,100 ;CONVERT TO ALPHA MTLAB3: CAIGE T3,140 ;SEE IF LOWER CASE JRST MTLAB4 ;NO--PROCEED MOVEI C,"'" ;YES--LIST FLAG PUSHJ P,LCHR ; FOR USER SUBI T3,40 ;CONVERT TO UPPER CASE MTLAB4: MOVE C,T3 ;GET CHAR PUSHJ P,LCHR ;LIST SOJG T1,MTLAB2 ;LOOP FOR THIS WORD PUSHJ P,NEXDTW ;GO GET NEXT WORD JRST MTLABX ;AT EOF CAIE T2,(P1) ;DON'T GO TOO FAR AOJA T2,MTLAB1 ;LOOP DOWN LABEL ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;STILL IN IFN FT$MTA TLO F,L.FKEF ;TOO FAR, SET FAKE EOF FLAG MOVE P1,T1 ;SAVE WORD FOR LATER ;HERE AT END OF LABEL MTLABX: TRZ F,R.LBSX ;CLEAR SIXBIT LABEL INDICATOR MOVEI C,"""" ;END OF QUOTE PUSHJ P,LCHR ;LIST END PUSHJ P,LCRLF ;END LINE TLNN F,L.ILEN!L.FKEF ;SEE IF BAD LENGTH JRST MTEF ;NO--GO CLEAR EOF AND PROCEED TLZN F,L.ILEN ;TEST INCORRECT LENGTH JRST MTLNOK ;LENGTH OK N$WARN (ILL,Incorrect length for label) MTLNOK: TLZN F,L.FKEF ;CLEAR FAKE EOF JRST MTEF ;NOT SET--PROCEED IFN FT$MTR,< ;OLD BACKUP/RESTORE TLZE F,L.IMLB ;SEE IF IMBEDDED LABEL JRST MTBKSR ;YES--RETURN TO THAT LOOP >;END IFN FT$MTR MOVE T3,P1 ;GET NEXT WORD TRZ T3,77777 ;REDUCE TO FIRST THREE ASCII CHARS MOVSI T4,-LNLBLT ;POINT TO LABEL TYPES TABLE CAME T3,LABTYP(T4) ;SEE IF LABEL AOBJN T4,.-1 ;LOOP TO MATCH JUMPL T4,MTLBCN ;CONSECUTIVE LABELS TRZ T3,-1 ;REDUCE TO FIRST THREE SIXBIT CHARS MOVSI T4,-LNLB6T ;POINT TO SIXBIT LABEL TYPES TABLE CAME T3,LABTY6(T4) ;SEE IF SIXBIT LABEL AOBJN T4,.-1 ;LOOP TO MATCH JUMPL T4,MTLBC6 ;CONSECUTIVE SIXBIT LABELS N$WARN (MTM,Missing tape mark after label) MOVE T1,P1 ;RESTORE WORD JRST MTEXAM ;AND GO EXAMINE DATA MTLBC6: MOVEI M,[ASCIZ / Grouped SIXBIT label "/] TROA F,R.LBSX ;SET SIXBIT LABEL FLAG MTLBCN: MOVEI M,[ASCIZ / Grouped label "/] MOVE T1,P1 ;RESTORE WORD JRST MTLABR ;GO DO NEXT LABEL >;END IFN FT$MTA SUBTTL DIRECTORY LISTING - MAGTAPE -- OLD BACKUP/RESTORE IFN FT$MTR,< ;OLD BACKUP/RESTORE MTBKSR: PUSHJ P,NEXOVW ;GET NEXT CONTROL WORD JRST E$$MBS ;UNEXPECTED EOF MTBKSS: TLO F,L.LEVD ;SET LEVEL-D DATA MOVEM T1,MTSVVR ;SAVE HEADER WORD HLRZ T2,T1 ;GET CONTROL WORD CAIE T2,100000 ;SEE IF FILE HEADER CAIN T2,200000 ;SEE IF DIRECTORY HEADER JRST MTBKLK ;YES--GO READ LOOKUP BLOCK CAIN T2,40000 ;SEE IF IMBEDDED LABEL JRST MTBKIL ;YES--GO HANDLE IT ;HERE WHEN JUNK IN OLD BACKUP/RESTORE SET N$WARN (JBS,Junk during BACKUP/RESTORE save set) MTBKJL: TLO F,L.BKSS ;SET FLAG FOR SAVE SET PUSHJ P,NEXOVW ;READ ON JRST MTBKJM ;AT END OF DATA MOVE T1,BFHD+.BFCTR ;GET DATA LEFT IN BLOCK SOJG T1,MTBKJL ;SOME--LOOP THRU DATA MTBKJM: TLZ F,L.BKSS!L.FKEF ;CLEAR FLAGS PUSHJ P,NEXOVW ;LOOK AT RESULTS JRST MTBKJG ;EOF--GO HANDLE HLRZ T2,T1 ;GET HEADER TYPE CAIE T2,100000 ;SEE IF DIRECTORY CAIN T2,200000 ; OR FILE HEADER JRST MTBKSS ;YES--GO PROCESS IT CAIN T2,40000 ;SEE IF LABEL JRST MTBKIL ;YES--GO HANDLE JRST MTBKJL ;NO--LOOP ONWARDS >;END IFN FT$MTR IFN FT$MTR,< ;OLD BACKUP/RESTORE ;HERE AT UNEXPECTED EOF N$WARN (MBS,Tape mark during BACKUP/RESTORE save set) MTBKJG: JRST MTEFX ;GO ISSUE MESSAGE ;HERE AT IMBEDDED LABEL MTBKIL: ANDI T1,777 ;GET LABEL LENGTH SOSG T4,T1 ;MOVE TO LOC. FOR LABEL PRINTER JRST E$$JBS ;NO--JUNK TLO F,L.IMLB ;YES--SET FLAG PUSHJ P,NEXOVW ;SKIP CHECKSUM JRST E$$MBS ;GIVE UP PUSHJ P,NEXOVW ;GET START OF LABEL JRST MTBKIF ;GO HANDLE EOF MOVEI M,[ASCIZ / Blocked label "/] JRST MTLABS ;GO DO LABEL ;HERE WHEN IMBEDDED LABEL IS SEPARATE FILE MTBKIF: MOVEI M,[ASCIZ / /] JRST MTEFM ;GO ISSUE MESSAGE >;END IFN FT$MTR IFN FT$MTR,< ;OLD BACKUP/RESTORE ;HERE WHEN LOOKUP BLOCK COMING MTBKLK: MOVEI T2,(T1) ;GET LOOKUP WORDS ANDI T2,777 ;CLEAR JUNK CAILE T2,LN$RIB ;PROTECT LOOKUP AREA JRST E$$JBS ;BAD--GIVE UP MOVEI T3,0 ;SET TO START OF LOOKUP BLOCK PUSHJ P,NEXOVW ;GET NEXT WORD JRST E$$MBS ;BAD TO EOF HERE ;THROW AWAY WORD MTBKLL: PUSHJ P,NEXOVW ;GET NEXT LOOKUP WORD JRST E$$MBS ;BAD TO EOF IN MIDDLE MOVEM T1,LBLOCK(T3) ;SAVE IN STANDARD AREA AOS T3 ;ADVANCE BLOCK SOJG T2,MTBKLL ;LOOP UNTIL DONE HRRZ T2,MTSVVR ;GET LENGTH AGAIN SOS T2 ;SUBTRACT ONE ANDI T2,777 ;MASK TO FORWARD LENGTH CAME T2,RIBLEN ;COMPARE TO LOOKUP LENGTH JRST E$$JBS ;BAD--GIVE UP SKIPLE S.MARK ;/MARKS? JRST MTBKLM ;YES--TYPE UFD HLRZ T2,MTSVVR ;REFETCH HEADER CAIE T2,100000 ;SEE IF FILE HEADER JRST MTBKNW ;NO--SKIP TO NEXT HEADER >;END IFN FT$MTR ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE IFN FT$MTR,< ;OLD BACKUP/RESTORE ;HERE WHEN FILE HEADER IS IN LOOKUP AREA MTBKLM: MOVE T1,FMTA ;GET MAG TAPE WORD MOVEM T1,FSTR ;STORE AS STUCTURE SETZM FMTA ;CLEAR OUT TAPE WORD TLO F,L.BKSS ;SET SAVE SET FLAG PUSHJ P,MTDOFL ;GO DO MAG TAPE FILE TLZ F,L.BKSS!L.FKEF ;CLEAR SCREWBALL FLAGS HLRZ T2,MTSVVR ;SEE WHAT KIND OF FILE CAIE T2,100000 ;CHECK FILE JRST MTBKNW ;NO--SKIP BELOW PUSHJ P,NEXOVW ;GET NEXT CONTROL JRST E$$MBS ;NEED END OF DATA FILE HLRZ T2,T1 ;GET TYPE CAIE T2,20000 ;SEE IF END OF FILE JRST E$$JBS ;NO--JUNK PUSHJ P,NEXOVW ;YES--GET CHECKSUM JRST E$$MBS ;ERROR IF ABSENT MTBKNW: PUSHJ P,NEXOVW ;GET NEXT HEADER WORD JRST MTEF ;GO TO EOF PROCESSING TLNN T1,7777 ;SEE IF OLD BACKUP/RESTORE HEADER JRST MTBKSS ;GO HANDLE HEADER PUSH P,T1 ;SAVE NEXT WORD N$WARN (MMB,Missing tape mark after BACKUP/RESTORE save set) POP P,T1 ;RESTORE NEXT WORD JRST MTEXAM ;GO EXAMINE THE DATA >;END IFN FT$MTR IFE FT$MTR,< E$$JBS==6B20 ;SAVE SYMBOL E$$MBS==6B20 ;SAVE SYMBOL E$$MMB==6B20 ;SAVE SYMBOL >;END IFE FT$MTB SUBTTL DIRECTORY LISTING - MAGTAPE -- BACKUP AND FRS IFN FT$MTB,< ;BACKUP/FRS MTFRSS: SETZM H.MZER ;CLEAR FOR THIS SAVESET MOVE T3,[H.MZER,,H.MZER+1] BLT T3,H.EMZR ; .. PUSHJ P,FRSLAH ;DO BACKUP/FRS LOOK-AHEAD JRST MTFRSH ;GO HANDLE HEADER ;BACK HERE AFTER EACH RECORD MTFRSR: PUSHJ P,NEXOVW ;GET FIRST WORD JRST E$$MFS ;END OF FILE IS ERROR PUSHJ P,FRSLAH ;DO BACKUP/FRS LOOK-AHEAD IFN FT$MTS,< ;FRS HLLZ T4,T1 ;GET COPY OF FRS/BACKUP FLAG TLNE T4,-1 ;IF FRS, TLO T4,-1 ; SET WHOLE FLAG XOR T4,B$GTYP ;COMPARE WITH PREVIOUS RECORD JUMPL T4,E$$JFS ;JUNK IF DIFFERENT >;END IFN FT$MTS MTFRSH: TLNN T1,-1 ;SEE IF BACKUP FORMAT JRST MTFRSP ;YES--GO HANDLE HEADER IFN FT$MTS,< ;FRS TLNE T1,777770 ;SEE IF VALID FOR FRS JRST E$$JFS ;NO, GO PROCESS AS JUNK >;END IFN FT$MTS >;END IFN FT$MTB ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE IFN FT$MTS,< ;FRS ;HERE IF FRS HEADER FORMAT--READ HEADER AND CONVERT TO BACKUP FORMAT HRLZM T1,B$GFLG ;STORE FLAGS HLRZS T1 ;POSITION RECORD TYPE MOVE T1,[0 ;ERROR 1 ;LABEL 2 ;START SAVE SET 3 ;END SAVE SET 4 ;FILE DATA 5 ;DIRECTORY DATA 0 ;ERROR 0](T1) ;ERROR JUMPE T1,MTFJKB ;JUNK IF ERROR(NOT FRS FORMAT) HRROM T1,B$GTYP ;SET AS TYPE PUSHJ P,NEXOVR ;GET RELATIVE VOLUME NUMBER JRST MTFJKB ;JUNK MOVEM T1,B$GRTN ;SAVE MOVE T4,B$GTYP ;GET TYPE MOVE T4,FRSTBL-1(T4) ;GET TABLE OF TRANSLATIONS MTFRSL: MOVE T1,(T4) ;GET -COUNT,,ITEM TLNN T1,-1 ;IF BLANK, TLO T1,-1 ; SET FOR ONE WORD PUSHJ P,BLKOVR ;COPY TO STORAGE AREA JRST MTFJKB ;JUNK IF END AOBJN T4,MTFRSL ;LOOP OVER HEADER JRST MTFRSD ;GO HANDLE DATA PORTION ;STILL IN IFN FT$MTS ;FRS TRANSLATION TABLE POINTERS FRSTBL: -FRSLLB,,FRSTLB ;BACKUP 1=LABEL -FRSLSS,,FRSTSS ;BACKUP 2=START SAVE SET -FRSLSS,,FRSTSS ;BACKUP 3=END SAVE SET -FRSLFL,,FRSTFL ;BACKUP 4=FILE -FRSLDR,,FRSTDR ;BACKUP 5=DIRECTORY ;TABLES CONTAINING -NO WORDS (0=1),,ADDRESS TO STORE FRSTLB: ;LABEL B$LREL ;REEL -21,,B$LTIM ;TIME, DATE, DESTROY DATE, LABEL COMMENT FRSLLB==.-FRSTLB FRSTSS: ;START/END SAVE SET -5,,B$SSNM ;SYSTEM NAME B$SSVR ;VERSION -2,,B$SFMT ;FORMAT VERSION, FRS VERSION -5,,B$STIM ;TIME, DATE, MODE, TRACKS, SAVE SET NAME B$SDEV ;DEVICE -4,,B$SCMT ;COMMENT FRSLSS==.-FRSTSS FRSTDR: ;DIRECTORY B$USTR ;UFD STRUCTURE B$ULVL ;DIRECTORY LEVEL -20,,DIRB ;DISCARD JUNK FRSLDR==.-FRSTDR FRSTFL: ;FILE -11,,B$FSTR ;STR, NAME, EXT, PPN, REL BLK, ; CHECKSUM, BLKS IN REC, ; WRDS IN L.BLK, DIRECTORY LEVEL -11,,DIRB ;DISCARD JUNK FRSLFL==.-FRSTFL >;END IFN FT$MTS ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE IFN FT$MTB,< ;BACKUP/FRS MTFJKB: N$WARN (JFS,Junk during BACKUP/FRS save set) MTFJKL: SETZM BFHD+.BFCTR ;CLEAR REST OF RECORD PUSHJ P,NEXOVW ;GET START OF NEXT RECORD JRST MTFJKG ;EOF--GO HANDLE TLNE T1,777770 ;SEE IF OK YET JRST MTFJKL ;NO--LOOP ON HLLZ T4,T1 ;GET BACKUP/FRS FLAG TLNE T4,-1 ;IF FRS, TLO T4,-1 ; SET WHOLE HALF WORD XOR T4,B$GTYP ;COMPARE WITH FRS FLAG JUMPL T4,MTFJKL ;IF DIFFERENT, JUNK JRST MTFRSH ;ELSE, GO HANDLE HEADER N$WARN (MFS,Tape mark during BACKUP/FRS save set) MTFJKG: JRST MTEFX ;GO HANDLE EOF ;STILL IN IFN FT$MTB ;HERE TO HANDLE BACKUP STYLE HEADER MTFRSP: JUMPLE T1,MTFJKB ;ERROR IF BAD TYPE CAILE T1,T$MAX ;SEE IF VALID JRST MTFJKB ;NO--ERROR MOVEM T1,B$GTYP ;STORE TYPE MOVE T1,[-^D11,,B$GBNM] ;GET REST PUSHJ P,BLKOVR ; OF STANDARD HEADER JRST MTFJKB ;JUNK IF TRUNCATED MOVE T1,B$GTYP ;GET TYPE MOVE T1,[B$LBL ;1=LABEL B$SSS ;2=START OF SAVE SET B$SSS ;3=END OF SAVE SET B$FIL ;4=FILE B$DIR ;5=DIRECTORY B$EOV ;6=END OF VOLUME B$CMT ;7=COMMENT B$SSS]-1(T1);10=CONTINUE SAVE SET HRLI T1,-^D20 ;SET REST OF HEADER LENGTH PUSHJ P,BLKOVR ;GET REST OF HEADER JRST MTFJKB ;JUNK IF NOT ALL THERE ;HERE WHEN HEADER READ MTFRSD: MOVE T4,B$GTYP ;GET RECORD TYPE JRST @[MTFLBL ;1=LABEL MTFSSS ;2=START OF SAVE SET MTFESS ;3=END OF SAVE SET MTFFIL ;4=FILE MTFDIR ;5=DIRECTORY MTFEOV ;6=END OF VOLUME MTFCMT ;7=COMMENT MTFCSS]-1(T4) ;10=CONTINUE SAVE SET ;STILL IN IFN FT$MTB ;HERE ON BACKUP/FRS LABEL RECORD MTFLBL: SETZM BFHD+.BFCTR ;CLEAR REST OF BLOCK PUSHJ P,NEXOVW ;GET EOF SKIPA ;OK JRST E$$JSS ;ERROR IF NOT EOF SKIPL B$GTYP ;SEE IF BACKUP SKIPN T1,B$LDDT ;GET LABEL DESTROY DATE JRST MTFLB1 ;CLEAR--LEAVE ALONE PUSHJ P,.CNTDT## ;SPLIT IT MOVEM T2,B$LDSD ;STORE DESTROY DATE MTFLB1: TLNE F,L.MLBL ;HAVE WE TYPED LABEL INFO? PUSHJ P,LSPC2 ;YES, ANOTHER LEVEL OF INDENTATION THEN MOVEI M,[ASCIZ / BACKUP label /] IFN FT$MTS,< ;FRS SKIPGE B$GTYP ;IF FRS, MOVEI M,[ASCIZ / FRS label /] >;END IFN FT$MTS PUSHJ P,LSTR ;LIST LABEL MOVEI M,[ASCIZ / reel=/] SKIPE T2,B$LREL ;IF REEL, PUSHJ P,LSTR ; LABEL OUTPUT PUSHJ P,LSIX ; AND OUTPUT REEL MOVEI M,[ASCIZ / destroy on /] SKIPE T4,B$LDSD ;IF DESTROY DATE, PUSHJ P,LSTR ; LABEL OUTPUT SKIPE T4 ; AND PUSHJ P,LDATE ; OUTPUT DESTROY DATE PUSHJ P,LCRLF ;END LINE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE MOVE T1,[B$LCDT,,B$SCDT] ;COPY STANDARD STUFF BLT T1,B$SMTC ; WHERE SAVE-SET HEADERS MOVE T1,[B$LTIM,,B$STIM] BLT T1,B$SDAT SETZM B$SMOD SETZM B$STRK SETZM B$BSYS PUSHJ P,MTFXSL ;ISSUE LINES COMMON TO SAVE-SET SKIPE B$LCMT ;SEE IF COMMENT JRST [TLNE F,L.MLBL ;HAVE WE TYPED LABEL INFO? PUSHJ P,LSPC2 ;YES, ANOTHER LEVEL OF INDENT MOVEI M,[ASCIZ / Comment: /] PUSHJ P,LSTR ;LABEL RESULT SETZM B$LCMT+16 ;PROTECT ASCIZ MOVEI M,B$LCMT ;POINT TO COMMENT PUSHJ P,LSTR ;OUTPUT IT PUSHJ P,LCRLF ;END LINE JRST .+1] JRST MTEOF ;GO CLEAR FAKE EOF AND REPEAT BACKUP PROCESSING ;STILL IN IFN FT$MTB ;HERE ON BACKUP/FRS END OF VOLUME MTFEOV: SETZM BFHD+.BFCTR PUSHJ P,NEXOVW ;GET NEXT WORD SKIPA ;EOF--OK JRST E$$JFS ;ELSE JUNK ;HERE AFTER READING END OF VOLUME MTFEO0: TLNE F,L.MLBL ;HAVE WE TYPED LABEL INFO? PUSHJ P,LSPC2 ;YES, ANOTHER LEVEL OF INDENTATION THEN MOVEI M,[ASCIZ / BACKUP end of volume/] PUSHJ P,LSTR ;INDICATE EOV TLNE F,L.BPOP ;[464] IN MIDST OF DATA FILE? PUSHJ P,[MOVEI M,[ASCIZ\ reading file \] ;[464] YES PUSHJ P,LSTR ;[464] SO TELL USER PUSHJ P,LSTFNM ;[464] LIST THE FILE NAME PUSHJ P,LDOT ;[464] SEPARATE NAME AND EXTENSION HLLZ T2,FEXT ;[464] EXTRACT THE EXTENSION PJRST LSIXN] ;[464] AND LIST IT TOO PUSHJ P,LCRLF ;END OF LINE PUSHJ P,LCRLF ;PLUS BLANK LINE FOR NEATNESS SKIPG S.MVOL ;MULTI-VOLUME CONTINUE? JRST MTENDS ;NO - GO END LISTING OF SAVE SET ;[453] MTUNL. DC, ;YES - UNLOAD OLD TAPE CLOSE DC, ;[463] BLAST THE "EOF" I/O STATUS MOVE T1,B$GRTN ;RELATIVE TAPE NUMBER ADDI T1,1 ;NEXT TAPE NUMBER MOVEM T1,B$HRTN ;HOLD IT FOR VERIFICATION MOVE T1,[B$BSSN,,B$HSSN] ;BLT POINTER TO BLT T1,B$HSSN+6 ;SAVE SAVE-SET NAME MOVEI T1,0 ;OUTPUT TO TTY: PUSHJ P,.TYOCH## ;FORCE IT THERE PUSH P,T1 ;SAVE OLD OUTPUT ROUTINE MOVEI T1,[ASCIZ/"End of volume reached on /] PUSHJ P,.TSTRG## ;TELL USER/OPERATOR MOVE T1,MTNAME ;NAME OF TAPE DRIVE PUSHJ P,.TSIXN## ;GIVE DRIVE NAME MOVEI T1,[ASCIZ/: /] PUSHJ P,.TSTRG## ;CAP OFF DRIVE JRST MTFEO2 ;NOW ASK FOR NEW TAPE ;STILL IN FT$MTB MTFEO1: MOVEI T1,0 ;OUTPUT TO TTY: PUSHJ P,.TYOCH## ;REDIRECT SCAN PUSH P,T1 ;SAVE OLD TYPEOUT MTFEO2: TLNN F,L.MLBP ;[453] CONTROLLED BY MDA? JRST MTFEO4 ;[453] NO, ASK USER TO MANUALLY MOUNT NEW TAPE MOVEI T1,[ASCIZ\"Asking MDA for automatic volume-switch . . . \] ;[453] NICE INFORMATIVE TEXT PUSHJ P,.TSTRG## ;[453] TO TELL THE USER WHAT IS HAPPENING MOVEI T3,DC ;[453] TAPE CHANNEL MOVEI T2,.TFFEV ;[453] TAPOP. FUNCTION MOVE T1,[2,,T2] ;[453] AND TAPOP. ARG POINTER TO TAPOP. T1, ;[453] ASK MONITOR/MDA TO SWITCH VOLUMES SKIPA P3,T1 ;[453] FAILED! JRST MTFEO5 ;[453] CONTINUE PROCESSING NEXT TAPE VOLUME N$FAIO (CGN,Couldn't get next volume, error ) MTFEO4: MTUNL. DC, ;[453] PUNT CURRENT TAPE VOLUME MOVEI T1,[ASCIZ/$Mount next volume, type "C" to continue, "E" to exit: /] PUSHJ P,.TSTRG## ;ASK FOR COMMAND CLRBFI ;JUST TO MAKE SURE INCHWL T1 ;FIRST CHARACTER CLRBFI ;EAT REST OF LINE CAIE T1,"E" ;EXIT (ABORT)? CAIN T1,"e" ;ALTERNATE WAY OF SAME? JRST [POP P,T1 ;RESTORE TYPEOUT ADDRESS PUSHJ P,.TYOCH## ;TELL SCAN SETZM MTNAME ;FLAG NO LONGER HAVE TAPE TLZE F,L.BPOP ;CALLED FROM NEXDV? POPJ P, ;YES, THEN RETURN TO THERE JRST MTENDS] ;END OUTPUT FILES ALSO CAIE T1,"C" ;CONTINUE? CAIN T1,"c" ;. . . ? CAIA ;YES JRST MTFEO2 ;GARBAGE, TRY AGAIN MTFEO5: POP P,T1 ;RESTORE ADDRESS OF TYPEOUT PUSHJ P,.TYOCH## ;TELL SCAN TLZE F,L.BPOP ;CALLED FROM NEXDV? JRST .POPJ1 ;YES, SUCCESSFUL RETURN TO THERE JRST MTFRSR ;NEXT RECORD PROCESSING ;STILL IN FT$MTB ;HERE FOR WRONG TAPE MOUNTED MTFEO6: MOVEI T1,0 ;FORCE OUTPUT TO TTY: PUSHJ P,.TYOCH## ;REDIRECT SCAN'S OUTPUT PUSH P,T1 ;REMEMBER OLD OUTPUT MOVEI T1,[ASCIZ\$Wrong volume mounted, expecting tape # \] PUSHJ P,.TSTRG## ;START OFF MESSAGE MOVE T1,B$HRTN ;TAPE NUMBER WE WERE EXPECTING PUSHJ P,.TDECW## ;TELL USER THAT MOVEI T1,[ASCIZ\; mounted tape is # \] PUSHJ P,.TSTRG## ;MORE ASCII TEXT MOVE T1,B$GRTN ;THIS TAPE NUMBER PUSHJ P,.TDECW## ;TELL USER PUSHJ P,.TCRLF## ;END THE LINE TLZE F,L.BPOP ;CALLED FROM NEXDV? JRST MTFEO9 ;YES, ERROR RETURN TO THERE JRST MTFEO2 ;LOOP BACK AND ASK FOR NEW TAPE MTFEO7: MOVEI T1,0 ;FORCE OUTPUT TO TTY: PUSHJ P,.TYOCH## ;REDIRECT SCAN'S OUTPUT PUSH P,T1 ;REMEMBER OLD OUTPUT MOVEI T1,[ASCIZ/$Wrong volume mounted, expecting save set /] PUSHJ P,.TSTRG## ;START OFF MESSAGE MOVEI T1,B$HSSN ;SAVE SET WE WERE EXPECTING PUSHJ P,.TSTRG## ;TELL USER MOVEI T1,[ASCIZ\; mounted tape is save set \] PUSHJ P,.TSTRG## ;MORE ASCII TEXT MOVEI T1,B$BSSN ;THIS TAPE SAVE SET PUSHJ P,.TSTRG## ;TELL USER PUSHJ P,.TCRLF## ;END THE LINE TLZN F,L.BPOP ;CALLED FROM NEXDV? JRST MTFEO2 ;NO, LOOP BACK AND ASK FOR NEW TAPE MTFEO9: POP P,T1 ;OLD TYPEOUT ADDRESS PJRST .TYOCH## ;RESTORE IT ;STILL IN FT$MTB ;HERE ON BACKUP/FRS COMMENT MTFCMT: SETZM BFHD+.BFCTR ;CLEAR REST OF BLOCK PUSHJ P,NEXOVW ;GET NEXT WORD SKIPA ;EOF--OK JRST MTFJKB ;ELSE JUNK ;HERE AFTER READING COMMENT TLNE F,L.MLBL ;HAVE WE TYPED LABEL INFO? PUSHJ P,LSPC2 ;YES, ANOTHER LEVEL OF INDENTATION THEN MOVEI M,[ASCIZ / BACKUP comment: /] PUSHJ P,LSTR ;INDICATE COMMENT MOVEI M,B$CMT ;POINT TO COMMENT AREA PUSHJ P,LSTR ;ISSUE IT JRST MTENDS ;GO END LISTING OF SAVE SET ;HERE ON BACKUP/FRS END OF SAVE SET MTFESS: PUSHJ P,MTFBGO ;UPDATE ANY OVERHEAD REGIONS JRST MTFJKB ;ERROR IF GARBAGED SETZM BFHD+.BFCTR ;DISCARD REST OF BLOCK ;[417] @ MTFESS:+3L ;[417] PUSHJ P,NEXOVW ;GET NEXT WORD ;[417] SKIPA ;EOF--OK ;[417] JRST MTIOJK ;ELSE JUNK ;HERE AFTER READING END OF SAVE SET PUSHJ P,DIRE ;GIVE TOTAL LINE MOVEI T1,[ASCIZ /end/] PUSHJ P,MTFXSS ;INDICATE END OF SAVE SET PUSHJ P,NEXOVW ;TRY READING ANOTHER RECORD JRST MTENDT ;GO END LISTING OF SAVE SET PUSH P,T1 ;SAVE NEW START OF RECORD TLZ F,L.CRLF ;SAVE SET (FILE) DIDN'T END PUSHJ P,LCRLF ;CAP OFF END SAVE SET MESSAGE SETZM H.MZER ;CLEAR TOTALS MOVE T1,[H.MZER,,H.MZER+1] ;. . . BLT T1,H.EMZR ;. . . PUSHJ P,WRNTMM ;WARN ABOUT MISSING END OF FILE POP P,T1 ;RESTORE NEW RECORD TYPE JRST MTEXAM ;AND SEE IF ANOTHER SAVE SET FOLLOWS ; (WHICH DUMPER IS PRONE TO DO) WRNTMM: N$WARN (TMM,Tape mark missing after end of save set) POPJ P, ;CONTINUE MERRILY . . . ;STILL IN IFN FT$MTB ;HERE AT START OR CONTINUATION OF FRS OR BACKUP SAVE SET MTFSSS: MOVEI T1,[ASCIZ /start/] ;[462] INDICATE START OF SAVE SET SETOM AMWCNT ;[462] INIT AMW COUNTER ONLY ON "START" CAIA ;[462] JOIN COMMON START/CONTINUE CODE MTFCSS: MOVEI T1,[ASCIZ /continue/] ;[462] INDICATE CONTINUATION PUSH P,T1 ;SAVE LABEL MOVE T1,MTFBOT+3 ;CLEAR SYSTEM HEADER PUSHJ P,MTFBCB ; .. MOVE T1,MTFBOT+4 ;CLEAR SAVE SET NAME PUSHJ P,MTFBCB ; .. PUSHJ P,MTFBGO ;UPDATE OVERHEAD REGIONS JRST MTFJKB ;ERROR IF GARBAGED POP P,T1 ;RESTORE LABEL SKIPG T2,B$HRTN ;THIS A CONTINUATION TAPE? JRST MTFSS6 ;NO CAME T2,B$GRTN ;YES, TAPE WE WERE EXPECTING? JRST MTFEO6 ;NO, GO COMPLAIN AT OPERATOR MOVSI T2,-7 ;LENGTH OF SAVE SET NAME TEXT MTFSS4: MOVE T3,B$BSSN(T2) ;THIS TAPE SAVE SET NAME CAMN T3,B$HSSN(T2) ;MATCH EXPECTED SAVE SET NAME? AOBJN T2,MTFSS4 ;YES, LOOP FOR WHOLE SAVE SET NAME JUMPL T2,MTFEO7 ;NO, WRONG TAPE MOUNTED SETZM B$HRTN ;[456] CLEAR NEW-TAPE-VERIFICATION FLAG MTFSS6: SETZM BFHD+.BFCTR ;DISCARD REST OF BLOCK PUSHJ P,MTFXSS ;OUTPUT START SKIPG S.IND ;[444] IF A NORMAL (NOT /INDIRECT) LISTING, TLO F,L.SBTT ;HEADER IS SAME AS TOTAL FOR SSTRDR TLZE F,L.BPOP ;CALLED FROM NEXDV? JRST .POPJ1 ;YES JRST MTFRSR ;RESUME FRS LISTING ;STILL IN IFN FT$MTB ;ROUTINE TO OUTPUT START, CONTINUATION, OR END OF SAVE SET MTFXSS: TLZ F,L.CRLF ;REALLY HONESTLY AND TRULY PUSHJ P,LCRLF ;WANT A BLANK LINE HERE! TLNE F,L.MLBL ;HAVE WE TYPED LABEL INFO? PUSHJ P,LSPC2 ;YES, ANOTHER LEVEL OF INDENTATION THEN MOVEI M,[ASCIZ / BACKUP /] IFN FT$MTS,< ;FRS SKIPGE B$GTYP ;SEE IF FRS MOVEI M,[ASCIZ / FRS /] >;END IFN FT$MTS PUSHJ P,LSTR ;ISSUE SAVER PUSH P,T1 ;SAVE START/END TEXT MOVEI M,[ASCIZ/reel number /] PUSHJ P,LSTR ;LIST TEXT MOVE T1,B$GRTN ;GET THIS REEL NUMBER PUSHJ P,LDEC ;AND LIST IT MOVEI M,[ASCIZ/; /] ;AND SEPARATE FROM PUSHJ P,LSTR ;ENSUING START/END INDICATOR POP P,M ;GET START/END TEXT PUSHJ P,LSTR ;ISSUE IT MOVEI M,[ASCIZ / save set: /] PUSHJ P,LSTR ;ISSUE START OF SAVE SET SKIPL B$GTYP ;IF BACKUP, JRST [MOVEI M,B$BSSN ; POINT TO SAVE SET NAME PUSHJ P,LSTR ; LIST IT JRST MTFXS1] ; AND PROCEED MOVE T2,B$SNAM ;GET SAVE SET NAME PUSHJ P,LSIXN ;ISSUE IT MTFXS1: PUSHJ P,LCRLF ;END LINE PUSHJ P,MTFXSL ;ISSUE LINES COMMON TO LABEL SKIPE B$SCMT ;SEE IF COMMENT JRST [TLNE F,L.MLBL ;HAVE WE TYPED LABEL INFO? PUSHJ P,LSPC2 ;YES, ANOTHER LEVEL OF INDENT MOVEI M,[ASCIZ / Comment: /] PUSHJ P,LSTR ;LABEL IT SETZM B$SCMT+4 ;PROTECT ASCIZ MOVEI M,B$SCMT ;OUTPUT PUSHJ P,LSTR ; COMMENT PUSHJ P,LCRLF ;END LINE JRST .+1] ;RETURN POPJ P, ;RETURN ;STILL IN IFN FT$MTB ;ISSUE LINES COMMON BETWEEN LABEL AND SAVE SET HEADERS MTFXSL: TLNE F,L.MLBL ;HAVE WE TYPED LABEL INFO? PUSHJ P,LSPC2 ;YES, ANOTHER LEVEL OF INDENTATION THEN PUSHJ P,LSPC3 ;INDENT MOVEI M,[ASCIZ / by version /] SKIPE T4,B$SVER ;IF FRS/BACKUP VERSION SET, PUSHJ P,LSTR ;INDICATE VERSION SKIPE T4 ;IF SET, PUSHJ P,LVER ;LIST IT SKIPL B$GTYP ;IF NOT FRS SKIPN T1,B$SCDT ;AND DATE SET JRST MTFXS2 ;NO--SKIP ON PUSHJ P,.CNTDT## ;SPLIT MOVEM T1,B$STIM ;STORE CREATION TIME MOVEM T2,B$SDAT ;STORE CREATION DATE MTFXS2: IFN FT$MTS,< ;FRS SKIPE T1,B$STRK ;GET 7-TRACK FLAG MOVX T1,MT.7TR ;SET FOR MTCHR. LDB T2,[POINTR (B$SMOD,IO.DEN)] DPB T2,[POINTR (T1,MT.DEN)] SKIPGE B$GTYP ;IF FRS, MOVEM T1,B$SMTC ; STORE MTCHR. >;END IFN FT$MTS MOVEI M,[ASCIZ / at /] PUSHJ P,LSTR ;LABEL TIME MOVE T1,B$STIM ;GET TIME PUSHJ P,LMSECS ;LIST IT MOVEI M,[ASCIZ / on /] PUSHJ P,LSTR ;LABEL DATE MOVE T4,B$SDAT ;GET DATE PUSHJ P,LDATE ;LIST IT PUSHJ P,LCRLF ;END LINE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;STILL IN IFN FT$MTB TLNE F,L.MLBL ;HAVE WE TYPED LABEL INFO? PUSHJ P,LSPC2 ;YES, ANOTHER LEVEL OF INDENTATION THEN PUSHJ P,LSPC3 ;SPACE IN MOVEI M,[ASCIZ / written on /] SKIPE T2,B$SDEV ;IF DEVICE, PUSHJ P,LSTR ;LABEL DEVICE SKIPE T2 ;SKIP IF BLANK PUSHJ P,LSIXCL ;LIST DEVICE MOVEI M,[ASCIZ /, reel /] SKIPE T2,B$SREL ;LIST REELID IF IT'S THERE PUSHJ P,LSTR SKIPE T2 PUSHJ P,LSIXN PUSHJ P,LCOMMA MOVEI M,[ASCIZ \ on S/N \] SKIPE T1,B$SAPR PUSHJ P,LSTR SKIPE T1 PUSHJ P,LDEC LDB T1,[POINTR (B$SMTC,MT.DEN)] JUMPE T1,MTFXS3 ;IF DENSITY SET, MOVEI M,[ASCIZ / at /] PUSHJ P,LSTR MOVE T1,[ASCII /200/ ASCII /556/ ASCII /800/ ASCII /1600/ ASCII /6250/ ASCII /(6)/ ASCII /(7)/]-1(T1) MOVEI M,T1 ;ASCII OF DENSITY PUSHJ P,LSTR ;ISSUE IT MOVX T1,MT.7TR ;LOOK AT 7-TRACK FLAG MOVEI M,[ASCIZ / 9-track/] TDNE T1,B$SMTC ;SEE IF ON MOVEI M,[ASCIZ / 7-track/] PUSHJ P,LSTR ;ISSUE TRACKS MTFXS3: PUSHJ P,LCRLF ;GO TO NEW LINE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;STILL IN IFN FT$MTB TLNE F,L.MLBL ;HAVE WE TYPED LABEL INFO? PUSHJ P,LSPC2 ;YES, ANOTHER LEVEL OF INDENTATION THEN PUSHJ P,LSPC3 ;SPACE 5 MOVEI M,[ASCIZ / under/] PUSHJ P,LSTR ;ISSUE LABEL SKIPGE B$SMTY ;GET SYSTEM TYPE TDZA T1,T1 ;IGNORE IF FUNNY LDB T1,[POINTR (B$SMTY,CN%MNT)] CAILE T1,3 ;IS IT KNOWN? MOVEI T1,0 ;NO--FORGET IT MOVE M,[ [ASCIZ \\] [ASCIZ \ TOPS-10\] [ASCIZ \ I.T.S.\] [ASCIZ \ TENEX\] ](T1) PUSHJ P,LSTR ;GIVE SYSTEM TYPE MOVEI M,[ASCIZ / system/] PUSHJ P,LSTR ;LABEL SYSTEM VERSION SKIPE B$SSVR ;AND PUSHJ P,LSPC ;SPACE SKIPE T4,B$SSVR ;GET SYSTEM VERSION PUSHJ P,LVER ;LIST IN VERSION MOVEI M,[ASCIZ /: /] PUSHJ P,LSTR ;SEPARATE SYSTEM NAME MOVEI M,B$SSNM ;POINT TO SYSTEM NAME SKIPL B$GTYP ;IF BACKUP, MOVEI M,B$BSYS ; POINT TO SPECIAL REGION PUSHJ P,LSTR ;OUTPUT IT PJRST LCRLF ;END LINE ;STILL IN IFN FT$MTB ;HERE ON BACKUP/FRS DIRECTORY MTFDIR: PUSHJ P,WLDEOD ;OUTPUT SUMMARIES SETZM BFHD+.BFCTR ;DISCARD REST OF BLOCK JRST MTFRSR ;AND CONTINUE ONWARD ;HERE ON BACKUP/FRS FILE MTFFIL: SETZM LBLOCK ;CLEAR OUT ANY EXCESS MOVE T1,[LBLOCK,,LBLOCK+1] BLT T1,FRIBLK ; .. IFN FT$MTS,< ;FRS SKIPL B$GTYP ;IF BACKUP, JRST MTFBFL ; GO HANDLE SEPARATELY MOVE T1,B$FRBN ;GET RELATIVE BLOCK NO. LSH T1,7 ;CONVERT TO WORDS MOVEM T1,B$FRDW ;STORE SIMILAR TO BACKUP SKIPL T1,B$FNDW ;GET NUMBER OF WORDS CAILE T1,200 ;SEE IF OK JRST MTFJKB ;NO--ERROR SKIPN T1,B$FNDB ;GET NUMBER OF DATA BLOCKS SKIPGE B$GFLG ;UNLESS EOF SKIPA ;YES MOVEI T1,5 ;(BUG IN OLD VERSION OF FRS) SKIPL T1 ;SEE IF CAILE T1,20 ; MAKES SENSE JRST MTFJKB ;NO--ERROR IMULI T1,200 ;CONVERT TO WORDS ADD T1,B$FNDW ;ADD LAST PARTIAL BLOCK CAIL T1,200 ;IN CASE JUST RIB, SKIP SUBI T1,200 ; REMOVE LAST BLOCK IN COUNT MOVEM T1,BFHD+.BFCTR ;STORE AS ACTUAL DATA LENGTH MOVE T1,B$FSTR ;GET STRUCTURE MOVEM T1,FSTR ;SET FOR LISTER SKIPE B$FRBN ;GET STARTING BLOCK JRST [MOVE T1,B$FNAM;GET HEADER NAME MOVEM T1,FNAM ;STORE MOVE T1,B$FEXT;GET EXTENSION HLLZM T1,FEXT ;STORE MOVE T1,B$FUFD;GET DIRECTORY MOVEM T1,UFDPPN;STORE DIRECTORY JRST MTFDFM] ;GO STORE >;END IFN FT$MTS >;END IFN FT$MTB ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE IFN FT$MTS,< ;FRS MOVNI T2,177-.FXLND ;PRESET COUNT OF RIB PUSHJ P,NEXOVR ;GET RIB POINTER JRST E$$JFS ;UNEXPECTED END OF RECORD HRRZM T1,RIBLEN ;SET AS RIB LENGTH TLZ T1,-1 ;CLEAR JUNK CAILE T1,LN$RIB ;SEE IF IT FITS JRST E$$JFS ;NO--ERROR MOVNS T1 ;GET NEGATIVE COUNT HRLZS T1 ;POSITION FOR AOBJN HRRI T1,LBLOCK+1 ;POINT TO RIB PUSHJ P,BLKOVR ;TRANSFER BLOCK OF DATA JRST E$$JFS ;JUNK IF NOT THERE MTFFR2: PUSHJ P,NEXOVR ;GET JUNK RIB JRST E$$JFS ;UNEXPECTED END OF RECORD JUMPN T2,MTFFR2 ;LOOP UNTIL DONE MOVEI T4,.FXLND ;GET SFD DEPTH SETZM THSPTH+.PTPPN(T4) ;[450]SET END FLAG MTFFR3: PUSHJ P,NEXOVR ;GET SFD JRST E$$JFS ;UNEXPECTED END OF RECORD MOVEM T1,THSPTH+.PTPPN(T4) ;STORE SFD SOJGE T4,MTFFR3 ;GO GET NEXT ONE MOVE T1,B$FLVL ;GET SFD LEVEL SETZM THSPTH+.PTPPN+1(T1) ; CLEAR BEYOND IT SETZM THSPTH ;CLEAR UNUSED AREA SETZM THSPTH+1 ; .. MOVEI T1,THSPTH ;POINT TO SFD AREA SKIPE THSPTH+.PTPPN+1 ;SEE IF SFD NEEDED MOVEM T1,UFDPPN ;YES--POINT TO IT JRST MTFDFL ;GO HANDLE FILE >;END IFN FT$MTS IFN FT$MTB,<; BACKUP/FRS ;HERE ON START OF BACKUP FILE TO ACQUIRE ATTRIBUTES, ETC. MTFBFL: MOVE T1,MTFBOT ;CLEAR PUSHJ P,MTFBCB ; NAME BLOCK MOVE T1,MTFBOT+1 ;CLEAR PUSHJ P,MTFBCB ; ATTRIBUTES BLOCK MOVE T1,B$GFLG ;GET RECORD FLAGS TXNN T1,GF$SOF ;TRUE START OF FILE? JRST [TRO F,R.NSF ;RECOVER NAME JRST MTFB.1] ;GO PROCESS PUSHJ P,MTFBGO ;GET OVERHEAD DATA JRST E$$JFS ;JUNK IF SCREWY MTFB.1: MOVEI T1,.FCDEV ;GET PUSHJ P,MTFBDT ; DEVICE MOVEM T1,FSTR ;SAVE FOR DIRECTORY MOVEI T1,.FCNAM ;GET PUSHJ P,MTFBDT ; NAME MOVEM T1,FNAM ;SAVE MOVEI T1,.FCEXT ;GET PUSHJ P,MTFBDT ; EXTENSION MOVEM T1,FEXT ;SAVE MOVEI T1,.FCDIR ;INDICATE UFD PUSHJ P,MTFBDT ; GET IT JUMPE T1,MTFB.3 ;JUMP IF NOT THERE MOVEM T1,MTPATH+.PTPPN;ELSE SET IN PATH MOVSI P1,1-.FXLND ;COUNT SFDS MTFB.2: MOVEI T1,.FCSFD(P1) ;INDICATE SFD PUSHJ P,MTFBDT ;GET IT MOVEM T1,MTPATH+.PTPPN+1(P1) ;STORE IT SKIPE T1 ;UNLESS DONE, AOBJN P1,MTFB.2 ; LOOP MOVEI T1,MTPATH ;POINT TO PATH MTFB.3: MOVEM T1,UFDPPN ;STORE AS DIRECTORY TRZE F,R.NSF ;IF NOT START AT START, JRST MTFDFM ; GO ISSUE MESSAGE MOVE T1,B$BATT+A$FHLN;GET ATTRIBUTE LENGTH CAIGE T1,^D8 ;MAKE SURE BIG ENOUGH PUSHJ P,[AOSE AMWCNT ;[462] FIRST TIME THIS SAVE SET? POPJ P, ;[462] NO, IGNORE FURTHER JUNK N$WARN (AMW,) POPJ P,] ;DUMPER IS KNOWN TO DO THIS (CNT=0) MOVEI T1,LN$RIB ;SET FULL MOVEM T1,RIBLEN ; RIB LENGTH ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;STILL IN IFN FT$MTB ;NOW DO ATTRIBUTES MOVEI T2,0 ;PRECLEAR ACCESS SKIPE T1,B$BATT+A$REDT;GET ACCESS TIME PUSHJ P,.CNTDT## ;CONVERT FORMAT DPB T2,[POINTR (FACD,RB.ACD)] SKIPE T1,B$BATT+A$PROT;GET PROTECTION PUSHJ P,MTFDPR ;CONVERT TO TOPS-10 DPB T1,[POINTR (FPRV,RB.PRV)] SKIPN B$BATT+A$PROT ;IF MISSING PROTECTION, SETOM FFPRV ;NO PROTECTION IN INTERCHANGE MOVE T1,B$BATT+A$MODE;GET MODE DPB T1,[POINTR (FMOD,RB.MOD)] MOVE T1,B$BATT+A$WRIT;GET WRITE DATE PUSHJ P,.CNTDT## ;TAKE APART DPB T2,[POINTR (FCRE,RB.CRD)] LSH T2,-^D12 ;DATE75 EXCESS DPB T2,[POINTR (FCRX,RB.CRX)] IDIVI T1,^D60000 ;CONVERT TO MINUTES SKIPE T2 ;IF EXCESS, AOS T1 ; ROUND UP DPB T1,[POINTR (FCRE,RB.CRT)] MOVEI T2,^D36 ;GET WORD WIDTH IN BITS IDIV T2,B$BATT+A$BSIZ;CONVERT TO LENGTH IN BYTES SKIPGE T1,B$BATT+A$LENG;LENGTH IN BYTES MOVEI T2,1 ;IF OVERFLOW, KILL DIVISOR IDIV T1,T2 ;CONVERT TO LENGTH IN WORDS SKIPE T2 ;IF PARTIAL WORD, AOS T1 ; ROUND UP MOVEM T1,FSIZ ;STORE AS SIZE MOVE T1,B$BATT+A$VERS;GET VERSION MOVEM T1,FVER ;STORE MOVE T1,B$BATT+A$NOTE;POINT TO ANNOTATION PUSHJ P,MTGTSX ;CONVERT TO SIXBIT MOVEM T1,FSPL ;SET IN SPOOL WORD MOVEI T2,0 ;PRECLEAR SKIPL T1,B$BATT+A$ESTS;GET ESTIMATE IDIVI T1,^D128 ;CONVERT TO BLOCKS SKIPE T2 ;IF OVERFLOW, AOS T1 ; INCREMENT MOVEM T1,FEST ;SET AS ESTIMATE MOVEI T2,0 ;PRECLEAR SKIPL T1,B$BATT+A$ALLS;ALLOCATED SIZE IN WORDS IDIVI T1,^D128 ;CONVERT TO BLOCKS SKIPE T2 ;IF PARTIAL BLOCK, AOS T1 ; ROUND UP MOVEM T1,FALC ;STORE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;STILL IN IFN FT$MTB SKIPL T1,B$BATT+A$RADR;GET REQUESTED ADDRESS IDIVI T1,^D128 ;CONVERT TO BLOCKS MOVEM T1,FPOS ;STORE MOVE T1,B$BATT+A$USRW;GET USER WORD MOVEM T1,FNCA ;STORE MOVE T1,B$BATT+A$BKID;GET LAST BACKUP TAPE PUSHJ P,MTGTSX ;CONVERT TO SIXBIT MOVEM T1,FMTA ;STORE MOVEI T1,0 ;PRECLEAR STATUS BITS MOVSI T2,(1B0) ;SET FIRST BIT MOVSI T3,-LMTRBT ;SET LOOP LENGTH MTFB.4: TDNE T2,B$BATT+A$FLGS;TEST BACKUP FLAG IOR T1,MTRBT(T3) ;ON--SET TOPS-10 BIT LSH T2,-1 ;MOVE TO NEXT BACKUP BIT AOBJN T3,MTFB.4 ;LOOP OVER TABLE MOVEM T1,FSTS ;STORE STATUS MOVE T1,B$BATT+A$CUSR;GET AUTHOR PUSHJ P,MTGTPP ;CONVERT TO PPN MOVEM T1,FAUT ;STORE MOVE T1,B$BATT+A$BKDT;BACKUP DATE/TIME MOVEM T1,FIDT ;STORE AS BACKUP INCREMENTAL DATE/TIME MOVE T1,B$BATT+A$PCAW;GET PRIV USER WORD MOVEM T1,FPCA ;STORE SKIPN T1,B$BATT+A$ACCT;[470] ACCOUNT STRING BYTE POINTER JRST MTFB.6 ;NONE MOVE T2,[POINT 7,FACT] ;[470] PROTOTYPE .RBACT STRING POINTER MOVEI T4,<<.RBAC8-.RBACT+1>*5>-1 ;[470] MAXIMUM CHARACTER COUNT PUSHJ P,MTGTST ;[470] GET (AND COPY) ACCOUNT STRING MTFB.6: HRRZ T1,B$BATT ;LENGTH OF ATTRIBUTES BLOCK FIXED HEADER CAIG T1,A$FFFB ;INCLUDE THE FILE-TYPE/ETC. WORDS? JRST MTFDFL ;NO (PRE-VERSION-5 BACKUP), ALL DONE SKIPE T1,B$BATT+A$FTYP;FILE TYPE-AND-FLAGS WORD MOVEM T1,FTYP ;STORE IN .RBTYP WORD SKIPE T1,B$BATT+A$FBSZ;FILE BYTE/FRAME/ETC VALUES MOVEM T1,FBSZ ;STORE IN .RBBSZ WORD SKIPE T1,B$BATT+A$FRSZ;RECORD AND BLOCK SIZES MOVEM T1,FRSZ ;STORE IN .RBRSZ WORD SKIPE T1,B$BATT+A$FFFB;FIRST-FREE-BYTE, CUSTOMER VALUE MOVEM T1,FFFB ;STORE IN .RBFFB WORD JRST MTFDFL ;GO HANDLE FILE ;(STILL IFN FT$MTB) ;TABLE OF TOPS-10 FILE RIB STATUS BITS IN BACKUP ORDER MTRBT: RP.NDL Z Z RP.ABU RP.NQC RP.ABC RP.FCE RP.FWE RP.BFA RP.BDA LMTRBT==.-MTRBT ;STILL IN IFN FT$MTB ;HERE WHEN FILE ACTUALLY FOUND ON TAPE MTFDFM: MOVEI M,[ASCIZ \ File starts in middle: \] PUSHJ P,LSTR ;NOT START OF FILE! MTFDFL: TLO F,L.FRSS ;INDICATE FRS/BACKUP DATA PUSHJ P,MTDOFL ;GO HANDLE FILE TLZ F,L.FRSS!L.FKEF ;CLEAR FLAGS JRST MTFRSR ;PROCEED TO NEXT BLOCK >;END FT$MTB SUBTTL DIRECTORY LISTING - MAGTAPE -- FAILSAFE IFN FT$MTF,< ;FAILSAFE MTSVST: MOVE T3,CHKSUM ;SAVE THE CURRENT CHECKSUM MOVEM T3,KCHKSM ;.. SETZM H.MZER ;CLEAR FOR THIS SAVESET MOVE T3,[H.MZER,,H.MZER+1] BLT T3,H.EMZR ; .. MOVE T3,KCHKSM ;RESTORE THE SAVED CHECKSUM MOVEM T3,CHKSUM ;.. MOVEM T1,MTSVVR ;SAVE HEADER PUSHJ P,NEXOVW ;GET CODE WORD JRST MTIOJF ;JUNK PUSHJ P,NEXDT3 ;DO THE CHECKSUM JFCL ;SILLY RETURN AOS T2 ;COUNT WORD CAME T1,[SIXBIT /*FAILS/] JRST MTIOJK ;NOT FAILSAFE TAPE SETZM CHKSUM ;CLEAR THE CHKSUM FOR THIS SAVE SET PUSHJ P,NEXOVW ;GET TAPE NUMBER JRST MTIOJF ;DEATH AOS T2 ;COUNT STILL HRRM T1,MTSVVR ;SAVE TAPE NUMBER TRZ T1,377777 ;CLEAR TAPE NUMBER CAME T1,[SIXBIT /AFE/] JRST MTIOJK ;JUNK PUSHJ P,NEXOVW ;GET DATE, ETC. JRST MTIOJF ;NOT ENOUGH AOS T2 ;COUNT RECORD MOVE P2,T1 ;SAVE TAPE AND DATE PUSHJ P,NEXOVW ;LAST WORD JRST MTIOJF ;SORRY AOS T2 ;COUNT WORD IN RECORD CAME T1,[1,,2] ;CHECK THAT TOO JRST MTIOJK ;NO--GIVE UP PUSHJ P,NEXOVW ;READ THE EOF JRST .+2 ;GOOD AOJA T2,MTIOJK ;NO--JUNK TLNE F,L.MLBL ;HAVE WE TYPED LABEL INFO? PUSHJ P,LSPC2 ;YES, ANOTHER LEVEL OF INDENTATION THEN MOVEI M,[ASCIZ / FAILSAFE save set by version /] PUSHJ P,LSTR ;LIST LABEL HLRZ T1,MTSVVR ;GET VERSION OF FAILSA PUSHJ P,LOCT ;LIST OCTAL PUSHJ P,MTLTDT ;LIST TAPE'S DATE AND TIME MOVEI M,[ASCIZ / tape /] PUSHJ P,LSTR ;LIST LABEL HRRZ T1,MTSVVR ;GET TAPE NUMBER PUSHJ P,LDEC ;LIST IT PUSHJ P,LCRLF ;END LINE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;STILL IN IFN FT$MTF ;HERE AFTER SAVE SET HEADER IS OUTPUT AND ;BACK HERE AFTER EACH FILE TO LOOK FOR NEXT USER/STR MTUSER: MOVEI M,[ASCIZ / /] SKIPLE S.MARK ;/MARKS? PUSHJ P,LSTR ;YES--TELL USER STATZ DC,IO.EOT ;SEE IF EOT JRST E$$PET ;YES--GO WRAP UP CLOSE DC, ;CLEAR END-OF-FILE SOSN MTFLCT ;DO /FILE ACCOUNTING JRST MTDONX ;JUMP IF DONE WITH /FILE PUSHJ P,NEXOVW ;READ NEXT HEADER JRST [N$WARN (DTM,Double tape mark) JRST MTUSER] ;AND TRY AGAIN ;BACK HERE TO PROCESS NEXT FILE MTLOOK: JUMPGE T1,MTRAIL ;MUST BE AT TRAILER TLC T1,-1 ;FLIP FLAG TLNN T1,-1 ;MAKE SURE IT WAS -1 CAIGE T1,42 ;MAKE SURE FULL BLOCK THERE JRST MTSVJK ;NO--JUNK IN SAVE SET PUSHJ P,NEXOVW ;GET STR NAME JRST E$$JSS ;ERROR MOVEM T1,FSTR ;SAVE FOR TYPEOUT MOVSI P1,-41 ;PRESET LOOKUP COPY LOOP MTLOK1: PUSHJ P,NEXOVW ;GET WORD JRST E$$JSS ;ERROR MOVEM T1,LBLOCK(P1) ;SAVE WORD AOBJN P1,MTLOK1 ;LOOP UNTIL DONE MOVE T1,RIBLEN ;GET COUNT FROM TAPE CAIE T1,40 ;MUST BE 40 JRST MTSVJK ;NO--JUNK TLO F,L.SVST ;FLAG SAVE SET READ TO SKIP OVER ; THE RECORD PREFIXES ;HERE WHEN FILE FOUND ON TAPE PUSHJ P,MTDOFL ;GO HANDLE FILE TLZ F,L.SVST ;CLEAR FUNNY MODE TLZN F,L.FKEF ;SEE IF REAL OR FAKE EOF JRST MTUSER ;REAL--GO TO NEXT STR OR PPN OR TRAILER MOVE T1,MTSVHD ;FAKE--GET NEXT HEADER JRST MTLOOK ;GO PROCESS NEXT FILE >;END IFN FT$MTF IFN FT$MTB!FT$MTF!FT$MTR,< ;BACKUP/FRS, FAILSAFE, OLD BACKUP/RESTORE ;MTDOFL -- ROUTINE TO ANALYZE FILE IF USER WANTS IT AND SKIP OVER DATA ;USES T1-4 MTDOFL: AOS .CTFLS## ;COUNT UP FILES SEEN ON TAPE AOS .CTFLF## ;ASSUME FILE FOUND (.CHKTA WILL DECREMENT ; THIS IF IT REJECTS THE FILE) PUSHJ P,.CHKTA## ;SEE IF FILE MATCHES JRST MTSKIP ;REJECTED, ADVANCE TO NEXT FILE PUSHJ P,ANALYZ ;GO LIST IN APPROPRIATE FORMAT JFCL ;HOHUM MTSKIP: PUSHJ P,NEXDTW ;READ REST OF DATA FILE POPJ P, ;GOOD--WE'RE DONE JRST MTSKIP ;LOOP TO FILE'S END >;END IFN FT$MTB!FT$MTF!FT$MTR IFN FT$MTF,< ;FAILSAFE ;HERE WHEN TRAILER SEEN ON TAPE MTRAIL: HLLZ T2,MTSVVR ;GET VERSION FROM HEADER PUSHJ P,NEXOVW ;GET CHECK WORD JRST E$$JSS ;ERROR CAME T1,[SIXBIT /*FAILS/] JRST MTSVJK ;JUNK PUSHJ P,NEXOVW ;AND COUNT JRST E$$JSS ;ERROR HRRZ T2,MTSVVR ;GET SAVED TAPE NUMBER ADD T1,T2 ;MATCH AGAINST TRAILER'S CAME T1,[+1B17] JRST MTSVJK ;ERROR PUSHJ P,NEXOVW ;GET DATE, ETC. JRST E$$JSS ;ERROR MOVE P2,T1 ;SAVE FOR OUTPUT ROUTINE PUSHJ P,NEXOVW ;GET FINAL CHECK JRST E$$JSS ;ERROR CAME T1,[1,,2] ;CHECK CODE JRST MTSVJK ;ERROR PUSHJ P,NEXOVW ;READ EOF JRST .+2 ;GOOD JRST MTSVJK ;ERROR ;HERE AFTER READING THE TRAILER FILE PUSHJ P,DIRE ;GIVE TOTAL LINE TLZ F,L.CRLF ;WE REALLY WANT A BLANK PUSHJ P,LCRLF ;(I.E., A "BLANK") LINE TLNE F,L.MLBL ;HAVE WE TYPED LABEL INFO? PUSHJ P,LSPC2 ;YES, ANOTHER LEVEL OF INDENTATION THEN MOVEI M,[ASCIZ / End of save set/] PUSHJ P,LSTR ;TYPE INDICATOR PUSHJ P,MTLTDT ;LIST TIME AND DATE MTENDS: PUSHJ P,LCRLF ;AND END LINE MTENDT: TLZ F,L.CRLF ;SEPARATE SAVE SETS FOR NEATNESS PUSHJ P,LCRLF ;AND ADD A BLANK LINE SETZM H.MZER ;CLEAR TOTALS MOVE T1,[H.MZER,,H.MZER+1] BLT T1,H.EMZR SKIPN MTNAME ;STILL HAVE A TAPE MOUNTED? JRST MTDONY ;NO, JUST CAP OFF AND QUIT JRST MTFIND ;GO BACK TO START >;END IFN FT$MTF IFN FT$MTA,< ;MAGTAPES IFN FT$MTF,< ;FAILSAFE ;HERE WHEN JUNK IN SAVE SET MTSVJK: SETZM BFHD+.BFCTR ;CLEAR REST OF RECORD PUSHJ P,NEXOVW ;READ ON TO EOF JRST E$$JSS ;GOT IT JRST MTSVJK ;NO--LOOP >;END IFN FT$MTF ;HERE WHEN EOF JUNK N$WARN (JSS,Junk in save set) JRST MTUSER ;GO START OVER IFN FT$MTF,< ;FAILSAFE ;HERE ON PREMATURE EOT N$WARN (PET,Premature end of tape in save set) PUSHJ P,DIRE ;GIVE FINAL TOTALS >;END IFN FT$MTF ;HERE AT EOT ON MAG TAPE MTDONE: SKIPE S.EOT ;SEE IF /NOEOT JRST MTDONX ;NO--GO FINISH UP CLOSE DC, ;CLEAR END-OF-FILE SOSE MTFLCT ;DO /FILE ACCOUNTING JRST MTFIND ;START OVER UNLESS /FILE COUNTED OUT ;HERE WHEN TRULY TIME TO STOP MTDONX: SKIPE S.REWS ;SEE IF /NOREW MTREW. DC, ;REWIND TAPE AT END MTDONY: PUSHJ P,DIRET ;ISSUE TOTALS, ETC. RELEAS DC, ;RELEASE THE DATA CHANNEL SETZM FOBLK+.FODEV ;INDICATE DEVICE IS NO LONGER WITH US DMOVE T1,MTXDEV ;ORIGINAL DEVICE SPEC MOVE T3,.WIFIR## ;COMMANDING FILE SPEC BLOCK ADDRESS DMOVEM T1,.FXDEV(T3) ;RESTORE ON G.P.'S TRZ F,R.WORD+R.MTOH ;CLEAR WORD MODE AND TAPE OVERHEAD JRST .POPJ1## ;RETURN HAPPILY >;END IFN FT$MTA SUBTTL DIRECTORY LISTING - MAGTAPE -- MISCELLANEOUS SUBROUTINES IFN FT$MTF,< ;FAILSAFE ;MTLTDT -- ROUTINE TO LIST TIME AND DATE FROM FAILSAFE TAPE ;CALL: MOVE P2,WORD FROM HEADER ; PUSHJ P,MTLTDT ;LISTS " AT HH:MM:SS ON DATE" MTLTDT: PUSHJ P,.SAVE1 ;SAVE P1 MOVEI M,[ASCIZ / at /] PUSHJ P,LSTR ;LIST LABEL HLRZ T1,MTSVVR ;GET VERSION NUMBER CAIG T1,27 ;IF SINCE V.27 OK JRST [LDB T4,[POINT 11,P2,23] PUSHJ P,LTIME JRST MTSVDT] LDB T4,[POINT 17,P2,23] CAILE T1,77 ;SEE IF V.100 LDB T4,[POINT 17,P2,20] ;YES--GET NEW FORMAT PUSHJ P,LSECS ;ISSUE TIME IN SECONDS MTSVDT: MOVEI M,[ASCIZ / on /] PUSHJ P,LSTR ;LIST LABEL HRRZ T4,P2 ;GET DATE ANDI T4,77777 ;MASK TO DATE HLRZ T1,MTSVVR ;GET FAILSA VERSION CAIG T1,77 ;IF BEFORE VERSION 100, ANDI T4,7777 ;MASK OUT JUNK PJRST LDATE ;LIST IT AND RETURN >;END IFN FT$MTF REPEAT 0,< IFN FT$MTA,< ;MAGTAPES ;SUBROUTINE TO OPEN MAG TAPE ;CALL: PUSHJ P,MTOPEN ;RETURNS T1=0 IF FILE COUNT DONE (/FILE SWITCH) MTOPEN: MOVE T1,MTSVFF ;RESTORE JOBFF MOVEM T1,.JBFF ; TO AVOID GROWTH MOVX T1,FX.PAR ;CHECK FOR /PARITY TDNN T1,.FXMOD(I) ; SUPPLIED BY USER TDZA T1,T1 ;NO--CLEAR IT MOVX T1,IO.PAR ;YES--SET IT LDB T2,[POINTR (.FXMOD(I),FX.DEN)] DPB T2,[POINTR (T1,IO.DEN)] MOVE T2,.FXMOD(I) ;GET PHYSICAL BIT TXNE T2,FX.PHY ;TEST IT TXO T1,UU.PHS ;YES--SET FOR OPEN IORI T1,.IOBIN ;SET BINARY MODE SKIPN S.RETR ;/NORETRY? TXO T1,UU.DER ;YES, SUPPRESS AUTOMATIC RETRY SKIPN S.ERLO ;/NOERLOG? TXO T1,UU.DEL ;YES, DISABLE ERROR LOGGING MOVE T2,.FXDEV(I) ;GET DEVICE NAME MOVEI T3,BFHD ;GET INPUT BUFFER HEADERS OPEN DC,T1 ;OPEN CHANNEL POPJ P, ;RETURN WITH ERROR ;HERE WHEN TAPE IS OPENED--SETUP BUFFERS MOVEI T4,T1 ;GET SYSTEM BUFFERING DEVSIZ T4, ;FROM MONITOR MOVEI T4,LN$MRC+3 ;ASSUME DEFAULT HRRZI T1,-3(T4) ;GET BUFFER SIZE CAIGE T1,LN$MRC ;SEE IF MIN TAPE OR BIGGER SIZE MOVEI T1,LN$MRC ;NO--FORCE UP SKIPLE .FXBLS(I) ;DID USER EXERT EXPLICIT BLOCKSIZE REQUEST? HRRZ T1,.FXBLS(I) ;YES, THEN HE WINS. HRLI T1,NM$MBF ;NUMBER OF BUFFERS SKIPLE .FXBFN(I) ;DID USER SPECIFY COUNT OF BUFFERS? HRL T1,.FXBFN(I) ;YES, THEN HE WINS. MOVEI T2,BFHD ;POINT TO HEADER PUSHJ P,MAKBUF ;MAKE A BUFFER RING SETOM MTAEOF ;SET NEW MTA FILE FLAG SOS T1,MTFLCT ;COUNT DOWN FILE COUNTER JRST .POPJ1## ;WIN RETURN >;END IFN FT$MTA > ;END OF REPEAT 0 IFN FT$MTB,< ;BACKUP/FRS ;MTFBGO -- GET OVERHEAD REGIONS FROM BACKUP/FRS TAPE ;CALL: PUSHJ P,MTFBGO ; RETURN +1 IF ERRORS ; RETURN +2 IF OK MTFBGO: PUSHJ P,.SAVE3## ;MAKE SOME WORK ROOM HRRZ P1,B$GLND ;LENGTH (DUMPER LEAVES JUNK IN LH) ;LOOP OVER OVERHEAD BLOCKS MTFG.1: SOJL P1,MTFG.3 ;EXIT IF DONE PUSHJ P,NEXOVR ;GET NEXT BLOCK HEADER POPJ P, ;ERROR IF MISSING HLRZ P3,T1 ;GET TYPE CAILE P3,MTFBOL ;SEE IF TOO BIG POPJ P, ;ERROR IF SO MOVEI P2,-1(T1) ;GET LENGTH OF DATA PORTION SUB P1,P2 ;COUNT IF DOWN JUMPL P1,.POPJ## ;ERROR IF TOO LONG MOVE T1,MTFBOT-1(P3) ;GET AREA PUSHJ P,MTFBCB ;CLEAR OUT AREA HLRE T3,MTFBOT-1(P3) ;GET MAX LENGTH WE CAN HANDLE MOVN T1,P2 ;GET NEGATIVE LENGTH CAMG T1,T3 ;IF TOO NEGATIVE TO FIT, MOVE T1,T3 ; JUST USE OUR SPACE ADD P2,T1 ;SUBTRACT FROM TAPE SIZE HRLZS T1 ;POSITION FOR AOBJN HRR T1,MTFBOT-1(P3) ;GET START PUSHJ P,BLKOVR ;GET BLOCK OF DATA POPJ P, ;ERROR IF NOT ALL THERE MOVEI T1,377 ;MASK OF RIGHTMOST ASCIZ CHARACTER SKIPE MTFBOU-1(P3) ;IF SET, ANDCAM T1,@MTFBOU-1(P3); PROTECT AGAINST JUNK MTFG.2: JUMPLE P2,MTFG.1 ;SKIP REST PUSHJ P,NEXOVR ; IF WE DIDN'T USE IT POPJ P, ;ERROR IF NOT ALL THERE SOJA P2,MTFG.2 ; LOOP MTFG.3: MOVE T1,B$GSIZ ;UPDATE MOVEM T1,BFHD+.BFCTR ; WORDS OF DATA JRST .POPJ1## ;GIVE GOOD RETURN >;END IFN FT$MTB ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE IFN FT$MTB,< ;BACKUP/FRS MTFBOT: -^D30,,B$BNAM ;1=NAME BLOCK -^D50,,B$BATT ;2=FILE ATTRIBUTES 0 ;3=DIRECTORY ATTRIBUTES -^D6,,B$BSYS ;4=SYSTEM HEADER -^D7,,B$BSSN ;5=SAVE SET NAME MTFBOL==.-MTFBOT MTFBOU: 0 ;1=NAME BLOCK 0 ;2=FILE ATTRIBUTES 0 ;3=DIRECTORY ATTRIBUTES B$BSYS+5 ;4=SYSTEM HEADER B$BSSN+6 ;5=SAVE SET NAME ;MTFBCB -- ROUTINE TO CLEAR A SPECIFIC OVERHEAD BLOCK ;CALL: T1/ AOBJN TO BLOCK ; PUSHJ P,MTFBCB ; RETURN +1 ;USES T1 MTFBCB: SKIPGE T1 ;UNLESS NULL, SETZM (T1) ; CLEAR WORD AOBJN T1,.-1 ;LOOP POPJ P, ;RETURN >;END IFN FT$MTB IFN FT$MTB,< ;MTFBDT -- ROUTINE TO GET A SPECIFIC NAME COMPONENT ;CALL: T1/ CODE OF COMPONENT TO GET ; PUSHJ P,MTFBDT ; RETURN +1 WITH T1/ VALUE (CONVERTED TO SIXBIT) OR 0 MTFBDT: PUSHJ P,.SAVE2## ;SAVE SPACE MOVE P2,T1 ;COPY REQUEST FOR SAFE KEEPING MOVEI P1,0 ;SET COUNT TRNE F,R.NSF ;IF NOT AT START, MOVEI P1,B$FPTH-1 ; USE RECOVERY HEADER MTFD.1: TRNE F,R.NSF ;IF NOT AT START, JRST [HRLI P1,(POINT 7,,35) ILDB T2,P1 ;GET SUB-BLOCK CODE ILDB T4,P1 ;GET LENGTH JRST MTFD.2] ;AND PROCEED HLRZ T2,B$BNAM(P1) ;GET NEXT SUB-BLOCK CODE HRRZ T4,B$BNAM(P1) ;GET LENGTH MTFD.2: SKIPN T4 ;IF EMPTY, MOVEI T4,1 ; SET FOR JUST HEADER CAMN T2,P2 ;SEE IF MATCH JRST MTFD.4 ;YES--GO HANDLE TRNE F,R.NSF ;IF NOT AT START, JRST [HRRZ T2,P1 ;GET CURRENT WORD CAIGE T2,B$FPTH+^D12 ;MAKE SURE FITS JRST MTFD.1 ;OK--CONTINUE JRST MTFD.3] ;BAD--LOOSE ADD P1,T4 ;NO--ADVANCE CAIGE P1,^D30 ;SEE IF OVERFLOW YET JRST MTFD.1 ;NO--TRY AGAIN MTFD.3: MOVEI T1,0 ;YES--RETURN 0 POPJ P, ; TO CALLER ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE (STILL IFN FT$MTB) ;HERE WHEN FOUND THE COMPONENT MTFD.4: TRNE F,R.NSF ;IF NOT AT START, JRST [HRRZ T1,P1 ;GET LOCATION MOVNS T1 ;GET -AMOUNT USED CAILE T4,B$FPTH+^D12(T1) ;SEE IF FITS MOVEI T4,B$FPTH+^D12(T1) ;NO--TRUNCATE IMULI T4,5 ;GET CHARACTER COUNT SUBI T4,2 ;ALLOW FOR OVERHEAD JRST MTFD.5] ;AND PROCEED MOVN T1,P1 ;GET -AMOUNT USED CAILE T4,^D30(T1) ;SEE IF LENGTH FITS MOVEI T4,^D30(T1) ;NO--USE ACTUAL IN CORE SOS T4 ;REMOVE OVERHEAD WORD IMULI T4,^D5 ;CONVERT TO CHARACTERS ADD P1,[POINT 7,B$BNAM,35] ;POINT TO START IN NEXT WORD MTFD.5: MOVEI T1,0 ;CLEAR SIXBIT ANSWER MOVE T2,[POINT 6,T1] ;POINT TO ANSWER CAIN P2,.FCDIR ;IF UFD, MTFDPP: JRST [PUSHJ P,MTFD.G ;GET FIRST CHARACTER CAILE T3,"7" ;IF ALPHA, JRST MTFD.7 ; HANDLE AS SIXBIT JRST MTFD.8] ;ELSE, HANDLE IN OCTAL MTFDSX:! MTFD.6: PUSHJ P,MTFD.G ;GET NEXT CHARACTER MTFD.7: JUMPE T3,.POPJ## ;EXIT WHEN DONE CAIG T3,137 ; IN ASCII COL 0-5 TRC T3,40 ; FORCE TO ALPHA (COL 4-5) IDPB T3,T2 ;STORE TLNE T2,(77B5) ;IF NOT DONE, JRST MTFD.6 ; LOOP FOR MORE POPJ P, ;RETURN WHEN FULL MTFD.8: PUSHJ P,MTFOCT ;UFD--GET PROJECT IN OCTAL PUSH P,T1 ;SAVE PUSHJ P,MTFD.G ;SKIP SEPARATOR (_) PUSHJ P,MTFOCT ;GET PROGRAMMER IN OCTAL HRL T1,(P) ;INSERT PROJECT POP P,(P) ;DISCARD TEMP POPJ P, ;RETURN UFD ;(STILL IFN FT$MTB) ;MTGTPP -- ROUTINE TO CONVERT ATTRIBUTE STRING TO UFD ;CALL: 1/ RELATIVE BYTE POINTER IN ATTRIBUTES ; PUSHJ P,MTGTPP ; 1/ CONVERSION MTGTPP: PUSHJ P,.SAVE1 ;SAVE P1 PUSHJ P,MTGT.P ;FIXUP POINTER SET COUNT MOVEI T1,0 ;PRESET ANSWER MOVE T2,[POINT 6,T1] ;POINT TO ANSWER PJRST MTFDPP ;GO USE ABOVE ROUTINE ;MTGTSX -- ROUTINE TO CONVERT ATTRIBUTE STRING TO SIXBIT ;CALL: 1/ RELATIVE BYTE POINTER IN ATTRIBUTES ; PUSHJ P,MTGTSX ; 1/ CONVERSION MTGTSX: PUSHJ P,.SAVE1 ;SAVE P1 PUSHJ P,MTGT.P ;FIXUP POINTER SET COUNT MOVEI T1,0 ;PRESET ANSWER MOVE T2,[POINT 6,T1] ;POINT TO ANSWER PJRST MTFDSX ;GO USE ABOVE ROUTINE ;MTGTST -- ROUTINE TO COPY ASCIZ ATTRIBUTE STRING ;CALL: T1/ RELATIVE BYTE POINTER TO ATTRIBUTE BLOCK ; T2/ DESTINATION BYTE POINTER ; T3/ SCRATCH ; T4/ MAXIMUM BYTE COUNT ; ; PUSHJ P,MTGTST ; RETURN ; ; BYTES WILL BE COPIED (NULL FILLED WHEN ATTRIBUTES STRING ;TERMINATES), THEN A NULL WILL BE APPENDED. MTGTST: CAIE T1,0 ;NULL POINTER? ADDI T1,B$BATT ;NO, RELOCATE POINTER INTO ATTRIBUTES BLOCK SKIPA T3,T1 ;SKIP INTO LOOP MTGTS1: IDPB T3,T2 ;STORE NEXT STRING CHARACTER CAIE T3,0 ;NO MORE CHARACTERS AFTER A NULL ILDB T3,T1 ;FETCH NEXT STRING CHAR FROM ATTRIBUTES BLOCK SOJGE T4,MTGTS1 ;LOOP FOR ALL CHARACTERS SETZ T3, ;FORCE A NULL CHARACTER IDPB T3,T2 ;TO TERMINATE THE COPIED ASCIZ STRING POPJ P, ;ALL DONE, RETURN ;(STILL IFN FT$MTB) ;HELPER TO CONVERT OCTAL MTFOCT: TDZA T1,T1 ;STARTS WITH CHAR MTFO.1: PUSHJ P,MTFD.G ;GET CHAR CAIL T3,"0" ;IF CAILE T3,"7" ; OCTAL DIGIT, POPJ P, ;NO--DONE LSH T1,3 ;ADVANCE RESULT ADDI T1,-"0"(T3) ;INCLUDE DIGIT JRST MTFO.1 ;LOOP ;HELPER ROUTINE TO GET NEXT CHARACTER ; COUNTS IN T4, POINTER IN P1 ; RESULT IN T3 MTFD.G: SOSGE T4 ;SEE IF ROOM TDZA T3,T3 ;NO--GIVE NULL ILDB T3,P1 ;YES--GET IT POPJ P, ;RETURN ;HELPER TO SET STRING POINTER MTGT.P: MOVEI T4,0 ;PRESET TO DONE JUMPE T1,.POPJ ;RETURN IF NO POINTER HRRZ T2,T1 ;GET ADDRESS OF POINTER CAIL T2,^D50 ;SEE IF BAD POPJ P, ;YES--GIVE UP HRRI T1,B$BATT(T2) ;COMPUTE REAL LOCATION MOVE P1,T1 ;SET FOR CHAR GETTER MOVEI T4,^D50 ;SET MAX LENGTH SUB T4,T2 ;REMOVE HEADER IMULI T4,5 ;CONVERT TO BYTES POPJ P, ;RETURN ;(STILL IFN FT$MTB) ;MTFDPR -- ROUTINE TO CONVERT PROTECTION ATTRIBUTE ;CALL: 1/ BACKUP PROTECTION ; PUSHJ P,MTFDPR ; 1/ TOPS-10 PROTECTION MTFDPR: PUSH P,T1 ;SAVE ARG LSH T1,-^D16 ;GET OWNER PUSHJ P,MTFDPF ;CONVERT OWNER FIELD MOVE T4,T1 ;SAVE MOVE T1,(P) ;GET ARG LSH T1,-^D8 ;GET AFFINITY GROUP PUSHJ P,MTFDPF ;CONVERT AFFINITY LSH T4,3 ;SHIFT ANSWER IOR T4,T1 ;INCLUDE GROUP POP P,T1 ;RESTORE WORLD PUSHJ P,MTFDPF ;CONVERT WORLD LSH T4,3 ;POSITON ANSWER IOR T1,T4 ;COMBINE RESULT POPJ P, ;RETURN ;HELPER TO CONVERT ONE FIELD MTFDPF: MOVEI T3,7 ;SET WORST LDB T2,[POINTR (T1,PR$RED)] SUB T3,T2 ;REMOVE READ ACCESS CAIGE T3,5 ;BUT NOT LESS MOVEI T3,5 ; THAN 5 LDB T2,[POINTR (T1,PR$WRT)] JUMPN T2,[MOVEI T3,5 ;IF SOME WRITE, SUB T3,T2 ; USE THAT INSTEAD JRST .+1] ; AND CONTINUE LDB T2,[POINTR (T1,PR$ATR)] CAIN T2,7 ;IF DELETE, MOVEI T3,1 ; SET THAT CAIN T2,6 ;IF CHANGE PROT, MOVEI T3,0 ; SET THAT MOVE T1,T3 ;SET RESULT POPJ P, ;RETURN >;END IFN FT$MTB SUBTTL DIRECTORY LISTING - TMPCOR ;HERE WHEN DEVICE IS "TMP:" AND DOES NOT EXIST TMDIR: PUSHJ P,.SAVE4## ;WANT SOME ACS TRO F,R.WORD!R.NDSK ;SET WORD MODE AND NOT A DISK MOVEI P1,20 ;RANDOM DEFAULT TMPCOR DIRECTORY SIZE SOS .CTFLS## ;BACK OFF WILD'S "FILES SEEN" FLAG SOS .CTFLF## ;BACK OFF WILD'S "FILES FOUND" FLAG ;ALLOCATE A BUFFER INTO WHICH TO DUMP THE TMPCOR DIRECTORY TMDIR1: MOVE T1,P1 ;GET NEEDED TMPCOR DIRECTORY SIZE PUSHJ P,GETCOR ;GET A BUFFER MOVE P2,T1 ;SAVE START ADDRESS (OLDE .JBFF) MOVN T4,P1 ;NEGATIVE LENGTH HRLZ T4,T4 ;IN THE LEFT HALF HRRI T4,-1(P2) ;T4:=IOWD POINTER TO DIRECTORY BUFFER SETZ T3, ;NO PARTICULAR NAME MOVE T1,[.TCRRD,,T3] ;TMPCOR ARG POINTER TO TMPCOR T1, ;READ TMPCOR DIRECTORY JRST E$$NTD ;ERROR IF NOT IMPLEMENTED JUMPE T1,[MOVEI M,[ASCIZ\TMPCOR directory is empty \] PUSHJ P,LSTR ;TELL USER OF NO FILES MOVEM P2,.JBFF ;DEALLOCATE THE DIRECTORY BUFFER JRST .POPJ1##] ;RETURN HAPPILY CAMGE T1,P1 ;IS DIRECTORY BIGGER THAN THE BUFFER? JRST TMDIR4 ;NO, ALL SET MOVE P1,T1 ;YES, SET NEEDED DIRECTORY BUFFER SIZE MOVEM P2,.JBFF ;BACK OFF .JBFF TO RECLAIM OLD DIRECTORY JRST TMDIR1 ;RE-READ DIRECTORY WITH LARGER BUFFER TMDIR4: MOVE J,T4 ;IOWD POINTER TO DIRECTORY BUFFER SETOM NXFCNT ;NO FILES FOUND YET SETOM .WXPRC## ;FORCE FULL FILE SPEC VERIFICATION ;RDH MOVEI M,[ASCIZ /TMPCOR directory ;RDH/] ;RDH PUSHJ P,LSTR ;OUTPUT HEADING ;RDH MOVEI M,[ASCIZ\Free: \] ;RDH PUSHJ P,LSTR ;PREFIX FREE COUNT ;RDH MOVEI T1,.TCRFS ;GET FREE COUNT ;RDH TMPCOR T1, ;FROM MONITOR ;RDH JRST E$$NTD ;IF POSSIBLE ;RDH PUSHJ P,LDEC ;AND TELL USER ;RDH PUSHJ P,LCRLF ;THEN END LINE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE TMDLP: AOBJP J,TMDON ;SEE IF DONE SKIPN T2,(J) ;SEE IF ENTRY NEXT JRST TMDLP ;NO--LOOP BACK HLLZM T2,FNAM ;SAVE NAME HRRZM T2,FSIZ ;SAVE FILE LENGTH SETZM FEXT ;CLEAR EXTENSION SETZM UFDPPN ;CLEAR DIRECTORY AOS .CTFLS## ;COUNT A FILE PRESENT AOS .CTFLF## ;AND ASSUME IT MATCHES PUSHJ P,.CHKTA## ;SEE IF IT MATCHES THE USER SPECIFICATION(S) JRST TMDLP ;FILE DOESN'T MATCH, LOOK FOR ANOTHER ONE ;COMPUTE CHECKSUM IF REQUESTED (WELL, WHY NOT?) SKIPG S.CHK ;/CHECKSUM? JRST TMDLP4 ;NO MOVE T1,FSIZ ;YES, GET WORD COUNT OF FILE PUSHJ P,GETCOR ;GET AN "I/O" BUFFER FOR THE DATA FILE MOVE P3,T1 ;SAVE ADDRESS OF BUFFER (.JBFF) MOVN T4,FSIZ ;NEGATIVE FILE LENGTH HRLZ T4,T4 ;IN THE LEFT HALF HRRI T4,-1(P3) ;IOWD TO TMPCOR DATA FILE BUFFER HLLZ T3,FNAM ;SET NAME OF THE TMPCOR FILE DESIRED MOVE T2,[.TCRRF,,T3] ;TMPCOR ARG POINTER TO TMPCOR T2, ;READ TMPCOR DATA FILE JRST E$$NTD ;ERROR??? SHOULDN'T HAPPEN HRLI T1,(POINT 36,) ;CONCOCT A 36-BIT BYTE POINTER MOVEM T1,BFHD+.BFPTR ;SET DATA RETRIEVER MOVE T1,FSIZ ;GET "BYTE" COUNT MOVEM T1,BFHD+.BFCTR ;SET DATA COUNT FIELD TLO F,L.FKEF ;SET FAKE "EOF" AT END OF CURRENT BUFFER MOVEM P3,.JBFF ;DEALLOCATE THE TMPCOR DATA FILE BUFFER ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE TMDLP4: SKIPLE S.TMPC ;/TMPCOR SWITCH (OLD TMPCOR LISTING FORMAT)? JRST TMDLP5 ;YES SETOM FFPRV ;FORCE BIZARRE PROTECTION PUSHJ P,ANALYZ ;GO HANDLE A "DATA FILE" LISTING JFCL ;HOHUM JRST TMDLP ;BACK FOR MORE FILES TMDLP5: MOVEI M,[ASCIZ /TMPCOR directory /] ;GET HEADER LINE AOSG NXFCNT ;IS THIS THE FIRST FILE? PUSHJ P,LSTR ;YES, PREFIX THE LISTING OUTPUT SKIPLE S.SUM ;SEE IF /SUM JRST TMDLP6 ;YES--SKIP OUTPUT MOVE T2,FNAM ;GET NAME MOVEI T3,4 ;OUTPUT 4 CHARS PUSHJ P,LSIXC ; (3 FOR NAME AND ONE SPACE) TMDLP6: MOVE T1,FSIZ ;GET FILE LENGTH ADDM T1,NOBLKS ;COUNT IN TOTAL BLOCKS (REALLY WORDS) SKIPLE S.SUM ;SEE IF /SUM JRST TMDLP ;YES--LOOP ON PUSHJ P,LDEC4 ;OUTPUT LENGTH SKIPG S.CHK ;/CHECKSUM? JRST TMDLP8 ;NO PUSHJ P,LSPC2 ;YES, SPACE OVER SETZM CHKSUM ;INITIALIZE CHECKSUM PUSHJ P,NEXDCW ;CALCULATE PUSHJ P,LCHECK ;AND LIST THE CHECKSUM TOO TMDLP8: PUSHJ P,LCRLF ;END THE LINE JRST TMDLP ;AND LOOP BACK TMDON: MOVEM P2,.JBFF ;DEALLOCATE THE DIRECTORY BUFFER PUSHJ P,DIRET ;OUTPUT ANY TOTAL AND/OR SUMMARY JRST .POPJ1## ;RETURN HAPPILY ;ERRORS N$FAIL (NTD,TMPCOR not supported in this monitor) SUBTTL DIRECTORY LISTING - FIND FORMAT FNDIR: ;NOW HANDLE /FNDDAT (IF ANY) SKIPN F.BLK+.FXDEV ;DO WE HAVE A FILE SPEC (A LA /FNDDAT:FILE)? SKIPE F.BLK+.FXNAM ; ( . . .) JRST FNDIR1 ;YES, USE IT SKIPN F.BLK+.FXEXT ; ( . . .) SKIPE F.BLK+.FXDIR ; ( . . .) JRST FNDIR1 ;YES, USE IT SETO T2, ;NON-WILD MASK MOVSI T1,'SYS' ;DEFAULT SCAN BLOCK - DEVICE SYS: DMOVEM T1,F.BLK+.FXDEV ;SET IN FILE SPEC BLOCK MOVE T1,['FNDDAT'] ;DEFAULT FILENAME DMOVEM T1,F.BLK+.FXNAM ;SET IN FILE SPEC BLOCK MOVE T1,['FDF',,-1] ;DEFAULT EXTENSION (NO WILDCARDS) MOVEM T1,F.BLK+.FXEXT ;SET IN FILE SPEC BLOCK FNDIR1: SETO T2, ;FULL NON-WILD MASK MOVSI T1,'DSK' ;DEFAULT DEVICE SKIPN F.BLK+.FXDEV ;USER GIVE A DEVICE? DMOVEM T1,F.BLK+.FXDEV ;NO, HE HAS ONE NOW MOVE T1,['FNDDAT'] ;DEFAULT NAME SKIPN F.BLK+.FXNAM ;USER GIVE A FILE NAME? DMOVEM T1,F.BLK+.FXNAM ;NO, HE HAS ONE NOW HRLOI T1,'FDF' ;DEFAULT EXTENSION SKIPN F.BLK+.FXEXT ;USER SUPPLY AN EXTENSION? MOVEM T2,F.BLK+.FXEXT ;NO, USE OUR DEFAULT ;WE UNCONDITIONALLY OVER-RIDE THE EXTENSION ;ANYWAY, BUT IF USER TYPES .* WE STILL WANT ;TO ISSUE ERROR MESSAGE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE FNDIR4: MOVE T1,[6,,[VERWRD ;PROTOCOL VERSION I.NXRD,,I.NXZR ;POINTER TO FIRST,,LAST FSB FOBLK+.FOIOS,,LBLOCK ;OPEN,,LOOKUP BLOCK ADDRESS .FXLEN,,LN$RIB+1 ;LENGTH OF FSB,,LOOKUP FW.IFX + I ;IMMEDIATE FILE EXIT WLDEOD ]] ;END OF DIRECTORY PUSHJ P,.LKWLD## ;SETUP WILD (.CHKTA) PARAMETERS AOJA T1,FNDIR5 ;EXPECTED RETURN N$FAIL (LFS,LKWLD skip-returned to FNDIR - internal error) FNDIR5: JUMPE T1,FNDIR8 ;IF T1 = -1 THEN ALL DONE AOJE T1,FNDIR6 ;IF T1 = -2 THEN WE HAVE FILES TO DO N$FAIL (LFU,LKWLD returned unknown reason to FNDIR - internal error) FNDIR6: MOVE P4,T2 ;POSITION ADDRESS OF RETURNED MATCHING FSB SOS .CTFLS## ;BACKOFF WILD'S "FILES SEEN" FLAG SOS .CTFLF## ;BACKOFF WILD'S "FILES FOUND" FLAG PUSHJ P,FNDIN ;INITIALIZE INPUT FIND FILES SETZ J, ;START AT THE BEGINING PUSHJ P,FNLOP ;LOOK FOR FILES THAT MATCH JRST FNDIR4 ;BACK FOR MORE FILE SPECS ;HERE WHEN ALL DONE FNDIR8: PUSH P,[-1] ;SETUP STACK FOR DIRED/DIRDON JRST DIREDF ;HANDLE ANY END OF DIRECTORY STUFF ;LOOP OVER POINTER FILE LOOKING FOR A FILENAME/TYPE MATCH (WITHOUT WHICH ;WE KNOW IT IS USELESS TO CALL .CHKTA). ; ;CALL WITH P4 CONTAINING THE ADDRESS OF THE "MASTER" FILE SPEC BLOCK TO ;BE USED FOR POTENTIAL FILE MATCHES FNLOP: PUSHJ P,PFGET ;WORD 00 - FILENAME MOVE P1,T1 ;SAVE IT FOR LOOP PUSHJ P,PFGET ;WORD 01 - FILETYPE HLLZ P2,T1 ;SAVE IT FOR LOOP TLZE F,L.FEOF ;REACHED END OF FILE ANYWHERE? POPJ P, ;YES, CAN DO NO MORE HERE AOS .CTFLS## ;NOTE A FILE HAS BEEN SEEN ;NOW SEE IF THE CURRENT FILE HAS ANY CHANCE OF MATCHING FNLOP6: XOR P1,.FXNAM(P4) ;GET DIFFERENCE IN NAME XOR P2,.FXEXT(P4) ;AND TYPE FIELDS TDNN P1,.FXNMM(P4) ;FILE NAME DIFFER IN NON-WILD BITS? TLNE P2,(P2) ;FILE TYPE DIFFER IN NON-WILD BITS? AOJA J,FNLOP ;YES, CAN'T POSSIBLY MATCH ;FILENAME AND TYPE MIGHT MATCH, MUST CALL .CHKTA TO VERIFY TIMES ETC. PUSHJ P,FNDOR ;GO DO THE GRUNDGE WORK JFCL ;HOHUM AOJA J,FNLOP ;LOOK FOR MORE FILES ;SETUP ONE FILE BLOCK FROM THE FIND DATA FILE INPUT FNDOR: MOVE T1,J ;ENTRY NUMBER IN DATA FILES IMULI T1,20 ;DATA FILE IS 16 DECIMAL WORDS PER ENTRY IDIVI T1,200 ;DSK BLOCK IS 128 DECIMAL WORDS PER UUO CAME T1,DGBLK ;HAVE WE ALREADY USETI'ED HERE? JRST FNDOR1 ;NO, NEED AN IN UUO SUB T2,DGWRD ;YES, SEE HOW MUCH FURTHER INTO BLOCK JRST FNDOR2 ;AND POSITION THERE FNDOR1: USETI DG,1(T1) ;POSITION MONITOR FOR NEXT IN SUBI T1,1 ;(DFGET WILL AOS ON THE FORCED IN) MOVEM T1,DGBLK ;REMEMBER WHERE WE ARE IN DATA FILE SETZM DGWRD ;START OF A NEW BLOCK SETZM B.DG+.BFCTR ;MAKE SURE WE DO AN IN UUO PUSHJ P,DFGET ;GET A WORD (FORCE IN UUO, REPLETE WITH ERROR ; HANDLING AND ALL THOSE NICETIES) JUMPE T2,FNDOR4 ;IF POSITIONED, ENTER FILE READING CODE SUBI T2,1 ;ALLOW FOR WORD JUST READ FNDOR2: ADDM T2,DGWRD ;POSITION WITHIN BLOCK ADDM T2,B.DG+.BFPTR ;POINT TO PROPER WORD WITHIN DATA BLOCK MOVN T2,T2 ;(NO SUB TO MEMORY) ADDM T2,B.DG+.BFCTR ;ADVANCE COUNTER ACCORDINGLY ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;EXTRACT AND BUILD A FILE BLOCK FROM THE DATA FILE PUSHJ P,DFGET ;WORD 00 - IGNORED (NODE NAME, RESERVED) FNDOR4: PUSHJ P,DFGET ;WORD 01 - DEVICE/STRUCTURE MOVEM T1,FOBLK+.FODEV ;SET FOR ANALYZ MOVEI T4,F.PTH ;PATH BLOCK MOVEM T4,UFDPPN ;SET FOR ANALYZ HRLI T4,-6 ;SET TO BUILD DIRECTORY, FIVE SFD'S ; (.FXLND NOTWITHSTANDING) FNDOR6: PUSHJ P,DFGET ;WORD 02/07 - DIRECTORY MOVEM T1,.PTPPN(T4) ;STORE AWAY IN PATH BLOCK AOBJN T4,FNDOR6 ;LOOP FOR UFD AND FIVE SFD'S PUSHJ P,DFGET ;WORD 10 - FILE NAME MOVEM T1,FNAM ;STORE FOR ANALYZ PUSHJ P,DFGET ;WORD 11 - EXTENSION,,PROTECTION HLLZM T1,FEXT ;STORE EXTENSION FOR ANALYZ HRLZM T1,FPRV ;SET PROTECTION AND I/O MODE FOR ANALZY PUSHJ P,DFGET ;WORD 12 - FILE LENGTH MOVEM T1,FSIZ ;SET IN FILE BLOCK PUSHJ P,DFGET ;WORD 13 - CREATION DATE/TIME PUSHJ P,.CNTDT## ;SPLIT IT UP INTO DATE AND TIME DPB T2,[POINTR FCRE,RB.CRD] ;STORE MOST OF CREATION DATE LDB T2,[POINT 3,T2,23] ;POSITION AND DPB T2,[POINTR FCRX,RB.CRX] ;STORE REST OF CREATION DATE IDIVI T1,^D60*^D1000 ;CONVERT MILLISECONDS TO MINUTES DPB T1,[POINTR FCRE,RB.CRT] ;STORE CREATION TIME PUSHJ P,DFGET ;WORD 14 - ACCESS DATE/TIME PUSHJ P,.CNTDT## ;CONVERT TO DATE AND TIME DPB T2,[POINTR FACD,RB.ACD] ;STORE ACCESS DATE ; (NO ACCESS TIME AVAILABLE) PUSHJ P,DFGET ;WORD 15 - VERSION MOVEM T1,FVER ;STORE IN FILE BLOCK PUSHJ P,DFGET ;WORD 16 - IGNORED PUSHJ P,DFGET ;WORD 17 - CHECKSUM MOVEM T1,CHKSUM ;STORE FOR ANALYZ AOS .CTFLF## ;ASSUME FILE IS FOUND (.CHKTA WILL DECREMENT ; THIS IF IT REJECTS THE FILE) PUSHJ P,.CHKTA## ;SEE IF THIS FILE MATCHES POPJ P, ;NO - FILE REJECTED PUSHJ P,ANALYZ ;PRINT DIRECTORY LISTING JFCL ;HOHUM JRST .POPJ1## ;FILE PRINTED SUBTTL ROUTINE FOR DISK AND MAGTAPE DIRECTORY LINE ;SUBROUTINE TO ANALYZE AND PRINT FROM AN EXTENDED LOOKUP ;BLOCK AND READ THE FILE IF NECESSARY ; SKIPS IF MATCHES, NON-SKIP IF TOO OLD OR TOO YOUNG ANALYZ: AOS (P) ;WIN--GIVE OK RETURN PUSHJ P,.SAVE1 ;SAVE P1 MOVEI P1,0 ;NO SPECIAL OFFSET SKIPLE S.FIND ;/FIND? JRST GOTSTR ;YES, ALREADY HAVE CHECKSUM AND STRUCTURE SETZM CHKSUM ;CLEAR CHECKSUM ACCUMULATOR SKIPLE S.FBLD ;/FNDBLD? JRST GOTSTR ;YES, SKIP THIS JUNK THEN SKIPLE S.UNIT ;SEE IF USER REQUESTED UNITS SKIPN T1,FDEV ;YES--SEE IF FILSER TOLD US JRST GOTSTR ;NO--DON'T CHANGE SKIPN S.UNIT ;YES--SEE IF /NOUNITS SKIPE .WLDFL## ;AND NO STR WILDCARD JRST NEWSTR ;NO--OK MOVEM T1,DCHBLK ;YES--SETUP FOR DSKCHR SETZM DCHBLK+.DCSNM ;CLEAR ANSWER MOVE T1,[.DCSNM+1,,DCHBLK] ;POINT TO BLOCK DSKCHR T1, ;ASK MONITOR STR NAME JRST GOTSTR ;NICE TRY SKIPE T1,DCHBLK+.DCSNM;GET STR NAME NEWSTR: MOVEM T1,FSTR ;YES--UPDATE INFO TO PRINT GOTSTR: PUSHJ P,SSTRDR ;SET STATUS AND TYPE SUMMARY AOS SNFILF ;COUNT FILE FOUND SKIPG S.SUM ;SEE IF /SUM TRNN F,R.FAST ;NO SEE IF /F JRST GETLEN ;NO--ANALYZE SKIPLE S.FIND ;/FIND? JRST GETLEN ;YES, SETUP LENGTHS SKIPGE S.ACCS ;ACCESS REQUIRED? JRST VERNON ;NO--NO ANALYSIS ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE GETLEN: MOVE T1,FSIZ ;GET LENGTH SKIPE FALC ;SEE IF FILE ALLOCATED SKIPG S.ALC ;YES--SEE IF USER PREFERS THAT JRST NOTALC ;NO--USE COMPUTED LENGTH MOVE T1,FALC ;YES--PICK UP ALLOCATED LENGTH ASH T1,7 ;CONVERT TO WORD COUNT NOTALC: SKIPG S.DTL ;IF /DETAIL, DON'T CLOBBER INFO MOVEM T1,FSIZ ;STORE AWAY FOR PRINTING MOVE T2,T1 ;SAVE WORD COUNT ADDI T1,177 ;AND GENERATE THE LSH T1,-7 ;CORRESPONDING BLOCK COUNT SKIPG S.SUM ;SEE IF /SUM TRNN F,R.FAST ;IF NOT, DON'T ACCUMULATE IF /F CAIA ;ACCUMULATE TOTALS JRST NOTAL2 ;DON'T ACCUMULATE TOTALS ADDM T1,SNBLKS ;ACCUMULATE BLOCK COUNT ADDM T2,SNWRDS ;AS WELL AS WORD COUNT NOTAL2: SKIPLE S.FIND ;/FIND? JRST FILEND ;YES, NO /ACCESS, ALREADY HAVE VERSION CAMG T1,S.ACCS ;SEE IF SHORT ENOUGH TO ACCESS TRO F,R.ACCS ;YES--SET FLAG SKIPG S.FBLD ;/FNDBLD? TRNN F,R.FAST ;In fast mode? JRST VERGET ;No, go ahead and grunge SKIPG S.SUM ;Summing? JRST VERNON ;No, avoid all this work ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE VERGET: SETZM FRVER ;CLEAR RIB VERSION FOR /DET SKIPE T1,FVER ;SEE IF FILE HAS A VERSION ALREADY SKIPLE S.DTL ;YES--SEE IF /DETAIL JRST .+2 ;NO VERSION OR /DET JRST VERNON ;YES--SKIP READING MOVEM T1,FRVER ;SAVE RIB VERSION FOR /DETAIL HLRZ T1,FEXT ;SEE IF VERSION SEARCH USEFUL CAIN T1,'EXE' ; JRST VEREXE ;YES--HANDLE .EXE CAIE T1,'HGH' CAIN T1,'SHR' JRST VERHGH ;YES--HIGH SEGMENT VARIETY CAIE T1,'SAV' CAIN T1,'LOW' JRST VERLOW ;YES--LOW SEGMENT VARIETY CAIE T1,'SVE' JRST VERNON ;NO--FORGET THE IDEA VERLOW: PUSHJ P,NEXDTW ;GET NEXT IOWD POINTER JRST VERNOF ;GIVE UP IF EOF JUMPE T1,VERNOF ;GIVE UP IF JUNK SKIPA T2,T1 ;SAVE IT VERLO1: AOBJP T2,VERLOW ;IF ALL USED UP, LOOP BACK FOR ANOTHER PUSHJ P,NEXDTW ;GET A DATA WORD JRST VERNOF ;GIVE UP IF EOF HRRZ T3,T2 ;LOOK AT CURRENT ADDRESS CAIGE T3,.JBVER-1 ; (NOTE-T3 IS ADDR-1) JRST VERLO1 ;NOT THERE YET SO LOOP BACK FOR MORE CAIN T3,.JBVER-1 ;MAKE SURE NOT TOO FAR JRST VERGOT ;A WINNER--GO SAVE IT JRST VERNON ;AND PROCEED VERHGH: MOVEI T2,.JBHVR ;GUESS HOW FAR TO READ VERHG1: PUSHJ P,NEXDTW ;GET NEXT WORD JRST VERNOF ;GIVE UP IF EOF SOJGE T2,VERHG1 ;COUNT AND LOOP UNTIL THERE JRST VERGOT ;GO FINISH WITH RESULT ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE VEREXE: MOVEI T3,0 ;CLEAR PROGRESS COUNT VERE.1: PUSHJ P,NEXDTW ;GET BLOCK TYPE OF HEADER JRST VERNOF ;NONE IF EOF JUMPE T1,VERNON ;IF BLOCK HEADER=0, SKIP READING FURTHER AOS T3 ;COUNT WORD HLRZ T2,T1 ;GET BLOCK TYPE CAIN T2,1776 ;SEE IF EXE DIRECTORY JRST VERE.3 ;YES--GO LOOKUP PAGE 0 CAIL T2,1776 ;IF NOT VALID TYPE, JRST VERNON ; EXIT WITHOUT VERSION HRRZ T2,T1 ;OK--GET BLOCK SIZE VERE.2: SOJLE T1,VERE.1 ;(ALLOW FOR FIRST WORD) PUSHJ P,NEXDTW ;SKIP THIS BLOCK JRST VERNOF ;GIVE UP IF EOF AOS T3 ;COUNT PROGRESS JRST VERE.2 ;LOOP VERE.3: HRRZ T4,T1 ;DIRECTORY--GET SIZE LSH T4,-1 ;GET COUNT OF BIWORDS VERE.4: SOJL T4,VERNON ;GIVE UP IF NOT IN DIRECTORY PUSHJ P,NEXDTW ;GET FIRST WORD OF PAIR JRST VERNOF ;GIVE UP IF END MOVE T2,T1 ;SAVE FOR A MINUTE PUSHJ P,NEXDTW ;GET SECOND WORD OF PAIR JRST VERNOF ;GIVE UP ADDI T3,2 ;COUNT PROGRESS TRNE T1,-1 ;SEE IF PAGE 0 JRST VERE.4 ;NO--LOOP OVER DIRECTORY HRRZ T4,T2 ;GET POSITION IN FILE LSH T4,^D9 ;CONVERT TO WORDS SUB T4,T3 ;ALLOW FOR CURRENT POSITION JUMPLE T4,VERNON ;ERROR IF BEHIND US ADDI T4,.JBVER ;SET TO VERSION LOCATION VERE.5: PUSHJ P,NEXDTW ;ADVANCE TO WORD JRST VERNOF ;GIVE UP IF END SOJGE T4,VERE.5 ;(@ VERE.5 + 2L) READ TO .JBVER ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE VERGOT: SKIPE T1 ;SEE IF WE GOT SOMETHING MOVEM T1,FVER ;GOT IT! SO SAVE IT VERNON: SKIPG S.CHK ;CHECKSUM NEEDED? JRST VERNOA ;NO, CHECK FOR /ACCESS VERCHK: PUSHJ P,NEXDCW ;YES - READ REST OF BLOCK JRST VERNOF ;[464] DONE IF EOF JRST VERCHK ;KEEP GOING TO EOF VERNOA: TRNE F,R.ACCS ;/ACCESS? PUSHJ P,NEXDTW ;YES, MUST READ FILE THEN JFCL ;(ONE IN UUO IS SUFFICIENT) VERNOF: TLNN F,L.SVST!L.BKSS!L.FRSS ;[464] SEE IF MAG TAPE JRST FILCLS ;[464] NO, CLOSE OFF DATA FILE THEN VERNOM: PUSHJ P,NEXDTW ;[464] READ A FILE DATA WORD JRST FILEND ;[464] AT EOF, TIME TO LIST FILE SETZM BFHD+.BFCTR ;[464] TOSS REST OF RECORD JRST VERNOM ;[464] GO 'TILL EOF FILCLS: TRZN F,R.ACCS ;SEE IF ACCESS NEEDED JRST FILNOA ;NO--CLOSE WITHOUT IT CLOSE DC,CL.DAT ;CLOSE AND INDICATE ACCESSED JRST FLIST ;AND CONTINUE BELOW FILNOA: CLOSE DC,CL.ACS!CL.DAT;DON'T UPDATE ACCESS DATES FILEND: ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;HERE WHEN IT IS TIME TO OUTPUT ONE LINE OF THE DIRECTORY FLIST: SKIPLE S.FBLD ;/FNDBLD? PUSHJ P,DOFND ;WRITE FILE INTO FIND FILES SKIPN S.DIRE ;/NODIRECT? POPJ P, ;YES, DONE WITH THIS FILE TRNN F,R.NDSK ;IF NOT A DISK (E.G., DECTAPE) SKIPG S.DTL ;A DISK, /DETAIL? CAIA ;NOT A DISK, OR NOT /DETAIL JRST DLIST ;DISK/DETAIL, GO ISSUE DETAILED LISTING SKIPLE S.SUM ;SEE IF SUMMARY MODE TRNE F,R.FAST ;YES--CHECK /F JRST .+2 ;YES--GIVE OUTPUT POPJ P, ;NO--SKIP LISTING TLZN F,L.SBTT ;DID WE JUST OUTPUT TOTALS LINE? JRST FLIST2 ;NO TLZ F,L.CRLF ;YES WE DID PUSHJ P,LCRLF ;SO GIVE A BLANK LINE FOR NEATNESS FLIST2: SKIPLE S.IND ;[443] /INDIRECT ? JRST FLNAM ;NO SKIP WIDTH TEST MOVE T1,NOCHRS ;GET NUMBER OF CHARACTERS ON THE LINE ADDI T1,7 ;ADD A POSSIBLE TAB. TRZ T1,7 ;AND ROUND IT OFF ADD T1,S.LENT ;ADD THE LENGTH OF AN ENTRY. TRNE F,R.FAST ;[476] /FAST MODE? JRST FLIST5 ;[476] YES, VERSION AND SPOOL NEVER PRINT SKIPE S.PRVE ;[443] PRINTING VERSIONS??? SKIPN FVER ;[443] YES, PRINT VERSIONS, BUT IS THERE ANY SKIPA ;[443] NO, NO VERSIONS & THERE IS NONE ADDI T1,^D16 ;[443] YES, THERE ARE VERSIONS, SO PRINT THEM SKIPE FSPL ;[443] ANY SPOOLED NAMES???? ADDI T1,^D10 ;[443] YES THERE IS, SO ALLOW 10(dec) FOR IT FLIST5: CAMLE T1,S.WDTH ;[476] IF LESS THAN THEN WE CAN GO AHEAD PUSHJ P,LCRLF ;ELSE PRINT THE LINE UP TO NOW. FLNAM: PUSHJ P,LSTFNM ;LIST FILE NAME PUSHJ P,LTBEXT ;SPACE OVER FLEXT: HLLZ T2,FEXT ;OUTPUT EXTENSION SKIPG S.IND ;/INDIRECT SPECIFIED? JRST FLEXT2 ;NO, NORMAL DIRECTORY LISTING PUSHJ P,LSIXN ;YES, LIST EXTENSION, NO BLANKS JRST FLSDIR ;AND GO DIRECTLY TO DIRECTORY OUTPUT FLEXT2: TRNN F,R.FAST ;SEE IF /F MODE JRST FLEXT3 ;NO--GO DO SLOW FORMAT MOVEI T3,3 ;IN CASE DOING /SORT PUSHJ P,LSIXC ;LIST IN 3 COLUMNS SKIPLE S.CHK ;SEE IF /CHECKSUM PUSHJ P,LSPC2 ;YES--SPACE OVER TO IT JRST FLCHEK ;AND END LINE FLEXT3: CAMN T2,['UFD '] ;SEE IF .UFD SKIPGE FNAM ;AND NUMERIC JRST FLEXT4 ;NO--PROCEED MOVE T1,FSIZ ;YES--SKIP EXT ADDI T1,177 ;ROUND UP TO BLOCK BOUNDRY LSH T1,-7 ;AND TRUNCATE TO BLOCK SIZE PUSHJ P,LDEC4 ;LIST LENGTH JRST FLEXT8 ;AND PROCEED FLEXT4: MOVEI T3,3 ;AS THREE CHARACTERS PUSHJ P,LSIXC PUSHJ P,LSPC ;POSITION FOR LENGTH MOVE T1,FSIZ ;GET FILE LENGTH TRNE F,R.WORD ;/WORDS? JRST FLEXT7 ;YES - PRINT DIRECTLY ADDI T1,177 ;NO - ROUND UP TO NEXT BLOCK LSH T1,-7 ;CONVERT TO BLOCKS PUSHJ P,LDEC5 ;SPACE 5 PLACES ONLY JRST FLEXT8 ;CONTINUE FLEXT7: PUSHJ P,LDEC9 ;DO THE SPACING TO 9 PLACES ;AND FALL INTO FLEXT8 FLEXT8: MOVEI M,[ASCIZ / /] PUSHJ P,LSTR FLCHEK: SKIPG S.CHK ;SEE IF CHECKSUM JRST FCHKN ;NO--SKIP OUTPUT PUSHJ P,LCHECK ;LIST CHECKSUM PUSHJ P,LSPC2 ;AND SPACE OVER ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE FCHKN: TRNN F,R.SLOW ;SEE IF IN SLOW MODE JRST FCRED ;NO--SKIP ACCESS DATE LDB T4,[POINTR (FACD,RB.ACD)] ; PUSHJ P,LDATE ;OUTPUT ACCESS DATE PUSHJ P,LTAB LDB T4,[POINTR (FCRE,RB.CRT)] ; PUSHJ P,LTIMEB ;OUTPUT CREATION TIME PUSHJ P,LTAB FCRED: TRNE F,R.FAST ;SEE IF /FAST JRST FLSDIR ;YES--SKIP ON LDB T4,[POINTR (FCRE,RB.CRD)] ; LDB T3,[POINTR (FCRX,RB.CRX)] ;GET EXTENSION DPB T3,[POINT 3,T4,23] ;ADD INTO RESULT PUSHJ P,LDATE ;OUTPUT CREATION DATE TRNN F,R.SLOW ;SEE IF IN SLOW MODE JRST FLVER ;NO--SKIP FILE MODE PUSHJ P,LSPC2 LDB T1,[POINTR (FMOD,RB.MOD)] ; PUSHJ P,LOCT2 ;OUTPUT FILE MODE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE FLVER: SKIPN S.PRVE ;/NOPRVERSION? JRST FLACCT ;YES, SKIP ONWARDS MOVE T4,FVER ;OUTPUT FILE VERSION TLNN F,L.FRMT ;FORCE OUTPUT IF FORMATTING SKIPLE S.PRVE ;OR IF /PRVERSION JRST FLVER2 ;(ONE OF THE ABOVE) JUMPN T4,FLVER2 ;IF NON-ZERO VERSION THEN PRINT IT TRNN F,R.SLOW ;IF SLOW (LONG) PRINTING SKIPLE S.FIND ;OR IF /FIND OUTPUT PUSHJ P,LTAB ;PRESERVE COLUMN-NESS OF OUTPUT JRST FLACCT ;GO CHECK ACCOUNT STRING FLVER2: PUSHJ P,LTAB MOVE P1,NOCHRS ;GET POSITION ADDI P1,7 ;ALLOW FOR DELAYED TABBING TRZ P1,7 ;TAB OVER MOVNS P1 ;PREPARE TO SUBTRACT PUSHJ P,LVER ADD P1,NOCHRS ;GET DISTANCE MOVED BY VERSION TLNN F,L.FRMT ;IF NICE OUTPUT FORMAT SKIPLE S.PRVE ;OR IF /PRVERSION SKIPA ;(ONE OF THE ABOVE) JRST FLACCT ;NO - SKIP FORMATTING STUFF CAIG P1,7 ;AND LESS THAN ONE TAB PUSHJ P,LTAB ;YES--MOVE ANOTHER TAB SKIPG S.SORT ;/SORT'ING ? JRST FLS335 ;[446] NO - GO AFFECT TAB PLACEMENT FLS446: PUSHJ P,LSPC ;[446] MOVE (AT LEAST) ONE SPACE MOVE P1,NOCHRS ;[446] GET COLUMN COUNT TRC P1,7 ;[446] WE ONLY CARE ABOUT CHARS AFTER LAST TAB TRNE P1,7 ;[446] IS IT 7? JRST FLS446 ;[446] NO - GO PLACE ANOTHER SPACE JRST FLACCT ;YES - MOVE ON FLS335: PUSHJ P,LSPC ;MOVE (AT LEAST) ONE SPACE MOVE P1,NOCHRS ;GET COLUMN (CHARACTER) COUNT TRNE P1,4 ;1.5 TAB COLUMNS YET? JRST FL335A ;YES - NO MORE SPACING TRNE P1,3 ;1.5 TAB COLUMNS OVER????? JRST FLS335 ;NOT YET - KEEP SPACING FL335A: TRO F,R.STAB ;AND FLAG SUPPRESS NEXT TAB ;AS ALREADY PROPERLY POSITIONED. ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE FLACCT: SKIPG S.ACCT ;SEE IF /ACCOUNT JRST FNVER ;NO PUSHJ P,LTAB ;POSITION MOVEI M,FACT PUSHJ P,LSTR TLNN F,L.FRMT ;ARE WE FORMATTING OUTPUT? JRST FNVER ;NO MOVEI P1,^D103 ;BRING OUT TO COLUMN 103 FLACC1: CAMG P1,NOCHRS ;[445] ARE WE THERE YET? JRST FNVER PUSHJ P,LSPC JRST FLACC1 FNVER: SKIPG S.AUT ;SEE IF /AUTHOR JRST FLSDIR ;NO--JUST GO DO DIRECTORY SKIPE T2,UFDPPN ;GET FILE'S OWNER TLNE T2,-1 ;SEE IF SFD SKIPA ;NO MOVE T2,.PTPPN(T2) ;YES--GET OWNER SKIPE T1,FAUT ;SEE IF AUTHOR XOR T1,T2 ;YES--COMPARE TO OWNER TLNN F,L.FRMT ;SEE IF NICE OUTPUT FORMAT JUMPE T1,FLSDIR ;NO--SEE IF SAME AS OWNER PUSHJ P,LTAB ;TAB OVER PUSHJ P,LAUT ;YES--GO LIST AUTHOR FLSDIR: TRZ F,R.STAB ;ONLY SUPRESS TAB IF IN AUTHOR SKIPN S.SORT ;UNLESS /SORT SKIPLE S.FLSD ;FIRST-LINE STR/DIR LISTING? PUSHJ P,LSTRDR ;YES - OUTPUT STR AND DIRECT. TRNN F,R.FAST ;SEE IF /F SKIPN T2,FSPL ;NO--SEE IF SPOOLED NAME JRST FDONE ;NO--SKIP OUTPUT PUSHJ P,LTAB ;YES--SPACE OVER PUSHJ P,LSIXN ;AND TYPE SPOOLED NAME FDONE: MOVE T1,NOCHRS ;SEE IF DONE WITH THIS LINE CAMG T1,MXWDTH ;SEE IF OVER REQUEST PJRST LTAB ;NO--GO ISSUE TAB PJRST LCRLF ;ROUTINE TO ISSUE DOT OR SPACE BEFORE EXTENSION LTBEXT: TRNE F,R.FAST ;SEE IF /F SKIPE S.WDTH ;YES--SEE IF NOT /WIDTH PJRST LTAB ;NO--ISSUE TAB SKIPE S.SORT ;SEE IF /SORT PJRST LTAB ;YES, THEN NO . LDOT: MOVEI C,"." ;[464] YES--USE DOT (IT'S FASTER) PJRST LCHR ; AND RETURN ;HERE TO OUTPUT A DETAILED DIRECTORY LISTING DEFINE MSG(A),< MOVEI M,[ASCIZ \ A: \] PUSHJ P,LSTR > DEFINE MSGT(A),< MOVEI M,[ASCIZ \ A\] PUSHJ P,LSTR > DLIST: PUSHJ P,.SAVE4## ;SAVE ALL JUST IN CASE TLZN F,L.SBTT ;DID WE JUST ISSUE SUBTOTALS LINE? JRST DLIST2 ;NO TLZ F,L.CRLF ;YES WE DID PUSHJ P,LCRLF ;SO GIVE A BLANK LINE FOR NEATNESS DLIST2: SKIPE T2,FDEV ;GET UNIT SKIPN S.UNIT ;IF /NOUNITS SKIPE T2,FSTR ; OR IF UNIT NOT AVAILABLE, USE STR PUSHJ P,LSIXCL ;LIST IN SIXBIT WITH COLON HLRZ T1,FEXT ;GET EXTENSION CAIN T1,'UFD' ;SEE IF UFD SKIPGE T4,FNAM ;AND NOT ALPHA JRST DLNAME ;NO--LIST AS ALPHA PUSHJ P,LXWD ;LIST AS XWD JRST DLEXT ;GO HANDLE EXTENSION DLNAME: MOVE T2,FNAM ;GET NAME PUSHJ P,LSIXN ;LIST IN SIXBIT DLEXT: MOVEI C,"." ;LIST PUSHJ P,LCHR ;PUNCTUATION HLLZ T2,FEXT ;GET EXTENSION PUSHJ P,LSIXN ;LIST IT MOVEI P1,0 ;CLEAR OFFSET POINTER PUSHJ P,FLBDIR ;LIST DIRECTORY WITH [] HRRZ T4,FACD ;GET ACCESS DATE ANDX T4,RB.ACD ;MASK DOWN JUMPE T4,DLCREA MSG PUSHJ P,LDATE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE DLCREA: MOVE T4,FCRE ;GET CREATION ANDX T4,RB.CRD!RB.CRT; TIME AND DATE ROT T4,- ;DATE AT HIGH END LDB T3,[POINTR (FCRX,RB.CRX)] ; GET DATE EXTENSION LSHC T3,WID(RB.CRD) ;GET DATE TOGETHER SKIPN T3 ; JUMPE T4,DLPROT MSG PUSH P,T3 ;SAVE DATE LSH T4,- ;POSITION TIME PUSHJ P,LTIME PUSHJ P,LSPC ;MAKE SOME ROOM POP P,T4 ;RESTORE DATE PUSHJ P,LDATE DLPROT: SKIPN T1,FFPRV ;SEE IF FORCING LDB T1,[POINTR (FPRV,RB.PRV)] JUMPL T1,DLMODE ;SKIP IF NO PROTECTION MSG PUSHJ P,LOCT3Z DLMODE: MSG LDB T1,[POINTR (FMOD,RB.MOD)] PUSHJ P,LOCT MOVE T1,FSTS ;RETRIEVE .RBSTS FLAGS TXNN T1,RP.DIR ;IS THIS A DATA OR DIRECTORY FILE? PUSHJ P,DLTYP ;DATA FILE, TYPE OUT .RBTYP/ETC. MOVE T1,FSIZ ;GET FILE LENGTH SKIPE RIBLEN ;SEE IF EXTENDED LOOKUP JRST DLSIZE ;YES--GO LIST LENGTH HLRE T1,T1 ;NO--GET LEVEL-C STYLE SKIPLE T1 ;SEE IF IN BLOCKS ASH T1,7 ;YES--MAKE INTO WORDS MOVM T1,T1 ;GET NUMBER OF WORDS DLSIZE: JUMPE T1,DLVERS MSG PUSHJ P,LDECP ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE DLVERS: SKIPN T4,FVER ;GET VERSION JRST DLVERR MSG PUSHJ P,LVER DLVERR: SKIPE T4,FRVER ;SEE IF RIB VERSION DIFFERENT CAMN T4,FVER ; FROM FILE VERSION JRST DLCHEK ;NO--PROCEED MSG PUSHJ P,LVER ;OUTPUT RIB VERSION NUMBER DLCHEK: SKIPG S.CHK ;SEE IF /CHECKSUM JRST DLSPOL ;NO--SKIP ON MSG PUSHJ P,LCHECK DLSPOL: SKIPN T2,FSPL ;GET SPOOLED FILE NAME JRST DLESTL MSG PUSHJ P,LSIXN DLESTL: SKIPN T1,FEST ;GET ESTIMATED LENGTH JRST DLALLB MSG PUSHJ P,LDECP DLALLB: SKIPN T1,FALC ;GET ALLOCATED LENGTH JRST DLALLP MSG PUSHJ P,LDECP DLALLP: SKIPN T1,FPOS ;GET POSITION ALLOCATED JRST DLUFWR MSG PUSHJ P,LDECP ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE DLUFWR: SKIPN T1,FUFW ;GET UNITS FILE WAS WRITTEN ON JRST DLNCAR MSGT ;[502] LDB T1,[POINTR (FUFW,RB.UNI)] ;GET UNITS JUMPE T1,DLUFW3 ;ARE THERE ANY? MOVEI M,[ASCIZ / on unit(s) /] ;[502] YES PUSHJ P,LSTR LDB T1,[POINTR (FUFW,RB.UNI)] ;MAKE SURE WE HAVE THE UNITS MOVEI T2,0 ;CLEAR ALL BITS MOVEI T3,1 ;SET UP FIRST BIT TO BE TESTED MOVSI T4,400000 DLUFW1: TDZE T1,T3 ;IS THIS BIT SET? TDO T2,T4 ;YES, RECORD IT LSH T3,1 ;LOOK AT NEXT BITS LSH T4,-1 JUMPN T1,DLUFW1 ;HAVE WE REVERSED ALL THE BITS? MOVE P2,T2 ;YES, NOW SAVE UNITS SETO P4, ;CONTAINS UNIT NUMBER DLUFW2: JFFO P2,.+1 ;GET FIRST UNIT NUMBER ADDI P4,1(P3) ;SAVE THE UNIT NUMBER MOVE T1,P4 ;SET UP FOR PRINTING PUSHJ P,LOCT LSH P2,1(P3) ;GET RID OF THE BIT JUMPE P2,DLUFW3 ;ARE WE DONE? PUSHJ P,LCOMMA ;NO, PRINT COMMA-SPACE PUSHJ P,LSPC JRST DLUFW2 ;GO GET THE NEXT UNIT NUMBER DLUFW3: MOVEI M,[ASCIZ / on controller /] ;[502] YES PUSHJ P,LSTR LDB T1,[POINTR (FUFW,RB.CON)] ;MAKE SURE WE HAVE IT PUSHJ P,LOCT DLUFW4: LDB T1,[POINTR (FUFW,RB.APR)] ;GET APR SERIAL NUMBER JUMPE T1,DLNCAR ;ARE WE FINISHED? MOVEI M,[ASCIZ / on CPU /] ;NO PUSHJ P,LSTR LDB T1,[POINTR (FUFW,RB.APR)] PUSHJ P,LDEC DLNCAR: SKIPN T1,FNCA ;GET CUST ARG JRST DLMTAP MSG PUSHJ P,LOCT ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE DLMTAP: SKIPN T2,FMTA ;GET DISK BACKUP TAPE JRST DLSTAT MSG PUSHJ P,LSIXN DLSTAT: MOVE T1,FSTS ;GET STATUS BITS HLRZ T2,FEXT ;SEE WHAT KIND OF FILE CAIE T2,'UFD' ;IF KNOWN DIRECTORY, CAIN T2,'SFD' ; .. TXC T1, ;CORRECT STANDARD SETTINGS JUMPE T1,DLERRB MOVE T1,FSTS ;GET BACK STATUS MSG PUSHJ P,LOCT DLERRB: MOVE T1,FELB ;GET ERROR BLOCK IOR T1,FEUN ;INCLUDE ERROR UNIT AND COUNT JUMPE T1,DLQUTF MSG MOVE T1,FELB ;GET ERROR BLOCK TSZ T1,[770000] ;IGNORE VERSION AND ERROR BITS PUSHJ P,LDECP ;PRINT ERROR BLOCK MSG HLRZ T1,FELB ;GET VERSION, ERROR BITS LSH T1,^D-15 ;GET VERSION ALONE PUSHJ P,LOCT ;PRINT MONITOR VERSION MSG HLRZ T1,FELB ;GET VERSION, ERROR BITS LSH T1,^D-12 ;GET ERROR BITS TRZ T1,70 ;. . . PUSHJ P,LOCT ;PRINT ERROR BITS MSG HLRZ T1,FEUN ;GET ERROR UNIT PUSHJ P,LDECP MSG HRRZ T1,FEUN ;GET ERROR LENGTH IN BLOCKS PUSHJ P,LDECP ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE DLQUTF: MOVE T1,FSTS ;.RBSTS FLAGS TXNN T1,RP.DIR ;DATA OR DIRECTORY FILE? JRST DLAUTF ;DATA FILE, NO .RBQTA/ETC. MOVE T1,FQTF ;GET QUOTAS IOR T1,FQTO IOR T1,FQTR IOR T1,FUSD ;AND BLOCKS USED HLRZ T2,FEXT ;AND EXTENSION CAIE T2,'UFD' ;IF NOT UFD JUMPE T1,DLAUTH ;AND ZERO, SKIP ON MSG MOVE T1,FQTF ;GET FCFS QUOTA PUSHJ P,LDECP MSG MOVE T1,FQTO ;GET LOGGED OUT QUOTA PUSHJ P,LDECP SKIPN T1,FQTR ;GET RESERVED BLOCKS JRST DLUSED MSG PUSHJ P,LDECP DLUSED: MSG MOVE T1,FUSD PUSHJ P,LDECP DLAUTH: HLRZ T1,FEXT ;SEE IF CAIE T1,'UFD' ; DIRECTORY JRST DLAUTF ;NO--PROCEED MOVE T1,FNAM ;YES--AUTHOR IS NORMALLY UFD NAME JRST DLAUTC ;SO GO DO IT DLAUTF: SKIPN T1,UFDPPN ;GET OWNER OF FILE MOVE T1,.MYPPN## ;IF NONE, USE SELF TLNN T1,-1 ;SEE IF SFD POINTER MOVE T1,.PTPPN(T1) ;YES--GET UFD DLAUTC: SKIPE T4,FAUT ;GET AUTHOR CAMN T4,T1 ;SEE IF SAME AS OWNER JRST DLNXTS ;YES--PROCEED BELOW MSG JUMPL T4,DLAUAL ;IF ALPHA, GO BELOW PUSHJ P,LXWD JRST DLNXTS DLAUAL: MOVE T2,T4 PUSHJ P,LSIXN ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE DLNXTS: SKIPN T2,FNXT ;GET NEXT STR JRST DLPIDT MSG PUSHJ P,LSIXN DLPIDT: SKIPN T1,FIDT ;GET BACKUP INCREMENTAL DATE/TIME JRST DLPCAR MSG <"BACKUP" incremental date, time> PUSHJ P,.CNTDT## ;CONVERT TO EASY FORMAT PUSHJ P,LDATIM ;LIST DATE/TIME DLPCAR: SKIPN T1,FPCA ;GET PRIV CUST ARG JRST DLUFDB MSG PUSHJ P,LOCT DLUFDB: SKIPN T1,FUFD ;GET DIRECTORY POINTER JRST DLFLR MSG PUSHJ P,LDECP DLFLR: SKIPN T1,FFLR ;GET RELATIVE BLOCK IN FILE JRST DLXRA ;NONE--SKIP ON MSG PUSHJ P,LDECP DLXRA: SKIPN T1,FXRA ;GET POINTER TO NEXT RIB JRST DLTIM ;NONE--DO REST MSG PUSHJ P,LOCT ;LIST IN OCTAL DLTIM: SKIPN T1,FTIM ;GET INTERNAL CREATION TIME JRST DLRBLK ;NONE--PROCEED MSG PUSHJ P,.CNTDT## ;CONVERT TO EASY FORMAT PUSHJ P,LDATIM ;LIST DATE/TIME ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE DLRBLK: SKIPN T1,FRIBLK ;SEE IF BLOCK NUMBER KNOWN JRST DLLADT ;NO--PROCEED MSG PUSHJ P,LDECP ;YES--PRINT IN DECIMAL DLLADT: SKIPN T1,FLAD ;GET LAST ACCOUNTING DATE/TIME JRST DLDEDT ;THERE IS NONE MSG PUSHJ P,.CNTDT## ;CONVERT TO EASY FORMAT PUSHJ P,LDATIM ;LIST IT DLDEDT: SKIPN T1,FDED ;GET THE DIRECTORY EXPIRATION DATE JRST DLACCT ;THERE IS NONE MSG CAMN T1,[.INFIN] ;+ INFINITY? JRST [MOVEI M,[ASCIZ\ Eternity\] ;LABEL EXCEPTIONAL DATE/TIME PUSHJ P,LSTR ;LIST MNEMONIC (SORTA) STRING JRST DLACCT] ;AND BLUNDER EVER ONWARD PUSHJ P,.CNTDT## ;CONVERT TO EASY FORMAT PUSHJ P,LDATIM ;LIST IT DLACCT: SKIPN T1,FACT ;IS THERE AN ACCOUNT STRING? JRST DLXTRA ;NO MSG MOVEI M,FACT PUSHJ P,LSTR ;HERE WHEN ALL DONE, PRINT IN OCTAL ANY MORE THAT EXIST DLXTRA: MOVEI P1,.RBXTR ;POINT TO FIRST UNDEFINED AREA HRLI P1,.RBXTR-LN$RIB;AND COUNT OF ARGS DLXTRL: SKIPN LBLOCK(P1) ;GET NEXT WORD JRST DLXTRC MOVEI M,[ASCIZ / Unknown arg #/] PUSHJ P,LSTR MOVEI T1,(P1) ;GET POSITION PUSHJ P,LOCT MOVEI M,[ASCIZ /: /] PUSHJ P,LSTR MOVE T1,LBLOCK(P1) PUSHJ P,LOCT DLXTRC: AOBJN P1,DLXTRL ;LOOP UNTIL DONE PUSHJ P,LCRLF ;END LINE TLZ F,L.CRLF ;KLEAR KROCK FLAG PJRST LCRLF ;ISSUE BLANK LINE AND RETURN ;HELPER TO LIST THE MORE-COMPLEX .RBTYP/BSZ/RSZ/FFB FIELDS DLTYP: SKIPGE T4,FTYP ;GET .RBTYP FIELD .CREF RB.DEC ;CREF REFERENCE TO "DEC" FLAG JRST DLTY00 ;"DEC" FORMAT, LOTS OF FIELDS TO TAKE APART IOR T4,FBSZ ;ACCUMULATE .RBBSZ, IOR T4,FRSZ ; .RBRSZ, IOR T4,FFFB ; AND .RBFFB FIELDS JUMPE T4,.POPJ## ;IGNORE THEM IF THEY ARE ALL BLANK. ;HERE FOR NON-STANDARD (NON-DIGITAL-DEFINED) USAGE OF .RBTYP/ETC. MSGT MSG < .RBTYP> MOVE T4,FTYP ;.RBTYP CONTENTS PUSHJ P,L6XWD ;LIST IN XWD FORMAT MSG < .RBBSZ> MOVE T4,FBSZ ;.RBBSZ CONTENTS PUSHJ P,L6XWD ;LIST IN XWD FORMAT MSG < .RBRSZ> MOVE T4,FRSZ ;.RBRSZ CONTENTS PUSHJ P,L6XWD ;LIST IN XWD FORMAT MSG < .RBFFB> MOVE T4,FFFB ;.RBFFB CONTENTS PJRST L6XWD ;LIST IN XWD FORMAT ;HERE FOR RECOGNIZED FILE FORMATTING (RB.DEC SET IN .RBTYP WORD) DLTY00: MSGT TXZ T4,RB.DEC!RB.CRY!RB.DTY!RB.DTO!RB.DCC ;REDUCE TO JUST FLAGS JUMPE T4,DLTY20 ;SKIP IF NO FLAGS TXZN T4,RB.RMS ;RMS-10? JRST DLTY03 ;NO MSGT DLTY03: TXZN T4,RB.MCY ;MACY-11? JRST DLTY04 ;NO MSGT DLTY04: TXZN T4,RB.CTG ;CONTIGUOUS ALLOCATION IMPORTANT? JRST DLTY05 ;NO MSGT DLTY05: TXZN T4,RB.NSB ;NO-SPAN-BLOCKS? JRST DLTY06 ;NO MSGT DLTY06: JUMPE T4,DLTY20 ;ANYTHING LEFT OVER? MSG PUSHJ P,L6XWD ;TYPE OUT UNKNOWN STUFF IN XWD FORMAT DLTY20: LDB T1,[POINTR FTYP,RB.CRY] ;SEE IF ENCRYPTED JUMPE T1,DLTY22 ;NO MSGT PUSHJ P,LDECP ;LIST ALGORITHM IN DECIMAL DLTY22: MSG LDB T2,[POINTR FTYP,RB.DTY] ;EXTRACT FILE DATA TYPE MOVEI T4,DLTT22 ;DATA TYPE TABLE PUSHJ P,DLTYT ;LIST FILE DATA TYPE DLTY24: LDB T2,[POINTR FTYP,RB.DCC] ;DATA "CARRIAGE CONTROL" JUMPE T2,DLTY26 ;SKIP IF NONE MSG MOVEI T4,DLTT24 ;CARRIAGE-CONTROL TABLE PUSHJ P,DLTYT ;LIST CARRIAGE CONTROL DLTY26: LDB T2,[POINTR FTYP,RB.DTO] ;APPLICATION/OTS TYPE JUMPE T2,DLTY30 ;SKIP IF NONE MSG MOVEI T4,DLTT26 ;OTS TABLE PUSHJ P,DLTYT ;LIST "OTS" TYPE DLTY30: LDB T1,[POINTR FBSZ,RB.BSZ] ;LOGICAL DATA BYTE SIZE JUMPE T1,DLTY31 ;COMPLAIN IF NONE SET MSG PUSHJ P,LDECP ;LIST DECIMAL BYTE SIZE JRST DLTY32 ;CHECK FOR FRAME SIZE DLTY31: MSGT DLTY32: LDB T1,[POINTR FBSZ,RB.FSZ] ;PHYSICAL DATA FRAME SIZE JUMPE T1,DLTY40 ;SKIP IF NONE MSG PUSHJ P,LDECP ;LIST DECIMAL FRAME SIZE DLTY40: LDB T2,[POINTR FBSZ,RB.RFM] ;RECORD FORMAT JUMPE T2,DLTY42 ;SKIP IF NONE MSG MOVEI T4,DLTT40 ;RECORD FORMAT TABLE PUSHJ P,DLTYT ;LIST RECORD FORMAT DLTY42: LDB T1,[POINTR FBSZ,RB.HSZ] ;FIXED-HEADER SIZE JUMPE T1,DLTY44 ;SKIP IF NONE MSG PUSHJ P,LDECP ;LIST HEADER-LENGTH IN DECIMAL DLTY44: LDB T2,[POINTR FBSZ,RB.RFO] ;RECORD ORGANIZATION JUMPN T2,DLTY45 ;IF NONZERO THEN DEFINITELY PRINT IT LDB T1,[POINTR FBSZ,RB.RFM] ;RECORD FORMAT JUMPE T2,DLTY46 ;SKIP IF NONE DLTY45: MSG MOVEI T4,DLTT44 ;ORG TABLE PUSHJ P,DLTYT ;LIST RECORD ORGANIZATION DLTY46: LDB T1,[POINTR FRSZ,RB.RSZ] ;RECORD SIZE JUMPE T1,DLTY48 ;SKIP IF NONE MSG PUSHJ P,LDECP ;LIST IN DECIMAL DLTY48: LDB T1,[POINTR FRSZ,RB.BLS] ;BLOCK SIZE JUMPE T1,DLTY50 ;SKIP IF NONE MSG PUSHJ P,LDECP ;LIST IN DECIMAL DLTY50: LDB T1,[POINTR FFFB,RB.FFB] ;FIRST FREE BYTE JUMPE T1,DLTY55 ;SKIP IF NONE MSG PUSHJ P,LDECP ;LIST IN DECIMAL DLTY55: LDB T1,[POINTR FFFB,RB.ACW] ;APPLICATIONS-SPECIFIC VALUE JUMPE T1,DLTY99 ;SKIP IF NONE MSG PUSHJ P,LOCT6Z ;LIST IN OCTAL DLTY99: POPJ P, ;ALL DONE ;HELPERS FOR DLTYP DLTYT: PUSHJ P,.CFIND## ;FIND A MATCHING STRING PUSHJ P,DLTYT8 ;LIST UNKNOWN VALUE MOVE M,T1 ;ADDRESS OF STRING PJRST LSTR ;LIST THE IDENTIFYING STRING DLTYT8: MOVE T1,T2 ;POSITION UNKNOWN VALUE PUSHJ P,LOCT ;AND TYPE IT IN OCTAL MOVEI T1,[ASCIZ\ (Unknown)\] ;A MATCHING STRING POPJ P, ;RETURN AND TYPE OUT UNKNOWN ;STRING TABLES DEFINE XT(VAL,STR), ;FILE DATA TYPE DLTT22: XT .RBDUN, XT .RBDAS, XT .RBDBI, 0 ;FILE DATA CARRIAGE CONTROL DLTT24: XT .RBCUN, XT .RBCFO, XT .RBCAS, 0 ;FILE 'OTS' OR APPLICATION DLTT26: XT .RBOUN, XT .RBOCO, XT .RBOFO, XT .RBOMS, 0 ;RECORD FORMAT DLTT40: XT .RBRUN, XT .RBRFX, XT .RBRVR, XT .RBRVF, XT .RBRSP, 0 ;RECORD ORGANIZATION DLTT44: XT .RBRSQ, XT .RBRRL, XT .RBRID, XT .RBRHS, 0 IFN FT$MTA,< ;MAGTAPES ;BLKOVR -- READ BLOCK OF OVERHEAD WORDS ;CALL: T1/ AOBJN TO READ ; PUSHJ P,BLKOVR ; RETURN +1 AT END OF RECORD ; RETURN +2 IF READ OK ;COUNTS WORDS IN T2 ;USES T1-4 BLKOVR: SKIPL T3,T1 ;PUT COUNT IN SAFE PLACE JRST .POPJ1## ;GOOD RETURN IF NONE TO TRANSFER BLKO.1: PUSHJ P,NEXOVR ;GET NEXT WORD POPJ P, ;RETURN IF EOF MOVEM T1,(T3) ;STORE AWAY AOBJN T3,BLKO.1 ;LOOP JRST .POPJ1## ;GOOD RETURN ;NEXDCW -- READ REST OF BLOCK COMPUTING CHECKSUM ;NEXDTW -- READ ONE WORD COMPUTING CHECKSUM ;NEXOVW -- DITTO, BUT DON'T INCLUDE IN CHECKSUM ;NEXOVR -- DITTO, BUT STOP AT END OF RECORD ;CALL: PUSHJ P,NEXDTW/NEXOVW/NEXOVR ;RETURN CPOPJ IF END OF FILE ;SKIP RETURN WITH DATUM IN T1 ; NEXOVR COUNTS WORDS IN T2 ;USES M, C NEXOVR: SKIPN BFHD+.BFCTR ;SEE IF SOMETHING HERE POPJ P, ;NO--RETURN PUSHJ P,NEXOVW ;YES--GET IT POPJ P, ;EOF! AOS T2 ;COUNT WORD JRST .POPJ1## ;OK RETURN >;END IFN FT$MTA ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE NEXOVW: TRO F,R.MTOH ;INDICATE OVERHEAD WORD NEXDTW: TLNE F,L.FKEF ;SEE IF FAKE EOF SET POPJ P, ;YES--GIVE IT AGAIN TLZE F,L.SVDW ;SEE IF SAVED WORD JRST [MOVE T1,MTSVWD JRST NEXDT3] IFN FT$MTR,< ;OLD BACKUP/RESTORE TLNE F,L.BKSS ;SEE IF OLD BACKUP/RESTORE SAVE SET JRST NEXDT1 ;YES--GO HANDLE IT >;END IFN FT$MTR SKIPN BFHD+.BFCTR ;NO--SEE IF READY TO READ NEXT RECORD TLNN F,L.SVST!L.FRSS ;AND IN SAVE SET MODE JRST NEXDT2 ;NO--JUST PROCEED IFN FT$MTB,< ;BACKUP/FRS TLNE F,L.FRSS ;SEE IF BACKUP/FRS JRST NEXDF1 ;YES--GO HANDLE >;END IFN FT$MTB IFN FT$MTF,< ;FAILSAFE PUSHJ P,NEXDT ;FAILSAFE--READ THE NEXT WORD POPJ P, ;EOF--ALL DONE TLNN T1,-1 ;SEE IF MORE DATA JRST NEXDT2 ;YES--GO READ DATA WORD MOVEM T1,MTSVHD ;NO--SAVE HEADER TLO F,L.FKEF ;AND SET FAKE EOF POPJ P, ;RETURN EOF >;END IFN FT$MTF ;HERE FOR BACKUP/FRS SAVE SETS IFN FT$MTB,< ;BACKUP/FRS NEXDF1: SKIPGE B$GFLG ;SEE IF END OF FILE ..==GF$EOF ;(FOR CREF) TLOA F,L.FKEF ;YES--SET EOF PUSHJ P,NEXDT ;NO--GET START OF RECORD POPJ P, ;RETURN IF EOF PUSHJ P,FRSLAH ;HANDLE BACKUP/FRS LOOK-AHEAD MOVEM T1,MTSVWD ;SAVE WORD JUST IN CASE TLNE T1,777770 ;MAKE SURE FRS OR BACKUP JRST NEXDF9 ;NO--SET ERROR TLNE T1,-1 ;SEE IF FRS TLO T1,-1 ;YES--SET WHOLE HALF XOR T1,B$GTYP ;COMPARE WITH PREVIOUS JUMPL T1,NEXDF9 ;IF DIFFERENT, ERROR >;END IFN FT$MTB ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE IFN FT$MTB,< ;BACKUP/FRS MOVE T1,MTSVWD ;RESTORE WORD IFN FT$MTS,< ;FRS TLNE T1,-1 ;IF FRS, JRST NEXDF2 ;JUMP BELOW IF FRS >;END IFN FT$MTS CAIE T1,T$FIL ;MAKE SURE FILE JRST NEXDV ;NO--CHECK FOR END OF VOLUME NEXDFG: PUSHJ P,NEXDT ;GET RECORD NUMBER POPJ P, ;EOF! MOVEM T1,B$GBNM ;STORE RECORD NUMBER PUSHJ P,NEXDT ;GET TAPE NUMBER POPJ P, ;EOF! CAME T1,B$GRTN ;MUST BE THE SAME JRST NEXDF9 ;NO--ERROR PUSHJ P,NEXDT ;GET FLAGS POPJ P, ;EOF! MOVEM T1,B$GFLG ;STORE PUSHJ P,NEXDT ;GET CHECKSUM POPJ P, ;EOF! MOVEM T1,B$GCHK ;STORE PUSHJ P,NEXDT ;GET SIZE POPJ P, ;EOF! JUMPL T1,NEXDF9 ;ERROR IF NEGATIVE CAILE T1,^D512 ;SEE IF TOO BIG JRST NEXDF9 ;YES--ERROR MOVEM T1,B$GSIZ ;STORE PUSHJ P,NEXDT ;GET SKIP REGION POPJ P, ;EOF! JUMPL T1,NEXDF9 ;ERROR IF NEGATIVE MOVEM T1,B$GLND ;STORE ADDI T1,31 ;COUNT OF REST OF HEADER JRST NEXDF5 ;GO SKIP HEADER AND JUNK >;END IFN FT$MTB IFN FT$MTS,< ;FRS ;HERE IF FRS--READ BLOCK HEADER NEXDF2: HRLZM T1,B$GFLG ;UPDATE FLAGS HLRZS T1 ;GET TYPE CAIE T1,4 ;SEE IF FILE JRST NEXDF9 ;NO--ERROR PUSH P,[5] ;SAVE COUNT TO SKIP FORWARD NEXDF3: PUSHJ P,NEXDT ;GET HEADER JRST [POP P,(P) ;CLEAN UP STACK POPJ P,] ;RETURN EOF SOSLE (P) ;COUNT DOWN JRST NEXDF3 ;REPEAT POP P,(P) ;CLEAN UP STACK PUSHJ P,NEXDT ;GET STARTING BLOCK POPJ P, ;EOF! MOVEM T1,B$FRBN ;SAVE LSH T1,7 ;CONVERT TO WORDS MOVEM T1,B$FRDW ;SAVE PUSHJ P,NEXDT ;GET WORD TO SKIP POPJ P, ;EOF! PUSHJ P,NEXDT ;GET DATA BLOCK IN RECORD POPJ P, ;EOF! SKIPL T1 ;CHECK FOR CAILE T1,20 ; REASONABLENESS JRST NEXDF9 ;NO--JUNK MOVEM T1,B$FNDB ;SAVE PUSHJ P,NEXDT ;GET WORDS IN LAST BLOCK POPJ P, ;EOF! SKIPL T1 ;CHECK FOR CAILE T1,200 ; REASONABLENESS JRST NEXDF9 ;NO--JUNK MOVEM T1,B$FNDW ;SAVE SKIPN T1,B$FNDB ;GET NUMBER OF BLOCKS SKIPGE B$GFLG ;UNLESS EOF SKIPA ;YES MOVEI T1,5 ;(BUG IN OLD VERSION OF FRS) IMULI T1,200 ;CONVERT TO WORDS ADD T1,B$FNDW ;GET NUMBER OF WORDS IN LAST CAIL T1,200 ;ALLOW FOR NO DATA SUBI T1,200 ;ALLOW FOR DOUBLE COUNT MOVEM T1,B$GSIZ ;SAVE AS DATA SIZE MOVEI T1,12 ;INDICATE REST OF HEADER >;END IFN FT$MTS ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE IFN FT$MTB,< ;BACKUP/FRS ;HERE TO SKIP REST OF FRS/BACKUP BLOCK HEADER NEXDF5: PUSH P,T1 ;SAVE DISTANCE NEXDF6: PUSHJ P,NEXDT ;GET MORE HEADER JRST [POP P,(P) ;CLEAN UP STACK POPJ P,] ;RETURN EOF SOSLE (P) ;COUNT DOWN JRST NEXDF6 ;LOOP OVER HEADER POP P,(P) ;RESTORE STACK MOVE T1,B$GSIZ ;GET LENGTH OF DATA AREA MOVEM T1,BFHD+.BFCTR ;STORE AS REAL STUFF TO READ JRST NEXDTW ;GO GET SOME DATA NEXDF9: TLO F,L.FKEF!L.SVDW ;INDICATE ERROR POPJ P, ;RETURN >;END IFN FT$MTB ;HERE TO CHECK AND MOUNT NEXT VOLUME IF DESIRED IFN FT$MTB,< ;BACKUP ONLY NEXDV: SKIPLE S.MVOL ;ONLY IF /MVOLUME CAIE T1,T$EOV ;IS THIS BACKUP END OF VOLUME? JRST NEXDF9 ;NO - JUST END OF FILE SETZM BFHD+.BFCTR ;READ NEXT RECORD PUSHJ P,NEXDT ;. . . CAIA ;TAPE MARK EXPECTED JRST NEXDV8 ;AND DATA ISN'T TLO F,L.BPOP ;ASK MTFEOV TO "POPJ" PUSHJ P,MTFEO0 ;ASK FOR NEXT TAPE JRST NEXDV9 ;USER SAID "EXIT" NEXDV2: SETZM BFHD+.BFCTR ;MAKE SURE NO DATA PUSHJ P,NEXDT ;FIRST WORD NEW TAPE JRST NEXDV9 ;NO FIRST WORD CAIE T1,T$CSS ;BACKUP CONTINUE SAVE SET? JRST NEXDV8 ;NO, FORGET IT TLO F,L.BPOP ;ASK MTFCSS TO POPJ PUSHJ P,MTFRSP ;LIST SAVE SET HEADER JRST [TLO F,L.BPOP ;ASK MTFEOV TO POPJ PUSHJ P,MTFEO1 ;WRONG TAPE, ASK AGAIN JRST NEXDV9 ;USER SAID "EXIT" JRST NEXDV2] ;TRY AGAIN PUSHJ P,NEXDT ;FIRST WORD NEXT RECORD JRST NEXDV9 ;EOF CAIE T1,T$DIR ;DIRECTORY RECORD? JRST [CAIN T1,T$FIL ;[466] NO, FILE RECORD? JRST NEXDV4 ;YES JRST NEXDV8] ;NO, GARBAGE FORMAT SETZM BFHD+.BFCTR ;EAT DIRECTORY RECORD PUSHJ P,NEXDT ;THIRD RECORD JRST NEXDV9 ;EOF CAIE T1,T$FIL ;NOW, THIS SHOULD BE FILE RECORD JRST NEXDV8 ;IT'S NOT, BUMMER NEXDV4: MOVEM T1,B$GTYP ;MAKE SURE B$GTYP CORRECT JRST NEXDFG ;CONTINUE WITH FILE DATA ;ERRORS NEXDV8: MOVEM T1,MTSVWD ;RE-READ THIS WORD TLO F,L.SVDW ;ON NEXT CALL TO NEXD?? NEXDV9: TLO F,L.FKEF ;FORCE EOF POPJ P, ;AND TAKE EOF RETURN > ;END IFN FT$MTB IFN FT$MTR,< ;OLD BACKUP/RESTORE ;HERE FOR OLD BACKUP/RESTORE SAVE SETS NEXDT1: SOSLE MTSVCT ;DECREMENT COUNT JRST NEXDT2 ;STILL IN THIS HEADER PUSHJ P,NEXDT ;GET NEXT HEADER POPJ P, ;RETURN IF EOF MOVEM T1,MTSVWD ;SAVE WORD IN CASE TRZ T1,777000 ;CLEAR BACK POINTER HRRZM T1,MTSVCT ;SET COUNT HLRZS T1 ;GET CONTROL HEADER CAIE T1,400000 ;IS IT DATA? JRST [TLO F,L.FKEF!L.SVDW ;SET FLAGS JRST NEXDT8] ;GIVE EOF RETURN PUSHJ P,NEXDT ;THROW AWAY CHECKSUM POPJ P, ;EOF JRST NEXDT2 ;GO DO NORMAL READ NOW >;END IFN FT$MTR NEXDT2: PUSHJ P,NEXDT ;READ FILE JRST NEXDT8 ;RETURN IF EOF NEXDT3: SKIPLE S.CHK ;IS CHECKSUMMING REQUESTED? TRZE F,R.MTOH ;SEE IF MAG TAPE OVERHEAD JRST .POPJ1## ;DON'T CHECKSUM IT NEXDT4: EXCH T1,CHKSUM ;GET CHECKSUM SO FAR ROT T1,1 ;ROTATE ADD T1,CHKSUM ;ADD THIS WORD EXCH T1,CHKSUM ;STORE AWAY EXCH T1,SCHKSM ;GET CHECKSUM SO FAR ROT T1,1 ;ROTATE ADD T1,SCHKSM ;ADD THIS WORD EXCH T1,SCHKSM ;STORE AWAY EXCH T1,TCHKSM ;GET CHECKSUM SO FAR ROT T1,1 ;ROTATE ADD T1,TCHKSM ;ADD THIS WORD EXCH T1,TCHKSM ;STORE AWAY JRST .POPJ1## ;AND SKIP RETURN NEXDT8: SETZM MTSVCT ;CLEAR COUNTER POPJ P, ;RETURN ;NEXDCW -- READ CHECKSUMMED WORD/BLOCK ;CALL AS NEXDTW ; ;THIS ROUTINE READS THE REST OF THE BLOCK OF DATA, CHECKSUMMING ;AS IT GOES. THIS ROUTINE CUTS THE CHECKSUMMING OVERHEAD FROM 27 ;INSTRUCTIONS/WORD TO 14/WORD, (TO 6/WORD IF /FNDBLD/NODIRECT) ;PLUS IN UUO AND (IF APPLICABLE) ANY MAGTAPE RECORD PROCESSING, ETC. ; ;USES T1, T2. NEXDCW: IFN FT$MTR, ;NEXDTW IF OLD BACKUP/RESTORE SKIPG T2,BFHD+.BFCTR ;ANY WORDS LEFT IN BUFFER? JRST NEXDTW ;NO, DO IN, MAGTAPE RECORD HANDLING SKIPN S.DIRE ;/NODIRECT? JRST NEXDC6 ;YES, THEN ONLY NEED 7 INSTR/WORD JRST NEXDC3 ;NO, NEED ALL THREE RUNNING CHECKSUMS ;HERE TO MAINTAIN ALL THREE RUNNING CHECKSUMS (E.G. NOT /FNDBLD/NODIRECT) NEXDC2: ILDB T1,BFHD+.BFPTR ;GET NEXT WORD TO BE CHECKSUMMED EXCH T1,CHKSUM ;GET CHECKSUM SO FAR ROT T1,1 ;ROTATE ADD T1,CHKSUM ;ADD THIS WORD EXCH T1,CHKSUM ;STORE AWAY EXCH T1,SCHKSM ;GET CHECKSUM SO FAR ROT T1,1 ;ROTATE ADD T1,SCHKSM ;ADD THIS WORD EXCH T1,SCHKSM ;STORE AWAY EXCH T1,TCHKSM ;GET CHECKSUM SO FAR ROT T1,1 ;ROTATE ADD T1,TCHKSM ;ADD THIS WORD EXCH T1,TCHKSM ;STORE AWAY NEXDC3: SOJGE T2,NEXDC2 ;LOOP FOR REST OF BLOCK SETZM BFHD+.BFCTR ;THIS BUFFER NOW EXHAUSTED PJRST NEXDTW ;START UP A NEW BUFFER ;HERE ON /CHECKSUM/NODIRECT (E.G., /FNDBLD/NODIRECT), GO EVEN FASTER NEXDC5: ILDB T1,BFHD+.BFPTR ;GET NEXT WORD TO BE CHECKSUMMED EXCH T1,CHKSUM ;GET CHECKSUM SO FAR ROT T1,1 ;ROTATE ADD T1,CHKSUM ;ADD THIS WORD EXCH T1,CHKSUM ;STORE AWAY NEXDC6: SOJGE T2,NEXDC5 ;LOOP FOR REST OF BUFFER SETZM BFHD+.BFCTR ;THIS BUFFER NOW EXHAUSTED PJRST NEXDTW ;START UP A NEW BUFFER IFN FT$MTB,< ;BACKUP/FRS ;FRSLAH -- ROUTINE TO HANDLE FRS/BACKUP LOOK-AHEAD TO CORRECT ERRORS ;CALL: 1/ FIRST WORD OF A RECORD ; PUSHJ P,FRSLAH ; RETURNS 1/FIRST WORD OF FIRST GOOD RECORD ;USES NO AC'S FRSLAH: PUSH P,T1 ;SAVE T1 PUSH P,T2 ;[465] AND T2 TOO FRSLA1: MOVE T1,@BFHD+.BFADR ;[465] GET POINTER TO NEXT BUFFER SKIPL .BFHDR-1(T1) ;MAKE SURE IT IS FULL JRST [WAIT DC, ;[465] LET THE TAPE CATCH UP SKIPL .BFHDR-1(T1) ;[465] GOT THE NEXT BUFFER NOW? JRST FRSLA9 ;[465] NO, JUST GIVE UP THEN JRST .+1] ;[465] YES, CHECK FOR REPEATER SKIPL B$GTYP ;IS IT FRS OR BACKUP SKIPA T2,.BFCNT+G$FLAG(T1) ;BACKUP--GET FLAGS HRLZ T2,.BFCNT(T1) ;FRS--GET FLAGS TXNE T2,GF$RPT ;[465] IS IT A REPEAT JRST FRSLA5 ;[465] DEFINITELY A REPEATER SKIPGE B$GTYP ;[465] BACKUP OR FRS? JRST FRSLA9 ;[465] FRS, ASSUME OK MOVE T2,.BFCNT+G$SEQN(T1) ;[465] BACKUP, GET NEXT RECORD NUMBER MOVE T1,BFHD+.BFADR ;[465] POINT BACK TO CURRENT BUFFER CAME T2,.BFCNT+G$SEQN(T1) ;[465] RECORD NUMBER REPEATED? JRST FRSLA9 ;[465] NO, THIS BUFFER/RECORD IS OK FRSLA5: PUSHJ P,FRSSBR ;[465] TELL USER OF WOES SETZM BFHD+.BFCTR ;[465] DISCARD CURRENT (REPEATED) RECORD PUSHJ P,NEXDT ;GET NEXT TLO F,L.FKEF ;EOF! MOVEM T1,-1(P) ;[465] SET NEW "FIRST" WORD JRST FRSLA1 ;[465] AND TRY AGAIN FRSLA9: POP P,T2 ;[465] RESTORE TRASHED AC POP P,T1 ;RESTORE FIRST WORD POPJ P, ;RETURN ;[465] TELL USER OF REPEATER RECORDS BEING SKIPPED (IF HE CARES) FRSSBR: SKIPG S.SBRM ;[465] USER CARE (/SBRMSG)? POPJ P, ;[465] NO, DON'T MESS UP HER LISTING PUSHJ P,.PSH4T## ;[465] YES, PROTECT THE TEAS N$WRNX (SBR,) ;[465] MOVE T1,BFHD+.BFADR ;[465] ADDRESS OF [TO BE PITCHED] BUFFER MOVE T1,.BFCNT+G$SEQN(T1) ;[465] GET THE [REPEATED] RECORD NUMBER PUSHJ P,LDEC ;[465] AND LIST IT TOO X$$SBR: PUSHJ P,.TCRLF## ;[465] CAP OFF WITH A PUSHJ P,.POP4T## ;[465] GET THE TEAS BACK POPJ P, ;[465] ADVANCE TO NEXT RECORD >;END IFN FT$MTB ;NEXDT -- ROUTINE TO READ ONE WORD FROM THE BUFFER ;NON-SKIP RETURN IF EOF ;SKIP RETURN WITH WORD IN T1 NEXDT: SOSGE BFHD+.BFCTR ;SEE IF ANY LEFT JRST NEXDTR ;NO--GO DO A READ ILDB T1,BFHD+.BFPTR ;YES--GET IT JRST .POPJ1## ;SKIP RETURN NEXDTR: AOSN MTAEOF ;START OF A NEW FILE ?? PUSHJ P,MTLBIN ;YES, GET LABEL PARMS IN DC, ;READ NEXT BLOCK JRST NEXDT ;GO ANALYZE ;ERROR OR END OF FILE, CHECK IT OUT PUSHJ P,.PSH4T## ;SAVE ALL TEMPS GETSTS DC,T1 ;GET CURRENT I/O STATUS TXNE T1,IO.EOF ;END OF FILE? JRST NEXDTF ;YES, TAKE EOF RETURN PUSH P,T1 ;SAVE ERROR STATUS N$WRNX (IDE,) IFN FT$MTA,< ;MAGTAPE SKIPE T1,MTNAME ;SEE IF MAG-TAPE NAME PUSHJ P,[PUSHJ P,.TSIXN## ;YES--TYPE IT MOVEI T1,[ASCIZ /: file /] PJRST .TSTRG##] ;MORE MESSAGE >;END IFN FT$MTA MOVEI T1,FOBLK+.FOIOS ;POINT TO OPEN BLOCK MOVEI T2,LBLOCK ;POINT TO LOOKUP BLOCK PUSHJ P,.TOLEB## ;ISSUE FILE SPEC MOVEI T1,[ASCIZ\; \] ;A NICE SEPARATOR PUSHJ P,.TSTRG## ;SEPARATE FILE FROM I/O STATUS MOVE T1,0(P) ;RETRIEVE A COPY OF THE I/O STATUS HRLI T1,DC ;AND ITS CHANNEL PUSHJ P,IOERM ;TYPE ERROR STATUS AOSN T1 ;T1 SAY TO ABORT? SETOM ABORTI ;YES, ABORT INPUT X$$IDE: PUSHJ P,.TCRLF## ;END LINE POP P,T1 ;RETRIEVE I/O/ERROR STATUS TRZ T1,IO.ERR ;CLEAR OUT ERROR BITS SETSTS DC,(T1) ;SET CLEARED STATUS PUSHJ P,.POP4T## ;RESTORE TEMPS SKIPL ABORTI ;ANYTHING REALLY WRONG? JRST NEXDT ;NO, JUST READ WHAT WAS RETURNED TO US POPJ P, ;YES, ABORT I/O HERE ;HERE ON EOF NEXDTF: PUSHJ P,.POP4T## ;RESTORE THE T'S SETOM MTAEOF ;INDICATE NEW FILE POPJ P, ;AND TAKE EOF RETURN ;IOERM -- ISSUE GENERAL I/O CHANNEL/STATUS ERROR MESSAGE ;CALL IS: ; ; MOVE T1, ; PUSHJ P,IOERM ; RETURN ; ;WHERE IS THE OFFENDING I/O STATUS. ; ;ON RETURN I/O CHANNEL IS UNAFFECTED, AND T1 HAS -1 IF NO FURTHER ;I/O SHOULD BE ATTEMPTED (PULSAR/AD NAUSEUM HAS STOMPED ON THE I/O). IOERM: PUSHJ P,.SAVE1## ;WANT A PRESERVED AC HERE MOVE P1,T1 ;HANG ON TO STATUS MOVEI T1,[ASCIZ\I/O status = \] PUSHJ P,.TSTRG## ;PREFIX STATUS MESSAGE HRRZ T1,P1 ;RETRIEVE STATUS AGAIN PUSHJ P,.TOCTW## ;LIST OCTAL I/O STATUS MOVE T1,P1 ;RETRIEVE STATUS YET AGAIN TXCN T1,IO.ERR ;ANY ERROR BITS SET? JRST IOERM9 ;NO? TXCN T1,IO.ERR ;EXTENDED ERROR STATUS? JRST IOERX ;YES, LIST I/O REASON MOVEI T1,[ASCIZ\ (\] ;START EXPLANATORY TEXT PUSHJ P,.TSTRG## ; . . . MOVEI T1,[ASCIZ\Improper mode\] ;WRITE-LOCK, ETC. TXZE P1,IO.IMP ;"IMPROPER MODE" ERROR? PUSHJ P,IOERM5 ;YES, LIST EXPLANATION MOVEI T1,[ASCIZ\Hard device error\] ;DEVICE (NOT DATA) TXZE P1,IO.DER ;DEVICE AT FAULT (POWER, ETC.)? PUSHJ P,IOERM5 ;YES, LIST EXPLANATION MOVEI T1,[ASCIZ\Hard data error\] ;DATA PARITY ERROR TXZE P1,IO.DTE ;DATA INCORRECT? PUSHJ P,IOERM5 ;YES, LIST EXPLANATION MOVEI T1,[ASCIZ\Block too large\] ;DATA RECORD TOO BIG TXZE P1,IO.BKT ;DATA RECORD BIGGER THAN BUFFER? PUSHJ P,IOERM5 ;YES, LIST EXPLANATION MOVEI T1,")" ;END OF EXPLANATORY TEXT PJRST .TCHAR## ;CAP OFF ERROR STATUS TEXT ;SUBSIDIARY OF IOERM, FOR TYPING MESSAGE, OPTIONAL SEPARATING COMMA IOERM5: PUSHJ P,.TSTRG## ;TYPE OUT ASCII TEXT MOVEI T1,[ASCIZ\, \] ;PRETTY ITEM SEPERATOR TXNE P1,IO.ERR ;MORE EXPLANATIONS COMING UP? PJRST .TSTRG## ;YES POPJ P, ;NO ;HERE WHEN NO APPARENT REASON IOERM9: MOVEI T1,[ASCIZ\ (no apparent error)\] PJRST .TSTRG## ;CAP OFF OUR OUTPUT ;HERE TO LIST EXTENDED DEVICE I/O ERROR STATUS IOERX: HLRZ T3,P1 ;CHANNEL WITH ERROR MOVEI T2,.DFRES ;READ I/O ERROR FUNCTION MOVE T1,[2,,T2] ;DEVOP. ARG POINTER TO DEVOP. T1, ;READ EXTENDED I/O ERROR STATUS SETZ T1, ;NONE? CAIL T1,0 ;MUST BE POSITIVE CAILE T1,IOERXX ;AND KNOWN TO US SETZ T1, ;UNKNOWN ERROR STATUS PUSH P,T1 ;SAVE THE CODE FOR A BIT HRRZ T1,IOERXT(T1) ;[447] GET EXPLANATORY TEXT PUSHJ P,.TSTRG## ;AND GIVE IT TO USER POP P,T1 ;RESTORE THE EXTENDED ERROR CODE HLLE T1,IOERXT(T1) ;[447] RETURN "FATALNESS" IN T1 POPJ P, ;RETURN TO CALLER IOERXT: 00,, [ASCIZ\ ((00) - Unknown error status)\] 00,, [ASCIZ\ (IOPLE% (01) - Page limit exceeded)\] 00,, [ASCIZ\ (IOVFE% (02) - VFU format error)\] -1,, [ASCIZ\ (IOLTE% (03) - Label type error)\] -1,, [ASCIZ\ (IOHLE% (04) - Header label error)\] -1,, [ASCIZ\ (IOTLE% (05) - Trailer label error)\] -1,, [ASCIZ\ (IOVLE% (06) - Volume label error)\] 00,, [ASCIZ\ (IODER% (07) - Hard device error)\] 00,, [ASCIZ\ (IOPAR% (10) - Data parity error)\] 00,, [ASCIZ\ (IOWLE% (11) - Device is write-locked)\] -1,, [ASCIZ\ (IOIPO% (12) - Illegal positioning operation\] 00,, [ASCIZ\ (IOBOT% (13) - Begining of tape)\] -1,, [ASCIZ\ (IOIOP% (14) - Illegal operation)\] -1,, [ASCIZ\ (IOFNF% (15) - Labelled file not found)\] -1,, [ASCIZ\ (IOCAN% (16) - Operator cancelled volume switch)\] -1,, [ASCIZ\ (IOTMV% (17) - Too many volumes in volume set)\] 00,, [ASCIZ\ (IONND% (20) - Network communications broken)\] 00,, [ASCIZ\ (IOUNC% (21) - Undefined character interrupt)\] 00,, [ASCIZ\ (IORPE% (22) - RAM parity error)\] -1,, [ASCIZ\ (IOLRA% (23) - Labeler request aborted by RESET)\] -1,, [ASCIZ\ (IOVPF% (24) - Volume protection failure)\] -1,, [ASCIZ\ (IOFPF% (25) - File protection failure)\] -1,, [ASCIZ\ (IOUEF% (26) - Unexpired file)\] IOERXX==.-IOERXT ;LARGEST KNOWN TO US ERROR CODE REPEAT 0,< ;CHKNXF -- CHECK FOR PREVIOUS SPEC. WAS NON-EXISTENT EVERY PLACE ;PRESERVES T1-4 CHKNXF: CAMN I,LASI ;SEE IF STILL SAME REQUEST POPJ P, ;YES--DON'T WORRY YET MOVEM I,LASI ;SAVE LAST REQUEST SKIPN NXFCNT ;SEE IF ANY FILE FOUND SKIPN NXFI ;NO--SEE IF ERROR FOUND JRST CHKNXY ;NO--JUST CLEAN UP AND RETURN PUSH P,T1 ;PRESERVE T1-4 PUSH P,T2 PUSH P,T3 PUSH P,T4 EXCH I,NXFI ;GET OLD I MOVEI T1,H.ZERX-H.ZER1;POINT TO OLD COPY AREA MOVE T2,.FXDEV(I) ;GET ORIGINAL DEVICE REQUESTED MOVEM T2,FSTR(T1) ;SAVE AWAY FOR LATER HLLZS FEXT(T1) ;CLEAR ERROR CODE SKIPN NXUCNT ;SEE IF UFD FOUND JRST [MOVEI T2,1 ;NO--SET UFD NOT FOUND SKIPE NXSCNT ;SEE IF SFD MISSING MOVEI T2,23 ;YES--SET THAT CODE HRRM T2,FEXT(T1) ;AND STORE THE JRST .+1] ; CODE AWAY PUSHJ P,E.DFLS ;ISSUE ERROR MOVE I,NXFI ;RESTORE I POP P,T4 ;RESTORE T1-4 POP P,T3 POP P,T2 POP P,T1 CHKNXY: SETZM NXFI ;CLEAR ERROR FLAG SETZM NXFCNT ;CLEAR FOUND COUNT SETZM NXSCNT ;CLEAR NX SFD COUNT POPJ P, ;RETURN ;STILL IN REPEAT 0 ;SUBROUTINE IF LOOKUP ERROR ; BEFORE COUNTING THE ERROR. LCR. 15-FEB-77. E.DFLL: PUSHJ P,.CHKTA## ;GO CHECK CONCATENATION REQUIREMENTS. JRST [SOS NXFCNT ;WE DON'T NEED THIS FILE. DON'T COUNT POPJ P,] ;ERROR, JUST RETURN TO MAINLINE. HRRZ T1,FEXT ;GET ERROR CODE CAIN T1,ERPRT% ;SEE IF PROTECTION ERROR JRST [MOVX T2,FX.PRT ;YES--SEE IF /OKPROT TDNN T2,.FXMOD(I) ; .. JRST .+1 ;NO--PROCEED MOVEI T1,LBLOCK ;YES--USE MOVEI T2,LN$RIB ; E.LKEN MOVEI T3,(I) ; TO GET WILD PJRST E.LKEN##] ; ERROR COUNTS CAIE T1,ERSNF% ;SEE IF NX SFD CAIG T1,ERIPP% ;NO--SEE IF NX FILE OR NX UFD SKIPG .WLDFL## ;YES--SEE IF STR WILDCARDING JRST E.DFLC ;NO--ISSUE MESSAGE NOW ANYWAY SKIPN T1 ;SEE IF UFD PRESENT AOS NXUCNT ;NON-X FILE CAIN T1,ERSNF% ;SEE IF SFD AOS NXSCNT ;YES--COUNT IT MOVEM I,NXFI ;YES--SAVE I AS FLAG FOR LATER ;THIS IS NEEDED BECAUSE WE WISH TO ; GIVE NX FILE MESSAGE ONLY IF IT DOES ; NOT EXIST ON ANY STR IN THE LIST MOVE T1,[H.ZER1,,H.ZERX] BLT T1,H.ZERY-1 ;COPY TO ALTERNATE AREA SKIPE T1,UFDPPN ;SEE IF SFD TO COPY TLNE T1,-1 ; .. POPJ P, ;NO--RETURN HRLZ T1,T1 ;YES--COPY TO ALTERNATE HRRI T1,H.ZERY ; AREA BLT T1,H.ZERY+2+.FXLND ; .. POPJ P, ;GO AROUND THE LOOP E.DFLC: MOVEI T1,0 ;POINT TO REGULAR AREA PUSHJ P,E.DFLS ;ISSUE ERROR MESSAGE AOS SNFILR ;COUNT LOOKUP ERROR AOS NXFCNT ;COUNT FILE FOUND POPJ P, ;AND GO AROUND LOOP ;STILL IN REPEAT 0 ;E.DFLS -- SUBROUTINE TO PRINT ERROR IN FILE LINE ;T1 MUST BE SET TO 0 FOR REGULAR AREA ;USES T1, T2, T3, T4, M, C E.DFLS: PUSHJ P,.SAVE1## ;SAVE P1 MOVE P1,T1 ;SAVE POINTER THERE TRO F,R.TYPE ;DUPLICATE TO TTY: PUSHJ P,SSTRDR ;OUTPUT DIR AND DEV PUSHJ P,.TNEWL ;FORCE BEGINNING OF LINE N$WRNX (LKE,) HRRZ T1,FEXT(P1) ;GET ERROR CODE MOVE T3,FPRV(P1) ;GET LOOKUP ANSWER (PROT. CODE) PUSHJ P,.LKERR## ;LIST ERROR CODE MOVEI T1,[ASCIZ / file /] PUSHJ P,.TSTRG## ;OUTPUT HEADING PUSHJ P,LSTFNX ;LIST FILE NAME MOVEI C,"." ;SEPARATE WITH PUSHJ P,LCHR ; A DOT HLLZ T2,FEXT(P1) ;GET EXTENSION PUSHJ P,LSIXT ;LIST IT MOVEI T1,.CHTAB ;PICK UP TAB PUSHJ P,.TTCHR ; AND TYPE IT SKIPN S.WDTH ;SEE IF /WIDTH PUSHJ P,LSTRDX ;LIST STR/DIR X$$LKE: TRZ F,R.TYPE ;CLEAR FLAG PJRST .TCRLF## ;END LINE > ;END OF REPEAT 0 ;LSTFNM -- LIST FILE NAME IN APPROPRIATE MODE ;USES T1, T2, T3, T4 LSTFNM: PUSHJ P,.SAVE1 ;SAVE P1 MOVEI P1,0 ;SET TO NO OFFSET LSTFNX: HLRZ T1,FEXT(P1) ;LOOK AT EXTENSION CAIN T1,'UFD' ;TO SEE IF IT IS A UFD SKIPGE FNAM(P1) ;YES--SEE IF ALPHA JRST .+2 ;YES--USE SIXBIT ANYWAY JRST FLUFD ;NO--SPECIAL PRINT MOVE T2,FNAM(P1) ;OUTPUT FILE NAME PJRST LSIX ;LIST IN SIXBIT FLUFD: HLRZ T1,FNAM(P1) ;GET PROJECT SKIPLE S.CMP ;IF /COMPARE SETOM S.FUFD ;FORCE THE PRINTING OF THE UFD. PUSHJ P,LOCT6B ;ISSUE RIGHT ADJUSTED SETZM S.FUFD ;RESET THE PRINTTING WHEN DONE MOVEI C,"," ;ISSUE COMMA PUSHJ P,LCHR ; .. HRRZ T1,FNAM(P1) ;GET PROGRAMMER PJRST LOCT ;ISSUE LEFT ADJUSTED ;SSTRDR -- SET FLAGS TO LIST STR AND OR DIRECTORY ;CALL: PUSHJ P,SSTRDR ; WITH I AND P1 SETUP ;USES T1-4 SSTRDR: MOVE T1,FSTR(P1) ;SEE IF SAME FILE STRUCTURE ;RDH CAMN T1,[SIXBIT /DSK/] ;RDH SKIPE LASSTR ;IS IT THE FIRST ONE? ;RDH JRST .+2 ;NO--PRINT IT ;RDH MOVEI T1,0 ;IF FIRST DSK, NEVER PRINT MOVEM T1,LSTSTR ;SAVE FOR PRINTING EXCH T1,LASSTR ;UPDATE MEMORY CAMN T1,LASSTR ;SEE IF DIFFERENT SETZM LSTSTR ;SAME--FLAG TO NOT PRINT MOVEI T3,(I) ;POINT TO DIRECTORIES HRLI T3,-.FXLND ;SET COUNT SSTRD1: SKIPN .FXDIR(T3) ;SEE IF NULL DIRECTORY SKIPE T2,.FXDIM(T3) ;YES--USE WILDCARD STRAIGHT SETCM T2,.FXDIM(T3) JUMPN T2,SSTRD2 ;IF WILD--PROCEED AOS T3 ;ADVANCE EXTRA SHOT SKIPN .FXDIR-1(T3) ;SEE IF AT END SKIPE .FXDIM-1(T3) ; .. AOBJN T3,SSTRD1 ;LOOP UNTIL DONE ;HERE WITH T2=0 IF NOT WILD DIRECTORY, .NE. 0 IF WILD ;COPY THIS DIRECTORY TO OLD ONE WATCHING FOR CHANGES SSTRD2: MOVE T1,UFDPPN(P1) ;SEE IF SAME DIRECTORY MOVEM T1,LSTDIR ;SAVE FOR LISTING EXCH T1,LASDIR ;UPDATE MEMORY PUSH P,T2 MOVE T2,T1 ;SETUP POINTER TO OLD AREA MOVE T3,UFDPPN(P1) ; AND TO NEW AREA TLNE T3,-1 ;SEE IF NEW HAS PATH JRST SSTRD4 ;NO--PROCEED TLNE T2,-1 ;IF OLD DIDN'T, SETOM T1 ; THEN DEFINITELY DON'T MATCH ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE MOVEI T2,LASPTH ;POINT TO LAST PATH HRLI T3,-.FXLND ;SET LOOP COUNTER SSTRD3: MOVE T4,.PTPPN(T3) ;GET NEW DIRECTORY CAME T4,.PTPPN(T2) ;SEE IF SAME AS OLD ONE SETOM T1 ;NO--SET DIFFERENT FLAG MOVEM T4,.PTPPN(T2) ;STORE FOR OLD MEMORY AOS T2 ;ADVANCE OLD POINTER SKIPE T4 ;SEE IF END OF PATH YET AOBJN T3,SSTRD3 ;NO--LOOP UNTIL DONE CAME T1,[-1] ;SEE IF DIFFERENT MOVE T1,LASDIR ;SAME--FAKE OUT CHECK BELOW ;HERE WITH T1=OLD DIRECTORY (OR -1 IF KNOWN DIFFERENT) SSTRD4: CAMN T1,LASDIR ;NO--SEE IF CHANGED SETZM LSTDIR ;NO--CLEAR LISTING FLAG TRNE F,R.FAST ;SEE IF /F SKIPLE S.SUM ;YES--SEE IF /SUM JRST .+2 ;/F/SUM OR NOT /F JRST SSTRD6 ;/F AND NOT /SUM--NO SUBTOTALS SKIPN LSTSTR ;SEE IF SEVERAL STRS SKIPE LSTDIR ;OR SEVERAL DIRS PUSHJ P,SUBTOT ;YES--ISSUE SUBTOTALS MOVE T1,LASSTR ;GET LAST STRUCTURE MOVEM T1,SUBSTR ;SAVE FOR SUBTOTALS SKIPE T1,LASDIR ;GET LAST DIRECTORY TLNE T1,-1 ;SEE IF PATH POINTER JRST SSTRD5 ;NO--JUST STORE WORD HRLZS T1 ;SET AS FROM POINTER HRRI T1,SUBPTH ;SET TO POINTER BLT T1,SUBEND ;COPY PATH MOVEI T1,SUBPTH ;SET POINTER TO SUBTOTAL PATH SSTRD5: MOVEM T1,SUBDIR ;SAVE SUBTOTAL DIRECTORY ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE SSTRD6: POP P,T2 ;RESTORE WILD FLAG (.NE. 0 IF WILD) SKIPN S.SORT ;SEE IF SORTING JRST SSTRD7 ;NO--PROCEED SETOM LSTSTR ;YES--SET TO LIST SETOM LSTDIR ;LIST DIRECTORY SKIPGE T1,.WLDFL## ;SEE IF WILD STR SETCM T1,T1 ; OR WILD FILE AND STR CAIE T1,1 ; .. SETZM LSTSTR ;NO--CLEAR LIST SKIPN T2 ;CHECK WILD DIRECT SETZM LSTDIR ;NO--CLEAR LIST DIRECT SSTRD7: SKIPLE S.IND ;IF /INDIRECT JRST [SKIPN S.PRDE ;IF /NOPRDEVICE POPJ P, ;THEN DON'T OUTPUT DEVICE NAME SKIPE T2,FSTR ; IF STRUCTURE KNOWN, PUSHJ P,LSIXCL ; OUTPUT IT ALWAYS POPJ P,] ;AND RETURN SKIPN S.SORT ;UNLESS /SORT, SKIPG S.HDSD ;HEADER STR/DIR LISTING? JRST SSTRD8 ;NO--PROCEED SKIPN LSTSTR ;YES--SEE IF CHANGE OF STR SKIPE LSTDIR ; OR OF DIRECTORY JRST .+2 ;YES--PRINT THEM JRST SSTRD8 ;NO--SKIP OUTPUT PUSHJ P,.TNEWL ;FORCE NEW LINE TLZN F,L.SBTT ;JUST OUTPUT A SUB-TITLE? JRST .+3 ;NO TLZ F,L.CRLF ;YES, ZAP BLANK-LINE SUPPRESSOR PUSHJ P,LCRLF ;AND GIVE A BLANK LINE PUSHJ P,SSTRD8 ;CHECK FOR PRDEV/PRDIR SWS. PUSHJ P,LSTRDX ;PRINT STR AND DIRECTORY PUSHJ P,.TNEWL ;SPACE OVER AND RETURN SSTRD8: SKIPL T1,S.PRDE ;SEE IF /PRDEVICE MOVEM T1,LSTSTR ;YES--USE THAT SKIPL T1,S.PRDI ;SEE IF /PRDIRECTORY MOVEM T1,LSTDIR ;YES--USE THAT POPJ P, ;RETURN ;LSTRDR -- LIST STRUCTURE AND DIRECTORY IF APPROPRIATE ;CALL: PUSHJ P,LSTRDR ;RETURNS ;USES T1, T2, T3, T4, C, M LSTRDR: SKIPLE S.IND ;IF /INDIRECT, JRST [SKIPN S.PRDI ;DOES HE WANT DIRECTORY? POPJ P, ;NO - JUST RETURN NOW JRST FLBDIR] ;YES - PRINT DIRECTORY SANS PUSHJ P,.SAVE1 ;SAVE P1 MOVEI P1,0 ;SET TO NO OFFSET LSTRDX: SKIPN LSTSTR ;SEE IF APPROPRIATE TO LIST JRST FNSTR ;NO--PROCEED SKIPE T1,NOCHRS ;SEE IF INTO LINE JRST [CAIG T1,7 ;SEE IF AT LEAST COL 8 YET PUSHJ P,LTAB ;NO--MOVE OVER PUSHJ P,LTAB ;YES--POSITION JRST .+1] ;PROCEED SKIPE T2,FSTR(P1) PUSHJ P,LSIXCL ;DO SO IN SIXBIT WITH COLON FNSTR: SKIPN LSTDIR ;SEE IF TIME TO LIST POPJ P, ;NO--PROCEED FLDIR: SKIPE NOCHRS ;SEE IF INTO LINE PUSHJ P,LTAB ;FLBDIR -- SUBROUTINE TO LIST DIRECTORY INSIDE [] FLBDIR: SKIPN T4,UFDPPN(P1) ;IF UFD, POPJ P, ;(NO--RETURN) TLNN T4,-1 ;[454] PPN OR PATH POINTER? SKIPE .PTPPN(T4) ;[454] PATH POINTER, ANYTHING THERE? CAIA ;[454] VALID DIRECTORY, TYPE IT OUT POPJ P, ;[454] NULL DIRECTORY, DON'T LIST "[0]" MOVEI C,"[" PUSHJ P,LCHR PUSHJ P,LDIRB MOVEI C,"]" PJRST LCHR ;AND RETURN ;HERE AT END OF A NON-DISK DIRECTORY DIREND: PUSHJ P,DIRE ;OUTPUT SUMMARY AND TOTAL LINE TRZ F,R.WORD!R.NDSK ;CLEAR WORD MODE AND NOT DISK MOVE I,.WILAS ;GET END OF SET MOVEM I,I.NXRD ;SET FOR MASTER LOOP POPJ P, ;RETURN SUBTTL MISCELLANEOUS DIRECTORY SUBROUTINES ;ENDSUB -- ROUTINE TO CLEAN UP SUBTOTALS AT END ENDSUB: SKIPLE NUMSUB ;SEE IF SUBTOTALS ALREADY PJRST SUBTOT ;YES--DO SOME MORE PJRST SUBLOP ;NO--JUST CLEAN END OF WORK ;SUBTOT -- ROUTINE TO ISSUE SUBTOTALS ;USES T1-4 SUBTOT: SKIPN S.SUM ;SEE IF /NOSUM POPJ P, ;YES--NEVER GIVE IT PUSHJ P,.SAVE1 ;SAVE P1 SKIPE NOCHRS ;SEE IF AT START OF LINE PUSHJ P,LCRLF ;NO--END THIS LINE MOVEI P1,SUBT-TOT ;POINT TO SUBTOTALS SKIPLE FLFSUM ;SEE IF FORCED SUMMARY JRST SUBTDO ;YES--GO DO SUBTOTAL MOVEI T1,1 ;SET ONE CAML T1,SNFILF ;IF MORE THAN ONE FILE CAMGE T1,SNFILR ;OR MORE THAN ONE ERROR SUBTDO: PUSHJ P,TOTALS ;GO ISSUE SUBTOTALS ;HERE FROM END OF DISK TO MOVE SUBT. TO TOT. SUBLOP: SKIPN SNFILF ;SEE IF ANY FILE FOUND SKIPE SNFILR ;OR ANY ERRORS AOS NUMDIR ;COUNT DIRECTORY FOUND PUSH P,TCHKSM ;PRESERVE TOTAL CHECKSUM MOVSI T1,- ;SET COUNT TO COPY SUBTL: MOVE T2,SUBT(T1) ;GET SUBTOTAL ADDM T2,TOT(T1) ;ADD INTO TOTAL SETZM SUBT(T1) ;CLEAR SUBTOTAL AOBJN T1,SUBTL ;LOOP UNTIL DONE POP P,TCHKSM ;RESTORE TOTAL CHECKSUM SETZM SUBSTR ;CLEAR STRUCTURE FROM TOTAL POPJ P, ;RETURN ;DIRE -- OUTPUT EMPTY OR TOTAL LINE ;DIRET -- OUTPUT TOTAL LINE ;CALL: PUSHJ P,DIRE/DIRET ;USES T1-4 DIRE: PUSHJ P,ENDSUB ;FINISH LAST SUBTOTAL PUSHJ P,.TNEWL ;FORCE BEGINNING OF LINE MOVEI T1,[ASCIZ /Directory empty/] SKIPE NOFIL MOVEI T1,[ASCIZ /Directory has no such files/] SKIPN NOFILF JRST DIREL ;GO PRINT MESSAGE DIRET: PUSHJ P,ENDSUB ;FINISH LAST SUBTOTAL PUSHJ P,.TNEWL ;FORCE NEW LINE SKIPLE FLFSUM ;SEE IF FORCED SUMMARY JRST DIRETP ;YES--GO DO IT TRNE F,R.NDSK ;NO--SEE IF NOT DISK FORMAT JRST DIRELX ;RIGHT--NO SUMMARY MOVE T1,NOFILR ;GET NUMBER OF LOOKUP ERRORS MOVE T1,NOFILF ;SEE HOW MANY FILES FOUND CAILE T1,1 ;IF LE 1, NO SUMMARY NEEDED SKIPN NOBLKS ;SEE IF BLOCKS ACCUMULATED JRST DIRELX ;NO--JUST PRINT BLANK LINE AND RETURN DIRETP: SKIPN S.SUM ;SEE IF /NOSUM POPJ P, ;YES--NEVER DO IT SOSG NUMSUB ;SEE IF SUBTOTALS PUSHJ P,LCRLF ;NO--SEPARATE SUMMARY BY BLANK LINE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE PUSHJ P,.CLOSU## ;CLEAR ^O SUPPRESSION PUSHJ P,.SAVE1 ;SAVE P1 MOVEI P1,0 ;POINT TO TOTALS MOVEI T1,[ASCIZ / Grand total of /] SKIPGE T2,NUMSUB ;GET NUMBER OF SUBTOTALS JRST TOTALS ;IF NONE, DO TOTAL JUMPN T2,TOTALO ;IF SEVERAL, DO GRAND TOTAL MOVE T2,NUMDIR ;IF ONE, GET NUMBER OF DIRECTORIES CAIG T2,1 ;IF MORE THAN ONE, DO GRAND TOTAL JRST DIRELX ;NO--JUST EXIT JRST TOTALO ;YES--GIVE GRAND TOTAL ;TOTALS -- ROUTINE TO ISSUE EITHER SUB OR GRAND TOTALS ;CALL: MOVEI P1,0 FOR GRAND OR SUBT-TOT FOR SUBS ;USES T1-4 TOTALS: MOVEI T1,[ASCIZ / Total of /] TOTALO: SKIPN NOFILF(P1) ;SEE IF ANY FILES SKIPE NOFILR(P1) ; OR ERRORS SKIPA ;YES--OUTPUT LINE POPJ P, ;NO--SKIP TOTAL LINE TLO F,L.SBTT ;SUB/TOTALS LINE PRINTED PUSHJ P,.TSTRG ;PRINT HEADING AOS NUMSUB ;COUNT SUBTOTAL SKIPN NOFILF(P1) ;SEE IF ANY FILES JRST [SKIPN NOFILR(P1) ;NO--SEE IF ANY ERRORS JRST DIRETF ;NO--SAY 0 FILES JRST DIRETL] ;YES--TELL ALL TRNE F,R.FAST ;SEE IF /F SKIPLE S.SUM ; AND NOT /SUM SKIPA ;NO--DO THE OUTPUT JRST DIRETF ;YES--SKIP "N BLOCKS" TRNE F,R.WORD ;WORDS OR BLOCKS DESIRED? SKIPA T1,NOWRDS(P1) ;WORDS MOVE T1,NOBLKS(P1) ;BLOCKS PUSH P,T1 ;SAVE FOR MOMENT PUSHJ P,.TDECW## ;PRINT NUMBER OF BLOCKS MOVEI T1,[ASCIZ / block/] TRNE F,R.WORD ;SEE IF WORD MODE MOVEI T1,[ASCIZ / word/] PUSHJ P,.TSTRG## ;PRINT WORD OR BLOCK POP P,T2 ;GET BACK WORD/BLOCK COUNT MOVEI T1,"s" ;MAKE PLURAL IF NEEDED CAIE T2,1 ; .. PUSHJ P,.TCHAR## ;YES ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE MOVEI T1,[ASCIZ / in /] ;AND REST OF MESSAGE PUSHJ P,.TSTRG## ; .. DIRETF: MOVE T1,NOFILF(P1) ;GET NUMBER OF FILES PUSHJ P,.TDECW## ; FOUND AND PRINTED MOVEI T1,[ASCIZ / file/] PUSHJ P,.TSTRG## ;OUTPUT LINE MOVE T2,NOFILF(P1) ;GET NUMBER FOUND MOVEI T1,"s" ;GET PLURAL CAIE T2,1 ;SEE IF NOT ONE PUSHJ P,.TCHAR## ;YES--TYPE PLURAL SKIPG S.FIND ;IF /FIND THEN CHECKSUMS VALID ONLY FOR ;THE INDIVIDUAL FILES . . . SKIPG S.CHK ;SEE IF /CHECKSUM JRST DIRETC ;NO--PROCEED MOVE T1,TCHKSM(P1) ;GET AGGRAGATE CHECKSUM MOVEM T1,CHKSUM ;SET FOR PRINTOUT SETZM TCHKSM(P1) ;CLEAR FOR NEXT TIME MOVEI M,[ASCIZ / Checksum = /] PUSHJ P,LSTR PUSHJ P,LCHECK ;LIST CHECKSUM DIRETC: SKIPN NOFILR(P1) ;SEE IF ANY ERRORS JRST DIRELE ;NO--THAT'S ALL MOVEI T1,[ASCIZ / and /] PUSHJ P,.TSTRG## ;YES--ISSUE CONNECTIVE DIRETL: MOVE T1,NOFILR(P1) ;GET NUMBER OF ERRORS PUSHJ P,.TDECW## ;TYPE THE COUNTER MOVEI T1,[ASCIZ / LOOKUP error/] PUSHJ P,.TSTRG## ;TYPE LABEL MOVE T2,NOFILR(P1) ;GET COUNT MOVEI T1,"s" ;GET PLURAL CAIE T2,1 ;SEE IF NOT ONE PUSHJ P,.TCHAR## ;TYPE PLURAL JRST DIRELE ;AND GO FINISH DIREL: PUSHJ P,.TSTRG## DIRELE: MOVE T1,NUMDIR ;SEE HOW MANY DIRECTORIES CAILE T1,1 ;SEE IF MORE THAN ONE JUMPE P1,DIRELF ;YES--JUMP IF GRAND TOTAL SKIPN SUBSTR ;SEE IF DEVICE KNOWN JRST DIRELF ;NO--SKIP THIS LINE MOVEI T1,[ASCIZ / on /] PUSHJ P,.TSTRG## MOVE T1,SUBSTR ;GET STRUCTURE PUSHJ P,.TSIXN## ;LIST IT MOVEI T1,[ASCIZ /: /] PUSHJ P,.TSTRG## ;LIST SEPARATION MOVEI T1,SUBDIR ;POINT TO DIRECTORY PUSHJ P,.TDIRB## ;PRINT IT DIRELF: PUSHJ P,.TCRLF## DIRELX: SKIPG S.SUM ;UNLESS /SUMMARY, PUSHJ P,LCRLF ; GIVE A BLANK LINE POPJ P, ;RETURN DM FND,.FXLEN,0,0 DEFINE SWTCHS,< SP ACCESS,S.ACCS,.SWDEC##,ACC,FS.NFS!FS.LRG SN ACCOUNT,S.ACCT,FS.NFS SS *ALLOCATED,S.ALC,1,FS.NFS SN AUTHOR,S.AUT,FS.NFS ;SS *BLOCKS,S.WORD,0,FS.NFS SN CHECKSUM,S.CHK,FS.NFS SN COMPARE,S.CMP,FS.NFS SN DETAIL,S.DTL,FS.NFS SN DIRECT,S.DIRE,FS.NFS SN DTA,S.DTA,FS.NFS SN EOTS,S.EOT,FS.NFS SN ERLOG,S.ERLO,FS.NFS SS *FAST,,R.FAST/R.FAST,FS.NFS SP FILES,S.FILE,.SWDEC##,FIL,FS.NFS SN FIND,S.FIND,FS.NFS SN FLSDIR,S.FLSD,FS.NFS SN FNDBLD,S.FBLD,FS.NFS SP FNDDAT,F.BLK,.SWFIL##,FND,FS.NFS!FS.VRQ SN HDSDIR,S.HDSD,FS.NFS SN *INDIRECT,S.IND,FS.NFS SS *LIST,S.DODV,1,FS.NFS SN MARKS,S.MARK,FS.NFS SN MVOLUM,S.MVOL,FS.NFS SS *NORMAL,,0,FS.NFS SN PRDEVICE,S.PRDE,FS.NFS SN PRDIRECTORY,S.PRDI,FS.NFS SN PRVERSION,S.PRVE,FS.NFS SN RETRY,S.RETR,FS.NFS SN REWINDS,S.REWS,FS.NFS SN SBRMSG,S.SBRM,FS.NFS SS *SLOW,,R.SLOW/R.FAST,FS.NFS SN SORT,S.SORT,FS.NFS SN SUMMARY,S.SUM,FS.NFS SN TITLES,S.TITL,FS.NFS SN TMPCOR,S.TMPC,FS.NFS SN UNITS,S.UNIT,FS.NFS SP *WIDTH,S.WDTH,.SWDEC##,WID,FS.NFS SN WORDS,S.WORD,FS.NFS SS WRITTEN,S.ALC,0,FS.NFS > DOSCAN (DRSWT) SUBTTL SUBROUTINES FOR LISTING OUTPUT ;ERROR -- ROUTINE TO ISSUE ERROR MESSAGE WITH JUST TEXT ;ERRORC -- ROUTINE TO ISSUE ERROR MESSAGE WITH MORE STUFF ;WARN -- ROUTINE TO ISSUE WARNING MESSAGE ERROR: HRLI T2,(1B0) ;SET FLAG TO NOT RETURN ERRORC: TLOA T2,"?" ;SET FATAL ERROR CODE WARN: HRLI T2,"%" ;SET WARNING CODE HRLI T1,'DRT' ;SET DIRECT'S PREFIX PUSHJ P,.ERMSG## ;ISSUE MESSAGE JUMPGE T1,.POPJ## ;RETURN UNLESS ERROR ENTRY ;LFERX -- ROUTINE TO CLEAN UP AFTER FATAL ERROR ;THE ROUTINES IN SCAN CANNOT BE USED AFTER ANOTHER PUSHJ LFERX: PUSHJ P,.TCRLF## ;ISSUE FINAL RELEAS LC, ;BIND OFF LISTING RESET ;CLEAR I/O AND CORE ASSIGNMENTS JRST MAINLP ;AND TRY AGAIN ;TITLER -- PLACE PAGE TITLE IF USER REQUESTED ONE ;CALLED AT START OF FIRST PAGE AND END OF EACH PAGE BUT LAST ;CALL: PUSHJ P,TITLER TITLER: PUSHJ P,SAVTYP ;CLEAR R.TYPE AND SAVE OLD VALUE PUSH P,M ;PRESERVE POINTER PUSH P,C ;PRESERVE CHARACTER SKIPG S.TITL ;SEE IF TITLES ON JRST TITLEY ;NO--RETURN MOVEI M,LN$LPP+2 ;RESET LINES THIS PAGE COUNT MOVEM M,LNPP ; .. TRON F,R.LSOM ;SEE IF FIRST CALL JRST TITLEH ;YES--SKIP BIND-OFF OF PREVIOUS PAGE MOVEI C,.CHFFD ;EJECT TO NEW PAGE PUSHJ P,LCHR ; .. ;HERE WHEN IT IS DESIRED TO OUTPUT A PAGE HEADER TITLEH: PUSH P,T1 ;SAVE T1-P1 PUSH P,T2 PUSH P,T3 PUSH P,T4 PUSH P,P1 MOVEI M,[ASCIZ / Directory listing /] PUSHJ P,LSTR ;SEND START OF LINE 1 DATE T4, ;GET CURRENT DATE PUSHJ P,LDATE ;PRINT IT PUSHJ P,LTAB ;SPACE OVER MSTIME T4, ;GET CURRENT TIME IDIVI T4,^D60000 ;CONVERT TO MINUTES PUSH P,P1 ;SAVE REMAINDER PUSHJ P,LTIME ;PRINT TIME (HH:MM) POP P,T1 ;RESTORE REMAINDER IDIVI T1,^D1000 ;CONVERT TO SECONDS PUSHJ P,LTIMES ;PRINT SECONDS (:SS) MOVEI M,[ASCIZ / Page /] PUSHJ P,LSTR ;SPACE OVER TO PAGE NUMBER AOS T1,PAGCNT ;GET NEXT PAGE NUMBER PUSHJ P,LDEC2 ;LIST IT TRNE F,R.NDSK ;SEE IF NOT A DISK JRST TITLEX ;RIGHT--SKIP SUBTITLE PUSHJ P,LCRLF ;END OF LINE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;HERE WHEN FIRST LINE HAS BEEN PRINTED, DO THE REST MOVEI M,[ASCIZ /Name Extension/] PUSHJ P,LSTR TRNE F,R.FAST JRST TITLEX TRNE F,R.WORDS ;[451] /WORDS SPECIFIED? PUSHJ P,LSPC4 ;[451] YES, ALLOW FOR WIDER COLUMN MOVEI M,[ASCIZ / Len Prot /] PUSHJ P,LSTR MOVEI M,[ASCIZ /Checksum/] SKIPLE S.CHK PUSHJ P,LSTR MOVEI M,[ASCIZ / Creation/] TRNE F,R.SLOW MOVEI M,[ASCIZ / Access ---Creation--- Mode/] PUSHJ P,LSTR MOVEI M,[ASCIZ / Version/] SKIPE S.PRVE ;SKIP IF /NOPRVERSION PUSHJ P,LSTR ;VERSION MOVEI M,[ASCIZ/ Account String/] SKIPLE S.ACCT PUSHJ P,LSTR MOVEI M,[ASCIZ/ Author/] SKIPLE S.AUT ;NEED AN AUTHOR FIELD? PUSHJ P,LSTR ;AUTHOR MOVEI M,[ASCIZ/ Device/] ;NO SKIPN S.PRDE ;IF /NOPRDEVICE JRST TITLE5 ;THEN NO DEVICE FIELD EVER SKIPG S.PRDE ;IF /PRDEVICE SKIPLE S.FLSD ;OR /FLSDIR PUSHJ P,LSTR ;DEVICE TITLE5: MOVEI M,[ASCIZ/ Directory/] SKIPN S.PRDI ;IF /NOPRDIRECTORY JRST TITLE6 ;THEN NO DIRECTORY FIELD EVER SKIPG S.PRDI ;IF /PRDIRECTORY SKIPLE S.FLSD ;OR /FLSDIR PUSHJ P,LSTR ; [DIRECTORY] TITLE6: ;SPOOLNAME HERE IF FIGURE OUT ;WHAT TO DO WITH IT . . . ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE TITLEX: POP P,P1 ;RESTORE THE ACS POP P,T4 POP P,T3 POP P,T2 POP P,T1 PUSHJ P,LCRLF ;ISSUE END OF LINE TLZ F,L.CRLF ;TURN OFF CRLF SUPPRESS FLAG PUSHJ P,LCRLF ;AND A BLANK LINE TITLEY: SKIPGE LNPP ;SEE IF FIRST TIME JRST [HRLOI C,377777 ;YES--SET COUNTER HIGH MOVEM C,LNPP ;YES--CLEAR FLAG SKIPG S.SUM ;UNLESS /SUMMARY, PUSHJ P,LCRLF ;YES--SKIP ONE LINE JRST .+1] ; AND CONTINUE POP P,C ;RESTORE CHARACTER POP P,M ;RESTORE POINTER POPJ P, ;RETURN ;LDIRB -- LIST DIRECTORY IN SFD FORMAT ;CALL: MOVE T4,CONTENTS OF UFDPPN ; PUSHJ P,LDIRB ;USES T1, T2, T3, T4, C LDIRB: JUMPE T4,.POPJ## ;GIVE UP IF BLANK JUMPL T4,[MOVE T2,T4 ;IF SIXBIT, TYPE IT PJRST LSIXN] TLNE T4,-1 ;SEE IF SFD POINTER JRST [PUSH P,[[0]-3] ;NO--JUST DO UFD JRST LDIRBU] PUSH P,T4 ;SAVE ARGUMENT MOVE T4,2(T4) ;GET UFD IN PATH LIST LDIRBU: JUMPL T4,[MOVE T2,T4 ;IF SIXBIT, TYPE IT MOVEI T3,6 ;SET FOR 6 CHARS SKIPLE S.SORT PUSHJ P,LSIXC ; IF /SORT, DO 6 CHARS SKIPG S.SORT PUSHJ P,LSIXN JRST LDIRBR] SKIPG S.SORT ;IF NOT /SORT JRST LDIRBN ; PROCEED BELOW HLRZ T1,T4 ;IF /SORT, PUSHJ P,LOCT6Z ; DO FIXED FORMAT MOVEI C,"," ;SEPARATE HALVES PUSHJ P,LCHR ; WITH A COMMA HRRZ T1,T4 ;THEN DO PUSHJ P,LOCT6Z ; RIGHT HALF JRST LDIRBR ;CONTINUE BELOW LDIRBN: PUSHJ P,LXWD ;TYPE UFD LDIRBR: POP P,T4 ;RESTORE ARGUMENT HRLI T4,-.FXLND+1 ;SET MAX LIST LENGTH LDIRB1: SKIPN T2,3(T4) ;GET NEXT SFD IN PATH POPJ P, ;IF NONE, RETURN MOVEI C,"," ;YES--TYPE COMMA PUSHJ P,LCHR ; .. MOVEI T3,6 ;SET FIXED LENGTH SKIPLE S.SORT ;IF /SORT PUSHJ P,LSIXC ; DO FIXED SKIPG S.SORT ;ELSE, PUSHJ P,LSIXN ; AND SFD AOBJN T4,LDIRB1 ;LOOP UNTIL DONE POPJ P, ;RETURN ;LVER -- LIST WORD IN VERSION NUMBER FORMAT ;CALL: MOVE T4,WORD ; PUSHJ P,LVER ;USES T1, T2, T3, T4, C LVER: LDB T1,[POINT 9,T4,11] ;GET MAJOR VERSION SKIPE T1 ;IF NON-ZERO, PUSHJ P,LOCT ; PRINT IN OCTAL LDB T1,[POINT 6,T4,17] ;GET MINOR VERSION JUMPE T1,LVER2 ;IF NON-ZERO, SOS T1 ;OFFSET IDIVI T1,^D26 ; PRINT IN ALPHA JUMPE T1,LVER1 ; ONE OR TWO MOVEI C,"A"-1(T1) ; CHARACTERS PUSHJ P,LCHR ; .. LVER1: MOVEI C,"A"(T2) ; .. PUSHJ P,LCHR ; .. LVER2: HRRZ T1,T4 ;GET EDIT NUMBER JUMPE T1,LVER3 ;IF NON-ZERO, MOVEI C,"(" ; PRINT ( PUSHJ P,LCHR ; .. PUSHJ P,LOCT ; IN OCTAL MOVEI C,")" ; AND ) PUSHJ P,LCHR ; .. LVER3: LDB T1,[POINT 3,T4,2] JUMPE T1,.POPJ## ;IF CUST. NUMBER NON-ZERO, MOVEI C,"-" ; PRINT - PUSHJ P,LCHR ; .. PJRST LOCT ; AND NUMBER ;LAUT -- LIST THE AUTHOR FIELD ;CALL: PUSHJ P,LAUT ;USES T1-4,C LAUT: SKIPN T2,FAUT ;SEE IF ANYTHING THERE PJRST LTAB ;NO--JUST ISSUE TAB PJUMPL T2,LSIXT ;IF SIXBIT, ISSUE AS SUCH HLRZ T1,T2 ;ELSE GET PROJECT SKIPG S.SORT ;SEE IF /SORT PUSHJ P,LOCT6B ;NO SKIPLE S.SORT ;ELSE PUSHJ P,LOCT6Z ;YES MOVEI C,"," ;SEPARATOR PUSHJ P,LCHR ;TO FILE HRRZ T1,FAUT ;GET PROGRAMMER SKIPG S.SORT ;SEE IF /SORT PJRST LOCT ;NO PJRST LOCT6Z ;YES ;LCHECK -- ROUTINE TO LIST THE ACCUMULATED CHECKSUM ;CALL: PUSHJ P,LCHECK ;USES T1, T2, T3, C LCHECK: HLRZ T1,CHKSUM ;YES--COMBINE HALVES HRRZ T2,CHKSUM ;GET RH SETZM CHKSUM ;CLEAR CHECKSUM FOR NEXT FILE ADD T2,T1 ;ADD HLRZ T1,T2 ;GET CARRY ADDI T1,(T2) ;COMBINE PJRST LOCT6Z ;LIST AS 6 DIGIT OCTAL AND RETURN ;GCHECK -- ROUTINE TO GET THE ACCUMULATED CHECKSUM ;CALL: PUSHJ P,GCHECK ;USES T1, T2, T3 GCHECK: HLRZ T1,CHKSUM ;COMBINE HALVES HRRZ T2,CHKSUM ;GET RH ADD T2,T1 ;ADD HLRZ T1,T2 ;GET CARRY ADDI T1,(T2) ;COMBINE ANDI T1,-1 ;REDUCE TO 6 DIGITS POPJ P, ;RETURN ;LXWD -- LIST WORD IN XWD FORMAT (N,N) ;CALL: MOVE T4,WORD ; PUSHJ P,LXWD ;USES T1, T2, T3, C LXWD: HLRZ T1,T4 ;GET LEFT HALF JUMPE T1,LXWD1 ;SKIP FIRST PART IF 0 PUSHJ P,LOCT ;OUTPUT LH IN OCTAL MOVEI C,"," ;SEND SEPARATOR PUSHJ P,LCHR LXWD1: HRRZ T1,T4 ;DO RIGHT HALF PJRST LOCT ;IN OCTAL AND RETURN L6XWD: HLRZ T1,T4 ;GET LEFT HALF PUSHJ P,LOCT6Z ;OUTPUT LH IN OCTAL MOVEI C,"," ;SEND SEPARATOR PUSHJ P,LCHR HRRZ T1,T4 ;DO RIGHT HALF PJRST LOCT6Z ;IN OCTAL AND RETURN ;LOCT6Z -- LIST 6 OCTAL DIGITS WITH LEADING ZEROS ;LOCTZ -- LIST N OCTAL DIGITS WITH LEADING ZEROS ;CALL: (MOVE T2,MASK OF LARGEST NUMBER IF LOCTZ) ; MOVE T1,NUMBER ; PUSHJ P,LOCT6Z/LOCTZ ;USES T1, T2, T3, C LOCT6Z: MOVEI T2,-1 ;PRESET FOR 6 DIGITS LOCTZ: LSH T2,-3 ;COUNT DOWN MASK SKIPE T2 ;SEE IF ALL DONE CAMLE T1,T2 ;SEE IF DONE YET PJRST LOCT ;REST ARE NON-ZERO PUSHJ P,LZER ;NO--TYPE A ZERO JRST LOCTZ ;AND GO AROUND AGAIN ;LOCT6B -- SAME ONLY LEADING BLANKS ;LOCTB -- SAME ONLY BLANKS LOCT6B: MOVEI T2,-1 ;SET FOR 6 DIGITS LOCTB: LSH T2,-3 ;COUNT DOWN MASK SKIPE T2 ;SEE IF ALL DONE CAMLE T1,T2 ;SEE IF DONE YET PJRST LOCT ;REST ARE NON-ZERO PUSHJ P,LSPC ;NO--TYPE A SPACE JRST LOCTB ;AND GO AROUND AGAIN ;LDATE -- OUTPUT DATE IN FORM DD-MMM-YY ;CALL: MOVE T4,DATE IN SYSTEM FORMAT ; PUSHJ P,LDATE ;USES T1, T2, T3, T4, M, C LDATE: PUSHJ P,.SAVE1 ;SAVE P1 SKIPE S.SORT ;SEE IF /SORT JRST LDATEN ;YES--USE SORTABLE FORMAT JUMPE T4,LDATEZ ;JUMP IF NO DATE IDIVI T4,^D31 ;GET DAY MOVEI T1,1(P1) PUSHJ P,LDEC2 IDIVI T4,^D12 ;GET MONTH MOVE T1,[ASCII /-Jan--Feb--Mar--Apr--May--Jun--Jul--Aug--Sep--Oct--Nov--Dec-/](P1) MOVEI T2,0 MOVEI M,T1 PUSHJ P,LSTR MOVEI T1,^D64(T4) ;GET YEAR IDIVI T1,^D100 ;GET YEAR IN CENTURY MOVE T1,T2 ;GET REMAINDER PJRST LDEC2Z ;OUTPUT YEAR AND RETURN LDATEZ: MOVEI M,[ASCIZ /(undated)/] PJRST LSTR ;HERE WHEN /SORT TO USE ANSI FORMAT: YYYYMMDD LDATEN: PUSHJ P,LSPC ;SPACE ONE TO USE SAME WIDTH IDIVI T4,^D31 ;GET DAYS MOVE T2,P1 ;SAVE FOR LATER IDIVI T4,^D12 ;GET MONTHS VS. YEARS MOVEI T1,^D1964(T4) ;START WITH YEARS A.D. IMULI T1,^D100 ;MAKE ROOM FOR MONTHS ADDI T1,1(P1) ;INCLUDE MONTHS (1=JAN) IMULI T1,^D100 ;MAKE ROOM FOR DAYS ADDI T1,1(T2) ;INCLUDE DAYS PJRST LDEC ;OUTPUT THIS MESS ;LDATIM -- OUTPUT DATE AND TIME IN FORM DD-MMM-YY HH:MM:SS ;CALL: MOVE T1,TIME RETURNED BY .CNTDT## ; MOVE T4,DATE RETURNED BY .CNTDT## ; PUSHJ P,LDATIM ;USES T1, T2, T3, T4, M, C LDATIM: PUSH P,T1 ;SAVE TIME MOVE T4,T2 ;POSITION DATE PUSHJ P,LDATE ;LIST DATE PUSHJ P,LSPC ;SPACE OVER POP P,T4 ;RESTORE TIME IDIVI T4,^D60000 ;GET MINS PUSHJ P,LTIME ;LIST HH:MM MOVE T1,P1 ;GET MILLI-SECS IDIVI T1,^D1000 ;CONVERT TO SECS PJRST LTIMES ;LIST :SS ;LOCT3Z -- LIST OCTAL 3 DIGITS (LEADING ZEROS) ;LOCT2Z -- DITTO 2 DIGITS ;CALL: MOVEI T1,NUMBER ; PUSHJ P,LOCT3Z/2Z ;USES T1, T2, T3, C LOCT3Z: CAIGE T1,100 ;TEST FOR FIRST ZERO PUSHJ P,LZER ;YES--DO IT LOCT2Z: CAIGE T1,10 ;SEE IF NEXT PUSHJ P,LZER ;YES--DO IT PJRST LOCT ;THEN FINISH NUMBER ;LDECP -- LIST DECIMAL (POSSIBLY NEGATIVE) FOLLOWED BY . ;CALL: MOVE T1,NUMBER ; PUSHJ P,LDECP ;USES T1, T2, T3, C LDECP: JUMPGE T1,LDECPP ;JUMP IF NOT NEGATIVE MOVEI C,"-" ;TYPE MINUS PUSHJ P,LCHR ; SIGN MOVMS T1 ;AND MAKE POSITIVE LDECPP: PUSHJ P,LDEC ;LIST DECIMAL NUMBER MOVEI C,"." ;LIST . PJRST LCHR ;TO INDICATE DECIMAL NUMBER ;LOCT2 -- LIST OCTAL AT LEAST TWO DIGITS ;CALL: MOVEI T1,NUMBER ; PUSHJ P,LOCT2 ;USES T1, T2, T3, C LOCT2: CAIGE T1,10 ;SEE IF LARGE ENOUGH PUSHJ P,LSPC ;NO--SEND A SPACE PJRST LOCT ;SEND IN OCTAL ;LTIME -- OUTPUT TIME IN FORM HH:MM ;LTIMEB-- OUTPUT TIME OR BLANKS IF 00:00 ;LTIMES-- OUTPUT JUST ":DD" FOR SECONDS CALL ;LSECS -- OUTPUT TIME IN FORM HH:MM:SS ;LMSECS-- DITTO WITH INPUT IN MILLISEC. ;CALL: (MOVE T4,TIME IN MINUTES FOR LTIME/LTIMEB) ; (MOVE T1,SECONDS FOR LTIMES) ; (MOVE T4,TIME IN SECONDS FOR LSECS) ; (MOVE T1,TIME IN MSEC FOR LMSECS) ; PUSHJ P,LTIME ;USES T1, T2, T3, T4, C LSECS: SKIPA T1,T4 ;MOVE ARGUMENT LMSECS: IDIVI T1,^D1000 ;CONVERT TO SECONDS IDIVI T1,^D60 ;GET HH:MM PART PUSH P,T2 ;SAVE SECONDS MOVE T4,T1 ;POSITION HH:MM PUSHJ P,LTIME ;ISSUE HH:MM POP P,T1 ;RESTORE SECONDS PJRST LTIMES ;ISSUE :SS AND RETURN LTIMEB: JUMPE T4,LSPC5 ;IF 0, PRINT BLANKS LTIME: PUSHJ P,.SAVE1 ;SAVE P1 IDIVI T4,^D60 ;GET HOURS MOVE T1,T4 PUSHJ P,LDEC2 ;LIST HOURS MOVE T1,P1 ;LIST MINUTES LTIMES: PUSHJ P,LCOLON ;FALL INTO LDEC2Z ;LDEC2Z -- LIST DECIMAL AT LEAST 2 DIGITS WITH LEADING ZERO ;CALL: MOVEI T1,NUMBER ; PUSHJ P,LDEC2Z ;USES T1, T2, T3, C LDEC2Z: CAIGE T1,^D10 ;TEST TO SEE IF NEEDED PUSHJ P,LZER ;YES--SEND ZERO PJRST LDEC ;GO FINISH WORK ;LDEC9 -- LIST DECIMAL AT LEAST NINE DIGITS ;LDEC8 -- LIST DECIMAL AT LEAST EIGHT DIGITS ;LDEC7 -- LIST DECIMAL AT LEAST SEVEN DIGITS ;LDEC6 -- LIST DECIMAL AT LEAST SIX DIGITS ;LDEC5 -- LIST DECIMAL AT LEAST FIVE DIGITS ;LDEC4 -- LIST DECIMAL AT LEAST FOUR DIGITS ;LDEC3 -- LIST DECIMAL AT LEAST THREE DIGITS ;LDEC2 -- LIST DECIMAL AT LEAST TWO DIGITS ;CALL: MOVEI T1,NUMBER ; PUSHJ P,LDEC2 ;USES T1, T2, T3, C LDEC9: CAMGE T1,[^D100000000];WILL IT FIT IN 9 DIGITS? PUSHJ P,LSPC ;NO, EMIT A SPACE FILLER THEN LDEC8: CAMGE T1,[^D10000000] ;SEE IF GREATER THAN 8 DIGITS PUSHJ P,LSPC ;No. type a space then. LDEC7: CAMGE T1,[^D1000000] ;See if greater than 7 digits. PUSHJ P,LSPC ;No. type a space then. LDEC6: CAIGE T1,^D100000 ;See if greater than 6 digits. PUSHJ P,LSPC ;No. type a space then. LDEC5: CAIGE T1,^D10000 ;See if greater than 5 digits. PUSHJ P,LSPC ;No. type a space then. LDEC4: CAIGE T1,^D1000 ;SEE IF NEEDED PUSHJ P,LSPC LDEC3: CAIGE T1,^D100 PUSHJ P,LSPC LDEC2: CAIGE T1,^D10 PUSHJ P,LSPC ;YES PJRST LDEC ;GO LIST IN DECIMAL ;LDEC -- LIST DECIMAL NUMBER ;LOCT -- LIST OCTAL NUMBER ;LRDX -- LIST VIA PRESET RADIX ;CALL: MOVEI T1,NUMBER ; (MOVEI T3,RADIX LRDX ONLY) ; PUSHJ P,LDEC/LOCT/LRDX ;USES T1, T2, T3, C LOCT: JUMPGE T1,LOCTC ;IF POS, EASY TO DO MOVE T2,T1 ;NO--USE OTHER WAY MOVEI T3,^D12 ;SET DIGIT COUNT LOCTL: MOVEI T1,0 ;CLEAR RESULT LSHC T1,3 ;GET NEXT DIGIT MOVEI C,"0"(T1) ;CONVERT TO ASCII PUSHJ P,LCHR ;OUTPUT IT SOJG T3,LOCTL ;AND LOOP UNTIL DONE POPJ P, ;RETURN LDEC: SKIPA T3,[^D10] ;INITIALIZE FOR DECIMAL RADIX LOCTC: MOVEI T3,10 ;INITIALIZE FOR OCTAL RADIX LRDX: IDIV T1,T3 ;DIVIDE BY RADIX HRLM T2,(P) ;SAVE REMAINDER SKIPE T1 ;SEE IF ANYTHING LEFT PUSHJ P,LRDX ;YES--LOOP BACK WITH PD LIST HLRZ C,(P) ;GET BACK A DIGIT ADDI C,"0" ;CONVERT TO ASCII PJRST LCHR ;GO LIST IT ;LCRLF - LIST END OF LINE ;CALL: PUSHJ P,LCRLF ;USES M, C LCRLF: TLNE F,L.CRLF ;HAVE WE DONE A CRLF? JRST [TRZ F,R.SPLN ;THIS SATISFIES EOL FOR R.SPLN POPJ P,] ;RETURN EMPTY HANDED MOVEI M,[ASCIZ / /] ;FALL INTO LSTR ;LSTR - LIST ASCII STRING ;CALL: MOVEI M,STRING (END WITH 0 BYTE) ; PUSHJ P,LSTR ;USES M, C LSTR: TLOA M,(POINT 7,) ;CONVERT TO BYTE POINTER LSTR1: PUSHJ P,LCHR ;OUTPUT CHARACTER ILDB C,M ;GET NEXT CHARACTER JUMPN C,LSTR1 ;LOOP UNLESS NULL POPJ P, ;RETURN ;LSIXT -- LIST SIXBIT WORD FOLLOWED BY TAB ;CALL: MOVE T2,WORD ; PUSHJ P,LSIXT ;USES T1, T2, C LSIXT: PUSHJ P,LSIX ;OUTPUT WORD PJRST LTAB ;GO OUTPUT TAB AND RETURN ;LSIXCL -- LIST SIXBIT WORD FOLLOWED BY COLON ;CALL: MOVE T2,WORD ; PUSHJ P,LSIXCL ;USES T1, T2, C LSIXCL: PUSHJ P,LSIX ;ISSUE IN SIXBIT LCOLON: MOVEI C,":" ;GET COLON PJRST LCHR ;ISSUE AND RETURN ;LSIX -- LIST SIXBIT WORD (AT LEAST ONE SPACE) ;LSIXN -- SAME EXCEPT 0 GIVES NO SPACES ;CALL: MOVE T2,WORD ; PUSHJ P,LSIX/LSIXN ;USES T1, T2, C LSIX: MOVEI T1,0 ;CLEAR NEXT CHARACTER LSHC T1,6 ;FETCH NEXT CHAR PUSHJ P,LCHRS ;LIST IT IN SIXBIT LSIXN: JUMPN T2,LSIX ;LOOP UNTIL ONLY BLANKS LEFT POPJ P, ;RETURN ;LSIXC -- LIST SIXBIT WORD FIXED NUMBER OF CHARACTERS ;CALL: MOVE T2,WORD ; MOVEI T3,NUM CHARS TO PRINT ; PUSHJ P,LSIXC ;USES T1, T2, T3, C LSIXC: MOVEI T1,0 ;CLEAR NEXT CHAR LSHC T1,6 ;GET NEXT CHAR PUSHJ P,LCHRS ;LIST IT IN SIXBIT SOJG T3,LSIXC ;LOOP UNTIL DONE POPJ P, ;RETURN ;LSPC2 -- LIST TWO SPACES ;LSPC4 -- LIST FOUR SPACES ;LSPC5 -- LIST FIVE SPACES ;CALL: PUSHJ P,LSPC2 ;USES C LSPC5: PUSHJ P,LSPC ;SPACE ONE LSPC4: PUSHJ P,LSPC ;SPACE ONE MORE LSPC3: PUSHJ P,LSPC ;SPACE ANOTHER ONE LSPC2: PUSHJ P,LSPC ;DO ONE PJRST LSPC ;DO ANOTHER AND RETURN ;LCOMMA -- LIST A COMMA ;CALL: PUSHJ P,LCOMMA ;USES C LCOMMA: MOVEI C,"," ;GET CHARACTER PJRST LCHR1 ;GO LIST IT ;LZER -- LIST A ZERO ;CALL: PUSHJ P,LZER ;USES C LZER: MOVEI C,"0" ;GET CHARACTER PJRST LCHR1 ;GO LIST IT ;LTAB -- LIST TAB ;LSPC -- LIST SPACE ;LCHR -- LIST CHARACTER ;LCHRS -- LIST CHARACTER IN SIXBIT ;CALL: (MOVEI C,CHARACTER IF LCHR) ; (MOVEI T1,CHARACTER IF LCHRS) ; PUSHJ P,LTAB/LSPC/LCHR ;USES C EXCEPT LCHR USES NO AC'S LCHRS: MOVEI C," "-' '(T1) ;CONVERT TO ASCII AND MOVE TO C LCHR: CAIE C,.CHTAB ;SEE IF A TAB JRST LCHR1 ;NO--GO SEND IT LTAB: TRZN F,R.STAB ;KILL TAB IF SO REQUESTED TRON F,R.LTAB ;SET/TEST TAB POPJ P, ;RETURN IF NOT TWO IN A ROW LTAB1: SKIPA C,[.CHTAB] ;GET THE TAB LSPC: MOVEI C," " ;GET THE SPACE LCHR1: SKIPGE LNPP ;SEE IF AT END OF PAGE PUSHJ P,TITLER ;YES--GO ISSUE PAGE HEADER CAIN C,.CHCRT ;SEE IF CARRIAGE RETURN TRZ F,R.LTAB ;YES--CLEAR TAB MEMORY CAIN C,.CHLFD ;SEE IF END OF LINE JRST [SOS LNPP ;YES--DECREMENT LINES PER PAGE TLO F,L.CRLF ;SET ON CRLF SEEN FLAG. TRZE F,R.SPLN ;STOP SUPPRESSING LINE JRST LCHR4 ;FINISH LAST SUPPRESSION JRST .+1] ;AND PROCEED SKIPLE S.CMP ;IF /COMPARE, JRST [SKIPN S.FUFD ;AND PRINTING A "UFD". SKIPE NOCHRS ; AND AT START OF LINE JRST .+1 ;NO--PROCEED CAIE C,"%" ;YES--IF WARNING CAIN C,"?" ; OR ERROR TRO F,R.SPLN ; SUPPRESS CAIE C,.CHCRT ;IF BLANK LINE, OR CAIN C," " ;IF BLANK, TRO F,R.SPLN ; SUPPRESS JRST .+1] ;AND PROCEED TRNE F,R.SPLN ;IF SUPPRESSING, JRST LCHR4 ; HANDLE EXIT ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE TRZE F,R.LTAB ;CLEAR TAB MEMORY JRST LCHR5 ;IF SET, GO ISSUE ONE CAIE C,.CHCRT ;IS IT A CR? CAIN C,.CHLFD ;OR A LINE FEED? SKIPA ;YES. DON'T TURN OFF THE FLAG. TLZ F,L.CRLF ;ELSE. RESET IT. AOS NOCHRS ;ADVANCE CHARACTER POSITION COUNTER CAIE C,.CHTAB ;SEE IF TAB JRST LCHR3 ;NO--PROCEED BELOW PUSH P,T1 ;YES--SAVE AN AC MOVE T1,NOCHRS ;GET CHARACTER COUNTER ADDI T1,7 ;ROUND UP TRZ T1,7 ;ROUND OFF SUB T1,NOCHRS ;FIND EXCESS ADDM T1,NOCHRS ;UPDATE CHARACTER COUNTER SKIPE T1 ;IF NO FILLING SKIPN S.SORT ; OR NOT /SORT JRST LCHR2 ; DON'T FILL IN SPACES MOVEI C," " ;GET A SPACE PUSHJ P,LCHR3 ;OUTPUT IT SOJG T1,.-1 ;LOOP FOR ENOUGH SPACE MOVEI C,.CHTAB ;RESTORE THE TAB LCHR2: POP P,T1 ;RESTORE AC ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE LCHR3: SKIPN S.DIRE ;/NODIRECT? JRST LCHR4 ;YES, NO LISTING OUTPUT CAIL C,.CHLFD ;SEE IF VERTICAL MOTION CAILE C,.CHFFD ; .. JRST .+2 ;NO SETZM NOCHRS ;YES--CLEAR POSITION SOSG B.LC+.BFCTR ;SEE IF ROOM IN THE BUFFER PUSHJ P,LCHRW ;NO--GO WRITE THIS BUFFER IDPB C,B.LC+.BFPTR ;YES--SEND CHARACTER SKIPN NOCHRS ;SEE IF END OF LINE PUSHJ P,LCHRWL ;YES--OUTPUT BUFFER IF APPROPRIATE LCHR4: TRNN F,R.TYPE ;SEE IF NEED TO DUPLICATE POPJ P, ;NO--RETURN PUSH P,T1 ;PRESERVE TEMP MOVE T1,C ;GET CHARACTER PUSHJ P,.TTCHR ;YES--TYPE IT (IF NOT SAME) POP P,T1 ;RESTORE TEMP POPJ P, ;RETURN LCHR5: PUSH P,C ;SAVE REQUESTED CHARACTER PUSHJ P,LTAB1 ;SEND A TAB POP P,C ;RESTORE CHARACTER JRST LCHR1 ;PROCEED LCHRWL: TRNE F,R.OUTL ;SEE IF OUTPUT APPROPRIATE FOR EACH END OF LINE LCHRW: OUT LC, ;OUTPUT BUFFER POPJ P, ;OK--RETURN LCHRWR: PUSH P,T1 ;ERROR--SAVE SOME ACS PUSH P,T2 ; .. PUSH P,T3 ; .. PUSH P,F ;SAVE F TRZ F,R.OUTO!R.OUTD ;CLEAR OUTPUT FLAGS N$WRNX (LOE,Listing device output error,) GETSTS LC,T1 ;GET ERROR STATUS PUSH P,T1 ;SAVE THE STATUS HRLI T1,LC ;SUPPLY THE CHANNEL TOO PUSHJ P,IOERM ;ISSUE REST OF ERROR STATUS POP P,T1 ;GET BACK THE STATUS TXZ T1,IO.EOF!IO.ERR;CLEAR OFFENSIVE BITS SETSTS LC,(T1) ;AND TELL MONITOR TO CLEAR ERROR STATUS X$$LOE: PUSHJ P,.TCRLF## ;AND END LINE POP P,F ;RESTORE THE ACS POP P,T3 ; .. POP P,T2 ; .. POP P,T1 ; .. POPJ P, ;RETURN SUBTTL MISCELLANEOUS I/O ROUTINES ;FNDIN -- SUBROUTINE TO OPEN THE FIND INPUT FILES ;USES T1 - T4 FNDIN: MOVEI T1,F.BLK ;/FNDDAT SCAN BLOCK MOVEI T2,F.OPN ;OPEN BLOCK MOVE T3,[F.LEN,,F.LKP] ;FILE LOOKUP BLOCK MOVEI T4,F.PTH ;DIRECTORY PATH BLOCK PUSHJ P,.STOPB## ;SETUP OPEN AND LOOKUP BLOCKS JRST [N$FAIL (FWI,/FNDDAT wildcards illegal)] MOVX T1,.IOBIN ;FIND FILES ARE BINARY IORM T1,F.OPN ;SET I/O MODE MOVEI T1,B.DG ;DATA FILE INPUT BUFFER RING HEADER MOVEM T1,F.OPN+.OPBUF ;SET IN OPEN BLOCK OPEN DG,F.OPN ;OPEN FIND FILE INPUT DEVICE JRST E.OPF ;OPEN FAILURE MOVEI T1,F.LEN-1 ;LENGTH OF LOOKUP BLOCKS MOVEM T1,F.LKP+.RBCNT ;SET IN LOOKUP BLOCK MOVE T4,F.LKP+.RBPPN ;PRESERVE PATH ACCROSS LOOKUP MOVSI T1,'FDF' ;DATA FILE TYPE MOVEM T1,F.LKP+.RBEXT ;SET IN LOOKUP BLOCK LOOKUP DG,F.LKP ;DO FILE LOOKUP JRST E.LKF ;LOOKUP FAILURE ;NOW GET THE POINTER FILE MOVEI T1,B.PG ;POINTER FILE INPUT BUFFER RING HEADER MOVEM T1,F.OPN+.OPBUF ;SET IN OPEN BLOCK OPEN PG,F.OPN ;OPEN POINTER FILE DEVICE JRST E.OPF ;OPEN FAILURE HERE? MOVEM T4,F.LKP+.RBPPN ;USE SAME PATH AS DATA FILE MOVSI T1,'FPF' ;POINTER FILE EXTENSION MOVEM T1,F.LKP+.RBEXT ;SET IN LOOKUP BLOCK LOOKUP PG,F.LKP ;LOOKUP POINTER FILE JRST E.LKF ;LOOKUP FAILED HERE? INBUF DG,1 ;WANT ONLY ONE BUFFER FOR USETI INBUF PG, ;BUT LOTS ARE OK FOR POINTER FILE SETZM DGWRD ;INITIALLY ON WORD 0 SETOM DGBLK ;OF BLOCK 0 (I.E., BLOCK 1) TLZ F,L.FEOF ;CLEAR END OF FILE FLAG POPJ P, ;FIND INPUT DATA FILES READY TO BE READ E.OPF: MOVE P3,F.BLK+.FXDEV ;GET FIND DEVICE N$FAIN (OPF,Find File input OPEN failure for device ) E.LKF: MOVEI T1,'LKF' ;FIND LOOKUP ERROR PREFIX SETZ T2, ;NO TEXT HERE PUSHJ P,ERRORC ;TYPE OUT ERROR PREFIX TXNN T1,JWW.FL ;WANT FIRST LINE INFO? JRST LFERX ;NO, ABORT NOW HRRZ T1,F.LKP+.RBEXT ;YES, GET LOOKUP ERROR CODE PUSHJ P,.LKERR## ;TYPE OUT ERROR CODE MOVEI T1,[ASCIZ/ Find input file /] PUSHJ P,.TSTRG## ;TYPE OUT MORE ENGLISH TEXT MOVEI T1,F.OPN ;ADDRESS OF OPEN BLOCK MOVEI T2,F.LKP ;ADDRESS OF LOOKUP BLOCK PUSHJ P,.TOLEB## ;TYPE OUT THE FILE SPEC JRST LFERX ;CAP OFF THE ERROR ;OUTIN -- SUBROUTINE TO OPEN THE OUTPUT LISTING FILE ;USES T1-4 OUTIN: MOVE T1,[O.LZER,,O.BLK] ;POINT TO OUTPUT SPEC MOVEI T2,O.LC ;POINT TO OUTPUT OPEN BLOCK MOVE T3,[LE.LC-1,,E.LC] ;POINT TO OUTPUT ENTER BLOCK PUSHJ P,.STOPN## ;SETUP BLOCKS JRST E.OWI ;ERROR IF WILD-CARDS MOVSI T1,B.LC ;GET BUFFER HEADERS MOVEM T1,O.LC+.OPBUF ;STORE IN OPEN BLOCK MOVE T4,E.LC+.RBPPN ;SAVE OUTPUT PATH SKIPN S.DIRE ;/NODIRECT? JRST OUTIN4 ;YES, CHECK FOR FNDBLD OPEN LC,O.LC ;OPEN DEVICE JRST E.OPO MOVE T1,O.BLK+.FXNAM ;ENTER IF NEEDED JUMPE T1,OUTIN2 MOVEI T1,0 ;LONG OFFSET TLNN F,L.LENT ;IF SHORT ENTER, MOVEI T1,2 ; SET SHORT OFFSET ENTER LC,E.LC(T1) ;ENTER FILE JRST E.OPE OUTIN2: OUTBUF LC,0 ;SETUP STANDARD BUFFERS ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE OUTIN4: SKIPG S.FBLD ;/FNDBLD? JRST OUTIN8 ;NO, SKIP THIS STUFF MOVEI T1,.IOBIN ;/FNDBLD FILES ARE BINARY MOVEM T1,O.LC ;SO SET IN OPEN BLOCK MOVSI T1,B.DF ;DATA FILE BUFFER HEADER MOVEM T1,O.LC+.OPBUF ;SET IN OPEN BLOCK OPEN DF,O.LC ;OPEN DATA FILE CHANNEL JRST E.OPO ;OPEN FAILURE MOVEM T4,E.LC+.RBPPN ;USE SAME CREATION PATH MOVSI T1,'FDF' ;FIND DATA FILE EXTENSION HLLM T1,E.LC+.RBEXT ;SET IN ENTER BLOCK ENTER DF,E.LC ;ENTER THE FILE JRST E.OPE ;ENTER FAILURE OUTBUF DF,0 ;SET UP BUFFER RING MOVSI T1,B.PF ;POINTER FILE BUFFER HEADER MOVEM T1,O.LC+.OPBUF ;SET IN OPEN BLOCK OPEN PF,O.LC ;OPEN POINTER FILE CHANNEL JRST E.OPO ;OPEN FAILURE MOVEM T4,E.LC+.RBPPN ;USE SAME CREATION PATH MOVSI T1,'FPF' ;FIND POINTER FILE EXTENSION HLLM T1,E.LC+.RBEXT ;SET IN ENTER BLOCK ENTER PF,E.LC ;ENTER POINTER FILE JRST E.OPE ;ENTER FAILURE OUTBUF PF,0 ;SETUP BUFFER RING OUTIN8: TRO F,R.OUTD ;INDICATE OUTPUT INITIALIZED POPJ P, ;RETURN E.OWI: TRZ F,R.OUTD!R.OUTO!R.OUTL ;CLEAR LISTING FLAGS N$FAIL (OWI,Output wildcard illegal) E.OPO: IFN FT$LPW,< ; MOVE T1,O.BLK+.FXDEV ;SEE WHAT TYPE DEVCHR T1, ; OF DEVICE TXNN T1,DV.LPT ;IS IT LINE PRINTER JRST E.OPO1 ;NO--FAIL TRON F,R.LPTB ;YES--SECOND TIME? OUTSTR [ASCIZ /LPT busy--waiting /] MOVEI T1,5 ;SLEEP 5 SECONDS AND TRY AGAIN SLEEP T1, ; .. JRST OUTIN1 ; .. E.OPO1: >;END IFN FT$LPW TRZ F,R.OUTD!R.OUTO!R.OUTL ;CLEAR LISTING FLAGS MOVE P3,O.BLK+.FXDEV N$FAIN (OPO,Output OPEN failed on device) E.OPE: TRZ F,R.OUTD!R.OUTO!R.OUTL ;CLEAR LISTING FLAGS MOVE P3,O.BLK+.FXNAM N$FAIN (OPE,Output ENTER failed on file) ;.TNEWL -- FORCE LISTING OUTPUT TO START OF LINE ;CALL: PUSHJ P,.TNEWL ;RETURNS AT BEGINNING OF LINE ;PRESERVES ALL ACS .TNEWL::TRNE F,R.OUTD ;SEE IF OUTPUT SKIPN NOCHRS ;YES--SEE IF AT START OF LINE POPJ P, ;YES--RETURN PJRST LCRLF ;NO--OUTPUT END OF LINE ;TCHR -- TYPE CHARACTER ON TTY ;CALL: MOVEI T1,CHARACTER ; PUSHJ P,TCHR ;PRESERVES ALL ACS TCHR: PUSHJ P,SAVTYP ;SAVE R.TYPE AND CLEAR IT MOVE C,T1 ;(TEMP) TRNN F,R.OUTD ;SEE IF OUTPUT JRST TTCHR1 ;NOT OPEN--FORCE TO TTY PUSHJ P,LCHR ;YES--LIST CHARACTER .TTCHR: TRNN F,R.OUTO ;SEE IF LISTING ON CONSOLE TTCHR1: OUTCHR T1 ;NO--TYPE IT ALSO POPJ P, ;RETURN ;SAVTYP -- ROUTINE TO SAVE R.TYPE ON THE STACK AND CLEAR IT ; THIS AVOIDS TYPING TITLES AND DOUBLE LISTINGS ;CALL: PUSHJ P,SAVTYP ;RETURNS CPOPJ. SETS STACK TO RESTORE R.TYPE WHEN CALLER ; RETURNS (CPOPJ OR CPOPJ1) ;PRESERVES ALL ACS SAVTYP: EXCH T1,(P) ;GET CALLING PC MOVEM T1,1(P) ;STASH AWAY FOR THE NEXT CALL MOVE T1,(P) ;RESTORE T1 SETZM (P) ;FLAG R.TYPE=0 TRZE F,R.TYPE ;CLEAR R.TYPE SETOM (P) ;FLAG THAT IT WAS ON PUSHJ P,@1(P) ;CALL BACK TO CALLER JRST .+2 ;HANDLE NON-SKIP AOS -1(P) ;HANDLE SKIP SKIPE (P) ;TEST MEMORY OF FLAG TRO F,R.TYPE ;RESTORE R.TYPE POP P,(P) ;DISCARD MEMORY POPJ P, ;RETURN TO CALLER'S CALLER SUBTTL SUBROUTINES FOR FIND FILE(S) OUTPUT ;DOFND -- WRITE FILE INTO FIND FILES ;CALL FROM ANALYZ WITH F--- AREA SET UP WITH FILE INFO. ; ;THERE ARE TWO FIND FILES, THE POINTER FILE AND THE DATA FILE. ; ;THE POINTER FILE HAS ONLY FILENAME/EXTENSIONS AND IS USED TO ;SEE WHERE TO GO WITHIN DATA FILE FOR FILE INFORMATION. FORMAT IS: ; ; 0/ FILE NAME IN SIXBIT ; 1/ EXTENSION IN SIXBIT,,0 ; ;THE DATA FILE HAS ALL THE PERTINENT INFORMATION ABOUT THE ACTUAL ;FILE. FORMAT IS: ; ; 00/ NODE NAME IN SIXBIT (RESERVED FOR FUTURE) ; 01/ DEVICE/STRUCTURE NAME IN SIXBIT ; 02/ UFD ; 03/ SFD 1 ; 04/ SFD 2 ; 05/ SFD 3 ; 06/ SFD 4 ; 07/ SFD 5 ; 10/ FILE NAME ; 11/ EXTENSION,,PROTECTION & I/O MODE (LH OF .RBPRV) ; 12/ WORD COUNT ; 13/ CREATION TIME ; 14/ ACCESS TIME ; 15/ VERSION ; 16/ 0 (RESERVED FOR FUTURE) ; 17/ CHECKSUM DOFND: MOVEI T1,0 ;NODE NAME (RESERVED) PUSHJ P,DFPUT ;WORD 0 MOVE T1,FSTR ;FILE STRUCTURE PUSHJ P,DFPUT ;WORD 1 SKIPN T1,UFDPPN ;[454] UFD/PATH POINTER JRST DOFND1 ;[454] BLANK, WRITE OUT 0'S TLNN T1,-1 ;UFD OR PATH POINTER? JRST DOFND2 ;PATH POINTER DOFND1: PUSHJ P,DFPUT ;[454] WORD 2 MOVEI T1,0 ;NO SFD'S PUSHJ P,DFPUT ;WORD 3 PUSHJ P,DFPUT ;WORD 4 PUSHJ P,DFPUT ;WORD 5 PUSHJ P,DFPUT ;WORD 6 PUSHJ P,DFPUT ;WORD 7 JRST DOFND4 ;FINISH RECORD DOFND2: MOVEI T2,.PTPPN(T1) ;ADDRESS OF UFD/SFD'S (6 WORDS MAX) HRLI T2,-6 ;UFD + 5 SFD'S DOFND3: SKIPN T1,(T2) ;GET UFD/SFD SOJ T2, ;0 TERMINATES LIST PUSHJ P,DFPUT ;WORDS 2 - 7 AOBJN T2,DOFND3 ;LOOP FOR WHOLE PATH DOFND4: MOVE T1,FNAM ;FILE NAME PUSHJ P,DFPUT ;WORD 10 PUSHJ P,PFPUT ;POINTER FILE WORD 0 MOVE T1,FFPRV ;SPECIAL PROTECTION CODE LSH T1,^D9 ;POSITION PROTECTION SKIPN FFPRV ;SPECIAL PROTECTION CODE? HLRZ T1,FPRV ;NO, GET FROM FILE BLOCK SKIPGE FFPRV ;IS PROTECTION UNKNOWN? SETZ T1, ;YES HLL T1,FEXT ;EXTENSION,,PROTECTION+I/O MODE PUSHJ P,DFPUT ;WORD 11 ANDCMI T1,-1 ;EXTENSION,,0 PUSHJ P,PFPUT ;POINTER FILE WORD 1 MOVE T1,FSIZ ;FILE SIZE (WORDS) PUSHJ P,DFPUT ;WORD 12 LDB T1,[POINTR FCRE,RB.CRT] ;CREATION TIME IMULI T1,^D60*^D1000 ;(.CNVDT WANTS MILLISECONDS) LDB T2,[POINTR FCRE,RB.CRD] ;CREATION DATE LDB T4,[POINTR FCRX,RB.CRX] ;CREATION DATE EXTENSION DPB T4,[POINT 3,T2,23] ;REST OF CREATION DATE PUSHJ P,.CNVDT## ;CONVERT TO UNIVERSAL DATE/TIME PUSHJ P,DFPUT ;WORD 13 MOVEI T1,0 ;ACCESS TIME UNKNOWN LDB T2,[POINTR FACD,RB.ACD] ;ACCESS DATE PUSHJ P,.CNVDT## ;CONVERT TO UNIVERSAL DATE/TIME PUSHJ P,DFPUT ;WORD 14 MOVE T1,FVER ;VERSION WORD PUSHJ P,DFPUT ;WORD 15 SETZ T1, ;0 PUSHJ P,DFPUT ;WORD 16 PUSHJ P,GCHECK ;GET FILE CHECKSUM PJRST DFPUT ;WORD 17 AND END OF RECORD ;DFPUT -- WRITE ONE WORD INTO DATA FILE ;CALL WITH T1/DATA WORD ;RETURN CPOPJ0 DFPUT: SOSGE B.DF+.BFCTR ;ROOM? JRST DFPUT2 ;NO IDPB T1,B.DF+.BFPTR ;YES POPJ P, ;RETURN DFPUT2: OUT DF, ;GET NEXT BUFFER JRST DFPUT ;AND STUFF WORD IN DFERR: GETSTS DF,P3 ;I/O ERROR, I/O STATUS HRLI P3,DF ;AND ASSOCIATED CHANNEL N$FAIO (DOE,Find Data File output error,) ;PFPUT -- WRITE ONE WORD INTO POINTER FILE ;CALL WITH T1/DATA WORD ;RETURN CPOPJ0 PFPUT: SOSGE B.PF+.BFCTR ;ROOM? JRST PFPUT2 ;NO IDPB T1,B.PF+.BFPTR ;YES POPJ P, ;RETURN PFPUT2: OUT PF, ;GET NEXT BUFFER JRST PFPUT ;AND STUFF WORD IN PFERR: GETSTS PF,P3 ;I/O ERROR, I/O STATUS HRLI P3,PF ;AND I/O CHANNEL N$FAIO (POE,Find Pointer File output error,) ;DFGET -- READ ONE WORD FROM DATA FILE ;RETURNS NEXT DATA WORD IN T1 DFGET: SOSGE B.DG+.BFCTR ;ANY WORDS LEFT? JRST DFGET2 ;NO, GO TO NEXT BUFFER ILDB T1,B.DG+.BFPTR ;READ NEXT WORD AOS DGWRD ;REMEMBER HOW FAR INTO BLOCK WE HAVE READ POPJ P, ;RETURN DFGET2: AOS DGBLK ;REMEMBER HOW MANY BLOCK WE HAVE READ IN DG, ;READ NEXT BUFFER JRST DFGET ;AND RETURN THE FIRST WORD STATO DG,IO.EOF ;REACH END OF FILE? JRST DFGET4 ;NO, I/O ERROR TLO F,L.FEOF ;YES, NOTE EOF REACHED SETZ T1, ;RETURN ZILCH POPJ P, ;RETURN IT NOW DFGET4: PUSHJ P,.PSH4T## ;SAVE THE T ACS GETSTS DG,T1 ;GET THE I/O ERROR STATUS PUSH P,T1 ;SAVE A COPY N$WRNX (DFI,Find Data File input error,) MOVE T1,0(P) ;FETCH A COPY OF THE STATUS HRLI T1,DG ;SET THE I/O CHANNEL TOO PUSHJ P,IOERM ;ISSUE I/O STATUS X$$DFI: PUSHJ P,.TCRLF## ;CAP OFF ERROR MESSAGE POP P,T1 ;RESTORE I/O STATUS TXZ T1,IO.ERR ;CLEAR OUT ERROR BITS SETSTS DG,(T1) ;AND TELL MONITOR TO CONTINUE WITH I/O PUSHJ P,.POP4T## ;RESTORE TEMP ACS JRST DFGET ;AND PROCESS WHAT DATA WE GOT ;PFGET -- READ ONE WORD FROM POINTER FILE ;RETURNS NEXT POINTER WORD IN T1 PFGET: SOSGE B.PG+.BFCTR ;ANY WORDS LEFT? JRST PFGET2 ;NO, GO TO NEXT BUFFER ILDB T1,B.PG+.BFPTR ;READ NEXT WORD POPJ P, ;RETURN PFGET2: IN PG, ;READ NEXT BUFFER JRST PFGET ;AND RETURN THE FIRST WORD STATO PG,IO.EOF ;REACH END OF FILE? JRST PFGET4 ;NO, I/O ERROR TLO F,L.FEOF ;YES, NOTE EOF REACHED SETZ T1, ;RETURN ZILCH POPJ P, ;RETURN IT NOW PFGET4: PUSHJ P,.PSH4T## ;SAVE THE T ACS GETSTS PG,T1 ;READ I/O STATUS PUSH P,T1 ;SAVE A COPY N$WRNX (PFI,Find Pointer File input error,) MOVE T1,0(P) ;RETRIEVE A COPY OF I/O STATUS HRLI T1,PG ;AND I/O CHANNEL IN QUESTION PUSHJ P,IOERM ;ISSUE I/O STATUS MESSAGE X$$PFI: PUSHJ P,.TCRLF## ;CAP OFF ERROR MESSAGE POP P,T1 ;RESTORE I/O STATUS TXZ T1,IO.ERR ;CLEAR OUT ERROR BITS SETSTS PG,(T1) ;AND TELL MONITOR TO CONTINUE WITH I/O PUSHJ P,.POP4T## ;RESTORE TEMP ACS JRST PFGET ;AND PROCESS WHAT DATA WE GOT ;MAKBUF -- ROUTINE TO MAKE A BUFFER RING ;CALL: HRLI T1,NUMBER OF BUFFERS ; HRRI T1,SIZE OF EACH (***EXCLUDES*** OVERHEAD CONTROL WORDS) ; MOVEI T2,LOCATION OF BUFFER HEADER ; PUSHJ P,MAKBUF ;RETURNS UNLESS NOT ENOUGH CORE MAKBUF: PUSHJ P,.SAVE2## ;SAVE P1 AND P2 HRRI T1,3(T1) ;ALLOW FOR BUFFER CONTROL WORDS HLRZ P1,T1 ;GET BUFFER COUNT MOVEI T3,(T1) ;GET BUFFER SIZE TLZ T1,-1 ;CLEAR JUNK IMUL T1,P1 ;GET TOTAL SPACE PUSHJ P,GETCOR ;GET CORE AT .JBFF MOVE P2,T1 ;SAVE OLD .JBFF AOS T1 ;POINT TO LINK WORD MOVE T4,T1 ;AND MAKE A COPY HRLI T4,-2(T3) ;PUT SIZE IN POINTERS MAKBF1: ADD T4,T3 ;ADVANCE TO NEXT BUFFER MOVEM T4,(T1) ;STORE POINTER IN PREVIOUS BUFFER MOVE T1,T4 ;STEP TO NEXT BUFFER SOJG P1,MAKBF1 ;LOOP UNTIL DONE SUB T1,T3 ;BACKUP TO LAST POINTER HRRI T4,1(P2) ;GET FIRST BUFFER LINK WORD ADDRESS MOVEM T4,(T1) ;STORE POINTER TO FIRST BUFFER HRLI T4,(1B0) ;SET USE BIT MOVEM T4,(T2) ;STORE IN HEADER POPJ P, ;RETURN ;GETCOR -- ROUTINE TO GET SOME CORE AT .JBFF ;WILL EXPAND LOW SEG IF NECESSARY ;CALL: MOVEI T1,AMOUNT NEEDED ; PUSHJ P,GETCOR ;RETURN WITH T1=START OF AREA (OLD .JBFF) GETCOR: PUSH P,T2 ;SAVE TEMP MOVE T2,T1 ;GET ARG MOVE T1,.JBFF ;SAVE OLD .JBFF ADDM T2,.JBFF ;ADVANCE .JBFF GTCOR1: MOVE T2,.JBFF ;GET AMOUNT NEEDED CAMG T2,.JBREL ;SEE IF MORE THAN WE HAVE JRST GTCOR2 ;NO--OK TO RETURN CORE T2, ;TELL MONITOR JRST E.NEC ;ERROR--TELL USER JRST GTCOR1 ;LOOP TO VERIFY IT'S OK GTCOR2: POP P,T2 ;RESTORE TEMP POPJ P, ;RETURN E.NEC: MOVE P3,.JBFF ;GET VALUE NEEDED N$FAID (NEC,Not enough core--need) SUBTTL STORAGE XLIST ;LITERALS LIT LIST RELOC OFFSET: BLOCK 1 ;STARTING ADDRESS OFFSET ZCOR:! ;START OF AREA TO ZERO ON INITIAL LOAD PDLST: BLOCK LN$PDL+1 ;PUSH DOWN LIST SAVCOR: BLOCK 1 ;LENGTH OF CORE ORIGINALLY ORGFF: BLOCK 1 ;ORIGINAL .JBFF H.ZER:! ;START OF AREA FOR OUTPUT PARAMETERS O.LC: BLOCK 3 ;LISTING OPEN BLOCK E.LC: BLOCK 1+.RBEST ;LISTING ENTER BLOCK LE.LC==.-E.LC B.LC: BLOCK 3 ;DIRECTORY FILE OUTPUT BUFFER RING HEADER B.DF: BLOCK 3 ;DATA FILE OUTPUT BUFFER RING HEADER B.PF: BLOCK 3 ;POINTER FILE OUTPUT BUFFER RING HEADER B.DG: BLOCK 3 ;DATA FILE INPUT BUFFER RING HEADER DGBLK: BLOCK 1 ;LOGICAL DATA BLOCK WITHIN DATA FILE DGWRD: BLOCK 1 ;WORD WITHIN BLOCK WITHIN DATA FILE B.PG: BLOCK 3 ;POINTER FILE INPUT BUFFER RING HEADER F.OPN: BLOCK 3 ;FIND INPUT OPEN BLOCK F.LKP: BLOCK .RBEST+1 ;FIND INPUT FILE LOOKUP BLOCK F.LEN==.-F.LKP F.PTH: BLOCK .PTMAX ;FIND INPUT PATH BLOCK LNPP: BLOCK 1 ;LINES LEFT TO GO ON PAGE PAGCNT: BLOCK 1 ;PAGE COUNTER SVJBFF: BLOCK 1 ;INPUT SIDE .JBFF LWIFIR: BLOCK 1 ;LAST .WIFIR FRCLOK: BLOCK 1 ;.NE. 0 THEN LOOKUP REQUIRED FOR THIS FILE H.ZER1:! ;START OF AREA FOR ONE OUTPUT DCHBLK: BLOCK .DCSNM+1 ;DSKCHR BLOCK FOBLK: BLOCK .FOMAX ;FILOP. BLOCK FSTR==FOBLK+.FODEV ;ADDRESS OF "FILE STRUCTURE" LBLOCK: BLOCK LN$RIB ;EXTENDED LOOKUP BLOCK FRVER: BLOCK 1 ;RIB VERSION IF DIFF. FROM FILE FFPRV: BLOCK 1 ;FILE PRIVILEGE FRIBLK: BLOCK 1 ;RIB BLOCK NUMBER MTNAME: BLOCK 1 ;DEVICE NAME OF MAG-TAPE MTXDEV: BLOCK 2 ;SAVED ORIGINAL DEVICE SPEC BI-WORD ABORTI: BLOCK 1 ;SETOM'ED IF SHOULD ABORT INPUT AMWCNT: BLOCK 1 ;[462] COUNT OF SILLY FILES THIS SAVE SET BFHD: BLOCK 3 ;BUFFER HEADERS FOR INPUT H.ZERX: BLOCK .-H.ZER1 ;REGION FOR PREVIOUS FILE H.ZERY: BLOCK .PTMAX ; .. MTPATH: BLOCK .PTMAX ;FOR PATH ON TAPES MTSVFF: BLOCK 1 ;.JBFF AT FIRST MTOPEN MTFBSZ: BLOCK 1 ;TAPE BLOCKSIZE (PLUS 3 OVERHEAD WORDS) H.MZER:! ;START OF AREA FOR ONE MT SAVE SET MTSVHD: BLOCK 1 ;LAST WORD READ FOR FAILSAFE MODE MTSVVR: BLOCK 1 ;VERSION,,TAPE NUMBER MTSVWD: BLOCK 1 ;SAVE HEADERS DURING BACKUP TAPES MTSVCT: BLOCK 1 ;COUNTER FOR BACKUP DATA READS LASI: BLOCK 1 ;LAST FILE FOUND LASDIR: BLOCK 1 ;LAST DIRECTORY LISTED LASSTR: BLOCK 1 ;LAST STRUCTURE LISTED LASPTH: BLOCK .PTMAX ;ROOM FOR PREVIOUS PATH THSPTH: BLOCK .PTMAX ;ROOM FOR CURRENT PATH SUBDIR: BLOCK 1 ;SUBTOTAL DIRECTORY SUBSTR: BLOCK 1 ;SUBTOTAL STRUCTURE SUBPTH: BLOCK .PTMAX ;SUBTOTAL PATH SUBEND==.-1 NOFIL: BLOCK 1 ;NUMBER OF FILES IN UFDS SCANNED TOT:! ;GRAND TOTALS NOFILF: BLOCK 1 ;NUMBER OF FILES ACTUALLY USED NOFILR: BLOCK 1 ;NUMBER OF LOOKUP ERRORS NOBLKS: BLOCK 1 ;NUMBER BLOCKS IN FILES PRINTED NOWRDS: BLOCK 1 ;NUMBER WORDS IN FILES PRINTED TCHKSM: BLOCK 1 ;GRAND CHECKSUM SUBT:! ;SUB TOTALS SNFILF: BLOCK 1 ; (MUST PARALLEL AND IMMED. FOLLOW TOT) SNFILR: BLOCK 1 SNBLKS: BLOCK 1 SNWRDS: BLOCK 1 ;WORD COUNT SCHKSM: BLOCK 1 NUMDIR: BLOCK 1 ;NUMBER OF DIRECTORIES NUMSUB: BLOCK 1 ;NUMBER OF SUBTOTALS CHKSUM: BLOCK 1 ;CHECKSUM ACCUMULATOR NOCHRS: BLOCK 1 ;CURRENT HORIZONTAL POSITION LSTSTR: BLOCK 1 ;STR TO LIST IF NEEDED LSTDIR: BLOCK 1 ;DIRECTORY TO LIST IF NEEDED NXUCNT: BLOCK 1 ;COUNT OF UFDS FOUND NXSCNT: BLOCK 1 ;COUNT OF SFDS MISSED NXFCNT: BLOCK 1 ;COUNT OF FILES FOUND NXFI: BLOCK 1 ;I OF LAST NON-EX FILE H.EMZR==.-1 KCHKSM: BLOCK 1 ;TEMP CHKSUM MTFLCT: BLOCK 1 ;COUNT DOWN ON MT FROM /FILE:N DSLOET: BLOCK 1 ;[475] ERROR OUTPUT INTERCEPT FLAG/ADDR ;BACKUP/FRS FORMAT HEADER STORAGE AREAS B$GTYP: BLOCK 1 ;RH=TYPE, LH=-1 IF FRS B$GBNM: BLOCK 1 ;BLOCK NUMBER B$GRTN: BLOCK 1 ;RELATIVE TAPE NUMBER B$GFLG: BLOCK 1 ;FLAGS B$GCHK: BLOCK 1 ;CHECKSUM B$GSIZ: BLOCK 1 ;DATA SIZE B$GLND: BLOCK 1 ;OVERHEAD WORDS BLOCK 5 ;(FUTURE) WASTE SPACE ;LABEL HEADER B$LBL:! B$LCDT: BLOCK 1 ;CREATION DATE/TIME B$LFRM: BLOCK 1 ;FORMAT STYLE B$LFVR: BLOCK 1 ;FRS/BACKUP VERSION NUMBER B$LMTY: BLOCK 1 ;MONITOR TYPE B$LSVR: BLOCK 1 ;SYSTEM VERSION B$LAPR: BLOCK 1 ;APR S/N WRITTEN ON B$LDEV: BLOCK 1 ;DEVICE WRITTEN ON B$LMTC: BLOCK 1 ;MTCHR. B$LREL: BLOCK 1 ;REEL B$LDDT: BLOCK 1 ;DESTROY DATE/TIME BLOCK ^D10 ;WASTE SPACE B$LTIM: BLOCK 1 ;TIME B$LDAT: BLOCK 1 ;DATE B$LDSD: BLOCK 1 ;DESTROY DATE B$LCMT: BLOCK 16 ;COMMENT BLOCK 1 ;PROTECT ASCIZ ;START/END OF SAVE SET B$SSS:! B$SCDT: BLOCK 1 ;SAVE DATE/TIME B$SFMT: BLOCK 1 ;TAPE FORMAT B$SVER: BLOCK 1 ;BACKUP/FRS VERSION B$SMTY: BLOCK 1 ;MONITOR TYPE B$SSVR: BLOCK 1 ;SYSTEM VERSION B$SAPR: BLOCK 1 ;SAVE APR S/N B$SDEV: BLOCK 1 ;DEVICE SAVED ON B$SMTC: BLOCK 1 ;SAVE MTCHR. B$SREL: BLOCK 1 ;REELID BLOCK ^D11 ;WASTE SPACE B$SSNM: BLOCK 5 ;SYSTEM NAME B$STIM: BLOCK 1 ;SAVE TIME B$SDAT: BLOCK 1 ;SAVE DATE B$SMOD: BLOCK 1 ;MODE B$STRK: BLOCK 1 ;TRACKS B$SNAM: BLOCK 1 ;SAVE SET NAME B$SCMT: BLOCK 4 ;COMMENT BLOCK 1 ;PROTECT ASCIZ ;DIRECTORY RECORD B$DIR:! B$UPCH: BLOCK 1 ;PATH CHECKSUM B$ULVL: BLOCK 1 ;DIRECTORY LEVEL (0=UFD) B$USTA: BLOCK ^D12 ;DIRECTORY NAME BLOCK 6 ;WASTE SPACE B$USTR: BLOCK 1 ;STRUCTURE OF DIRECTORY ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;FILE RECORD B$FIL:! B$FPCH: BLOCK 1 ;PATH CHECKSUM B$FRDW: BLOCK 1 ;RELATIVE DATA WORD B$FPTH: BLOCK ^D12 ;REDUNDANT PATH BLOCK 6 ;WASTE SPACE B$FSTR: BLOCK 1 ;STRUCTURE B$FNAM: BLOCK 1 ;NAME B$FEXT: BLOCK 1 ;EXTENSION B$FUFD: BLOCK 1 ;UFD B$FRBN: BLOCK 1 ;RELATIVE BLOCK NUMBER B$FCHK: BLOCK 1 ;CHECKSUM B$FNDB: BLOCK 1 ;NUMBER OF DATA BLOCKS B$FNDW: BLOCK 1 ;NUMBER OF DATA WORDS B$FLVL: BLOCK 1 ;FILE DIRECTORY LEVEL ;END OF VOLUME B$EOV: BLOCK ^D20 ;WASTE SPACE ;COMMENT B$CMT: BLOCK ^D20 ;COMMENT BLOCK 1 ;PROTECT ASCIZ ;VARIOUS "DATA" REGION BLOCKS B$BNAM: BLOCK ^D30 ;FILE PATH B$BATT: BLOCK ^D50 ;FILE ATTRIBUTES B$BSYS: BLOCK ^D6 ;SYSTEM NAME B$BSSN: BLOCK ^D7 ;SAVE SET NAME ;MULTI-VOLUME HOLD WORDS FOR VERIFICATION B$HRTN: BLOCK 1 ;VERIFICATION OF B$GRTN B$HSSN: BLOCK 7 ;VERIFICATION OF B$BSSN H.EZER==.-1 S.MIN:! ;START OF AREA FOR COMMAND ACCUMULATION S.ACCS: BLOCK 1 ;VALUE OF /ACCESS SWITCH S.ACCT: BLOCK 1 ;/ACCOUNT SWITCH S.ALC: BLOCK 1 ;/ALLOCAT SWITCH S.AUT: BLOCK 1 ;/AUTHOR SWITCH S.CHK: BLOCK 1 ;/CHECKSUM SWITCH S.CMP: BLOCK 1 ;/COMPARE SWITCH S.DODV: BLOCK 1 ;CODE FOR DEFAULT OUTPUT DEVICE S.DTL: BLOCK 1 ;/DETAIL SWITCH S.DIRE: BLOCK 1 ;/DIRECT SWITCH S.DTA: BLOCK 1 ;/DTA SWITCH (.GT. 0 LIST IN SHORT DTA FORMAT) S.EOT: BLOCK 1 ;/EOT SWITCH S.ERLO: BLOCK 1 ;/ERLOG SWITCH S.FILE: BLOCK 1 ;/FILES:N SWITCH S.FIND: BLOCK 1 ;/FIND SWITCH S.FLSD: BLOCK 1 ;/FLSDIR SWITCH S.FBLD: BLOCK 1 ;/FNDBLD SWITCH S.HDSD: BLOCK 1 ;/HDSDIR SWITCH S.IND: BLOCK 1 ;/INDIRECT SWITCH S.MARK: BLOCK 1 ;/MARKS SWITCH S.MVOL: BLOCK 1 ;/MVOLUME SWITCH S.PRDE: BLOCK 1 ;/PRDEVICE SWITCH S.PRDI: BLOCK 1 ;/PRDIRECTORY SWITCH S.PRVE: BLOCK 1 ;/PRVERSION SWITCH S.RETR: BLOCK 1 ;/RETRY SWITCH S.REWS: BLOCK 1 ;/REWINDS SWITCH S.SBRM: BLOCK 1 ;[465] /SBR MESSAGE(S) DESIRED S.SORT: BLOCK 1 ;/SORT SWITCH S.SUM: BLOCK 1 ;/SUMMARY SWITCH S.TITL: BLOCK 1 ;-1,1=TITLE, 0=2=NO TITLE S.TMPC: BLOCK 1 ;/TMPCOR (.GT. 0 LIST IN SHORT TMPCOR FORMAT) S.UNIT: BLOCK 1 ;/UNITS SWITCH S.WDTH: BLOCK 1 ;VALUE OF /WIDTH SWITCH S.WORD: BLOCK 1 ;/[NO]WORD SWITCH S.LENT: BLOCK 1 ;USED TO HOLD THE MAXIMUN LENGTH OF AN ENTRY. FLFSUM: BLOCK 1 ;FORCE SUMMARY IF 1 S.EMIN==.-1 S.ZER:! S.FUFD: BLOCK 1 ;USED WITH /COMPARE TO FORCE ;THE PRINTING OF UFD DIRECTORIES ;EG: DIRECTORY [1,1]/COMPARE O.ZER:! ;START OF OUTPUT SPEC STORAGE O.BLK: BLOCK .FXLEN ;OUTPUT FILE SPEC BLOCK O.LZER==.-O.ZER ;THE FIND (/FNDDAT) INPUT SCAN BLOCK F.BLK: BLOCK .FXLEN ;FIND FILE SPEC BLOCK I.INZR: BLOCK 1 ;POINTER TO START OF INPUT SPEC I.NXZR: BLOCK 1 ;POINTER TO NEXT INPUT SPEC STORAGE I.NXRD: BLOCK 1 ;POINTER TO NEXT INPUT SPEC TO DO FLAGS: BLOCK 1 ;COPY OF F DURING SCAN FLAGSM: BLOCK 1 ;DITTO--MASKS MXWDTH: BLOCK 1 ;MAX WIDTH IF /W BLOCK 2 ;ROOM FOR BUFFER HEADERS DIRB: BLOCK LN$BLK ;DIRECTORY BLOCK FOR DECTAPE/ETC. IFN FT$MTL,< M.MTLB: BLOCK .TPLEN ;LABEL PARAMETERS AREA MTAEOF: BLOCK 1 ;NEW FILE FLAG >;END INF FT$MTL S.EZER==.-1 EZCOR==.-1 ;END OF AREA TO ZERO END DIRECT