mirror of
https://github.com/PDP-10/its.git
synced 2026-01-26 12:12:12 +00:00
404 lines
9.6 KiB
Plaintext
404 lines
9.6 KiB
Plaintext
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
|
||
|