From a93bd081a0cacac172cdf80f37c6606971e77bd3 Mon Sep 17 00:00:00 2001 From: Eric Swenson Date: Fri, 9 Dec 2016 17:05:09 -0800 Subject: [PATCH] Added PRUFD. --- README.md | 1 + build/build.tcl | 5 + src/sysen2/prufd.10 | 404 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 410 insertions(+) create mode 100644 src/sysen2/prufd.10 diff --git a/README.md b/README.md index 51632302..6b7b8209 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,7 @@ There's a [DDT cheat sheet](doc/DDT.md) for Unix users. - PEEK, system monitoring. - PFTHMG, Puff the magic dragon. - PR, print out various system documentation. + - PRUFD, list files on disk volume. - PTY, pseudo-tty - PWORD, replacement for sys;atsign hactrn that requires registered logins. - REATTA, reattaches disowned jobs to terminal. diff --git a/build/build.tcl b/build/build.tcl index 51a3e485..f64ff137 100644 --- a/build/build.tcl +++ b/build/build.tcl @@ -798,6 +798,11 @@ respond "*" ":link sys1;ts plan,sys3;ts create\r" respond "*" ":midas sys1;ts pty_sysen1;pty\r" expect ":KILL" +# PRUFD +respond "*" ":midas sysbin;prufd bin_sysen2;prufd\r" +respond "Use what filename instead?" "syseng;jsf macros\r" +expect ":KILL" + # ndskdmp tape respond "*" ":link kshack;good ram,.;ram ram\r" respond "*" ":link kshack;ddt bin,.;@ ddt\r" diff --git a/src/sysen2/prufd.10 b/src/sysen2/prufd.10 new file mode 100644 index 00000000..6d6b3931 --- /dev/null +++ b/src/sysen2/prufd.10 @@ -0,0 +1,404 @@ +TITLE PRUFD +.INSRT JSF;DSK:STNDRD MACROS +.INSRT SYSENG; DSK: FSDEFS > + +PROG==0 +;0 => PRUFD +;1 => LIST FILES ON PACK + +A=1 +AA=2 +B=3 +C=4 +D=5 +E=6 ;POINTER INTO MFD (DON'T CLOBBER) +F=7 ;POINTER INTO UFD (DON'T CLOBBER) +T=10 +TT=11 +P=17 + +;IO CHANNEL ASSIGNMENTS +LPTC==5 +FDRC==6 + +LPDL==100. ;EXTRA LONG FOR SORT +WPS==LMNBLK ;FOR SORT + +BEG: MOVE P,[-LPDL,,PDL] + PUSHJ P,PRINI + .OPEN FDRC,[6,,SIXBIT / DSKM.F.D.(FILE)/] ;OPEN MFD + .VALUE + MOVE A,[-2000,,MFD] + .IOT FDRC,A + MOVE A,MFD+MDNAMP ;USER NAME AREA POINTER + ADDI A,MFD ;RELOCATE TO POINT TO MFD + MOVEI AA,MFD+2000 ;END OF USER NAME AREA IN MFD + MOVSI B,(SETZ) ;ABOUT TO SORT ON ENTIRE FIELD + PUSHJ P,SORT ;SORT USER NAMES + MOVE E,MFD+MDNAMP ;USER NAME AREA POINTER +LUP: SKIPE A,MFD(E) ;IF USER SLOT NOT EMPTY, + PUSHJ P,USRHAK ;THEN HACK THIS DIRECTORY + ADDI E,LMNBLK ;INCREMENT TO NEXT USER + CAIG E,1776 + JRST LUP + .CLOSE FDRC, + PUSHJ P,PRDUN ;DONE + .VALUE [ASCIZ /./] + JRST BEG + +USRHAK: .SUSET [.SSNAM,,A] ;SET SYSTEM NAME + .OPEN FDRC,[6,,SIXBIT / DSK.FILE.(DIR)/] + .VALUE + MOVE A,[-2000,,UFD] + .IOT FDRC,A + JRST UDIRHK + +MFD: BLOCK 2000 + +UFD: BLOCK 2000 + +PDL: BLOCK LPDL+1 + IFE PROG,[ + + ;INITIALIZE + +PRINI: .OPEN LPTC,[1,,SIXBIT / LPTPRUFD WPAPER/] + .VALUE ;LPT NOT AVAILABLE + IRPS NAME,,[USER BLOCKS LINKS] + MOVE AA,[SIXBIT /NAME/] + PUSHJ P,SXTYOT + TERMIN + REPEAT 2,PUSHJ P,CRLF + SETZM NFBLKS ;CLEAR TOTAL NUMBER OF BLOCKS + SETZM TNLKS ;CLEAR TOTAL NUMBER OF LINKS + POPJ P, +] + + ;HACK WITH A USER DIRECTORY + ;WITHIN THIS ROUTINE, F IS A POINTER TO FILE AREA + ;C HAS # BLOCKS THIS USER SO FAR + +UDIRHK: PUSHJ P,UFDINI ;INITIALIZE FOR THIS UFD + MOVE F,UFD+UDNAMP ;GET NAME AREA POINTER + ADDI F,UFD ;RELOCATE TO POINT TO ACTUAL ADDRESS +UDHL: SKIPN (F) ;CHECK THIS ENTRY + SKIPE 1(F) + PUSHJ P,HAKFIL ;NON-NULL FILE, HACK IT + ADDI F,LUNBLK ;INCREMENT TO NEXT NAME BLOCK + CAIGE F,2000+UFD ;DONE? + JRST UDHL ;NO, GET NEXT FILE +IFN PROG,JRST UDIRDN ;DONE WITH THIS DIRECTORY +IFE PROG,[ + MOVE T,C ;SAVE TO CHECK FOR "EXCESSIVE " AMOUNT OF DISK SPACE + MOVE A,C ;GET NUMBER OF BLOCKS THIS USER DIRECTORY + ADDM A,NFBLKS' ;ADD TO TOTAL BLOCKS + MOVEI C,3 ;NUMBER OF DIGITS + PUSHJ P,NDTYO ;TYPE OUT NUMBER OF BLOCKS THIS USER + PUSHJ P,TAB ;TYPE A TAB TO SEPARATE FROM FOLLOWING + SKIPN A,NLINKS ;GET NUMBER OF LINKS + JRST .+3 + ADDM A,TNLKS' ;MORE TOTAL LINKS + PUSHJ P,DECTYO ;TYPE OUT NUMBER OF LINKS + MOVE A,T + CAIG A,250. ;DOES THIS GUY HAVE AN "EXCESSIVE" NUMBER OF TRACKS? + JRST CRLF ;NO + PUSHJ P,TAB ;YES + MOVE AA,[SIXBIT /??????/] ;FLAG HIM + PUSHJ P,SXTYOT ;AS A LOSER! + JRST CRLF ;END WITH CRLF + +UFDINI: MOVE AA,MFD(E) ;GET SYSTEM NAME AGAIN + PUSHJ P,SXTYOT ;TYPE IT OUT + SETZB C,NLINKS ;CLEAR BLOCK COUNT AND LINK COUNT + POPJ P, +;STILL IN ASSEMBLY CONDITIONAL + + ;F POINTS TO FILE, HACK WITH IT + +HAKFIL: MOVE A,UNRNDM(F) ;GET THE "IMPORTANT" WORD DESCRIBING FILE + TLNN A,UNLINK ;LINK? + JRST HF2 ;NO + AOS NLINKS' ;YES, ANOTHER LINK + POPJ P, + + ;F POINTS TO REAL FILE (AS OPPOSED TO LINK) + +HF2: ANDI A,17777 ;MASK TO CHARACTER ADDRESS OF DESCRIPTION + IDIVI A,6 ;NOW CALCULATE BYTE POINTER + ADD A,HFBPT(AA) ;GET BYTE POINTER IN A + ILDB T,A ;GET CHARACTER + XCT HF2TB(T) ;DO SOMETHING + TRNE T,40 + IBP A + AOJA C,.-4 ;INCREMENT BLOCK COUNT AND LOOP + + ;TABLE OF THINGS TO DO WITH CHARACTERS + +HF2TB: POPJ P, ;0 => DONE + REPEAT 12.,ADDI C,.RPCNT ;1 - 12. => TAKE THAT MANY (N-1 NOW, 1 LATER) + REPEAT 30.-13.+1,JFCL ;13. - 30. => TAKE 1 + POPJ P, ;31. => DONE + REPEAT 40,IBP A ;32. - 63., READ NEXT CHAR. AND TAKE A BLOCK + + ;TABLE OF BYTE POINTERS (FOR ILDB'ING) TO DESCRIPTOR AREA + +HFBPT: POINTI 6,UFD+UDDESC + + ;DONE + +PRDUN: PUSHJ P,CRLF ;SEPARATE THIS CRUFT FROM PREV. WITH CRLF + IRPS TYP,,[BLOCKS LINKS]LOC,,[NFBLKS TNLKS] + MOVE AA,[SIXBIT /TYP/] + PUSHJ P,SXTYOT + MOVE A,LOC + PUSHJ P,DECTYO + PUSHJ P,CRLF + TERMIN + MOVEI A,14 + PUSHJ P,TYO + .CLOSE LPTC, + POPJ P, + +] ;END IFE PROG, CONDITIONAL + +IFE PROG-1,[ ;LIST ALL FILES ON PACK + +PACK: -1 ;INSERT PACK NUMBER HERE FROM DDT + +;ROUTINES: + ;PRINI ;INITIALIZE + ;UFDINI ;INITIALIZE FOR THIS USER DIRECTORY + ;HAKFIL ;PROCESS FILE + ;UDIRDN ;DONE WITH THIS USER DIRECTORY + ;PRDUN ;DONE + +PRINI: SKIPGE PACK ;CHECK PACK NUMBER FOR VALIDITY +NOPACK: .VALUE ;NO PACK NUMBER SPECIFIED + .OPEN LPTC,[1,,SIXBIT / LPTPRUFD WPAPER/] + .VALUE + INSIRP PUSHJ P,[PAKTYP TIMTYP PAKTYP] + JRST CRLF + +PAKTYP: MOVE AA,[SIXBIT /PACK/] + PUSHJ P,SXTYOT + MOVE A,PACK + JRST DECTYO + +UFDINI: SETOM FILCT' ;INITIALIZE FOR USER DIRECTORY: SET SWITCH (MAYBE DON'T PRINT ANYTHING FOR THIS USER) + POPJ P, + +HAKFIL: LDB T,[UNPKN,,UNRNDM(F)] ;GET PACK NUMBER + CAME T,PACK ;SKIP IF ON PACK BEING CHECKED +UDIRDN: POPJ P, ;NOT ON THIS PACK (ALSO ROUTINE FOR DONE WITH THIS DIRECTORY) + AOSN FILCT + PUSHJ P,HAKFII ;THIS FIRST RELEVANT FILE THIS DIRECTORY + MOVE A,UNRNDM(F) + TLNN A,UNIGFL ;CHECK TO SEE IF FILE REALLY THERE + SKIPA A,SPACE ;YES + MOVEI A,"* ;NO + PUSHJ P,TYO + MOVE AA,(F) ;FN1 + PUSHJ P,SXTYOT + MOVE AA,1(F) ;FN2 + PUSHJ P,SXTYOT + JRST CRLF + +HAKFII: PUSHJ P,CRLF ;EXTRA CRLF TO SEPARATE FROM PREV + MOVE B,MFD(E) ;SYSTEM NAME THIS USER + MOVEI C,6 ;COUNT + MOVE AA,B ;GET SYSTEM NAME SO IT CAN BE TYPED OUT + PUSHJ P,SXTYOT + SOJG C,.-2 + JRST CRLF + +PRDUN: MOVEI A,14 + PUSHJ P,TYO + .CLOSE LPTC, + POPJ P, +] + +SXTYOT: JUMPE AA,TAB + MOVEI A,0 + LSHC A,6 + ADDI A,40 + PUSHJ P,TYO + JRST SXTYOT + +SPACE: MOVEI A,40 + JRST TYO + +TAB: MOVEI A,11 + JRST TYO + +CRLF: MOVEI A,15 + PUSHJ P,TYO + MOVEI A,12 +TYO: .IOT LPTC,A +CPOPJ: POPJ P, + +DECTYO: MOVEI C,0 ;NO MINIMUM NUMBER OF DIGITS +NDTYO: IDIVI A,10. ;ENTRY TO TYPE LEADING SPACES IF NECESSARY TO FILL TO C(C) CHARACTERS + JUMPE A,DCTYO3 + HRLM AA,(P) + PUSHJ P,[SOJA C,NDTYO] + HLRZ AA,(P) +DCTYO2: MOVEI A,"0(AA) + JRST TYO + +DCTYO3: SOJLE C,DCTYO2 + PUSHJ P,SPACE + JRST DCTYO3 + +TIMTYP: PUSHJ P,TAB ;TYPE TIME: BEGIN WITH TAB + MOVE AA,[SIXBIT /PRUFD./] ;BUT FIRST TYPE VERSION DESCRIPTION + PUSHJ P,SXTYOT + MOVE AA,[.FNAM2] ;VERSION # + PUSHJ P,SXTYOT + .RDATIM A, ;GET TIME IN A, DATE IN AA + JUMPL A,CPOPJ ;JUMP IF NOT KNOWN + PUSH P,A ;SAVE TIME + PUSHJ P,SXTYOT ;TYPE DATE + POP P,AA + JRST SXTYOT ;TYPE TIME AND RETURN + + ;SORT THE SYMBOL TABLE + ;A POINTS TO FIRST ENTRY + ;AA POINTS TO LAST ENTRY + 1 + ;B HAS ONE BIT SET, THAT BIT MOST SIGNIFICANT BIT TO SORT ON + + +SORT: +SORT1: HRLM AA,(P) ;SAVE UPPER BOUND + CAIL A,-WPS(AA) + JRST SORT7 ;ONE OR ZERO ENTRIES + PUSH P,A ;SAVE LOWER BOUND +SORT3: TDNN B,(A) ;BIT SET IN LOWER ENTRY? + JRST SORT4 ;NO, INCREMENT TO NEXT AND MAYBE TRY AGAIN + SUBI AA,WPS ;YES, NOW BACK UP UPPER POINT + TDNE B,(AA) ;BIT CLEAR IN UPPER ENTRY? + JRST SORT2 ;NO, CHECK FOR END, DECREMENT AA, AND TRY AGAIN +REPEAT WPS,[ ;BIT SET IN LOWER ENTRY AND CLEAR IN UPPER => EXCHANGE ENTRIES + MOVE T,.RPCNT(A) + EXCH T,.RPCNT(AA) + MOVEM T,.RPCNT(A) +] +SORT4: ADDI A,WPS ;INCREMENT LOWER BOUND POINTER TO NEXT ENTRY +SORT2: CAME A,AA ;ANY MORE ENTRIES LEFT? + JRST SORT3 ;YES, GO PROCESS THEM + ;A AND AA NOW BOTH POINT TO FIRST ENTRY WITH BIT SET + ROT B,-1 ;ROTATE BIT INDICATOR TO NEXT (LESS SIGNIFICANT) BIT + POP P,A ;RESTORE LOWER BOUND OF ENTIRE SORT + JUMPL B,SORT6 ;JUMP IF NO MORE KEY TO SORT ON + PUSHJ P,SORT1 ;SORT BOTTOM PART OF TABLE + HLRZ AA,(P) ;RESTORE UPPER BOUND (SORT1 CLOBBERED A TO MIDDLE) + PUSHJ P,SORT1 ;SORT TOP PART OF TABLE +SORT6: ROT B,1 ;BACK UP KEY AGAIN SO AS TOO "NOT CLOBBER B" +SORT7: HLRZ A,(P) ;MAKE A POINT ABOVE TABLE ENTRIES SORTED + POPJ P, + +PATCH: +PAT: BLOCK 40 +PATCHE=.-1 + +END BEG +  HAVE AN "EXCESSIVE" NUMBER OF TRACKS? + JRST CRLF ;NO + PUSHJ P,TAB ;YES + MOVE AA,[SIXBIT /??????/] ;FLAG HIM + PUSHJ P,SXTYOT ;AS A LOSER! + JRST CRLF ;END WITH CRLF + +UFDINI: MOVE AA,MFD(E) ;GET SYSTEM NAME AGAIN + PUSHJ P,SXTYOT ;TYPE IT OUT + SETZB C,NLINKS ;CLEAR BLOCK COUNT AND LINK COUNT + POPJ P, +;STILL IN ASSEMBLY CONDITIONAL + + ;F POINTS TO FILE, HACK WITH IT + +HAKFIL: MOVE A,UNRNDM(F) ;GET THE "IMPORTANT" WORD DESCRIBING FILE + TLNN A,UNLINK ;LINK? + JRST HF2 ;NO + AOS NLINKS' ;YES, ANOTHER LINK + POPJ P, + + ;F POINTS TO REAL FILE (AS OPPOSED TO LINK) + +HF2: ANDI A,17777 ;MASK TO CHARACTER ADDRESS OF DESCRIPTION + IDIVI A,6 ;NOW CALCULATE BYTE POINTER + ADD A,HFBPT(AA) ;GET BYTE POINTER IN A + ILDB T,A ;GET CHARACTER + XCT HF2TB(T) ;DO SOMETHING + TRNE T,40 + IBP A + AOJA C,.-4 ;INCREMENT BLOCK COUNT AND LOOP + + ;TABLE OF THINGS TO DO WITH CHARACTERS + +HF2TB: POPJ P, ;0 => DONE + REPEAT 12.,ADDI C,.RPCNT ;1 - 12. => TAKE THAT MANY (N-1 NOW, 1 LATER) + REPEAT 30.-13.+1,JFCL ;13. - 30. => TAKE 1 + POPJ P, ;31. => DONE + REPEAT 40,IBP A ;32. - 63., READ NEXT CHAR. AND TAKE A BLOCK + + ;TABLE OF BYTE POINTERS (FOR ILDB'ING) TO DESCRIPTOR AREA + +HFBPT: POINTI 6,UFD+UDDESC + + ;DONE + +PRDUN: PUSHJ P,CRLF ;SEPARATE THIS CRUFT FROM PREV. WITH CRLF + IRPS TYP,,[BLOCKS LINKS]LOC,,[NFBLKS TNLKS] + MOVE AA,[SIXBIT /TYP/] + PUSHJ P,SXTYOT + MOVE A,LOC + PUSHJ P,DECTYO + PUSHJ P,CRLF + TERMIN + MOVEI A,14 + PUSHJ P,TYO + .CLOSE LPTC, + POPJ P, + +] ;END IFE PROG, CONDITIONAL + +IFE PROG-1,[ ;LIST ALL FILES ON PACK + +PACK: -1 ;INSERT PACK NUMBER HERE FROM DDT + +;ROUTINES: + ;PRINI ;INITIALIZE + ;UFDINI ;INITIALIZE FOR THIS USER DIRECTORY + ;HAKFIL ;PROCESS FILE + ;UDIRDN ;DONE WITH THIS USER DIRECTORY + ;PRDUN ;DONE + +PRINI: SKIPGE PACK ;CHECK PACK NUMBER FOR VALIDITY +NOPACK: .VALUE ;NO PACK NUMBER SPECIFIED + .OPEN LPTC,[1,,SIXBIT / LPTPRUFD WPAPER/] + .VALUE + INSIRP PUSHJ P,[PAKTYP TIMTYP PAKTYP] + JRST CRLF + +PAKTYP: MOVE AA,[SIXBIT /PACK/] + PUSHJ P,SXTYOT + MOVE A,PACK + JRST DECTYO + +UFDINI: SETOM FILCT' ;INITIALIZE FOR USER DIRECTORY: SET SWITCH (MAYBE DON'T PRINT ANYTHING FOR THIS USER) + POPJ P, + +HAKFIL: LDB T,[UNPKN,,UNRNDM(F)] ;GET PACK NUMBER + CAME T,PACK ;SKIP IF ON PACK BEING CHECKED +UDIRDN: POPJ P, ;NOT ON THIS PACK (ALSO ROUTINE FOR DONE WITH THIS DIRECTORY) + AOSN FILCT + PUSHJ P,HAKFII ;THIS FIRST RELEVANT FILE THIS DIRECTORY + MOVE A,UNRNDM(F) + TLNN A,UNIGFL ;CHECK TO SEE IF FILE REALLY THERE + SKIPA A,SPACE ;YES + MOVEI A,"* ;NO + PUSHJ P,TYO + MOVE AA,(F) ;FN1 + PUSHJ P,SXTYOT + MOVE AA,1(F) ;FN2 + \ No newline at end of file