TITLE TRACK A PROGRAM TO TRACK JOB EXECUTION AND SYSTEM PERFORMANCE SUBTTL IRWIN L. GOVERMAN/ILG/EVS/ILG/RBP 12-JAN-77 MLON IFNDEF BIGLST, ;DEFAULT TO CLEAN LISTING IFN BIGLST, IFE BIGLST, UNILOG==1 UNISYS==3 UNICHN==5 UNISTS==36 UNINAM==0 ; SEARCH MACTEN,UUOSYM SEARCH MACTEN,UUOSYM ; SHOW VERSION OR ERROR MESSAGE IFNDEF %%MACT, SHOW.(%%MACT) IFNDEF %%UUOS, SHOW.(%%UUOS) ; VERSION AND EDIT NUMBERS TRKVER==5 TRKEDT==225 TRKMIN==1 TRKWHO==0 LOC 137 VRSN. (TRK) ;FORMAT VERSION NUMBER ; SET REENTRY POINT LOC 124 RESTRT RELOC COMMENT @ Development by Pito Salas includes the following: 1) Adding a /DAILY switch to have the following function: a: IF the output file specified in a command does not already exist, THEN it is created. ELSE, the date of the existing one is checked. IF it is equal to todays date, THEN the current data is appended to that file. ELSE, that file is renamed to be MMDDYY.ext, where MM=this month DD=today's date YY=this year ext= TRK or TXT depending on /FORMAT and a new file is started with the specified name. b: IF TRACK is running when daytime goes through midnite, THEN the output file is renamed to MMDDYY.ext as above, and a new file of the specified name is started. 2) The header of the TRACE files is slightly changed, so as to conform with FACT files. This allows piping together of TRACE files with FACT files for later analysis, without confusing FACT analysis programs. 3) Adding a 'Real' response time measure. @ SUBTTL REVISION HISTORY ;** EDIT HISTORY ** ;225 Slight change in format of output for non-TRACE mode, ; so that mean and SD are on 1 line together ; Changed DEXTT to be TRC rather than TRK, to both make sense ; and to conform with documentation ;224 Removed the code to track %busy rather than queue lengths for ; disks/tapes. Too costly under post 7.01A monitors where the ; disk database is accessible only via PEEK UUOs, not SPY hiseg. ;223 ? ;222 Changed TRACEH to put out V4 TRACK format entries: first word ; is entry type, second is length, and data follows immediately. ; removed all of the snet hack for disk names ; reorganized entries in SYSDAT call to be by function, not ; cpu# ;221 added switches to control use of meter boards on a system-wide ; of per-cpu basis. use /METER for all cpus, or /METERn for ; cpu n. ;220 Hacked SNEBSY to not die if a non-RP disk is seen. Will fix ; this routine later, or turn of SNET ft switch that munges disk names. ;217 Add support for more than 2 processors. Use NCPU for multi-CPU ; tests instead of CPU.1 /rbp ;;** END OF 4(216). 5(217) HAS FULL SMP SUPPORT ;** TRACK-X VERSION STARTED HERE ;216 FIX BUG THAT CAUSED EXTRA DISK IO FOR SYSTEM TRACKS ;215 ALLOW SWAPPING DISK IO TO BE TRACKED WITHOUT USER DISK IO ;214 CALCULATE USER MEM AS TOTAL-(MONITOR HIGH+MONITOR LOW) ;213 REDO THE UNIT/CHANNEL STUFF SO NOT INTERDEPENDENT ;212 ADD SWAP SPACE LEFT TO SYSDAT,REMOVE SWAPPER DATA ;211 FLAG VIRTUAL JOBS WITH "V", ON PRINTOUT ;210 RE-DO UNITYP, INCLUDING NEWER DISK TYPES ;207 USE FILOP. FOR OUTPUT FILE SAVE FUNCTION, PRODUCES SMALLER FILE ;206 ADD EXIT COMMAND ;205 ADD /HELP:KEYWORD FOR GETTING VALUES OF COMPARE, INCLUDE/EXCLUDE ;204 BET YOU THOUGHT EDIT 203 WAS CORRECT, DIDN'T YOU? ;203 MAKE GETCOR A LITTLE BRIGHTER ON VM SYSTEMS ;202 ADD WILD CARD "*" TO PPN MATCH CODE ;201 MAKE PPN AND PROGRAM WATCHING ABLE TO DO MULTIPLE JOBS ;200 MAKE CHANNEL AND DISK STUFF NORMALLY EXCLUDED ;177 REMOVE RT/WANTED TO RT SINCE WAS NEVER RIGHT ;176 DON'T PRINT USERS PROLOG IF NO JOBS MATCH SPECS ;175 IMPLEMENT HELP:SWITCHES ;174 GIVE RIGHT TTY NUMBER IF JOB TRACKED VIA 'PROG' ;173 CORE SIZE COMPUTATION INCORRECT FOR VM SYSTEMS ;172 CORRECT THE BYTE POINTER USED FOR IMGIN IN ROUTINE VMSEG ;171 CLEAN UP "?TRKSVS SWITCH VALUE TOO SMALL" TYPEOUT ;170 CLEAR TAB.P ON RESTART OF TRACK ;167 ADD TRACKING OF A PROGRAM VIA 'PROGNM' TYPE CONSTRUCTION ;166 ADD TRACKING OF SCANNER SERVICE RECEIVE AND XMIT INTERUPTS ;165 REMOVE /CHANNEL AND /DISK:NONE ;164 ADD /INCLUDE AND /EXCLUDE SWITCHES ;163 INCREASE SIZE OF SEGTAB ;162 ADD ARGUMENTS FOR /COMPARE ;161 DONT PRINT RUNTIME IF DOING ALL USERS ;160 CHANGE DEFAULT VALUE OF GETUNI ;157 ADD ENQ TO LIST OF PRIVELEGES A JOB MIGHT HAVE ;156 B%RPT WORD OF %BSGO IN TRACE REPORT WAS MISSING ;155 ADD UUOS PER SECOND ON EACH CPU ;154 IDLE TIME WAS REALLY NULL TIME - CHANGE TO REAL IDLE TIME ;153 DON'T PRINT OUT POSTITION WAIT QUEUE FOR RS04 - REQUIRES ; .DCCFS DO BE DEFINED IN UUOSYM, WHICH IT WAS NOT IN TIME ; FOR 602 MONITOR ;152 CHANGE KL10 CACHE VARIABLES TO PER SECOND QUANTITIES ;151 CHANGE SYSGET AND SYSDIS TO CALL ITEM DEPENDENT ROUTINE ; ONLY IF AN ENTRY EXISTS IN TAB.P FOR THE ITEM. ;150 FIX EDIT 147 ;147 ADD NEW 1088 KL10 CACHE RELATED VARIABLES TO SYSTEM DISPLAY ;146 ADD NUMBER OF UNWINDS, NUMBER OF TIMES JOB WAS RUN TO GIVE ; UP RESOURCE BECAUSE IT WAS SELECTED TO SWAP OUT, SWAPPER ; NULL AND LOST TIME TO SYSTEM DISPLAY ;145 ADD % OF TTY CHUNKS USED TO SYSTEM DISPLAY ;144 USE MAXMAX (%NSMXM) INSTEAD OF SUBTRACTING SYSSIZ FROM CORE SO ; TRACK WORKS WITH TWO SEGMENT MONITOR ;143 GET LENGTH OF DISK RELATED QUEUES FROM DSKCHR ;142 SEARCH MACTEN,UUOSYM INSTEAD OF C ;141 ADD MISSING CHECK FOR COMMA IN TPPN ROUTINE ;140 FIX UNITIALIZED BLT IN CHAN%I ROUTINE ;137 CHANGE LOOKUP AND ENTER ERROR PREFIXES ;136 ADD REPORT ON FREE CORE USAGE TO SYSTEM DATA ;135 MAKE "." WORK SAME AS SYSTAT, MAKE [,], [PROJ,],[,PROG] WORK ;134 ADD TRACE PACKAGE UNDER CONDITIONAL FTTRC ; ** END OF VERSION 3, VERSION 4 HAS TRACE CAPABILITY ;133 CLEAN GETCOR ;132 SPLIT DEFAULTS UP SO CAN HAVE DIFFERENT FOR USERS,SYS,JOB ETC. ;131 FIX MONDEP VALUES THAT WERE WRONG ;130 REMOVE INTERNAL HELP TEXT ;127 FIX SPACING PROBLEM IN CONFIG DATA PRINTOUT ;126 CLEAR CTRKJ BETWEEN USER PRINTOUTS ;125 FIX ^Z FROM INDIRECT DEVICE, MAKE IT FORCE A BREAK LIKE SCAN ;124 ADD INDIRECT FILE ;123 ADD MORE CONFIGURATION INFO ;122 ADD W TO RUNNING COMMANDS ;121 ADD FF TO SEPARATE APPENDED SYS REPORTS ;120 ADD MORE SYSINI CONFIGURATION DATA ;117 ADD DISK AND CHANNEL SWITCHES ;116 FIX BUG IN FILSPC THAT CHANGED FOO. TO FOO.TXT ;115 MORE OF EDIT 114 ;114 MAKE A "USERS" COMMAND BE REPEATABLE ;113 MAKE [P,PN]/NOKILL WORK THE SAME AS FOR JOBS ;112 ADD /SUMMARY SWITCH FOR DELETION OF FREQ ON SYSDAT ;111 BEGIN RESTRUCTURING OF COMMAND SCANNER ;;** END OF VERSION 2, VERSION 3 HAS NEW COMMAND FORMAT ;110 ADD LOCK UUO SWITCH ;107 ADD HPQ SWITCH ;106 REDUCE CORE IF WE HAVE SWOLLEN ;105 STEAL SYSTAT'S SUPERIOR INTEGER SQUARE ROOT ROUTINE ;104 RE-DO REGISTER ALLOCATIONS, CHECK FOR ILLEGAL TTY AND JOB NRS ;103 RE-FORMAT THE STD. DEVIATION AND CLEAN CODE ;102 ADD BRANDEIS STUFF (FORMAX) ;101 ADD STD. DEVIATION TO DB PRINTOUT ROUTINE ;100 CLEAN UP OF SEVERAL CODE AREAS ;77 BETTER ERROR MESSAGES FOR SWITCH PROCESSOR ;76 FIX SOME ERRORS CAUSED BY EDIT 74 ;75 ADD DDT COMMAND TO ENTER DEBUGGER , IF LOADED ;74 CHANGE ERROR MESSAGES SO ABLE TO DO LONG AND SHORT ;73 CHECK THAT CORE ASSIGNMENTS ARE REALLY MADE FOR VM SYSTEM ;72 UPDATE INTERNAL HELP TEXT ;71 ADD AVG. RESP. TIME TO SYSDAT TRACKING ;70 FIX OUTDBX ROUTINE SO IT CAN PRINT NUMBERS > 2 **18 ;67 FIX BUG THAT WAS SHOWN UP BY PRINTING OF UNPRIVELEGED TRACKS ;66 MAKE /C MORE USEFUL BY NOT COMPARING QUITE SO MANY ITEMS ;65 CHANGE SOME DEFAULT PARAMETERS ;64 FIX SWITCH SECTION VALUE GETTER AND CLEAN CODE ;63 FIX BUG IN GETTAB SIMULATOR INTRODUCED BY EDIT 61 ;62 ADD IPCF PRIVELEGE FUNCTION TO PUTPRV MODULE ;61 CHANGE TO USE C UNIVERSAL FILE ;60 MAKE /NOKILLWORK THE WAY HELP FILE SAYS IT DOES ;57 BE SUPER CAREFUL ABOUT DISK AND CHANNEL STUFF ;56 IMPLEMENT A WAY THAT SUB-VERSIONS OF MONITOR CAN BE IN MVTAB ;55 DONT TAB AFTER PPN (USERS) IF PPN > 11 CHARS ;54 EXIT ON ^Z INPUT ;53 MORE COMPLETE FILE ERROR MESSAGES ;52 ADD /NODISK SWITCH TO DELETE DISK & CHANNEL REPORT FOR SYSDAT ;51 RE-DO SWITCH MODULE ;50 TELL ABOUT KSYS TIMER (IF SET) WHEN DOING SYSTEM DATA ;47 ADD USERS COMMAND TO TAKE SINGLE SWEEP OF WHOLE SYSTEM ;46 INSERT .TEXT LOADING OF HELPER SO CAN JUST LOAD TRACK ;45 CHANGE CLRBFI UUO USAGE TO FLUSH ROUTINE SO PTY'S NOT A PROBLEM ;44 UPDATE THE INTERNAL HELP TEXT ;43 STOP TRACKING POSITION WAIT Q LENGTH FOR FIXED HEAD DEVICES ;42 MAKE MONITOR DEPENDENT THINGS MORE CHANGEABLE ;41 COMPUTE RT BEFORE WANTED TO RUN TIME SO DONT GET % > 100 IF BUSY ;40 ADD SYSTEM TRACKING OF RT/TIME WANTED TO RUN ;37 CLEANUP, 1 MORE WORD FOR SYS NAME AND ALLOW USER CORE >128 UNITS ;36 ADD TRACKING FOR SECOND CPU ;35 USE LESS STORAGE SPACE FOR EDIT 34 ;34 IMPLEMENT CHANNEL WATCHING (NR OF REQUESTS PER CHN) ;33 IMPLEMENT DISK UNIT WATCHING (POSITION WAIT Q) ;32 IMPLEMENT JOB QUEUE INFORMATION WATCHING ;31 IMPLEMENT USER KCS/SECOND AND USER DISK IO/SECOND ;30 INCLUSION OF THE SYSTEM DATA WATCHING MODULE ;** END OF VERSION 1, START OF VERSION 2 FROM HERE ON UP ;27 ALLOW WATCHING OF NULL JOB (JOB 0) ;26 STOP DOING GETTABS WHEN INFO IS IN PROCESS DATA BLOCK ;25 STOP SPACING SO MUCH BEFORE RUNTIME PRINT ;24 SUBTRACT PROCESSING TIME FROM SLEEP TIME ;23 IMPLEMENT SPY UUO SO FASTER FOR PRIVELEGED USERS ;22 CHECK FOR NO RESPONSE TIME TABLE IN MONITOR ;21 IMPLEMENT /S (STATISTICS) SWITCH ;20 IMPLEMENT SHORT FORM OF JOB SPECIFICATIONS ;17 INCORPORATE STANDARD HELP MODULE ;16 TAKE ACCOUNT OF FACT USER MAY HAVE GONE VIRTUAL ;15 RE-WRITE GETCOR ROUTINE TO BE FASTER ;14 CLEAN UP PRINT-OUT A LITTLE ;13 IMPLEMENT STANDARD INPUT ROUTINES FOR CHARACTER CONVERSION ;12 IMPLEMENT /U SWITCH TO TELL USER NAME AND PPN ;11 IMPLEMENT /P SWITCH TO TELL PRIVELEGE BITS ;10 RE-DO DATA STRUCTURES TO USE NESTED MACROS ;7 FIX ZEROING OF JOB AREA SO /I WORKS BETTER ;6 IMPLEMENT PPN,MYPPN JOB SPECIFICATIONS ;5 FIX HIBER SO DONT GET SPURIOUS WAKES ;4 CHANGE TO DEC STANDARD ERROR MESSAGES ;3 IMPLEMENT /D FOR DISK I/O SWITCH ;2 IMPLEMENT CURSOR POSITIONING ROUTINE ;1 THE FIRST ATTEMPT SUBTTL AC AND MISC. DECLARATIONS ; DEFINE THE ACS USED BY THE PROGRAM DEFINE ACS.(AA)< AA==ZZ ZZ=ZZ+1> ZZ==0 ACS.(SW) ;SWITCH REGISTER, USED TO HOLD FLAGS ACS.(T1) ;TEMP, USED FOR ARGUMENT PASSING ACS.(T2) ;TEMP ACS.(T3) ;TEMP ACS.(T4) ;TEMP ACS.(N1) ;USED BY ROUTINES ACS.(N2) ;USED BY ROUTINES ACS.(N3) ;USED BY ROUTINES ACS.(GT) ;USED FOR GETTAB AND SPY ACS.(J) ;USUALLY INDEX FOR JOB TABLES ACS.(FP) ;POINTER TO CURRENT OUTPUT FIELD ACS.(CHRCNT) ;COUNTER OF CHARACTERS USED ACS.(L) ;USED FOR INDIRECT PTR TO CURRENT SYSDAT PEEK NR. ACS.(STR) ;POINTS TO OUTPUT ASCIZ STRING OR ERROR MESSAGE ACS.(CHR) ;CURRENT INPUT/OUTPUT CHARACS.TER ACS.(P) ;THE OMNIPRESENT PUSH DOWN POINTER LUEB==T1 ;LOOKUP/ENTER BLOCK STARTING LOCATION IFN P-17, ; OUTPUT CHANNEL INFORMATION TY==1 ;OUTPUT CHANNEL TYB==2 ;NUMBER OF OUTPUT BUFFERS ; CODE TO LOCK UUO LOCCOD==LK.LLS!LK.LNE!LK.LNP ;LOCK ONLY ; EXTERNAL DECLARATIONS EXTERNAL .JBREL, .JBFF,.JBOPS,.JBDDT ; ; ; OTHER STUFF ; JOBSTATUS BITS JDC==100000 CMWB==200000 CLKR==1B18 JDCON==20000 JLOG==1B15 SWP==1B7 RUN==1B0 SHRSEG==1B1 SUBTTL DEFINE BITS IN FLAG REGISTER ; MACRO TO DEFINE SINGLE BIT SWITCHES DEFINE SW.(NAME)< IFE ZZ, NAME==ZZ ZZ=ZZ*2 >; END OF SW. MACRO DEFINITION ZZ==1 ;INITIALIZE SW.(OPT.S) ;/S, STATISTICS WANTED FOR TRACKED JOB SW.(OPT.C) ;/C, OUTPUT ONLY WHEN CHANGE IN TRACKED JOB SW.(OPT.I) ;/I, DO RUNTIME AND DISK IO INCREMENTAL SW.(OPT.F) ;F, FORCED LOOK AND PRINTOUT SW.(OPT.K) ;/K, DO NOT EXIT WHEN TRACKED JOB DISAPPEARS SW.(OPT.U) ;/U, PRINT USER NAME AND PPN SW.(OPT.P) ;/P, WATCH PRIVELEGE BITS THIS JOB SW.(R.SUMM) ;WANT SUMMARY OF DB PRINTOUT SW.(L.TTY) ;TRACKING A TTY SW.(L.JOB) ;TRACKING A JOB SW.(L.PPN) ;TRACKING A PPN SW.(L.PROG) ;TRACKING A PROGRAM SW.(L.USRS) ;TRACKING ALL USERS SW.(REGET) ;REGET LAST CHARACTER SCANNED SW.(BRK) ;SET BY INPUT, BREAK CHARACTER SEEN SW.(KI.10) ;SET IF ON A KI 10 PROCESSOR SW.(T.FLG) ;TEMPORARY FLAG USED BY VARIOUS ROUTINES SW.(NO.RSP) ;RESPONSE TIME TABLES NOT IN THIS MONITOR SW.(Y.SPY) ;CAN DO SPY SW.(SYSD) ;DOING SYSTEM DATA GATHERING SW.(SYSD.I) ;JUST INITIALIZED SYSTEM DATA SW.(GT.OPT) ;CURRENT GETTAB IS FOR OPTIONAL TABLE ;AND ITS NOT FATAL IF GETTAB FAILS SW.(F.TTY) ;FORCE OUTPUT TO TTY EVEN IF /SAVE OR /L IN EFFECT SW.(F.SPEC) ;A FILE SPEC WAS GIVEN ("=" SEEN) SW.(DEVTTY) ;OUTPUT DEVICE IS USER TTY SW.(MRET) ;DO AN EXIT 1, JUST BEFORE STARTING MAIN LOOP ;SO AN UPRIVELEGED USER CAN DO "CCONT" "DET" SEQUENCE SW.(R.LOCK) ;LOCKED JOB REQUESTED ;[rbp] SW.(CPU.1) ;SET IF SECOND PROCESSOR EXISTS SW.(NO.PRF) ;OMIT PREFIX FROM ERROR MESSAGES (E=2) SW.(NO.LIN) ;OMIT REST OF LINE FROM ERROR MESSAGES (E=1) SW.(MD.TRC) ;MODE OF OUTPUT FILE IS TRACE (BINARY) SW.(INDFLG) ;INDIRECT FILE "@" IS BEING READ SW.(FT.VM) ;THIS SYSTEM SUPPORTS VM SW.(UHP) ;ON MEANS USER HEADER PROLOG IS PRINTED ZZ==ZZ ;SHOW NUMBER OF BITS IN USE ;BITS TO BE MEMORIZED AND NOT FORGOTTEN BETWEEN COMMANDS STKDFL==KI.10!Y.SPY!F.TTY!FT.VM SUBTTL TRACK TRACING FORMAT (BINARY FORMAT) COMMENT @ TRACK USES A SPECIAL FORMAT FOR ITS BINARY OUTPUT. THIS MEANS THAT THE FORMAT IS NOT FIXED BY POSITION. EACH TYPE OF DATA THAT CAN BE OUTPUT WHEN TRACK IS IN TRACE MODE IS OF THE FORM: ----------------------------------------------------- ! BLOCK TYPE ! ----------------------------------------------------- ! LENGTH (including header) ! ----------------------------------------------------- ! FIRST DATA WORD ! ----------------------------------------------------- ! NEXT DATA WORD ! ----------------------------------------------------- ....ETC DEPENDING ON WHAT SWITCHES ARE GIVEN TRACK, AND WHAT TYPE OF TRACKING IS BEING DONE, CERTAIN DATA BLOCKS WILL NOT APPEAR IN ALL RUNS. THERE MAY ALSO BE ZERO WORDS BETWEEN DATA BLOCKS. @ ; 711 REPORT START BLOCK. ALWAYS PRESENT. ALWAYS FIRST. ; FORMAT: ; %BTRK==711 ;FIRST WORD. FLAG WORD %BTRKL==4 ;BLOCK LENGTH B%VER==1 ;DATA WD 1. COPY OF .JBVER B%TYP==2 ;DATA WD. 2. TYPE OF TRACKING B%%S==0 ;(VALUE)SYSTEM TRACKING B%%J==1 ;(VALUE)TRACKING A JOB NUMBER B%%U==2 ;(VALUE)TRACKING USERS B%%P==3 ;(VALUE)TRACKING A PPN B%%T==4 ;(VALUE)TRACKING A TTY NUMBER ; 721 SYSTEM DATA INITIALIZATION BLOCK. IF TRACKING THE ; SYSTEM THEN THIS BLOCK WILL FOLLOW THE REPORT ; START BLOCK. ; ALWAYS PRESENT IN THIS CASE. ; FORMAT: ; ; %BSI==721 ;FIRST WORD. FLAG WORD %BSIL==13 ;BLOCK LENGTH B%MVER==1 ;1ST DATA WORD. MONITOR VERSION B%ASER==2 ;2ND D.W. APR SERIAL NUMBER B%MXJB==3 ;3RD D.W. NR. OF JOBS MAXIMUM B%MXTY==4 ;4TH D.W. " " TTYS " B%UMEM==5 ;5TH D.W. USER MEMORY AVAILABLE (WORDS) B%TMEM==6 ;6TH DW,TOTAL SYSTEM MEMORY (WORDS) B%INT== 7 ;7TH DW,PEEK INTERVAL IN SECS B%GRP==10 ;8TH DW,NUMBER OF INTERVALS/REPORT B%TIME==11 ;9TH DW,TIME IN NBS UNIV DATE TIME FORMAT. ; 731 SYSTEM DATA DISPLAY BLOCK. EVERY TIME A REPORT IS ; PRODUCED BY THE SYSTEM DISPLAY MODULE, THIS ; BLOCK IS PRODUCED BEFORE ANY ITEM BLOCKS ; ARE OUTPUT. WILL APPEAR ONCE PER OUTPUT REPORT. ; FORMAT: %BSGO==731 ;1ST WORD. FLAG WORD %BSGOL==7 ;BLOCK LENGTH B%RPT==1 ;NUMBER OF THIS REPORT B%FRM==2 ;STARTING TIME OF REPORT ;IN UNIVERSAL DATE-TIME FORMAT B%TO==03 ;ENDING TIME OF THIS REPORT IN ;UNIVERSAL DATE-TIME FORMAT B%CMX==4 ;CURRENT CORMAX, IN WORDS B%SCHD==5 ;SCHED BITS ; ; 732 SCHED PARMS BLOCK FOR SCHED LIR TO 6.03 %BSCD==732 %BSCDL==45 ;43 DATA ITEMS PLUS 2 OVRHD ; MODIFIED SEPT 79 TO TACK ON BACKGROUND BATCH CLASS AND SWAP TIME ; AT END OF RECORD repeat 0,< FORMAT OF BLOCK TYPE 732: +---------------------------------------------+ ! micro scheduling interval ! +---------------------------------------------+ + 5 (the # of words of class information): ! !---------------------------------------------! !bit 0: fixed class ! !bits 1-27: class number ! !bits 18-35: class quota ! ! ! ! ! +---------------------------------------------+ ! 2 (the # of words of quantum runtimes): ! +---------------------------------------------+ ! quantum runtime: PQ1 ! ! quantum runtime: PQ2 ! +---------------------------------------------+ ! minimum core usage per job ! +---------------------------------------------+ ! minimum core usage multiplier ! +---------------------------------------------+ ! min core usage requeue constant ! +---------------------------------------------+ ! minimum core usage maximum ! +---------------------------------------------+ ! 3 (# words of quantum miltipliers): ! +---------------------------------------------+ !left half: queue number ! !right half: quantum multiplier ! ! ! +---------------------------------------------! ! 2 (# words of quantum runtimes): ! +---------------------------------------------+ !left half: queue number ! !right half: maximum time slice ! +---------------------------------------------+ ! 5 (# words of secondary class quotas): ! +---------------------------------------------+ !left half: class number ! !right half: quota ! ! ! ! ! ! ! +---------------------------------------------+ !time % to scan queue swapped in before sub-q ! +---------------------------------------------+ ! swap scan time ! +---------------------------------------------+ ! scheduler fairness factor ! +---------------------------------------------+ ! swapper fairness factor ! +---------------------------------------------+ ! in-core fairness factor ! +---------------------------------------------+ ! SCDCOR ! +---------------------------------------------+ ! class number for batch background subq! +---------------------------------------------+ ! background batch swaptime interval ! +---------------------------------------------+ > ;end repeat 0 ; 741 SYSTEM DATA ITEM REPORT. OCCURS ONCE FOR ; EACH ITEM DISPLAYED. THIS BLOCK GIVES INFORMATION ; ABOUT WHICH ITEM IS NEXT TO BE WRITTEN OUT. THERE ARE ; AS MANY BLOCKS OF THIS TYPE AS THERE CALLS TO THE ; DATA BLOCK (DB) OUTPUT ROUTINE. ; FORMAT: ; ; %BITM==741 ;1ST WORD. FLAG WORD %BITML==4 ;BLOCK LENGTH B%CODE==1 ;1ST DW. THIS WORD CONTAINS A ;FOUR CHARACTER ASCII (7 BIT) ;CODE IDENTIFIEING THE ITEM ;TO FOLLOW. IT IS CREATED BY THE ;2ND ARGUMENT TO THE SYSDAT MACRO B%AUX==2 ;AN AUXILLIARY WORD THAT IS USED ;WHEN THERE ARE MULTIPLE CALLS TO ;THE DB OUTPUT ROUTINE PER ENTRY ;IN THE SYSDAT MACRO. FOR INSTANCE ;THE DISK UNIT ROUTINE PUTS THE ;SIXBIT UNIT NAME HERE ; 751 SYSTEM DATA ITEM FREQUENCY BLOCK. THIS BLOCK APPEARS ; A VARIABLE NUMBER OF TIMES. IT GIVES THE ; FREQUENCY BREAKDOWN ; IF THIS TYPE BLOCK APPEARS, THE FIRST SUCH BLOCK ; APPEARS AFTER A %BITM TYPE BLOCK AND THE LAST SUCH BLOCK ; PRECEEDS A TYPE %BSUM TYPE BLOCK. ; NOTE: IF /SUMMARY SWITCH IS USED, THIS TYPE BLOCK ; DOES NOT APPEAR AT ALL, AND THE %BSUM BLOCK FOLLOWS ; THE %BITM IMMEDIATELY. ; FORMAT: %BFRQ==751 ;1ST WORD, FLAG WORD %BFRQL==5 ;BLOCK LENGTH B%LOW==1 ;1ST DW,LOWER LIMIT OF VALUES ;IN THE RANGE B%HIGH==2 ;2ND DW,UPPER LIMIT OF VALUES ;IN THE RANGE B%PER==3 ;FLOATING POINT FORMAT ;WORD. THE PERCENT OF ALL VALUES ;SEEN IN THIS RANGE ; 761 TYPE SUMMARY BLOCK. THIS BLOCK APPEARS ONCE ; FOR EVERY CALL TO THE DB OUTPUT ROUTINE, THAT IS ONCE ; FOR EACH TYPE %BITM BLOCK. IT GIVES THE MEAN AND ; STAND. DEVIATION FOR ALL INTERVALS IN THE REPORT ; FORMAT: ; %BSUM==761 ;THE HEADER FLAG WORD %BSUML==5 ;BLOCK LENGTH B%SAMP=1 ;1ST DW,THE NR. OF SAMPLES TAKEN B%MEAN==2 ;FLT. PT. FORMAT MEAN OF ALL ;SAMPLES IN THIS REPORT. B%STDD==3 ;FLT. PT. FORMAT STANDARD DEVIATION ;IN VALUES INCLUDED IN THIS REPORT ; 771 TYPE SYSTEM DATA END OF REPORT BLOCK ; THIS BLOCK CONVEYS NO USEFUL INFORMATION EXCEPT THAT THE ; SYSTEM DATA REPORT IS OVER. ESSENTIALLY, ALL WORDS, ZEROR ; OR NON-ZERO BETWEEN AND THE FIRST FLAG WORD ; FOR EITHER A %BTRK OR %BSGO TYPE BLOCK CAN BE IGNORED. ; ;FORMAT: %BEND==771 ;FLAG WORD %BENDL==2 ;LENGTH OF BLOCK DATA ;NOTE:NO DATA WORDS. ; NOTE: AT THIS TIME THE ONLY BINARY TRACE FILE FACILITIES ; INCLUDED IN TRACK ARE THOSE FOR SYSTEM TRACKING. A FUTURE ; VERSION MAY INCLUDE TRACE SUPPORT FOR ; OTHER TYPES. SUBTTL DEFAULT DECLARATIONS ; ;************ DEFAULT VALUES AND SWITCH SETTINGS ************* ND PDSIZE,30 ;DEFAULT PDL SIZE ND PURESW,0 ;1 FOR RE-ENTRANT, 0 IF NOT ND SYS,1 ;1 TO INCLUDE SYSDAT MODULE ND DFLTQJ,^D10 ;DEFAULT SLEEP INTERVAL JOBS ND DFLTQU,^D60 ;DEFAULT FOR USERS ND DFLTQS,^D10 ; " " SYSTEM ND DEFLTR,^D30 ;DEFAULT LOOKS PER SYSDAT REPORT ND CHNMAX,7 ;MAXIMUM NUMBER OF CHANNELS ON SYSTEM ND GETUNI,^D8 ;NUMBER OF UNITS TO GRAB CORE FOR ;NEED MORE CORE ; FOR UNIT WATCHING TABLES ND FTTRC,-1 ;INCLUDE /FORMAT:TRACE FACILITIES ND MAXTOK,^D14 ;MAX. CHRS PER SWITCH ND MAXSFD,7 ;MAXIMUM NR. OF SFDS ND DFILE,'TRACK ' ;DEFAULT LISTING FILE ND DEXT,'TXT ' ;AND EXT ND DEXTT,'TRC ' ;EXT IF IN TRACE MODE ND DDEV,'TTY ' ;DEFAULT OUTPUT DEVICE ND DDEVF,'DSK ' ;DEFAULT OUTPUT DEVICE IS ;A FILE SPEC IS GIVEN ND COMMAX,^D144 ;MAX COMMAND LINE ;************************************************************* SUBTTL ERROR MESSAGE MACRO AND FLAGS ; FLAGS FOR ERROR MESSAGE PROCESSOR ; THESE FLAGS ARE OF THREE TYPES ; 1)WHAT TYPE OF MESSAGE ; 2)WHAT TO TYPE AFTER MESSAGE (IE T1 IS NULL,OCTAL,SIXBIT ETC.) ; 3)WHAT TO DO AFTER ERROR (EXIT,RESTART,CONTINUE) ZZ==1 ;START SW.(EF.FAT) ;FATAL ERROR SW.(EF.CMT) ;COMMENT MESSAGE SW.(EF.WRN) ;WARN MESSAGE SW.(EF.RST) ;AFTER MESSAGE, RESTART SW.(EF.EXT) ;AFTER MESSAGE, EXIT PROGRAM SW.(EF.CON) ;AFTER MESSAGE, RETURN CPOPJ FOR SHORT ;AND CPOPJ1 FOR LONG MESSAGE SW.(EF.DEC) ;AT END TYPE T1 IN DECIMAL SW.(EF.OCT) ;AT END TYPE T1 IN OCTAL SW.(EF.SIX) ;AT END TYPE T1 IN SIXBIT SW.(EF.PPN) ;AT END TYPE T1 AS PPN SW.(EF.MEM) ;AT END TYPE MEMORY UNITS SW.(EF.STR) ;T1 POINTS TO STRING ; ERROR MESSAGE PROCESS DESTRYS T3,T4 AND RESPECTS ; ALL OTHER REGISTERS ; ; WHEN CALLING WITH FLAG "EF.CON" ; FINAL CRLF MUST BE LABELED "X$$'PREFIX" ; DEFINE $ERROR($FLAGS,$PREFIX,$TEXT)< E$$'$PREFIX: MOVX T4,$FLAGS ;;PICK UP FLAGS IFE BIGLST, JSP T3,ERRMSG ;;GO PROCESS THE ERROR IFNB <$TEXT>, IFB <$TEXT>, IFN $FLAGS&EF.CON, < JRST X$$'$PREFIX> LIST > SUBTTL UTILITY MACROS DEFINE HELPME < MOVE 1,[SIXBIT/TRACK/] ;MUST BE AC 1 PUSHJ P,.HELPR## ;EXTERNAL ENTRY > ; LOAD HELPER WITH .TEXT IF WE CAN, AND LOAD INTO PROPER SEGMENT IFN PURESW,< IFDEF .TEXT,<.TEXT \,REL:HELPER\>> IFE PURESW,< IFDEF .TEXT,<.TEXT \,REL:HELPER/SEG:LOW\>> ; ; MACRO TO PACK SIXBIT CHARACTERS INTO WORDS ; AT END ZZ IS NUMBER OF CHARACTERS PACKED DEFINE STASH(A)< ZZ=0 .C==0 .D==-1 IRPC A,< ZZ=ZZ+1 .D==.D+6 .C==<.C!<''A''B<.D>>> IFE .D-^D35,> IFG .D, PURGE .D,.C > ; MACRO TO SEND ONE CHARACTER TO THE OUTPUT DEVICE DEFINE TYPEC(AA)< MOVEI CHR,"AA" XLIST PUSHJ P,PUTCHR LIST >;END OF TYPEC DEFINITION ; MACRO TO SEND ASCIZ TEXT TO THE OUTPUT DEVICE DEFINE TYPES(AA)< MOVEI STR,[ASCIZ\AA\] XLIST PUSHJ P,PUTSTR LIST > ; END OF TYPES DEFINITION ; MACRO TO SEND CONTENTS OF T1, IN BIANRY TO OUTPUT DEVICE DEFINE TRACE < IFN FTTRC, < PUSHJ P,BINWRT > > ; MACRO TO SEND A CONSTANT TO TRACE DEVICE. USES T1 DEFINE TRACEI(CONS)< IFN FTTRC, < MOVX T1,CONS XLIST TRACE LIST > > ; MACRO TO SEND CONTENTS OF MEMORY LOCATION TO TRACE. USES T1 DEFINE TRACEM(MEM)< IFN FTTRC, < MOVE T1,MEM XLIST TRACE LIST > > ;MACRO TO SET UP THE FACT-STYLE HEADER DEFINE TRACEH(TYPE),< XLIST TRACEI %B'TYPE ;;TYPE OF ENTRY TRACEI %B'TYPE'L ;;LENGTH OF ENTRY LIST > SUBTTL MACRO TO SET UP THE JOB TRACKING DATA AREA ; THIS MACRO SETS UP THE STUFF FOR THE JOB DATA ROUTINES. ; IT SETS UP DATA AREAS FOR JOB TRACKING. ; NEW ENTRIES SHOULD CONTAIN THE FOLLOWING: ; 1)UP TO FOUR CHARACTERS OF NAME FOR FIELD ; C.'NAME IS LOCATION OF CURRENT DATA FOR THAT FIELD ; O.'NAME IS OFFSET (RELOCATED BY CONTENTS OF AC J) ; OF THAT DATA ITEM FOR EACH JOB TRACKED ; ; 2)LENGTH OF THE FIELD FOR OUTPUT PURPOSES (OCTAL) ; ; 3)FOR /COMPARE SWITCH , VALUE "COMP" MEANS COMPARE THIS OLD VS ; CURRENT VALUE AND IF DIFFERENT PRINT, "NOCOMP" MEANS IGNORE ; ANY DIFFERENCES IN THIS FIELD ; THIS IS FOR DEFAULT /COMPARE AND CAN BE OVERIDDEN ; WITH ARGUMENTS. COMP==1 NOCOMP==0 DEFINE DATUMS < IFE BIGLST, X FST,0,NOCOMP ;FIRST PRINT OF JOB FLAG X DAY,10,NOCOMP ;TIME OF DAY OF PEEK X JOB,4,COMP ;JOB NUMBER X TTY,6,COMP ;TTY LINE NUMBER X PROG,6,COMP ;PROGRAM NAME X STAT,2,NOCOMP ;STATUS X NSWP,2,NOCOMP ;NOT SWAPPED, IE IN CORE X LOW,0,NOCOMP ;LOW SEG SIZE X HIGH,6,NOCOMP ;HI-SEG SIZE X RT,11,NOCOMP ;RUNTIME X RD,7,NOCOMP ;DISK READS X WR,7,NOCOMP ;DISK WRITES X PRV,0,COMP ;PRIVELEGE BITS X KCT,11,NOCOMP ;KILO-CORE-TICS FOR JOB X GOD,^D22,COMP ;JACCT LIT (SPACING WIDTH USED FOR RT/ET) X TLM,^D12,NOCOMP ;TIME LIMIT SET FOR JOB X PPN,^D16,COMP ;PPN OF USER X NAM1,0,COMP ;FIRST HALF OF USER NAME X NAM2,^D17,COMP ;SECOND HALF LIST > ;END OF DATUMS DEFINITION ;SET UP DEFCMP (DEFINE COMPARE) WORD FOR USE BY COMPARE ROUTINE ;FOR EACH FIELD DEFINED IN DATUMS MACRO, A CORRESPONDING ;BIT = 1 MEANS COMPARE FOR /C , A BIT =0 MEANS ;DONT COMPARE %CHKCM==0 ZZ==0 ; DEFINE X(A,Y,C)< IFE ^D37-ZZ, %CHKCM==%CHKCM!<B> ZZ==ZZ+1 > DATUMS ;DEFINE THE WORD SHOW.(%CHKCM) ;AND THATS WHAT RESULTS ;THIS WILL BE USED LATER FOR /COMPARE ;DEFAULT VALUE SUBTTL MACRO TO DEFINE THE SYSTEM TRACKING PARAMETERS ; THIS MACRO SETS UP THE STUFF FOR THE SYSTEM DATA ROUTINES ; FOR EACH ITEM YOU WISH TO HAVE 'TRACKED' FOR THE SYSTEM ; YOU MUST INCLUDE AN ENTRY HAVEING THE FORM: ; ; X OUTPUT LABEL,4 CHR NAME,ADDR OF INITIALIZATION ROUTINE, ; ADDR OF FETCH DATA ROUTINE,ADDR OF OUTPUT ROUTINE, RANGE FOR DATA ; POINTS TO BE GROUPED TOGETHER ; A) OUTPUT LABEL WILL BE PRINTED ON THE REPORT ; B) NAME WILL BE USED TO CREATE UNIQUE TABLE NAMES ; C) INITIALIZATION ROUTINE (IF NON-ZERO) WILL BE PUSHJ P'ED TO ; ONCE FOR EACH COMMAND STRING. ; D) FETCH ROUTINE (IF NON-ZERO) WILL PUSHJ P'ED TO EVERY LOOK ; E) OUTPUT ROUTINE (IF NON-ZERO) WILL BE PUSHJ P'D TO EVERY REPORT ; ; THE FOLLOWING TABLES ARE CREATED: ; ; XXXX.N TABLE OF POINTERS TO LABELS ; XXXX.I TABLE OF INITIA ROUTINE ADDRESSES ; XXXX.P TABLE OF POINTERS TO DATA AREA FOR EACH ITEM ; EACH ENTRY IN THIS TABLE SHOULD BE OF THE FORM: L,,ADDR ; THE INITIALIZATION ROUTINE HAS THE RESPONSIBILITY ; OF CORRECTLY SETTING UP THIS WORD ; L WILL ALWAYS CONTAIN THE LOOK NUMBER WE ARE DOING ; AND ADDR THE START OF THE BLOCK "# OF LOOKS/REPORT" ; LONG USED FOR HOLDING THE DATA SEEN FOR EACH LOOK ; ; XXXX.G TABLE OF ADDRESSES OF DATA GATHERING ROUTINES ; PUSHJ P'ED TO EACH LOOK (IF NON-ZERO) ; XXXX.D SAME AS ABOVE, PUSHJ P'ED TO EVERY TIME WE REPORT ; XXXX.V TABLE CONTAINING THE RANGE OVER WHICH TO ; GROUP DATA POINTS TOGETHER WHEN MAKING OUTPUT ; REPORTS ; ; XXXX.C A TABLE OF 4 LETTER,LEFT JUSTIFIED SIXBIT ; CODES IS CREATED FOR IDENTIFYING ITEMS IN THE TRACE ; FORMAT REPORT AND FOR ARGUMENTS TO /INCLUDE,EXCLUDE ; THIS TABLE IS MADE UP FROM THE 4 LETTER ; SECOND ARGUMENT TO THE SYSDAT MACRO ; EACH TABLE IS PRECEDED BY THE LABEL 'TAB.X' AND ITS LENGTH IS ; LEN.X ; ALSO, WHEN ROUTINES ARE BEING EXECUTED, INDEX REGISTER J ; WILL CONTAIN THE ITEM WE ARE WORKING, AND INDEX REGISTER L ; WILL CONTAIN THE NUMBER OF THE CURRENT LOOK ; ; ; SEE FOLLOWING CODE FOR DEFINITIONS OF AVAILABLE ROUTINES AND ; FOR VARIABLES ALWAYS AVAILABLE FOR ROUTINES TO USE ; DEFINE SYSDAT < IFE BIGLST,< XLIST> X USER CPU JIFFIES/SECOND,CPUT,CPUT%I,CPUT%G,OUTDBI,^D10 X PERCENT IDLE TIME ON CPU0,CP0I,DBCORE,CP0I%G,OUTDBI,5 X PERCENT IDLE TIME ON CPU1,CP1I,CP1INI,CP1I%G,OUTDBI,5 X PERCENT IDLE TIME ON CPU2,CP2I,CP2INI,CP2I%G,OUTDBI,5 X PERCENT IDLE TIME ON CPU3,CP3I,CP3INI,CP3I%G,OUTDBI,5 X PERCENT IDLE TIME ON CPU4,CP4I,CP4INI,CP4I%G,OUTDBI,5 X PERCENT IDLE TIME ON CPU5,CP5I,CP5INI,CP5I%G,OUTDBI,5 X PERCENT LOST TIME ON CPU0,CP0L,DBCORE,CP0L%G,OUTDBI,5 X PERCENT LOST TIME ON CPU1,CP1L,CP1INI,CP1L%G,OUTDBI,5 X PERCENT LOST TIME ON CPU2,CP2L,CP2INI,CP2L%G,OUTDBI,5 X PERCENT LOST TIME ON CPU3,CP3L,CP3INI,CP3L%G,OUTDBI,5 X PERCENT LOST TIME ON CPU4,CP4L,CP4INI,CP4L%G,OUTDBI,5 X PERCENT LOST TIME ON CPU5,CP5L,CP5INI,CP5L%G,OUTDBI,5 X CPU0 EXEC TIME(%),EXEC,EXEC%I,EXEC%G,OUTDBF,^D10 X CPU1 EXEC TIME(%),EXE1,EXE1%I,EXE1%G,OUTDBF,^D10 X CPU2 EXEC TIME(%),EXE2,EXE2%I,EXE2%G,OUTDBF,^D10 X CPU3 EXEC TIME(%),EXE3,EXE3%I,EXE3%G,OUTDBF,^D10 X CPU4 EXEC TIME(%),EXE4,EXE4%I,EXE4%G,OUTDBF,^D10 X CPU5 EXEC TIME(%),EXE5,EXE5%I,EXE5%G,OUTDBF,^D10 X CPU0 MBOX REFS(K/SEC),MBXR,MBXR%I,MBXR%G,OUTDBF,^D10 X CPU1 MBOX REFS(K/SEC),MBX1,MBX1%I,MBX1%G,OUTDBF,^D10 X CPU2 MBOX REFS(K/SEC),MBX2,MBX2%I,MBX2%G,OUTDBF,^D10 X CPU3 MBOX REFS(K/SEC),MBX3,MBX3%I,MBX3%G,OUTDBF,^D10 X CPU4 MBOX REFS(K/SEC),MBX4,MBX4%I,MBX4%G,OUTDBF,^D10 X CPU5 MBOX REFS(K/SEC),MBX5,MBX5%I,MBX5%G,OUTDBF,^D10 X PERCENT OVERHEAD TIME ON CPU0,CP0O,DBCORE,CP0O%G,OUTDBI,5 X PERCENT OVERHEAD TIME ON CPU1,CP1O,CP1INI,CP1O%G,OUTDBI,5 X PERCENT OVERHEAD TIME ON CPU2,CP2O,CP2INI,CP2O%G,OUTDBI,5 X PERCENT OVERHEAD TIME ON CPU3,CP3O,CP3INI,CP3O%G,OUTDBI,5 X PERCENT OVERHEAD TIME ON CPU4,CP4O,CP4INI,CP4O%G,OUTDBI,5 X PERCENT OVERHEAD TIME ON CPU5,CP5O,CP5INI,CP5O%G,OUTDBI,5 X CONTEXT SWITCHES PER SECOND ON CPU0,CP0C,DBCORE,CP0C%G,OUTDBI,^D10 X CONTEXT SWITCHES PER SECOND ON CPU1,CP1C,CP1INI,CP1C%G,OUTDBI,^D10 X CONTEXT SWITCHES PER SECOND ON CPU2,CP2C,CP2INI,CP2C%G,OUTDBI,^D20 X CONTEXT SWITCHES PER SECOND ON CPU3,CP3C,CP3INI,CP3C%G,OUTDBI,^D30 X CONTEXT SWITCHES PER SECOND ON CPU4,CP4C,CP4INI,CP4C%G,OUTDBI,^D40 X CONTEXT SWITCHES PER SECOND ON CPU5,CP5C,CP5INI,CP5C%G,OUTDBI,^D50 X UUOS PER SECOND ON CPU0,CP0U,DBCORE,CP0U%G,OUTDBI,^D10 X UUOS PER SECOND ON CPU1,CP1U,CP1INI,CP1U%G,OUTDBI,^D10 X UUOS PER SECOND ON CPU2,CP2U,CP2INI,CP2U%G,OUTDBI,^D20 X UUOS PER SECOND ON CPU3,CP3U,CP3INI,CP3U%G,OUTDBI,^D30 X UUOS PER SECOND ON CPU4,CP4U,CP4INI,CP4U%G,OUTDBI,^D40 X UUOS PER SECOND ON CPU5,CP5U,CP5INI,CP5U%G,OUTDBI,^D50 X CACHE SWEEPS PER SECOND ON CPU0,L0SN,CL0INI,L0SN%G,OUTDBI,^D10 X CACHE SWEEPS PER SECOND ON CPU1,L1SN,CL1INI,L1SN%G,OUTDBI,^D10 X CACHE SWEEPS PER SECOND ON CPU2,L2SN,cl2ini,l2SN%G,OUTDBI,^D10 X CACHE SWEEPS PER SECOND ON CPU3,L3SN,cl3INI,l3SN%G,OUTDBI,^D10 X CACHE SWEEPS PER SECOND ON CPU4,L4SN,cl4INI,l4SN%G,OUTDBI,^D10 X CACHE SWEEPS PER SECOND ON CPU5,L5SN,cl5INI,l5SN%G,OUTDBI,^D10 X CACHE SWEEP REQUESTS PER SECOND BY CPU0 SCHEDULER,L0LN,CL1INI,L0LN%G,OUTDBI,^D10 X CACHE SWEEP REQUESTS PER SECOND BY CPU1 SCHEDULER,L1LN,CL1INI,L1LN%G,OUTDBI,^D10 X CACHE SWEEP REQUESTS PER SECOND BY CPU2 SCHEDULER,L2LN,CL2INI,L2LN%G,OUTDBI,^D20 X CACHE SWEEP REQUESTS PER SECOND BY CPU3 SCHEDULER,L3LN,CL3INI,L3LN%G,OUTDBI,^D30 X CACHE SWEEP REQUESTS PER SECOND BY CPU4 SCHEDULER,L4LN,CL4INI,L4LN%G,OUTDBI,^D40 X CACHE SWEEP REQUESTS PER SECOND BY CPU5 SCHEDULER,L5LN,CL5INI,L5LN%G,OUTDBI,^D50 X CACHE SWEEP REQUESTS CPU0 SWEPT FOR PER SECOND,L0RN,CL1INI,L0RN%G,OUTDBI,^D10 X CACHE SWEEP REQUESTS CPU1 SWEPT FOR PER SECOND,L1RN,CL1INI,L1RN%G,OUTDBI,^D10 X CACHE SWEEP REQUESTS CPU2 SWEPT FOR PER SECOND,L2RN,CL2INI,l2RN%G,OUTDBI,^D10 X CACHE SWEEP REQUESTS CPU3 SWEPT FOR PER SECOND,L3RN,CL3INI,l3RN%G,OUTDBI,^D10 X CACHE SWEEP REQUESTS CPU4 SWEPT FOR PER SECOND,L4RN,CL4INI,l4RN%G,OUTDBI,^D10 X CACHE SWEEP REQUESTS CPU5 SWEPT FOR PER SECOND,L5RN,CL5INI,l5RN%G,OUTDBI,^D10 X PERCENT CACHE LOST TIME ON CPU1,L1LT,CL1INI,L1LT%G,OUTDBI,5 X PERCENT CACHE LOST TIME ON CPU2,L2LT,CL2INI,L2LT%G,OUTDBI,5 X PERCENT CACHE LOST TIME ON CPU3,L3LT,CL3INI,L3LT%G,OUTDBI,5 X PERCENT CACHE LOST TIME ON CPU4,L4LT,CL4INI,L4LT%G,OUTDBI,5 X PERCENT CACHE LOST TIME ON CPU5,L5LT,CL5INI,L5LT%G,OUTDBI,5 X DECTAPE GENERATED SLEEPS(#),SDGS,SDGS%I,SDGS%G,OUTDBI,^D10 X MAGTAPE GENERATED SLEEPS(#),SMGS,SMGS%I,SMGS%G,OUTDBI,^D10 X EVENT WAIT SATISFIED(#),SEWS,SEWS%I,SEWS%G,OUTDBI,^D10 X TTY INPUT WAIT SATISFIED(#),STIS,STIS%I,STIS%G,OUTDBI,^D10 X TTY OUTPUT WAIT SATISFIED(#),STOS,STOS%I,STOS%G,OUTDBI,^D10 X PTY INPUT WAIT SATISFIED(#),SPIS,SPIS%I,SPIS%G,OUTDBI,^D10 X PTY OUTPUT WAIT SATISFIED(#),SPOS,SPOS%I,SPOS%G,OUTDBI,^D10 X SS REQUEUE TO PQ1(#),SRS1,SRS1%I,SRS1%G,OUTDBI,^D10 X WAKE REQUEUE TO PQ1(#),SRW1,SRW1%I,SRW1%G,OUTDBI,^D10 X DAEMON SATISFIED REQUEUE TO PQ1(#),SRD1,SRD1%I,SRD1%G,OUTDBI,^D10 X ALL OTHER REQUEUE TO PQ1(#),SRO1,SRO1%I,SRO1%G,OUTDBI,^D10 X PQ1 JOBS EXPIRING QUANTUM(#),SQR1,SQR1%I,SQR1%G,OUTDBI,^D10 X PQ2 JOBS EXPIRING QUANTUM(#),SQR2,SQR2%I,SQR2%G,OUTDBI,^D10 X HPQ JOBS EXPIRING QUANTUM(#),SQRH,SQRH%I,SQRH%G,OUTDBI,^D10 X PQ1 JOBS EXPIRING ICPT(#),SIP1,SIP1%I,SIP1%G,OUTDBI,^D10 X PQ2 JOBS EXPIRING ICPT(#),SIP2,SIP2%I,SIP2%G,OUTDBI,^D10 X HPQ JOBS EXPIRING ICPT(#),SIPH,SIPH%I,SIPH%G,OUTDBI,^D10 X PQ1 SWAP IN MEMORY(K)(#),SKS1,SKS1%I,SKS1%G,OUTDBI,^D10 X PQ2 SWAP IN MEMORY(K)(#),SKS2,SKS2%I,SKS2%G,OUTDBI,^D10 X HPQ SWAP IN MEMORY(K)(#),SKSH,SKSH%I,SKSH%G,OUTDBI,^D10 X PQ1 JOBS SWAPPED IN(#),SNJ1,SNJ1%I,SNJ1%G,OUTDBI,^D10 X PQ2 JOBS SWAPPED IN(#),SNJ2,SNJ2%I,SNJ2%G,OUTDBI,^D10 X HPQ JOBS SWAPPED IN(#),SNJH,SNJH%I,SNJH%G,OUTDBI,^D10 X PQ1 EBOX/MBOX TICKS CHARGED(#),STC1,STC1%I,STC1%G,OUTDBI,^D10 X PQ2 EBOX/MBOX TICKS CHARGED(#),STC2,STC2%I,STC2%G,OUTDBI,^D10 X HPQ EBOX/MBOX TICKS CHARGED(#),STCH,STCH%I,STCH%G,OUTDBI,^D10 X AVERAGE WASTED CORE(PAGES),WASK,WASK%I,WASK%G,OUTDBI,^D10 X AVERAGE PQ1/CMQ SWAP IN RESPONSE(TICKS),CPSI,CPSI%I,CPSI%G,OUTDBI,^D10 X SWAPPING SPACE LEFT (PAGES),SWPS,DBCORE,SWPS%G,OUTDBF,^D50 X CACHE SWEEP REQUESTS BY SWAPPER PER SECOND,L0SD,CL1INI,L0SD%G,OUTDBI,^D10 X SWAPPER NULL TIME,SWPN,SWPN%I,SWPN%G,OUTDBI,^D10 X SWAPPER LOST TIME,SWPL,SWPL%I,SWPL%G,OUTDBI,^D10 X UNWIND COUNT,UNWD,UNWD%I,UNWD%G,OUTDBI,1 X SWAPPER FORCE COUNT,SWPF,SWPF%I,SWPF%G,OUTDBI,1 X PERCENT OF FREE CORE IN USE,PFCU,PFCU%I,PFCU%G,OUTDBF,5 X PERCENT TTY CHUNKS IN USE,PTCU,PTCU%I,PTCU%G,OUTDBF,5 X SCANNER SERVICE XMT INTERUPTS/SEC,SXMT,DBCORE,SXMT%G,OUTDBI,^D50 X SCANNER SERVICE RCV INTERUPTS/SEC,SRCV,DBCORE,SRCV%G,OUTDBI,^D50 X USER DISK BLOCKS PER SECOND,UDIO,UDIO%I,UDIO%G,OUTDBI,^D25 X SWAPPING BLOCKS PER SECOND,SWIO,SWIO%I,SWIO%G,OUTDBI,^D25 X USER KCS PER SECOND,UKCS,UKCS%I,UKCS%G,OUTDBI,5 X TERMINAL RESPONSE TIME (MS),RESP,DBCORE,RESP%G,OUTDBI,^D100 X AVERAGE RESPONSE TIME (MILLISECONDS),AVRT,DBCORE,AVRT%G,OUTDBI,^D25 X NUMBER OF JOBS LOGGED IN,JLGN,DBCORE,JLGN%G,OUTDBF,1 X PERCENT OF PHYS. CORE IN USE BY ACTIVE JOBS,ACCR,DBCORE,ACCR%G,OUTDBF,^D20 X PERCENT OF PHYS. CORE IN USE BY ALL JOBS,PHCR,DBCORE,PHCR%G,OUTDBF,^D20 X AVERAGE JOB SIZE (TO NEAREST UNIT),AVJS,DBCORE,AVJS%G,OUTDBF,^D5 X NR OF JOBS IN RUN QUEUES,NRJR,DBCORE,NRJR%G,OUTDBF,1 X PERCENT OF RUNNABLE JOBS IN CORE,PRJC,DBCORE,PRJC%G,OUTDBF,^D5 X JOBS IN TTY IO WAIT,TIOW,DBCORE,TIOW%G,OUTDBF,^D1 X JOBS IN IO WAIT OTHER THAN TTY,IOW,DBCORE,IOW%G,OUTDBF,^D1 X JOBS IN SHAREABLE RESOURCE QUEUES,JSHQ,DBCORE,JSHQ%G,OUTDBF,^D1 X 0,DISK,DISK%I,DISK%G,DISK%D,1 ;% busy for each disk unit X 0,CHAN,CHAN%I,CHAN%G,CHAN%D,1 ;% busy for each channel LIST > ;END OF SYSDAT MACRO ; POSSIBLE START OF HIGH SEGMENT CODE IFN PURESW, SUBTTL INITIALIZE AND GET COMMAND STRING TRACK: JFCL ;IN CASE CCL ENTRY RESET MOVE T1,[XWD LOWBEG,LOWBEG+1];CLEAR IMPURE AREA SETZB SW,LOWBEG ;IN CASE OF RESTART BLT T1,LOWEND ;ZAP MOVE T1,.JBFF ;PICK UP JOBFF MOVEM T1,SAVFF ;AND REMEMBER IT MOVEI T1,DEBBLK ;DEBUG VARIABLES MOVEM T1,.JBOPS## ;FOR CATASTROPHES JUMPPT (T1,K.CORE,K.CORE,P.CORE,P.CORE) ;EXAMINE PROCESSOR P.CORE: TXOA SW,KI.10 ;SET IT DOWN , ITS PAGES K.CORE: TROA CHR,"K" ;MEMORY UNIT FOR K OF CORE MOVEI CHR,"P" ;FOR PAGES THE SYMBOL IS "P" MOVEM CHR,MEMUNI ;FOR PRINTOUT ROUTINES MOVE P,[IOWD PDSIZE,PDL] ;SET UP PUSHDOWN LIST IFE PURESW,< PUSHJ P,SETTAB ;SET UP GETTABS > MOVX GT,%CCTYP ;GET CPU TYPE PUSHJ P,FETTAB MOVEM GT,CPUTYP ;REMEMBER IT MOVX GT,%CNST2 ;LOOKUP FT TABLE PUSHJ P,FETTAB TXNE GT,ST%VMS ;CONTAINS VMSER? TXO SW,FT.VM ;YES, REMEMBER THAT MOVX GT,%CNLNP ;LOOK UP NUMBER OF LINES PUSHJ P,FETTAB ;FROM MONITOR HLROS GT ;MAKE FULL WORD NEGATIVE MOVMM GT,MAXTTY ;MAXTTY BECOMES LARGEST TTY NR SOS MAXTTY ;AFTER ACCOUNTING FOR ZERO MOVX GT,%CNSJN ;DO SAME FOR NUMBER OF JOBS PUSHJ P,FETTAB ;I.E. GET MAXIMUM NUMBER HRRM GT,MAXJOB ;STORE FOR LATER GOOD THINGS SOS MAXJOB ;ACCOUNT FOR NULL JOB PJOB T1, ;SAVE OUR JOB MOVEM T1,MYJOB ;FOR LATER USE GETPPN T1, ;SAVE PPN JFCL MOVEM T1,MYPPN ;ALSO TRACK1: SETZM LOOKS ;CLEAR ALL SETZM HPQREQ ; SETZM AVAL ;CLEAR /SAVE SWITCH SETZM SDISK ;DEFAULT IS SYSTEM DISKS MOVEI T1,DFLTQJ ;PICK UP DEFAULT SLEEP TIME FOR A JOB MOVEM T1,QTUM MOVEI T1,DEFLTR ;PICK UP DEFAULT LOOKS/REPORT MOVEM T1,RVAL ;FOR SYSDAT STUFF SETZM DEFCMP ;NO COMPARISON BITS DEFINED IFN SYS,< MOVE T1,[TAB.P,,TAB.P+1] ;CLEAR POINTERS FOR CORE TABLES (DB'S) SETZM TAB.P ;TO CLEAR EXCLUDE/INCLUDES BLT T1,TAB.P+LEN.P-1 ;AND ALLOCATIONS SETOM CHAN.P ;START OUT EXCLUDING CHANNEL SETOM DISK.P ;AND DISK STUFF > ; END OF SYS CONDITIONAL AND SW,[STKDFL] ;CLEAR ALL BUT STICKY DEFAULTS SETOM C.FST ;SET FIRST FLAG TRACK2: PUSHJ P,GETLIN ;LOAD COMMAND LINE PUSHJ P,PRESCAN ;PRESCAN FOR FILESPEC TXO SW,F.SPEC ;MARK AS PRESENT MOVE T1,[XWD [.IOASC DDEV Z DFILE DEXT Z Z],FILMOD] ;LOAD DEFAULT FILE SPECS BLT T1,FILPPN ;INTO FILE BLOCK TXNN SW,F.SPEC ;FILE SPEC GIVEN? JRST NOSPEC ;NO MOVX T1,DDEVF ;LOAD DEFAULT FILE DEVICE MOVEM T1,FILDEV ; PUSHJ P,FILSPC ;GET FILE SPECIFICATION PUSHJ P,GETCHR ;GET NEXT CHARACTER CAIE CHR,"=" ;IS IT DELIMITER "=" JRST [$ERROR(EF.FAT!EF.RST,FDM,FILE SPECIFICATION DELIMITER "=" MISSING)] NOSPEC: MOVE N1,COMPTR ;SAVE THE COMMAND POINTER PUSHJ P,GETCHR ;GET A CHARACTER TXNE SW,BRK ;BREAK CHARACTER? JRST RESTRT ;YES,RECYCLE CAIL CHR,"0" ;COULD BE JUST A NUMBER CAILE CHR,"9" ;FOR JOB NUMBER TO WATCH SKIPA JRST TJOBS ;AND IT IS MOVEM N1,COMPTR ;RESTORE THE COMMAND POINTER PUSHJ P,TOKEN ;GET FIRST TOKEN JUMPE T1,[ MOVEI T1,-" "(CHR) ;IF NOT ALPHANUMERIC LSH T1,^D30 JRST NOSPC1] ;USE TOKEN'S DELIMITER TXO SW,REGET ;DELIMITER STILL VALID NOSPC1: MOVE T2,[-CSDLEN,,CSNAME] ;GET READY FOR TABLE LOOKUP PUSHJ P,TABLUK ;LOOK IT UP JRST [ JUMPL T1,[$ERROR(EF.FAT!EF.RST,CNU,COMMAND NOT UNIQUE)] JRST BADCOM] JRST @CSDISP(T1) ;DISPATCH ON COMMAND BADCOM: MOVEI T1,LASTOK ;PICK UP LAST TOKEN $ERROR(EF.FAT!EF.RST!EF.STR,UCS,UNKNOWN COMMAND ) ; DEFINE COMMANDS DEFINE CSCREATE< IFE BIGLST, X (MYPPN,TMPPNS) ;; "MYPPN" X (SYSTEM,TSYS) ;; "SYSTEM" X (#,TTTYS) ;;#NN (TTYNN) X (/,TRYHLP) ;;/SWITCH X ([,TPPNS) ;;[P,PN] X (<'>,TPROG) ;;'PROGRAM' X (PPN,TPPNS) ;;PPN[P,N] X (DEBUG,TDDT) ;;DDT X (USERS,TUSERS) ;;USERS X (<.>,TMYJOB) ;;TRACK YOURSELF X (<@>,TIND) ;;INDIRECT FILE SPECIFICATION X (EXIT,FINISH) ;;EXIT FROM TRACK LIST > ; END OF CSCREATE DEFINITION ; NOW MAKE THE TABLE DEFINE X(AA,BB)< SIXBIT\AA\> CSNAME: CSCREATE CSDLEN==.-CSNAME DEFINE X(AA,BB)< XWD 0,BB> CSDISP: CSCREATE TRYHLP: PUSHJ P,GETSW ;GET SWITCH CAIE CHR,"/" ;ANOTHER SWITCH? JRST RESTRT ;NO JRST TRYHLP ;YES TMYJOB: MOVE T1,MYJOB ;TRACK YOURSELF MOVEM T1,SAVNUM ;STORE IT TXO SW,L.JOB ;LOOKING AT JOB PUSHJ P,GETCHR ;LOAD CHARACTER JRST SWCHK ;PROCESS SWITCHES TPROG: PUSHJ P,TOKEN ;GET THE PROGRAM NAME JUMPE T1,[$ERROR(EF.FAT!EF.RST,IPN,ILLEGAL PROGRAM NAME)] MOVEM T1,SAVPOP ;STORE IT AWAY TXO SW,L.PROG ;WATCHING A PROGRAM CAIN CHR,"'" ;DELIMITED BY MATCHING '? PUSHJ P,GETCHR ;YES,EAT IT JRST TUSE.1 ;JOIN COMMON MULTIPLE JOB CODE TPPNS: PUSHJ P,OCTIN ;GET FIRST HALF (PROJ) JUMPN T1,TPPNS1 ;IF NOT, BLANK CONTINUE CAIN CHR,"*" ;BLANK DELIMITED BY STAR? SOJA T1,[PUSHJ P,GETCHR ;GET DELIMITER JRST TPPNS1 ] ;ALL FILLED IN WITH -1 HLR T1,MYPPN ;ELSE USE MY PPN TPPNS1: CAIE CHR,"," ;DELIMITED BY COMMA JRST BPPN ;NOPE HRLZM T1,SAVPOP ;STASH IT PUSHJ P,OCTIN ;GET PROGRAMMER NUMBER JUMPN T1,TPPNS2 ;IF GIVEN, JUST CONTINUE CAIN CHR,"*" ;DELIMITED BY STAR? SOJA T1,[PUSHJ P,GETCHR ;EAT THE STAR JRST TPPNS2] ;AND CONTINUE HRR T1,MYPPN ;GET PROG NUMBER RUNNING UNDER TPPNS2: TXNN SW,BRK ;BREAK SEEN ?, OR CAIN CHR,"]" ;DELIMITED BY ] CAIA JRST BPPN HRRM T1,SAVPOP ;AND DONE WITH PPN! JRST TMPSET ;AND CONTINUE WITH INITITALIZATION TMPPNS: MOVE T1,MYPPN ;USE OWN PPN MOVEM T1,SAVPOP TMPSET: TXO SW,L.PPN ;WATCHING PPN TXNN SW,BRK ;BREAK? PUSHJ P,GETCHR ;NO,LOAD CHAR JRST TUSE.1 ;JOIN COMMON MULTI-JOB CODE BPPN: $ERROR(EF.FAT!EF.RST,BPN,BAD FORMAT FOR PROJECT-PROGRAMMER NUMBER) TSYS: IFN SYS, < TXO SW,SYSD ;DOING SYSTEM DATA MOVEI T1,DFLTQS ;RESET DEFAULT SLEEP TIME MOVEM T1,QTUM PUSHJ P,GETCHR ;LOAD NEXT CHR JRST SWCHK ;GO PICK UP SWITCHES > IFE SYS, < $ERROR(EF.FAT!EF.RST,SNI,SYSTEM TRACKING NOT INCLUDED IN THIS VERSION) >; IF NOT INCLUDED (IE FT SYS=0) TUSERS: TXO SW,L.USRS ;TURN ON USERS MOVEI T1,DFLTQU ;LOAD INTERVER FOR USERS MOVEM T1,QTUM ;BECAUSE ITS LONGER PUSHJ P,GETCHR ;GET NEXT CHARACTER LOADED TUSE.1: MOVEI T1,1 ;START WITH JOB 1 MOVEM T1,SAVNUM JRST SWCHK ;START WITH SWITCHES TDDT: PUSHJ P,EATLIN ;EAT REST OF LINE SKIPN N1,.JBDDT## ;DEBUGGER LOADED? JRST [$ERROR(EF.FAT!EF.RST,DNL,DEBUGGER NOT LOADED)] ;NO $ERROR(EF.CMT,DEB,ENTERING DEBUGGER) JRST (N1) ;ENTER DDT XDDT: JRST TRACK1 ;SO " XCT XDDT$X" GOES BACK ;TO COMMAND LEVEL TIND: MOVE T1,[XWD [.IOASC SIXBIT/DSK / 0,,TYBUF SIXBIT/TRACK/ SIXBIT/CCL/ 0 0],FILMOD] BLT T1,FILPPN PUSHJ P,FILSPC ;LOAD DEFAULTS,GET USER SPEC PUSHJ P,GETCHR ;SEE IF ENDS W/BREAK TXNN SW,BRK ; JRST BADCOM ;NO PUSHJ P,REDUCE ;GET RID OF EXCESS CORE TXO SW,INDFLG ;MARK INDIRECT FILE ACTIVE JRST TRACK2 ;AND GET COMMANDS TJOBS: TXO SW,REGET+L.JOB ;LOOKING FOR JOB,REGET THE FIRST DIGIT JRST GETNUM ;GET JOB NUMBER TTTYS: TXO SW,L.TTY ;SET SWITCH FOR TTY LOOKS PUSHJ P,OCTIN ;TTY #S ARE OCTAL SKIPA GETNUM: PUSHJ P,DECIN ;GET DECIMAL JOB NO. MOVEM T1,SAVNUM ;SAVE FOR GOOD THINGS TXNE SW,L.TTY ;LOOKING AT TTY? JRST VALTTY ;YES SKIPL T1 ;NO, DOING JOB. IS THIS NR. TOO LOW? CAMLE T1,MAXJOB ;OR TOO HIGH? JRST [MOVE T1,MAXJOB ;SET UP AND DO ERROR MESSAGE $ERROR(EF.FAT!EF.RST!EF.DEC,JMR,JOB NUMBER MUST BE IN RANGE 0-)] JRST SWCHK ;NO,ITS OK VALTTY: SKIPL T1 ;ALSO MUST BE IN RANGE 0-MAXTTY CAMLE T1,MAXTTY ; JRST [MOVE T1,MAXTTY $ERROR(EF.FAT!EF.RST!EF.OCT,TMR,TTY NUMBER MUST BE IN RANGE 0-)] SWCHK: TXNE SW,BRK ;BREAK CHR ENDS THINGS JRST START ;BUT IT WASNT CAIE CHR,"/" ;MIGHT BE SWITCH JRST BADCOM ;BUT IT WASNT PUSHJ P,GETSW ;PICK UP SWITCH JRST SWCHK ;GET NEXT SWITCH OR END SUBTTL INITIALIZE PRIOR TO COMMENCEING TRACK LOOP START: RELEAS TY, ;CLOSE OUTPUT PUSHJ P,REDUCE ;REDUCE CORE TO STARTING SIZE TXNE SW,OPT.S ;DO STATISTICS? TXNN SW,NO.RSP ;ARE RESPONSE TIMES OFF JRST STATOK $ERROR(EF.WRN,JRU,JOB RUN QUEUE TIME UNAVAILABLE) STATOK: PUSHJ P,FILOPN ;OPEN FILE TXZ SW,F.TTY ;DONT FORCE OUTPUT TO TTY TXNN SW,L.USRS!L.JOB!L.TTY!L.PPN!L.PROG ;JOB TRACKING? JRST STRT1 ;NO.SKIP THE OLD DATA AREA SETUP MOVEI T1,SIZDAT ;SIZE OF BLOCK PER JOB TXNE SW,L.USRS!L.PPN!L.PROG ;NEED FOR ALL JOBS? IMUL T1,MAXJOB ;YES,MULTIPLY PUSHJ P,ASSCOR ;GET THE CORE MOVEM T1,OLDPTR ;SAVE THE POINTER STRT1: TRACEH (TRK) ;[*]OUTPUT FILE START HEADER TRACEM .JBVER## ;PUT OUT VERSION OF TRACK TRACEI B%%S ;SAY ITS A SYSTEM TRACK IFN SYS, < TXNE SW,SYSD ;DOING SYSTEM DATA? PUSHJ P,SYSINI ;YES,GO START UP > TXNE SW,MRET ;[*]DOES THE USER WISH A MONRET. (EXIT 1,)? SKIPE STRTED ;[*] YES-BUT IS THIS THE FIRST TIME? JRST GODO ;START $ERROR(EF.CMT,PTC,PLEASE TYPE CONTINUE TO COMMENCE TRACKING) EXIT 1, ;HERE IS THE MONRET. GODO: SETOM STRTED ;[*]INDICATE THAT WE ARE STARTED. SKIPN T1,HPQREQ ;ASK FOR HPQ? JRST NOHPQ ;NO HPQ T1, ;TRY IT JRST [ MOVE T1,HPQREQ ;GET HPQ REQUESTED $ERROR(EF.WRN!EF.OCT,HPQ,CANNOT SET TO HPQ) JRST NOHPQ] ;RETURN NOHPQ: TXNN SW,R.LOCK ;LOCK REQUESTED? JRST NOLOCK ;NO IFN PURESW, < MOVE T1,[XWD LOCCOD,LOCCOD] >;LOCK BOTH SEGMENTS IFE PURESW, < MOVEI T1,LOCCOD ;LOCK LOW SEGMENT LOCK T1, ;LOCK HIM JRST [$ERROR(EF.WRN!EF.OCT,CLJ,) JRST NOLOCK] ;AND RETURN NOLOCK: TXNE SW,DEVTTY!MRET ;TO TTY OR DETACHED? JRST STRT2 ;YES,SKIP BANNER $ERROR(EF.CMT,TRK,TRACKING...) STRT2: MSTIME T1, MOVEM T1,SAVST ;SAVE START TIME IFN FTTRC, < TXNN SW,MD.TRC ;DOING TRACE? JRST MAIN ;NO,SKIP EXTRA UUO MOVX GT,%CNDTM ;FOR TRACE, USE UNIVERSAL DATE-TIME PUSHJ P,FETTAB MOVEM GT,SAVSTU ;SAVE UNIVERSAL START TIME > ;END OF CONDITIONAL ON FTTRC JRST MAIN ;START PROCESSING SUBTTL RESTART,EXIT AND FILE ROUTINES ; HERE TO CLOSE OUTPUT, RELEASE DEVICE AND EXIT FINISH: CLOSE TY, ;CLOSE FILE RELEAS TY, ;RELEASE CHANNEL EXIT ; HERE TO UNLOCK, CLEAN UP AND GO BACK TO COMMAND LEVEL ; RESTRT: CLOSE TY, ;CLOSE FILES RELEAS TY, TXO SW,F.TTY ;FORCE OUTPUT TO TTY TXNN SW,R.LOCK ;WAS I LOCKED? SKIPE HPQREQ ;OR IN HPQ? RESET ;YES, UNDO THE CONDITION MOVE P,[IOWD PDSIZE,PDL] ;RE-SET UP PDP PUSHJ P,REDUCE ;RESTORE SIZE JRST TRACK1 ;AND READY FOR NEXT COMMAND ; ROUTINE TO OPEN,LOOKUP AND APPEND THE OUTPUT REPORT FILOPN: MOVE T1,FILDEV ;LOAD T1 WITH DEVICE MOVE N1,T1 ;GET COPY DEVCHR N1, ;LOOK UP JUMPE N1,[$ERROR(EF.FAT!EF.SIX!EF.RST,DDE,DEVICE DOES NOT EXIST: )] TXNN N1,DV.OUT ;DOES OUTPUT? JRST [$ERROR(EF.FAT!EF.SIX!EF.RST,CDO,DEVICE CANNOT DO OUTPUT: )] MOVE T2,FILMOD ;CHECK MODE MOVEI T3,1 ;FOR LEGALITY LSH T3,(T2) TRNN N1,(T3) ; JRST [$ERROR(EF.FAT!EF.SIX!EF.RST,IDM,ILLEGAL DATA MODE FOR DEVICE )] TXNE N1,DV.TTA ;USER TTY? TXO SW,DEVTTY ;YES,SET FLAG MOVE LUEB,FILMOD ;[*]GET MODE MOVE LUEB+1,FILDEV ;[*]AND DEVICE MOVSI LUEB+2,TYBUF ;[*]POINT TO BUFFER OPEN TY,LUEB ;[*]OPEN THE FILE JRST [MOVE T1,FILDEV $ERROR(EF.FAT!EF.SIX!EF.RST,OPN,OPEN FAILED FOR DEVICE )] OUTBUF TY,TYB ;[*]SET BUFFERS SETOM FSTFLG ;[*]SET FIRST LOOKUP FLAG PUSHJ P,FSAV1 ;[*]AND OPEN FILE TXNN N1,DV.DIR ;[*]WILL LOOKUP NEVER FAIL? POPJ P, ;[*]RIGHT-SKIP MS SKIPN FSTFLG ;[*]DID WE APPEND? POPJ P, ;[*]NO $ERROR(EF.WRN,APP,APPENDING TO EXISTING OUTPUT FILE) MOVEI CHR,14 ;[*] PJRST PUTCHR ;[*]OUTPUT IT AND RETURN ; THIS ROUTINE CLOSES THE OUTPUT FILE, RE-OPENS IT IN APPEND MODE FILSAV: SKIPGE AVAL ;-1 MEANS SAVE EVERY TIME JRST FSAVA ;[*]ELSE SAVE EVERY TIME SKIPG AVAL POPJ P, ;SHOULDN'T REALLY HAPPEN SOSE AVALC ;DECREMENT COUNTER AND IF NOT 0 POPJ P, ;RETURN IMMEDIATELY MOVE T1,AVAL ;PICK UP MASTER COUNT MOVEM T1,AVALC ;AND RESET COUNTER FSAVA: MOVEI T1,1 ;[*]MAKE FSTFLG BE POS. MOVEM T1,FSTFLG FSAV1: PUSHJ P,GENNAM ;[*]MAKE UP A 'MMDDYY' NAME IF /DAILY MOVE LUEB,FILNAM ;[*]RE-OPEN MOVE LUEB+1,FILEXT ;[*] MOVE LUEB+2,FILDAT ;[*]LOAD MOVE LUEB+3,FILPPN ;[*]REST OF BLOCK LOOKUP TY,LUEB ;[*]LOOKUP THEN ENTER JRST NOTHR ;[*]IT AINT THERE... FSAV2: MOVE LUEB+1,FILEXT ;[*]RELOAD MOVE LUEB+2,FILDAT ;[*] MOVE LUEB+3,FILPPN ;[*] ENTER TY,LUEB ;[*]AND HERES THE ENTER JRST E$$OPE ;[*]GIVES US UPDATE MODE SKIPE FSTFLG ;[*]IF FIRST LOOKUP FAILED SKIP, ELSE USETI TY,-1 ;[*] DO APPENDING POPJ P, ;[*]AND RETURN TO CALLER NOTHR: AOSN FSTFLG ;[*]FIRST LOOKUP? JRST FSAV2 ;[*]YES-NO PROBLEM HRRZ T1,LUEB+1 ;[*]GET ERROR CODE JUMPN T1,LUPERR ;[*]OTHER THAN FILE NOT FOUND POP P,(P) ;[*]WE AINT RETURNING... JRST START ;[*]JUST RESTARTING SUBTTL DAILY SWITCH ROUTINE FILE HANDLING ;[*]THIS ROUTINE WILL GENERATE A 'MMDDYY' TYPE FILENAME GENNAM: SKIPL DAILYF ;[*]DID HE WANT /DAILY? POPJ P, ;[*]NOPE MOVX GT,%CNDAY ;[*]WHAT IS TODAY? PUSHJ P,FETTAB ;[*]ASK MON CAMN GT,TODAY ;[*]SAME AS LAST LOOP? POPJ P, ;[*]THEN SKIP ALL THIS B/S EXCH GT,TODAY ;[*]UPDATE TODAY, AND LOOK AT LAST JUMPN GT,NOTFST ;[*]GT=0 IMPLIES FIRST LOOP... MOVE LUEB,FILNAM ;[*]GET FILE NAME ASKED MOVE LUEB+1,FILEXT ;[*]FOR BY USER TO SEE MOVE LUEB+2,FILDAT ;[*]IF IT ALREADY MOVE LUEB+3,FILPPN ;[*]EXISTS LOOKUP TY,LUEB ;[*]CHECK... JRST NOREN ;[*]ASSUME NO FILE W/ OLD NAME PUSHJ P,DATCHK ;[*]ITS THERE-CHECK CREATION DATE... JRST NOREN ;[*]ITS NOT THERE ANYMORE UNLESS IT ;[*]WAS CREATED TODAY... ;[*]HERE IF THIS IS NOT THE FIRST LOOP, AND THE DATE JUST CHANGED (MIDNITE) ;[*]IN THIS CASE RENAME CURRENT FILE TO 'NEWNAME'... NOTFST: MOVE LUEB,NEWNAM ;[*]THE NAME TXNE SW,MD.TRC ;[*]ARE WE TRACING OR TEXTING SKIPA LUEB+1,[DEXTT] ;[*]TRACING MOVE LUEB+1,[DEXT] ;[*]TEXTING MOVE LUEB+2,FILDAT ;[*] MOVE LUEB+3,FILPPN ;[*]MKE IT LOOK LIKE USER WANTS RENAME TY,LUEB ;[*]RENAME IT JRST RENERR ;[*]ERROR CONDITION NOREN: MOVE T1,[POINT 6,NEWNAM] ;[*]TO BUILD THE NAME MOVX GT,%CNMON ;[*]MONTH FIRST PUSHJ P,FETTAB ;[*]ASK THE MON... PUSHJ P,BLDNAM ;[*]ADD TO THE NAME MOVE GT,TODAY ;[*]WE ALREADY HAVE TODAY PUSHJ P,BLDNAM ;[*]ADD ON MOVX GT,%CNYER ;[*]AND NOW FOR YEAR... PUSHJ P,FETTAB ;[*]GET IT FROM THE MONITR. SUBI GT,^D1900 ;[*]- 1900 TO MAKE JUST 2 DIGITS PUSHJ P,BLDNAM ;[*]ADD ON POPJ P, BLDNAM: IDIVI GT,^D10 ;[*]GET EACH DIGIT... ADDI GT,20 ;[*]ASCIZIZE FIRST ONE IDPB GT,T1 ;[*]AND LOAD ADDI GT+1,20 ;[*]TAKE THE REMAINDER=2ND DIG IDPB GT+1,T1 ;[*]SAME POPJ P, ;[*]THIS ROUTINE WILL CHECK THE CREATION DATE OF THE FILE, AND IF ;[*]IT IS NOT EQUAL TO TODAY, IT WILL RENAME THAT FILE TO A MMDDYY NAME ;[*]CORRESPONDING TO ITS CREATION... DATCHK: LDB T2,[POINT 3,LUEB+1,20] ;[*]GET THE CREAT DATE FOR FIL LSH T2,^D12 ANDI LUEB+2,007777 ;[*]MASK OUT ALL BUT LOW 12 BITS IOR T2,LUEB+2 ;[*]AND OR IN THE FIRST 12 BITS DATE T1, ;[*]GET TODAYS DATE CAMN T1,T2 ;[*]DIFFERENT? POPJ P, ;[*]NO=NOTHING IDIVI T2,^D31*^D12 ;[*]TO GET YEARS IDIVI T3,^D31 ;[*]AND DAYS ADDI T2,^D64 ;[*]CORRECT FOR 1964 START ADDI T3,1 ;[*]AND FOR 0 OFFSET MONTH ADDI T4,1 ;[*]AND DAY MOVE T1,[POINT 6,NEWNAM] ;[*]PREPARE TO BUILD NAME MOVE GT,T3 ;[*]GET MONTH PUSHJ P,BLDNAM MOVE GT,T4 ;[*]AND DAY PUSHJ P,BLDNAM MOVE GT,T2 ;[*]AND YEAR PUSHJ P,BLDNAM MOVE LUEB,NEWNAM ;[*]PREP FOR RENAME TXNE SW,MD.TRC ;[*]GET THE RIGHT EXT SKIPA LUEB+1,[DEXTT] MOVE LUEB+1,[DEXT] MOVE LUEB+2,FILDAT ;[*]GET ALL THE LUEB MOVE LUEB+3,FILPPN ;[*]STUFF... RENAME TY,LUEB ;[*]RENAME THE BOOGER JRST RENERR ;[*]ERROR ON RENAME POPJ P, ;[*]VOILA SUBTTL MAIN PROGRAM LOOP MAIN: SKIPE AVAL ;[*]IS SAVING DONE? SKIPG FSTFLG ;[*]IF SO: IS THIS FIRST TIME? CAIA ;[*]YES... PUSHJ P,FILSAV ;[*]SAVE FILES IFN FTTRC, < TXNN SW,MD.TRC ;DOING TRACE? JRST NTRC1 ;NO MOVX GT,%CNDTM ;FOR TRACE, GET UDT PUSHJ P,FETTAB MOVEM GT,SAVUPU ;AS SAVE IT NTRC1: > ;END OF CONDITIONAL ON FTTRC SETZM CTRKJ ;NOT CURRENTLY TRACKING JOB TXNE SW,L.USRS!L.PPN!L.PROG ;TRACKING ALL USERS? TXO SW,UHP ;YES, REMEMBER WE NEED HEADER MSTIME T1, ;GET TIME OF DAY MOVEM T1,SAVUP ;TIME WE START LOOP SKIPA ;SKIP A UUO, WE JUST DID MSTIME MAIN1A: MSTIME T1, ;USER TYPE THINGS MOVEM T1,C.DAY ;AND STORE IFN SYS, < TXNE SW,SYSD ;DOING SYSTEM DATA? JRST SYSGET ;YES,DO IT NOTE ,WE RETURN ;AFTER GATHERING AT REJOIN >; END OF SYS CONDITIONAL MOVE T1,SAVNUM ;GET MAGIC NUMBER PUSHJ P,SETJ ;SET UP AC J FOR RELOCATION TXNE SW,L.JOB!L.USRS!L.PPN!L.PROG ;WATCHING JOB? JRST WJOB ;YES TXNE SW,L.TTY ;WATCHING TTY JRST WTTY ;YES WJOB: MOVEM T1,C.JOB ;STORE AS JOB NUMBER. PUSHJ P,GETTY ;GET ASSOC. TTY # JRST GONJOB ;??JOB IS GONE JRST MAIN1 ;GOT IT WTTY: MOVEM T1,C.TTY ;STORE AS TTY NUMBER PUSHJ P,GETJOB ;GET ASSOC. JOB JRST GONJOB ;??JOB IS GONE MAIN1: SETOM CTRKJ ;TRACKING A JOB PUSHJ P,GETCOR ;GET CORE SIZE OF JOB PUSHJ P,GETSTA ;GET STATUS PUSHJ P,GETRUN ;GET RUN-TIME PUSHJ P,GETNAM ;GET PROGRAM NAME PUSHJ P,GETSTC ;GET RUN STATISTICS PUSHJ P,GETPRV ;GET THEM PUSHJ P,GETDSK ;GET DSK STATS PUSHJ P,GETU ;GET IT PUSHJ P,CHK2 ;MAKE SURE SAME JOB MOVE N1,SAVPOP ;GET SAVED PPN OR PROGRAM TXNN SW,L.PROG ;WATCHING PROGRAM? JRST MAIN0A ;NO CAME N1,C.PROG ;PROGRAM MATCH? JRST MCONT ;NO, DISCARD IT MAIN0A: TXNN SW,L.PPN ;WATCHING PPN? JRST MAIN0B ;NO, GO ON SETCA N1, ;GET COMPLEMENT OF PPN TLCN N1,-1 ;WAS PROJ NUMBER WILD? HLL N1,C.PPN ;YES, INSURE MATCH TRCN N1,-1 ;WAS PROG NUMBER WILD? HRR N1,C.PPN ;YES, INSURE MATCH CAME N1,C.PPN ;A MATCH ON PPN? JRST MCONT ;NO, DISCARD THIS JOB MAIN0B: TXNN SW,OPT.C ;IF COMPARE IS ON JRST MAIN2 ;DONT JUMP YET PUSHJ P,COMPR ;DO COMPARE JRST MCONT ;SAME, SKIP PRINT-OUT MAIN2: TXZE SW,UHP ;IS USER HEADER PROLOG NEEDED? PUSHJ P,USRPRO ;YES, PRINT IT PUSHJ P,PRNT ;PRINT JOB DATA MCONT: SETZM C.FST ;SHUT OFF FIRST SWITCH MOVSI N1,CURDAT ;PREPARE TO MAKE OLD=NEW HRRI N1,OLDAT(J) BLT N1,OLDAT+SIZDAT-1(J) ;DONE REJOIN: TXZE SW,OPT.F ;[*]IF JUST DID A FORCED, TXZ SW,F.TTY ;[*]FIX UP TO NORMAL OUTPUT TXNN SW,L.USRS!L.PROG!L.PPN ;[*]DOING USERS? JRST NOTUSR ;[*]NO AOS T2,SAVNUM ;INCREMENT JOB NUMBER CAMG T2,MAXJOB ; JRST MAIN1A ;DO NEXT JOB MOVEI T2,1 ;START OVER MOVEM T2,SAVNUM ;AFTER SLEEP/EXIT CHECK SETZM CTRKJ ;CLEAR CURRENT-JOB-ACTIVE FLAG NOTUSR: SKIPN LOOKS ;[*]ZERO LOOKS = INFINITE JRST SLEEPY ;[*]SO JUST CONTINUE SOSG LOOKS ;[*]WHEN ZERO EXIT JRST FINISH ;[*] GO AWAY SLEEPY: SKIPE AVAL ;[*]IF WE ARE SAVING... CLOSE TY, ;[*]RELEASE THE FILE WHILE SLEEPING MOVEI N1,1 ;[*]A NON ZERO QUANTITY MOVEM N1,FSTFLG ;[*]TO ALLOW FILSAV TO DO ITS STUFF MOVE N1,QTUM ;[*]GET SLEEP TIME JUMPE N1,SLP2 ;[*]IF NO SLEEP MULI N1,^D1000 ;MAKE MSEC MSTIME T1, ;GET DAYTIME MOVEM T1,SLPTIM ;STORE AS TIME WE WENT TO SLEEP SUB T1,SAVUP ;T1 NOW HAS TIME SPENT ;IN LOOKING AND PRINTING JUMPGE T1,.+2 ;IF NEGATIVE ADDX T1,^D1000*^D60*^D60*^D24 ;WE WENT AROUND MIDNITE SUB N2,T1 ;CORRECT SLEEP TIME JUMPLE N2,SLP2 ;CHECK FOR NEG OR ZERO SLEEP TIME MOVEM N2,SLPQT ;SAVE RSLEEP: CAILE N2,^D63000 ;IF LESS < 63K MS JRST UDAEM ;THEN DONT USE DAEMON SLP1: TXO N2, ;WAKE ON TTY ACTIVITY HIBER N2, JRST USLP ;HIBER FAILED, USE SLEEP SLP2: INCHRS CHR ;GET CHARACTER,SKIP IF ONE JRST MAIN ;AND DO AGAIN JRST NEWSPC ;WANT NEW SPECS UDAEM: MOVEI T1,N1 ;SET UP FOR CLOCK REQUEST MOVX N1,.CLOCK ;TIME FUNCTION DAEMON T1, JRST USLP ;IF FAILURE SETZ N2, ;SET FOR INFINITE SLEEP JRST SLP1 ;GO HIBERNATE USLP: MOVE N1,QTUM ;GET SECS OF SLEEP CAILE N1,77 ;IF NOT IN 63 SEC BRACKET MOVEI N1,77 ;SET FOR MAX SLEEP N1, JRST SLP2 ;AND CONTINUE SUBTTL SYSTEM TRACKING **DATA GATHERING MODULE ** ; DO THE SYSTEM DATA GATHERING IF WE WANT TO ; AND THE RETURN TO REJOIN TO CHECK TIMEING,EXITS ETC. ; NOTE THAT NO ITEM DEPENDENT ROUTINE IS CALLED IF TAB.P IS ZERO ; FOR THAT ITEM; THIS WAY, IF AN ITEM IS NOT AVAILABLE WHEN ; TRACK IS RUNNING ON A CERTAIN SYSTEM, THE INITIALIZATION ROUTINE ; CAN SIMPLY NOT ALLOCATE CORE FOR THE ITEM AND THE ITEM WILL NOT ; BE GATHERED. THE SAME IS TRUE OF SYSDIS. IFN SYS, < SYSGET: MOVX GT, %NSHJB ;GET HIGHEST JOB NUMBER PUSHJ P,FETTAB ;CAUSE MANY WANT TO KNOW MOVEM GT,HIJOB ;THIS LOCATION AVAILABLE MOVX GT, %CNLNM ;LOOKUP NUMBER OF JOBS TOO PUSHJ P,FETTAB ;FOR ASR,SWR ETC MOVEM GT,NUMJOB ;STORE THIS TOO MOVE J,HIJOB ;SET UP J LGNCHK: MOVX GT,.GTSTS ;LOOK UP STATUS HRLI GT,(J) PUSHJ P,FETTAB ;OF THIS JOB TXNN GT,JLOG ;LOGGED IN? JRST NOTLGN ;NO PUSH P,GT ;SAVE STATUS WORD FOR LATER MOVEM J,C.JOB ;ROUTINES EXPECT IT IN C.JOB PUSHJ P,GETCOR ;GET HIS CORE ALLOCATION MOVE T1,C.LOW ;AND STASH IT IN JOBTB1 HRLM T1,@JOBTB1 ;LEFT HALF SKIPGE T2,C.HIGH ;PICK UP HI CORE SETZ T2, ;DONT BOTHER WITH SPY HRRM T2,@JOBTB1 ;HIGH CORE ALLOCATION PUSHJ P,GETSTA ;GET HIS STATUS TOO MOVE T1,C.STAT ;SO CAN DO ASR,Q INFO ETC HRL T1,HISEGN ;HI-SEG # TO LH OF JOBTB2 ENTRY SKIPN C.NSWP ;IF HES SWAPPED OUT TLO T1,400000 ;SIGN BIT OF JOBTB2 ENTRY GOES ON POP P,GT ;JOB STATUS WORD TXNE GT,RUN ;IN RUN STATE? TRO T1,400000 ;YES, BIT 18 OF JOBTB2 GOES ON MOVEM T1,@JOBTB2 ;STORE IT SKIPA ;SKIP SETTING NOT LOGGED IN BIT NOTLGN: SETOM @JOBTB1 ;INDICATE NOT LOGGED IN SOJG J,LGNCHK ;BACK FOR NEXT JOB PUSHJ P,ANALYZ ;CALL COMMON JOB ANALYSIS ROUTINE PUSHJ P,CELPST ;GET ELAPSED TIME MOVSI J,-LEN.G ;LENGTH OF GET TABLE SYSG1: SKIPLE TAB.P(J) ;WAS THERE CORE ALLOCATED? SKIPN TAB.G(J) ;AND IS THERE A ROUTINE TO XCT? JRST SYSG2 ;ONE OR THE OTHER IS NOT TRUE PUSHJ P,@TAB.G(J) ;EXE2UTE PROPER ROUTINE SYSG2: AOBJN J,SYSG1 ;SEE IF MORE MOVEM L,T.LOOK ;TOTAL LOOKS DONE (START W/0) MOVE N1,CU.TIC ;FIX UP TIMERS FOR NEXT LOOK MOVEM N1,LS.TIC ;LAST = CURRENT MOVE N1,CU.MS ; MOVEM N1,LS.MS ;ALL DONE SOSLE RVALC ;DECREMENT COUNTER AOJA L,REJOIN ;MORE LOOKS LEFT PUSHJ P,SYSDIS ;ELSE DO A DISPLAY MOVE T1,RVAL ;RESET REPORT COUNTER MOVEM T1,RVALC ;TO WANTED VALUE SETZB L,T.LOOK ;RESET INDEX TO DATA AREA MOVE T1,SAVUP ;RESET START TIME MOVEM T1,SAVST ;SAVE IT IFN FTTRC, < MOVE T1,SAVUPU ;FOR TRACE, ROTATE TIMES MOVEM T1,SAVSTU ; > ;END OF IFN FTTRC TXZ SW,SYSD.I ;HAVE DONE AT LEAST ONE LOOK JRST REJOIN ;THEN CONTINUE ; SUBROUTINE TO CALCULATE ELAPSED TIME BETWEEN NOW AND LAST SEEN ; VALUES OF MS AND TICS CELPST: MOVX GT, %CNTIM ;MANY THINGS LIKE TICS PUSHJ P,FETTAB ;SO USE TICS MOVEM GT,CU.TIC ;STASHED SUB GT,LS.TIC ;MAKE INCREMENTAL JUMPGE GT,.+2 ;IN CASE WENT PAST MIDNITE ADDX GT,^D60*^D60*^D60*^D24 ;ADJUST IT MOVEM GT,EL.TIC ;ELAPSED TICS MSTIME N1, ;CURRENT MS TIMER MOVEM N1,CU.MS ;SET IT SUB N1,LS.MS ;LAST SEEN MS JUMPGE N1,.+2 ;TAKE CARE OF NITE OWLS ADDX N1,^D1000*^D60*^D60*^D24 MOVEM N1,EL.MS ;STASH IT POPJ P, ;;STILL UNDER "IFN SYS" CONDITIONAL SUBTTL SYSTEM TRACKING **DATA DISPLAY MODULE ** SYSDIS: TRACEH (SGO) ;[*]PUT ON A HEADER MOVEI CHR,14 ;GIVE A FORM-FEED PUSHJ P,PUTCHR ;TO SEPARATE REPORTS TYPES (< STATUS FROM >);OUTPUT HEADER MOVE T1,SAVST ;GET STARTING TIME PUSHJ P,PUTDAY ;OUTPUT DAYTIME STARTED TYPES (< TO >) MOVE T1,SAVUP ;AND OUTPUT PUSHJ P,PUTDAY ;DAYTIME STOPPED PUSHJ P,CRLF TYPES () ;GIVE SEQUENCE NUMBER AOS T1,NLOOK ;PRINT NUMBER OF THIS REPORT TRACE ;SEND IT TO THE TRACE FILE PUSHJ P,DECOUT ;AND TO LISTING TRACEM SAVSTU ;FOR TRACE, GIVE UNIVERSAL REPORT TRACEM SAVUPU ;START TIME & END TIME TXNE SW,OPT.F ;WAS THIS FORCED? SOS NLOOK ;FIX UP LOOK NUMBER TYPES (< UPTIME: >) ;PRINT UPTIME LABEL MOVX GT, %NSUPT ;LOOKUP SYSTEM UPTIME PUSHJ P,FETTAB ; MOVE T1,GT ;CONVERT TICS TO MS IMULI T1,^D100 ; IDIVI T1,^D6 ;BY MULTIPLYING BY 16.666 PUSHJ P,PUTDAY ;PRINT IT HH:MM:SS TYPES (< CORMAX:>) ;ALSO TELL CORMAX MOVX GT, %NSCMX ;BECAUSE IT TOO CHANGES PUSHJ P,FETTAB ; MOVE T1,GT ;OUTPUT AS K OR P TRACE ;CORMAX,IN WORDS, TO TRACE FILE PUSHJ P,MEMPNT ; TYPES (< SCHED:>) ;TELL IF OPR THERE, ETC. MOVX GT, %CNSTS ; PUSHJ P,FETTAB ;SEE IF THERE ANDI GT,777 ;RIGHT MOST BITS OF WORD MOVE T1,GT ;TO ARG REGISTER TRACE ;SCHED TO TRACE FILE PUSHJ P,OCTOUT ;AND PRINT IT PUSHJ P,SCDWRT ;GO MAKE SCHED BLOCK TYPES (< STRUCTURES MOUNTED: >) MOVEI CHRCNT,^D100 SETZ T1, ;START LIST SMLOOP: SYSSTR T1, ;GET STRUCTURE NAME JRST SMDONE ;UUO FAILURE , FAKE DONE JUMPE T1,SMDONE ;OR IF EXHAUSETED CAILE CHRCNT,^D41 ;ROOM LEFT? JRST [TYPES (< >) ; CRLF, 3 SETZ CHRCNT, ; CLEAR COUNTER JRST SMNOC] TYPEC (<,>) ;COMMA SMNOC: PUSHJ P,SIXPNT ;PRINT NAME JRST SMLOOP ;BACK FOR MORE SMDONE: MOVX GT, %NSKTM ;EXAMINE KSYS PUSHJ P,FETTAB ;TIMER JUMPLE GT,NOKSYS ;IF ZERO, NOT PENDING TYPES (< KSYS: >) ;TELL IF SYSTEM GOING DOWN MOVE N1,GT ;SO THEY KNOW WHATS DOING IDIVI N1,^D60 ; PUSH P,N2 ;SAVE MINUTES JUMPE N1,NOHRS ; MOVE T1,N1 ;PRINT KSYS HRS PUSHJ P,DECOUT TYPES (< HRS. >) NOHRS: POP P,T1 ;AND MINUTES PUSHJ P,DECOUT ; TYPES (< MINS.>) ;AND IN WHAT UNITS NOKSYS: MOVEI J,5 ;GIVE 5 CRLFS PUSHJ P,CRLF ; SOJG J,.-1 ; MOVSI J,-LEN.D ;GET LENGTH OF DISPLAY TABLE SYSDS1: SKIPG TAB.P(J) ;WAS THERE CORE ALLOCATED? JRST SYSDS2 ;NO, THERE IS NOTHING TO DISPLAY SKIPE N1,TAB.D(J) ;GET AN ITEM AND IF NON-ZERO PUSHJ P,(N1) ;DO IT SYSDS2: AOBJN J,SYSDS1 ;IF MORE TO DO TRACEH (END) ;[*]AND A REP END HEADER POPJ P, ;RETURN TO CALLER ;scheduler data output SCDWRT: MOVE T1,[XWD SCDLEN,SCDBLK] SCHED. T1, JRST SCDDON TRACEH(SCD) MOVNI T2,SCDL2 SCDMOR: AOJGE T2,SCDDON MOVE T1,SCDEND(T2) PUSHJ P,BINWRT JRST SCDMOR SCDDON: POPJ P, ; ;;STILL UNDER "IFN SYS" CONDITIONAL SUBTTL SYSTEM TRACKING **DATA INITIALIZATION MODULE ** ; ROUTINE TO DO INITIALIZATION OF DATA AREA SYSINI: TRACEH (SI) ;[*]SYSTEM INIT HEADER PUSHJ P,JOBBLK ;GET A BLOCK FOR JOBTB1 MOVEM T1,JOBTB1 ;THIS BLOCK IS SET UP BEFORE GET ROUTINES ;ARE CALLED. SEE IMPURE SECTION ;FOR DEFINITION OF JOBTB1,JOBTB2 PUSHJ P,JOBBLK ;GET SECOND BLOCK MOVEM T1,JOBTB2 ;STASH PTR WORD MOVX GT,%CNCPU ;[217] GET NUMBER OF CPUS PUSHJ P,FETTAB ;[217] MOVEM GT,NCPU ;[217] MOVX GT,%CNVER ;LOOK UP THE MONITOR VERSION PUSHJ P,FETTAB ;FROM THE MONITOR TRACEM GT ;PUT IT OUT TO THE TRACE FILE ANDI GT,-1 ;CLEAR THE LH MOVEM GT,SYSVER ;AND STORE SIGNIFICANT PART MOVE T1,RVAL ;SET COUNTER FOR REPORTS MOVEM T1,RVALC ;NUMBER OF LOOKS/REPORT SETZB L,T.LOOK ;SET OTHER COUNTERS SETZM LS.TIC ;SET UP TIMERS SETZM LS.MS ;CLEAR MOVSI J,-5 ;LOOK UP SYSTEM NAME SINAMG: MOVX GT,%CNFG0 ;A WORD OF NAME HRLZ T2,J ;ADD OFFSET ADD GT,T2 ;FIN PUSHJ P,FETTAB ;LOOK IT UP MOVEM GT,SYSNAM(J) ;AND STORE IT AOBJN J,SINAMG ;GO BACK TO SYSINI NAME GET MOVX GT,%CNDT0 ;GET DATE TOO PUSHJ P,FETTAB MOVEM GT,SYSDTE ; MOVX GT,%CNDT1 ;TWO WORDS PUSHJ P,FETTAB MOVEM GT,SYSDTE+1 MOVX GT, %CNSIZ ;ALSO LOOK UP SIZE PUSHJ P,FETTAB ;LOOK UP MOVEM GT,SYSSIZ ;AND STORE IT TYPES < REPORT ON SYSTEM PERFORMANCE AND UTILIZATION BY TRACK %> MOVEI T1,TRKVER ;GET VERSION NUMBER PUSHJ P,OCTOUT ;AND PRINT IT IFN TRKMIN, < MOVEI T1,TRKMIN ;MINOR VERSION IDIVI T1,^D27 ;SEPARATE THE LETTERS JUMPE T1,MIN01 ;IF ZERO MOVEI T1,'A'-1(T1) ;FOR OUTPUT PUSHJ P,SIXPNT ; AOS T2 ;ADJUST FOR ROUNDING MIN01: SKIPN T1,T2 ;GET REST JRST MIN02 ;IF ZERO MOVEI T1,'A'-1(T1) ;AND DO IT PUSHJ P,SIXPNT ;FINISHED MIN02: >; END OF IFN TRKMIN TYPEC (<(>) ;PRINT EDIT NR. TOO MOVEI T1,TRKEDT ;THE EDIT NUMBER PUSHJ P,OCTOUT ;OUT IT GOES TYPEC (<)>) ; IFN TRKWHO,< TYPEC (-) ;PRINT MINOR VERSION MOVEI T1,TRKWHO PUSHJ P,OCTOUT ;DO IT > ;END OF IFN TRKWHO TYPES (< ON >) ;DAY IT IS MOVX GT, %CNDAY ;GET DAY PUSHJ P,FETTAB ;FROM MONITOR MOVEM GT,T1 ;AND OUTPUT AS DECIMAL PUSHJ P,DECOUT ;DONE MOVX GT, %CNMON ;AND MONTH PUSHJ P,FETTAB ;OUR OWN GETTAB MOVE T1,MONTAB-1(GT) ;PICK OUR MONTH PUSHJ P,SIXPNT ;AND PRINT IT MOVX GT, %CNYER ;GET YEAR PUSHJ P,FETTAB ;DONE MOVE T1,GT ;AND IT GETS PRINTED TOO SUBI T1,^D1900 ;MAKE IT 2 DIGIT PUSHJ P,DECOUT ;FINISH TYPEC (< >) ;ONE SPACE MOVX GT,%CNSER ;[*]GET OUR APR SER NUM PUSHJ P,FETTAB ;[*]FROM THE SYSTEM TRACEM GT ;[*]AND PUT INTO TRACE FILE MOVX GT, %CNDTM ;LOOK UP THE DAY OF WEEK PUSHJ P,FETTAB ;VIA 15 BIT UNIVERSAL DATE HLRZ N1,GT ;THEN DATE IN LEFT HALF IDIVI N1,7 ;THERE SHOULD BE 7 DAYS/WEEK MOVE T1,DAYTAB(N2) ;FROM DAY TABLE PUSHJ P,SIXPNT ;PRINT IT TYPES (< CONFIGURATION DATA FOR SYSTEM:>) TYPES (< SYSTEM RUNNING >) MOVEI STR,SYSNAM ;POINT TO SYSTEM NAME PUSHJ P,PUTSTR ;AND PRINT IT TYPES (< (>) MOVE T1,SYSVER PUSHJ P,OCTOUT TYPEC (<)>) TYPES (< BUILT ON >) MOVEI STR,SYSDTE ;GIVE BUILD DATE PUSHJ P,PUTSTR ; TYPES (< MAX. NUMBER OF JOBS: >) MOVE T1,MAXJOB ;GIVE CONFIGURATION MAX. JOB NR. TRACE ;THIS GOES TO TRACE FILE PUSHJ P,DECOUT ; TYPES (< MAX. NUMBER OF TTY LINES: >) MOVE T1,MAXTTY ;AND TTY LINES TRACE ;THIS TOO GOES TO TRACE FILE PUSHJ P,DECOUT ; OR TEXT FILE MOVX GT, %NSMMS ;LOOK UP MEMORY SIZE PUSHJ P,FETTAB ; PUSH P,GT ;SAVE IT SUB GT,SYSSIZ ;SUBTRACT MONITOR LOW SEG SIZE MOVE N1,GT ;HANG ON TO THAT FIGURE MOVX GT,%CNHSL ;MONITOR MAY BE TWO SEGMENT PUSHJ P,FETOPT ;SO LOOK UP HIGH SEG LENGTH SETZ GT, ;FAKE 0 LENGTH IF NOT THERE SUB N1,GT ;SUBTRACT HI SIZE FROM TOTAL MOVE T1,N1 ;GET USER MEMORY AVAILABLE TYPES (< USER MEMORY: >) TRACE ;TRACE USER MEMORY SIZE PUSHJ P,MEMPNT ;PRINT IT MOVEM T1,USIZ ;AND STORE USER MEMORY SIZE TYPES (< FROM TOTAL OF >) POP P,T1 ;PRINT IN K OR P TRACE ;AND TOTAL MEMORY SIZE IN WORDS PUSHJ P,MEMPNT ;STD ROUTINE TYPES (< DISK UNITS: NAME STR TYPE CONTROL CHAN# STATUS MOUNTED? >) SETZB GT,T1 ;GET NUMBER OF DISK UNITS ON SYSTEM CNTUNI: SYSPHY GT, ;BY LOOPING THRU SYSPHY UUO SETZ GT, ;FAKE DONE IF FAILS SKIPE J,GT ;IF 0,WE ARE DONE AOJA T1,CNTUNI ;OTHERWISE, RETURN NOW FOR NEXT ONE HRLZM T1,UNIPTR ;STORE COUNT OF POINTER MOVNS UNIPTR ;NEGATE IT PUSH P,T1 ;SAVE SIZE PUSHJ P,ASSCOR ;GET CORE FOR BLOCK HRRM T1,UNIPTR ;STORE IT AWAY TOO POP P,T1 ;RESTORE SIZE PUSHJ P,ASSCOR ;ASSIGN CORE MOVEM T1,UNIDB ;STORE DB ADDRESS OUTUNI: SYSPHY GT, ; JRST DUNUNI ;UUO ERROR FAKES DONE JUMPE GT,DUNUNI ;AS DOES 0 RETURN MOVEM GT,ARGS ;SET UP FOR DSKCHR MOVE GT,[XWD ARGSLN,ARGS] ;GET CHARACTERISTICS DSKCHR GT, ; JRST DUNUNI ;IF UUO FAILS PUSHJ P,TAB ;TAB OVER MOVE T1,ARGS+.DCNAM ;GET UNIT NAME SKIPN ARGS+.DCSNM ;IF STR, OK MOVEM T1,ARGS+.DCSNM ;OTHERWISE, USE PHYS FOR STR[BOC] PUSHJ P,SIXPNT ;OUTPUT IT PUSHJ P,TAB ;TAB OVER MOVE N1,UNIPTR ADDI N1,0(J) MOVE T1,ARGS+.DCULN ;WE WANT LOG UNIT NAME MOVEM T1,0(N1) MOVE T1,ARGS+.DCSNM ;WE WANT STR NAME PUSHJ P,SIXPNT ;AND PRINT IT PUSHJ P,TAB ;TAB OVER LDB T4,[POINTR(GT,DC.CNT)] ;GET TYPE OF UNIT CAXE T4,.DCCFS ;IS IT FIXED HEAD? CAXN T4,.DCCFH ;OF SOME KIND SETO T1, ;YES,FLAG WITH -1 MOVE N1,UNIDB ;GET BASE ADDRESS OF DBS ADDI N1,0(J) ;GET THIS SLOT MOVEM T1,0(N1) ;STORE FOR LATER USE PUSHJ P,UNITYP ;TYPE OUT UNIT TYPE MOVEI T1,'ON' TXNE GT,DC.OFL ;OFF LINE? MOVEI T1,'OFF' PUSHJ P,SIXPNT TYPES () PUSHJ P,TAB ;TAB OVER LDB T2,[POINTR(GT,DC.STS)] ;GET UNIT MOUNT STATUS MOVE T1,[EXP 'YES','FUTURE','NO','DOWN'](T2) PUSHJ P,SIXPNT PUSHJ P,CRLF MOVE GT,ARGS+.DCNAM ;FETCH LAST NAME TO GET NEXT AOJA J,OUTUNI ;UPDATE COUNTER,LOOP FOR NEXT DUNUNI: TYPES (< DATA GATHERED EVERY >) MOVE T1,QTUM ; TRACE ;TELL TRACE LOOK INTERVAL PUSHJ P, DECOUT ;TIME IN SECONDS TYPES (< SECONDS AND REPORTED EVERY >) MOVE T1,RVAL ;IN DECIMAL.NUMBER TRACE ;TELL TRACE INTERVALS PER REPORT PUSHJ P,DECOUT ;SO WE CAN SEE IT TYPES (< LOOKS >) MOVX GT,%CNDTM ;[*]GET NBS TIME PUSHJ P,FETTAB ;[*]FROM THE MON TRACEM GT ;[*]AND STORE IN THE TRACE FILE MOVSI J,-LEN.I ;LENGTH OF INITIALIZATION TABLE SYSIN1: SKIPGE TAB.P(J) ;-1 IN TAB.P MEANS EXCLUDED JRST SYSIN2 ;SO DONT SET IT UP SKIPE N1,TAB.I(J) ;FETCH ITEM AND IF NOT ZERO PUSHJ P,(N1) ;GO THERE TO DO WHAT THEY WANT SYSIN2: AOBJN J,SYSIN1 ;IF MORE TO DO SETZM NLOOK ;CLEAR REPORT COUNTER TXO SW,SYSD.I ;MARK AS INITIALIZED POPJ P, ;AND ON WITH THE SHOW ;END OF CONDITIONAL STARTS WITH "SYSGET" > SUBTTL HANDLE DISSAPEARANCE OF A TRACKED JOB GONJOB: SKIPGE O.FST(J) ;ALREADY BEEN GONE ONE PASS? JRST GONJ1 ;YES,SKIP ZEROING SETZM OLDAT(J) ;BLT ZEROES MOVEI T1,OLDAT+1(J) ; HRLI T1,-1(T1) BLT T1,OLDAT+SIZDAT-1(J) ;DONE SETOM O.FST(J) ;FLAG AS GONE GONJ1: TXNN SW,L.USRS!L.PPN!L.PROG ;DOING MULTI-USERS? JRST GONJ2 ;NO SETZM C.FST ;CLEAR C.FST SO NEXXT JOB ;DOESNT FIND IT SET JRST REJOIN ;YES,JUST GET NEXT JOB GONJ2: TXNN SW,OPT.K ; WANTS FATAL (NO /NOKILL DONE) JRST GNJFAT ;THEN GIVE IT TO HIM $ERROR(EF.WRN,CFC,) SETOM C.FST ;SET FIRST TIME SWITCH JRST MCONT ;AND GO ON GNJFAT: MOVE T1,SAVNUM ;LOAD T1 WITH SPECIFICATION TXNE SW,L.TTY ;WATCHING TTY? JRST GOTTY ;YES $ERROR(EF.FAT!EF.DEC!EF.RST,NJN,NO JOB NUMBER ) GOTTY: $ERROR(EF.FAT!EF.OCT!EF.RST,NJT,NO JOB ON TTY #) CHK2: SKIPE C.FST ;ALREADY KNOW HE IS NEW? POPJ P, ;YES,RETURN MOVE T1,O.JOB(J) ;GET OLD JOB NUMBER CAME T1,C.JOB ;SAME JOB? JRST SETFST ;NO MOVE T1,O.RT(J) ;RUNTIME DECREASED? CAMLE T1,C.RT ; SETFST: SETOM C.FST ;SET FLAG POPJ P, ;RETURN SUBTTL ROUTINE TO RELOCATE J TO POINT TO CURRENT OLD DATA BLOCK SETJ: MOVE J,OLDPTR ;BASE ADDR TXNN SW,L.USRS!L.PPN!L.PROG ;DOING MULTIPLE? POPJ P, ;NO,ALL DONE PUSH P,T1 ;SAVE T1 IMULI T1,SIZDAT ; ADDI J,-SIZDAT(T1) ;UPDATE,BACKING OFF 1 BLOCK SKIPGE O.FST(J) ;SEE IF C.FST NEEDS TO BE SET SETOM C.FST ; PJRST TPOPJ ;RESTORE T1 AND RETURN SUBTTL HANDLE RUNNING COMMANDS NEWSPC: PUSHJ P,GETCH2 ;CHECK/PROCESS THE CHARACTER CAILE CHR," " ;SKIP TXNE SW,BRK ;SKIP BREAK CHARACTERS JRST NEWBCK ; PUSH P,CHR ;SAVE CHARACTER TXO SW,F.TTY ;RUNNING COMMANDS GO TO TTY PUSHJ P,CRLF ;[5]GIVE A CR-LF PUSHJ P,CRLF ;[5]AND A BLANK LINE POP P,CHR ;UNSAVE CHARACTER MOVSI T2,-RNCLEN ;LENGTH OF RUN COM TABLE RCLOOP: LDB T1,[POINT 7,RUNTAB(T2),6] ;GET CHARACTER CAIN CHR,(T1) ;A MATCH? JRST @RUNTAB(T2) ;YES AOBJN T2,RCLOOP $ERROR(EF.FAT,BRC,BAD RUNNING COMMAND-- TYPE "H" FOR HELP) CLRBFI ;GET RID OF TYPE AHEAD NEWBCK: TXZ SW,F.TTY ;BACK TO NORMAL OUTPUT SKIPN QTUM ;IF NO SLEEP TIME JRST MAIN ;CLEAR AND GO BACK TO MAIN LOOP MSTIME N2, ;GET CURRENT DAYTIME SUB N2,SLPTIM ;SUBTRACT TIME WE WENT TO SLEEP JUMPLE N2,MAIN ;IF NEG. WE WENT PAST MIDNITE CAML N2,SLPQT ;IF ELAPSED > WANTED JRST MAIN ;GO PROCESS SUB N2,SLPQT ;SUBTRACT ELAPSED-WANTED MOVMS N2 ;CORRECT SIGN MOVEI T1,1 ;[3]CLEAR WAKE CONDITION HIBER T1, ;[3] JFCL ;[3] JRST RSLEEP ;GO BACK TO SLEEP NEW8: PUSHJ P,CRLF ;RESTART PUSHJ P,CRLF PUSHJ P,CRLF ;2 CR-LF PAIRS AS OUTPUT DEL. MOVEI T1,1 ;[3]CLEAR WAKE CONDITION HIBER T1, ;[3] JFCL ;[3] JRST RESTRT ;AND GO RESTART NEW4: TXO SW,OPT.F ;SAY ITS FORCED TXNN SW,SYSD ;DOING SYSTEM DATA? JRST MAIN ;NO,GO DO A FORCED LOOK IFN SYS, < MOVE T1,T.LOOK ;SEE HOW MANY LOOKS TAKEN CAIGE T1,2 ;0-2 MAKES FOR AT LEAST ON VALUE JRST NOTYET ;ELSE TELL TO COME BACK LATER PUSH P,SAVUP ;SAVE DAYTIME MSTIME T1, ;AND MAKE A CURRENT ONE MOVEM T1,SAVUP ;FOR THE FORCED LOOK PUSHJ P,SYSDIS ;DO THE DISPLAY POP P,SAVUP ;RESTORE TIME JRST NEWBCK ;AND GO BACK TO SLEEP NOTYET: $ERROR(EF.WRN,NED,NOT ENOUGH DATA FOR DISPLAY) JRST NEWBCK ;AND RETURN > H2: HELPME ;ASK FOR HELP JRST NEWBCK ;CLEAN UP AND RETURN NEW5: SKIPE CTRKJ ;TRACKING A JOB? JRST NEW5A ;YES, PROCEED NEW5B: $ERROR(EF.WRN,NTJ,NOT TRACKING A SINGLE JOB ) JRST NEWBCK ;[5]CONTINUE NEW5A: PUSHJ P,GETU ;GET STUFF HE WANTS PUSHJ P,PUTU ;[5]PUT OUT STUFF HE WANTS PUSHJ P,CRLF ;AND A CR-LF PAIR JRST NEWBCK ;[5]AND CONTINUE NEW6: SKIPL CTRKJ ;JOB ACTIVE? JRST NEW5B ;[11]NO, USER ERROR PUSHJ P,GETPRV ;LOOKUP PRIVELEGES PUSHJ P,PUTPRV ;PRINT STUFF PUSHJ P,CRLF ;GIVE A CLEAR LINE JRST NEWBCK ;AND GO BACK NEW7: SKIPL CTRKJ ;JOB ACTIVE? JRST NEW5B ;NO, ITS AN ERROR MSTIME T1, ;NEED UPDATED ELAPSED TIME MOVEM T1,C.DAY ;STASH IT PUSHJ P,GETRUN ;ALSO NEW RUNTIME PUSHJ P,GETSTC ;GET STATISTICS PUSHJ P,PUTSTC ;AND PUT THEM OUT PUSHJ P,CRLF ;AND PUT A CR-LF PAIR PUSHJ P,CRLF ;AND A BLANK LINE JRST NEWBCK ;AND CONTINUE NEW11: TYPES () MOVE T1,QTUM PUSHJ P,DECOUT TYPES (< SECONDS. >) TXNN SW,SYSD ;DOING SYSTEM? JRST NEW11A ;NO TYPES () MOVE T1,RVAL PUSHJ P,DECOUT TYPES (< REPORTS WRITTEN: >) MOVE T1,NLOOK PUSHJ P,DECOUT TYPES (< INTERVALS TILL NEXT REPORT: >) MOVE T1,RVALC PUSHJ P,DECOUT PUSHJ P,CRLF NEW11A: SKIPN T1,LOOKS ;SEE IF EXIT COUNTER SET JRST [ TYPES () JRST NEW11B] TYPES () PUSHJ P,DECOUT NEW11B: PUSHJ P,CRLF JRST NEWBCK ; TABLE FOR RUNNING COMMANDS DEFINE RCCREATE < IFE BIGLST, X (H,H2) ;;H FOR HELP X (F,NEW4) ;;F FOR FORCED LOOK X (P,NEW6) ;;P FOR PRINT PRIVELIGE BITS X (U,NEW5) ;;U FOR PRINT USER NAME X (S,NEW7) ;;S FOR USER STATISTICS LINE X (X,FINISH) ;;X FOR EXIT X (N,NEW8) ;;N FOR NEW COMMAND X (W,NEW11) ;;W FOR WHAT REPORT LIST > ;END OF RCCREATE DEFINITION DEFINE X(AA,BB)< XWD "AA"_^D11,BB> > RUNTAB: RCCREATE RNCLEN==.-RUNTAB SUBTTL ROUTINE TO GET SWITCH AND DATA GETSW: TXZ SW,T.FLG ;CLEAR "VALID SW SEEN" FLAG PUSHJ P,TOKEN ;GET SWITCH JUMPE T1,[$ERROR(EF.FAT!EF.RST,NSS,NO SWITCH SPECIFIED)] MOVEM T1,LASSW ;STORE SWITCH AWAY MOVE T2,[-SWSLEN,,SWS] ;POINT TO SWITCH TABLE TRZ T1,77 ;INSURE NO CHARACTER IN LAST PLACE TRO T1,'*' ;CHECK FOR EXACT MATCH ROT T1,-6 ;BY CHECKING FOR "*XXXXX" PUSHJ P,TABLUK ;DO THE LOOKUP SKIPA T1,LASSW ;NOT FOUND,CHECK OTHERS JRST GETSW1 ;FOUND UNDER EXACT MATCH CODE MOVE T2,[-SWSLEN,,SWS] ;INPUT TO TABLE LOOKUP PUSHJ P,TABLUK ;LOOK IT UP JRST [ JUMPL T1,[ MOVEI T1,LASTOK $ERROR(EF.FAT!EF.RST!EF.STR,ABS,AMBIGUOUS SWITCH /)] JUMPGE T1,[ MOVEI T1,LASTOK $ERROR(EF.FAT!EF.RST!EF.STR,UKS,UNKNOWN SWITCH /)]] GETSW1: MOVE T4,SWS(T1) ;REMEMBER SWITCH NAME MOVEM T4,LASSW ; XCT SWSTAB(T1) ;EXECUTE PROPER INSTRUCTION POPJ P, ;THEN RETURN ;DEFINE SWITCHES AND THEIR INSTRUCTIONS DEFINE SWCREAT < IFE BIGLST, X (,< JRST CSW>) ;;ONLY IF CHANGE X (,) ;;DAILY FILE SAVING X (,) ;;/DISK X (,) ;;EXCLUDE X (<*EXIT>,< JRST XSW>) ;;EXIT X (,) ;;FORMAT X (,< JRST RSW>) ;;R X (<*HELP>,< JRST HELPER>) ;;HELP X (,) ;;HPQ X (,) ;;INCLUDE X (,< TXO SW,OPT.I>) ;;DO INCREMENTAL DATA X (,) ;;Q SWITCH X (<*LIST>,) ;; X (,) ;;LOCK X (,) ;; X (,< TXO SW,OPT.K>) ;;DONT KILL IF JOB GOES AWAY X (,< TXO SW,MRET>) ;;DO MONRET AFTER INIT x (,) ;;METER board on cpu0 x (,) ;;METER board on cpu1 x (,) ;;METER board on cpu2 x (,) ;;METER board on cpu3 x (,) ;;METER board on cpu4 x (,) ;;METER board on cpu5 x (,) ;;METER board on all cpus X (,) ;;NO METER BOARD AT ALL X (,) ;;PRIVELEGE BITS X (,< JRST ASW>) ;;SAVE OUTPUT FILE X (,< JRST SSW>) ;;STATISTICS X (,) ;;SUMMARY X (,) ;;USER NAME AND PPN X (,< JRST XSW>) ;; OLD FORM OF /EXIT LIST > ;END OF SWCREAT MACRO DEFINE X(AA,BB)< SIXBIT/AA/> SWS: SWCREAT SWSLEN==.-SWS DEFINE X(AA,BB)< BB> SWSTAB: SWCREAT HELPER: TXO SW,F.TTY ;FORCE ANY PRINTOUT TO TTY CAIE CHR,":" ;FOLLOWED BY VALUE? JRST HELP.5 ;NO, USER HELPER PUSHJ P,TOKEN ;GET SIXBIT TOKEN MOVE T2,[-2,,[SIXBIT /SWITCH/ SIXBIT /KEYWOR/]] ;SWITCHES OR KEYWORDS PUSHJ P,TABLUK ; JRST SAYUSV ;UNKNOWN SWITCH VALUE JUMPN T1,HELP.K ;WANT KEYWORDS? HELP.S: MOVE T2,[-SWSLEN,,SWS] ;NO, WANT SWITCHES TYPES () PUSHJ P,HELP.0 ;CALL COMMON ROUTINE JRST HELP.6 ;AND EXIT HELP.K: TYPES () MOVE T2,[-JTNLEN,,JTNAM] ;POINTER TO LIT PUSHJ P,HELP.0 ;CALL COMMON ROUTINE TYPES () MOVE T2,[-LEN.C,,TAB.C] ;POINTER TO LIST PUSHJ P,HELP.0 ;TYPE IT OUT JRST HELP.6 ;END IT HELP.0: MOVEI T4,7 ;ITEMS PER LINE HELP.1: MOVE T1,0(T2) ;GET A NAME PUSHJ P,SIXPNT ;PRINT IT SOJLE T4,[PUSHJ P,CRLF MOVEI T4,7 JRST HELP.2 ] ;OUTPUT CRLF AND GO TYPES(< >) ;ELSE PRINT TAB HELP.2: AOBJN T2,HELP.1 ;IF MORE TO DO PJRST CRLF ;WHEN ALL DONE, ENDE W/CRLF JRST HELP.6 HELP.5: HELPME HELP.6: TXO SW,T.FLG ;IN CASE WE ARE ASKED TXZ SW,F.TTY ;CLEAR FORCED TTY OUTPUT POPJ P, XSW: PUSHJ P,GETVAL ;GET VALUE OF SW JUMPG T1,GOTVAL ;HAVE A VALUE FOR IT? TXNN SW,SYSD!L.USRS!L.TTY!L.JOB!L.PPN!L.PROG ;SEEN A COMMAND? EXIT ;NO, SO JUST LEAVE MOVEI T1,1 ;FAKE AN X:1 GOTVAL: MOVEM T1,LOOKS ;SAVE NUMBER OF LOOKS POPJ P, ;GO BACK QSW: PUSHJ P,GETVAL JUMPLE T1,SAYSVS ;IF NEG OR ZERO MOVEM T1,QTUM ;STORE POPJ P, ;GO BACK ASW: PUSHJ P,GETVAL ;SEE IF VALUE THERE SKIPG T1 ;NO VALUE SPECIFIED? SETO T1, ;YES, MAKE IT SAVE ALWAYS (-1) MOVEM T1,AVAL ;AND STORE IT POPJ P, ;AND RETURN SSW: MOVX GT, %FTDEB ;DEBUG WORD OF FEATURE TABLE PUSHJ P,FETTAB ;LOOK IT UP TXNN GT,RGHBT.(F%RSP) ;KEEPING RESPONSE TIME? TXO SW,NO.RSP ;NO,REMEMBER THAT TXO SW,OPT.S ;TURN ON STATISTICS WATCHING POPJ P, HPQSW: MOVX GT,.GTPRV ;GET PRIV WORD HRL GT,MYJOB ;FOR THIS JOB PUSHJ P,FETTAB ; LDB GT,[POINTR(GT,JP.HPQ)] ;GET MAX HPQ MOVE T1,GT ; CAIN CHR,":" ;VALUE SUPPLIED? PUSHJ P,OCTIN ;YES, GET IT JUMPE GT,[$ERROR(EF.WRN,NHP,NO HPQ PRIVELEGES) POPJ P,] CAMLE T1,GT ;UNDER MAX? JRST [MOVE T1,GT $ERROR(EF.WRN!EF.OCT,HQV,HIGHEST HPQ YOU ARE PRIVELEGED FOR IS) JRST .+1] MOVEM T1,HPQREQ POPJ P, RSW: PUSHJ P,GETVAL ;GET VALUE OF RVAL CAIGE T1,2 ;MUST BE AT LEAST TWO JRST SAYSVS ;TELL ITS TOO SMALL MOVEM T1,RVAL ;STORE IT POPJ P, ;IT WAS, RETURN ESW: TXZ SW,NO.LIN!NO.PRF ;WIPE OUT OLD VALUE CAIE CHR,":" ;VALUE GIVEN? SKIPA T1,[SIXBIT/C/] ;NO, FAKE CONTINUATION PUSHJ P,TOKEN ; MOVE T2,[-6,,[ SIXBIT/NOPREF/ SIXBIT/NOFIRS/ SIXBIT/FIRST / SIXBIT/PREFIX/ SIXBIT/CONTIN/ SIXBIT/NOCONT/]] PUSHJ P,TABLUK ;LOOK IT UPT JRST [JUMPL T1,SAYASV JRST SAYUSV] XCT [ TXO SW,NO.PRF ;EXECUTE PROPER INSTRUCTION TXO SW,NO.LIN JFCL JFCL JFCL JFCL] (T1) TXO SW,T.FLG POPJ P, LISSW: MOVSI T1,'LPT' ; MOVEM T1,FILDEV ;CHANGE DEVICE TO LPT POPJ P, ;AND RETURN DISKSW: SETZM SDISK ;START WITH SYSTEM CAIE CHR,":" ;ARGUMENT SUPPLIED? SKIPA T1,[SIXBIT/SYS/] ;NO,SO PRETEND ARG IS "SYSTEM" PUSHJ P,TOKEN ;ELSE GET USER ARGUMENT LSH T1,-^D30 ;SHIFT OUT DRECK CAIN T1,'A' ;IS IT "ALL"? SOSA SDISK ;YES, FLAG SDISK WITH -1,MEANS ALL CAIN T1,'S' ;MAKE SURE ITS SYS POPJ P, ;IT IS,RETURN JRST SAYUSV ;UNKNOWN FORMSW: TXZ SW,MD.TRC ;SET TO FORMAT:TEXT CAIE CHR,":" ;ARG PROVIDED? SKIPA T1,[SIXBIT/TEXT/] ;NO,DEFAULT TO TEXT PUSHJ P,TOKEN ;GET TOKEN LSH T1,-^D24 ;MAKE SMALL,UNIQUE CAIN T1,'TE' ;TEXT? JRST [MOVX T1,.IOASC ;DEFAULT TEXT MODE MOVEM T1,FILMOD POPJ P,] CAIE T1,'TR' ;TRACE? JRST SAYUSV ;NO,NOT KNOWN IFE FTTRC,< $ERROR(EF.FAT!EF.RST,TNI,TRACING NOT INCLUDED IN THIS VERSION) >; END OF IFE FTTRC TXNN SW,SYSD ;DOING SYSTEM? JRST [$ERROR(EF.FAT!EF.RST,STI,SYSTEM DATA TRACING IMPLEMENTED ONLY)] TXO SW,MD.TRC ;TRACE MODE MARK MOVX T1,.IOIBN ;TRACE IO MODE MOVEM T1,FILMOD MOVX T1,DEXTT ;GET DEFAULT EXT FOR TRACE FILES MOVE T2,FILEXT ;GET GIVEN EXT CAXN T2,DEXT ;SET TO TEXT DEFAULT? MOVEM T1,FILEXT ;YES,CHANGE TO TRACE DEFAULT POPJ P, ;RETURN CSW: TXO SW,OPT.C ;MARK COMPARISON WANTED CAIE CHR,":" ;VALUE SPECIFIED? JRST [MOVX T1,%CHKCM ;NO,SO LOAD DEFAULT MOVEM T1,DEFCMP ;STORE IT POPJ P,] ;AND RETURN PUSHJ P,GETCHR ;GET NEXT CHARACTER CAIE CHR,"(" ;MIGHT BE OPEN PARENS TXO SW,REGET ;IF SO,EAT IT CSW1: PUSHJ P,TOKEN ;GET TOKEN CAMN T1,[SIXBIT /ALL/] ;WANT ALL? JRST [ MOVX T2,^-<1B1> ;TURN ON ALL BUT DAYTIME JRST CSW2] MOVE T2,[-JTNLEN,,JTNAM] ;LOOK IT UP PUSHJ P,TABLUK ; JRST [ JUMPE T1,SAYUSV JRST SAYASV] MOVX T2,<1B0> ;GET MARKER JUMPE T1,CSW2 ;SAVE TIME IF POS 0 MOVNS T1 ;MAKE IT NEGATIVE LSH T2,0(T1) ;AND POSITION BIT CSW2: IORM T2,DEFCMP ;MARK IT ON CAIN CHR,"," ;DELIMITED BY COMMA? JRST CSW1 ;YES,SO GO AGAIN CSW3: CAIN CHR,")" ;MIGHT BE CLOSE PARENS PUSHJ P,GETCHR ;IF IT IS,EAT IT POPJ P, ; RETURN ; MAKE UP A LIST OF THE FOUR LETTER ABBREVIATIONS, IN SIXBIT ; LEFT JUSTIFIED. THERE IS ONE FOR EACH JOB TRACKING FIELD ; DEFINE X(A,Y,C)< SIXBIT \A\> JTNAM: DATUMS JTNLEN==.-JTNAM INCLSW: SETZM EXCFLG ;NOT EXCLUDE SKIPA EXCLSW: SETOM EXCFLG ;EXCLUDE,MARK IT CAIE CHR,":" ;FOLLOWED BY ARGS? POPJ P, ;NO,RETURN PUSHJ P,GETCHR ;GET A CHARACTER CAIE CHR,"(" ;IF OPEN PARENS TXO SW,REGET ;EAT IT EXCL1: PUSHJ P,TOKEN ;GET ARGUMENT CAMN T1,[SIXBIT /ALL/] ;IS IT ALL? JRST EXCALL ;YES,GO HANDLE IT MOVE T2,[-LEN.C,,TAB.C] ;PREPARE TO LOOK IT UP PUSHJ P,TABLUK ;DO SO JRST [JUMPE T1,SAYUSV JRST SAYASV] ;IF NOT FOUND,AMBIGUOUS MOVE T2,EXCFLG ;PICK UP FLAG MOVEM T2,TAB.P(T1) ;AND MARK ITEM AS SUCH EXCL2: CAIN CHR,"," ;ANOTHER ARG FOLLOWS? JRST EXCL1 ;YES JRST CSW3 ;NO EXCALL: ;HANDLE ALL MOVE T1,EXCFLG ;GET FLAG MOVEM T1,TAB.P ;STORE IN FIRST WORD MOVE T1,[TAB.P,,TAB.P+1] ;BLT POINTER BLT T1,TAB.P+LEN.P-1 ;STORE ACROSS WHOLE ARRAY JRST EXCL2 ;REJOIN COMMON CODE ;here on /meter to flag all cpus meter boards as possiblities mtrsw: setom mbord0 setom mbord1 setom mbord2 setom mbord3 setom mbord4 setom mbord5 popj p, ;here on /nometer to flag all cpus meter boards as non-possiblities nmtrsw: setzm mbord0 setzm mbord1 setzm mbord2 setzm mbord3 setzm mbord4 setzm mbord5 popj p, SUBTTL SWITCH ERRORS AND ROUTINES SAYUSV: MOVE T1,LASSW ;PICK UP SWITCH NANE $ERROR(EF.FAT!EF.CON!EF.SIX,USV,UNKNOWN VALUE FOR SWITCH ) TYPES (<: >) MOVEI STR,LASTOK ;POINT TO VALUE GIVEN PUSHJ P,PUTSTR X$$USV: X$$ASV: X$$SVS: PUSHJ P,CRLF JRST RESTRT SAYASV: MOVE T1,LASSW ;PICK UP NAME $ERROR(EF.FAT!EF.CON!EF.SIX,ASV,AMBIGUOUS VALUE FOR SWITCH ) SVL.1: TYPES (<: >) POP P,T1 PUSHJ P,OCTOUT JRST X$$USV SAYSVS: PUSH P,T1 MOVE T1,LASSW ;GET SWITCH NAME $ERROR(EF.FAT!EF.CON!EF.SIX,SVS,VALUE TO SMALL FOR SWITCH ) JRST SVL.1 GETVAL: SETZM T1 ;START WITH NO VALUE TXNN SW,BRK ;BREAK NEXT CAIN CHR,"/" ;OR ALREADY TO NEXT SWITCH? POPJ P, ;YES, SO NO VALUE GIVEN CAIN CHR,":" ;IF WE SEE COLON PUSHJ P,DECIN ;GET VALUE POPJ P, ;AND RETURN SUBTTL COMPARE ROUTINE SKIPS IF DIFFERENCE IN OLDAT VS CURDAT COMPR: SKIPE C.FST ;IF FIRST TIME JRST CPOPJ1 ;THEN PRETEND THERES A DIFFERENCE MOVEI T1,OLDAT(J) ;PICK UP PTR TO OLD MOVSI N1,-SIZDAT ;AOBJN PTR TO DATA AREAS SKIPA N3,DEFCMP ;GET COMPARE/NO COMPARE WORD CMLOOP: LSH N3,1 ;SHIFT RIGHT BIT INTO SIGN POSITION JUMPGE N3,BLOOP ;IF COMP BIT OFF, TRY NEXT MOVE N2,CURDAT(N1) ;CURRENT DATA CAME N2,(T1) ;SAME AS OLD? JRST CPOPJ1 ;NO,TAKE SKIP RETURN BLOOP: AOS T1 ;UPDATE OLD POINTER AOBJN N1,CMLOOP ;MORE TO DO? POPJ P, ;RETURN TO MAIN LOOP SUBTTL ROUTINE TO GIVE PROLOGUE TO USERS REPORT USRPRO: TXNN SW,L.USRS ;REAL "USERS" COMMAND? PJRST CRLF ;NO, JUST GIVE BLANK LINE MOVEI CHR,14 ;SEPARATE PUSHJ P,PUTCHR TYPES () MSTIME T1, ;USE TIME NOW PUSHJ P,PUTDAY ;TELL DAYTIME PUSHJ P,TAB MOVX GT,%CNLNM ;SEE HOW MANY JOBS LOGGED IN PUSHJ P,FETTAB MOVE T1,GT PUSHJ P,DECOUT TYPES (< JOBS LOGGED IN OUT OF >) MOVX GT,%CNLMX ;TELL MAX PUSHJ P,FETTAB ; MOVE T1,GT PUSHJ P,DECOUT ; TYPES (< MAXIMUM (LOGMAX) >) POPJ P, ;RETURN SUBTTL ROUTINE TO PRINT OUT THE DATA IN BLOCK "CURDAT" PRNT: TXNE SW,L.USRS ;SKIP CHECK FOR DIFF IF ALL USERS JRST PUTALL TXNN SW,OPT.U ;[5]NOT WANT USER NAME AND PPN JRST PUTD1 ;IF SW NOT SET MOVE T1,C.PPN ;CHECK FOR DIFFERENCE MOVE T2,C.NAM1 ;IN PPN OR NAME, IF NON, SKIP CAMN T1,O.PPN(J) CAME T2,O.NAM1(J) PUTALL: PUSHJ P,PUTU ;[5]ELSE PUT USER NAME,PPN PUTD1: SETZB FP,CHRCNT ;CLEAR COUNTERS TXNE SW,L.USRS!L.PPN!L.PROG ;SKIP TIME STAMP IF MULITIPLE USERS AOJA FP,PUTD1A ;AND FIX UP FIELD POINTER MOVE T1,C.DAY ;CURRENT TIME TXNE SW,OPT.I ;DOING INCREMENTAL SUB T1,O.DAY(J) ;SUBTRACT PUSHJ P,PUTDAY ;OUTPUT DAYTIME PUSHJ P,POSIT ;CHARACTER POSITION PUTD1A: TYPEC (J) ;JOB NUMBER MOVE T1,C.JOB ;GET # PUSHJ P,DECOUT ;OUTPUT PUSHJ P,POSIT ;CORRECT POSITION SKIPGE C.TTY ;IF TTY <0 THEN DETACHED JRST DETACH TYPES () ;START IT MOVE T1,C.TTY ;PRINT IT PUSHJ P,OCTOUT ;DONE JRST TCONT DETACH: SKIPN C.JOB ;IF WATCHING NULL JOB SKIPA STR,[[ASCIZ/[NULL /]] ;SAY SO MOVEI STR,[ASCIZ/DET/] ;THATS IT PUSHJ P,PUTSTR TCONT: PUSHJ P,POSIT ;CORRECT POSITION SKIPN C.JOB ;IF NULL JOB SKIPA T1,[SIXBIT/JOB]/] ;SAY SO MOVE T1,C.PROG ;OUTPUT PROGRAM NAME PUSHJ P,SIXPNB PUSHJ P,POSIT ;CORRECT POSITION MOVE T1,C.STAT ;GET STATUS PUSHJ P,SIXPNT ;FININSHED THAT UP PUSHJ P,POSIT ;TAKE CARE OF INCORE/SW MOVEI T1,'SW' ;SET UP FOR SWAPPED SKIPLE C.NSWP ;SEE IF VIRTUAL MOVEI T1,'V ' ; SKIPL C.NSWP ;BUT IF IN CORE DONT PUSHJ P,SIXPNT ;PRINT ANYTHING PUSHJ P,POSIT MOVE T1,C.LOW ;GET LOW CORE ASSIGNMENT PUSHJ P,DECOUT ;ALWAYS PRINT SKIPGE C.HIGH ;-1 HICOR IS SPY JRST SPYER ;SO SAY SO SKIPN C.HIGH ;MAYBE NO HI-SEG JRST ORUN ;THER ISNT TYPEC (+) ;THERE IS MOVE T1,C.HIGH ;PRINT IT PUSHJ P,DECOUT JRST ORUN ;AND GO DO MORE SPYER: TYPES (<+SPY>) ;FLAG MONITOR AS HI-SEG ORUN: TXNE SW,L.USRS ;DOING ALL USERS? JRST DONEO ;YES,SO WE ARE DONE PUSHJ P,POSIT ;CORRECT CURSOR POSITION MOVSI N1,-3 ;SET UP FOR RT,RD,WR SETUP MOVEI N3,O.RT(J) ;SET UP SOURCE ORUNL: MOVE N2,C.RT(N1) ;GET A WORD TXNE SW,OPT.I ;IF /I THEN SUB OLD SUB N2,(N3) ;DONE MOVEM N2,OUTRUN(N1) ;PUT IT AWAY AOJ N3, AOBJN N1,ORUNL ;IF MORE TO DO MOVE T1,OUTRUN ;GET RT TXNE SW,L.PPN!L.PROG ;DOING MORE THAN ONE JOB? SKIPA N1,[EXP MSOUTJ] ;YES, ALIGN OUTPUT MOVEI N1,MSOUT ;ELSE DONT BOTHER PUSHJ P,0(N1) ;CALL APPROPRIATE ROUTINE PUSHJ P,POSIT TYPES () ;DSK RDS MOVE T1,OUTRD ;GET # READS AS ADJUSTED PUSHJ P,DECOUT ;AND PRINT PUSHJ P,POSIT ;POSITION TYPES () ; MOVE T1,OUTWR ;GET NUMBER OF WRITES PUSHJ P,DECOUT ;PRINT DONEO: TXNE SW,OPT.S ;WANT STATISTICS PUSHJ P,PUTSTC ;YES TXNN SW,OPT.P ;[11]DONT WANT PRIVELEGES JRST RFINP ;SO GO HOME SKIPGE C.FST ;DO ON FIRST TIME JRST PUTAL1 MOVE T1,C.GOD ;CHECK FOR A CHANGE MOVE T2,C.PRV ;IN EITHER WORD CAMN T1,O.GOD(J) CAME T2,O.PRV(J) PUTAL1: PUSHJ P,PUTPRV ;[11]ELSE PRINT RFINP: PUSHJ P,CRLF ;[14]REALLY FINISHED WITH PRINTING TXNE SW,OPT.S ;IF DOING STATISTICS GIVE XTRA PUSHJ P,CRLF ;CR-LF PAIR POPJ P, ;END OF ROUTINE SUBTTL ROUTINE TO GET STATE OF JOB GETSTA: HRLZ GT,C.JOB ;GET JOB NUMBER HRRI GT,.GTSTS ;GET STATUS WORD PUSHJ P,FETTAB MOVE T1,GT ;GET RESULT LDB N1,[POINT 5,T1,14] ;GET Q # IDIVI N1,3 ;NAMES PACKED 3 TO A WORD MOVX GT,.GTWSN ;GET NAME HRL GT,N1 PUSHJ P,FETTAB ;DO GETTAB MOVE N3,GT MOVE N1,[POINT 12,N3,11] ;PICK OUT TWO CHARS JUMPE N2,.+3 IBP N1 SOJG N2,.-1 ;MORE INCREMENTING? LDB N2,N1 ;NO, GET BYTE MOVEI N1,'^W' ;COMMAND WAIT TLNE T1,400000 ;TRY IT MOVEI N1,'CW' TLNE T1,CMWB JRST GOTSIT ;WE HAVE IT MOVEI N1,'OW' ;OPERATOR WAIT TRNE T1,JDCON ;MAYBE JRST GOTSIT ;YES MOVEI N1,'^D' ;DEAMON WAIT TRNE T1,JDC ;POSSIBLY JRST GOTSIT ;YES MOVEI N1,'^C' ;IN MONITOR MODE JUMPGE T1,GOTSIT ;SIGN BIT ON? MOVEI N1,'SL' ;JOB SLEEPING? CAIE N2,'SL' ;IF IN THAT Q JRST TIWAIT ;COULD BE TTY INPUT TRNN T1,CLKR ;GOT A CLOCK REQUEST? MOVEI N1,'HB' ;NO, HIBERNATING JRST GOTSIT TIWAIT: CAIE N2,'TI' ;COULD BE TI JRST ISIT ;YUP MOVEI N1,'TI' ;SET IT UP MOVN N3,C.JOB ;MAKE NEG JOB # JOBSTS N3, ;GET JOB STATUS JFCL TXNE N3,JB.UOA ;IF OUTPUT AVAILABLE MOVEI N1,'TO' ;THEN MUST BE TO STATE SKIPA ISIT: MOVE N1,N2 ;A CORRECTED STATE GOTSIT: MOVEM N1,C.STAT ;STORE IN CURDAT POPJ P, ;AND GO HOME SUBTTL ROUTINE TO GET THE HI AND LO CORE USED BY A JOB GETCOR: SETOM C.NSWP ;MARK AS IN CORE MOVE N1,C.JOB ;GET CURRENT JOB SETOM C.HIGH ;MARK AS DOING LOW SEGMENT PUSHJ P,GETSIZ ;GET SIZE OF LOW-SEG MOVEM GT,C.LOW ;STORE IT ;** THIS CODE FOR FLAGGING VIRTUAL JOBS LIES, SO REMOVE IT FOR NOW ; MOVS GT,C.JOB ;GET JOB INTO LH ; HRRI GT,.GTVRT ;LOOK UP VIRTUAL STATS FOR JOB ; TXNE SW,FT.VM ;SKIP LOOKING IF NON-VM SYSTEM ; PUSHJ P,FETOPT ;MAY NOT BE VM SYSTEM ; SETZ GT, ;IF NOT VM, FORCE NON-VIRTUAL ; TLNE GT,-1 ;SEE IF FAULT INTERVAL SET ; HRRZS C.NSWP ;IF FAULT INTERVAL, SET AS "V" IFN SYS,< SETZM HISEGN ; > SETZM C.HIGH MOVX GT,.GTSGN ;LOOKUP HI-SEG NUMBER HRLI GT,(N1) ;OF THIS JOB PUSHJ P,FETTAB ; JUMPE GT,CPOPJ ;IF NONE, WE ARE DONE JUMPL GT,[SETOM C.HIGH ;SPY SEGEMENT, MARK AS C.HIGH= -1 POPJ P,] ;AND RETURN MOVE N1,GT ;MAKE HI-SEG BE OUR GOAL IFN SYS,< HRRZM N1,HISEGN ;FOR SYSTEM STASH HI-SEG NUMBER > PUSHJ P,GETSIZ ;GET SIZE OF SEGMENT MOVEM GT,C.HIGH ;STORE SIZE TXNE SW,FT.VM ;IS THIS A VM SYSTEM? TXNE N1,SHRSEG ;WAS THIS A SHAREABLE HI-SEG? POPJ P, ;NO TO ONE OF THEM, WE ARE DONE SUBM GT,C.LOW ;VM AND NON-SHAREABLE HI SEG MOVNS C.LOW ;MEANS UPDATED LOWSEG SIZE POPJ P, ;WE ARE DONE GETSIZ: TXNN SW,FT.VM ;IS ITHIS A VM SYSTEM? JRST GTSIZ7 ;NO, USE OLD METHOD MOVSI GT,(N1) ;LOOK UP IN SWAPPING TABLE HRRI GT,.GTSWP ;FROM MONITOR PUSHJ P,FETTAB ; SKIPE C.HIGH ;IF THIS IS NOT HIGH SEGMENT JRST GTSIZ6 ;THEN RETURN LAST 9 BITS TXNE N1,SHRSEG ;IS THIS SEGMENT SHAREABLE? JRST GTSIZ7 ;YES, SHAREABLE HI-SEG IS DONE OLD WAY MOVSS GT ;IT IS NON-SHAREABLE, SO JRST GTSIZ6 ;USE 9 BIT FIELD GTSIZ7: MOVX GT,.GTSTS ;LOOK UP THE JOBS STATUS HRLI GT,0(N1) ;FROM MONITOR TABLE PUSHJ P,FETTAB ; MOVE N2,GT ;REMEMBER IT MOVX GT,.GTADR ;USE IN CORE SIZE HRLI GT,0(N1) ; PUSHJ P,FETTAB ; MOVSS GT ;GET RID OF RELOCATION JUMPE GT,GTSIZ1 ;NOT IN CORE IF 0 HERE SKIPE C.HIGH ;IF HIGH SEGMENT TXNN N2,SWP ;IF SWAPPED OUT JRST GTSIZ2 ;JUMP FOR HI-SEG OR IN-CORE LOWSEG GTSIZ1: PUSHJ P,SEGSWP ;FETCH SWAPPING DATA TRNE GT,377 ;SEE IF OUT YET JRST GTSIZ3 ; USE IN CORE SIZE MOVX GT,.GTADR ;USE IN CORE SIZE HRLI GT,0(N1) PUSHJ P,FETTAB MOVSS GT GTSIZ2: TXNE SW,KI.10 ;IS THIS A KI OR KL? JRST GTSIZ5 ;YES ADDI GT,1777 ;ROUND UP ASH GT,-^D10 ;DIVIDE TO K GTSIZ3: ANDI GT,377 ;MASK TO 256 K POPJ P, ;RETURN GTSIZ5: ADDI GT,777 ;ROUND UP TO P BOUNDARY LSH GT,-^D9 ; GTSIZ6: ANDI GT,777 ;MASK TO 512P POPJ P, ;RETURN ; ROUTINE TO CONVERT CONTENTS OF N2 TO K OR P KIKA: ADDI N2,777 ;ROUND TO PAGE BOUND TXNN SW,KI.10 ;IF KA, ROUND TO K ADDI N2,1000 ; LSH N2,-11 ;MAKE PAGES TXNN SW,KI.10 ;AND IF KA, MAKE TO K LSH N2,-1 ;DONE POPJ P, SEGSWP: SETZM C.NSWP ;MARK AS SWAPPED MOVSI GT,(N1) ;PICK UP SEGMENT NUMBER HRRI GT,.GTSWP ;SWAPPING STAT. TABLE PJRST FETTAB ;GET IT AND RETURN SUBTTL ROUTINE TO GET PROGRAM NAME GETNAM: MOVE N1,C.JOB ;GET JOB NUMBER ;ALT ENTRY POINT FOR PPN,MYPPN LOOP GETP2: MOVX GT,.GTPRG ;TABLE OF NAMES HRL GT,N1 ;SETUP PUSHJ P,FETTAB ;AND GET MOVEM GT,C.PROG ;STORE POPJ P, ;AND RETURN SUBTTL ROUTINE TO GET RUNTIME IN MS GETRUN: HRLZ GT,C.JOB ;GET JOB NUMBER HRRI GT,.GTTIM ;GET THE RUN TIME USED PUSHJ P,FETTAB ;LOOK IT UP MOVE T1,GT ;GET RESULT IMULI T1,^D100 ;CONVERT TICS TO MS IDIVI T1,6 ;FOR LATER USE MOVEM T1,C.RT ;STORE IT POPJ P, ;AND GO BACK SUBTTL ROUTINE TO PICK UP STATISTICS FOR A JOB (/S STUFF) GETSTC: MOVE N1,C.JOB ;GET JOB NUMBER MOVX GT,.GTKCT ;PICK UP KCT HRLI GT,(N1) ;PICK UP JOB # PUSHJ P,FETTAB ;GETTAB MOVEM GT,C.KCT ;STORE RESULT MOVSI GT,(N1) ;JOB # HRRI GT,.GTLIM ;TIME LIMIT PUSHJ P,FETTAB MOVEM GT,C.TLM POPJ P, SUBTTL ROUTINE TO GET JACCT BIT AND PRIVELEGE WORD OF JOB GETPRV: SETZM C.GOD ;TURN OFF HES GOT JACCT MOVN T1,C.JOB ;GET JOB NUMBER JOBSTS T1, ;DO A JOB STATUS UUO JFCL ;DONT REALLY CARE TXNE T1,JB.UJC ;IS JACCT ON? SETOM C.GOD ;YES, FLIP SWITCH MOVS GT,T1 ;FLIP FOR GETTAB HRRI GT,.GTPRV ;SET FOR PRIV. GETTAB PUSHJ P,FETTAB ;DO IT MOVEM GT,C.PRV ;STORE POPJ P, ;GO HOME SUBTTL ROUTINE TO GET DSK IO STUFF GETDSK: MOVX GT,.GTRCT ;GET DSK READS HRL GT,C.JOB ;GET JOB # PUSHJ P,FETTAB LDB N1,DBP ;GET THE POINTER MOVEM N1,C.RD ;STORED MOVX GT,.GTWCT ;SAME FOR WRITES HRL GT,C.JOB ; PUSHJ P,FETTAB LDB N1,DBP ; MOVEM N1,C.WR ;STORED POPJ P, ;AND GO HOME DBP: POINT 23,GT,35 ;DISK BYTE POINTER SUBTTL ROUTINE TO GET USER NAME AND PPN GETU: MOVS GT,C.JOB ;GET USER NAME HRRI GT,.GTNM1 ;FIRST HALF PUSHJ P,FETTAB MOVEM GT,C.NAM1 ;STORE FIRST HALF MOVS GT,C.JOB ;DO AGAIN FOR SECOND HALF HRRI GT,.GTNM2 ; PUSHJ P,FETTAB ;SECOND HALF,USERNAME MOVEM GT,C.NAM2 ;STASH SECOND HALF MOVS GT,C.JOB ;GET JOB NUMBER HRRI GT,.GTPPN ;PPN TABLE PUSHJ P,FETTAB ;LOOK IT UP MOVEM GT,C.PPN ;STORE PPN POPJ P, ;AND RETURN SUBTTL OUTPUT ROUTINE PUTS OUT "USER:" USER-NAME, PPN PUTU: TXNE SW,L.USRS ;NO TAB FOR USERS JRST PUTU1 ;OR LABEL TYPES (< USER:>) ;GIVE "TAB USER" PUTU1: MOVE T1,C.NAM1 ;GET USER NAME PUSHJ P,SIXPNB ;OUTPUT IT (WITH BLANKS) MOVE T1,C.NAM2 ;SECOND HALF OF NAME PUSHJ P,SIXPNB ;OUTPUT MOVEI STR,[ASCIZ/ /];TWO TABS TXNE SW,L.USRS ;UNLESS USERS, THEN ONLY ONE MOVEI STR,[ASCIZ/ /] ;SPACE OR SO PUSHJ P,PUTSTR MOVE T1,C.PPN ;GET PPN SETZ CHRCNT, ;CLEAR CHARACTER COUNTER MOVEI STR,[ASCIZ/PPN:/] ;PREPARE FOR PPN TXNN SW,L.USRS ;SHORT FOR USERS PUSHJ P,PUTSTR ;AND OUTPUT 'PPN:[' MOVEI CHR,"[" ;BRACKET OPENS TXNN SW,L.USRS ;EXCEPT FOR USERS PUSHJ P,PUTCHR PUSH P,T1 ;SAVE HLRZS T1 ;MAKE PROJ BE IN R. HALF PUSHJ P,OCTOUT ;OUTPUT IT TYPEC (<,>) ;OUTPUT A COMMA POP P,T1 ;RESTORE ANDI T1,-1 ;AND MAKE IT CORRECT PUSHJ P,OCTOUT ;OUTPUT IT TXNE SW,L.USRS ;DOING USERS? IF YES THEN JRST FPPNU ;FINISH PPN ALA USERS TYPEC (]) ;RIGHT BRACKET PJRST CRLF ;GIVE CRLF, WILL RETURN FROM THERE FPPNU: CAIGE CHRCNT,^D11 ;NO TAB IF GONE TOO FAR PJRST TAB ;TAB FOR USERS POPJ P, ;OR MAYBE JUST RETURN SUBTTL ROUTINE TO PRINT OUT THE PRIVELEGES FOR A JOB PUTPRV: PUSHJ P,CRLF ;PUT OUT A CR-LF SETOM CHRCNT ;USED FOR OUTPUT CHECK MOVEI STR,[ASCIZ/JACCT /] ;SET FOR JACCT SKIPE C.GOD ;WAS JACCT ON? PUSHJ P,PUTSTR ;IT IS SO SAY SO MOVE T1,C.PRV ;PICK UP PRIVS TXNE T1,JP.HPQ ;SEE IF HPQ > 0 PUSHJ P,Y.HPQ ;YES, SO GIVE HPQXX TXNE T1,JP.DPR ;SEE IF DISK PRIORITY PUSHJ P,Y.DPR ;YES , SO GIVE DSKQX MOVEI STR,[ASCIZ/MTR /] ;READY FOR METER TXNE T1,JP.MET ;IS METER LIT? PUSHJ P,PUTSTR ;YES MOVEI STR,[ASCIZ/POK /] ;IS POKE LIT? TXNE T1,JP.POK ; PUSHJ P,PUTSTR ;YES MOVEI STR,[ASCIZ/CPU /] ;IS CPU CHANGE LIT? TXNE T1,JP.CCC ; PUSHJ P,PUTSTR ;YES IT IS MOVEI STR,[ASCIZ/UNSPL /] ;READY FOR UNSPOOL TXNE T1,JP.NSP ;TEST THE BIT PUSHJ P,PUTSTR ;IF ON MOVEI STR,[ASCIZ/RTTRP /] ;SEE IF REAL TIME TXNE T1,JP.RTT ;ETC PUSHJ P,PUTSTR MOVEI STR,[ASCIZ/LCK /] ;CHECK FOR LOCK ON TXNE T1,JP.LCK ;TEST IT PUSHJ P,PUTSTR ;AND PUT IT MOVEI STR,[ASCIZ/TRPST /] ;TRAP SET UUO ENABLED? TXNE T1,JP.TRP ;SET? PUSHJ P,PUTSTR ;YES, SO PRINT IT MOVEI STR,[ASCIZ/IPCF /] ;IPCF PRIVELEGED FUNCTIONS TXNE T1,JP.IPC ;ARE THEY ON? PUSHJ P,PUTSTR ;YES MOVEI STR,[ASCIZ/ENQ /] ;ENQUE TXNE T1,JP.ENQ ;SEE IF THEY HAVE IT PUSHJ P,PUTSTR ;IF THEY DO,SAY SO MOVEI STR,[ASCIZ/PEEK-ALL /] ;CAN PEEK ON ALL OF CORE TXNE T1,JP.SPA ;WE SHALL SEE PUSHJ P,PUTSTR MOVEI STR,[ASCIZ/PEEK-MONITOR /] ;WHAT ABOUT ON MONITOR TXNN T1,JP.SPA ;DONT SAY MON IF SAID ALL TXNN T1,JP.SPM ;TEST CAIA ;SKIP OVER PUSHJ P,PUTSTR ;AND MAYBE PRINT MOVEI STR,[ASCIZ/*UNPRIVELEGED*/] SKIPGE CHRCNT ;HAVE WE SAID ANYTHING? PUSHJ P,PUTSTR ;NO,NOW DO SO PJRST CRLF ;AND GIVE CR-LF AND RETURN Y.HPQ: PUSH P,T1 ;SAVE T1 TYPES () ;SAY "HPQ" LDB T1,[POINTR( T1,JP.HPQ)] ;GET Q NUMBER PUSHJ P,OCTOUT ;AND PRINT PJRST DUNQUE ;AND RESTORE, RETURN Y.DPR: PUSH P,T1 ;SAVE T1 TYPES () LDB T1,[POINTR (T1,JP.DPR)] ;GET Q PUSHJ P,OCTOUT ;AND PRINT IT DUNQUE: TYPEC ( ) ;PRINT A BLANK PJRST TPOPJ ;RESTORE T1 AND RETURN SUBTTL ROUTINE TO OUTPUT KCS,RT/ET,RT/TRQ,TIME LIMIT ; ; EXPECTS TO FIND CURRENT DATA AREA LOADED PUTSTC: PUSHJ P,CRLF ;GIVE LEADING CRLF SETZ CHRCNT, ;FIX CURSOR AND CHAR COUNT MOVEI FP,P.KCT-SPATAB ;POSITION IN SPATAB TYPES () ;LABEL MOVE T1,C.KCT ;PICK UP KILO-CORE-TICKS IDIVI T1,^D60 ;60 TIC/SEC PUSHJ P,DECOUT ;AND PRINT IT PUSHJ P,POSIT ;CORRECT CURSOR POSITION SKIPE C.FST ;DONT DO IT THE FIRST TIME JRST NOET ;CAUSE YOU GET GARBAGE MOVEI STR,[ASCIZ!RT/ET:!] ;RUNTIME/ELAPSED TIME MOVE T1,C.RT ;PICK UP RUNTIME SUB T1,O.RT(J) ;MAKE INCREMENTAL MOVEM T1,ARGS ;STORE IT IN ARG BLOCK MOVE T1,C.DAY ;PICK UP DAYTIME SUB T1,O.DAY(J) ;MAKE INCREMENTAL JUMPGE T1,.+2 ;ADJUST IF WENT AROUND CLOCK ADDX T1,^D1000*^D60*^D60*^D24 MOVEM T1,ARGS+1 ;STASH IT PUSHJ P,PUTMES ;OUTPUT THE STUFF PUSHJ P,POSIT NOET: ;SKIPPED OVER ABOVE, THE FIRST TIME LDB T1,[POINTR(C.TLM,JB.LTM)] ;PICK IT UP IMULI T1,^D1000 ;CONVERT TO MS IDIVI T1,^D60 JUMPE T1,CPOPJ ;IF ZERO TLM , SKIP THE PRINT TYPES () ;LABEL PJRST MSOUT ;OUTPUT T1 AS MILLISECONDS SUBTTL ROUTINE TO DO GETTABS OR SPYS DEPENDING ON PRIV. ; ROUTINE HAS TWO ENTRY POINTS: ; FETOPT: DOING GETTAB ON AN OPTIONAL TABLE, TAKE SKIP RETURN ; IF GOOD LOOKUP, NON-SKIP IF GETTAB FAILS ; FETTAB: TABLE BEING LOOKED AT IS NON-OPTIONAL, IF THE ; GETTAB OR GETTAB SIMULATION FAIL THEN GO TO GFAIL ; WHICH IS A FATAL ERROR. (USER MAY "CONTINUE") ; THE ONLY RETURN IS A NON-SKIP RETURN FETOPT: TXOA SW,GT.OPT ;MARK AS OPTIONAL FETTAB: TXZ SW,GT.OPT ;NON-OPTIONAL MOVEM GT,SAVGT ;SAVE FOR EXAMINATION IF WE GET A FAILURE TXNE SW,Y.SPY ;CAN WE SPY? JRST USPY ;YES, GO DO IT UGET: GETTAB GT, ;NO, DO A GETTAB PJRST GFAIL ;IF A FAILURE TXNE SW,GT.OPT ;IF DOING OPTIONAL TABLE THEN AOS (P) ;SKIP FOR GOOD RETURN POPJ P, USPY: HRRE T3 ,GT ;T3 GETS TABLE NUMBER HLRZ T4 ,GT ;AND T4 THE ITEM NUMBER CAMLE T3 ,MAXGTB ;UNDER THE LIMIT? PJRST GFAIL ;NO, GIVE ERROR RETURN ADD T3 ,TABTAB ;GET ADDR OF ADDR OF TABLE MOVE T3 ,400000(T3 ) ;AND FETCH ADDR OF WANTED TABLE LDB GT,[POINT 9,T3 ,8] ;GET MAX LENGTH CAMLE T4 ,GT ;THIS ITEM # <= MAX? JRST UZERO ;NO, RETURN ZERO RESULT TLNE T3 ,400 ;IF ITS PROCESS DATA JRST UPROC ;USE PROCESS TABLES SPYBCK: ADDI T3 ,(T4 ) ;NOW T3 HAS ADDR OF EXACT ITEM MOVEM T3 ,SAVADR ; SAVE ADDRESS OF EXEC LOC THIS ITEM SKIPA UZERO: TDZA GT,GT ;FOR RETURNING ZERO RESULT MOVE GT,400000(T3 ) ;PICK UP ITEM TXNE SW,GT.OPT ;IF OPTIONAL TABLE, GOOD LOOKUP GETS CPOPJ1: AOS (P) ;SKIP RETURN CPOPJ: POPJ P, ;AND RETURN UPROC: MOVE GT,SAVGT ;RESTORE GT INCASE GETTAB SKIPN PDBPTR ;HAVE PTR TO PROCESS DATA? JRST UGET ;NO,USE GETTAB ADD T4 ,PDBPTR ;T4 GETS ADDRESS OF ADDRESS OF PDB SKIPN T4 ,(T4 ) ;IF NOT ZERO JRST UZERO ;UNLESS THERE IS NO PDB JRST SPYBCK ;AND GO BACK TO SPY ; ROUTINE TO RETURN A VALUE IN THE MONITOR WITHOUT GOING THRU GETTAB/SPY ; EXPECTS EXEC ADDRESS IN GT, RETURNS VALUE IN GT ; RETURNS ZERO IF CANT DO A SPY OR PEEK MONVAL: IFE PURESW,< TXNE SW,Y.SPY ;CAN HE SPY? SKIPA GT,400000(GT) ;YES, SO DO SO > PEEK GT, ;PEEK HAS NO ERROR RETURN POPJ P, ;NOW GO HOME SUBTTL ROUTINE TO SET UP THE GETTAB SIMULATOR IFE PURESW,< SETTAB: MOVX GT, %CNSIZ ;LOOKUP SIZE OF MONITOR PUSHJ P,FETTAB SOJ GT, ;BACK OFF BY 1 SPY GT, ;TRY TO SPY JRST XSPY ;CANT, NO PRIV, ETC MOVE GT,[XWD .GTSLF,.GTSLF] ;[63]GET ADDRESS OF SELF TABLE PUSHJ P,FETOPT ;THIS IS NON FATAL IF NOT FOUND JRST XSPY ;AND ITS NOT JUMPE GT,XSPY ;IF NO IMMEDIATE TABLE,DONT SPY HRRZM GT,TABTAB ;STORE IT LDB N2,[POINT 9,GT,8] ;GET MAX SIZE MOVEM N2,MAXGTB ;STASH THAT TOO MOVX GT, %CNPDB ;GET PROCESS DATA BLOCK ADDRESS PUSHJ P,FETTAB ;STORING FOR LATER STUFF TRO GT,400000 ;MAKE A SPY POINTER MOVEM GT,PDBPTR ;AND STASH IT TXO SW,Y.SPY ;FINALLY,TURN SPYING ON XSPY: POPJ P, ;RETURN > ;END OF CONDITIONAL SUBTTL ROUTINE TO ASSIGN CORE WHEN NEEDED FOR TABLE SPACE ; ;ROUTINE ASSCOR : EXPECTS T1 TO CONTAIN NUMBER OF WORDS WANTED, ; ON RETURN T1 CONTAINS ADDRESS OF START OF GIVEN BLOCK ASSCOR: EXCH T1,.JBFF ;T1 CONTAINED WORDS WANTED ADDM T1,.JBFF ;.JBFF NOW UPDATED PUSH P,T1 ;SAVE T1 WHILE WE CLEAR OR GET CORE MOVE T1,.JBFF ;DID WE GO OVER? TLNE T1,-1 ;MAKE SURE ITS REASONABLE JRST NOCORE ;IE <= 2**18. SOS T1 ;LAST WORD USED IS FIRST FREE-1 CAMG T1,.JBREL ;COMPARE TO .JBREL JRST CLRCOR ;NO, SO JUST CLEAR CORE GIVEN CORE T1, ;AND REQUEST CORE JRST NOCORE ;COULDNT GET IT CLRCOR: MOVE T1,(P) ;GET START SETZM 0(T1) ; AOS T1 ; HRLI T1,-1(T1) ; BLT T1,@.JBREL ;CLEAR CORE TPOPJ: POP P,T1 ;RESTORE T1 POPJ P, ;AND RETURN NOCORE: MOVE T1,.JBFF## MOVEI T1,-1(T1) $ERROR(EF.FAT!EF.MEM!EF.RST,CEF,CORE EXPANSION FAILED WHEN TRYING TO GET ) SUBTTL ROUTINE TO REDUCE SIZE BACK TO ORIGINAL REDUCE: PUSH P,T1 ;SAVE T1 MOVE T1,SAVFF ;GET ORIGINAL SIZE MOVEM T1,.JBFF## ;RESTORE IT SUBI T1,1 ;BACK OFF ONE FOR LAST USED CORE T1, ;AND MAKE OURSELVES THE RIGHT SIZE JFCL ;DONT CARE JRST TPOPJ ;RETURN TO CALLER SUBTTL ROUTINE TO GET THE TTY # ATTACHED TO JOB GETTY: TXNE SW,SYSD ;DOING THE SYSTEM? MOVEI T1,(J) ;YES, SO J HAS JOB NUMBER SKIPN N1,T1 ;GET JOB JRST YDET ;MARK NULL JOB AS DETACHED TRMNO. N1, ;UUO JRST DET ;MAY BE DETACHED SUBI N1,.UXTRM ;SUBTRACT IO INDEX MOVEM N1,C.TTY ;STORE JRST CPOPJ1 ;TAKE A SKIP RETURN DET: MOVN N1,T1 ;SETUP FOR JOB STATUS JOBSTS N1, JRST NOJOB ;NO JOB THIS NUMBER JUMPL N1,YDET ;DETACHED NOJOB: POPJ P, YDET: SETOM C.TTY ;-1 TTY # MEANS DETACHED JRST CPOPJ1 ;RETURN VIA SKIP SUBTTL ROUTINE TO GET JOB ATTACHED TO A TTY GETJOB: MOVE N1,T1 ;GET LINE # MOVEI T2,3 ;3 TIMES IDIVI N1,10 ;GET A DIGIT LSHC N2,-6 ;SHIFT INTO N3 THE REMAINDER SOJG T2,.-2 ;IF MORE HLRZS N3 ;PUT INTO RIGHT HALF ADD N3,[SIXBIT/TTY000/] ;ADD TTY HANDLE SETZM C.JOB ;ZERO THE JOB # DEVTYP N3, JFCL ;DEVTYPE RETURNS JOB # HRRZS N3 ;GET RID OF LEFT HALG LSH N3,-11 ;AND SHIFT OVER JOB NUMBER SKIPN N3 ;IF NOT 0 THEN THERE IS A JOB POPJ P, MOVEM N3,C.JOB ;STORE JRST CPOPJ1 ;SKIP RETURN = FOUND A JOB # SUBTTL OUTPUT ROUTINES AND INPUT ROUTINES SUBTTL ROUTINE TO OUTPUT DAYTIME AS HH:MM:SS ; T1 MUST CONTAIN DAYTIME OR SOME TIME IN MS PUTDAY: PUSH P,T1 ;SAVE T1 IDIVI T1,1750 ;GET AS SECS IDIVI T1,74 ;SECS IN T2, MIN IN T1 PUSH P,T2 ;STORE ON STACK IDIVI T1,74 ;GET AS HRS MINS PUSH P,T2 ;SAVE MIN ON STACK CAIGE T1,12 ;IF <10 PUSHJ P,ZEROUT ;OUTPUT LEADING 0 PUSHJ P,DECOUT TYPEC (:) ;AND COLON POP P,T1 ;SAME FOR MINUTES CAIGE T1,12 PUSHJ P,ZEROUT PUSHJ P,DECOUT TYPEC (:) POP P,T1 ;AND SECS CAIGE T1,12 PUSHJ P,ZEROUT PUSHJ P,DECOUT ;ALWAYS PRINT MOVEI CHRCNT,10 ;UPDATE CHARACTER COUNTER PJRST TPOPJ ;RESTORE T1 AND RETURN SUBTTL ROUTINE TO OUTPUT MILLISECONDS AS HH:MM:SS.SS ; EXPECTS MS IN T1 ; MSOUTJ IS LIKE MSOUT EXCEPT THAT IT RIGHT-JUSTIFIES ; THE OUTPUT SO THAT THINGS LINE UP NICE MSOUTJ: SOSA JSTFLG ;JUSTIFY MSOUT: SETZM JSTFLG MOVE N1,T1 ;NEED 3 CONTIG. REGISTERS IDIVI N1,1750 ;OFF THE MS IDIVI N2,12 ;MS PUSH P,N2 ;STORE ARGS IDIVI N1,74 ;GET SECS PUSH P,N2 ;STORE SECS IDIVI N1,74 ;SEPARATE MINS,HOURS PUSH P,N2 ;STORE MINS PUSH P,N1 ;STORE HOURS ON STACK TXZ SW,T.FLG ;SET FLAG FOR NO LEADING ZERO MOVEI T3 ,":" ;FIELD DELIMITER SETZ T4 , ;INIT COUNTER ORUN2: AOJ T4 , ;INCR CNT CAIN T4 ,3 ;IF 3RD ONE MOVEI T3 ,"." ;NEW FILED DEL. POP P,T1 ;POP OFF A NUMBER SKIPN T1 ;IF NON-ZERO PUSHJ P,ZERUN ;DONT FAKE IT CAIL T1,^D10 ;IF >=10 NO NEED FOR DIGIT FILL JRST ORUN2A ;SO SKIP IT MOVEI CHR,"0" ;ELSE FILL WITH BLANK OR ZERO TXNN SW,T.FLG ;DEPENDING ON PREV. TYPEOUT MOVEI CHR," " ;BLANK IF LEADING PUSHJ P,PUTCHR ;AND PUT IT OUT ORUN2A: PUSHJ P,DECOUT ;OUT IT TXO SW,T.FLG ;SAY WE HAVE DONE OUTPUT CAIN T4 ,4 ;NO FD FOR FRACTIONS JRST ORUN3 MOVE CHR,T3 PUSHJ P,PUTCHR ORUN3: CAIE T4 ,4 JRST ORUN2 POPJ P, ;GO HOME ZERUN: TXNN SW,T.FLG ;IF NOT A LEADING TYPE ZERO CAILE T4 ,2 ;OR IF NOT HRS OR MINS OF RT POPJ P, ;GO BACK AND PRINT POP P,(P) ;POP OFF CALL MOVEI STR,[ASCIZ! !] ;UNLESS WANT JUSTIFICATION SKIPE JSTFLG ;THEN SPACE OVER PUSHJ P,PUTSTR ;TO LINE UP TIMES JRST ORUN3 ;AND GO BACK TO END OF LOOP SUBTTL ROUTINE TO PUT OUT "MESS"ARG1/ARG2=NN% ; EXPECTS MESSAGE ADDR IN REG. STR ; AND ARGS IN ARG: AND ARGS+1, ARG PRESERVED, ARG+1 DESTROYED PUTMES: PUSHJ P,PUTSTR ;PUT OUT MESSAGE MOVE T1,ARGS ;GET FIRST ARG PUSHJ P,MSOUT ;OUTPUT IT MOVE T1,ARGS ;FETCH FIRST ARG AGAIN IMULI T1,^D1000 ;1ST ARG * 1000 (AVOID FL. PT) IDIV T1,ARGS+1 ;DIVIDE BY 2ND ARG ADDI T1,5 ;ROUND IT IDIVI T1,^D10 ;AND MAKE 2 PLACE PERCENT EXCH T1,ARGS+1 ;STASH IT FOR NOW TYPEC (/) ;DIVIDE SIGN PUSHJ P,MSOUT ;OUTPUT THE 2ND NUMBER TYPEC (=) ;NOW THE =NN% MOVE T1,ARGS+1 ;PICK UP PERCENT CAILE T1,^D100 ;IF MORE THAN 100%, SET IT TO THAT MOVEI T1,^D100 ;ERROR PROB. DUE TO SLOWNESS IN TRACK PUSHJ P,DECOUT MOVEI CHR,"%" ;THATS THE PERCENT SIGN PJRST PUTCHR ;OUTPUT IT AND RETURN FROM THERE SUBTTL OUTDBF, OUTDBI, OUTDBX - OUTPUT THE SYSDAT DATA BLOCK ; ROUTINE TO TAKE A DATA BLOCK AND OUTPUT IT AS ; ; "LABEL" ; ; R1 - R2 XX% ; . ; . ; ETC ; ; "AVERAGE VALUE : " NN ; ; ROUTINE EXPECTS SYSDAT TABLES TO BE SET UP, T.LOOK TO CONTAIN ; NUMBER OF LOOKS TAKEN AND EXPECTS J TO BE SET TO CURRENT DATA ITEM ; ROUTINE HAS THREE ENTRY POINTS: ; ENTRY POINT ONE: 'OUTDBF' OUT DATA BLOCK FLASH ; OUTPUTS RANGE USING ALL DATA POINTS IN THE BLOCK ; ENTRY POINT TWO: 'OUTDBI' OUT DATA BLOCK INCREMENTAL ; THIS ENTRY POINT IS USED IN CONJUNCTION WITH THE ; ROUTINES MEASURING SOMETHING AS A FUNCTION OF UNITS PER ; ELAPSED TIME. USER ROUTINES USING 'OUTDBI' SHOULD ; BE SET UP VIA DBCORE ; DBCORE SETS UP A DATA BLOCK OF SIZE '# OF LOOKS/REPORT'+1 ; THE ACTION IS THAT STONXT, OR THE USER ROUTINE IS USED TO PLACE ; CURRENT CUMMALATIVE VALUE IN CURRENT DB CELL+1. WHEN ; OUTDBI IS CALLED THE FIRST TIME, IT IGNORES CELL ONE, FROM ; THEREAFTER, IT USES ALL CELLS. AFTER REPORTING, IT PLACES THE VALUE ; IN THE LAST DB CELL INTO THE FIRST DB CELL. THAT IS THE ; "EXTRA CELL" IS WRAPPED AROUND ; ENTRY POINT THREE: 'OUTDBX' OUT DATA BLOCK EXTRODINARY ; SAME AS OTHERS AS FAR AS OUTPUT GOES, DIFFERENCE ; IS THAT ADJPTR AND ADJLOK MUST BE SET UP BEFORE THE CALL ; THIS ALLOWS A USER ROUTINE TO MAKE THESE POINTERS REFERENCE ; ANY ARBITRARY DATA AREA AND CALL OUTDBX TO DO THE STANDARD ; OUTPUT. ; IFN SYS, < OUTDBF: HRRZ N1,TAB.P(J) ;PICK UP TABLE PTR TO DB MOVE N2,T.LOOK ;ALSO GET # LOOKS JRST OUTDBX ;DEPOSIT AND GO SORT OUTDBI: HRRZ N1,TAB.P(J) ;GET DB PTR MOVE N2,T.LOOK ;AND DATA BASE LENGTH -1 TXNE SW,SYSD.I ; AOJ N1, ;INCREMENT BASE ADDRESS ;TO IGNORE 1ST VALUE ;IF FIRST REPORT TXNE SW,SYSD.I ;IF FIRST REPORT, VALUE IN SOJ N2, ;IF FIRST REPORT THEN LOOKS =LOOKS-1 SETOM ROTFLG ;TURN ON ROTATE VALUE FLAG SKIPA ;AND SKIP TURNING IT OFF OUTDBX: SETZM ROTFLG ;TURN OFF ROTATE VALUE FLAG MOVEM N1,ADJPTR ;STORE ADJUSTED PTR MOVEM N2,ADJLOK ;AND ADJUSTED LOOKS TRACEH (ITM) ;[*]PUT THE HEADER IFN FTTRC,< PUSHJ P,ITMCOD ;PUT OUT ASCII CODE > ; END OF FTTRC CONDITIONAL TRACEM BAUXWD ;AND AUXILLIARY ID WORD SETZM SUMSQ ;CLEAR SUM OF SQUARES HRRZ N3,ADJPTR ;PICK UP POINTER TO DATA BLOCK ADD N3,ADJLOK ;GIVES N3 LAST ADDR IN BLOCK HRRZ N1,ADJPTR ;N1 GETS BEGINNING ADDRESS CSRT1: MOVEI N2,1(N1) ;N2 CONTAINS ADDR 1 GREATER N1 CSRT2: MOVE T1,(N1) ;GET DATA IN BLOCK CAMG T1,(N2) ;DATA IN ORDER? JRST NOEXCH ;YES, SKIP EXCHANGE EXCH T1,(N2) ;EXCHANGE TWO ITEMS EXCH T1,(N1) NOEXCH: CAIGE N2,(N3) ;DONE WITH INNER LOOP? AOJA N2,CSRT2 ;NO,GO BACK CAIGE N1,-1(N3) ;YES,DONE WITH OUTER LOOP? AOJA N1,CSRT1 ;NO, GO BACK ;NOW DATA IS SORTED, OUTPUT LABEL THEN DATA SKIPE STR,TAB.N(J) ;FETCH ADDR OF LABEL PUSHJ P,PUTSTR ;OUTPUT IT IF NOT NULL TXNE SW,R.SUMM ;SUMMARY ONLY? JRST SKPLB1 ;YES PUSHJ P,CRLF ;GIVE CR-LF PUSHJ P,CRLF ;AND ANOTHER TYPES (< VALUE FREQUENCY >) SKPLB1: SETZ GT, ;GT USED TO TOTAL ALL POINTS SETZB T4,DONFLG ;ZERO INDEX AND DONE FLAG SKIPA N1,ADJPTR ;MAKE N1 POINT TO START OF DB COUT: MOVE N1,ARGS ;RESTORE N1 AFTER PRINTING MOVE N2,(N1) ;GET A READING MOVE T2,TAB.V(J) ;GET VARIANCE OF THIS ITEM IDIV N2,T2 ;GET TO A BOUNDARY IMUL N2,T2 ;IE INT*VARIANCE MOVEM N2,LL ;STORE AS LOWER LIMIT MOVE N3,TAB.V(J) ;VARIANCE ADD N3,N2 ;[70]THATS THE UPPER LIMIT SOJ N3, ;PLUS 1 MOVEM N3,UL ;AND STORE IT TOO SETZ T3 , ;T3 USED AS TMP CNTER COUT2: MOVE N2,(N1) ;GET A POINT CAMLE N2,N3 ;[70]FALL BELOW LIMIT? JRST CBRK ;NO,SO PRINT AND BREAK MOVEI T3 ,1(T3 ) ;INCREMENT MOVEI T4 ,1(T4 ) ;BOTH COUNTERS ADD GT,N2 ;ADD INTO GRAND TOTAL IMUL N2,N2 ;ADD IT ADDM N2,SUMSQ ;AND SUM THE SQUARES CAMLE T4 ,ADJLOK ;DONE? SOSA DONFLG ;MARK AS DONE, AND SKIP AOJA N1,COUT2 ;NO,GET ANOTHER POINT CBRK: IMULI T3 ,^D1000 ;GET PERCENT OF TOTAL MOVE N2,T3 ;DO IDIV UNCRAZY MOVE N3,ADJLOK ;DIVIDE THIS COUNT/TOTAL LOOKS IDIVI N2,1(N3) ;TO GET PERCENT OF TOTAL MOVEM N1,ARGS ;SAVE DB PTR MOVEM N2,VAL ;OUTPUT ROUTINES USE N1-N3 TXNE SW,R.SUMM ;ONLY SUMMARY? JRST SKPLB2 ;YES TRACEH (FRQ) ;[*]FREQ BLOCK HEADER MOVE T1,LL ;OUTPUT LOWER LIMIT-UPPER LIMIT TRACE ;GIVE TRACE THE LOWER LIMIT PUSHJ P,DECOUT PUSHJ P,TAB ;TAB TYPEC (-) ;DASH PUSHJ P,TAB MOVE T1,UL ;UPPER LIMIT TRACE ;GIVE TRACE THE UPPER LIMIT CAME T1,LL ;DONT PRINT IF SAME AS LOWER PUSHJ P,DECOUT ;OUT PUSHJ P,TAB ;TAB MOVE T1,VAL ;ACTUAL PERCENT MOVEI CHR," " ;MAKE DECIMAL POINT LINE UP CAIGE T1,^D1000 ;FOR PERCENT LESS THAN 100% PUSHJ P,PUTCHR ;ONE LEADING SPACE CAIGE T1,^D100 ;FOR PERCENT LESS THAN 10 PUSHJ P,PUTCHR ;USE ANOTHER LEADING SPACE IFN FTTRC, < PUSHJ P,BFP10 ;IF DOING TRACE,GIVE IT FP FORMAT > ;END OF IFN FTTRC PUSHJ P,SCD10 ;SCALED DECIMAL, DIVIDE BY 10. TYPEC (%) ;ITS A PERCENT PUSHJ P,CRLF ;FOLLOWED BY CRLF SKPLB2: SKIPL DONFLG ;DONE? JRST COUT ;NO TRACEH (SUM) ;[*]AND PUT THE SUMMARY BL HEADER TYPES (< MEAN VALUE FOR >) MOVE T1,T4 ;OUTPUT SAMPLES TRACE ;PUT TO TRACE, THE NUMBER OF SAMPLES PUSHJ P,DECOUT TYPES (< SAMPLES= >) MOVE N1,GT ;GRAND TOTAL IMULI N1,^D100 ;DONT LOSE PRECISION IDIVI N1,(T4 ) ;DIVIDE BY NR OF SAMPLES MOVE T1,N1 ;T1 GETS NUMBER *100 IFN FTTRC, < PUSHJ P,BFP100 ;GIVE TRACE GOOD FLT. PT. FORMAT >; END OF IFN FTTRC PUSHJ P,SCD100 ;SCALED DECIMAL OUT MOVE N1,GT ;PICK UP SUM MUL N1,N1 ;SQUARE IT DIV N1,T4 ;DIVIDE BY NR. POINTS MOVE N2,SUMSQ ;SUM OF POINT SQUARES SUB N2,N1 ;N2 GETS NR. WE WANT ROOT OF IMULI N2,^D100 ;DONT LOSE PRECISION IDIV N2,T4 LSH N3,1 JUMPE N3,.+3 ;DONT ROUND UP ZERO CAML N3,N2 ;ROUND UP ADDI N2,1 MOVEM N2,N3 ;N3 GETS NUMBER WE WANT ROOT OF PUSHJ P,ISQRT ;GET ROOT OF NR IN N3 TYPES (<; STD. DEVIATION= >) IFN FTTRC, < PUSHJ P,BFP10 ;GIVE TRACE FLOATING POINT FORMAT SETZM BAUXWD ;ALSO,ZERO OUT BINARY AUX WORD > ;END OF IFN FTTRC PUSHJ P,SCD10 ;PRINT PUSHJ P,CRLF PUSHJ P,CRLF ;GIVE A FEW CARRIAGE RETURN LINE-FEEDS PUSHJ P,CRLF TXZN SW,OPT.F ;NEVER ROLL FOR FORCED LOOK SKIPN ROTFLG ;WANT "EXTRA CELL" TO CELL 1? JRST OUTEND ;NO SO SKIP IT HRRZ N1,ADJPTR ;GET DB PTR ADD N1,ADJLOK ;AND LENGTH MOVE N1,1(N1) ;GET EXTRA CELL CONTENTS TXNE SW,SYSD.I ;IF WE DIDDLED BASE PTR UP ONE SOS ADJPTR ;PUT IT BACK TO BASE OF CELL MOVEM N1,@ADJPTR ;AND PUT IT AWAY OUTEND: POPJ P, ;AND RETURN ;CALLED WITH POS ARG IN N3, RESULT RETURNED IN T1, USES N2 ; THIS ROUTINE STOLEN FROM SYSTAT ISQRT: SETZB T1,N2 ;ZERO ANSWER TO START JUMPLE N3,CPOPJ ;IF ARG IS .LE. 0 TRO N3,1 ;FORCE SOME BITS ON TO TERMINATE ISQ1: ASH T1,1 ;MOVE TO NEXT BIT CAMG N2,T1 ;SEE IF REMAINDER IS BIG JRST ISQ2 ;NO--LOOP ON SUB N2,T1 ;DECREASE REMAINDER SUBI N2,1 ; .. TRO T1,2 ;INCREASE RESULT ISQ2: LSHC N2,2 ;SHIFT REMAINDER TWO BITS JUMPN N3,ISQ1 ;LOOP UNTIL DONE ASH N2,-1 ;BACK OFF REMAINDER JUMPE N2,CPOPJ CAML N2,T1 ;SEE IF ROUNDING NEEDED ADDI T1,1 ;YES--INCREASE RESULT POPJ P, ;RETURN ; OUTPUT THE INDEXED ITEM IN TAB.C IN ASCII FORM TO TRACE FILE ITMCOD: MOVE T2,TAB.C(J) ;GET IT MOVEI T3,5 ;FIVE LETTERS LSHC T1,6 ;GET 1 LETTER LSH T1,1 ;MAKE ROOM FOR 7TH BIT SOJG T3,.-2 ;REPEAT SIX TIMES ADD T1,[BYTE (7)" "," "," "," "," "];CONVERT TO 7 BIT TRACE ;OUTPUT IT TO TRACE FILE POPJ P, ;AND RETURN > ; END OF CONDITIONAL AROUND OUTDBI & ISQRT ROUTINE SUBTTL ROUTINE TO TYPE OUT THE UNIT TYPES ; ; INPUT IS AC GT CONTAINING THE DSKCHR BITS UNITYP: SETZ T1, ;ASSUME UNKNOWN TYPE OF CONTROLLER LDB T2,[POINTR(GT,DC.CNT)] ;PICK OUT CONTROLLER INFO CAIG T2,.DCCRP ;MAKE RANGE CHECK MOVE T1,[ EXP 0 ;0=NOT USED SIXBIT /RC10/ ;1=RC10 SIXBIT /RP10/ ;2=RP10 SIXBIT /RH10/ ;3=RH10 (FIXED HEAD) SIXBIT /RH10/ ;4=RH10 (MULTIPLE HEAD) SIXBIT /RH20/](T2) ;5=RH20 (MULTIPLE HEAD) PUSHJ P,SIXPNT ;PRINT THE CONTROLLER TYPE TYPES (< >) ;TAB OVER SETZ T1, ;ASSUME UNKNOWN DISK TYPE LDB T3,[POINTR(GT,DC.UNT)] ;GET UNIT INFO CAIG T3,.DCUR6 ;MAKE RANGE CHECK JRST @[EXP DU.0,DU.1,DU.2](T3);DISPATCH ON UNIT TYPE UNIT.1: PUSHJ P,SIXPNT ;PRINT UNIT TYPE TYPES (< >) ;TAB OVER LDB T1,[POINTR(GT,DC.DCN)] ;GET CHANNEL NUMBER PUSHJ P,DECOUT ;PRINT IT PJRST TAB ;RETURN,TABBING OVER DU.0: MOVE T1,[SIXBIT/RD10/] ;ASSUME DRUM CAXN T2,.DCCFS ;IS THIS ON A FIXED HEAD RH10? MOVE T1,[SIXBIT/RS04/] ;YES,ADJUST CAXN T2,.DCCRP ;IS THIS ON A MULTI-HEAD RH10? MOVE T1,[SIXBIT/RP04/] ;YES,MUST BE RP04 CAXN T2,.DCCRN ;RP20? MOVE T1,[SIXBIT/RP20/] ;YES JRST UNIT.1 ;PRINT,CONTINUE DU.1: MOVE T1,[SIXBIT/RM10B/] ;DRUM? CAXN T2,.DCCDP ;MAYBE, SO SEE IF THIS IS A PACK MOVE T1,[SIXBIT/RP02/] ;COULD BE RP02 CAXN T2,.DCCRP ;CHECK FOR RP06,SINCE IT LOOKS MOVE T1,[SIXBIT/RP06/] ;LIKE AN RP05 JRST UNIT.1 ; DU.2: MOVE T1,[SIXBIT/RP03/] ;ASSUME RP03 CAXN T2,.DCCRP ;UNLESS THIS IS AN RH10 CONTROLLER MOVE T1,[SIXBIT/RP06/] ;WHICH MEANS ITS AN RP06 JRST UNIT.1 ;CONTINUE SUBTTL UTILITY INPUT/OUTPUT ROUTINES ; NUMERIC OUTPUT ROUTINES DECOUT: SKIPA N3,[^D10] ;DECIMAL OUTPUT OCTOUT: MOVEI N3,10 ;OCTAL OUTPUT ROUTINE MOVE N1,T1 ;GET NUMBER TO BE OUTPUT JUMPGE N1,ONL ;IF NEGATIVE, SAY SO TYPEC (-) ;BY MINUS SIGN MOVMS N1 ;AND MAKE IT THE MAGNITUDE ONL: IDIV N1,N3 ;GET A DIGIT HRLM N2,(P) ;STORE IT SKIPE N1 ;END? PUSHJ P,ONL ;NO HLRZ CHR,(P) ;GET DIGIT BACK ADDI CHR,"0" ;ASCIISIZE IT PJRST PUTCHR ;PUT OUT DIGIT ; SCALED DECIMAL OUTPUT ROUTINES SCD10: SKIPA N3,[^D10] ;SCALED DOWN BY 10 SCD100: MOVEI N3,^D100 ;SCALED DOWN BY 100 PUSH P,T1 ;SAVE T1 ACROSS CALL MOVE N1,T1 ;READY FOR OUTPUT IDIV N1,N3 ;DIVIDE PUSH P,N2 ;SAVE REMAINDER MOVE T1,N1 ;READY FOR PRINT PUSHJ P,DECOUT ;PRINT IT TYPEC (.) ;PRINT THE DOT POP P,T1 PUSHJ P,DECOUT ;PRINT FRACTION TOO PJRST TPOPJ ;RESTORE T1 AND RETURN ; NUMERIC INPUT ROUTINES DECIN: SKIPA N3,[12] ;DECIMAL INPUT ROUTINES OCTIN: MOVEI N3,10 ;OCTAL INPUT SETZ N2, INL: PUSHJ P,GETCHR ;GET A CHARACTER CAIL CHR,"0" ;IF LESS THAN ZERO CAILE CHR,"0"-1(N3) ;OR MORE THAN BASE JRST ENDNI ;THEN END IMUL N2,N3 ;MULTIPLY WHAT WE HAVE ADDI N2,-"0"(CHR) ;AND ADD NEW STUFF JRST INL ;GO BACK FOR MORE ENDNI: MOVE T1,N2 ;RETURN # IN T1 POPJ P, SUBTTL TOKEN INPUT ROUTINE ; ROUTINE TO RETURN IN T1 A SIXBIT TOKEN ; AND IN THE LASTOK BLOCK THE UNNABREVIATED ASCIZ VERSION ; OF THE INPUT ; UPON RETURN THE CHARACTER THAT DELIMITED THE TOKEN IS IN CHR ; IE. WAS OUTSIDE ASCII 0-9,A-Z ; TOKEN: PUSH P,T2 ;SAVE T2 MOVE STR,[POINT 7,LASTOK] ;POINT TO BLOCK MOVE N3,[POINT 6,T1] ;POINT TO T1 SETZB T2,T1 ;CLEAR MOVEI N1,6 ;NUMBER OF CHR TO T1 MOVEI N2,MAXTOK ;MAXIMUM TO TAKE INTO LASTOK TOKE1: IDPB T2,STR ;ZERO TO DELIMIT STRING PUSHJ P,GETCHR ;GET A CHARACTER CAIL CHR,"0" ;CHECK FOR DELIMITED CAILE CHR,"Z" JRST TOKE2 ;.LT.0 OR .GT. Z CAILE CHR,"9" CAIL CHR,"A" TXNE SW,BRK JRST TOKE2 ;BREAK OR BETWEEN 9 AND A SOSLE N2 DPB CHR,STR ;DEPOSIT IN LASTOK IF ROOM SOJL N1,TOKE1 ;AND IN T1 IF ROOM SUBI CHR,40 ;SIXBIT IT IDPB CHR,N3 ;AND DEPOSIT JRST TOKE1 ;GET NEXT CHARACTER TOKE2: POP P,T2 ;RESTORE T2 POPJ P, ;AND RETURN SUBTTL ROUTINE TO INPUT A FILESPEC FILSPC: MOVE T1,[XWD PTHADR,PTHADR+1] ;CLEAR PATH SETZM PTHADR BLT T1,PTHADR+PTHLEN-1 PUSHJ P,TOKEN ;GET FIRST TOKEN CAIE CHR,":" ;FIRST DEVICE COMES? JRST NODEV ;NO JUMPE T1,E$$NDI ;NULL DEVICE ILLEGAL MOVEM T1,FILDEV ;SET IT PUSHJ P,FENCHK ;SEE IF END PUSHJ P,TOKEN ;GET NEXT TOKEN NODEV: SKIPE T1 ;DONT DEPOSIT NULL FILENAME MOVEM T1,FILNAM ; CAIN CHR,"[" ;PPN? JRST GPPN ;YES, GET IT PUSHJ P,FENCHK ;CHECK FOR END CAIE CHR,"." ;EXT NEXT? JRST FILERR ;NO,ERROR PUSHJ P,TOKEN ;GET NEXT TOKEN MOVEM T1,FILEXT ;STORE PUSHJ P,FENCHK ;SEE IF DONE CAIE CHR,"[" ;PPN? JRST FILERR ;NO GPPN: PUSHJ P,OCTIN ;GET PRJ JUMPE T1,[ CAIN CHR,"-" JRST DEFPATH ;SET DEFAULT PATH CAIE CHR,"," ;DEF. PPN? JRST FILERR HLRZ T1,MYPPN ;YES JRST .+1] ;CONTINUE HRLZM T1,FILPPN ;STORE CAIE CHR,"," ;COMMA? JRST FILERR ;NO PUSHJ P,OCTIN ;GET PRG NR. SKIPN T1 ;DEFAULT? MOVE T1,MYPPN ;YES HRRM T1,FILPPN ;STASH CAIN CHR,"]" ;OK? POPJ P, ;RETURN CAIE CHR,"," ;SFDS FOLLOW JRST E$$BPS ;NO, BAD PATH SPECIFIED MOVE T1,FILPPN ;POINT TO PATH BLOCK MOVEM T1,PTHADR+2 ; MOVEI T1,PTHADR MOVEM T1,FILPPN MOVEI T2,1 ;1ST SFD SFDLP: PUSHJ P,TOKEN ;GET SFD NAME JUMPE T1,E$$NSI ;NULL SFD ILLEGAL CAILE T2,MAXSFD ;ROOM? JRST E$$TMS ;TOO MANY SFDS MOVEM T1,PTHSFD-1(T2) ;PLACE CAIN CHR,"]" ;DONE? POPJ P, ;YES CAIE CHR,"," ;COMMA? JRST E$$BPS ;NO,BAD PATH AOJA T2,SFDLP ;GET NEXT SFD DEFPATH: MOVX T1,-1 ;GET DEFAULT PATH MOVEM T1,PTHADR ;FROM MONITOR MOVE T1,[XWD PTHLEN,PTHADR] ;SET UP FOR PATH. UUO PATH. T1, JRST E$$PUF ;PATH UUO FAILURE PUSHJ P,GETCHR ;SHOULD END STRING WITH ] CAIE CHR,"]" ;END CORRECTLY? JRST E$$BPS ;NO MOVEI T1,PTHADR ;MAKE FILPPN POINT TO PATH HRRZM T1,FILPPN FENCHK: CAIE CHR,"=" ;END IS "="? TXNE SW,BRK ;OR BREAK? TXOA SW,REGET ;YES,REGET IT FLAG ON AND POPJ P, ;NOT END RETURN PJRST TPOPJ ;BALANCE STACK AND RETURN ;; ERROR MESSAGES FOR FILSPC $ERROR(EF.FAT!EF.RST,NDI,NULL DEVICE NAME IS ILLEGAL) $ERROR(EF.FAT!EF.RST,BPS,BAD PATH SPECIFICATION) $ERROR(EF.FAT!EF.RST,TMS,TOO MANY SFDS SPECIFIED) $ERROR(EF.FAT!EF.RST,PUF,PATH UUO FAILED) $ERROR(EF.FAT!EF.RST,NSI,NULL SFD ILLEGAL) FILERR: $ERROR(EF.FAT!EF.RST,FSE,FILE SPECIFICATION SYNTAX ERROR) SUBTTL LINE MANIPULATION ROUTINES ; ROUTINE TO EAT REST OF LINE EATLIN: TXNE SW,BRK ;BREAK SEEN? POPJ P, ;YES, SO RETURN PUSHJ P,GETCHR ;GET NEXT CHARACTER PJRST EATLIN ;AND TRY AGAIN ; ROUTINE TO GET A CHARACTER FROM THE TELETYPE GETCHR: TXZN SW,REGET ;CHECK FOR REGET ILDB CHR,COMPTR ;GET A CHARACTER TXZA SW,T.FLG ;REGULAR ENTRY GETCH2: TXO SW,T.FLG ;RUNNING COMMAND ENTRY PT. TXZ SW,BRK ;SHUT OFF BREAK INDICATOR CAIN CHR,32 ;IF IT IS ^Z EXIT 1, ;TEMPORARILY EXIT CAILE CHR,140 ;SEE IF ITS LOWER CASE SUBI CHR,40 ;CONVERT TO UPPER CASE CAIL CHR,12 ;IF NOT LF,VT OR FF CAILE CHR,14 ;THEN SKIP BREAK SET CAIN CHR,33 ;CHK FOR ALT. MODE JRST BREAKX ;ELSE TAKE BREAK EXIT CAIE CHR,";" ;ALLOW COMMENTS IN THE COMMAND CAIN CHR,"!" ;STRINGS BY TURNING ON BREAK JRST BREAKX ;HERE CAIG CHR," " ;FINALLY , SKIP BLANKS AND JRST SEECHK ;CONTROL CHARACTERS POPJ P, ;RETURN BREAKX: TXOA SW,BRK ;SET BREAK SEECHK: TXZE SW,T.FLG ;CHECK FOR SPECIAL CASE POPJ P, ;RETURN JRST GETCHR ;NOT THIS TIME ; ROUTINE TO PRINT OUT VALUE IN T1 AS SO MANY K OR P ; DEPENDING ON PROCESSOR WE ARE RUNNING ON. OUTPUT IS "NNK" OR "NNP" ; MEMPNT: MOVE N2,T1 ;CONVERT USING GETCOR'S ROUTINE PUSHJ P,KIKA ;SINCE ITS HANDY MOVE T1,N2 ;PRINT IT OUT PUSHJ P,DECOUT ;PRINT IT OUT AS DECIMAL MOVEI CHR,"K" ;PRETEND ITS A KA TXNE SW,KI.10 ;UNLESS ITS A KI MOVEI CHR,"P" ;THEN ITS PAGES PJRST PUTCHR ;OUTPUT CHAR AND RETURN ; ROUTINE TO TYPE A PPN AS "[PROJ,PROG]" PPNTYP: PUSH P,T1 ;SAVE T1 TYPEC ([) ;OPEN BRACKET HLRZS T1 ;PROJECT NR. PUSHJ P,OCTOUT TYPEC (<,>) ;COMMA HRRZ T1,0(P) ;GET PROGRAMMER NR. PUSHJ P,OCTOUT TYPEC (]) ;CLOSE BRACKET PJRST TPOPJ ;RESTORE T1 AND RETURN ; SIXBIT OUTPUT ROUTINES SIXPNT: TXZA SW,T.FLG ;CLEAR T.FLG SIXPNB: TXO SW,T.FLG ;SET SO PRINT BLANKS MOVEI N1,6 ;NUMBER OF CHARS MOVE N2,[POINT 6,T1] ;POINTER TO T1 SIXP2: ILDB CHR,N2 ;GET A BYTE TXNN SW,T.FLG ;IF WANT BLANKS JUMPE CHR,.+3 ;SKIP BLANKS ADDI CHR,40 ;MAKE ASCII PUSHJ P,PUTCHR ;AND PRINT SOJG N1,SIXP2 ;MORE TO DO POPJ P, ;NO ; ROUTINE TO PRINT AN ASCIZ STRING PUTSTR: HRLI STR,(POINT 7,0) ;MAKE A BYTE POINTER P1: ILDB CHR,STR ;GET A BYTE JUMPE CHR,CPOPJ PUSHJ P,PUTCHR ;OUTPUT THE CHARACTER JRST P1 ;AND GO BACK FOR MORE SUBTTL ROUTINE TO LOAD A COMMAND LINE FROM TTY OR TMPCOR GETLIN: MOVEI T1,/5 ;GET CORE FOR COMMAND PUSHJ P,ASSCOR ;GET IT GTLIA: HRLI T1,(POINT 7,0) ;MAKE IT A BYTE POINTER MOVEM T1,COMPTR SETZB T2,CHR ;CLEAR COUNT AND CHR MOVEI T2,COMMAX ;MAX LINE LENGTH TXNE SW,INDFLG ;INDIRECT FILE? JRST INDIR ;YES,GET IT TTCALL 3,[ASCIZ/ */] GTLI1: CAILE CHR," " ;IF NOT SPACE MOVEM CHR,LASCHR ;SAVE LAST CHAR TTCALL 4,CHR ;GET CHARACTER CAIN CHR,32 ;^Z? JRST [EXIT 1, MOVE T1,COMPTR JRST GTLIA] ;YES SOJGE T2,GTLI2 $ERROR(EF.FAT!EF.RST,LTL,COMMAND LINE TOO LONG) GTLI2: CAIN CHR,"-" ;SAVE BP TO LAST DASH MOVE T4,T1 ;IN CASE CONTINUATION IDPB CHR,T1 ;STORE CHAR CAIL CHR,12 ;CHECK FOR BREAK CAILE CHR,14 CAIN CHR,33 JRST [MOVE T3,LASCHR ;CHECK FOR CONT CAIE T3,"-" POPJ P, ;ITS NOT SETZM LASCHR ;PREVENT LOOP TTCALL 1,["#"] ;PROMPT ADDI T2,2 MOVEM T4,T1 JRST GTLI1] ;AND CONTINUE JRST GTLI1 ;BACK FOR NEXT CHARACTER ;** PROCESS INDIRECT FILE INDIR: OPEN TY,FILMOD ;OPEN UP FILE JRST [$ERROR(EF.FAT!EF.RST,CID,CANT OPEN INDIRECT DEVICE)] LOOKUP TY,FILNAM ;FROM SPEC BLOCK JRST [ MOVE LUEB+1,FILEXT PJRST LUPERR] ;ON LOOKUP ERROR INBUF TY,1 ; INDIN: SOSGE TYBUF+2 ;STANDARD INPUT JRST [IN TY, JRST INDIN STATZ TY,74B23 CAIA JRST INDEND $ERROR(EF.FAT!EF.RST,ERI,ERROR READING INDIRECT FILE)] ILDB CHR,TYBUF+1 JUMPE CHR,INDIN CAIN CHR,32 ;^Z FORCES AN END JRST INDEND SOJL T2,E$$LTL ;ROOM FOR CHARACTER? IDPB CHR,T1 ;STASH THE NON-ZERO CHR JRST INDIN ;AND GET THE NEXT ONE INDEND: MOVEI CHR,12 ;INSURE A BREAK CHARACTER IDPB CHR,T1 ;STORE TXZ SW,INDFLG ;DONE POPJ P, ;DONE SUBTTL PRESCAN FOR FILE SPEC DELIMITER PRESCA: MOVE T1,COMPTR ;GET POINTER PRESC1: PUSHJ P,GETCHR ;LOAD CAIN CHR,"=" ;SEE IT? JRST PRESC2 ;YES TXNN SW,BRK ; JRST PRESC1 ;NOT BREAK,GET NEXT AOS (P) ;SKIP RETURN,BREAK BEFORE PRESC2: MOVEM T1,COMPTR ;RESTORE POINTER POPJ P, ;RETURN SUBTTL MAIN CHARACTER OUTPUT ROUTINE ; ROUTINE TO OUTPUT A SINGLE CHARACTER PUTCHR: TXNE SW,F.TTY ;SHOULD DO TTCALL? JRST TYOUTP ; YES TXNE SW,MD.TRC ;TRACING? DBLOC1: POPJ P, ;YES SKIP ASCII OUTPUT ;NOTE: CHANGE POPJ TO JRST TYOUTP ;TO DEBUG. GETS DUPLICATE TO TTY SOSG TYBUF+2 ;IF BUFFER NOT FULL PUSHJ P,PUTBUF ;OUTPUT BUFFER IDPB CHR,TYBUF+1 ;DEPOSIT CHARACTER TXNE SW,DEVTTY ;IF TTY IS OUTPUT DEVICE CAIE CHR,12 ;A LINE-FEED SKIPA PUSHJ P,PUTBUF ;OUTPUT THE BUFFER PUTINC: AOJ CHRCNT, ;UPDATE CHARACTER COUNTER POPJ P, ;GO HOME PUTBUF: OUT TY, ;OUTPUT BUFFER POPJ P, ;AND GO BACK $ERROR(EF.FAT!EF.CON,OUT,) GETSTS TY,T1 ;GET STATUS JFCL TRZ T1,17 ;SHUT OFF MODE BITS PUSHJ P,OCTOUT ;AND PRINT IT TTCALL 3,[ASCIZ/) ON DEVICE /] ;TELL USER THE DEVICE NAME MOVE T1,FILDEV ;THAT WE SAVED EARLIER PUSHJ P,SIXPNT X$$OUT: PUSHJ P,CRLF JRST RESTRT TYOUTP: TTCALL 1,CHR ;TTY OUTPUT PJRST PUTINC ;INCREMENT CURSOR POS. AND RETURN SUBTTL DO THE BINARY OUTPUT FOR TRACE MODE IFN FTTRC, < BINWRT: TXNN SW,F.TTY ;IN ERROR MODE? TXNN SW,MD.TRC ;OR NOT IN TRACE MODE? POPJ P, ;RETURN SOSG TYBUF+2 ;ROM IN BUFFER? PUSHJ P,PUTBUF ;OUTPUT IT IDPB T1,TYBUF+1 ;DEPOSIT WORD POPJ P, ;DONE SUBTTL ROUTINE TO DO THE FLOATING FOR THE TRACE PACKAGE BFP10: SKIPA T2,[10.0] ;DIVIDE BY 10 BFP100: MOVE T2,[100.0] ;DIVIDE BY 100 CAIA ;SKIP BFP001: MOVE T2,[1.0] ;JUST OUTPUT PUSH P,T1 ;SAVE T1 PUSHJ P,FLOAT ;FLOAT T1 FDVR T1,T2 ;DIVIDE BY DESIRED FIGURE PUSHJ P,BINWRT ;WRITE OUT THE RESULT PJRST TPOPJ ;RESTORE T1 FLOAT: TXNE SW,KI.10 ;ON A SMART MACHINE? JRST [FLTR T1,T1 ;YES, USE HARDWARE POPJ P,] PUSH P,T2 ;SAVE T2 HLRE T2,T1 ;THIS IS STOLEN FROM FOROTS HLL T1,T2 ; FSC T1,233 ;FLOAT THE LOW HALF OF THE INT SKIPGE T1 ;FOR NEGATIVE NUMBERS AOJE T2,FLTXIT ;DONE? FSC T2,255 ;FLOAT THE HIGH PART FADR T1,T2 ;COMBINE THE TWO PARTS FLTXIT: POP P,T2 ;RESTORE T2 POPJ P, ;RETURN W/ T1 FLOATED >; END OF IFN FTTRC SUBTTL FIXED CHARACTER OUTPUT ROUTINES ; ROUTINE TO OUTPUT A ZERO ZEROUT: MOVEI CHR,"0" ;GET ZERO PJRST PUTCHR ;AND PRINT IT ; CURSOR POSITIONING ROUTINE POSIT: MOVE N1,SPATAB(FP) ;GET MAX # CHARS THIS FIELD CAMG N1,CHRCNT ;IF GT THAN USED TDZA N1,N1 ; SUB N1,CHRCNT ;GET CHARACTTERS NEEDED AOJ N1, ;INSURE 1 BLANK BETWEEN FIELDS PUSHJ P,SPACES ;AND SPACE OVER AOJ FP, ;CORRECT FIELD POSITION SETZ CHRCNT, ;ZERO CHARACTER COUNT POPJ P, ;AND GO BACK ;SPACES OUTPUT ROUTINE SPACES: MOVEI CHR," " ;A SPACE JUMPE N1,CPOPJ ;MAYBE NONE PUSHJ P,PUTCHR ;PRINT A BLANK SOJG N1,.-1 ;IF MORE THAN 1 POPJ P, ; OUTPUT A TAB TAB: MOVEI CHR," " ;A TAB PJRST PUTCHR ;PRINT IT ;OUTPUT A CR-LF PAIR CRLF: MOVEI CHR,15 ;CARRIAGE RETURN PUSHJ P,PUTCHR MOVEI CHR,12 ;LINE-FEED PJRST PUTCHR SUBTTL TABLE LOOKUP ROUTINE ; /TABLUK/ - LOOKS UP TOKEN IN AN UNORDERED TABLE ; DOES THE USUAL UNIQUENESS CHECKING. ; INPUT - T1/ SIXBIT TOKEN TO BE MATCHED ; T2/ IOWD POINTING TO TABLE ; OUTPUT - T1 / INDEX INTO THE TABLE ; RETURNS - CPOPJ WITH T1/0 MEANS NOT FOUND ; CPOPJ WITH T1=-1 MEANS AMBIGUOUS ; CPOPJ1 MEANS ALL IS OK, T1 HAS INDEX TABLUK: HRRZM T2,SWIDX ;SAVE INITIAL ADDRESS MOVE T3,T1 ;COPY INPUT TOKEN SETO T4, ;INITIAL MASK IS NO BITS LSH T3,6 ;GET RID OF ONE CHARACTER LSH T4,-6 ;ADJUST MASK JUMPN T3,.-2 ;REPEAT FOR ALL PRESENT CHRS SETZ GT, ;CLEAR INDEX FOUND TABL.3: MOVE T3,0(T2) ;GET AN ITEM TDZ T3,T4 ;MASK OUT UNWANTED PART CAMN T1,T3 ;IS THIS A MATCH? JRST [ JUMPN GT,[ SETO T1, ;YES,CHECK FOR MULTIPLE POPJ P,] ;MATCHES. MOVEM T2,GT ;STORE INDEX JRST .+1] ;AND CONTINUE AOBJN T2,TABL.3 ;SEE IF MORE TO DO TABL.4: HRRZ T1,GT ;GET ADDRESS OF MATCH JUMPE T1,CPOPJ ;IF NONE FOUND,RETURN SUB T1,SWIDX ;CONVERT TO OFFSET JRST CPOPJ1 ;AND TAKE GOOD RETURN SUBTTL ERROR MESSAGES ;ERROR MESSAGE PROCESSOR ; CALL IS : (PRODUCED BY $ERROR MACRO) ; MOVE T1, ;IF ANY ; MOVX T4, ; JSP T3,ERRMSG ; XWD SIXBIT CODE(3CHRS),ADDRESS OF ASCIZ STRING (OR 0) ; AND IF EF.CON (MESSAGE CONTINUES) IS SET, THERE IS AN EXTRA ; WORD "JRST AROUND.REST.OF.MESSAGE"(SKIPPED IF PREFIX-ONLY NOT SET) ; ERRMSG: MOVEM 0,SAVAC ;SAVE THE ACS MOVE 0,[XWD 1,SAVAC+1] BLT 0,SAVAC+17 MOVE 0,SAVAC+0 ;RESTORE BASHED AC MOVEM T3,ERRPC ;SAVE ERROR PC TXO SW,F.TTY ;ERRORS GO TO TTY PUSHJ P,CRLF ;GIVE A CRLF PAIR MOVEI CHR,"?" ;SET FOR FATAL ERROR TXNE T4,EF.CMT ;IS IT A COMMENT? MOVEI CHR,"[" ;YES TXNE T4,EF.WRN ;IS IT A WARNING MOVEI CHR,"%" ;YES PUSHJ P,PUTCHR ;TYPE IT GTMSG. (CHR) ;GET OUR MESSAGE LEVEL TXNN SW,NO.PRF ;/E VALUE SAYS NO PREFIX? TXNN CHR,JW.WPR ;WANT PREFIX? JRST NOPRFX ;NO PUSH P,CHR ;SAVE MESSAGE LEVEL MOVEI T1,'TRK' ;PUT OUT OUR PREFIX PUSHJ P,SIXPNT ; HLLZ T1,(T3) ;AND SPECIFIC CODE PUSHJ P,SIXPNT ; TYPEC (< >) ;AND A SPACE POP P,CHR ;RESTORE MESSAGE LEVEL NOPRFX: TXNN SW,NO.LIN ;/E VALUE SAYS NO REST OF LINE? TXNN CHR,JW.WFL ;WANT SHORT ONLY ? JRST ENDMSG ;ONLY PREFIX WANTED, SO GO BACK MOVE STR,(T3) ;GET ADDRESS OF STRING PUSHJ P,PUTSTR ;AND PRINT IT TXNN T4,EF.DEC!EF.OCT!EF.SIX!EF.PPN!EF.MEM!EF.STR JRST ENDMSG ;THATS ALL MOVE T1,SAVAC+T1 ;RESTORE ARGUMENT REGISTER TXNE T4,EF.DEC ;DECIMAL? PUSHJ P,DECOUT ; TXNE T4,EF.OCT ;OCTAL? PUSHJ P,OCTOUT ; TXNE T4,EF.SIX ;SIXBIT? PUSHJ P,SIXPNT ; TXNE T4,EF.PPN ;AS A PPN? PUSHJ P,PPNTYP ;YES TXNE T4,EF.MEM ;IN TERMS OF CURRENT MEMEORY PUSHJ P,MEMPNT ;YES TXNE T4,EF.STR ;WANT STRING JRST [MOVE STR,T1 ;YES PUSHJ P,PUTSTR; JRST .+1] ; ENDMSG: MOVE 0,[XWD SAVAC+1,1] ;RESTORE THE ACS BLT 0,17 MOVE 0,SAVAC ;FROM SAVE BLOCK TXNE T4,EF.CON ;WANT A CONTINUAI? JRST [GTMSG. (T4) TXNN SW,NO.LIN TXNN T4,JW.WFL JRST 1(T3) ;NO, RETURN+0 HAS JUMP AROUND REST TXO SW,F.TTY ;WANTS REST, TURN ON F.TTY AGAIN JRST 2(T3)] ;AND SKIP JUMP,FALLING INTO REST OF MS. TXNE T4,EF.CMT ;FINISH COMMENT TTCALL 1,["]"] ;IF DESIRED TTCALL 3,[ASCIZ/ /] ;CLEAN UP TXNE T4,EF.EXT ;WANT TO EXIT? JRST FINISH ;YES, SO DO SO TXNE T4,EF.RST ;WANT TO EAT LINE AND GO TO "*"? JRST [PUSHJ P,EATLIN JRST RESTRT] ;YES JRST 1(T3) ;NORMAL OLD RETURN SUBTTL NOTIFY OF GETTAB ERROR ; GETTAB FAILURE NOTIFICATION ; CALLED VIA PJRST FROM FETTAB. ; IF GT.OPT BIT IS SET, WE JUST DO A POPJ, GIVING ; USER A NON-SKIP (IE. BAD) RETURN ; IF GT.OPT NOT SET , WE TELL HIM LOC OF FAILING GETTAB ; AND EXIT. TYPING CONTINUE DOES A NON-SKIP RETURN ; NOTE: FOR DEBUGGING-- LOCATION SAVGT HAS OFFENDING GETTAB PARAMETER GFAIL: TXZE SW,GT.OPT ;OPTIONAL ? POPJ P, ;YES, JUST DO A NON-SKIP RETURN PUSH P,T1 ;SAVE T1 HRRZ T1,-1(P) ;GET CALL ADDRESS SOJ T1, ;MINUS ONE WAS CALL $ERROR(EF.FAT!EF.OCT,GTF,GETTAB UUO FAILURE AT PC ) EXIT 1, ;EXIT PJRST TPOPJ ;RESTORE T1 AND RETURN ; ;** LOOKUP , ENTER AND OPEN ERROR NOTIFICATION RENERR: $ERROR(EF.FAT!EF.CON,RNE,RENAME FAILURE FOR ) JRST IOERR1 LUPERR: $ERROR(EF.FAT!EF.CON,LKE,LOOKUP FAILED FOR ) JRST IOERR1 ;ENTER CHAIN OF MESSAGES $ERROR(EF.FAT!EF.CON,OPE,OUTPUT ENTER FAILED FOR ) IOERR1: PUSH P,LUEB+1 ;SAVE ERROR CODE MOVE T1,FILDEV ;PRINT DEVICE PUSHJ P,SIXPNT TYPEC (:) MOVE T1,FILNAM ;FILENAME PUSHJ P,SIXPNT TYPEC (.) HLRZ T1,FILEXT ;AND EXTENSION PUSHJ P,SIXPNT SKIPN T1,FILPPN ;PPN OR PATH? JRST IOERR2 ;NO TLNE T1,-1 ;POINTER TO PATH? JRST [PUSHJ P,PPNTYP ;NO,JUST TYPE PPN JRST IOERR2] TYPEC ([) HLRZ T1,PTHPPN ;GET PPN PUSHJ P,OCTOUT ; TYPEC (<,>) HRRZ T1,PTHPPN PUSHJ P,OCTOUT SETZ T2, ;SEE IF SFDS SPECIFIED ERRSFD: SKIPN T1,PTHSFD(T2) ; JRST [MOVEI CHR,"]" ;IF DONE GIVE "]" AND CONTINUE PUSHJ P,PUTCHR JRST IOERR2] TYPEC (<,>) PUSHJ P,SIXPNT ;TYPE SFD NAME AOJA T2,ERRSFD ;BACK FOR MORE IOERR2: POP P,T1 ;GET ERROR CODE HRRZS T1 ;BLANK OUT GARBAGE TYPES (< (>) ;ERROR CODE PUSHJ P,OCTOUT ;IN OCTAL TYPES (<) >) ; CAIG T1,ERRLN. ;CODE GREATER THAN SIZE? TTCALL 3,@ERRTAB(T1) ;NO, OUTPUT THE STRING X$$RNE: X$$LKE: X$$OPE: PUSHJ P,CRLF ;AND CRLF JRST RESTRT ;BACK FOR NEXT COMMAND ; TABLE OF LOOKUP/ENTER FAILURE MESSAGES ; NON-APPLICABLE MESSAGES HAVE ZERO DEFINE LEER(AA)< IFNB ,<[ASCIZ\AA\]> IFB ,<[EXP 0]> > ERRTAB: LEER(FILE NOT FOUND) LEER(NON-EXISTANT UFD) LEER(PROTECTION FAILURE) LEER(FILE BEING MODIFIED) LEER(ALREADY EXISTING FILENAME) LEER(ILLEGAL UUO SEQUENCE) LEER(BAD RIB OR UFD) LEER() LEER() LEER() LEER() LEER() LEER(NO ROOM OR QUOTA EXCEEDED) LEER(WRITE-LOCK ERROR) LEER(NOT ENOUGH MONITOR FREE CORE) LEER(PARTIAL ALLOCATION ONLY) LEER(BLOCK NOT FREE ON ALLOCATED POSITION) LEER(CANNOT SUPERSEDE DIRECTORY) LEER(CANNOT DELETE NON-EMPTY DIRECTORY) LEER(SFD NOT FOUND) LEER(SEARCH LIST EMPTY) LEER(SFD NESTING TOO DEEP) LEER(NO STRUCTURES IN PATH BOTH CREATABLE AND WRITEABLE) LEER() ERRLN.==.-ERRTAB ;LENGTH OF TABLE SUBTTL SHARED UTILITY MODULES THAT CAN BE USED BY INITIA,GATHER, ETC ; ; THE FOLLOWING ROUTINES ARE AVAILABLE FOR USE BY ANY SYSTEM DATA ; ROUTINE. IN GENERAL THEY EXPECT USES FOR REGISTERS TO CONFORM ; TO THE STANDARD SPECIFICALLY J,L,GT) ; REGISTER USAGE AND SIDE EFFECTS ARE AS DOCUMENTED IFN SYS, < ; THIS ROUTINE TAKES CONTENTS OF GT AND PLACES THEM IN THE DB CELL ; IMMEDIATELY FOLLOWING THE CURRENT ONE. ; ; NOTE: ROUTINES USEING STONXT MUST ALLOCATE 1 MORE CELL PER DB THAN THERE ; ARE LOOKS PER REPORT ; EXPECTS VALUE IN GT, PRESERVES ALL REGISTERS. STONXT: AOJ L, ;POINT TO NEXT CELL MOVEM GT,@TAB.P(J) ;PUT VALUE AWAY SOJ L, ;FIX UP INDEX POPJ P, ;AND RETURN ; ROUTINE TO MAKE GT BE A PERCENT OF THE CONTENTS OF GT ; DIVIDED BY THE NUMBER OF ELAPSED TICS ; EXPECTS GT TO HAVE VALUE. ALL AC'S PRESERVED ; PRETIC: IMULI GT,^D1000 ;DONT LOSE PRECISION PUSH P,GT+1 ;GOING TO DO AN IDIV IDIV GT,EL.TIC ;DO IT ADDI GT,5 ;ROUND IT IDIVI GT,^D10 ;DONE POP P,GT+1 ;RESTORE THE AC POPJ P, ;AND RETURN ; DIVSEC: DIVIDES BY NUMBER OF SECONDS THAT HAVE PASSED ; EXPECTS VALUE IN GT, RETURNS VALUE IN GT. USES EL.MS AS ; ELAPSED SECONDS DIVSEC: IMULI GT,^D1000 ;MULTIPLY BY 1000 PUSH P,GT+1 ;READY TO DO IDIV IDIV GT,EL.MS ;DONE POP P,GT+1 ;RESTORE THE AC POPJ P, ;AND RETURN ; ROUTINE TO TAKE A VALUE IN GT, LOOK IT UP AND CALL STONXT, ; GET CURRENT VALUE DIVIDED BY ELAPSED SECONDS AND DISMISS THE ; CALL. INCSEC: PUSHJ P,FETTAB ;LOOK UP VALUE PUSHJ P,STONXT ;STORE IN NEXT CELL SUB GT,@TAB.P(J) ;SUBTRACT TO MAKE INCR. PUSHJ P,DIVSEC ;DIVIDE BY ELAPSED SECS. MOVEM GT,@TAB.P(J) ;STORE IT AWAY POPJ P, ;AND RETURN ;CODE ADDED TO ALLOW FOR SIMPLE INCREMTAL VALUES SIMINC: PUSHJ P,FETTAB ;LOOK UP VALUE PUSHJ P,STONXT ;STORE IN NEXT CELL SUB GT,@TAB.P(J) ;SUBTRACT TO MAKE INCR. MOVEM GT,@TAB.P(J) ;STORE IT AWAY POPJ P, ;AND RETURN ;ROUTINE TO SEE IF A GIVEN ITEM IS AVAILABLE, AND ALLOCATE CORE ; IF IT IS. CALL WITH THE GETTAB NUMBER IN GT. DBOPTN: PUSHJ P,FETOPT ;IS THIS AVAILABLE? POPJ P, ;NO, DON'T ALLOCATE CORE ; PJRST DBCORE ;FALL THROUGH TO DBCORE ; DBCORE : SETS UP T1 WITH VALUE OF NUMBER OF LOOKS PER REPORT ; AND THEN GOES TO ASSCOR. USED MAINLY TO SET UP ; STANDARD LENGTH DATA BLOCKS FOR SYSTEM TRACKING. ; ALSO SETS UP UP THE WORD POINTED TO BY REGISTER J ; IN THE STANDARD DB FORMAT OF L,,ADDR ; IE. SETS UP DB PTR UPON RETURN FROM ASSCOR DBCORE: MOVE T1,RVAL ;GET LENGTH WANTED FOR DATA BLOCKS AOJ T1, ;ADD ONE EXTRA CELL FOR INCR. PUSHJ P,ASSCOR ;GO THERE, GET CORE TLO T1,L ;MAKE INDEX REG. PTR MOVEM T1,TAB.P(J) ;STASH IT AS WORD PTR TLZ T1,L ;IN CASE A ROUTINE CHECKS POPJ P, ;AND GO HOME ; JOBBLK : FINDS TOTAL NUMBER OF JOBS IN THE SYSTEM (POSSIBLE) ; AND SETS UP A BLOCK OF THAT MANY WORDS. IT THEN ; RETURNS IN T1 A WORD OF THE FORM J,,ADDR ; WHERE ADDR IS THE STARTING ADDRESS OF THE WORD ; NOTE: JOB 0 IS INCLUDED IN THE MAXIMUM JOBBLK: MOVE T1,MAXJOB ;GET MAX NR OF JOBS MOVEI T1,1(T1) ;PLUS ONE FOR NULL JOB PUSHJ P,ASSCOR ;GET A BLOCK OF CORE TLO T1,J ;MAKE AN INDEX REGISTER POPJ P, ;AND RETURN ;*** END OF UTILITY ROUTINES *** > ; END OF SYS CONDITIONAL SUBTTL INDIVIDUAL ROUTINES FOR GATHEREING,INITIA,AND DISPLAY ; ; ROUTINES OF A SPECIFIC NATURE FOR GATHERING INDIVIDUAL ITEMS ; AND FOR SPECIAL CASES WHERE UTILITY ROUTINES WONT WORK ; ; SEE SYSDAT MACRO FOR NAMES,CONVENTIONS IFN SYS, < ;ROUTINE FOR GATHERING CPU0 LOST TIME CP0L%G: MOVX GT, %CVLST ;LOOKUP LOST TIME ; PJRST CPCOMM ;FINISH UP ; OTHER CPU0 ROUTINES ENTER HERE FOR COMMON ACTIONS CPCOMM: PUSHJ P,FETTAB ;DO IT CPCOM2: PUSHJ P,STONXT ;STORE NEXT FOR INCREMENTAL SUB GT,@TAB.P(J) ;MAKE THIS ONE INCREMENTAL PUSHJ P,PRETIC ;MAKE IT A % OF ELAPSED TICS MOVEM GT,@TAB.P(J) ;AND STASH IT POPJ P, ;RETURN, WE ARE DONE ;ROUTINE FOR GATHERING CPU0 IDLE TIME CP0I%G: MOVX GT,%CVNUL PUSHJ P,FETTAB MOVE T1,GT ;SAVE FOR SUBTRACT MOVX GT,%CVLST ;NULL-LOST=IDLE PUSHJ P,FETTAB SUBM T1,GT ;RESULT IN GT PJRST CPCOM2 ;GO TO COMMON PLACE WITH ANSWER ;ROUTINE FOR GATHERING CPU0 OVERHEAD TIME CP0O%G: MOVX GT, %CVOHT ;OVERHEAD TIME PJRST CPCOMM ;DO COMMON CPU STUFF ;ROUTINE FOR GATHERING UUOS PER SECOND CP0U%G: MOVX GT,%CVTUC ;GET PJRST INCSEC ;STORE INCREMENTAL BY SECS ; ROUTINE FOR GATHERING CONTEXT SWITCHES PER SECOND CP0C%G: MOVX GT, %CVTJC ;LOOK UP CONTEXT SWITCHES PJRST INCSEC ;STORE INCREM./SECS ELAPSED ; SECOND PROCESSOR STUFF ; ; INITIALIZE FOR LOST,IDLE,OVERHEAD AND CONTEXT ONLY IF CPU1 EXISTS CP1INI: MOVE T1,NCPU ;[217] # CPUS BUILT FOR CAIGE T1,2 ;CPU1 THERE? POPJ P, ;NO , RETURN PJRST DBCORE ;GET CORE AND RETURN ; ; COMMON STUFF FOR SECOND PROCESSOR CP1I%G: MOVX GT, %CVNUL+2 ;NULL JOB TIME FOR CPU1 PUSHJ P,FETTAB ;GET MOVE T1,GT ;SAVE FOR SUBTRACE MOVX GT,%CVLST+2 ;SAME AS ON CPU0 PUSHJ P,FETTAB SUBM T1,GT PJRST CPCOM2 ;GO TO COMMON ROUTINE, NO GETTAB. ; PRINT IN % ELAPSED TICKS. CP1L%G: MOVX GT, %CVLST+2 ;LOST TIME FOR CPU1 PJRST CPCOMM CP1O%G: MOVX GT, %CVOHT+2 ;OVERHEAD TIME FOR CPU1 PJRST CPCOMM CP1C%G: MOVX GT, %CVTJC+2 ;CONTEXT SWITCHES PJRST INCSEC ;SAME AS FOR CPU0 ;ROUTINE FOR GATHERING UUOS PER SECOND ON CPU1 CP1U%G: MOVX GT,%CVTUC+2 ;UUOS PER SECOND PJRST INCSEC ;PRINT THIS-LAST/ ;[217] THIRD PROCESSOR STUFF ; ; INITIALIZE FOR LOST,IDLE,OVERHEAD AND CONTEXT ONLY IF CPU2 EXISTS CP2INI: MOVE T1,NCPU ;[217] # CPUS BUILT FOR CAIGE T1,3 ;CPU2 THERE? POPJ P, ;NO , RETURN PJRST DBCORE ;GET CORE AND RETURN ; ; COMMON STUFF FOR SECOND PROCESSOR CP2I%G: MOVX GT, %CVNUL+4 ;NULL JOB TIME FOR CPU2 PUSHJ P,FETTAB ;GET MOVE T1,GT ;SAVE FOR SUBTRACE MOVX GT,%CVLST+4 ;SAME AS ON CPU0 PUSHJ P,FETTAB SUBM T1,GT PJRST CPCOM2 ;GO TO COMMON ROUTINE, NO GETTAB. ; PRINT IN % ELAPSED TICKS. CP2L%G: MOVX GT, %CVLST+4 ;LOST TIME FOR CPU2 PJRST CPCOMM CP2O%G: MOVX GT, %CVOHT+4 ;OVERHEAD TIME FOR CPU2 PJRST CPCOMM CP2C%G: MOVX GT, %CVTJC+4 ;CONTEXT SWITCHES PJRST INCSEC ;SAME AS FOR CPU0 ;ROUTINE FOR GATHERING UUOS PER SECOND ON CPU2 CP2U%G: MOVX GT,%CVTUC+4 ;UUOS PER SECOND PJRST INCSEC ;PRINT THIS-LAST/ ;[217] FOURTH PROCESSOR STUFF ; ; INITIALIZE FOR LOST,IDLE,OVERHEAD AND CONTEXT ONLY IF CPU3 EXISTS CP3INI: MOVE T1,NCPU ;[217] # CPUS BUILT FOR CAIGE T1,4 ;CPU3 THERE? POPJ P, ;NO , RETURN PJRST DBCORE ;GET CORE AND RETURN ; ; COMMON STUFF FOR SECOND PROCESSOR CP3I%G: MOVX GT, %CVNUL+6 ;NULL JOB TIME FOR CPU3 PUSHJ P,FETTAB ;GET MOVE T1,GT ;SAVE FOR SUBTRACE MOVX GT,%CVLST+6 ;SAME AS ON CPU0 PUSHJ P,FETTAB SUBM T1,GT PJRST CPCOM2 ;GO TO COMMON ROUTINE, NO GETTAB. ; PRINT IN % ELAPSED TICKS. CP3L%G: MOVX GT, %CVLST+6 ;LOST TIME FOR CPU3 PJRST CPCOMM CP3O%G: MOVX GT, %CVOHT+6 ;OVERHEAD TIME FOR CPU3 PJRST CPCOMM CP3C%G: MOVX GT, %CVTJC+6 ;CONTEXT SWITCHES PJRST INCSEC ;SAME AS FOR CPU0 ;ROUTINE FOR GATHERING UUOS PER SECOND ON CPU3 CP3U%G: MOVX GT,%CVTUC+6 ;UUOS PER SECOND PJRST INCSEC ;PRINT THIS-LAST/ ;[217] FIFTH PROCESSOR STUFF ; ; INITIALIZE FOR LOST,IDLE,OVERHEAD AND CONTEXT ONLY IF CPU4 EXISTS CP4INI: MOVE T1,NCPU ;[217] # CPUS BUILT FOR CAIGE T1,5 ;CPU1 THERE? POPJ P, ;NO , RETURN PJRST DBCORE ;GET CORE AND RETURN ; ; COMMON STUFF FOR FIFTH PROCESSOR CP4I%G: MOVX GT, %CVNUL+10 ;NULL JOB TIME FOR CPU4 PUSHJ P,FETTAB ;GET MOVE T1,GT ;SAVE FOR SUBTRACE MOVX GT,%CVLST+10 ;SAME AS ON CPU0 PUSHJ P,FETTAB SUBM T1,GT PJRST CPCOM2 ;GO TO COMMON ROUTINE, NO GETTAB. ; PRINT IN % ELAPSED TICKS. CP4L%G: MOVX GT, %CVLST+10 ;LOST TIME FOR CPU4 PJRST CPCOMM CP4O%G: MOVX GT, %CVOHT+10 ;OVERHEAD TIME FOR CPU4 PJRST CPCOMM CP4C%G: MOVX GT, %CVTJC+10 ;CONTEXT SWITCHES PJRST INCSEC ;SAME AS FOR CPU0 ;ROUTINE FOR GATHERING UUOS PER SECOND ON CPU4 CP4U%G: MOVX GT,%CVTUC+10 ;UUOS PER SECOND PJRST INCSEC ;PRINT THIS-LAST/ ;[217] SIXTH PROCESSOR STUFF ; ; INITIALIZE FOR LOST,IDLE,OVERHEAD AND CONTEXT ONLY IF CPU5 EXISTS CP5INI: MOVE T1,NCPU ;[217] # CPUS BUILT FOR CAIGE T1,6 ;CPU5 THERE? POPJ P, ;NO , RETURN PJRST DBCORE ;GET CORE AND RETURN ; ; COMMON STUFF FOR SIXTH PROCESSOR CP5I%G: MOVX GT, %CVNUL+12 ;NULL JOB TIME FOR CPU5 PUSHJ P,FETTAB ;GET MOVE T1,GT ;SAVE FOR SUBTRACE MOVX GT,%CVLST+12 ;SAME AS ON CPU0 PUSHJ P,FETTAB SUBM T1,GT PJRST CPCOM2 ;GO TO COMMON ROUTINE, NO GETTAB. ; PRINT IN % ELAPSED TICKS. CP5L%G: MOVX GT, %CVLST+12 ;LOST TIME FOR CPU5 PJRST CPCOMM CP5O%G: MOVX GT, %CVOHT+12 ;OVERHEAD TIME FOR CPU5 PJRST CPCOMM CP5C%G: MOVX GT, %CVTJC+12 ;CONTEXT SWITCHES PJRST INCSEC ;SAME AS FOR CPU0 ;ROUTINE FOR GATHERING UUOS PER SECOND ON CPU5 CP5U%G: MOVX GT,%CVTUC+12 ;UUOS PER SECOND PJRST INCSEC ;PRINT THIS-LAST/ ;ROUTINES FOR SPECIAL KL10 ONLY VARIABLES ; MOST OF THESE ARE ONLY USEFUL ON 1088 SYSTEMS ;ROUTINES TO INITIALIZE, IF NECESSARY CL0INI: PUSHJ P,ISCPKL ;IS CPU A KL10? POPJ P, ;NO, DON'T ALLOCATE ANYTHING PJRST DBCORE ;YES, ALLOCATE DB AND RETURN ;ROUTINE SAME AS CL0INI, EXCEPT CPU1 MUST EXIST TOO. CL1INI: PUSHJ P,ISCPL1 ;IS THIS 1088 SYSTEM? POPJ P, ;NO, RETURN PJRST DBCORE ;YES, ALLOCATE DB AND RETURN ;ROUTINE SAME AS CL0INI, EXCEPT CPU2 MUST EXIST TOO. CL2INI: PUSHJ P,ISCPL2 ;IS THIS SMP SYSTEM? POPJ P, ;NO, RETURN PJRST DBCORE ;YES, ALLOCATE DB AND RETURN ;ROUTINE SAME AS CL0INI, EXCEPT CPU3 MUST EXIST TOO. CL3INI: PUSHJ P,ISCPL3 ;IS THIS SMP SYSTEM? POPJ P, ;NO, RETURN PJRST DBCORE ;YES, ALLOCATE DB AND RETURN ;ROUTINE SAME AS CL0INI, EXCEPT CPU4 MUST EXIST TOO. CL4INI: PUSHJ P,ISCPL4 ;IS THIS SMP SYSTEM? POPJ P, ;NO, RETURN PJRST DBCORE ;YES, ALLOCATE DB AND RETURN ;ROUTINE SAME AS CL0INI, EXCEPT CPU5 MUST EXIST TOO. CL5INI: PUSHJ P,ISCPL5 ;IS THIS SMP SYSTEM? POPJ P, ;NO, RETURN PJRST DBCORE ;YES, ALLOCATE DB AND RETURN ;ROUTINES TO GATHER KL10 CACHE RELATED INFO L0SD%G: MOVX GT,%CVCSD ;NUMBER OF CACHE SWEEP REQ. PJRST INCSEC ;PER SECOND L1LN%G: SKIPA GT,[%CVCLN+2] ;FOR CPU1 L0LN%G: MOVX GT,%CVCLN ;SCHEDULER CACHE SWEEP REQ PJRST INCSEC ;PER SECS ELASPED L1RN%G: SKIPA GT,[%CVCRN+2] L0RN%G: MOVX GT,%CVCRN ;REQ ACTUALLY SWEPT FOR PJRST INCSEC ;PER SECOND L1LT%G: SKIPA GT,[%CVCLT+2] ;FOR CPU1 L0LT%G: MOVX GT,%CVCLT PJRST CPCOMM L1SN%G: SKIPA GT,[%CVCSN+2] ;NUMBER OF CACHE SWEEPS L0SN%G: MOVX GT,%CVCSN ;NUMBER OF CACHE SWEEPS PJRST INCSEC ;PER SECOND ;CPU2 & CPU3 L3LN%G: SKIPA GT,[%CVCLN+6] ;FOR CPU3 L2LN%G: MOVX GT,%CVCLN+4 ;CPU2: SCHEDULER CACHE SWEEP REQ PJRST INCSEC ;PER SECS ELASPED L3RN%G: SKIPA GT,[%CVCRN+6] L2RN%G: MOVX GT,%CVCRN+4 ;REQ ACTUALLY SWEPT FOR PJRST INCSEC ;PER SECOND L3LT%G: SKIPA GT,[%CVCLT+6] ;FOR CPU3 L2LT%G: MOVX GT,%CVCLT+4 ;FOR CPU2 PJRST CPCOMM L3SN%G: SKIPA GT,[%CVCSN+6] ;NUMBER OF CACHE SWEEPS L2SN%G: MOVX GT,%CVCSN+4 ;NUMBER OF CACHE SWEEPS PJRST INCSEC ;PER SECOND ;CPU4 & CPU5 L5LN%G: SKIPA GT,[%CVCLN+12] ;FOR CPU5 L4LN%G: MOVX GT,%CVCLN+10 ;CPU4: SCHEDULER CACHE SWEEP REQ PJRST INCSEC ;PER SECS ELASPED L5RN%G: SKIPA GT,[%CVCRN+12] L4RN%G: MOVX GT,%CVCRN+10 ;REQ ACTUALLY SWEPT FOR PJRST INCSEC ;PER SECOND L5LT%G: SKIPA GT,[%CVCLT+12] ;FOR CPU5 L4LT%G: MOVX GT,%CVCLT+10 ;FOR CPU4 PJRST CPCOMM L5SN%G: SKIPA GT,[%CVCSN+12] ;NUMBER OF CACHE SWEEPS L4SN%G: MOVX GT,%CVCSN+10 ;NUMBER OF CACHE SWEEPS PJRST INCSEC ;PER SECOND ;ROUTINES TO CHECK ON WHETHER OR NOT THIS IS A SINGLE-CPU OR SMP SYSTEM. ; ISCPLn SKIPS IF RUNNING ON n+1 CPU SMP, ISCPKL SKIPS IF RUNNING ON KL10. ; USES T2 ISCPL1: MOVE T2,NCPU ;[217] GET #CPU CAIGE T2,2 ;ANY CPU1 AT ALL? POPJ P, ;NO, CANT BE 1088 ;FALL INTO ISCPKL ISCPKL: MOVE T2,CPUTYP ;GET CPU TYPE CODE CAXN T2,.CCKLX ;IS THIS A KL10? AOS (P) ;YES, SET SKIP RETURN POPJ P, ;RETURN ONE WAY OR THE OTHER ;[217] SAME ROUTINES, FOR CPU2, CPU3, CPU4, CPU5 ISCPL2: MOVE T2,NCPU ;[217] GET #CPU CAIGE T2,3 ;ANY CPU2 AT ALL? POPJ P, ;NO, CANT BE 1088 JRST ISCPKL ISCPL3: MOVE T2,NCPU ;[217] GET #CPU CAIGE T2,4 ;ANY CPU3 AT ALL? POPJ P, ;NO, CANT BE 1088 JRST ISCPKL ISCPL4: MOVE T2,NCPU ;[217] GET #CPU CAIGE T2,5 ;ANY CPU4 AT ALL? POPJ P, ;NO, CANT BE 1088 JRST ISCPKL ISCPL5: MOVE T2,NCPU ;[217] GET #CPU CAIGE T2,6 ;ANY CPU5 AT ALL? POPJ P, ;NO, CANT BE 1088 JRST ISCPKL ; ROUTINE FOR INITIALIZING USER DISK STUFF UDIO%I: PUSHJ P,JOBBLK ;SET UP A JOB TABLE BLOCK MOVEM T1,DIOTAB ;STORE THE J,,ADDR PTR PJRST DBCORE ;SET UP A DATA BLOCK, RETURN ; ROUTINE TO GATHER INCREMENTAL DISK I/O ; FILLS TWO VALUES, INCDIO: GETS DISK BLOCKS SINCE LAST CALL ; INCSWP: GETS DISK BLOCKS SWAPPED ; ; EXPECTS DIOTAB TO POINT TO A BLOCK OF WORDS AS LONG AS # JOBS ; IN SYSTEM, DIOTAB WORD SHOULD HAVE FORM J,,ADDR ; NOTE: ALSO SETS UP INCSWP FOR SWAPPING STATISTICS SO MAKE ; SURE USER DISK IO APPEARS BEFORE SWAPPING IO IN SYSDAT MACRO UDIO%G: PUSH P,J ;SAVE REGISTER J SETZ N2, ;N2 GETS TALLY MOVE J,HIJOB ;J GETS HIGHEST JOB NUMBER ASSIGNED UDILOP: SKIPGE @JOBTB1 ;SEE IF JOB LOGGED IN JRST NODIO ;HE IS NOT MOVSI GT,(J) ;DO A DISK RD/WR GETTAB HRRI GT,.GTRCT ;FIRST READS PUSHJ P,FETTAB ;LOOKING UP LDB T1,DBP ;GET JUST TOTAL MOVSI GT,(J) ;LOOK UP WRITES TOO HRRI GT,.GTWCT ;LOOK UP WRITES PUSHJ P,FETTAB ; LDB GT,DBP ;CLEAR INCREMENTAL ADD GT,T1 ;GET THE TOTAL OF THE TWO MOVE N1,@DIOTAB ;PICK UP LAST SEEN VALUE MOVEM GT,@DIOTAB ;AND STORE NEW ONE CAML GT,N1 ;IS CURRENT VALUE LESS? SUB GT,N1 ;NO, SUBTRACT OLD FROM NEW JUMPN J,DIO1A ;DOING JOB 0? MOVEM GT,INCSWP ;YES, STORE SWAPPED BLOCKS SKIPA ;AND DONT ADD TO USER TOTAL DIO1A: ADD N2,GT ;ADD TO TOTAL DIO1B: SOJGE J,UDILOP ;MORE TO DO? MOVEM N2,INCDIO ;STORE THE NEW VALUE POP P,J ;RESTORE J MOVE GT,INCDIO ;GET USER DISK IO PUSHJ P,DIVSEC ;DIVIDE BY NUMBER OF SECS PASSED SKIPL TAB.P(J) ;MIGHT BE NO DB IF UDIO WAS EXCLUDED MOVEM GT,@TAB.P(J) ;OTHERWISE STORE OBTAINED VALUE POPJ P, ;AND RETURN NODIO: SETZM @DIOTAB ;CLEAR THE LOCATION JRST DIO1B ;AND RE-ENTER LOOP ; ROUTINE TO TAKE SWAPPING IO BLOCKS, DONE BY ABOVE ; AND STORE IN DB AS VALUE/SEC ; NOTE: THIS ROUTINE MUST BE CALLED AFTER UDIO%G SWIO%G: SKIPGE UDIO.P ;WAS USER IO DONE? PUSHJ P,UDIO%G ;NO,MUST CALL IT HERE THEN MOVE GT,INCSWP ;GET SWAPPED VALUE PUSHJ P,DIVSEC ;PER SECOND MOVEM GT,@TAB.P(J) ;DONE POPJ P, SWIO%I: SKIPGE UDIO.P ;DID USER IO GET SET UP? PJRST UDIO%I ;NO,DO IT HERE WHICH SETS UP OUR DB PJRST DBCORE ;OTHERWISE JUST GET A DB ; ROUTINE TO FIND THE NUMBER OF PAGES OF SWAPPING SPACE LEFT SWPS%G: MOVE GT,[%SWVRT] ;GET NUMBER OF PAGES LEFT PUSHJ P,FETTAB ;LOOK IT UP MOVEM GT,@TAB.P(J) ;STORE IT POPJ P, ;RETURN ; ROUTINE TO INITIALIZE A JOB BLOCK AND DB FOR GETTING INCREMENTAL ; USER KCS/SECOND UKCS%I: PUSHJ P,JOBBLK ;GET A JOB BLOCK MOVEM T1,KCSTAB ;STORE IT PJRST DBCORE ;GET DB AND RETURN FROM THERE ; ROUTINE TO GATHER DATA FOR INCREMENTAL KCS UKCS%G: PUSH P,J ;SAVE J MOVE J,HIJOB ;HIGHEST JOB NUMBER SETZ N2, ;N2 IS THE ACCUM VALUE UKLOP: SKIPGE @JOBTB1 ;IF JOB NOT LOGGED IN JRST NOKCS ;SKIP HIM MOVSI GT,(J) ;LOOK UP JOB HRRI GT,.GTKCT ;IN PDB OR VIA GETTAB PUSHJ P,FETTAB MOVE N1,@KCSTAB ;PICK UP OLD VALUE MOVEM GT,@KCSTAB ;STORE NEW VALUE CAML GT,N1 ;NEW LESS THAN OLD? SUB GT,N1 ;NO, SUBTRACT OLD ADD N2,GT ;ADD TO TOTAL UKCS1A: SOJG J,UKLOP ;MORE TO DO? POP P,J ;RESTORE J IDIVI N2,^D60 ;DIVIDE BY 60 TO MAKE KCS FROM KCT MOVE GT,N2 ;GET A VALUE OVER ELAPSED SECONDS PUSHJ P,DIVSEC ; MOVEM GT,@TAB.P(J) ;STORED POPJ P, ;AND RETURN NOKCS: SETZM @KCSTAB ;CLEAR IT JRST UKCS1A ;AND RE-ENTER LOOP ; ROUTINE TO INITIALIZE A JOB BLOCK AND DB FOR GETTING INCREMENTAL ; USER CPU TICKS/SECOND CPUT%I: PUSHJ P,JOBBLK ;GET A JOB BLOCK MOVEM T1,CPTTAB ;STORE IT PJRST DBCORE ;GET DB AND RETURN FROM THERE ; ; ROUTINE TO GATHER DATA FOR INCREMENTAL CPU TICKS CPUT%G: PUSH P,J ;SAVE J MOVE J,HIJOB ;HIGHEST JOB NUMBER SETZ N2, ;N2 IS THE ACCUM VALUE CTLOP: SKIPGE @JOBTB1 ;IF JOB NOT LOGGED IN JRST NOCPT ;SKIP HIM MOVSI GT,(J) ;LOOK UP JOB HRRI GT,.GTTIM ;IN PDB OR VIA GETTAB PUSHJ P,FETTAB MOVE N1,@CPTTAB ;PICK UP OLD VALUE MOVEM GT,@CPTTAB ;STORE NEW VALUE CAML GT,N1 ;NEW LESS THAN OLD? SUB GT,N1 ;NO, SUBTRACT OLD ADD N2,GT ;ADD TO TOTAL CPUT1A: SOJG J,CTLOP ;MORE TO DO? POP P,J ;RESTORE J MOVE GT,N2 ;GET A VALUE OVER ELAPSED SECONDS PUSHJ P,DIVSEC ; MOVEM GT,@TAB.P(J) ;STORED POPJ P, ;AND RETURN NOCPT: SETZM @CPTTAB ;CLEAR IT JRST CPUT1A ;AND RE-ENTER LOOP > ;HERE TO COMPUTE THE 'REAL RESPONSE TIME'. APPLIES THE FOLLOWING ;RELATIONSHIP: (FROM QUEUEING THEORY) ; # OF JOBS IN 'READY TO RUN OR RUNNING' STATE ;RESP = --------------------------------------------------- ; # OF INTERACTIONS (CR'S) PER SECOND OVER INTERVAL ; ; WHICH REDUCES TO: RESP = (READY JOBS)*(PEEK INTERVAL)/(INTERACTIONS) RESP%G: MOVX GT,%CCRSP ;GET OFFSET OF RESP SUB TAB PUSHJ P,FETTAB ;FROM THE MON ADDI GT,%CVRNX ;GET OFFSET INTO RESP TABLE HRLS GT ;INTO LH HRRI GT,.GTC0V ;GET THE VAR TABLE # PUSHJ P,FETTAB ;FROM MON MOVE T1,GT ;SAVE MOVX GT,%SYNCP ;GET # RESP FROM COMMAND LEVEL PUSHJ P,FETTAB ;.. ADD GT,T1 ;TOTAL # OF RESPONSES PUSHJ P,STONXT ;SAVE FOR INCREMENTAL SUB GT,@TAB.P(J) ;GET DIFFERENCE FROM LAST TIME MOVE T1,JOBRN ;GET JOBS IN 'RN' STATE ADD T1,JOBSHR ;ADD JOBS IN SHAR RES WAIT STATE ADD T1,JOBIO ;AND JOBS IN IO WAIT (LESS TTY) IMUL T1,QTUM ;TIMES PEEK INTERVAL IMULI T1,^D1000 ;MAKE IT MILLESEC IDIV T1,GT ;AND DIV BY RESPONSES MOVEM T1,@TAB.P(J) ;STASH FOR REPORTER POPJ P, ; ROUTINE TO GATHER THE AVERAGE RESPONSE TIME OVER EACH TRACK INTERVAL ; BY LOOKING AT THE NON-SWAPPING DATA TABLE AND DIVIDING THE INCREMENTAL ;TIME SPENT WAITING BY THE INCREMENTAL NUMBER OF RESPONSES. ; THE VALUE OBTAINED IS STORED IN MS. FORM IN THE DB ALLOCATED FOR THIS ; PARAMETER. AVRT%G: MOVX GT,%NSNCR ;GET NUMBER OF RESPONSES (TOTAL) PUSHJ P,FETTAB ;FROM THE MONITOR PUSH P,GT ;SAVE IT SUB GT,NSNCRL ;SUBTRACT LAST-SEEN VALUE POP P,NSNCRL ;AND MAKE CURRENT THE LAST SEEN MOVEM GT,T2 ;SAVE FOR THE DIVIDE MOVX GT,%NSACR ;GET THE TOTAL NUMBER OF RESPONSES PUSHJ P,FETTAB ; PUSHJ P,STONXT ;SAVE TOTAL IN CURRENT DB CELL+1 SUB GT,@TAB.P(J) ;AND MAKE (GT) BE INCR. VALUE MOVEM GT,T1 ;READY FOR THE DIVIDE IDIV T1,T2 ;T1 GETS AVG # OF JIFFIES/RESPONSE IMULI T1,^D100 ;CONVERT TO MS. IDIVI T1,^D6 ; MOVEM T1,@TAB.P(J) ;STORE IT POPJ P, ;AND RETURN SUBTTL LOGGED IN JOB ANALYSIS ROUTINE ; DOES ALL THE ANALYSIS FOR ALL JOB RELATED DATA ; SUCH AS ASR , AVE JOB SIZE, WHAT QUEUES JOBS ARE IN ANALYZ: PUSH P,J ;SAVE J MOVE T1,[XWD SEGTAB,SEGTAB+1] ;PREPARE TO ZERO JOB RELATED DATA AREA SETZM SEGTAB ; BLT T1,ACTCOR ;DONE MOVE J,HIJOB ;GET HIGHEST JOB NUMBER ASSIGNED ANAL1: SKIPGE @JOBTB1 ;-1 ENTRY IN JOBTB1 MEANS NOT LOGGED IN JRST NOTACT ;SO SKIP HIM HRRZ T2,@JOBTB1 ;GET HIGH CORE ALLOCATION HLRZ T1,@JOBTB1 ;AND LOW CORE ALLOCATION ADDM T1,TOTCOR ;AND UPDATE TOTAL VIRT CORE IN USE ADDM T2,TOTCOR ;FOR AVERAGE JOB SIZE ADDM T1,SHRCOR ;STORE SHARED CORE PUSHJ P,SEESHR ;SKIPS IF HAVE SEEN THIS HI-SEG ;ALREADY IN DOING SHARED ADDM T2,SHRCOR ;ADD HIGH SEGMENT TOO(MAYBE) HRL T3,@JOBTB2 ;GET (RH) JOBTB2 ENTRY JUMPGE T3,NOTACT ;IF RUN BIT OFF HLRZS T3 ;SWAP HALVES ANDI T3,7777 ;BLANK ALL BUT SIXBIT CODE CAIN T3,'TI' ;IN TI STATE JRST NOTRUN ;MEANS JOB NOT ACTIVE CAIE T3,'SL' ;SLEEPING OR HIBERNATING CAIN T3,'HB' ;MEANS JRST NOTACT ;NOT ACTIVE ADDM T1,ACTCOR ;UPDATE ACTIVE CORE PUSHJ P,SEEACT ;DONT COUNT SHARED SEGMENTS TWICE ADDM T2,ACTCOR ; CAIE T3 ,'RN' ;RUN QUEUE? JRST NOTRUN ;NO AOS JOBRN ;A RUNNING JOB SKIPL @JOBTB2 ;AND IN CORE? AOS JOBRNC ;YES, COUNT HIM AS THAT JRST NOTACT ;DONE WITH HIM NOTRUN: CAIN T3 ,'PI' ;DOING PAGING I/O? JRST YIO ;YES, COUNT HIM AS IN IO CAIE T3 ,'TI' ;TI OR TO IS TTY IO CAIN T3 ,'TO' ;SO COUNT HIM AS THAT AOSA JOBTTY ;UPDATED COUNTER JRST .+2 JRST NOTACT ;IF TTY PERSON, DONE WITH HIM CAIE T3 ,'DI' ;OTHER IO CAIN T3 ,'IO' ;DI OR IO YIO: AOSA JOBIO ;JOBS DOING IO COUNTER JRST .+2 ;STILL HAVE NOT FOUND HIS SLOT JRST NOTACT ;FOUND HIM MOVEI N1,SHRQLN ;NUMBER OF SHARE QUEUE NAMES PACKED ;THREE TO A WORD MOVE N2,[POINT 12,SHRQ] ;BYTE POINTER TO SAME SHRQL: ILDB N3,N2 ;GET A SHARE Q NAME CAMN N3,T3 ;IS IT HIM? AOSA JOBSHR ;YES, FINIS SOJG N1,SHRQL ;NO, SEE IF MORE TO DO NOTACT: SOJG J,ANAL1 ;IF MORE POP P,J ;RESTORE J POPJ P, ;AND RETURN ; THIS ROUTINE IS USED FOR ACCOUNTING FOR SHARED HISEGMENTS ; A BIT MAP IS USED , 1 BIT FOR EACH SEGMENT ; A 0 BIT INDICATES WE HAVE NOT SEEN THIS SEGMENT BEFORE ; A 1 BIT MEANS IT HAS BEEN COUNTED ALREADY. WORDS 0-7 OF SEGTAB ; A THE MAP FOR ALL USERS, WORDS 10-17 ARE FOR ACTIVE USERS SEESHR: SKIPA N1,[XWD N1,SEGTAB] ;INDIRECT WORD TO SEGTAB INDEX BY N1 SEEACT: MOVE N1,[XWD N1,SEGTAB+10] ;INDIRECT WORD FOR ACTIVE USERS MOVEM N1,SEGPTR ;STORE IT JUMPE T2,NOHIC ;IF HAS NO HI-SEG, NO NEED TO ADJUST IT HLRZ N1,@JOBTB2 ;GET HIGH SEGMENT NUMBER TRZ N1,400000 ;CLEAR SWAPPED OUT BIT IDIVI N1,^D36 ;FIND WORD IN SEGMENT BIT MAP MOVE T4 ,@SEGPTR ;GET PROPER WORD MOVEI N3,1 ;READY TO SET UP FOR PARTICULAR BIT LSH N3,(N2) ;DO IT TDOE T4 ,N3 ;READ AND UPDATE BIT MAP AOS (P) ;ALREADY SEEN, TAKE SKIP RETURN MOVEM T4 ,@SEGPTR ;STORE IT BACK NOHIC: POPJ P, ;RETURN SHRQ: STASH(AUMQDACBD1D2DCM1M2T1CAEVJD^D^W) SHRQLN==ZZ/2 ;NUMBER OF QUEUES IN TABLE SUBTTL HANDLE ANALYZED JOB DATA ; ROUTINE TO STORE NUMBER OF JOBS LOGGED IN JLGN%G: MOVE T1,NUMJOB ;GET IT MOVEM T1,@TAB.P(J) ;AND STORE IN APPROPRIATE PLACE POPJ P, ;THEN RETURN ; ROUTINE TO STASH ACTIVE SWAPPING RATIO ACCR%G: MOVE N1,ACTCOR ;GET ACTIVE CORE IN USE ; PHRC%G ENTERS HERE FOR COMMON STUFF CORCOM: IMULI N1,^D1000 ;GET READY TO DIVIDE IDIV N1,USIZ ;SIZE OF USER MEMORY ADDI N1,5 ;ROUND IT IDIVI N1,^D10 ;DONE MOVEM N1,@TAB.P(J) ;DONE AND STASHED POPJ P, ;RETURN ; ROUTINE TO GET SWAPPING RATIO FROM SHRCOR AND USIZ PHCR%G: MOVE N1,SHRCOR ;GET TOTAL CORE IN USE PJRST CORCOM ;DO SAME AS ABOVE ; ROUTINE TO GET AVERAGE JOB SIZE FROM TOTCOR AND NUMJOB AVJS%G: MOVE N1,TOTCOR ;TOTAL CORE IN USE IDIV N1,NUMJOB ;DIVIDE BY NUMBER OF JOBS LSH N2,1 ;MULTIPLY REMAINDER BY 2 CAML N2,NUMJOB ;ROUND UP IF HAVE TO ADDI N1,1 MOVEM N1,@TAB.P(J) ;STORE POPJ P, ;AND RETURN ; ROUTINE TO STASH NUMBER OF JOBS IN RUN QUEUE NRJR%G: MOVE N1,JOBRN ;GET IT MOVEM N1,@TAB.P(J) ;STORE IT POPJ P, ;AND RETURN ; ROUTINE TO GET PERCENT OF JOBS IN RUN QUEUE THAT ARE IN CORE PRJC%G: MOVE N1,JOBRNC ;GET NUMBER OF JOBS IN RUN QUE IN COREUE IMULI N1,^D1000 ;READY TO DIVIDE IDIV N1,JOBRN ;DIVIDE ADDI N1,5 ;ROUND IDIVI N1,^D10 ;DO IT MOVEM N1,@TAB.P(J) ;STORE IT POPJ P, ;AND RETURN ; ROUTINE TO STASH NR OF JOBS IN TTY IO QUEUES TIOW%G: MOVE N1,JOBTTY ;GET NUMBER OF JOBS IN TTY QUEUES MOVEM N1,@TAB.P(J) ;AND STORE IT POPJ P, ;AND RETURN ; ROUTINE TO STASH NUMBER OF JOBS IN OTHER WAIT QUEUES IOW%G: MOVE N1,JOBIO ;PICK UP COUNT AS SEEN BY OTHER ROUTINE MOVEM N1,@TAB.P(J) ;STORE IT POPJ P, ;AND THATS IT ; ROUTINE TO STORE NUMBER OF JOBS SEEN IN SHAREABLE RESOURCE QUEUES JSHQ%G: MOVE N1,JOBSHR ;PICK UP MOVEM N1,@TAB.P(J) ;AND STORE IT POPJ P, ;AND THATS ALL SUBTTL PHYSICAL DISK UNIT ANALYSIS/INITIALIZATION ROUTINES ; HERE WE GO OVER THE LIST POINTED TO BY THE POINTER "UNIPTR" ; AND DISCARD APPROPRIATE UNITS AND SET UP DBS FOR THE OTHERS DISK%I: SKIPN N1,UNIPTR ;GET UNIT POINTER POPJ P, ;IF NONE,NO NEED TO BOTHER MOVSI T2,'DSK' ;MUST HAVE A DISK MOVEM T2,ARGS+.DCNAM ;STORE AS FIRST ARGUMENT MOVE T2,[ARGSLN,,ARGS] ;SET UP FOR DSKCHR DSKCHR T2, ;DO IT POPJ P, ;IF NOT AVAILABLE,SKIP IT SKIPN ARGS+.DCBUM ;CHECK NUMBER OF CYLINDERS POPJ P, ;EXTENDED INFO NOT AVAILABLE MOVE N2,UNIDB ;GET BASE OF DBS DISK.1: MOVE T2,0(N2) ;GET THE STR NAME CAMN T2,[-1] ;IS IT -1 (FIXED HEAD)? JRST DISK.3 ;YES,IGNORE THE DB SETUP SKIPE SDISK ;WANT ONLY SYSTEM DISKS(SDISK=0) JRST DISK.2 ;NO,USE ALL MOVEM T2,ARGS+2 ;STORE AS GOBSTR ARG SETZM ARGS+0 SETZM ARGS+1 MOVE T2,[3,,ARGS] ;SET IT UP GOBSTR T2, ;SEE IF IN SYSTEM S.L. TDZA T1,T1 ;FLAG WITH 0 DB SINCE NOT WANTED DISK.2: PUSHJ P,DBCORE ;GET APPOPRIATE CORE HRRZM T1,0(N2) ;STORE DB ADDRESS DISK.3: AOJ N2, ;INCREMENT DB ADDRESS AOBJN N1,DISK.1 ;LOOP FOR ALL POPJ P, ;THEN RETURN DISK%G: SKIPN N1,UNIPTR ;GET ADDRESS OF POINTERS POPJ P, ;RETURN IF NONE MOVE N2,UNIDB ;GET DB ADDRESS TOO DISG.1: HRRZ N3,0(N2) ;GET DB ADDRESS CAIE N3,0 ;IF 0 OR CAIN N3,-1 ; -1 THEN WE DON'T DO THIS ONE JRST DISG.2 ;ITS EITHER FH OR NON SYS SKIPN (N1) ;IF UNIT IS NULL, SKIPIT JRST DISG.2 ADDI N3,(L) ;UPDATE DB ADDRESS FOR CURRENT LOOK MOVE T1,0(N1) ;GET NAME OF UNIT MOVEM T1,ARGS ;STORE FOR DSKCHR MOVE T1,[ARGSLN,,ARGS] ;SET FOR UUO DSKCHR T1, ;DO IT JRST E$$DUF ;DSCHR UUO FAILED MOVE T1,ARGS+.DCLPQ ;GET LENGTH OF POSITION WAIT Q MOVEM T1,0(N3) ;STORE IT FOR THIS LOOK DISG.2: AOJ N2, ;UPDATE DB POINTER AOBJN N1,DISG.1 ;REPEAT FOR ALL POPJ P, ;THEN RETURN $ERROR(EF.FAT!EF.EXT,DUF,DSKCHR UUO FAILED) ; HERE TO DISPLAY ALL SELECTED DISK UNITS DISK%D: SKIPN N1,UNIPTR ;IF NO UNITS POPJ P, ;RETURN MOVE N2,UNIDB ;BASE OF DB LIST UNIOL: HRRZ T2,0(N2) ;GET DB ADDRESS CAIE T2,0 ;IF ITS 0 OR CAIN T2,-1 ; -1,THEN SKIP THIS ONE JRST UNIFHD ;SKIP STUFF IF FIXED HEAD OR NON-SYS MOVEM T2,TAB.P(J) ;STORE IT AS ADRESS THIS ITEM MOVE T1,0(N1) ;GET UNITS NAME PUSH P,N1 ;SAVE N1 AND N2 ACROSS CALL PUSH P,N2 TYPES () PUSHJ P,SIXPNT ;AND PRINT IT IFN FTTRC,< MOVEM T1,BAUXWD ;STASH NAME FOR TRACE TOO. >; END OF IFN FTTRC PUSHJ P,CRLF PUSHJ P,OUTDBF ;AND PRINT POP P,N2 POP P,N1 ;RESTORE THE ACS UNIFHD: AOJ N2, ;UPDATE POINTER TO DBS AOBJN N1,UNIOL ;LOOP FOR ALL IN LIST POPJ P, ;ELSE RETURN SUBTTL ANALYZE THE CHANNEL DATA ; ROUTINE TO INITIALIZE FOR WATCHING REQUESTS FOR EACH CHANNEL CHAN%I: MOVE N1,UNIPTR ;GET POINTER TO STR NAMES MOVE N2,UNIDB ;GET BASE OF DB LIST SETO N3, ;INITIAL CHANNEL NUMBER CHNI.1: MOVE T2,0(N1) ;GET UNIT NAME JUMPE T2,CHNI.2 ;SKIP IF NULL MOVEM T2,ARGS+.DCNAM ;STORE AS DSKCHR ARG MOVE T2,[ARGSLN,,ARGS] ;GET LENGTH,ADDRESS OF ARG BLOCK DSKCHR T2, ;ASK MONITOR FOR INFO JRST E$$DUF ;IF UNAVAILABLE,COMPLAIN LDB T2,[POINTR(T2,DC.DCN)] ;GET CHANNEL NUMBER CAMN T2,N3 ;SAME AS LAST ONE QUERIED? TDZA T1,T1 ;YES,DON'T SET UP A DB PUSHJ P,DBCORE ;OTHERWISE ALLOCATE CORE HRLM T1,0(N2) ;STORE IN LEFT HALF OF DB LIST MOVEM T2,N3 ;INSURE THAT CHANNEL NR. IS UPDATED CHNI.2: ADDI N2,1 ;UPDATE POINTER AOBJN N1,CHNI.1 ;LOOP FOR ALL UNITS IN LIST POPJ P, ;THEN RETURN ; HERE TO FIND OUT THE LENGTH OF THE XFER WAIT QUEUE FOR EACH CHANNEL ; ON THE SYSTEM. CHAN%G: MOVE N1,UNIPTR ;GET UNIT NAME POINTER MOVE N2,UNIDB ;GET BASE OF DB LIST CHNG.1: HLRZ T1,0(N2) ;GET THIS DBS ADDRESS JUMPE T1,CHNG.2 ;IF NONE SET UP,SKIP THIS ENTRY HLLZ T2,0(N1) ;GET LH OF UNIT NAME (IE KONTROLLER NAME) MOVEM T2,ARGS+.DCNAM ;STORE INTO ARG BLOCK MOVE T2,[ARGSLN,,ARGS] ;L,,A OF ARG BLOCK DSKCHR T2, ;ASK MONITOR FOR DATA JRST E$$DUF ;SHOULDNT FAIL HERE MOVE T2,ARGS+.DCLTQ ;GET LENGTH OF QUEUE ADDI T1,0(L) ;UPDATE TO THIS LOOK MOVEM T2,0(T1) ;AND STORE REPORT VALUE CHNG.2: ADDI N2,1 ;UPDATE DB LIST ADDRESS AOBJN N1,CHNG.1 ;AND LOOP FOR ALL UNITS POPJ P, ;THEN RETURN ; ROUTINE TO PRINT NR OF REQUESTS PER CHANNEL CHAN%D: MOVE N2,UNIPTR ;GET BASE POINTER OF LIST HRR N2,UNIDB ;BUT MAKE IT POINT TO DB'S SETZ N1, ;0 CHANNEL IS FIRST CHND.1: HLRZ T1,0(N2) ;GET DB ENTRY JUMPE T1,CHND.2 ;SKIP IF NULL MOVEM T1,TAB.P(J) ;STORE AS THE ADDRESS PUSH P,N1 ;STORE N1 PUSH P,N2 ;AND N2 ACROSS DBOUT CALL TYPES () MOVE T1,N1 ;GET CHANNEL NUMBER PUSHJ P,OCTOUT ;PRINT IT IFN FTTRC, < MOVEM T1,BAUXWD ;STORE FOR TRACE > ;END OF IFN FTTRC PUSHJ P,CRLF ;PRINT A CR-LF PAIR PUSHJ P,OUTDBF ;FLASH POP P,N2 ;RESTORE N2 POP P,N1 ;RESTORE N1 ADDI N1,1 ;UPDATE THE CHANNEL COUNTER CHND.2: AOBJN N2,CHND.1 ;REPEAT FOR ALL CHANNELS POPJ P, ;THEN RETURN TO CALLER SUBTTL ROUTINE TO DO FREE CORE ANALYSIS PFCU%I: MOVX GT,%CNLOC ;GET FIRST EXEC ADDR USED FOR PUSHJ P,FETTAB ;FREE CORE MOVE T1,SYSSIZ ;TOTAL SYSTEM SIZE SUB T1,GT ;GET SIZE OF FREE CORE LSH T1,-2 ;NR. OF 4 WORD CHUNKS MOVEM T1,TNFCC ;TOTAL NR. OF FREE CORE CHUNKS PJRST DBCORE ;GET DB AND RETURN PFCU%G: MOVX GT,%CNFRU ;GET NR. CHUNKS USED PUSHJ P,FETTAB ; MOVE T1,GT IMULI T1,^D100 ;GET PERCENT OF TOTAL IDIV T1,TNFCC MOVEM T1,@TAB.P(J) ;STORE POPJ P, ;AND RETURN ;ROUTINES TO DO TTY CHUNK USAGE ANALYSIS PTCU%I: MOVX GT,%CNTTC ;NUMBER OF TTY CHUNKS PUSHJ P,FETTAB HLRZM GT,TNTCH ;STORE FOR LATER ; (# CHUNKS IS IN LH) PJRST DBCORE ;GET DB AND RETURN PTCU%G: MOVX GT,%CNTTN ;GET NUMBER OF FREE CHUNKS PUSHJ P,FETTAB MOVE T1,GT ;GET INTO BETTER AC IMULI T1,^D100 ;TURN INTO % FREE IDIV T1,TNTCH MOVEI T2,^D100 ;AND NOW INTO % USED SUB T2,T1 MOVEM T2,@TAB.P(J) ;STORE POPJ P, ;RETURN ; ROUTINE TO GET FROM MONITOR THE NUMBER OF XMT/RCV INTERUPTS FROM SCNSER SRCV%G: SKIPA GT,[%SCNRI] ;SCANNER SERVICE RCV INTERUPTS SXMT%G: MOVX GT,%SCNXI ;SCANNER SERVICE XMT INTERUPTS PJRST INCSEC ;STORE AS PER SECOND SUBTTL SCHEDULER PARAMETERS AVAILABLE WITH 602 SCHEDULER SWPN%I: SKIPA GT,[%SSNUL] ;SEE IF ITS THERE SWPL%I: MOVX GT,%SSLOS ;DITTO PJRST DBOPTN ;DO THE GETTAB, AND CALL DBCORE IF ITS THERE SWPN%G: MOVX GT,%SSNUL ;GET SWAPPER NULL TIME, IN TICKS PJRST CPCOMM ;IT WILL BE PRINTED AS TICKS SWPL%G: MOVX GT,%SSLOS ;GET SWAPPER LOST TIME PJRST CPCOMM ;GO JOIN COMMON % CODE ;REPORT NUMBER OF UNWINDS - TIMES A JOB WAS RUN OUT OF ORDER SWPF%I: SKIPA GT,[%SSOSO] ;TEST FOR EXISTENCE OF NUMBER UNWD%I: MOVX GT,%SSORJ ;DITTO PJRST DBOPTN ;IF GETTAB EXISTS, CALL DBCORE SWPF%G: SKIPA GT,[%SSOSO] UNWD%G: MOVX GT,%SSORJ ;GET UNWIND COUNT PUSHJ P,FETOPT ;GET THE COUNT SETZ GT, ;IGNORE ERROR PUSHJ P,STONXT ;STORE AS NEXT SUBM GT,@TAB.P(J) ;AND MAKE THIS INCREMENTAL POPJ P, ; ; THIS RUN TO METER EXEC TIME-CPU0 EXEC%I: MOVE T1,[XWD 2,PF0A1] ;TO GET METER skipn mbord0 ;user want on this cpu? jrst [setom tab.p(j) setzm pf0a1b POPJ P, ] PERF. T1, ;TRY IT JRST [OUTSTR [ASCIZ/ NOT ABLE TO ALLOCATE PERFORMANCE METER-CPU0 /] SETOM TAB.P(J) ;CLEAR IT SETZM PF0A1B ;TELL MBXR NO GO POPJ P, ;RETURN ] PJRST DBCORE ;SET UP CORE ; ; EXEC%G: MOVE T1,[XWD 1,PF0A3] ;READ METER PERF. T1, ;DO IT POPJ P, ;NOPE GO AWAY ; ; PUSH P,N1 ;SAVE A FEW AC(S) PUSH P,N2 ;DITTO PUSH P,N3 ;DITTO PUSH P,GT ;DITTO ; ; COMPUTE % OF TIME SPEN IN EXEC MODE BASED ON TIME ; BASE INCREMENT FROM PERF BOARD AND EXEC TIME BASE ; INCREMENT FROM PERF BOARD. ; ; NOTE THAT THE ELAPSED TIME ASSUMES A CLOCK RATE OF 1MHZ ; AND THAT THE EXEC TIME BASE ASSUMES A CLOCK RATE OF 1/2 ; THE SYSTEM CLOCK RATE. ; ; FOR OUR SYSTEMS (KL1090-B) THE CLOCK RATE IS 30MHZ. ; THE HALF CLOCK RATE IS 15MHZ. ; SEE THE HARDWARE REF MANUAL ..PERFORMANCE AND ACCOUNTING ; DMOVE T1,PF0A3B+2 ;GET TIME WE FINISHED DSUB T1,PF0A2B+2 ;SUBTRACT ORIGINAL COUNT ASHC T1 ,-^D12 ;ELIMINATE RESERVED FLTR T2,T2 ;FLOAT...SINGLE PRESISION FDVR T2,[EXP 1000000.] ;CONVERT TO SECONDS. ; ; NOW FOR TIME (SECONDS) SPENT IN EXEC MODE PC. ; DMOVE N1,PF0A3B+4 ;GET DURATION IN EXEC DSUB N1,PF0A2B+4 ;SUB FROM ORIG ASHC N1,-^D12 ;ELIMINATE RESERVED BITS FLTR N2,N2 ;FLOAT...SINGLE PRES. FDVR N2,[EXP 15000000.] ;CONVERT TO SECONDS. ; ; NOW FOR THE PERCENTAGE CALULATION. ; FDVR N2,T2 ;EXEC/ELAPSED FMPR N2,[EXP 100.] ;TO % FIXR N2,N2 ;TO INTEGER MOVEM N2,@TAB.P(J) ;FOR TRACK ; ; ALL DONE... ; ;DO STUFF FOR MBOX REFS MOVE T1,MB0ON ;MBOX ON??? JUMPN T1,N0MBX ;NOPE DMOVE T3,PF0A3B+6 ;GET NEW COUNT DSUB T3,PF0A2B+6 ;FROM ORIGINAL ASHC T3,-^D12 ;GET RID OF 00000'S FLTR T4,T4 ;MAKE ARITH EASY TO FOLLOW FDVR T4,[EXP 1000.0] ;CONVERT TO K FDVR T4,T2 ;CONVERT TO K/SEC (PERF TIME BASE) FIXR T4,T4 ;SO TRACK WILL UNDERSTAND MOVEM T4,MB0CT ;SAVE FOR MBXR%G N0MBX: POP P,GT ;RESTORE AC(S) POP P,N3 POP P,N2 POP P,N1 ; MOVE T1,[XWD PF0A3B,PF0A2B] ;BLT SETUP BLT T1,PF0A2B+10 ;MAKE RECENT OLD ; POPJ P, ;RETURN ; ;FUNCTION BLOCKS ; PF0A1: 1,,PF0A1B ;SET PF0A2: 2,,PF0A2B ;START PF0A3: 3,,PF0A3B ;READ ; ;SET FUNCTION ARG LIST ; PF0A1B: 11 ;LENGTH OF BLOCK EXP 1B3 ;YES WE ARE A KL(!) EXP 1B18!1B19 ;CPU0 ,CLEAR AND DURATION MODE 0 ;NO CACHE STUFF Z ;NO PI STUFF EXP 1B0 ;EXEC MODE PC 0 ;NO MICROCODE ENA 0 ;NO PROBE ENABLES 0 ;NO JOB ENABLES 0 ;NO RH20 ENAABLE ;START PF0A2B: EXP 7 ;DATA RETURNED IF OK BLOCK 7 ;READ PF0A3B: EXP 7 ;DATA RETURNED IF OK BLOCK 7 ; ;HERE TO SET UP FOR MBOX REFERENCES COUNTS MBXR%I: MOVE T1,PF0A1B ;IS EXEC ON??? SKIPE T1 ;NOPE JRST [SETZM MB0ON PJRST DBCORE ] OUTSTR [ASCIZ/ NEED PERF BOARD TO GET MBXR-CPU0 /] SETOM TAB.P(J) ;TURN OFF MBXR POPJ P, ; MBXR%G: MOVE GT,MB0CT ;GET COUNT MOVEM GT,@TAB.P(J) ;FOR TRACK POPJ P, MB0CT: 0 MB0ON: -1 ; ; THIS RUN TO METER EXEC TIME-CPU1 EXE1%I: MOVE T1,NCPU ;[217] GET # CPUS skipe mbord1 ;user want board on cpu1? CAIGE T1,2 ;CPU1 EXIST?? JRST [ SETOM TAB.P(J);CLEAR TABLE setzm pf1a1b POPJ P, ;AND RETURN ] ;END LITERAL..NO CPU1 MOVE T1,[XWD 2,PF1A1] ;TO GET METER PERF. T1, ;TRY IT JRST [OUTSTR [ASCIZ/ NOT ABLE TO ALLOCATE PERFORMANCE METER-CPU1 /] SETOM TAB.P(J) ;CLEAR IT SETZM PF1A1B ;TELL MBXR NO GO POPJ P, ;RETURN ] PJRST DBCORE ;SET UP CORE ; ; EXE1%G: MOVE T1,NCPU ;[217] # OF CPUS CAIGE T1,2 ;[217] DOES CPU1 EXIST? POPJ P, ;NO..RETURN MOVE T1,[XWD 1,PF1A3] ;READ METER PERF. T1, ;DO IT POPJ P, ;NOPE GO AWAY ; ; PUSH P,N1 ;SAVE A FEW AC(S) PUSH P,N2 ;DITTO PUSH P,N3 ;DITTO PUSH P,GT ;DITTO ; ; COMPUTE % OF TIME SPEN IN EXEC MODE BASED ON TIME ; BASE INCREMENT FROM PERF BOARD AND EXEC TIME BASE ; INCREMENT FROM PERF BOARD. ; ; NOTE THAT THE ELAPSED TIME ASSUMES A CLOCK RATE OF 1MHZ ; AND THAT THE EXEC TIME BASE ASSUMES A CLOCK RATE OF 1/2 ; THE SYSTEM CLOCK RATE. ; ; FOR OUR SYSTEMS (KL1090-B) THE CLOCK RATE IS 30MHZ. ; THE HALF CLOCK RATE IS 15MHZ. ; SEE THE HARDWARE REF MANUAL ..PERFORMANCE AND ACCOUNTING ; DMOVE T1,PF1A3B+2 ;GET TIME WE FINISHED DSUB T1,PF1A2B+2 ;SUBTRACT ORIGINAL COUNT ASHC T1 ,-^D12 ;ELIMINATE RESERVED FLTR T2,T2 ;FLOAT...SINGLE PRESISION FDVR T2,[EXP 1000000.] ;CONVERT TO SECONDS. ; ; NOW FOR TIME (SECONDS) SPENT IN EXEC MODE PC. ; DMOVE N1,PF1A3B+4 ;GET DURATION IN EXEC DSUB N1,PF1A2B+4 ;SUB FROM ORIG ASHC N1,-^D12 ;ELIMINATE RESERVED BITS FLTR N2,N2 ;FLOAT...SINGLE PRES. FDVR N2,[EXP 15000000.] ;CONVERT TO SECONDS. ; ; NOW FOR THE PERCENTAGE CALULATION. ; FDVR N2,T2 ;EXEC/ELAPSED FMPR N2,[EXP 100.] ;TO % FIXR N2,N2 ;TO INTEGER MOVEM N2,@TAB.P(J) ;FOR TRACK ; ; ALL DONE... ; ;DO STUFF FOR MBOX REFS MOVE T1,MB1ON ;MBOX ON??? JUMPN T1,N1MBX ;NOPE DMOVE T3,PF1A3B+6 ;GET NEW COUNT DSUB T3,PF1A2B+6 ;FROM ORIGINAL ASHC T3,-^D12 ;GET RID OF 00000'S FLTR T4,T4 ;MAKE ARITH EASY TO FOLLOW FDVR T4,[EXP 1000.0] ;CONVERT TO K FDVR T4,T2 ;CONVERT TO K/SEC(PERF TIME BASE) FIXR T4,T4 ;SO TRACK WILL UNDERSTAND MOVEM T4,MB1CT ;SAVE FOR MBXR%G N1MBX: POP P,GT ;RESTORE AC(S) POP P,N3 POP P,N2 POP P,N1 ; MOVE T1,[XWD PF1A3B,PF1A2B] ;BLT SETUP BLT T1,PF1A2B+10 ;MAKE RECENT OLD ; POPJ P, ;RETURN ; ;FUNCTION BLOCKS ; PF1A1: 1,,PF1A1B ;SET PF1A2: 2,,PF1A2B ;START PF1A3: 3,,PF1A3B ;READ ; ;SET FUNCTION ARG LIST ; PF1A1B: 11 ;LENGTH OF BLOCK EXP 1B3 ;YES WE ARE A KL(!) EXP 1B17!1B18!1B19 ;CPU1 ,CLEAR AND DURATION MODE 0 ;NO CACHE STUFF Z ;NO PI STUFF EXP 1B0 ;EXEC MODE PC 0 ;NO MICROCODE ENA 0 ;NO PROBE ENABLES 0 ;NO JOB ENABLES 0 ;NO RH20 ENAABLE ;START PF1A2B: EXP 7 ;DATA RETURNED IF OK OCT 1 ;CPU1 BLOCK 7 ;READ PF1A3B: EXP 7 ;DATA RETURNED IF OK OCT 1 ;CPU1 BLOCK 7 ; ;HERE TO SET UP FOR MBOX REFERENCES COUNTS MBX1%I: MOVE T1,NCPU ;[217] # OF CPUS CAIGE T1,2 ;217] CPU1 EXIST? JRST [ SETOM TAB.P(J);CLEAR TABLE POPJ P, ;AND RETURN ] MOVE T1,PF1A1B ;IS EXEC ON??? SKIPE T1 ;NOPE JRST [SETZM MB1ON PJRST DBCORE ] OUTSTR [ASCIZ/ NEED PERF BOARD TO GET MBXR-CPU1 /] SETOM TAB.P(J) ;TURN OFF MBXR POPJ P, ; MBX1%G: MOVE GT,MB1CT ;GET COUNT MOVEM GT,@TAB.P(J) ;FOR TRACK POPJ P, MB1CT: 0 MB1ON: -1 ;[217] BEGINNING OF PERFORMANCE METER CODE FOR CPU2 ; ; THIS RUN TO METER EXEC TIME-CPU2 EXE2%I: MOVE T1,NCPU ;GET # CPUS skipe mbord2 ;user want board on cpu2? CAIGE T1,3 ;CPU2 EXIST? JRST [ SETOM TAB.P(J);CLEAR TABLE setzm pf2a1b POPJ P, ;AND RETURN ] ;END LITERAL..NO CPU1 MOVE T1,[XWD 2,PF2A1] ;TO GET METER PERF. T1, ;TRY IT JRST [OUTSTR [ASCIZ/ NOT ABLE TO ALLOCATE PERFORMANCE METER-CPU2 /] SETOM TAB.P(J) ;CLEAR IT SETZM PF2A1B ;TELL MBXR NO GO POPJ P, ;RETURN ] PJRST DBCORE ;SET UP CORE ; ; EXE2%G: MOVE T1,NCPU ;[217] GET # CPUS CAIGE T1,1+2 ;[217] CPU2 EXIST? POPJ P, ;NO..RETURN MOVE T1,[XWD 1,PF2A3] ;READ METER PERF. T1, ;DO IT POPJ P, ;NOPE GO AWAY ; ; PUSH P,N1 ;SAVE A FEW AC(S) PUSH P,N2 ;DITTO PUSH P,N3 ;DITTO PUSH P,GT ;DITTO ; ; COMPUTE % OF TIME SPENT IN EXEC MODE BASED ON TIME ; BASE INCREMENT FROM PERF BOARD AND EXEC TIME BASE ; INCREMENT FROM PERF BOARD. ; ; NOTE THAT THE ELAPSED TIME ASSUMES A CLOCK RATE OF 1MHZ ; AND THAT THE EXEC TIME BASE ASSUMES A CLOCK RATE OF 1/2 ; THE SYSTEM CLOCK RATE. ; ; FOR OUR SYSTEMS (KL1090-B) THE CLOCK RATE IS 30MHZ. ; THE HALF CLOCK RATE IS 15MHZ. ; SEE THE HARDWARE REF MANUAL ..PERFORMANCE AND ACCOUNTING ; DMOVE T1,PF2A3B+2 ;GET TIME WE FINISHED DSUB T1,PF2A2B+2 ;SUBTRACT ORIGINAL COUNT ASHC T1 ,-^D12 ;ELIMINATE RESERVED FLTR T2,T2 ;FLOAT...SINGLE PRESISION FDVR T2,[EXP 1000000.] ;CONVERT TO SECONDS. ; ; NOW FOR TIME (SECONDS) SPENT IN EXEC MODE PC. ; DMOVE N1,PF2A3B+4 ;GET DURATION IN EXEC DSUB N1,PF2A2B+4 ;SUB FROM ORIG ASHC N1,-^D12 ;ELIMINATE RESERVED BITS FLTR N2,N2 ;FLOAT...SINGLE PRES. FDVR N2,[EXP 15000000.] ;CONVERT TO SECONDS. ; ; NOW FOR THE PERCENTAGE CALULATION. ; FDVR N2,T2 ;EXEC/ELAPSED FMPR N2,[EXP 100.] ;TO % FIXR N2,N2 ;TO INTEGER MOVEM N2,@TAB.P(J) ;FOR TRACK ; ; ALL DONE... ; ;DO STUFF FOR MBOX REFS MOVE T1,MB2ON ;MBOX ON??? JUMPN T1,N2MBX ;NOPE DMOVE T3,PF2A3B+6 ;GET NEW COUNT DSUB T3,PF2A2B+6 ;FROM ORIGINAL ASHC T3,-^D12 ;GET RID OF 00000'S FLTR T4,T4 ;MAKE ARITH EASY TO FOLLOW FDVR T4,[EXP 1000.0] ;CONVERT TO K FDVR T4,T2 ;CONVERT TO K/SEC(PERF TIME BASE) FIXR T4,T4 ;SO TRACK WILL UNDERSTAND MOVEM T4,MB2CT ;SAVE FOR MBXR%G N2MBX: POP P,GT ;RESTORE AC(S) POP P,N3 POP P,N2 POP P,N1 ; MOVE T1,[XWD PF2A3B,PF2A2B] ;BLT SETUP BLT T1,PF2A2B+10 ;MAKE RECENT OLD ; POPJ P, ;RETURN ; ;FUNCTION BLOCKS ; PF2A1: 1,,PF2A1B ;SET PF2A2: 2,,PF2A2B ;START PF2A3: 3,,PF2A3B ;READ ; ;SET FUNCTION ARG LIST ; PF2A1B: 11 ;LENGTH OF BLOCK EXP 1B3 ;YES WE ARE A KL(!) EXP 2B17!1B18!1B19 ;CPU2 ,CLEAR AND DURATION MODE 0 ;NO CACHE STUFF Z ;NO PI STUFF EXP 1B0 ;EXEC MODE PC 0 ;NO MICROCODE ENA 0 ;NO PROBE ENABLES 0 ;NO JOB ENABLES 0 ;NO RH20 ENAABLE ;START PF2A2B: EXP 7 ;DATA RETURNED IF OK OCT 2 ;CPU2 BLOCK 7 ;READ PF2A3B: EXP 7 ;DATA RETURNED IF OK OCT 2 ;CPU2 BLOCK 7 ; ;HERE TO SET UP FOR MBOX REFERENCES COUNTS MBX2%I: MOVE T1,NCPU ;[217] GET # CPUS CAIGE T1,1+2 ;[217] DOES CPU2 EXIST? JRST [ SETOM TAB.P(J);CLEAR TABLE POPJ P, ;AND RETURN ] MOVE T1,PF2A1B ;IS EXEC ON??? SKIPE T1 ;NOPE JRST [SETZM MB2ON PJRST DBCORE ] OUTSTR [ASCIZ/ NEED PERF BOARD TO GET MBXR-CPU2 /] SETOM TAB.P(J) ;TURN OFF MBXR POPJ P, ; MBX2%G: MOVE GT,MB2CT ;GET COUNT MOVEM GT,@TAB.P(J) ;FOR TRACK POPJ P, MB2CT: 0 MB2ON: -1 ;[217] END OF PERF METER SUPPORT FOR CPU2 ;[217] BEGINNING OF PERFORMANCE METER CODE FOR CPU3 ; ; THIS RUN TO METER EXEC TIME-CPU3 EXE3%I: MOVE T1,NCPU ;GET # CPUS skipe mbord3 ;user want board on cpu3? CAIGE T1,4 ;CPU3 EXIST? JRST [ SETOM TAB.P(J);CLEAR TABLE setzm pf3a1b POPJ P, ;AND RETURN ] ;END LITERAL..NO CPU1 MOVE T1,[XWD 2,PF3A1] ;TO GET METER PERF. T1, ;TRY IT JRST [OUTSTR [ASCIZ/ NOT ABLE TO ALLOCATE PERFORMANCE METER-CPU3 /] SETOM TAB.P(J) ;CLEAR IT SETZM PF3A1B ;TELL MBXR NO GO POPJ P, ;RETURN ] PJRST DBCORE ;SET UP CORE ; ; EXE3%G: MOVE T1,NCPU ;[217] GET # CPUS CAIGE T1,1+3 ;[217] CPU3 EXIST? POPJ P, ;NO..RETURN MOVE T1,[XWD 1,PF3A3] ;READ METER PERF. T1, ;DO IT POPJ P, ;NOPE GO AWAY ; ; PUSH P,N1 ;SAVE A FEW AC(S) PUSH P,N2 ;DITTO PUSH P,N3 ;DITTO PUSH P,GT ;DITTO ; ; COMPUTE % OF TIME SPENT IN EXEC MODE BASED ON TIME ; BASE INCREMENT FROM PERF BOARD AND EXEC TIME BASE ; INCREMENT FROM PERF BOARD. ; ; NOTE THAT THE ELAPSED TIME ASSUMES A CLOCK RATE OF 1MHZ ; AND THAT THE EXEC TIME BASE ASSUMES A CLOCK RATE OF 1/2 ; THE SYSTEM CLOCK RATE. ; ; FOR OUR SYSTEMS (KL1090-B) THE CLOCK RATE IS 30MHZ. ; THE HALF CLOCK RATE IS 15MHZ. ; SEE THE HARDWARE REF MANUAL ..PERFORMANCE AND ACCOUNTING ; DMOVE T1,PF3A3B+2 ;GET TIME WE FINISHED DSUB T1,PF3A2B+2 ;SUBTRACT ORIGINAL COUNT ASHC T1 ,-^D12 ;ELIMINATE RESERVED FLTR T2,T2 ;FLOAT...SINGLE PRESISION FDVR T2,[EXP 1000000.] ;CONVERT TO SECONDS. ; ; NOW FOR TIME (SECONDS) SPENT IN EXEC MODE PC. ; DMOVE N1,PF3A3B+4 ;GET DURATION IN EXEC DSUB N1,PF3A2B+4 ;SUB FROM ORIG ASHC N1,-^D12 ;ELIMINATE RESERVED BITS FLTR N2,N2 ;FLOAT...SINGLE PRES. FDVR N2,[EXP 15000000.] ;CONVERT TO SECONDS. ; ; NOW FOR THE PERCENTAGE CALULATION. ; FDVR N2,T2 ;EXEC/ELAPSED FMPR N2,[EXP 100.] ;TO % FIXR N2,N2 ;TO INTEGER MOVEM N2,@TAB.P(J) ;FOR TRACK ; ; ALL DONE... ; ;DO STUFF FOR MBOX REFS MOVE T1,MB3ON ;MBOX ON??? JUMPN T1,N3MBX ;NOPE DMOVE T3,PF3A3B+6 ;GET NEW COUNT DSUB T3,PF3A2B+6 ;FROM ORIGINAL ASHC T3,-^D12 ;GET RID OF 00000'S FLTR T4,T4 ;MAKE ARITH EASY TO FOLLOW FDVR T4,[EXP 1000.0] ;CONVERT TO K FDVR T4,T2 ;CONVERT TO K/SEC(PERF TIME BASE) FIXR T4,T4 ;SO TRACK WILL UNDERSTAND MOVEM T4,MB3CT ;SAVE FOR MBXR%G N3MBX: POP P,GT ;RESTORE AC(S) POP P,N3 POP P,N2 POP P,N1 ; MOVE T1,[XWD PF3A3B,PF3A2B] ;BLT SETUP BLT T1,PF3A2B+10 ;MAKE RECENT OLD ; POPJ P, ;RETURN ; ;FUNCTION BLOCKS ; PF3A1: 1,,PF3A1B ;SET PF3A2: 2,,PF3A2B ;START PF3A3: 3,,PF3A3B ;READ ; ;SET FUNCTION ARG LIST ; PF3A1B: 11 ;LENGTH OF BLOCK EXP 1B3 ;YES WE ARE A KL(!) EXP 3B17!1B18!1B19 ;CPU3 ,CLEAR AND DURATION MODE 0 ;NO CACHE STUFF Z ;NO PI STUFF EXP 1B0 ;EXEC MODE PC 0 ;NO MICROCODE ENA 0 ;NO PROBE ENABLES 0 ;NO JOB ENABLES 0 ;NO RH20 ENAABLE ;START PF3A2B: EXP 7 ;DATA RETURNED IF OK OCT 3 ;CPU3 BLOCK 7 ;READ PF3A3B: EXP 7 ;DATA RETURNED IF OK OCT 3 ;CPU3 BLOCK 7 ; ;HERE TO SET UP FOR MBOX REFERENCES COUNTS MBX3%I: MOVE T1,NCPU ;[217] GET # CPUS CAIGE T1,1+3 ;[217] DOES CPU3 EXIST? JRST [ SETOM TAB.P(J);CLEAR TABLE POPJ P, ;AND RETURN ] MOVE T1,PF3A1B ;IS EXEC ON??? SKIPE T1 ;NOPE JRST [SETZM MB3ON PJRST DBCORE ] OUTSTR [ASCIZ/ NEED PERF BOARD TO GET MBXR-CPU3 /] SETOM TAB.P(J) ;TURN OFF MBXR POPJ P, ; MBX3%G: MOVE GT,MB3CT ;GET COUNT MOVEM GT,@TAB.P(J) ;FOR TRACK POPJ P, MB3CT: 0 MB3ON: -1 ;[217] END OF PERF METER SUPPORT FOR CPU3 ;[217] BEGINNING OF PERFORMANCE METER CODE FOR CPU4 ; ; THIS RUN TO METER EXEC TIME-CPU4 EXE4%I: MOVE T1,NCPU ;GET # CPUS skipe mbord4 ;user want board on cpu4? CAIGE T1,5 ;CPU4 EXIST? JRST [ SETOM TAB.P(J);CLEAR TABLE setzm pf4a1b POPJ P, ;AND RETURN ] ;END LITERAL..NO CPU1 MOVE T1,[XWD 2,PF4A1] ;TO GET METER PERF. T1, ;TRY IT JRST [OUTSTR [ASCIZ/ NOT ABLE TO ALLOCATE PERFORMANCE METER-CPU4 /] SETOM TAB.P(J) ;CLEAR IT SETZM PF4A1B ;TELL MBXR NO GO POPJ P, ;RETURN ] PJRST DBCORE ;SET UP CORE ; ; EXE4%G: MOVE T1,NCPU ;[217] GET # CPUS CAIGE T1,1+4 ;[217] CPU4 EXIST? POPJ P, ;NO..RETURN MOVE T1,[XWD 1,PF4A3] ;READ METER PERF. T1, ;DO IT POPJ P, ;NOPE GO AWAY ; ; PUSH P,N1 ;SAVE A FEW AC(S) PUSH P,N2 ;DITTO PUSH P,N3 ;DITTO PUSH P,GT ;DITTO ; ; COMPUTE % OF TIME SPENT IN EXEC MODE BASED ON TIME ; BASE INCREMENT FROM PERF BOARD AND EXEC TIME BASE ; INCREMENT FROM PERF BOARD. ; ; NOTE THAT THE ELAPSED TIME ASSUMES A CLOCK RATE OF 1MHZ ; AND THAT THE EXEC TIME BASE ASSUMES A CLOCK RATE OF 1/2 ; THE SYSTEM CLOCK RATE. ; ; FOR OUR SYSTEMS (KL1090-B) THE CLOCK RATE IS 30MHZ. ; THE HALF CLOCK RATE IS 15MHZ. ; SEE THE HARDWARE REF MANUAL ..PERFORMANCE AND ACCOUNTING ; DMOVE T1,PF4A3B+2 ;GET TIME WE FINISHED DSUB T1,PF4A2B+2 ;SUBTRACT ORIGINAL COUNT ASHC T1 ,-^D12 ;ELIMINATE RESERVED FLTR T2,T2 ;FLOAT...SINGLE PRESISION FDVR T2,[EXP 1000000.] ;CONVERT TO SECONDS. ; ; NOW FOR TIME (SECONDS) SPENT IN EXEC MODE PC. ; DMOVE N1,PF4A3B+4 ;GET DURATION IN EXEC DSUB N1,PF4A2B+4 ;SUB FROM ORIG ASHC N1,-^D12 ;ELIMINATE RESERVED BITS FLTR N2,N2 ;FLOAT...SINGLE PRES. FDVR N2,[EXP 15000000.] ;CONVERT TO SECONDS. ; ; NOW FOR THE PERCENTAGE CALULATION. ; FDVR N2,T2 ;EXEC/ELAPSED FMPR N2,[EXP 100.] ;TO % FIXR N2,N2 ;TO INTEGER MOVEM N2,@TAB.P(J) ;FOR TRACK ; ; ALL DONE... ; ;DO STUFF FOR MBOX REFS MOVE T1,MB4ON ;MBOX ON??? JUMPN T1,N4MBX ;NOPE DMOVE T3,PF4A3B+6 ;GET NEW COUNT DSUB T3,PF4A2B+6 ;FROM ORIGINAL ASHC T3,-^D12 ;GET RID OF 00000'S FLTR T4,T4 ;MAKE ARITH EASY TO FOLLOW FDVR T4,[EXP 1000.0] ;CONVERT TO K FDVR T4,T2 ;CONVERT TO K/SEC(PERF TIME BASE) FIXR T4,T4 ;SO TRACK WILL UNDERSTAND MOVEM T4,MB4CT ;SAVE FOR MBXR%G N4MBX: POP P,GT ;RESTORE AC(S) POP P,N3 POP P,N2 POP P,N1 ; MOVE T1,[XWD PF4A3B,PF4A2B] ;BLT SETUP BLT T1,PF4A2B+10 ;MAKE RECENT OLD ; POPJ P, ;RETURN ; ;FUNCTION BLOCKS ; PF4A1: 1,,PF4A1B ;SET PF4A2: 2,,PF4A2B ;START PF4A3: 3,,PF4A3B ;READ ; ;SET FUNCTION ARG LIST ; PF4A1B: 11 ;LENGTH OF BLOCK EXP 1B3 ;YES WE ARE A KL(!) EXP 4B17!1B18!1B19 ;CPU4 ,CLEAR AND DURATION MODE 0 ;NO CACHE STUFF Z ;NO PI STUFF EXP 1B0 ;EXEC MODE PC 0 ;NO MICROCODE ENA 0 ;NO PROBE ENABLES 0 ;NO JOB ENABLES 0 ;NO RH20 ENAABLE ;START PF4A2B: EXP 7 ;DATA RETURNED IF OK OCT 4 ;CPU4 BLOCK 7 ;READ PF4A3B: EXP 7 ;DATA RETURNED IF OK OCT 4 ;CPU4 BLOCK 7 ; ;HERE TO SET UP FOR MBOX REFERENCES COUNTS MBX4%I: MOVE T1,NCPU ;[217] GET # CPUS CAIGE T1,1+4 ;[217] DOES CPU4 EXIST? JRST [ SETOM TAB.P(J);CLEAR TABLE POPJ P, ;AND RETURN ] MOVE T1,PF4A1B ;IS EXEC ON??? SKIPE T1 ;NOPE JRST [SETZM MB4ON PJRST DBCORE ] OUTSTR [ASCIZ/ NEED PERF BOARD TO GET MBXR-CPU4 /] SETOM TAB.P(J) ;TURN OFF MBXR POPJ P, ; MBX4%G: MOVE GT,MB4CT ;GET COUNT MOVEM GT,@TAB.P(J) ;FOR TRACK POPJ P, MB4CT: 0 MB4ON: -1 ;[217] END OF PERF METER SUPPORT FOR CPU4 ;[217] BEGINNING OF PERFORMANCE METER CODE FOR CPU5 ; ; THIS RUN TO METER EXEC TIME-CPU5 EXE5%I: MOVE T1,NCPU ;GET # CPUS skipe mbord5 ;user want board on cpu5? CAIGE T1,6 ;CPU5 EXIST? JRST [ SETOM TAB.P(J);CLEAR TABLE setzm pf5a1b POPJ P, ;AND RETURN ] ;END LITERAL..NO CPU1 MOVE T1,[XWD 2,PF5A1] ;TO GET METER PERF. T1, ;TRY IT JRST [OUTSTR [ASCIZ/ NOT ABLE TO ALLOCATE PERFORMANCE METER-CPU5 /] SETOM TAB.P(J) ;CLEAR IT SETZM PF5A1B ;TELL MBXR NO GO POPJ P, ;RETURN ] PJRST DBCORE ;SET UP CORE ; ; EXE5%G: MOVE T1,NCPU ; GET # CPUS CAIGE T1,1+5 ; CPU5 EXIST? POPJ P, ;NO..RETURN MOVE T1,[XWD 1,PF5A3] ;READ METER PERF. T1, ;DO IT POPJ P, ;NOPE GO AWAY ; ; PUSH P,N1 ;SAVE A FEW AC(S) PUSH P,N2 ;DITTO PUSH P,N3 ;DITTO PUSH P,GT ;DITTO ; ; COMPUTE % OF TIME SPENT IN EXEC MODE BASED ON TIME ; BASE INCREMENT FROM PERF BOARD AND EXEC TIME BASE ; INCREMENT FROM PERF BOARD. ; ; NOTE THAT THE ELAPSED TIME ASSUMES A CLOCK RATE OF 1MHZ ; AND THAT THE EXEC TIME BASE ASSUMES A CLOCK RATE OF 1/2 ; THE SYSTEM CLOCK RATE. ; ; FOR OUR SYSTEMS (KL1090-B) THE CLOCK RATE IS 30MHZ. ; THE HALF CLOCK RATE IS 15MHZ. ; SEE THE HARDWARE REF MANUAL ..PERFORMANCE AND ACCOUNTING ; DMOVE T1,PF5A3B+2 ;GET TIME WE FINISHED DSUB T1,PF5A2B+2 ;SUBTRACT ORIGINAL COUNT ASHC T1 ,-^D12 ;ELIMINATE RESERVED FLTR T2,T2 ;FLOAT...SINGLE PRESISION FDVR T2,[EXP 1000000.] ;CONVERT TO SECONDS. ; ; NOW FOR TIME (SECONDS) SPENT IN EXEC MODE PC. ; DMOVE N1,PF5A3B+4 ;GET DURATION IN EXEC DSUB N1,PF5A2B+4 ;SUB FROM ORIG ASHC N1,-^D12 ;ELIMINATE RESERVED BITS FLTR N2,N2 ;FLOAT...SINGLE PRES. FDVR N2,[EXP 15000000.] ;CONVERT TO SECONDS. ; ; NOW FOR THE PERCENTAGE CALULATION. ; FDVR N2,T2 ;EXEC/ELAPSED FMPR N2,[EXP 100.] ;TO % FIXR N2,N2 ;TO INTEGER MOVEM N2,@TAB.P(J) ;FOR TRACK ; ; ALL DONE... ; ;DO STUFF FOR MBOX REFS MOVE T1,MB5ON ;MBOX ON??? JUMPN T1,N5MBX ;NOPE DMOVE T3,PF5A3B+6 ;GET NEW COUNT DSUB T3,PF5A2B+6 ;FROM ORIGINAL ASHC T3,-^D12 ;GET RID OF 00000'S FLTR T4,T4 ;MAKE ARITH EASY TO FOLLOW FDVR T4,[EXP 1000.0] ;CONVERT TO K FDVR T4,T2 ;CONVERT TO K/SEC(PERF TIME BASE) FIXR T4,T4 ;SO TRACK WILL UNDERSTAND MOVEM T4,MB5CT ;SAVE FOR MBXR%G N5MBX: POP P,GT ;RESTORE AC(S) POP P,N3 POP P,N2 POP P,N1 ; MOVE T1,[XWD PF5A3B,PF5A2B] ;BLT SETUP BLT T1,PF5A2B+10 ;MAKE RECENT OLD ; POPJ P, ;RETURN ; ;FUNCTION BLOCKS ; PF5A1: 1,,PF5A1B ;SET PF5A2: 2,,PF5A2B ;START PF5A3: 3,,PF5A3B ;READ ; ;SET FUNCTION ARG LIST ; PF5A1B: 11 ;LENGTH OF BLOCK EXP 1B3 ;YES WE ARE A KL(!) EXP 5B17!1B18!1B19 ;CPU5 ,CLEAR AND DURATION MODE 0 ;NO CACHE STUFF Z ;NO PI STUFF EXP 1B0 ;EXEC MODE PC 0 ;NO MICROCODE ENA 0 ;NO PROBE ENABLES 0 ;NO JOB ENABLES 0 ;NO RH20 ENAABLE ;START PF5A2B: EXP 7 ;DATA RETURNED IF OK OCT 5 ;CPU5 BLOCK 7 ;READ PF5A3B: EXP 7 ;DATA RETURNED IF OK OCT 5 ;CPU5 BLOCK 7 ; ;HERE TO SET UP FOR MBOX REFERENCES COUNTS MBX5%I: MOVE T1,NCPU ;GET # CPUS CAIGE T1,1+5 ;DOES CPU5 EXIST? JRST [ SETOM TAB.P(J);CLEAR TABLE POPJ P, ;AND RETURN ] MOVE T1,PF5A1B ;IS EXEC ON??? SKIPE T1 ;NOPE JRST [SETZM MB5ON PJRST DBCORE ] OUTSTR [ASCIZ/ NEED PERF BOARD TO GET MBXR-CPU5 /] SETOM TAB.P(J) ;TURN OFF MBXR POPJ P, ; MBX5%G: MOVE GT,MB5CT ;GET COUNT MOVEM GT,@TAB.P(J) ;FOR TRACK POPJ P, MB5CT: 0 MB5ON: -1 ; END OF PERF METER SUPPORT FOR CPU5 ;SCDPER DATA ;SEE SCHED1.MAC SCDPER: ;FOR USE IN 603+SCHED LIR OR 603.A + MONITORS ; SDGS%I: MOVE GT,[%SPDGS] ;DTA GEN SLEEPS PJRST DBOPTN SDGS%G: MOVE GT,[%SPDGS] PJRST SIMINC ; SMGS%I: MOVE GT,[%SPMGS] ;MTA GEN SLEEPS PJRST DBOPTN SMGS%G: MOVE GT,[%SPMGS] PJRST SIMINC ; SEWS%I: MOVE GT,[%SPEWS] ;EVENT WAIT SATIS. PJRST DBOPTN SEWS%G: MOVE GT,[%SPEWS] PJRST SIMINC ; STIS%I: MOVE GT,[%SPTIS] ;TTY INP WAIT SATIS. PJRST DBOPTN STIS%G: MOVE GT,[%SPTIS] PJRST SIMINC ; STOS%I: MOVE GT,[%SPTOS] ;TTY OUTPUT SATIS. PJRST DBOPTN STOS%G: MOVE GT,[%SPTOS] PJRST SIMINC ; SPIS%I: MOVE GT,[%SPPIS] ;PTY INPUT SATIS. PJRST DBOPTN SPIS%G: MOVE GT,[%SPPIS] PJRST SIMINC ; SPOS%I: MOVE GT,[%SPPOS] ;PTY OUTPUT SATIS. PJRST DBOPTN SPOS%G: MOVE GT,[%SPPOS] PJRST SIMINC ; SRS1%I: MOVE GT,[%SPRS1] ;SS TO PQ1 REQ PJRST DBOPTN SRS1%G: MOVE GT,[%SPRS1] PJRST SIMINC ; SRW1%I: MOVE GT,[%SPRW1] ;WAKE TO PQ1 REQ PJRST DBOPTN SRW1%G: MOVE GT,[%SPRW1] PJRST SIMINC ; SRD1%I: MOVE GT,[%SPRD1] ;JD WAIT SATIS TO PQ1 REQ PJRST DBOPTN SRD1%G: MOVE GT,[%SPRD1] PJRST SIMINC ; SRO1%I: MOVE GT,[%SPRO1] ;OTHER TO PQ1 REQ PJRST DBOPTN SRO1%G: MOVE GT,[%SPRO1] PJRST SIMINC ; SQR1%I: MOVE GT,[%SPQR1] ;PQ1 QUANTUM EXPIRE PJRST DBOPTN SQR1%G: MOVE GT,[%SPQR1] PJRST SIMINC ; SQR2%I: MOVE GT,[%SPQR2] ;PQ2 QUANTUM EXPIRE PJRST DBOPTN SQR2%G: MOVE GT,[%SPQR2] PJRST SIMINC ; SQRH%I: MOVE GT,[%SPQRH] ;HPQ QUANTUM EXPIRE PJRST DBOPTN SQRH%G: MOVE GT,[%SPQRH] PJRST SIMINC ; SIP1%I: MOVE GT,[%SPIP1] ;PQ1 ICPT EXPIRE PJRST DBOPTN SIP1%G: MOVE GT,[%SPIP1] PJRST SIMINC ; SIP2%I: MOVE GT,[%SPIP2] ;PQ2 ICPT EXPIRE PJRST DBOPTN SIP2%G: MOVE GT,[%SPIP2] PJRST SIMINC ; SIPH%I: MOVE GT,[%SPIPH] ;HPQ ICPT EXPIRE PJRST DBOPTN SIPH%G: MOVE GT,[%SPIPH] PJRST SIMINC ; SKS1%I: MOVE GT,[%SPKS1] ;SWAP IN K PQ1 PJRST DBOPTN SKS1%G: MOVE GT,[%SPKS1] PJRST SIMINC ; SKS2%I: MOVE GT,[%SPKS2] ;SWAP IN K PQ2 PJRST DBOPTN SKS2%G: MOVE GT,[%SPKS2] PJRST SIMINC ; SKSH%I: MOVE GT,[%SPKSH] ;SWAP IN K HPQ PJRST DBOPTN SKSH%G: MOVE GT,[%SPKSH] PJRST SIMINC ; SNJ1%I: MOVE GT,[%SPNJ1] ;PQ1 JOBS SWAPPED IN PJRST DBOPTN SNJ1%G: MOVE GT,[%SPNJ1] PJRST SIMINC ; SNJ2%I: MOVE GT,[%SPNJ2] ;PQ2 JOBS SWAPPED IN PJRST DBOPTN SNJ2%G: MOVE GT,[%SPNJ2] PJRST SIMINC ; SNJH%I: MOVE GT,[%SPNJH] ;HPQ JOBS SWAPPED IN PJRST DBOPTN SNJH%G: MOVE GT,[%SPNJH] PJRST SIMINC ; ; EBOX/MBOX SINCE HI PRES ACCOUTING USED ...SEE CLOCK1.MAC STC1%I: MOVE GT,[%SPTC1] ;PQ1 EBOX/MBOX TICKS PJRST DBOPTN STC1%G: MOVE GT,[%SPTC1] PJRST SIMINC STC2%I: MOVE GT,[%SPTC2] ;PQ2 EBOX/MBOX TICKS PJRST DBOPTN STC2%G: MOVE GT,[%SPTC2] PJRST SIMINC ; STCH%I: MOVE GT,[%SPTCH] ;HPQ EBOX/MBOX TICKS PJRST DBOPTN STCH%G: MOVE GT,[%SPTCH] PJRST SIMINC ; ; NOW FOR THE WASTED CORE STUFF. ; WASK%I: MOVE GT,[%SPMWC] ;# OF MEASUREMENTS PUSHJ P,FETTAB ;NON OPTIONAL MOVEM GT,WASK%C ;# OF MEASUREMEMTS. MOVE GT,[%SPSWC] ;SUM OF WASTED PAGES PUSHJ P,FETTAB ;NON OPTIONAL MOVEM GT,WASK%P ;PAGES PJRST DBCORE ;ALLOCATE CORE. ; ;INCREMETAL DATA COLLECTION ; WASK%G: MOVE GT,[%SPMWC] ;# OF MEASUREMENTS PUSHJ P,FETTAB ;NON OPTIONAL MOVEM GT,WASK%D ;NEW COUNT...SAVE IT MOVE GT,[%SPSWC] ;SUM OF WASTED PAGES PUSHJ P,FETTAB ;NON OPTIONAL MOVEM GT,WASK%Q ;NEW SUM OF PAGES ; ; SAVE A FEW AC(S) ; PUSH P,N1 PUSH P,N2 ; MOVE N1,WASK%P ;PREVIOUS PAGES MOVE N2,WASK%C ;PREVIOUS COUNT SUBM GT,N1 ;INCREMENTAL PAGES .. N1 MOVE GT,WASK%D ;NEW COUNT SUBM GT,N2 ;INCREMENTAL COUNT FLTR N1,N1 ;MAKE THE ARITMETIC FLTR N2,N2 ;EASY TO DO FDVR N1,N2 ;INC PAGES/INC COUNT FIXR N1,N1 ;SO TRACK WILL UNDERSTAND MOVE GT,N1 ;FOR STONXT ; ; RESTORE N1 & N2 ; POP P,N1 POP P,N2 PUSHJ P,STONXT ;STORE IN NEXT CELL ; MOVE GT,WASK%D ;MAKE RECENT OLD MOVEM GT,WASK%C ;COUNT... MOVE GT,WASK%Q ;MAKE RECENT OLD MOVEM GT,WASK%P ;PAGES POPJ P, ;EXIT/RETURN ; ; ;THE FUNNY LITTLE DATA BASE ; WASK%C: Z WASK%P: Z WASK%D: Z WASK%Q: Z ; ; NOW FOR CMQ/PQ1 SWAP IN RESPONSE TIME ; CPSI%I: MOVE GT,[%SPNRS] ;# OF RESPONSES CMQ/PQ1 SWAP IN PUSHJ P,FETTAB ;NON OPTIONAL MOVEM GT,CPSI%R ;# OF RESPONSES. MOVE GT,[%SPNTS] ;TOTAL TICKS PUSHJ P,FETTAB ;NON OPTIONAL MOVEM GT,CPSI%T ;TICKS PJRST DBCORE ;ALLOCATE CORE. ; ;INCREMETAL DATA COLLECTION ; CPSI%G: MOVE GT,[%SPNRS] ;# OF RESPONSES PUSHJ P,FETTAB ;NON OPTIONAL MOVEM GT,CPSI%S ;NEW RESPONSE COUNT...SAVE IT MOVE GT,[%SPNTS] ;SUM OF TICKS PUSHJ P,FETTAB ;NON OPTIONAL MOVEM GT,CPSI%U ;NEW TICK VALUE ; ; SAVE A FEW AC(S) ; PUSH P,N1 PUSH P,N2 ; MOVE N1,CPSI%T ;PREVIOUS TICKS MOVE N2,CPSI%R ;PREVIOUS COUNT OF RESPONSES SUBM GT,N1 ;INCREMENTAL TICKS .. N1 MOVE GT,CPSI%S ;NEW COUNT OF RESPONSES SUBM GT,N2 ;INCREMENTAL COUNT FLTR N1,N1 ;MAKE THE ARITMETIC FLTR N2,N2 ;EASY TO DO FDVR N1,N2 ;TICKS/RESPONSES. FIXR N1,N1 ;SO TRACK WILL UNDERSTAND MOVE GT,N1 ;FOR STONXT ; ; RESTORE N1 & N2 ; POP P,N1 POP P,N2 PUSHJ P,STONXT ;STORE IN NEXT CELL ; MOVE GT,CPSI%S ;MAKE RECENT OLD MOVEM GT,CPSI%R ;COUNT OF RESPONSES... MOVE GT,CPSI%U ;MAKE RECENT OLD MOVEM GT,CPSI%T ;TICKS POPJ P, ;EXIT/RETURN ; ; ;THE FUNNY LITTLE DATA BASE ; CPSI%R: Z CPSI%T: Z CPSI%S: Z CPSI%U: Z ; ;** END OF INDIVIDUAL ROUTINES *** SUBTTL DATA AREA ;TABLE OF FIELD LENGTHS FOR POSITIONING ROUTINE ; NOTE : LENGTH OF HIGH CORE FIELD IS FOR BOTH HIGH AND LOW ; DEFINE X(A,B,C) < IFN B, > SPATAB: DATUMS %NUMFL==.-SPATAB ; HERE WE MAKE A TABLE OF 12 MONTHS FOR THE SYSDAT MODULE DEFINE X(AA), > MONTAB: X ; AND MAKE A DAY TABLE TOO DAYTAB: SIXBIT/(WED)/ SIXBIT/(THUR)/ SIXBIT/(FRI)/ SIXBIT/(SAT)/ SIXBIT/(SUN)/ SIXBIT/(MON)/ SIXBIT/(TUES)/ ; HERE WE DEFINE THE PURE TABLES FOR THE SYSDAT MODULE IFN SYS, < ; NOW IS THE VARIANCE TABLE, FOR EACH ITEM IT CONTAINS THE RANGE ; OVER WHICH WE MAY GROUP ITEMS TOGETHER FOR THE "PERCENT OF TOTAL ; IN THE RANGE X TO Y" ROUTINE (OUTDB?) ; DEFINE THIS AS 1 IF EACH POINT IS TO BE DISCRETE ; EACH ENTRY HAS THE FORM : XXXX.V: EXP VARIANCE THIS ITEM ; DEFINE X(AA,BB,CC,DD,EE,FF)< BB'.V: IFG FF, IFLE FF, > TAB.V: SYSDAT LEN.V==.-TAB.V ; HERE WE HAVE THE TABLE OF INITIALIZING ROUTINES ; THEY ARE CALLED ONCE , WHEN WE FIRST GO INTO THE SYSDAT MODULE ; THEY SET UP POINTERS, PERHAPS GET FIXED ADDRESSES TO AVOID GETTABS,ETC ; THIS TABLE CONTAINS THE ADDRESS OF THE INITIALIZING ROUTINES ; A ZERO ENTRY INDICATES NO ROUTINE ; NOTE: THESE ROUTINES CALL ASSCOR AND SET UP THE DATA BLOCKS ; DEFINE X(AA,BB,CC,DD,EE,FF)< BB'.I: EXP CC > TAB.I: SYSDAT LEN.I==.-TAB.I ; HERE WE DEFINE TABLE OF ADDRESSES FOR GATHERING DATA ROUTINES ; ; EACH ENTRY IS THE ADDRESS OF A ROUTINE FOR PUSHING TO , TO GET ; DATA ON EACH LOOK. ROUTINES FOR INITIALIZING,GETTING AND DISPLAYING ; SHOULD ALL END WITH A POPJ TO RETURN. ; AS WITH INITIALIZING, A ZERO ENTRY MEANS NO ROUTINE IS TO BE DONE ; ; EACH ENTRY IS OF THE FORM: XXXX.G: EXP GATHER ROUTINE DEFINE X(AA,BB,CC,DD,EE,FF)< BB'.G: EXP DD > TAB.G: SYSDAT LEN.G==.-TAB.G ; HERE WE MAKE THE TABLE OF POINTERS TO DATUM LABELS ; IT IS OF THE FORM XXXX.N: 0,,ADDR LABEL IN ASCIZ DEFINE X(AA,BB,CC,DD,EE,FF)< IFDIF <0>,< BB'.N: [ASCIZ\AA\] > IFIDN <0>,< BB'.N: EXP 0>> TAB.N: SYSDAT LEN.N==.-TAB.N ; FINALLY, WE DEFINE A TABLE CONTAINING THE ADDRESSES OF THE OUTPUT ; ROUTINES. EACH ENTRY IS A POINTER TO A ROUTINE TO DO A PRINTOUT ; OF THE DATA BLOCK. SEE THE CODE FOR A DESCRIPTION OF AVAILABLE ; ROUTINES. ; ; EACH ENTRY IS OF THE FORM XXXX.D: EXP PRINT ROUTINE ; ; A ZERO ENTRY IS OF COURSE AN INSTRUCTION TO DO NO DISPLAYING OF THE ; ITEM DEFINE X(AA,BB,CC,DD,EE,FF)< BB'.D: EXP EE > TAB.D: SYSDAT LEN.D==.-TAB.D ; FORM A TABLE OF 4 LETTER SIXBIT CODES , 1 FOR EACH ; ITEM. THE TABLE IS USED FOR FORMAT:TRACE TYPE REPORTS AND FOR ; ARGUMENTS TO /INCLUDE AND /EXCLUDE ; THE 4 LETTERS ARE THE SECOND ARGUMENT IN THE SYSDAT MACRO ; FORM IS: XXXX.C: SIXBIT/XXXX/ ; DEFINE X(AA,BB,CC,DD,EE,FF)< BB'.C: SIXBIT/BB/> TAB.C: SYSDAT LEN.C==.-TAB.C ; END OF CONDITIONAL FOR SYSDAT TABLES > ;** POSSIBLE START OF IMPURE AREA ** IFN PURESW, < RELOC > LOWBEG==. ;START OF CORE AREA TO CLEAR ON START AND RESTART ; THIS BLOCK CONTAINS THE CURRENT DATA ON JOB DEFINE X(A,B,C)< C.'A: BLOCK 1 > CURDAT: DATUMS SIZDAT==.-CURDAT ;SIZE OF THIS BLOCK ; THIS BLOCK CONTAINS THE OLD CURRENT DATA ON JOB DEFINE X(A,B,C)< O.'A==C.'A-CURDAT> ;SINCE THESE ARE OFFSETS TO FREE CORE LOCATIONS ;WITH AC J SET UP AS BASE ADDRESS, DONT GET REAL LOCATIONS DATUMS OLDAT==CURDAT-CURDAT QTUM: BLOCK 1 ;TIME TO SLEEP BETWEEN LOOKS SAVNUM: BLOCK 1 ;THE TTY OR JOB NUMBER USER WANTS TO WATCH SAVPOP: BLOCK 1 ;PPN OR PROGRAM THAT WE ARE WATCHING CTRKJ: BLOCK 1 ;-1 WHEN TRACKING AN ACTIVE JOB DEFCMP: BLOCK 1 ;BIT MAP FOR DEFINING WHAT /COMPARE DOES SLPTIM: BLOCK 1 ;TIME WE WENT TO SLEEP LAST IN MS SINCE MID. SLPQT: BLOCK 1 ;SAME AS QTUM EXCEPT IN MILLISECONDS LOOKS: BLOCK 1 ;NUMBER OF LOOKS TO TAKE BEFORE EXITING (0=INFINITE) HIJOB: BLOCK 1 ;HIGHEST JOB NUMBER CURRENTLY ASSIGNED MAXTTY: BLOCK 1 ;HIGHEST TTY NUMBER EXISTANT MAXJOB: BLOCK 1 ;HIGHEST NUMBER OF JOBS MYPPN: BLOCK 1 ;PPN OF THIS JOB MYJOB: BLOCK 1 ;JOB NR. OF JOB RUNNING SAVUP: BLOCK 1 ;NEG. TIME OF DAY ENTERED LOOKUP&PRINT SAVST: BLOCK 1 ;TIME STARTING REPORT SAVSTU: BLOCK 1 ;REPORT START TIME IN UNIVERSAL FORMAT SAVUPU: BLOCK 1 ;REPORT END TIME IN UNIVERSAL FORMAT JSTFLG: BLOCK 1 ;SET TO -1 WHEN WANT OUTPUT LINED UP RVAL: BLOCK 1 ;VALUE OF /R REPORT COUNTER AVALC: BLOCK 1 ;COUNTER FOR FILSAV ROUTINE AVAL: BLOCK 1 ;MASTER COPY OF AVALC, PRINTOUTS/SAVE SDISK: BLOCK 1 ;-1 MEANS WATCH ALL DISKS ;0 MEANS WATCH ONLY DISKS IN SYSTEM SL OUTRUN: BLOCK 1 ;OUTPUT RUNTIME OUTRD: BLOCK 1 ;OUTPUT READS OUTWR: BLOCK 1 ;OUTPUT WRITES NCPU: BLOCK 1 ; # CPUS MONITORS WAS BUILT FOR mbord0: block 1 ;use meter board on cpu0 mbord1: block 1 ;use meter board on cpu1 mbord2: block 1 ;use meter board on cpu2 mbord3: block 1 ;use meter board on cpu3 mbord4: block 1 ;use meter board on cpu4 mbord5: block 1 ;use meter board on cpu5 ; STUFF FOR SPYING MAXGTB: BLOCK 1 ;CONTAINS NUMBER OF GETTAB TABLES TABTAB: BLOCK 1 ;ADDRESS OF GETTAB IMMEDIATE TABLE PDBPTR: BLOCK 1 ;POINTER TO PDB TABLE (JBTPDB) ; DEBUG BLOCK POINTED TO BY .JBOPS (LOC 135) ;MAY BE USEFUL SOME DAY FOR ERROR DEBUGGING DEBBLK: SAVGT: BLOCK 1 ;SAVE GETTAB ARGS SAVADR: BLOCK 1 ;SAVE EXEC ADDRESS OF LAST SPY ERRPC: BLOCK 1 ;ADDRESS ERRMSG LAST CALLED FROM MEMUNI: BLOCK 1 ;ASCII K OR P DEPENDING ON PROCESSOR LASTOK: BLOCK /5 ;LAST TOKEN INPUT OLDPTR: BLOCK 1 ;POINTER TO BASE OF OLD DATA SWIDX: BLOCK 1 ;BASE OF ADDRESS OF TABLE FOR TABLUK LASSW: BLOCK 1 ;SIXBIT NAME OF LAST SWITCH SEEN HPQREQ: BLOCK 1 ;HPQ NUMBER THAT USER REQUESTED EXCFLG: BLOCK 1 ;0/-1 FOR INCLUDE/EXCLUDE ; IO AREA TYBUF: BLOCK 3 SAVFF: BLOCK 1 ;REMEMBERED VALUE OF JOBFF ; AREA FOR COMMAND INPUT ;[*] NEW AND OLDER LOCATIONS.. FSTFLG: BLOCK 1 ;[*]SET TO -1 FOR FIRST TIME TODAY: BLOCK 1 ;[*]TODAY'S DATE FOR DAILY STUFF NEWNAM: BLOCK 1 ;[*]NAME FOR THE NEXT DAILY FILE DAILYF: BLOCK 1 ;[*]SEEN /DAILY SWITCH STRTED: BLOCK 1 ;[*]-1 MEANS THAT TRACK IS ALL INITED AND RUNNING COMPTR: BLOCK 1 ;PTR TO BYTE IN COMBUF LASCHR: BLOCK 1 ;LAST CHARACTER SEEN ; AREA FOR FILE SPECIFICATIONS FILMOD: BLOCK 1 ;GETS FILE MODE FOR OPEN FILDEV: BLOCK 1 ;GETS DEVICE NAME FILBUF: BLOCK 1 ;GETS BUFFER ADDRESSES FILNAM: BLOCK 1 ;GETS FILE NAME FILEXT: BLOCK 1 ;GET FILE EXTENSION FILDAT: BLOCK 1 ;GETS FILE DATE FILPPN: BLOCK 1 ;GETS PPN OR PTR TO PATH BLOCK LUELEN==.-FILNAM ; SIZE OF LOOKUP BLOCK PTHADR: BLOCK 1 ;GETS PATH UUO ARG PTHSCN: BLOCK 1 ;SCAN SWITCH, CURRENTLY ALWAYS LEFT DEFAULT PTHPPN: BLOCK 1 ;PPN OF PATH SPECIFICATION PTHSFD: BLOCK MAXSFD+1;MAXIMUM SIZE SFD BLOCK PTHLEN==.-PTHADR ; ARG BLOCK FOR MULTIPLE ARGUMENT HANDLING ARGS: BLOCK 26 ARGSLN==.-ARGS SAVAC: BLOCK 20 ;SAVE THE ACS CPUTYP: BLOCK 1 ;CPU TYPE OF CPU0 (SAME AS ALL TYPES, HOPEFULLY) ;** DATA AREA FOR SYSDAT MODULE IFN SYS, < T.LOOK: BLOCK 1 ;TOTAL LOOKS TAKEN,STARTS WITH LOOK ZERO NLOOK: BLOCK 1 ;NUMBER OF REPORTS PRINTED LS.TIC: BLOCK 1 ;LAST TICK TIMER CU.TIC: BLOCK 1 ;CURRENT TICK TIMER EL.TIC: BLOCK 1 ;ELAPSED TIME IN TICKS BETWEEN LS,CU.TIC LS.MS: BLOCK 1 ;LAST MS TIMER CU.MS: BLOCK 1 ;CURRENT MS TIME EL.MS: BLOCK 1 ;ELAPSED MS BETWEEN LS.MS,CU.MS ADJPTR: BLOCK 1 ;PTR TO CURRENT DATA BLOCK ADJUSTED FOR OUTPUT ADJLOK: BLOCK 1 ;ADJUSTED NUMBER OF LOOKS TAKEN UL: BLOCK 1 ;UPPER LIMIT OF OUTDB? ROUTINE LL: BLOCK 1 ;LOWER LIMIT OF OUTDB? ROUTINE DONFLG: BLOCK 1 ;FLAG IS -1 WHEN OUTDBX IS DONE VAL: BLOCK 1 ;PERCENT OF TOTAL IN THE RANGE(INTEGER PART) ROTFLG: BLOCK 1 ;FLAG FOR ROTATING INCREMENTAL VALUES SUMSQ: BLOCK 1 ;SUM-OF-SQUARES FOR OUTDB? ITEMS RVALC: BLOCK 1 ;COUNTDOWN OF LOOKS LEFT IN THIS REPORT SYSNAM: BLOCK 5 ;SYSTEM NAME IN ASCIZ SYSDTE: BLOCK 2 ;DATE SYSTEM WAS BUILT SYSVER: BLOCK 1 ;MONITOR VERSION SYSSIZ: BLOCK 1 ;SIZE OF MONITOR IN WORDS USIZ: BLOCK 1 ;SIZE OF USER MEMORY IN APPROPRIATE UNITS (K OR P) IFN FTTRC, < BAUXWD: BLOCK 1 ;AUXIALLY ID WORD USED FOR TRACE REPORTS >; END OF IFN FTTRC INCDIO: BLOCK 1 ;INCREMENTAL USER DISK IO IN BLOCKS INCSWP: BLOCK 1 ;INCREMENTAL DISK IO IN BLOCKS FOR SWAPPING DIOTAB: BLOCK 1 ;PTR TO BLOCK LOGMAX LONG FOR DISK IO KCSTAB: BLOCK 1 ;PTR TO BLOCK LOGMAX LONG FOR INCR. KCS CPTTAB: BLOCK 1 ;PTR TO BLOCK LOGMAX FOR INCR. CPUT ; NUMJOB: BLOCK 1 ;NUMBER OF JOBS CURRENTLY LOGGED IN HISEGN: BLOCK 1 ;HIGH SEGMENT NUMBER SEEN BY GETCOR JOBTB1: BLOCK 1 ;PTR TO TABLE WITH 1 ENTRY FOR EACH JOB ;HAS FORM J,,ADDRESS OF BLOCK ;FORMAT OF TABLE WORD IS: ; XWD LOW CORE, HIGH CORE IF JOB IS LOGGED IN ; -1 IF JOB NOT LOGGED IN. NOTE THAT ;CORE IS IN UNITS OF K OR P JOBTB2: BLOCK 1 ;POINTER TO JOB BLOCK . FORMAT OF PTR ;IS SAME AS JOBTB1. 1 WORD FOR EACH JOB ;WORD FORMAT: ;BIT 0 =0 IF JOB IS IN CORE ; =1 IF JOB IS SWAPPED ;BITS 1-17 HIGH SEGMENT NUMBER OR 0 ;BIT 18 ON IF STATUS RUN BIT WAS ON ;BITS 19-23 CURRENTLY UNUSED ;BITS 24-35 2 CHR SIXBIT STATUS CODE ;DO NOT SEPARATE SEGTAB THRU ACTCOR SEGTAB: BLOCK 20 ;BIT MAP 1 BIT PER HISEG. 1 IF ALREADY COUNTED THIS HISEG SEGPTR: BLOCK 1 ;WILL GET INDIRECT PTR OF SEGTAB+OFFSET(AC) ;IN CORE USE TALLY. JOBRN: BLOCK 1 ;JOBS IN "RN" STATE JOBRNC: BLOCK 1 ;JOBS IN "RN" STATE AND IN CORE JOBSHR: BLOCK 1 ;JOBS IN SHAREABLE RESOURCE QUEUES JOBTTY: BLOCK 1 ;JOBS IN TI OR TO STATUS JOBIO: BLOCK 1 ;JOBS IN IO STATUS, CURRENTLY IO,DI,PI TOTCOR: BLOCK 1 ;TOTAL VIRTUAL CORE IN USE SHRCOR: BLOCK 1 ;TOTAL CORE IN USE TAKING SHAREING INTO ACCOUNT ACTCOR: BLOCK 1 ;LIKE SHRCOR, BUT FOR ACTIVE JOBS UNIPTR: BLOCK 1 ;AOBJN POINTER TO LIST OF DISK UNIT NAMES UNIDB: BLOCK 1 ;ADDRESS OF LIST OF DBS FOR DISK UNITS AND CHANNELS NSNCRL: BLOCK 1 ;LAST SEEN VALUE OF MONITOR'S %NSNCR TNFCC: BLOCK 1 ;TOTAL NR. OF FREE CORE CHUNKS TNTCH: BLOCK 1 ;TOTAL NR. OF TTY CHUNKS ; HERE WE CREATE THE DATA BLOCK POINTER TABLE. ; NOTE THAT SPACE IS RESERVED FOR EVERY ITEM IN THE SYSDAT ; MACRO, BUT NO POINTERS ARE ACTUALLY CREATED, OR DATA BLOCKS ; CREATED. THIS IS THE RESPONSIBILTY OF THE INITIA ROUTINES ; THATS WHY THIS TABLE IS IN THE IMPURE SECTION OF THE PROGRAM ; EACH ITEM IN THIS TABLE IS INITIALLY OF THE FORM: ; XXXX.P: BLOCK 1 ; ; AFTER INITIALIZATION IT IS USUALLY OF THE FORM: ; XXXX.P: L,,ADDR WHERE ADDR IS THE START OF THE ; DATA BLOCK FOR THIS ITEM DEFINE X(AA,BB,CC,DD,EE,FF)< BB'.P: BLOCK 1 > TAB.P: SYSDAT LEN.P==.-TAB.P ; END OF CONDITIONAL FOR SYSDAT DATA AREA > ; PUSH DOWN LIST PDL: BLOCK PDSIZE VAR LOWEND==.-1 ;END OF CORE AREA TO CLEAR ON START AND RESTART IFN PURESW, SCD0: BLOCK 1 ;uscheduling interval (SCDINT) SCD2: 5 ;class quotas/flags: b0=fixed, 1-17=class, 18-35=quota BLOCK 5 SCD3: 2 ;pq1, pq2 quantum runtimes BLOCK 2 SCD6: BLOCK 1 ;min core usage per job (PROTO) SCD11: BLOCK 1 ;min core usage multiplier (PROT) SCD13: BLOCK 1 ;min core usage requeue constant (PROT1) SCD14: BLOCK 1 ;min core usage maximum (PROTM) SCD15: 3 block 1 ;PQ1 quantum multiplier: rh=quantum multiplier block 1 ;PQ2 quantum multiplier: rh=quantum multiplier BLOCK 1 ;scaling factor SCD16: 2 block 1 ;PQ1 max quantum runtime/queue: rh=max time slice block 1 ;PQ2 max quantum runtime/queue: rh=max time slice SCD17: 5 ;secondary class quota: lh=class#, rh=quota BLOCK 5 SCD20: BLOCK 1 ;time % to scan q swapped in before subqueue (SCDJIL) SCD21: BLOCK 1 ;swap scan time - (SCDSWP) SCD24: BLOCK 1 ;scheduler fairness factor SCD25: BLOCK 1 ;swapper fairness factor (MAXIFC) SCD26: BLOCK 1 ;incore fairness factor (SCDIOF) SCD27: BLOCK 1 ;SCDCOR SCD22: BLOCK 1 ;BACKGROUND BATCH CLASS (BBSUBQ) SCD23: BLOCK 1 ;BACKGROUND BATCH SWAP TIME (SCDBBS) SCD4: BLOCK 5 ;CHAN USE FRACTION ;LH=CHAN#, RH=USE FRACTION SCDEND: SCDL2=SCDEND-SCD0+1 ; SCDBLK: 0,,SCD0 2,,SCD2 3,,SCD3 6,,SCD6 11,,SCD11 13,,SCD13 14,,SCD14 15,,SCD15 16,,SCD16 17,,SCD17 20,,SCD20 21,,SCD21 24,,SCD24 25,,SCD25 26,,SCD26 27,,SCD27 22,,SCD22 ;BB CLASS 23,,SCD23 ;BB SWAP TIME 4,,SCD4 ;CHAN USE FRACTION SCDLEN=.-SCDBLK END TRACK