TITLE NULL - COVER MODULE COMMENT\ THIS MODULE REPRESENTS WORK DONE IN THE PUBLIC DOMAIN. THEREFORE, THIS MODULE IS NOT COPYRIGHTED BY DIGITAL EQUIPMENT CORP. \ PRGEND TITLE DTADIR - DECTAPE DIRECTORY PRINTER SUBTTL RIC WERME JAN. 1975 SEARCH TULIP ;TULLIB DEFINITIONS SEARCH JOBDAT, MACTEN, UUOSYM ;STANDARD DEFINITIONS SALL ;PRETTY LISTINGS .DIRECT FLBLST ;PRETTIER LISTINGS TWOSEG RELOC 400000 VERSION (1,,1,,%DTADIR) ENTRY DTADRS,DTADRL DIRSIZ==200 ;SIZE OF DTA DIRECTORY BLOCK DIRADR==^D100 ;ADDRESS OF DIRECTORY BLOCK MAXFIL==^D22 ;MAX # OF FILES THAT WILL FIT ON A TAPE TAPLEN==^D578 ;# OF BLOCKS ON A DECTAPE DIRBYT==0 ;RELATIVE ADDR OF DIRECTORY BYTE MAP (5 BIT BYTES) DIRFIL==^D83 ;RELATIVE ADDR OF FIRST FILENAME DIREXT==^D105 ;RELATIVE ADDR OF EXTENSION/DATE WORD DIRLBL==^D127 ;RELATIVE ADDR OF LABEL WORD ;SUBROUTINE TO PRINT A DECTAPE DIRECTORY POINTED AT BY T1 ON ;THE CURRENT OUTPUT CHANNEL. USES T1-T4 ;WARNING: ZERDIR AND DIRXIT MAY BE REACHED WITHOUT SAVE1 BEING CALLED!! DTADRS::HRLI T1,-MAXFIL ;MAKE AN AOBJN POINTER (MUCH MORE USEFUL) SETZ T2, ;USE T2 TO 'COUNT' FILES WE SEE FSTLOP: SKIPE T3,DIRFIL(T1) ;THIS IS SO EASY MIGHT AS WELL DO IT IN A SEPARATE LOOP DISIX [[SIXBIT\%.%#!\];CRAM FILE AND EXTENSION WSIX 6,DIRFIL(T1);ON EACH LINE WSIX 3,DIREXT(T1)] IOR T2,T3 ;OR IT IN...NON 0 WILL SAY WE FOUND SOME AOBJN T1,FSTLOP ;GET ANOTHER JUMPE T2,ZERDIR ;SAY IF DIRECTORY EMPTY JRST DIRXIT ;A COUPLE OF CRLFS AND RETURN ;HERE TO PRINT ALL THE USEFUL DIRECTORY INFORMATION FOR THE LONG FORMAT DTADRL::PUSHJ P,SAVE1## ;NEED A PERMANENT AC FOR DIRECTORY ADDR HRLI T1,-MAXFIL ;MAKE T1 BE AOBJN POINTER MOVE P1,T1 ;KEEP A COPY OF THE AOBJN WORD FOR LATER USE ;COUNT ALL THE FREE FILES (SHOWN BY A ZERO FILE NAME) SETZ T2, ;CLEAR FILE COUNTER FILLOP: SKIPN DIRFIL(T1) ;FREE FILES HAVE A ZERO NAME MOVEI T2,1(T2) ;WHICH THIS ONE DOES AOBJN T1,FILLOP ;LOOK AT REST MOVEM T2,FREFIL ;SAVE FOR LATER USE. ;FIGURE OUT HOW MANY BLOCKS EACH FILE HAS ALLOCATED SETZM FILSIZ ;CLEAR OUT COUNT LIST OF FILE SIZES MOVE T1,[FILSIZ,,FILSIZ+1] BLT T1,FILSIZ+MAXFIL-1;USING TRIED, TRUE AND SLOW BLT MOVEI T1,TAPLEN-1 ;# OF BLOCKS TO SCAN (0 ISN'T IN BYTE MAP) MOVX T2,;POINT TO BEFORE FIRST BYTE IN MAP SIZLOP: ILDB T3,T2 ;GET OWNER OF THIS BLOCK AOS FILSIZ(T3) ;COUNT IT (N.B. - FREE BLOCKS ARE IN FILSIZ) SOJG T1,SIZLOP ;GO FOR NEXT ;COLLECTED ALL THE DATA WE NEED, PRINT THE HEADER NOW DISIX [[SIXBIT\D&IRECTORY %#&F&REE: % BLOCKS, % FILES#!\] PUSHJ P,DATTIM##;PRINT DIRECTORY HEADER. FIRST DATE AND TIME WDEC FILSIZ ;THEN THE FREE BLOCKS WDEC FREFIL] ;AND THE FREE FILES SKIPE T1,DIRLBL(P1) ;DOES THIS TAPE HAVE A LABEL? DISIX [[SIXBIT\T&APE &ID: %#!\] WNAME T1] W2CHI CRLF ;SEPARATE HEADER FROM DATA MOVE T1,FREFIL ;CHECK TO SEE IF ANY REASON TO PRINT CAIN T1,MAXFIL ; DIRECTORY. SAY EMPTY IF NO FILES WRITTEN ZERDIR: DISIX [CPOPJ##,,[SIXBIT\D&IRECTORY EMPTY###!\]] MOVEI T4,1 ;MAKE INDEX INTO FILSIZ FOR BLOCKS USED ;NO NEED TO SAVE P1 NOW, USE IT AS AOBJN WORD ;NOW PRINT OUT INFO FOR EACH FILE DIRLOP: SKIPN DIRFIL(P1) ;DOES THIS FILE EXIST? JRST DIRAOB ;NO, TRY NEXT LDB T1,[POINT 12,DIREXT(P1),35];GET LOW 12 BITS OF CREATION DATE MOVEI T2,1 ;CHECK THE BYTE MAP FOR THE TOP 3 BITS TDNE T2,DIRBYT(P1) IORI T1,1B23 ;BRING UPTO 1985 TDNE T2,DIRBYT+MAXFIL(P1) IORI T1,1B22 ;UPTO 2007 TDNE T2,DIRBYT+<2*MAXFIL>(P1) IORI T1,1B21 ;UPTO 2051 (FOR THE PDP-10 IN THE SMITHSONIAN) DISIX [[SIXBIT\%.% % %#!\] WSIX 6,DIRFIL(P1);FILE WSIX 3,DIREXT(P1);AND EXTENSION WDEC 3,FILSIZ(T4);THEN LENGTH PUSHJ P,DATTHN##] ;AND CREATION DATE DIRAOB: MOVEI T4,1(T4) ;POINT TO NEXT FILE NUMBER AOBJN P1,DIRLOP ;AND LOOP FOR NEXT FILE DIRXIT: WSIX [SIXBIT\##!\] ;ADD A LITTLE SPACE POPJ P, ;OR RETURN WHEN DONE RELOC 0 FREFIL: BLOCK 1 ;WHERE WE PUT # OF FREE FILES FILSIZ: BLOCK 40 ;NEED 40 ENTRIES FOR ANY BYTE SIZE RELOC PRGEND TITLE FILSPC - SIMPLE FILENAME PARSER SEARCH TULIP ;TULLIB DEFINITIONS SEARCH JOBDAT, MACTEN, UUOSYM ;STANDARD DEFINITIONS SALL ;PRETTY LISTINGS .DIRECT FLBLST ;PRETTIER LISTINGS TWOSEG RELOC 400000 VERSION(1,A,2,,%FILSPC) XP(FB,11) ;REGISTER THAT CONTAINS ADDRESS OF FILEBLOCK TO FILL ENTRY SIXLXC,SIXLXR,FILLXC,FILLXR SIXLXC::LCH T1 ;BACKUP TO COMPENSATE FOR LEXINT JRST SIXLXR FILLXC::LCH FB FILLXR::SKIPA FB,T1 ;GET FILE BLOCK ADDRESS SIXLXR::SKIPA T1,[SIXSCN,,FILSPC] MOVEI T1,FILSPC PJRST LEXINT## ;PRODUCTIONS TO PARSE THE CLASSIC FILE SPECIFIER (DEV:FILE.EXT[P,PN] ;IN ITS BIGGEST FORM) ;CALL WITH REGISTER FB POINTING TO THE LOSEG FILE BLOCK TO FILL. TBLBEG(FILSPC) PROD( ,FILI, , ) ;INIT FILE PARSER FLAGS NXTATM: PROD( ,CALL, ,SIXSCN) ;GET A NAME PROD( ":" ,DEV ,*,NXTATM) ;COLON MEANS A DEVICE PROD( "." ,NAME,*,NXTATM) ;AND PERIOD MEANS NAME PROD( "[" ,NAMX, ,PPNSCN) ;THEN BRACKET MEANS NAME OR EXT PROD( ,NAMX, , ) ;ANYTHING ELSE IS SAME PPNDON: PROD( ,RET , , ) ;QUIT WHILE AHEAD PPNSCN: PROD( ,GPRJ, , ) ;GET PROJECT NUMBER PROD( ,PROJ, , ) ;SAVE PROJECT. PROJ WILL FAKE CALL PROD( "]" , ,*, ) ;OPTIONAL CLOSE BRACKET PROD( ,PROG, ,PPNDON) ;MERGE WITH PROJECT SIXSCN: PROD( , ,*,. ) ;SKIP BLANKS PROD( ,SIXI, , ) ;SETUP SIXBIT PACKER PROD( ,SIXS,*,. ) ;SAVE ANY ALPHANUMERICS SKPBLA: PROD( , ,*,. ) ;IGNORE BLANKS PROD( ,RET , , ) ;AND RETURN TBLEND SUBTTL FILE SPECIFIER ROUTINES A.FILI: TDZA T3,T3 ;ALL WE NEED DO IS NOTE WE HAVEN'T SEEN A FILENAME A.DEV: MOVEM T1,FILDEV(FB) ;SAVE DEVICE NAME POPJ P, ;THESE ROUTINES ARE OFTEN THIS SHORT! A.NAME: ;GOT NAME, PRSDFL WILL BE OFF AND MUST BE SET A.NAMX: TROE T3,-1 ;SET FILE SEEN FLAG AND CHECK TO SEE IF IT WAS JRST A.EXT ;YES, MUST BE EXTENSION JUMPE T1,CPOPJ## ;DON'T OVERWRITE DEFAULT MOVEM T1,FILNAM(FB) ;SAVE FILE NAME POPJ P, A.EXT: MOVEM T1,FILEXT(FB) ;SAVE EXTENSION POPJ P, A.GPRJ==OCTLXR## A.PROJ: HRLZM T1,FILPPN(FB) ;SAVE PROJECT (LEFT HALF) PJRST OCTLXR## ;AND CALL OCTLXR AGAIN FOR THE SECOND HALF A.PROG: HRRM T1,FILPPN(FB) ;AND REMEMBER IT POPJ P, ;BEFORE RETURNING ;ROUTINE TO HANDLE DATA FLOW WHILE PARSING A SIXBIT WORD. RETURNS: ; T1/ SIXBIT DATA ; T2/ BYTE POINTER POINTING TO LAST BYTE A.SIXS: TRNE P3,LGLSIX ;THIS IS CUTE. WE MAY HAVE ONE OF 3 TYPES OF CHARS: ;NUM, RANGE 60-71 (SIXBIT 20-31) ;UC, RANGE 101-132 (41-72) ;LC, RANGE 141-172 (41-72) ;SO, IF IT IS LEGAL SIXBIT, WE HAVE TO COMPLEMENT ;BIT 40: XORI P2,40 ;LIKE THAT, WHILE LEAVING LOWER CASE ALONE TLNE T2,770000 ;MORE CUTENESS. THIS FIELD IS 0 AFTER T1 IS FILLED IDPB P2,T2 ;STUFF INTO T1 POPJ P, ;AND BACK FOR MORE A.SIXI: MOVE T2,[POINT 6,T1] ;SETUP POINTER TO WHERE WE'LL ACCUMULATE THE NAME SETZ T1, ;AND CLEAR THAT OF ANY GARBAGE IT MIGHT HAVE POPJ P, ;BACK TO SCAN FIRST CHARACTER PRGEND TITLE NUMGET - GET A DECIMAL/OCTAL NUMBER FROM INPUT STREAM SUBTTL RIC WERME, SEPT. 1976 SEARCH TULIP ;TULLIB DEFINITIONS SEARCH JOBDAT, MACTEN, UUOSYM ;STANDARD DEFINITIONS SALL ;PRETTY LISTINGS .DIRECT FLBLST ;PRETTIER LISTINGS TWOSEG RELOC 400000 VERSION(1,A,2,,%DECGET) ENTRY DECLXC,DECLXR,OCTLXC,OCTLXR ;SUBROUTINE TO READ A DECIMAL NUMBER FROM THE INPUT STREAM AND ;RETURN IT IN T1 DECLXC::LCH T1 ;COMPENSATE FOR LEXINT DECLXR::MOVEI T1,12 ;DECIMAL BASE JRST CALLEX ;SAVE BASE AND DO THE PARSE OCTLXC::LCH T1 ;JUST LIKE DECLX? OCTLXR::MOVEI T1,10 ;USE BASE 8 CALLEX: MOVEM T1,BASE ;SAVE IT MOVEI T1,NUMSPC ;ADDRESS OF PRODUCTION TABLE PJRST LEXINT## ;DO IT AND RETURN TBLBEG(NUMSPC) PROD( , ,*,. ) PROD( ,NUMI, , ) PROD( ,NUMS,*,. ) PROD( , ,*,. ) PROD( ,RET , , ) TBLEND A.NUMI: SETZ T1, ;START AT 0 (WHAT ELSE?) POPJ P, A.NUMS: IMUL T1,BASE ;MAKE SOME SPACE ADDI T1,-"0"(P2) ;ADD IN THIS DIGIT POPJ P, RELOC 0 BASE: BLOCK 1 ;NUMBER BASE USED STORED HERE PRGEND TITLE DATTIM - UTILITY PRINTERS SEARCH TULIP ;TULLIB DEFINITIONS SEARCH JOBDAT, MACTEN, UUOSYM ;STANDARD DEFINITIONS SALL ;PRETTY LISTINGS .DIRECT FLBLST ;PRETTIER LISTINGS TWOSEG RELOC 400000 VERSION(1,,2,,%DATTIM) ENTRY DATTIM,DATPRT,DATTHN,TIMPRT,TIMTHN ;SUBROUTINE TO PRINT CURRENT DATE AND TIME AS ; 'ON AT