!* COMMUNICATIONS RECORD FORMAT - EXTANT FROM CHOPSUPE 21B ONWARDS * RECORDFORMAT COMF(INTEGER OCPTYPE,IPLDEV,SBLKS,SEPGS,NDISCS, C DLVNADDR,GPCTABSIZE,GPCA,SFCTABSIZE,SFCA,SFCK,DIRSITE, C DCODEDA,SUPLVN,TOJDAY,DATE0,DATE1,DATE2, C TIME0,TIME1,TIME2,EPAGESIZE,USERS,CATTAD,SERVAAD, C BYTEINTEGER NSACS,RESV1,SACPORT1,SACPORT0, C NOCPS,RESV2,OCPPORT1,OCPPORT0, C INTEGER ITINT,CONTYPEA,GPCCONFA,FPCCONFA,SFCCONFA, C BLKADDR,RATION,SMACS,TRANS,LONGINTEGER KMON, C INTEGER DITADDR,SMACPOS,SUPVSN,PSTVA,SECSFRMN,SECSTOCD, C SYNC1DEST,SYNC2DEST,ASYNCDEST,MAXPROCS,INSPERSEC,ELAPHEAD, C COMMSRECA,STOREAAD,PROCAAD,SFCCTAD,DRUMTAD,TSLICE,FEPS, C MAXCBT,PERFORMAD,SP1,SP2,SP3,SP4,SP5,SP6, C LSTL,LSTB,PSTL,PSTB,HKEYS,HOOT,SIM,CLKX,CLKY,CLKZ, C HBIT,SLAVEOFF,INHSSR,SDR1,SDR2,SDR3, C SDR4,SESR,HOFFBIT,BLOCKZBIT,BLKSHIFT,BLKSIZE,END) ! ! This format describes "The Communication Record" which is kept ! locked in store at Public address X'80C00000'. It is readable at ! all ACR levels but writeable at ACR 1 only. Its purpose is to describe ! the hardware on which the EMAS System is running. Each entry is now ! described in more detail:- ! ! OCPTYPE The 2900 Processor on this configuration as follows ! 1 = 2950 or S1 ! 2 = 2960 or P2 ! 3 = 2970 or P3 ! 4 = 2980 or P4 ! 5 = 2972 or non-interleaved 2976 (P4/1) ! 6 = Interleaved 2976 or P4/1 ! ! IPLDEV The port/trunk/stream(or DCU/stream) of the ! device used at IPL time. ! SBLKS The no of 128k blocks of main store present ! SEPGS The no of extended pages for paging(ie not including ! any pages occupied by resident code & data). ! NDISCS Then number of EDS drives avaliable ! DLVNADDR The address of an array which maps disc lvns to ! their ddt slots. ! GPCTABSIZE The size in bytes of the GPC (or DCU) table ! GPCA The address of the GPC (or DCU) table ! SFCTABSIZE The size of the SFC(ie DRUM) table ! SFCA The address of the SFC table ! SFCK The number of (useable) 1K page frames of Drum store ! available for paging.(0 = No drum configuration) ! DIRSITE The Director site address(eg X200) no longer reqd? ! DCODEDA The Disc Address of the Director (expressed as ! SUPLVN<<24!DIRSITE) ! SUPLVN The logical volume no of the disc from which the ! Sytem was "SLOADED". Various System components (eg ! DIRECT, VOLUMS will page from here ! ! TOJDAY Todays (Julien) day number. ! DATE0} These three integers define the current date(updated at ! DATE1} at 2400) as a character string such that ! DATE2} the length byte is in the bottom of DATE0 ! ! TIME0} These three integers define the clock time as a string ! TIME1} in the same format as for DATE. The time is updated ! TIME2} about every 2 seconds ! ! EPAGESIZE The number of 1K pages combined together to make up ! the logical "Extended Page" used in Emas.Currently=4 ! USERS The number of user processes (foreground+background) ! currently in existence.Includes DIRECT,VOLUMS&SPOOLR ! CATTAD Address of maxcat followed by category table. ! SERVAAD The address of the service array SERVA. ! NSACS The number of sacs found at grope time ! SACPORT1} Holds the Port no of the Store Access Controller(s) ! SACPORT0} found at grope time. SACPORT0 was used to IPL system. ! NOCPS The number of OCPS found at grope time. ! OCPPORT1} Hold the Port no of the OCPs found at grope time. ! OCPPORT0} OCPPORT0 was used to IPL the system. ! ITINT The Interval Timer interval in microsecs. Varies ! between different members of the range ! CONTYPEA The address of a 31 byte area containing the codes ! of the controllers in port-trunk order. Codes are:- ! 0 = Not relevant to EMAS ! 1 = SFC1 ! 2 = FPC2 ! 3 = GPC1 ! ! GPCCONFA} These three variables each point to a word array ! FPCCONFA} containing controller data. The first word in each ! SFCCONFA} case says how many controllers on the system. The ! remainder have Port&Trunk in top byte and Public ! segment no of comms segment in bottom byte. For GPCS ! the Public Seg no is apparently omitted! ! BLKADDR The address of first element of a word array bounds ! (1:SBLKS) containing the real address of each 128K ! block of main store. Real addresses are in the form ! RSN/SMAC NO/Address in SMAC ! RATION Information maintained by DIRECT concerning access ! rationing. Bytes from left indicate scarcity, ! pre-empt point, zero and interactive users ! respectively ! SMACS Bits 0-15 are a map of SMACS in use by the system. ! 2**16 bit set if SMAC0 in use etc. ! Bits 16-31 are a map of SMACS found at grope time. ! 2**0 bit set if SMAC0 found etc. ! TRANS The address of a 768 byte area containing 3 translate ! tables. The first is ISO to EBCDIC, the second the ! exact converse & the third is ISO to ISO with ! lower to upper case conversion. ! KMON A 64 bit bitmask controlling monitoring of Kernel ! services. Bit 2**n means monitor service n. Bits can ! be set by Operator command KMON. ! DITADDR Disc index table address. The address of first ! element of an array(1:NDISCS) containing the address ! of the disc device entries. Needed for S series and ! provided for compatablity on P series ! SMACPOS The no of places that the Smac no must be left ! shifted to be in the right position to access ! a Smac image store location. Incredibly this varies ! between the 2980 and others!! ! SUPVSN The Supervisor id no as a three char string eg 22A ! PSTVA The virtual address of the Public Segment table which ! is itself a Public segment. All other information ! about PST can be found by looking at its own PST entry ! SECSFRMN The no of Seconds since midnight. Updated as for TIME ! SECSTOCD The number of seconds to System closedown if positive ! If zero or negative no close down time has yet been ! notified. Updated as for TIME ! SYNC1DEST} These are the service nos N2,N3 & N4 for process ! SYNC2DEST} parameter passing described in Supervisor Note 1 ! ASYNCDEST} ! MAXPROCS The maximum number of paged processes that the ! Supervisor is configured to run. Also the size ! of the Process array. ! INSPERSECS The number of instructions the OCP executes in 1 ! second divided by 1000(Approx average for EMAS) ! ELAPHEAD The head of a linked list of param cells holding ! service with an elapsed interval interrupt request ! outstanding ! COMMSRECA The address of an area containing details of the ! Communication streams.(private to COMMS Control) ! STOREAAD The address of first element of the store record array ! bounds (0:SEPGS-1) ! PROCAAD The address of first element of the process record ! array bounds(0:MAXPROCS) ! SFCCTAB} The addresses of two private tables provided by grope ! DRUMTAD} for use by the routine DRUM. They give details of ! the SFCS and DRUMS found on the system ! TSLICE Time slice in microsecs. Supervisor has to allow for ! differences in interval timer speeds accross the range ! FEPS Bits 0-15 are a map of FEPs found at grope time. ! 2**16 bit set if FE0 found etc. ! Bits 16-31 are a map of currently available FEPs. ! 2**0 bit set if FE0 available etc. ! MAXCBT Maximum cbt entry ! PERFORMAD Address of record containing timing and counts for ! performance anlysis. ! SP1->SP6 Spare locations ! LSTL} ! LSTB} ! PSTL} ! PSTB} These are the image store addresses for the following ! HKEYS} control registers:- ! HOOT} Local Segment Table Limit & Base ! SIM } Public Segment Table Limit & Base ! CLKX} Handkeys,Hooter System Interrupt Mask Register ! CLKY} and the clock X,Y & Z Registers ! CLKZ} ! HBIT A bit pattern that when ORed into Control Register ! "HOOT" operates the Hooter.(0=Hooterless machine) ! SLAVEOFF A bit pattern (top 16 bits) and Image store address ! in bottom 16 bits. ORing the top 16 bits(after ! shifting) into the image store will stop all slaving of ! operands but not instructions ! INHSSR A bit pattern and image location as for SLAVEOFF. ! ORing the bits into the location will switch off ! reporting of successful system retry ! SDR1} ! SDR2} The image store addresses of SMAC internal registers ! SDR3} needed by the Engineers after Smac errors have ! SDR4} occurred ! SESR} ! HOFFBIT A bit pattern that when ORed into a Smac Engineers ! status register will stop reporting of error ! from that Smac ! ! BLOCKZBIT A bit pattern indicating the position of ! the block zero bit in the SMAC config register. ! ! BLKSHIFT Indicates which way to shift the BLOCKZBIT mask ! to correspond with subsequent store blocks. ! ! BLKSIZE Store block size. ! CONSTRECORD (COMF)NAME COM=X'80000000'+48<<18 !----------------------------------------------------------------------- CONSTSTRING (4) ARRAY PROCESSOR TYPE(1:6) = C "2950", "2960", "2970", "2980", "2972", "2976" !---------------------------------------------------------------------- SYSTEMSTRING (15)FNSPEC ITOS(INTEGER I) SYSTEMROUTINESPEC MOVE(INTEGER LENGTH, FROM, TO) EXTERNALSTRINGFNSPEC VDUS(INTEGER I) EXTERNALROUTINESPEC PRINTCHS(STRING (255)S) EXTERNALROUTINESPEC PROMPT(STRING (15) S) EXTERNALROUTINESPEC DDELAY(INTEGER SECS) EXTERNALSTRING (15)FNSPEC INTERRUPT EXTERNALINTEGERFNSPEC STOI(STRINGNAME S) !----------------------------------------------------------------------- ! TIMING INFORMATION DECS. RECORDFORMAT PERFORMF(INTEGER RECAPN,PTURNN,PSHAREN,NEWPAGEN, C PAGEOUTN,PAGEZN,SNOOZN,ABORTN,SNOOZOK, C SNOOZTO,SNOOZAB, C LONGINTEGER CLOCK, C LONGINTEGERARRAY SERVIT,SERVIC(0:LOCSN0+3), C INTEGERARRAY 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),"GPC REQUESTS","TAPE", "OPER","LP ADAPTOR","CR ADAPTOR","CP ADAPTOR","PRINTER", "COMMS CONTROL","COMBINE","FEP ADAPTOR","GPC INTERRUPT", ""(2),"BMREP","COMREP",""(2),"LOCAL CONTROL","FOREGRND USERS", "BACKGRND USERS" !----------------------------------------------------------------------- ! SCHEDULING CATEGORY TABLES RECORDFORMAT CATTABF(BYTEINTEGER PRIORITY,EPLIM,RTLIM,MOREP,MORET, C LESSP,SP0,SUSP,RQTS1,RQTS2,STROBEI,SP2) !----------------------------------------------------------------------- ! PROCESS INORMATION ETC. RECORDFORMAT PROCF(STRING (6) USER, C BYTEINTEGER INCAR, CATEGORY, P4TOP4, RUNQ, ACTIVE, C INTEGER ACTW0, LSTAD, BYTEINTEGER EPA,EPN,HALFINTEGER LAMTX,C 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" !----------------------------------------------------------------------- ! ! EXTERNALROUTINE PRINT CATEGORY TABLE(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 print string(string(ADDR(COM_SUPVSN))." ") print string("Dual") if com_nocps#1 print string(processor type(com_ocptype)) print string(" Store=") write(com_sblks*128,0) print string("K Page size=") write(com_epagesize,0) print string("K Time slice=") print(com_tslice/1000000,1,4) printstring("s ") print string(string(addr(Com_date0)+3)." ".string(addr(com_time0)+3)) newline PRINT STRING( c "Category Priority Store Time More More Less Wait RQueue RQueue Strobe") newline print string( c " queue limit limit Store Time Store Slice1 Slice2 Time") NEWLINE FOR I=1,1,MAX CAT CYCLE WRITE(I,2) if cattab(i)_Sp0='B' then print string(" Back") else print string(" Fore") WRITE(CATTAB(I)_PRIORITY,6) WRITE(CATTAB(I)_EPLIM*com_epagesize,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(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) finish else start print string(" Store Q") write(cattab(proc_category)_priority,1) finish space finish else print string(" ".states(3)) finish else 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 c proc_status&(1<<j)#0 and states(j)#"" start print string(" ".states(j)) exit finish repeat if proc_active#0 start write(proc_active*20,4) print string(" s") finish else spaces(7) finish if proc_epa#0 start print string(" pages") write(proc_epa,3) print string(" used") write(proc_epn,3) finish else spaces(19) print string(" ".states(0)) if proc_status&1#0 and proc_active=255 print string(" ".states(5)) if proc_status&32#0 and proc_active=255 print string(" ".states(6)) if proc_status&64#0 and proc_active=255 print string(" ".states(7)) if proc_status&128#0 and proc_active=255 print string(" ".states(9)) if proc_status&512#0 and proc_active=255 newline exit if s=proc_user finish repeat END ! ! EXTERNALROUTINE WATCH(STRING (63) S) STRING (63) INT,TEMP INTEGER SECONDS IF S->S.(",").TEMP THEN SECONDS=STOI(TEMP) ELSE SECONDS=2 CYCLE PRINTPROCESSLIST(S) DDELAY(SECONDS) INT=INTERRUPT EXIT IF INT="STOP" OR INT="stop" REPEAT END LONGINTEGERFN CLOCK LONGINTEGER L *RRTC_0 *ST_L RESULT =(L>>33<<32!L&X'0FFFFFFFF')<<1 END ; ! OF CLOCK ! ! ROUTINE GET SUPERVISOR TIME RECORD (PERFORMF) NEWTIMES INTEGER I MOVE((11+2+5*68)*4,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_CLOCK=NEWTIMES_CLOCK-OLDTIMES_CLOCK FOR I=0,1,LOCSN0+3 CYCLE PERFORM_SERVIT(I)=NEWTIMES_SERVIT(I)-OLDTIMES_SERVIT(I) PERFORM_SERVIC(I)=NEWTIMES_SERVIC(I)-OLDTIMES_SERVIC(I) PERFORM_SERVN(I)=NEWTIMES_SERVN(I)-OLDTIMES_SERVN(I) REPEAT PERFORM_SERVIC(0)=PERFORM_SERVN(0) PERFORM_SERVIC(1)=PERFORM_SERVN(1) OLDTIMES=NEWTIMES END EXTERNALROUTINE PRINT SUPERVISOR TIME(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(" EMAS2900 SUP".STRING(ADDR(COM_SUPVSN))." TIMING ". C STRING(I)." ".STRING(I+12). C " PERIOD=") PRINT(PERFORM_CLOCK/1000000,1,1) PRINT STRING(" SECS") PERIOD=PERFORM_CLOCK*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,1) PRINT STRING("% ") FINISH TOTAL=TOTAL+SERVTIME 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(string (63) s) INTEGER I get supervisor time printchs(VDUS(1)); !clear screen if its a VDU I=ADDR(COM_DATE0)+3 PRINT STRING(" EMAS2900 SUP".STRING(ADDR(COM_SUPVSN))." PAGING ". C STRING(I)." ".STRING(I+12). C " PERIOD=") PRINT(PERFORM_CLOCK/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)." 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)." ") end recordformat tabf(string (15) s, integer percent) routine print table(record (tabf)arrayname table, integer n,limit, c string (255) t) integer i,j record (tabf) temp cycle j=0 for i=0,1,n-1 cycle if table(i)_percent<table(i+1)_percent start temp=table(i) table(i)=table(i+1) table(i+1)=temp j=1 finish repeat exit if j=0 repeat n=20 if n>20 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 exit if table(i)_percent<limit print string(table(i)_s) spaces(16-length(table(i)_s)) write(table(i)_percent,2) print string("% ") printsymbol('*') for j=0,1,table(i)_percent//2 newline repeat END ! ! EXTERNALROUTINE PRINT TIME(STRING (63) S) ROUTINESPEC TIMEOUT GET SUPERVISOR TIME TIMEOUT RETURN ! ! ROUTINE TIMEOUT !*********************************************************************** !* PRINT OUT THE SESSION TIMING MEASUREMENTS * !*********************************************************************** RECORD (TABF)ARRAY TABLE(0:LOCSN0+4) INTEGER I,J,K LONGREAL PERIOD, TOTAL,SERVTIME STRING (255) S,title I=ADDR(COM_DATE0)+3 title="EMAS2900 SUP".STRING(ADDR(COM_SUPVSN))." MEASUREMENTS ". C STRING(I)." ".STRING(I+12)." PERIOD=".ITOS(PERFORM_CLOCK//1000000)." SECS" PERIOD=PERFORM_CLOCK*COM_NOCPS k=-1 TOTAL=0 CYCLE I=0,1,LOCSN0+3 S=SERVROUT(I) SERVTIME=COM_ITINT*PERFORM_SERVIT(I) IF S#"" AND PERFORM_SERVN(I)#0 and 100*servtime/period>1.0 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) printchs(vdus(1)) print table(table,k,1,title) END END ! ! EXTERNALROUTINE PRINT PAGING(STRING (63) S) ROUTINESPEC PAGEING OUT GET SUPERVISOR TIME PAGEING OUT RETURN ! ! ROUTINE PAGEING OUT RECORD (TABF)ARRAY TABLE(0:3) INTEGER I,J,K LONGREAL PERIOD, TOTAL,SERVTIME STRING (255) S,title I=ADDR(COM_DATE0)+3 title="EMAS2900 SUP".STRING(ADDR(COM_SUPVSN))." PAGE INS ". C STRING(I)." ".STRING(I+12)." PERIOD=".ITOS(PERFORM_CLOCK//1000000)." SECS" TABLE(0)_S="TRANSFERS" TABLE(0)_PERCENT= 100*(PERFORM_PTURNN-PERFORM_RECAPN-PERFORM_PSHAREN C -PERFORM_NEWPAGEN)//PERFORM_PTURNN TABLE(1)_S="RECAPTURES" TABLE(1)_PERCENT=100*PERFORM_RECAPN//PERFORM_PTURNN TABLE(2)_S="SHARED" TABLE(2)_PERCENT=100*PERFORM_PSHAREN//PERFORM_PTURNN TABLE(3)_S="NEWPAGES" TABLE(3)_PERCENT=100*PERFORM_NEWPAGEN//PERFORM_PTURNN printchs(vdus(1)) print table(table,3,0,title) END END ENDOFFILE