1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-26 12:12:12 +00:00
Files
PDP-10.its/src/sysen2/prufd.10

404 lines
9.6 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
TITLE PRUFD
.INSRT SYSENG;DSK:JSF 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