SYSTEMSTRING (8)FNSPEC HTOS(INTEGER VALUE, PLACES)
EXTERNALROUTINE PMON(STRING (255)S)
EXTERNALROUTINESPEC CLEAR(STRING (255)S)
RECORDFORMAT RF(INTEGER ADR, TYPE, START, END)
SYSTEMROUTINESPEC CONNECT(STRING (31)FILE, INTEGER M, H, P,
RECORD (RF)NAME R, INTEGERNAME FLAG)
EXTERNALROUTINESPEC DEFINE(STRING (255)S)
SYSTEMSTRINGFNSPEC ITOS(INTEGER N)
SYSTEMROUTINESPEC PHEX(INTEGER I)
EXTERNALINTEGERFNSPEC DMON(STRING (255)S)
EXTERNALINTEGERFNSPEC DCONNECT(STRING (6)U, STRING (11)F,
INTEGER FSYS, MODE, APF, INTEGERNAME SEG, GAP)
EXTERNALINTEGERFNSPEC DDISCONNECT(STRING (6)U, STRING (11)F,
INTEGER FSYS, DSTRY)
INTEGER J, SEG, GAP, A, C, K, W, IC, ICD, PAGE, TOPJ2, Y
INTEGER N, W1, OFFSETS
STRING (31)WS
STRING (11)USER, FILE
RECORDFORMAT HF(INTEGER NEXT, RELST, MAX, A, B, C, CYCLIC, C
READ)
RECORD (HF)NAME H
STRING (18)ARRAY ST(0:255)
RECORDFORMAT KYF(STRING (31)NAME, INTEGER OFFSET)
RECORD (RF)R2
RECORD (KYF)ARRAYFORMAT KYSF(0:1023)
RECORD (KYF)ARRAYNAME KYS
CONSTSTRING (15)ARRAY PRE(0:15) = C
"Page in ",
"Page out ",
"Page out - w ",
"Strobe out ",
"Strobe out - W ",
"Snooze ",
"Change Context ",
"Re-schedule ",
" ",
" ",
" ",
" ",
" ",
" ",
"Disconnect seg ",
"Connect segment"
!
CONSTSTRING (13)ARRAY RESCH(1:3) = C
"suspended ",
"out of time ",
"out of Epages"
!
IF S = "ON" OR S = "LATER" START
J = DMON(S)
-> OUT
FINISH
!
USER = "VOLUMS" AND FILE = "PAGEFAULTS" C
UNLESS S -> USER . (".") . FILE
!
J = DMON("")
RETURN IF S = "NO"
!
OFFSETS = 0
CONNECT("ERCC10.OFFSETS_SEG2", 1, 0, 0, R2, J)
-> NO OFFSETS UNLESS J = 0
KYS == ARRAY(R2_ADR+R2_START, KYSF)
TOPJ2 = INTEGER(R2_ADR + 16) - 1
OFFSETS = 1
NO OFFSETS:
SEG = 0
GAP = 0
K = DCONNECT(USER, FILE, -1, 1, 0, SEG, GAP)
J = K AND -> OUT UNLESS K = 0 OR K = 34
A = SEG << 18
H == RECORD(A)
!
CYCLE J = 0, 1, 255
ST(J) = ""
REPEAT
ST(2) = "DIRECTOR"
ST(3) = "#DGLA"
ST(4) = "#STK"
ST(6) = "#SIGSTK"
ST(8) = "SYSTEM CALL TABLE"
ST(9) = "UINF"
ST(14) = "DIRLOG"
ST(32) = "SUBSYSTEM"
ST(34) = "#BGLA"
!
DEFINE("61,T#OUT")
SELECT OUTPUT(61)
!
IC = 0
J = H_RELST
WHILE J < H_NEXT CYCLE
W = INTEGER(A+J)
C = W >> 28
PRINTSTRING(PRE(C))
IF C >= 14 START
SEG = BYTEINTEGER(A+J+1)
WS = STRING(A+J+2)
WRITE(SEG, 3)
SPACE
PRINTSTRING(WS)
WS = "" IF C = 14
ST(SEG) = WS
J = J + 16
-> NEXT
FINISH
W = W << 4 >> 4
ICD = IC-W
ICD = 0 IF ICD < 0
WRITE(ICD, 6)
IC = W
W = INTEGER(A+J+4)
SEG = W >> 18
PAGE = W << 14 >> 26
!
SPACE
IF C = 5 OR C = 6 START ; ! SNOOZE or Change Context
WRITE(W, 1)
PRINTSTRING(" pages")
-> NEXT
FINISH
!
IF C = 7 START ; ! reschedule
N = W >> 24
IF 1 <= N <= 3 C
THEN PRINTSTRING(RESCH(N)) C
ELSE PRINTSTRING("reason ".ITOS(N))
!
N = W << 8 >> 24
PRINTSTRING(" category ".ITOS(N))
!
N = W << 16 >> 16
PRINTSTRING(" working set size ".ITOS(N))
-> NEXT
FINISH
!
IF ST(SEG) = "" C
THEN PRINTSTRING("SEG ".ITOS(SEG)) C
ELSE PRINTSTRING(ST(SEG))
PRINTSTRING(" PAGE X'".HTOS(PAGE, 2))
IF C = 0 START ; ! page in
PRINTSTRING(".".HTOS(W&(31<<7), 3))
!
IF SEG = 2 AND OFFSETS = 1 START
W = W & X'3FF80'
N = 0; ! number of names found
CYCLE Y = 0, 1, TOPJ2
!
W1 = KYS(Y)_OFFSET & X'3FF80'
IF W1 = W START ; ! plausible name
PRINTSTRING(" ".KYS(Y-1)_NAME) IF N = 0
PRINTSTRING("/" . KYS(Y)_NAME)
N = N + 1
FINISH ELSE START
IF W1 > W START ; ! gone past
PRINTSTRING(" ".KYS(Y-1)_NAME) IF N = 0
EXIT
FINISH
FINISH
!
REPEAT
FINISH
!
FINISH
NEXT:
J = J + 8
NEWLINE
REPEAT
J = 0
J = DDISCONNECT(USER, FILE, -1, 0) IF K = 0
!
SELECT OUTPUT(0)
CLOSE STREAM(61)
CLEAR("61")
PRINTSTRING("T#OUT written ")
OUT:
PRINTSTRING("Flag =")
WRITE(J, 1)
NEWLINE
END
ENDOFFILE