%CONSTINTEGER MAXPROCS=256 %CONSTINTEGER YES=1,NO=0 %CONSTINTEGER VAMODE=YES %CONSTINTEGER COM SEG=31 %CONSTINTEGER LOCSN0=64 %CONSTINTEGER PAGESIZE=4096 %CONSTINTEGER SSHIFT=20 %INCLUDE "ercc07:ibmsup_comf370" !----------------------------------------------------------------------- %CONSTINTEGER EPAGESPERSEC=600; !EPAGES THRU one DISC CONTROLLER PER SECOND !---------------------------------------------------------------------- %EXtERNALSTRINGFUNCTIONSPEC ITOS %alias "S#ITOS" (%INTEGER N) %EXTERNALROUTINESPEC MOVE %ALIAS "S#MOVE"(%INTEGER NLENGTH,NFROM,NTO) %EXTERNALROUTINESPEC PROMPT %alias "S#PROMPT"(%STRING (255) S) %EXTERNALINTEGERFUNCTIONSPEC DDELAY(%INTEGERNAME SECONDS) %EXTERNALstringfnSPEC INTERRUPT %alias "S#INTERRUPT" !----------------------------------------------------------------------- ! TIMING INFORMATION DECS. %RECORDFORMAT PERFORMF(%LONGINTEGER RECAPN,PTURNN,PSHAREN,NEWPAGEN,PAGEOUTN,PAGEZN,SNOOZN,ABORTN,SNOOZOK,SNOOZTO,SNOOZAB, PREFETCHN,BADPREF,fdeact,Noptabs,s2, %LONGINTEGER CLOCK, %LONGINTEGERARRAY SERVIT(0:LOCSN0+3), %LONGINTEGERARRAY SERVN(0:LOCSN0+3)) %OWNRECORD (PERFORMF) OLDTIMES=0,PERFORM=0 %CONSTSTRING (15) %ARRAY SERVROUT(0:LOCSN0+3)="IDLE TIME", "NOWORK TIME","DEADLOCK RCVRY","SCHEDULE", "PAGETURN","GET EPAGE","RETURN EPAGE","FILE SEMAPHORE","ACTIVE MEM", "","ELAPSEDINT","UPDATE TIME","DPONPUTONQ","TURNON ER", "ACTIVEMEM(POLL)","SCHEDULE(OPER)","OVERALLOC CNTRL",""(15), "DISC","DISC TRANSFERS","DISC INTERRUPT","","MOVE REQUESTS", "MOVE TRANSFERS",""(2), "DRUM TRANSFERS","","DRUM INTERRUPT",""(5),"DEVIO REQUESTS","TAPE", "OPER","LP ADAPTOR","CR ADAPTOR","CP ADAPTOR","PRINTER", "COMMS CONTROL","COMBINE","FEP ADAPTOR","DEVIO INTERRUPT", ""(2),"BMREP","COMREP",""(2),"LOCAL CONTROL","FOREGRND USERS", "BACKGRND USERS" !----------------------------------------------------------------------- ! SCHEDULING CATEGORY TABLES %RECORDFORMAT CATTABF(%BYTEINTEGER PRIORITY,sp1, %short EPLIM, %byte RTLIM,MOREP,MORET,LESSP,SP0,SUSP,RQTS1,RQTS2,STROBEI,SP2,sp3,sp4) !----------------------------------------------------------------------- ! PROCESS INORMATION ETC. %RECORDFORMAT PROCF(%STRING (6) USER, %BYTEINTEGER INCAR,CATEGORY,P4TOP4,RUNQ,ACTIVE, %short spare,epa, %INTEGER LSTAD,%short EPN,LAMTX, %INTEGER STACK,STATUS) ! 2**0 = HOLDS A SEMAPHORE ! 2**1 = ON A PAGE FAULT ! 2**2 = A BACKGROUND JOB ! 2**3 = DEALLOCATING AMT (&DRUM) ONLY ! 2**4 = AMT LOST ! 2**5 = HAD TIME ON FLY ! 2**6 = HAD EPAGES ON FLY ! 2**7 = SNOOZING ! 2**8 = LC STACK READ FAILURE ! 2**9 = STATE X(LC STK SNOOZED) ! REMAINDER UNUSED %CONSTSTRING (31) %ARRAY STATES(0:9)= %C "holds sema", "page fault", "", "dealoc AMT", "AMT lost ", "Time on fly", "Pages on fly", "snoozing ", "LC failed ", "LC snoozed" !----------------------------------------------------------------------- %INTEGERFN STOI(%STRINGNAME S) %STRING (50) P %INTEGER SIGN,AD,I,J,HEX %LONGINTEGER TOTAL HEX=0; TOTAL=0; SIGN=1 AD=ADDR(P) L1: ->NULLS %IF S="" I=CHARNO(S,1); ! FIRST CHAR %IF I=' ' %THEN S->(" ").S %AND ->L1; ! CHOP LEADING SPACES %IF I='-' %THEN S->("-").S %AND SIGN=-1 %AND ->L1 %IF I='X' %THEN S->("X").S %AND HEX=1 %AND ->L1 P=S %UNLESS S->P.(" ").S %THEN S="" I=1 %WHILE I<=BYTEINTEGER(AD) %CYCLE J=BYTE INTEGER(I+AD) ->FAULT %UNLESS '0'<=J<='9' %OR (HEX#0 %AND 'A'<=J<='F') %IF HEX=0 %THEN TOTAL=10*TOTAL %ELSE TOTAL=TOTAL<<4+9*J>>6 TOTAL=TOTAL+J&15; I=I+1 %REPEAT %IF HEX#0 %AND I>9 %THEN ->FAULT J<-TOTAL %IF I>1 %THENRESULT=SIGN*J FAULT:S=P." ".S NULLS:%RESULT=X'80808080' %END; ! OF STOI %ROUTINE PRINTCHS(%STRING (255) S) PRINTSTRING(S) %END %ROUTINE PRHEX(%INTEGER VALUE,PLACES) %CONSTBYTEINTEGERARRAY HEX(0:15)='0','1','2','3','4', '5','6','7','8','9','A','B','C','D','E','F' %INTEGER I %CYCLE I=PLACES<<2-4,-4,0 PRINT SYMBOL(HEX(VALUE>>I&15)) %REPEAT %END %STRINGFN VDUS(%INTEGER I) %RESULT="" %END %EXTERNALROUTINE PRINT CATEGORY TABLE%alias "C#PRINTCATEGORYTABLE"(%STRING (63) S) %INTEGER MAXCAT MAXCAT=INTEGER(COM_CATTAD) %RECORD (CATTABF) %ARRAYFORMAT CATTABAF(0:MAXCAT) %RECORD (CATTABF) %ARRAYNAME CATTAB CATTAB==ARRAY(COM_CATTAD+4,CATTABAF) %INTEGER I,J PRINT STRING(" Sup".STRING(ADDR(COM_SUPVSN))." ") PRINT STRING("Dual") %IF COM_NOCPS#1 PRHEX(COM_OCPTYPE,4) PRINT STRING(" Store=") WRITE(COM_SEPGS*4,0) PRINT STRING("K Page size=4") PRINT STRING("K Time slice=") PRINT(COM_TSLICE/1000000,1,3) PRINTSTRING("s ".STRING(ADDR(COM_DATE0)+3)." ".STRING(ADDR(COM_TIME0)+3)) NEWLINE PRINT STRING("Category Store Store Time More More Less Wait RQueue RQ"."ueue Strobe") NEWLINE PRINT STRING(" queue limit limit Store Time Store Slice1 Sl"."ice2 Time") NEWLINE %FOR I=1,1,MAX CAT %CYCLE WRITE(I,2) J=CATTAB(I)_SP0 %IF J='E' %THEN PRINTSTRING(" Exec") %ELSE %C %IF J='B' %THEN PRINT STRING(" Back") %ELSE PRINT STRING(" Fore") WRITE(CATTAB(I)_PRIORITY,6) WRITE(CATTAB(I)_EPLIM*4,7); PRINT SYMBOL('K') PRINT((CATTAB(I)_RTLIM*COM_TSLICE)/1000000,2,2); PRINT SYMBOL('s') WRITE(CATTAB(I)_MOREP,4) WRITE(CATTAB(I)_MORET,5) WRITE(CATTAB(I)_LESSP,5) WRITE(CATTAB(I)_SUSP,4) WRITE(CATTAB(I)_RQTS1,6) WRITE(CATTAB(I)_RQTS2,6) %IF CATTAB(I)_STROBEI#0 %START PRINT((CATTAB(I)_STROBEI*COM_TSLICE)/1000000,5,2) PRINT SYMBOL('s') %FINISH NEWLINE %REPEAT PROMPT("") READSYMBOL(I) %WHILE I#NL %END ! ! %EXTERNALROUTINE PRINT PROCESS LIST %alias "C#PRINTPROCESSLIST"(%STRING (63) S) %RECORD (PROCF) %ARRAYFORMAT PROCAF(0:MAXPROCS) %RECORD (PROCF) %ARRAYNAME PROCA PROCA==ARRAY(COM_PROCAAD,PROCAF) %INTEGER MAXCAT MAXCAT=INTEGER(COM_CATTAD) %RECORD (CATTABF) %ARRAYFORMAT CATTABAF(0:MAXCAT) %RECORD (CATTABF) %ARRAYNAME CATTAB CATTAB==ARRAY(COM_CATTAD+4,CATTABAF) %RECORD (PROCF) %NAME PROC %INTEGER I,J %FOR I=1,1,MAXPROCS %CYCLE PROC==PROCA(I) %IF PROC_USER#"" %AND (S="" %OR PROC_USER=S) %START WRITE(I,3) %IF PROC_STATUS&4#0 %THEN PRINT SYMBOL('*') %ELSE SPACE PRINT STRING(PROC_USER) WRITE(PROC_CATEGORY,2) %IF PROC_P4TOP4#0 %THEN WRITE(PROC_P4TOP4,3) %ELSE SPACES(4) %IF PROC_ACTIVE=255 %START %IF PROC_STATUS&2=0 %START %IF PROC_STATUS&8=0 %START %IF PROC_RUNQ#0 %START PRINT STRING(" run Q") WRITE(PROC_RUNQ,1) %FINISHELSESTART PRINT STRING(" Store Q") WRITE(CATTAB(PROC_CATEGORY)_PRIORITY,1) %FINISH SPACE %FINISHELSE PRINT STRING(" ".STATES(3)) %FINISHELSE PRINT STRING(" ".STATES(1)) SPACES(7) %FINISHELSESTART %FOR J=0,1,9 %CYCLE %IF J#0 %AND J#1 %AND J#3 %AND J#5 %AND J#6 %AND PROC_STATUS&(1<S.(",").TEMP %THEN SECONDS=STOI(TEMP) %ELSE SECONDS=2 %CYCLE PRINTPROCESSLIST(S) I=DDELAY(SECONDS) INT=INTERRUPT %EXITIF INT="STOP" %OR INT="stop" %REPEAT %END %LONGINTEGERFN CLOCK %LONGINTEGER L *STCK_L %RESULT=L %END; ! OF CLOCK ! ! %ROUTINE GET SUPERVISOR TIME %RECORD (PERFORMF) NEWTIMES %INTEGER I MOVE(sizeof(newtimes),COM_PERFORMAD,ADDR(NEWTIMES)) PERFORM_CLOCK=CLOCK OLDTIMES_CLOCK=NEWTIMES_CLOCK %IF OLDTIMES_CLOCK=0 NEWTIMES_CLOCK=PERFORM_CLOCK PERFORM_RECAPN=NEWTIMES_RECAPN-OLDTIMES_RECAPN PERFORM_PTURNN=NEWTIMES_PTURNN-OLDTIMES_PTURNN PERFORM_PSHAREN=NEWTIMES_PSHAREN-OLDTIMES_PSHAREN PERFORM_NEWPAGEN=NEWTIMES_NEWPAGEN-OLDTIMES_NEWPAGEN PERFORM_PAGEOUTN=NEWTIMES_PAGEOUTN-OLDTIMES_PAGEOUTN PERFORM_PAGEZN=NEWTIMES_PAGEZN-OLDTIMES_PAGEZN PERFORM_SNOOZN=NEWTIMES_SNOOZN-OLDTIMES_SNOOZN PERFORM_ABORTN=NEWTIMES_ABORTN-OLDTIMES_ABORTN PERFORM_SNOOZOK=NEWTIMES_SNOOZOK-OLDTIMES_SNOOZOK PERFORM_SNOOZTO=NEWTIMES_SNOOZTO-OLDTIMES_SNOOZTO PERFORM_SNOOZAB=NEWTIMES_SNOOZAB-OLDTIMES_SNOOZAB PERFORM_PREFETCHN=NEWTIMES_PREFETCHN-OLDTIMES_PREFETCHN PERFORM_BADPREF=NEWTIMES_BADPREF-OLDTIMES_BADPREF perform_fdeact=newtimes_fdeact-oldtimes_fdeact perform_noptabs=newtimes_noptabs-oldtimes_noptabs PERFORM_CLOCK=NEWTIMES_CLOCK-OLDTIMES_CLOCK %FOR I=0,1,LOCSN0+3 %CYCLE PERFORM_SERVIT(I)=NEWTIMES_SERVIT(I)-OLDTIMES_SERVIT(I) PERFORM_SERVN(I)=NEWTIMES_SERVN(I)-OLDTIMES_SERVN(I) %REPEAT OLDTIMES=NEWTIMES %END %EXTERNALROUTINE PRINT SUPERVISOR TIME %alias "C#PRINTSUPERVISORTIME"(%STRING (63) SS) %INTEGER I,J,K %LONGREAL PERIOD,TOTAL,SERVTIME %STRING (15) S GET SUPERVISOR TIME PRINTCHS(VDUS(1)); !clear screen if its a VDU I=ADDR(COM_DATE0)+3 PRINT STRING(" EMAS370 SUP".STRING(ADDR(COM_SUPVSN))." TIMING ".STRING(I)." ".STRING(I+12)." PERIOD=") PRINT(PERFORM_CLOCK>>12/1000000,1,1) PRINT STRING(" SECS") PERIOD=PERFORM_CLOCK>>12*COM_NOCPS PRINT STRING(" SERVICE CALLS TIME(SECS) AVERAGE(MSECS) %OF TOTAL ") TOTAL=0 %CYCLE I=0,1,LOCSN0+3 S=SERVROUT(I) SERVTIME=COM_ITINT*PERFORM_SERVIT(I) %IF S#"" %AND PERFORM_SERVN(I)#0 %START PRINT STRING(S) SPACES(16-LENGTH(S)) PRINT(PERFORM_SERVN(I),9,0) PRINT(SERVTIME/1000000,11,3) PRINT((SERVTIME/1000)/PERFORM_SERVN(I),10,3) PRINT(100*SERVTIME/PERIOD,7,2) PRINT STRING("% ") TOTAL=TOTAL+SERVTIME %FINISH %REPEAT PRINT STRING("INT/ACT/SEMA ETC.") SPACES(9) PRINT((PERIOD-TOTAL)/1000000,11,3) SPACES(20) PRINT(100*(PERIOD-TOTAL)/PERIOD,2,1) PRINT STRING("% ") %END ! ! %EXTERNALROUTINE PRINT SUPERVISOR PAGING %alias "C#PRINTSUPERVISORPAGING"(%STRING (63) S) %INTEGER I GET SUPERVISOR TIME PRINTCHS(VDUS(1)); !clear screen if its a VDU I=ADDR(COM_DATE0)+3 PRINT STRING(" EMAS370 SUP".STRING(ADDR(COM_SUPVSN))." PAGING ".STRING(I)." ".STRING(I+12)." PERIOD=") PRINT(PERFORM_CLOCK>>12/1000000,1,3) PRINT STRING(" SECS") PRINTSTRING(" PAGEINS=".ITOS(PERFORM_PTURNN)." RECAPTURES=".ITOS(PERFORM_RECAPN)." SHARED PAGES=".ITOS(PERFORM_PSHAREN)." NEW PAGES=".ITOS(PERFORM_NEWPAGEN)." PREFETCHES=".ITOS(PERFORM_PREFETCHN)." UNUSED PREFETCHES=".ITOS(PERFORM_BADPREF)." WRITEOUTS=".ITOS(PERFORM_PAGEOUTN)." PAGES ZEROED=".ITOS(PERFORM_PAGEZN)." PAGES SNOOZED=".ITOS(PERFORM_SNOOZN)." PAGES ABORTED=".ITOS(PERFORM_ABORTN)) PRINTSTRING(" SNOOZES COMPLETE =".ITOS(PERFORM_SNOOZOK)." SNOOZES TIMEDOUT =".ITOS(PERFORM_SNOOZTO)." SNOOZES ABANDONED=".ITOS(PERFORM_SNOOZAB)." FORCED DEACTIVATES=".itos(perform_fdeact)." No Page tables=".itos(perform_noptabs)." ") %END %RECORDFORMAT TABF(%STRING (15) S, %INTEGER PERCENT) %ROUTINE PRINT TABLE(%RECORD (TABF) %ARRAYNAME TABLE, %INTEGER N,LIMIT, %STRING (255) T) %INTEGER I,J %RECORD (TABF) TEMP %CYCLE J=0 %FOR I=0,1,N-1 %CYCLE %IF TABLE(I)_PERCENT20 SPACES((72-LENGTH(T))//2) PRINTSTRING(T) NEWLINE SPACES(17) WRITE(I,4) %FOR I=0,10,100 NEWLINE %FOR I=0,1,N %CYCLE %EXITIF TABLE(I)_PERCENT1.99 %START K=K+1 TABLE(K)_S=S TABLE(K)_PERCENT=INT(100*SERVTIME/PERIOD) %FINISH TOTAL=TOTAL+SERVTIME %REPEAT K=K+1 TABLE(K)_S="INT/ACT/SEMA" TABLE(K)_PERCENT=INT(100*(PERIOD-TOTAL)/PERIOD) PRINT TABLE(TABLE,K,1,TITLE) %UNLESS TABLE(K)_PERCENT>100 %END ! ! ! %ROUTINE PAGEING OUT %RECORD (TABF) %ARRAY TABLE(0:8) %INTEGER I,J,K,DRUM INS,TABLE ENTRIES %LONGREAL PERIOD,TOTAL,SERVTIME %STRING (255) S,TITLE I=ADDR(COM_DATE0)+3 TITLE="EMAS370 SUP".STRING(ADDR(COM_SUPVSN))." PAGING ".STRING(I)." ".STRING(I+12)." Period=".ITOS %C (PERFORM_CLOCK>>12//1000000)." Secs "."Users=".ITOS(COM_USERS) DRUM INS=0 TABLE ENTRIES=6 TABLE(0)_S="Disc trans in" TABLE(0)_PERCENT=100*LENGTHENI((PERFORM_PTURNN-PERFORM_RECAPN-PERFORM_P SHAREN-PERFORM_NEWPAGEN-DRU %C M INS))//PERFORM_PTURNN TABLE(1)_S="RECAPTURES" TABLE(1)_PERCENT=100*LENGTHENI(PERFORM_RECAPN)//PERFORM_PTURNN TABLE(2)_S="SHARED" TABLE(2)_PERCENT=100*LENGTHENI(PERFORM_PSHAREN)//PERFORM_PTURNN TABLE(3)_S="NEWPAGES" TABLE(3)_PERCENT=100*LENGTHENI(PERFORM_NEWPAGEN)//PERFORM_PTURNN TABLE(4)_S="TRANSFERS OUT" TABLE(4)_PERCENT=100*LENGTHENI((PERFORM_PAGEOUTN-PERFORM_ABORTN))//PERFORM_PTURNN TABLE(5)_S="OUTS ABORTED" TABLE(5)_PERCENT=100*LENGTHENI(PERFORM_ABORTN)//PERFORM_PTURNN TABLE(6)_S="DFC USAGE" TABLE(6)_PERCENT=100*LENGTHENI((PERFORM_SERVN(33)-PERFORM_ABORTN))//(EPAGESPERSEC*(PERFORM_CLOCK>>12//1000000)) PRINT TABLE(TABLE,TABLE ENTRIES,1,TITLE) %END ! ! %EXTERNALROUTINE PRINT TIME %alias "C#PRINTTIME"(%STRING (63) S) %STRING (63) TEMP %INTEGER I,SECONDS SECONDS=STOI(S) %IF SECONDS=X'80808080' %THEN SECONDS=0 TEMP="" %CYCLE PRINTCHS(VDUS(1)) GET SUPERVISOR TIME TIMEOUT %EXITIF SECONDS=0 %OR TEMP="STOP" %OR TEMP="stop" I=DDELAY(SECONDS) TEMP=INTERRUPT %REPEAT %END ! ! %EXTERNALROUTINE PRINT PAGING %alias "C#PRINTPAGING"(%STRING (63) S) %STRING (63) TEMP %INTEGER I,SECONDS SECONDS=STOI(S) %IF SECONDS=X'80808080' %THEN SECONDS=0 TEMP="" %CYCLE PRINTCHS(VDUS(1)) GET SUPERVISOR TIME PAGEING OUT %EXITIF SECONDS=0 %OR TEMP="STOP" %OR TEMP="stop" I=DDELAY(SECONDS) TEMP=INTERRUPT %REPEAT %END ! ! %EXTERNALROUTINE PRINT ALL %alias "C#PRINTALL"(%STRING (63) S) %STRING (63) TEMP %INTEGER I,SECONDS SECONDS=STOI(S) %IF SECONDS=X'80808080' %THEN SECONDS=0 TEMP="" %CYCLE PRINTCHS(VDUS(1)) GET SUPERVISOR TIME TIMEOUT NEWLINE PAGEING OUT %EXITIF SECONDS=0 %OR TEMP="STOP" %OR TEMP="stop" I=DDELAY(SECONDS) TEMP=INTERRUPT %REPEAT %END ! ! %EXTERNALROUTINE PRINT STATES %alias "C#PRINTSTATES"(%STRING (63) S) %RECORD (PROCF) %ARRAYFORMAT PROCAF(0:MAXPROCS) %RECORD (PROCF) %ARRAYNAME PROCA PROCA==ARRAY(COM_PROCAAD,PROCAF) %INTEGER MAXCAT MAXCAT=INTEGER(COM_CATTAD) %RECORD (CATTABF) %ARRAYFORMAT CATTABAF(0:MAXCAT) %RECORD (CATTABF) %ARRAYNAME CATTAB CATTAB==ARRAY(COM_CATTAD+4,CATTABAF) %RECORD (PROCF) %NAME PROC %RECORD (TABF) %ARRAY TABLE(0:11) %STRING (255) TITLE,TEMP %INTEGER I,J,SECONDS SECONDS=STOI(S) %IF SECONDS=X'80808080' %THEN SECONDS=0 TEMP="" %CYCLE PRINTCHS(VDUS(1)) TABLE(I)=0 %FOR I=0,1,11 TABLE(0)_S="Page Fault" TABLE(1)_S="Dealloc AMT" TABLE(2)_S="Run Q 1" TABLE(3)_S="Run Q 2" TABLE(4)_S="Store Q 1" TABLE(5)_S="Store Q 2" TABLE(6)_S="Store Q 3" TABLE(7)_S="Store Q 4" TABLE(8)_S="Store Q 5" TABLE(9)_S="Snoozing" TABLE(10)_S="LC Snoozing" TABLE(11)_S="AMT Lost" %FOR I=1,1,MAXPROCS %CYCLE PROC==PROCA(I) %IF PROC_USER#"" %START %IF PROC_ACTIVE=255 %START %IF PROC_STATUS&2=0 %START %IF PROC_STATUS&8=0 %START %IF PROC_RUNQ#0 %START %IF PROC_RUNQ=1 %THEN TABLE(2)_PERCENT=TABLE(2)_PERCENT+1 %ELSE %C TABLE(3)_PERCENT=TABLE(3)_PERCENT+1 %FINISHELSESTART TABLE(3+CATTAB(PROC_CATEGORY)_PRIORITY)_PERCENT=TABLE(3+CATTAB(PROC_CATEGORY)_PRIORITY) %C _PERCENT+1 %FINISH %FINISHELSE TABLE(1)_PERCENT=TABLE(1)_PERCENT+1 %FINISHELSE TABLE(0)_PERCENT=TABLE(0)_PERCENT+1 %FINISHELSESTART %IF PROC_STATUS&1<<4#0 %THEN TABLE(11)_PERCENT=TABLE(11)_PERCENT+1 %IF PROC_STATUS&1<<7#0 %THEN TABLE(9)_PERCENT=TABLE(9)_PERCENT+1 %IF PROC_STATUS&1<<9#0 %THEN TABLE(10)_PERCENT=TABLE(10)_PERCENT+1 %FINISH %FINISH %REPEAT TABLE(I)_PERCENT=100*TABLE(I)_PERCENT//COM_USERS %FOR I=0,1,11 I=ADDR(COM_DATE0)+3 TITLE="EMAS370 SUP".STRING(ADDR(COM_SUPVSN))." PROCESS STATES ".STRING(I)." ".STRING(I+12)." Period=".ITOS %C (SECONDS)." Secs "."Users=".ITOS(COM_USERS) PRINT TABLE(TABLE,11,1,TITLE) %EXITIF SECONDS=0 %OR TEMP="STOP" %OR TEMP="stop" I=DDELAY(SECONDS) TEMP=INTERRUPT %REPEAT %END ! %EXTERNALROUTINE PRINT CATS %alias "C#PRINTCATS"(%STRING (63) S) %RECORD (PROCF) %ARRAYFORMAT PROCAF(0:MAXPROCS) %RECORD (PROCF) %ARRAYNAME PROCA PROCA==ARRAY(COM_PROCAAD,PROCAF) %INTEGER MAXCAT MAXCAT=INTEGER(COM_CATTAD) %RECORD (PROCF) %NAME PROC %RECORD (TABF) %ARRAY TABLE(0:MAX CAT-1) %INTEGER I,J,SECONDS %STRING (255) TITLE,TEMP SECONDS=STOI(S) %IF SECONDS=X'80808080' %THEN SECONDS=0 TEMP="" %CYCLE PRINTCHS(VDUS(1)) %FOR I=0,1,MAX CAT-1 %CYCLE TABLE(I)=0 TABLE(I)_S="Category ".ITOS(I+1) %REPEAT %FOR I=1,1,MAXPROCS %CYCLE PROC==PROCA(I) %IF PROC_USER#"" %START TABLE(PROC_CATEGORY-1)_PERCENT=TABLE(PROC_CATEGORY-1)_PERCENT+1 %FINISH %REPEAT TABLE(I)_PERCENT=100*TABLE(I)_PERCENT//COM_USERS %FOR I=0,1,MAX CAT-1 I=ADDR(COM_DATE0)+3 TITLE="EMAS370 SUP".STRING(ADDR(COM_SUPVSN))." PROCESS CATEGORIES ".STRING(I)." ".STRING(I+12)." Period=". %C ITOS(SECONDS)." Secs "."Users=".ITOS(COM_USERS) PRINT TABLE(TABLE,MAX CAT-1,1,TITLE) %EXITIF SECONDS=0 %OR TEMP="STOP" %OR TEMP="stop" I=DDELAY(SECONDS) temp=INTERRUPT %REPEAT %END ! %ENDOFFILE