SUBTTL SYSDPY %704(653) DYNAMIC SYSTAT FOR DISPLAYS 20-OCT-87 SUBTTL /PMW/RDH/GAT ;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1981,1982,1984,1985,1986,1987. ALL RIGHTS RESERVED. ; ; ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ;TRANSFERRED. ; ;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ;CORPORATION. ; ;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. SUBTTL VERSION INFORMATION SEARCH SYSDPU ;SYSDPY'S CHEAP COPIES OF MONITOR'S SYMBOLS SEARCH JOBDAT,MACTEN,UUOSYM ;SYMBOL DEFINITIONS SEARCH GLXMAC,QSRMAC,ORNMAC ;FOR QUEUES SYMBOLS COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 1970,1987. ALL RIGHTS RESERVED. \;END COPYRIGHT MACRO SALL ;PRETTIER LISTINGS .DIREC FLBLST ;PRETTIER LISTINGS ;THE VERSION NUMBERS MAJVER==704 ;MAJOR (RELEASE) VERSION MINVER==0 ;MINOR (MAINTENANCE) LEVEL EDTVER==653 ;EDIT LEVEL CSTVER==0 ;CUSTOMER EDIT LEVEL LOC .JBVER BYTE (3)CSTVER(9)MAJVER(6)MINVER(18)EDTVER RELOC SUBTTL EDIT HISTORY ;EDIT LEVEL 471 TO 472 ;EDIT 1 SYSVBX DID NOT RUN WITHOUT A CORE ARGUMENT ,AS CORE ; EXPANSION WAS DONE AFTER A LOCK UUO ;EDIT 2 ASSIGN AND INIT VALUES WERE NO LONGER PRINTED BY VERSION471 ; FOR DEVICES ;EDIT LEVEL 472 TO 474 ;EDIT 3 UNMARKED ADD SUPPORT FOR VM SYSTEMS ;EDIT 4 ALWAYS USE REFRESH MODE FOR VM DISPLAY ;EDIT 5 USE IMGIN FOR SIZE OF LOW SEGMENTS ON VM SYSTEMS ;EDIT 6 FOR NONSHARABLE SEGMENTS ON VM SYSTEMS USE RIGHT HAND ; 9 BITS OF LEFT HALF WORD OF JBTSWP ENTRY ;EDIT 7 UPDATE HELP TEXT FOR M COMMAND AND ADD HELP TEXT ; FOR USERS WITHOUT SPY OR PEEK PRIV. USINF F COMMAND ;EDIT 8 UPDATE SECOND LINE OF VM DISPLAY ;EDIT 9 DISPLAY WARNINGS ONLY ONCE ; TO THE NORMAL DISPLAY ; ENTRY IN THE N DISPLAY ;EDIT 10 REPORT K OR P IN SWAP STATISTICS ;EDIT 11 THE AMOUNT OF SWAPPING SPACE USED IS COMPUTED WRONLY ; FOR KI SYSTEMS ;EDIT 12 THE SWAP ERROR COUNT IS COMPUTED IN THE WRONG WAY ; THIS MAY GIVE UNREASONABLY HIGH NUMBER OF ERRORS ;EDIT 13 INCREASE THE SLEEP TIME OF SYSDPY FROM 5 TO 10 SECONDS ;EDIT 14 SINCE VERSION 50665 MSK4KS IS 13 BITS ;EDIT 15 UNPRIVILIGED USERS DID NOT GET AN AUTOMATIC SCREEN REFRESH ; AFTER A WARNING ;EDIT 16 NEW VM DATA IN JOBVRT INTEGRATED ;EDIT 17 SINCE 678 LOAD JBT VRT IS OKAY SO UPDATE PGDATA LOGIC ;EDIT LEVEL 505 TO 506 ;EDIT 18 CORRECT PRINTOUT OF VM DATA FOR INDIVIDUAL JOBS ; AND UPDATE SOME COMMENTS ;EDIT 19 PRINT CORRECT SWAPPING RATIO CORRECT EDIT 11 ; AND USE RIGHT ACCU ;EDIT 20 LINE NUMBER OF JOBS IS WRONG FOR MONITORS OLDER ; THAN 503 NOT HAVING THE GETTAB ENTRY FOR DDBLDB ;EDIT 21 CORRECT CODE PRINTING LIMIT VALUES FOR SYSTEM ; AND USER PAGING RATES.NOTE: THIS EDIT IS NOT MARKED IN THE ; SOURCE ;EDIT 22 PRINT CORRECT SYSTEM PAGING RATE ; NOTE: EDIT NOT MARKED IN LISTING ;EDIT 507 VTO5-B DOES NOT WORK ON DC72 AT 2400 BAUD AS FILL CHARACTER ; 0 DISAPPEARS THIS IS DUE TO THE DC72 BEING ASSEMBLED ; FEATURE SWITCH FTTOFN .NEQ. 0 ; THIS EDIT IS ONLY FOR DOCUMENTATION ;EDIT 510 GIVE STRANGE OPERATING SYSTEMS AND UNPRIVILIGED USERS A CHANCE ; TO SEE LINE NUMBERS BY USING THE TRMNO. AND DEVNAM UUO ;EDIT 511 ADAPT TO NEW NUMTAB FORMAT USE LOAD 721 AS THE TRANSACTION ; NUMTAB CONTAINS ENTRY TYPE VALUE ;EDIT 512 BELIEVE IN NEW DEVJOB ENTRY IN DDB'S ;EDIT 513 MAKE F DISPLAY PAGEABLE ;EDIT 514 CORRECT DEVICE LOGIC FOR 602 ;EDIT 515 CLEAN UP CHARACTER INPUT LOGIC ;EDIT 516 MAKE C FILE A UNIVERSAL ;EDIT 517 CLEAN UP ERRORS IN PAGED F DISPLAY ;EDIT 520 WAIT A LITTLE BETWEEN DISPLAYS SO ONE CAN ; READ THE DISPLAY ;EDIT 521 REFRESH THE SREEN WHEN CHANGING THE DISPLAY PROGRAM ;EDIT 522 FIX THE DISAPEARING M DISPLAY ;EDIT 523 FIX REFRESH PROBLEM ;EDIT 524 ONLY ESCAPE COULD ESCAPE FROM A FROZEN SCREEN ALLOW ANY ; CHARACTER ;EDIT 525 USE HRRZ FOR GETTING MONVER ;EDIT 526 PEEK FACILITY WAS NOT RECOGNIZED ;EDIT 527 DONOT DISPLAY AN EMPTY F DISPLAY SCREEN ;EDIT 530 ADAPT TO CHANGED JUMPPT MACRO ;EDIT 531 UNPRIVILIGED JOBS GET DATA FOR CPU1 ON A SINGLE ; CPU SYSTEM ;EDIT 532 ADD HISEG SIZE TO MONITOR SIZE ;edit 533 search universal jobdat file for jobdat symbols ;edit 534 jobs locked into core cannot refresh the screen ;edit 535 too many " dev by how headers" are printed when ; display ends at bottom of a column ;edit 536 d display hangs for unpriviliged users ;edit 537 d display contains extra right paren between w column ; and swap ratio column ;edit 540 add vt61 support ;edit 541 add vt50 supprot ;edit 542 add vt52 support ;edit 543 add network topology "wt" display ;edit 544 add network statistics display ;edit 545 add individual print line for one job on normal display ;edit 546 add control R and A for VT61 support ;edit 547 make edits 540 thru 547 work ;edit 550 make edit 542 work ;edit 551 Fix averages of edit 544 ;edit 552 Fix DEVJOB so owner of device is correct ;EDIT 553 VT50 CANNOT (IN GENERAL) CURSOR ADDRESS; NTAVG VALUE FOR ; "\" DISPLAY WRONG (MONITOR INFORMATION STILL ALMOST ; USELESS HOWEVER); "T" HISTOGRAM POWERS OF 2 OFF BY ONE; ; "DEVICE BY HOW" FIELD TOO SMALL FOR "HOW" FOR 5 & 6 CHAR ; DEVICE NAMES (IF 72-COLUMN TERMINAL ONLY 2 COLUMNS CAN ; NOW FIT ON SCREEN); DON'T SHOW HISEG STUFF ON VT50 SINCE ; IT CONFLICTS WITH DEV BY HOW FIELD (AND NEITHER WORKS AS ; A RESULT); ALLOW FOR 3-DIGIT NODE NUMBERS IN "T" DIS- ; PLAY; IMPLEMENT "O" COMMAND TO TOGGLE SUPPRESSION OF ; [OPR] JOBS ON "N" AND "M" DISPLAYS ;EDIT 554 FIX ^A AND ^R COMMANDS - ALSO, IF REVERSE VIDEO MODE ; AND REFRESHING, REFRESH SCREEN IN NORMAL MODE THEN GO ; BACK TO REVERSE VIDEO FOR UPDATING; ON EXIT CLEAR BOTH. ;EDIT 555 GETTAB THE PJOBN INFO (7.01) IF POSSIBLE; DON'T SHOW THE ; DUMMY DDB'S USED FOR TAPE LABELING; SHOW TTY DDB'S NOT ; CONTROLLING A JOB (I.E., IN USE AS AN I/O DEVICE) ;EDIT 556 USE .GTNDB TABLE IF EXTANT FOR NDB POINTERS. CLEANUP. ;EDIT 557 DON'T PRINT INCREMENTAL SYSTEM UPTIMES ; CALL VERSION 434 ;EDIT 560 PRINT TRUE USER MEMORY AVAILABLE. ADD "L" COMMAND ; TO LOG THE SCREEN IN LPT:SYSDPY.LOG[-]. ;EDIT 561 ADD "Q" COMMAND TO LIST THE QUEUES, COMPRESS "T" ; DISPLAY TO ALLOW FOR MORE NEIGHBORS. ADD (KL ONLY) ; RH20 AND PI USAGE DISPLAYS TO "N" DISPLAY. ;EDIT 562 ADD "N+" AND "N-" COMMANDS. SHOW SECOND UNIT OF DUAL- ; PORTED DISKS IN "F" DISPLAY. (NOTE THAT THIS DEPENDS ON ; DSKCHR RETURNING THE SECOND PORT INFORMATION, WHICH ; IT DOESN'T IN EARLY 7.00 MONITORS. DATE PRINTED WRONG. ; SHOW CACHE SWEEPS ON KS-10 ALSO. "J" DISPLAY DIDN'T DO ; INCREMENTAL RUNTIMES CORRECTLY. NEW VALUES FOR GALAXY ; SYMBOLS. LOG TO DSK:SYSDPY.LOG INSTEAD. CLEAR BOTTOM OF ; SCREEN ON EXIT (GENERAL VOTE SEEMS TO PREFER THIS OVER ; CLEARING ENTIRE SCREEN AND POSITIONING TO HOME). ;SYSDPY %434(562) RELEASED WITH 7.01 MONITOR ;563 BCM 8-JAN-81 SPR 10-30327 ; MAKE PICKING UP THE HELP FILE ON HLP: WORK ;564 RDH 15-MAY-81 (GAT SPR 10-30418) ; ALLOW FOR MEMTAB AND PAGTAB IN PHYMAX CALCULATION. ;565 RDH 2-AUG-81 NO SPR ; WHEN LOOKING FOR ALTERNATE DISK PORT, DON'T BE CONFUSED BY FLAG ; BITS (1B0) IN UDB ADDRESS. ;566 RCB 21-AUG-81 NO SPR ; ADD SYSANS FOR VT100'S IN ANSII MODE ;567 RDH 12-OCT-81 ; HANDLE NETWORK ("\" DISPLAY) LENGTH .GT. 2**9 ; ;570 G. TREMBLAY 15-DEC-81 SPR 10-31707 ; REMOVE CODE FROM ROUTINE "INACTC" THAT LOOKS FOR "HB" ; STATE IN QTAB. (THIS ALSO REMOVES TYPO: ACCUMULATER "C" ; SHOULD OF BEEN "D") ; ;571 G. TREMBLAY 18-DEC-81 SPR 10-30777 ; ADD CONDITIONAL ASSEMBLY CODE AROUND THE DEFINITION ; LINES THAT REFERENCE SYMBOL "X2SIZE" ; ;572 G.TREMBLAY 23-FEB-82 SPR 10-31193,31484 ; FIX >100%s DURING INCREMENTAL VIRTUAL MEMORY DISPLAY(I,M,%) ; ;573 G. TREMBLAY 23-FEB-82 SPR 10-31166 ; PRINT LOGMAX IN "Log'd in:" MSG ; ;574 G. TREMBLAY 11-MAR-82 ; CORRECT CALCULATION OF ASR TO INCLUDE LOCKED SEGMENT ; SIZES INTO MAXMAX. ALSO ONLY ADD HIGH SEGMENTS INTO ACTUSE ; ONCE. (SYSDPY/SYSTAT's ASR ARE THE SAME NOW) ; ;576 G. TREMBLAY 15-MAR-82 SPR 10-31393 ; TRY TO GET QUASAR'S PID EACH "Q" COMMAND IF NOT SUCCESSFUL ; DURING SYSDPY INITIALIZATION. ; ;577 A RIZZOLO 8-JUN-82 ; ADD CODE TO GIVE A DISPLAY OF BOTH DECNET LINK STATUS ; AND DECNET NODE STATUS (SPECIAL MESSAGES FOR ANSI TERMINALS). ; ;600 G. TREMBLAY 22-JUL-82 SPR 10-32709 ; ADD NEW COMMAND ^N TO SYSDPY TO TOGGLE NON-IDLE JOBS. ; ;601 G. TREMBLAY 18-JAN-83 NO SPR ; GETTAB LDBDCH OFFSET TO CORRECT "T" DISPLAY ; ;602 G. TREMBLAY 28-APR-83 NO SPR ; REMOVE OLD "GODLY" DEBUGGING CODE. ; ;603 G.TREMBLAY 28-APR-83 NO SPR ; LET SYSDPY SEARCH GALAXY UNIVERSALS FOR SYMBOL DEFINITIONS. ; ;604 TARL 28-APR-83 ; UPDATE SYSDPY TO USE NEW DNET. UUO FORMAT PER MCO 10716 ; ;605 G. TREMBLAY 25-JUL-83 10-33739 ; FIX ILL MEM REFERENCES CAUSED BY EDIT 563 WHEN ACCESSING ; EXTERNAL HELP FILE. ; ;606 G. TREMBLAY 6-AUG-83 SPR 10-34051 ; CORRECT SYSDPY'S CPU IDLE TIMES TO BE EQUAL TO ; NULL TIME MINUS LOST TIME. ; ;607 RDH 27-NOV-83 ; ADD "MTAI/MTAO" PER-CPU FIELDS; ADD DECNET BYTE COUNTS (RENAME "NET" ; TO "ANF", ADD "DCN" FOR DECNET); ADD CHUNK COUNTS TO "TTY CNK:"; ADD ; IPCF STATISTICS; REVAMP "JOBS:" DISPLAY (COMPRESS IT); ADD "^" COMMAND ; TO "SKIP" FIRST PART OF SYSTEM STATISTICS (ALSO INVALID-DELAY FOR ; DECNET); REFORMAT "F" DISPLAY (MINOR CHANGE); USE "!" FOR IDLE ; SUPPRESSION IN BOTH JOB AND DECNET DISPLAY. ; SUPPRESS "PHYMAX" (CAN'T GET IT RIGHT FOR 7.02); REVAMP CALCULATIONS ; FOR ACTUSE/PHYUSE/VIRUSE; CHANGE LOCK ("V") TO CACHED NON-CONTIGUOUS ; NON-EVM MEMORY (MINIMUM LOAD ON SYSTEM); FIX TYPEOUT OF USER NAME ; ("S" DISPLAY) TO ALWAYS TYPE ENTIRE NAME WITH EMBEDDED BLANKS; ; ALWAYS UNLOCK FOR "Q" DISPLAY; FIX "F" DISPLAY FOR NON-DUAL-PORTED ; SYSTEMS (E.G., KS10) WITH FTDUAL=0; CLEAR "L" ON EXIT (AVOID ; "I/O TO UNASSIGNED CHANNEL" ON CONTINUE COMMAND AFTER ^Z). ; ;SYSDPY %435(607) RELEASED WITH 7.02 MONITOR ; ;610 GAT 24-FEB-84 SPR 10-33672 ; UPDATE EDIT 600 TO DISPLAY JOBS THAT WERE NON-IDLE BETWEEN SYSDPY ; PASSES. ALLOW A RUNTIME THRESHOLD VALUE TO BE INPUTTED ; TO DISPLAY NON-IDLE JOBS WHOS' RUNTIME EXCEED THE ; THRESHOLD VALUE. CHANGE COMMAND FROM "^N" TO "!" ; COMMAND FORM: "n!" WHERE THRESHOLD = n/100 SECONDS. ; ;611 GAT 18-JUN-84 SPR 10-33292 ; ADD AUTO ROLL TO "Q" DISPLAY. ; ;612 RDH 22-JUN-84 NO SPR ; "CPOPJ" FROM ROUTINE GET0 IF NO GETTAB TABLE BASE ADDRESS IS FOUND. ; (M.DECN=0 DOES THIS, CAUSES LOOP, ILL MEM REF, ETC.) ; ;613 RDH 9-JUL-84 ; FIRST 7.03 SYSDPY. REMOVE "SEEKS" FROM FILE DISPLAY IN ORDER TO ; EXPAND OTHER COLUMNS; ADD "PR" AND "PW" (PAGING I/O) TO SWAP ; DISPLAY. ; ;614 RDH 23-OCT-84 ; MORE 7.03 UPDATING. ; ;615 RDH 5-NOV-84 ; MORE 7.03 UPDATING; ADD MORE DECNET OBJECT TYPES. ; ;616 RDH 13-FEB-85 ; MORE 7.03 UPDATING; ADD EVEN MORE DECNET OBJECT TYPES; EXPAND "M" ; DISPLAY COLUMNS TO HANDLE LARGER JOB SIZES (HOWEVER STILL NEEDS ; JBTVRT GETTAB'ABLE, SO FOR NOW "VIRTUAL" IS SAME AS "PHYSICAL"). ; ;617 RDH 11-APR-85 ; USE JBTVIR FOR VIRTUAL PROGRAM SIZES (ALSO FIXES "SWP" DISPLAY). ; ;620 RDH 23-MAY-85 ; ADD "ETH" LINE TO SYSTEM DISPLAY. ; ;621 RDH 5-JUN-85 ; DI/TI WRONG (DDB ADDRESS NOW IN JBTDDB). DISPLAY UNREASONABLY- ; LARGE KSYS TIMES AS DAYS:HOURS:MINUTES ; ;622 WXD 25-JUN-85 ; ADD "E" COMMAND TO LIST ETHERNET STATISTICS. ALSO ADD "EE" ; EVENT WAIT CODE FOR ETHERNET EVENT WAIT. ; ;623 JAD 28-JUN-85 ; ADD "K" COMMAND TO LIST CI NETWORK STATISTICS. ; ;624 CJA 1-JUL-85 ; ADD "Z" COMMAND TO LIST LAT SERVER STATISTICS. ; ;625 RDH 21-AUG-85 ; ADD "THISIM" ROUTINE TO PRINT DISPLAY-SPECIFIC-HEADER-TEXT AND ; THEN THE NORMAL "THISIS" SYSTEM HEADER, UPDATE MOST DISPLAYS TO ; USE NEW ROUTINE. ; ;626 WXD 29-AUG-85 ; FIX ETHERNET DISPLAY TO PRINT KONTROLLER NAMES CORRECTLY. ; ;627 LEO 9-SEP-85 ; Do Copyrights. ; ;630 WXD 16-SEP-85. ; PRINT OUT ETHERNET CHANNEL NUMBER FROM NEW VALUE RETURNED BY ; FUNCTION .ETRCI OF ETHNT. UUO. ; ;631 WXD 24-SEP-85. ; EDIT 626 BROKE INCREMENTAL DISPLAY OF ETHERNET COUNTERS. ; ;632 WXD 2-DEC-85. ; FIX BUG IN ETHRPL WHICH WASN'T STORING THE CHANNEL ID IN THE ; ETHNT. ARGUMENT BLOCK. ; ;633 RDH 5-MAR-86 ; KS/DECNET IS INSANE. DON'T TRY TO DISPLAY "DCN" FIELD. ; ;634 RDH 7-MAR-86 ; "DCN" COUNTS DON'T INCLUDE ETHERNET COUNTS (ETHERNET DOESN'T KEEP ; THE COUNTS IN THE "DL" BLOCK LIKE EVERYONE ELSE - GRRR!!!!) ; ;635 JAD 27-MAR-86 ; SPACING ON SINGLE CPU CI STATUS DISPLAY IS INCORRECT. ; ;BEGIN VERSION 704 ; ; 650 JAD 22-AUG-86 ; TEACH SYSDPY ABOUT NEW FORMAT OF JBTSGN. ; ; 651 JMF 21-MAY-87 ; SYSDPY REPORTS THAT JOBS WITH SPY SEGMENT ARE VIRTUAL ; ; 652 RCB 20-OCT-87 ; READ ANF/ETHERNET PROTOCOL FROM THE .GTNTP GETTAB FOR "E" DISPLAY. ; ALSO FIX THE "OPR" FIELD OF "T" DISPLAY. ; ; 653 LWS 2-Aug-88 ; ADD "FRU" (FREE CORE USED) LINE IN "N" DISPLAY. ; ;END OF EDIT HISTORY SUBTTL AC ASSIGNMENTS ; ;NOTE THAT HELP PROGRAM USES ACS 0-6 IN UNUSUAL WAY M=0 A=1 B=2 C=3 D= J= JS= P1==6 P2==3 R= N= N1=11 F=12 BP=13 T1=14 T2=15 CH=16 P=17 .XCREF M,A,B,C,D,J,JS,R,N,N1,BP,T1,T2,CH,P ;SAVE SOME PAPER ;I/O CHANNELS TTY==1 ;NORMAL DISPLAY OUTPUT (CHARACTER TERMINAL) DIS==1 ;VIDEO DISPLAY HLP==3 ;HELP FILE CHANNEL LOG==4 ;SCREEN LOGGING CHANNEL SUBTTL DISPLAY PARAMETERS V.DVT6==0 ;DIGITAL VT06 V.DV5A==1 ;DIGITAL VT05A V.DV5B==2 ;DIGITAL VT05B V.DVBX==3 ;DIGITAL VB10C V.DV61==4 ;DIGITAL VT61 DISPLAY V.DV50==5 ;DIGITAL VT50 DISPLAY V.DV52==6 ;DIGITAL VT52 DISPLAY V.ANSI==7 ;DIGITAL VT100 DISPLAY V.DHZL==20 ;HAZELTINE 2000 V.DDLT==21 ;DELTA DATA TELTERM ;RECOMMEND CUSTOMERS ASSIGN NEGATIVE VALUES ND V.DISP,V.ANSI ;DEFAULT TO VT100/ANSI TERMINALS IFE V.DISP-V.DVT6,< TITLE SYSDPY -- SYSTEM DISPLAY FOR DIGITAL VT06 DISPLAY TERMINAL XSIZE==^D72 ;WIDTH OF SCREEN YSIZE==^D25 ;HEIGHT OF SCREEN ND UPDNJB,^D20 ;NUMBER OF JOBS TO +- ND NSYSYS,1 ;LINE TO START SYSTEM DISPLAY IN "N" ND REPRAT,^D100 ;NUMBER OF PASSES BEFORE REFRESH FORCED CFILL==177 ;FILLER CODE CDOWN==12 ;CURSOR DOWN CUP==32 ;CURSOR UP CLEFT==31 ;CURSOR LEFT CRIGHT==30 ;CURSOR RIGHT HOMEUP==35 ;CURSOR TO HOME ERASE==37 ;ERASE TO END OF SCREEN EREOL==36 ;ERASE TO END OF LINE >; END OF IFE V.DISP-V.DVT6 IFE *,< IFE V.DISP-V.DV5A,< TITLE SYSDPA -- SYSTEM DISPLAY FOR DIGITAL VT05A DISPLAY TERMINAL> IFE V.DISP-V.DV5B,< TITLE SYSDPB -- SYSTEM DISPLAY FOR DIGITAL VT05B DISPLAY TERMINAL> XSIZE==^D72 YSIZE==^D20 ND UPDNJB,^D15 ;NUMBER OF JOBS TO +- ND NSYSYS,1 ;LINE TO START SYSTEM DISPLAY IN "N" ND REPRAT,^D1000 ;NUMBER OF PASSES BEFORE REFRESH FORCED CFILL==0 CDOWN==12 CUP==32 CLEFT==31 CRIGHT==30 HOMEUP==35 ERASE==37 EREOL==36 >; END OF IFE * IFE V.DISP-V.DVBX, < TITLE SYSVBX -- SYSTEM DISPLAY FOR DIGITAL VB10C INCREMENTAL PRECISION DISPLAY XSIZE==^D72 YSIZE==^D25 ND UPDNJB,^D20 ;NUMBER OF JOBS TO +- ND NSYSYS,1 ;LINE TO START SYSTEM DISPLAY IN "N" ND REPRAT,^D10000 ;NUMBER OF PASSES BEFORE REFRESH FORCED CDOWN==12 CUP==32 CLEFT==31 CRIGHT==30 HOMEUP==35 ERASE==37 EREOL==36 >; END OF IFE V.DISP-V.DVBX IFE V.DISP-V.DV50,< TITLE SYSV50 -- SYSTEM DISPLAY FOR DIGITAL VT50 DECSCOPE XSIZE==^D80 YSIZE==^D12 ND UPDNJB,^D8 ;NUMBER OF JOBS TO +- ND NSYSYS,1 ;LINE TO START SYSTEM DISPLAY IN "N" ND REPRAT,^D10000 ;NUMBER OF PASSES BEFORE REFRESH FORCED CUP=="A"_^D9 + .CHESC ; CDOWN=="B"_^D9 + .CHESC CDOWN==12 CRIGHT=="C"_^D9 + .CHESC ; CLEFT=="D"_^D9 + .CHESC CLEFT==010 HOMEUP=="H"_^D9 + .CHESC ERASE=="J"_^D9 + .CHESC EREOL=="K"_^D9 + .CHESC >; END V.DISP-V.DV50 IFE V.DISP-V.DV52,< TITLE SYSV52 -- SYSTEM DISPLAY FOR DIGITAL VT52 DECSCOPE XSIZE==^D80 YSIZE==^D24 ND UPDNJB,^D20 ;NUMBER OF JOBS TO +- ND NSYSYS,1 ;LINE TO START SYSTEM DISPLAY IN "N" ND REPRAT,^D10000 ;NUMBER OF PASSES BEFORE REFRESH FORCED CUP=="A"_^D9 + .CHESC CDOWN=="B"_^D9 + .CHESC CRIGHT=="C"_^D9 + .CHESC CLEFT=="D"_^D9 + .CHESC HOMEUP=="H"_^D9 + .CHESC ERASE=="J"_^D9 + .CHESC EREOL=="K"_^D9 + .CHESC >; END V.DISP-V.DV52 IFE V.DISP-V.DV61,< TITLE SYSV61 -- SYSTEM DISPLAY FOR DIGITAL VT61 DECSCOPE XSIZE==^D80 YSIZE==^D24 ND UPDNJB,^D20 ;NUMBER OF JOBS TO +- ND NSYSYS,1 ;LINE TO START SYSTEM DISPLAY IN "N" ND REPRAT,^D10000 ;NUMBER OF PASSES BEFORE REFRESH FORCED CUP=="A"_^D9 + .CHESC CDOWN=="B"_^D9 + .CHESC CRIGHT=="C"_^D9 + .CHESC CLEFT=="D"_^D9 + .CHESC HOMEUP=="H"_^D9 + .CHESC ERASE=="J"_^D9 + .CHESC EREOL=="K"_^D9 + .CHESC >; END V.DISP-V.DV61 IFE V.DISP-V.ANSI,< ; TITLE SYSANS -- SYSTEM DISPLAY FOR ANSI TERMINALS (SUCH AS VT100) XSIZE==^D80 YSIZE==^D24 ND UPDNJB,^D20 ;NUMBER OF JOBS TO +- ND NSYSYS,1 ;LINE TO START SYSTEM DISPLAY IN "N" ND REPRAT,^D10000 ;NUMBER OF PASSES BEFORE REFRESH FORCED CUP=="A"_^D18 + "["_^D9 + .CHESC CDOWN=="B"_^D18 + "["_^D9 + .CHESC CRIGHT=="C"_^D18 + "["_^D9 + .CHESC CLEFT=="D"_^D18 + "["_^D9 + .CHESC HOMEUP=="H"_^D18 + "["_^D9 + .CHESC ERASE=="J"_^D18 + "["_^D9 + .CHESC EREOL=="K"_^D18 + "["_^D9 + .CHESC >; END V.DISP-V.ANSI IFE V.DISP-V.DHZL, < TITLE SYSHZL -- SYSTEM DISPLAY FOR HAZELTINE 2000 DISPLAY TERMINAL XSIZE==^D74 YSIZE==^D27 ND UPDNJB,^D20 ;NUMBER OF JOBS TO +- ND NSYSYS,1 ;LINE TO START SYSTEM DISPLAY IN "N" ND REPRAT,^D10000 ;NUMBER OF PASSES BEFORE REFRESH FORCED CDOWN==12 CUP==32 CLEFT==31 CRIGHT==30 HOMEUP==35 ERASE==37 EREOL==36 >; END OF IFE V.DISP-V.DHZL IFE V.DISP-V.DDLT, < TITLE SYSDLT -- SYSTEM DISPLAY FOR DELTA DATA TELTERM DISPLAY TERMINAL XSIZE==^D80 YSIZE==^D27 ND UPDNJB,^D20 ;NUMBER OF JOBS TO +- ND NSYSYS,1 ;LINE TO START SYSTEM DISPLAY IN "N" ND REPRAT,^D10000 ;NUMBER OF PASSES BEFORE REFRESH FORCED CDOWN==12 CUP==32 CLEFT==31 CRIGHT==30 HOMEUP==35 ERASE==37 EREOL==36 >; END OF IFE V.DISP-V.DDLT SUBTTL ASSEMBLY PARAMETERS ND FTNET,-1 ;DEFAULT NETWORK DISPLAY ON ND PDLEN,^D20 ;PUSH DOWN STACK LENGTH ND JIFSEC,^D60 ;LINE FREQ IF NO GETTAB ND INTVAL,^D10 ;NUMBER OF SECONDS BETWEEN UPDATES ND RELOCK,^D1000 ;# PASSES BEFORE CANCELLING /V ND DSKBKL,.DCMAX ;LENGTH OF DSKCHR BLOCK ND SWPTLN,^D16 ;LENGTH OF SWAPPING UNIT TABLE ND XDBLEN,^D64 ;SCRATCH DATA BLOCK LENGTH ND IPCPAG,377 ;IPCF PAGE TO USE ND MAXNDS,20 ;MAXIMUM NUMBER OF CI NODES ND NOSTCT,25 ;NUMBER OF STATISTICS COUNTERS HSIZE==^D39 SUBTTL PARAMETERS AND DEFINITIONS ;FLAGS (LH OF F) FL.SUP==1 ;SUPPRESS OUTPUT FL.DEV==2 ;DEVICE HEADER OUTPUT FL.GOD==4 ;I AM [1,N] FL.FLS==10 ;TOGGLE FOR FLASHING LINES FL.INC==20 ;TOGGLE DISPLAY OF INCREMENTAL STATISTICS FL.DOR==40 ;DORMANT SEG TABLE BEING PRINTED FL.SCN==100 ;NEW SCANNER SERVICE (FOR TTYTAB LAYOUT) FL.SPY==200 ;SPY UUO DONE SUCCESSFULLY FL.EOL==400 ;SYNC FOR CLEAR EOL IN OUTPUT FL.LOG==1000 ;LOGGING EACH SCREEN FL.REF==2000 ;ONE FOR FULL REFRESH PASS, 0 FOR PARTIAL FL.PDOR==4000 ;FIRST OR SECOND HISEG PASS FL.NBK==10000 ;NON-BLANK LINE FL.HLP==20000 ;LAST TYPEIN WAS JUNK--FLASH HELP FL.PEK==40000 ;PEEK UUO DONE SUCCESSFULLY FL.NHED==100000 ;NO HEADING ON 2ND COLUMN FL.LOCK==200000 ;JOB IS LOCKED INTO CORE FL.CRF==400000 ;GIVE A FREE CRLF AT RIGHT MARGIN IF NEEDED ;FLAGS (RH OF F) FR.JOB==1B18 ;JOBS ONLY (MULTI-COLUMN) IN "N" DISPLAY FR.SJB==1B19 ;EXPANDED JOB (72 CHARS WIDE), NO SYSTEM STUFF FR.ALT==1B20 ;SINGLE PASS ALTMODE FR.SKP==1B21 ;SKIP FIRST PART OF SYSTEM DISPLAY FR.DIS==1B22 ;DISPLAY INITIALIZED FR.KIX==1B23 ;RUNNING ON A KI-10 FR.KIP==1B24 ;CORE ALLOCATION IS IN PAGES FR.PDB==1B25 ;FLAG FOR SPY TABLE INITILIZATION FR.VMM==1B26 ;"M" OPTION DISPLAY FR.IDL==1B27 ;SUPPRESS IDLE JOBS FR.NRM==1B28 ;DISPLAY NORMAL PROGRAM AGAIN FR.OPR==1B30 ;SUPPRESS [OPR] JOBS FR.PCT==1B31 ;DISPLAY RUNTIME IN PERCENTAGE FR.NSF==1B32 ;NEW HIGH SEGMENT TABLE FORMAT FR.RVD==1B33 ;REVERSE VIDEO FR.RVR==1B34 ;REVERSE VIDEO REFRESH RESET FR.ALR==1B35 ;ALARM MODE ;STATUS BITS TO INITIALIZE ;STATUS BITS TO PRESERVE FX.MSK==FL.GOD!FL.FLS!FL.INC!FL.SCN!FL.SPY!FL.LOG!FL.REF!FL.HLP!FL.PEK!FL.LOCK,,FR.SJB!FR.ALT!FR.DIS!FR.KIX!FR.KIP!FR.RVD!FR.RVR!FR.ALR!FR.IDL!FR.SKP!FR.OPR!FR.PCT!FR.NSF OPDEF IFIW [1B0] .NODDT IFIW OPDEF CALL [PUSHJ P,] OPDEF RETURN [POPJ P,] DEFINE HEX(NUM),< ..X==0 IRPC(NUM),< ...X==-1 IFIDN <0>,<...X==^D00> IFIDN <1>,<...X==^D01> IFIDN <2>,<...X==^D02> IFIDN <3>,<...X==^D03> IFIDN <4>,<...X==^D04> IFIDN <5>,<...X==^D05> IFIDN <6>,<...X==^D06> IFIDN <7>,<...X==^D07> IFIDN <8>,<...X==^D08> IFIDN <9>,<...X==^D09> IFIDN ,<...X==^D10> IFIDN ,<...X==^D11> IFIDN ,<...X==^D12> IFIDN ,<...X==^D13> IFIDN ,<...X==^D14> IFIDN ,<...X==^D15> IFL ...X,< PRINTX ?Illegal Hexadecimal digit STOPI> ..X==..X*^D16 + ...X> ..X> DEFINE SET (LT,RT,TOP,BOT,NEXT,TABS)< PUSHJ P,SETUP XX=10 RADIX 10 BYTE (7)LT-1(7)RT-LT(5)TOP-1,BOT-1(2)NEXT(10)TABS-TAB0 RADIX XX > DEFINE TABSET (TABS)< PUSHJ P,TSETUP EXP TABS-TAB0 > DEFINE CHANGE (LT,RT,TOP,BOT,NEXT,TABS)< FIN SET LT,RT,TOP,BOT,NEXT,TABS > DEFINE FIN < TLO F,FL.NHED ;SET TO SUPPRESS SECOND HEADING PUSHJ P,CRLF ;CLEAR ALL REMAINING SPACE SKIPL LINE JRST .-2 TLZ F,FL.NHED > DEFINE HEADER(TEXT,%L) < CALL SETHDR ;REMEMBER HEADER CODE JRST %L ;SKIP HEADER PUSH P,M ;;SAVE M TEXT POP P,M ;;GET REGISTER BACK RETURN %L: > SUBTTL PSEUDO OPERATIONS ;THE FOLLOWING MACROS ALLOW THE DEFINITION OF PSEUDO OPCODES ;OPCODES .OPTXT==0 ;TEXT TO BE PRINTED .OPGTD==1 ;PRINT GETTAB X,Y IN DECIMAL .OPNWL==2 ;A NEW LINE .OPSTP==3 ;END OF PSEUDO PROGRAM .OPPLD==4 ;PRINT LEFT HALF IN DECIMAL .OPPRD==5 ;PRINT RIGHT HALF IN DECIMAL .OPGTB==6 ;GETTAB VALUE .OPPFS==7 ;PRINT A FLOAT SCALED .OPTAB==10 ;PRINT ATAB CHARACTER .OPLPA==11 ;PRINT A LEFT PAREN .OPRPA==12 ;PRINT A RIGHT PAREN .OPPER==13 ;PRINT A PERIOD .OPPLS==14 ;PRINT A PLUS SIGN .OPPRP==15 ;PRINT RIGHT DECIMAL PADDED .OPMAX==15 ;LAST ONE DEFINE .TXT(TEXT) < BYTE (9).OPTXT(9)0(18)[ASCIZ \TEXT\] > DEFINE .PGTBD(X,Y) < BYTE (9).OPGTD(9)X(9)0(9)Y > DEFINE .NWLIN < BYTE (9).OPNWL(27)0 > DEFINE .END < BYTE (9).OPSTP(27)0 > OPDEF .PLD[4B8] OPDEF .PRD[5B8] DEFINE .GTB(X,Y,WHERE) < BYTE (9).OPGTB(9)X(18)Y Z WHERE > OPDEF ..PRDP[15B8] DEFINE .PRDP(WHERE,FACTOR) < ..PRDP WHERE EXP FACTOR > OPDEF ..PFLS[7B8] DEFINE .PFLS(WHERE,SCALE) < ..PFLS WHERE EXP SCALE > DEFINE .INL(%L) < MOVEI A,.+2 ;;GET PSEUDO PC JRST PSEUDO ;;AND START PSEUDO INTERPRETATION > DEFINE .TAB < BYTE (9).OPTAB(27)0 > DEFINE .LPA < BYTE (9).OPLPA(27)0 > DEFINE .RPA < BYTE (9).OPRPA(27)0 > DEFINE .PER < BYTE (9).OPPER(27)0 > DEFINE .PLS < BYTE (9).OPPLS(27)0 > SUBTTL TOP LEVEL PROGRAM ;START HERE SYSDPY: JFCL ;ALLOW FOR CCL ENTRY SETZB 0,ZER ;CLEAR OUT SCRATCH MOVE A,[ZER,,ZER+1] BLT A,LZER MOVEI 17,1 ;CLEAR BLT 17,16 ; ACS MOVE P,[IOWD PDLEN,PDLST] ;INITIALIZE PDL POINTER SETZ F, ;NO FLAGS SETOM .FRAJR ;AUTOMATIC ROLL FEATURE JUMPPT A,,KA10 ;SEE IF KI-10 TRO F,FR.KIX!FR.KIP ;YES--SET FLAG KA10: MOVE A,[%CNVER] ;GET MONITOR VERSION GETTAB A, ;GET MONITOR VERSION VIA UUO!! SETZM A ;VERY OLD!! MOVEM A,MONVER ; TESTS HRRZS A ;KEEP JUST DEC VERSION CAILE A,70307 ;MONITOR HAVE NEW HIGH SEGMENT TABLE FORMAT? TROA F,FR.NSF ;YES TRZ F,FR.NSF ;NO MOVX A,%CNDJB ;ASK MONITOR FOR GETTAB A, ;PJOBN/DEVJOB INFORMATION MOVE A,[POINT 9,20,35] ;6-SERIES MONITORS HRRM A,PJOBNO ;SAVE DEVJOB INDEX HLLM A,PJOBNP ;AND POINTER TO JOB NUMBER IN SAME SYSD00: MOVX A,%CNPGS ;GET "PAGE" SIZE PUSHJ P,GETZ ;FROM MONITOR JFFO A,.+1 ;COUNT BITS MOVN B,B ;NEGATIVE LEADING ZEROS ADDI B,^D35 ;POSITIVE TRAILING ZEROS MOVEM B,P2WLSH ;SO CAN LSH @P2WLSH MOVN B,B ;NEGATIVE HRRZM B,W2PLSH ;SO CAN LSH @W2PLSH SETZM DUAL ;ASSUME ONE CPU MOVE A,[%CNSTS] ;GET STATUS WORD PUSHJ P,GETA ;IN A TLNE A,(ST%DUL) ;A DUAL PROCESSOR SYSTEM SETOM DUAL ;YES FLAG IT MOVE A,[%CNTIC] ;NO OF TICKS PER SECOND PUSHJ P,GET ;GETTAB PRESENT? MOVEI A,JIFSEC ;NO, PRESET JIFFY CLOCK MOVEM A,TCKSEC MOVEI A,NORMAL ;SET NORMAL PROGRAM ON ENTRY MOVEM A,PROGRM ;SAVE DISPLAY PROGRAM ADDRESS RESET ;RESET THE WORLD HRROI A,.GTPRV ;GET OUR PRIVS PUSHJ P,GETZ ; FROM MONITOR TXNE A,JP.SPM ;SEE IF CAN SPY ON MONITOR TLO F,FL.GOD ;YES--SET GOD FLAG PUSHJ P,OPNTTY ;OPEN THE TTY CHANNEL MOVE A,XGETTS ;GETTAB SELF TABLE PUSHJ P,GETZ ;GET IT JUMPE A,START ;OK? MOVEM A,GTTSLF ;SAVE SELF POINTER MOVE A,XPDBPT ;PTR TO PTR TO PDB'S PUSHJ P,GETZ ;GET PTR TO PDB'S SKIPLE A ;SKIP IF ABSENT TDO A,[XWD N1,400000];SET BIT FOR SPYING SKIPL A ;SEE IF SWAPPING PDBS JRST SYSD03 ;NO--CONTINUE TRNE F,FR.KIX ;SEE IF KI-10 MOVEI A,0 ;KI SWAP PDB--CLEAR POINTER SYSD03: MOVEM A,PDBPTR ;AND SAVE FOR SPYING MOVE A,XSYSSZ ;HOW MUCH TO ASK FOR IN SPY PUSHJ P,GETA MOVEI A,-1(A) CAILE A,377777 ;MORE THAN 17 BITS WORTH? MOVEI A,377777 ;YES, REDUCE TO THE MAX MOVEM A,SPYSIZ ;REMEMBER HOW MUCH EXEC VIRTUAL WE HAVE SPY A, ;ASK FOR IT JRST SYSD04 ;CAN'T HAVE IT TLOA F,FL.SPY ;GOT IT. REMEMBER IT SYSD04: SETZM SPYSIZ ;NO SPYING THIS TIME HRRZ A,GTTSLF ;GET A NON ZERO LOCATION PUSHJ P,MPEEK ;PEEK OR SPY SKIPE A ; 0, PEEK FAILED TLO F,FL.PEK ; ELSE SHOW PEEK WORKS ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE START: PUSHJ P,IJBDAT ;READ SYSTEM PARAMETERS SKIPN TTYFLG ;CAN WE GET TTY DATA TLNE F,FL.PEK!FL.SPY ;SPYING OR PEEKING POSSIBLE? JRST START0 ;YES THEN NO SURPRISES MOVEI A,NOSPPK ;NO SPY OR PEEK WARNING MOVEM A,PROGRM ;SET THE PROGROM WORD START0: MOVEI A,CCINT ;SETUP ^C INTERCEPT MOVEM A,.JBINT ; TO RELEASE /V MODE SETZM CCIOPC ; CLEAR OLD PC ON RESTART ;(START OF EDIT 1 PART 1) IFE V.DISP-V.DVBX,< MOVEI A,1 ;PREPARE TO LOCK LOW SEGMENT LOCK A, ;TRY TO LOCK JRST [OUTSTR [ASCIZ /?LOCK FAILED /] EXIT] > ;END OF IFE V.DISP-V.DVBX (END OF EDIT 1 PART1) ; LOOP HERE TO REFRESH ENTIRE SCREEN SYSTT0: TLNN F,FL.GOD ;SEE IF GOD TRNE F,FR.NRM ;DO NOT GO TO ALTMOD WHEN SKIPA ;EITHER GODLY OR GETTING NORMAL TRO F,FR.ALT ;NO--TIME TO STOP AUTO UPDATES SYSTT1: TLO F,FL.REF ;SHOW FULL-REFRESH PASS MOVE A,[XWD 240240,240240] MOVEM A,DBUF MOVE A,[XWD DBUF,DBUF+1] BLT A,DBFEND PUSHJ P,CLEAR ;CLEAR SCREEN AT FIRST MOVNI A,REPRAT MOVEM A,REPS IFN V.DISP-V.DVBX,< PUSHJ P,HOME PUSHJ P,FRCOUT ;FORCE OUTPUT > ;END OF IFN V.DISP-V.DVBX IFE V.DISP-V.DHZL, < PUSHJ P,HOME ;PUT OUT A SECOND HOME FOR HAZELTINE > ;END OF IFE V.DISP-V.DHZL ; LOOP HERE TO UPDATE SCREEN REENT: IFN V.DISP-V.DVBX,< PUSHJ P,HOME PUSHJ P,FRCOUT ;FORCE OUTPUT > ;END OF IFN V.DISP-V.DVBX TDZ F,[-1-FX.MSK] ;CLEAR MOST FLAGS IFE *,< ;IF SYSV61 OR SYSANS TLNN F,FL.REF ;REFRESH PASS? TRZN F,FR.RVR ;NO - TIME TO RETURN TO REVERSE VIDEO? CAIA ;LEAVE VIDEO ALONE PUSHJ P,RVIDEO ;NEED TO RESTORE REVERSE VIDEO AFTER REFRESH > ;END OF IFE V.DISP-V.DV61 OR SYSANS REENT0: SETOM NLTYPD ;FLAG SOMETHING TYPED CALL @PROGRM ;GO TO CURRENT DISPLAY PROGRAM SKIPN NLTYPD ;ANYTHING TYPED JRST REENT0 ;NO GET NEXT PAGE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;HERE AT END OF SCREEN CONSTRUCTION TO OUTPUT SCREEN AND DO OVERHEAD FINIS: FIN ;COMPLETE SCREEN TLCN F,FL.FLS ;COMPLEMENT FLASHER TLNN F,FL.HLP ;SEE IF HELP ADVISED JRST FINISH ;NO-SKIP ADVISORY SET 55,XSIZE+1,YSIZE,YSIZE+1,0,TAB0 MOVEI M,[ASCIZ / Type H for Help/] PUSHJ P,MSG FINISH: TLNE F,FL.LOG ;LOGGING SCREENS? PUSHJ P,LISCR ;YES, LIST THIS SCREEN IFE ****,< TLNN F,FL.REF ;SEE IF REFRESH CYCLE JRST FINISQ ;NO--USE DIRECT CURSOR ADDRESSING ;YES--DO IT THE LONG WAY > ;END OF IFE **** IFE ******,< ; BUFFER DUMP ROUTINE FOR INCREMENTAL POSITIONING DISPLAYS (VT06) MOVE BP,[POINT 9,DBUF] PUSHJ P,HOME SETZB C,D ;CURRENT CURSOR POS SETZM LINE FIN5: SETZM COL TLZ F,FL.EOL FIN4: PUSHJ P,GETCH CAIN T2,400!" " ;TEST FOR BLANK CHANGED TO BLANK MOVEI T2," " ; YES, CONVERT TO NORMAL BLANK TRNE T2,400 ;TEST FOR *SOMETHING* CHANGE TO BLANK MOVEI T2,200!" " ; YES, SHOW IT AS SUCH MOVE CH,T2 TRZN CH,200 ;NEW? TLNE F,FL.EOL ;OR CONSIDERING BLANK LINE? PUSHJ P,FINR ;YES AOS T1,COL ;COUNT COLUMNS CAIGE T1,XSIZE ;DONE LINE? JRST FIN4 FIN3B: TLNN F,FL.EOL ;CLEAR LINE IN ORDER? JRST FIN6 ;NO MOVX CH,EREOL ;END OF LINE PUSHJ P,DPYOUT IFE *,< PUSHJ P,FILLIT ;ADD FILLERS > ;END OF IFE * FIN6: AOS T1,LINE CAIGE T1,YSIZE ;DONE WITH LAST LINE? JRST FIN5 ;NO JRST FINSLP >; END OF IFE V.DISP-V.DVT6/DV51/DV5B/DV61/DV50/DV52/ANSI IFE ******,< ; ; BUFFER DUMP ROUTINE FOR ABSOLUTE POSITIONING DISPLAYS ; (HAZELTINE 2000, DELTA DATA TELTERM, VT05) FINISQ: SETZB XCUR,YCUR MOVSI J,- ;GET # OF CHARACTERS, -1 MOVE BP,[POINT 9,DBUF] FINIS0: ILDB T2,BP CAIN T2,400!" " ;TEST FOR BLANK CHANGED TO BLANK JRST [MOVEI CH," " ; YES, GET 'NORMAL' BLANK DPB CH,BP ;CLEAR BIT IN CHAR BUFFER JRST FINIS1] ; & CONTINUE TRNE T2,400 ;TEST FOR *SOMETHING* CHANGED TO BLANK MOVEI T2,200!" " ; YES, CONVERT TO CHANGED BLANK TRZN T2,200 FINIS1: AOBJN J,FINIS0 JUMPGE J,FINSLP DPB T2,BP HRRZ C,J IDIVI C,XSIZE EXCH C,D IFE V.DISP-V.DDLT, < CAIN T2," " ;TEST FOR DELTA-DATA BLANK PUSHJ P,DPYSPC ; YES, GO LOOK FOR SPECIAL HANDLING > ;END OF IFE V.DISP-V.DDLT CAIE D,(YCUR) PUSHJ P,DPYPOS CAIE C,(XCUR) PUSHJ P,DPYX MOVEI CH,(T2) PUSHJ P,DPYOUT IFE V.DISP-V.DDLT, < CAIE T2,23 ;TEST FOR DELTA-DATA "CLEAR LINE" JRST FINIS2 ; NO, JUMP SOS XCUR ;BACK UP X-POSITION FOR NO-UPDATE MOVE D,LASTCR(YCUR) ;GET LAST CHARACTER WRITTEN ON SCREEN MOVEM XCUR,LASTCR(YCUR) ; & UPDATE TO NEW POSITION SUB D,XCUR ; MINUS WHERE LAST CHARACTER WILL BE MOVMS D ;GET MAGNITUDE OF CURSOR MOVEMENT ASH D,-1 ; DIVIDE BY 2 PUSHJ P,DPYFIL ;PUT OUT A FILL CHARACTER SOJG D,.-1 ;REPEAT AS NECESSARY FINIS2: CAIGE XCUR,XSIZE-1 ;TEST FOR END OF DELTA-DATA LINE AOJA XCUR,FINIS3 ; NO, UPDATE X-POSITION & JUMP MOVEM XCUR,LASTCR(YCUR) ;SHOW CURRENT LAST-CHARACTER SETZ XCUR, ;SHOW AT LEFT SIDE OF NEXT LINE AOJA YCUR,FINIS1 ; NO, UPDATE Y-POSITION & REPEAT FINIS3: CAMLE XCUR,LASTCR(YCUR) ;TEST FOR HIGHER VALUE MOVEM XCUR,LASTCR(YCUR) ; YES, UPDATE L/C POSITION JRST FINIS1 ; & REPEAT >; END OF IFE V.DISP-V.DDLT IFN V.DISP-V.DDLT, < AOJA XCUR,FINIS1 ;UPDATE POSITION & REPEAT >; END OF IFN V.DISP-V.DDLT >; END OF *** IFE V.DISP-V.DVBX, < MOVE A,[353535,,353535] MOVE B,DISBES ;CLOBBER OLD JUMP MOVEM A,(B) MOVEM A,1(B) MOVE A,[POINT 9,DBUF] ;POINT AT TEMP AREA MOVE B,[POINT 6,DISBUF] ;POINT AT DISPLAY BUFFER MOVEI J,YSIZE ;LINE COUNTER DLP1: MOVEI JS,XSIZE ;COL. COUNTER DLP2: ILDB CH,A ;GET NEXT CHARACTER TRZE CH,400 ;CLEAR BLANK CODE MOVEI CH," " ;CONVERT TO SPACE ANDI CH,177 ;MASK TO ASCII CAIGE CH,40 ;SEE IF CONTROL JRST DCNTRL ;YES--GO HANDLE CAIGE CH,100 ;SEE IF ALPHA JRST DOK ;NO--MUST BE OK CAILE CH,132 ;SEE IF ALPHA JRST DCNTRL ;NO--HANDLE SUBI CH,100 ;YES--CONVERT TO DISPLAY CODE DOK: PUSHJ P,DSTORE ;STORE IN DISPLAY VECTOR SOJG JS,DLP2 ;LOOP ACROSS LINE MOVEI CH,34 ;STORE NEW-LINE PUSHJ P,DSTORE ; SEQUENCE MOVEI CH,33 ; .. PUSHJ P,DSTORE ; .. SOJG J,DLP1 ;LOOP FOR ALL LINES MOVEI CH,40 ;GET A BLANK DLP3: HLRZ C,B ;SEE IF AT MIDDLE OF WORD CAIN C,300600 ; .. JRST DDONE ;YES--PROCEED IDPB CH,B ;NO--STUFF A BLANK JRST DLP3 ;LOOP UNTIL DONE DDONE: MOVEI CH,37 ;STORE ESCAPE IDPB CH,B ; CODE MOVEI CH,160000 ;ESCAPE TO MODE 7 HRRM CH,(B) ; .. MOVEI CH,DISPLA ;JUMP TO START MOVEM CH,1(B) ; .. HRRZM B,DISBES ;STORE NEW END LOCATION HRLI B,2(B) ;START DOWN TWO MOVE A,[353535,,353535] MOVEM A,2(B) ;CLEAR REST OF BUFFER ADDI B,3 ;COMPLETE BLT POINTER BLT B,DISBEN-1 ;CLEAR REST OF BUFFER TRON F,FR.DIS ;SEE IF INITIALIZED YET OUTPUT DIS,[DISPLA 0] JRST FINSLP ;AND PROCEED ;HERE ON SPECIAL CHARACTER DCNTRL: CAIL CH,140 ;SEE IF LOWER CAILE CH,172 ; CASE ALPHA JRST NOTLC ;NO--TRY AGAIN SUBI CH,140 ;CONVERT TO DISPLAY CODE SIO: PUSH P,CH ;SAVE CHARACTER MOVEI CH,36 ;YES--SWITCH TO L.C. PUSHJ P,DSTORE ; .. POP P,CH ;RESTORE CHARACTER PUSHJ P,DSTORE ;STORE IT MOVEI CH,35 ;BACK TO U.C. JRST DOK ;AND STORE THAT NOTLC: CAIN CH,133 JRST OBRAK CAIN CH,135 JRST CBRAK CAIN CH,136 JRST UPARRO MOVEI CH,0 ;ELSE GIVE UP JRST DOK ;PRINT INDIRECT OBRAK: MOVEI CH,53 ;GET CHAR JRST SIO ;GO STORE AND SHIFT BACK CBRAK: MOVEI CH,54 ;GET CHAR JRST SIO ;GO STORE AND SHIFT BACK UPARRO: MOVEI CH,46 ;GET CHAR JRST SIO ;GO STORE AND SHIFT BACK ;ROUTINE TO STORE IF ROOM DSTORE: HRRZ T1,B ;GET ADDRESS CAIGE T1,DISBEN-5 ;SEE IF NEAR END IDPB CH,B ;NO--STORE ; AND FALL INTO POPJ P, HOME: ;ROUTINE TO HOME UP THE SCREEN CLEAR: ;ROUTINE TO CLEAR THE SCREEN HOMDWN: ;ROUTINE TO POSITION TO BOTTOM OF SCREEN POPJ P, ;JUST RETURN >; END OF IFE V.DISP-V.DVBX FINSLP: IFN V.DISP-V.DVBX,< PUSHJ P,HOME ;RETURN TO HOME POSITION PUSHJ P,FRCOUT ;FORCE OUTPUT TLZE F,FL.REF ;TEST FOR REFRESH PASS JRST HIBER0 ;GO RIGHT NOW >; END OF IFN V.DISP-V.DVBX TLNN F,FL.LOCK ;SEE IF /V MODE JRST FINSL0 ;NOT V MODE AOSL RELCKC ;COUNT TO AUTO UNLOCK CALL UNLOCK ;UNLOCK JOB FINSL0: CALL GETOPR ;GET DATA FROM OPR SKIPA ;NO DATA THERE PJRST FINX ;PROCESS OPERATOR REQUEST SKIPG J,HIBTIM ;GET WAIT TIME MOVEI J,INTVAL*^D1000 ;NONE, USE DEFAULT TLO J,(HB.RTL!HB.RTC) ;WAKE UP ON TTY ACTIVITY HIBER J, PUSHJ P,[ANDI J,-1 ;HIBER FAILED, MS TO SLEEP IDIVI J,^D1000;SECONDS TO SLEEP SLEEP J, ;SLEEP POPJ P,] ;DO NORMAL STUFF HIBER0: MOVEI J,"N" ;NORMAL TO GO NOW? TRNE F,FR.NRM ;IF SO DESIRED JRST FINX ;DO AS IF N WAS TYPED PJRST FINOPR ;FINISH ANY REQUESTS ;FINOPR IS USED TO PROCES ALL THE OPERATOR CHARACTERS ;THIS CODE EXITS TO REENT OR SYSTT0 FINOPR: CALL GETOPR ;SEE IF ANY INPUT SKIPA ;(NO) DO EXIT LOGIC JRST FINX ;PROCESS CHARACTER TRNN F,FR.ALT ;STARTING TO WAIT JRST FINOP0 ;NOPE STILL BUSY FREEZE: INCHRW J ;WAIT FOR INPUT JRST FINX ;HERE TO GO AFTER WE GOT CHAR FINOP0: TLNE F,FL.REF ;REFRESH WISHED JRST SYSTT1 ;YES DO IT TLNE F,FL.GOD ;SEE IF GOD TLNN F,FL.LOCK ;SEE IF LOCKED AOSGE REPS JRST REENT JRST SYSTT0 ;FINX IS ENTERED WITH A COMMAND CHARACTER IN J FINX: TRZ F,FR.ALT ;UNFREEZE THE SCREEN CAIL J,"A"+40 ;SEE IF LOWER CASE CAILE J,"Z"+40 ; ALPHABETIC SKIPA ;NO LEAVE ALONE SUBI J,40 ;YES--CONVERT TO UPPER CASE MOVSI A,-CHRN ;SEARCH CONTROL CHARACTER TABLE FINXCL: HLRZ B,CHRTAB(A) ;GET NEXT CANDIDATE CAIE B,(J) ;SEE IF MATCH CAIN B,PRGFLG(J) ;OR MATCH ON PROGRAM JRST FINXCX ;YES--GO HANDLE AOBJN A,FINXCL ;NO--TRY NEXT ;NOT IN TABLE-- ;HERE FOR SPECIAL PROCESSING OF A DIGIT CAIL J,"0" ;CHECK THE RANGE CAILE J,"9" ; 0-9 JRST FINXC1 ;NO SUBI J,"0" ;CONVERT TO DECADE DIGIT EXCH J,NUMBER ;GET ACCUMULATED NUMBER SO FAR IMULI J,^D10 ;SHIFT OVER A DECADE ADDB J,NUMBER ;MAKE NEW NUMBER AOS NUMFLG ;NOTE EXPLICIT NUMBER TYPED IN JRST FINOPR ;KEEP GOING FINXC1: CAIL J,40 ;SKIP IF NOT CONTROL TLO F,FL.HLP ;NOT FOUND--SET HELP MESSAGE FLAG JRST FINOPR ;AND TRY NEXT ONE FINXCX: TLZ F,FL.HLP ;CLEAR HELP NEEDED FLAG SKIPGE B,CHRTAB(A) ;GET PROGRAM ADDRESS OR SUBROUTINE JRST FINXC0 ;ONLY SET DISPLAY ADDRESS CALL (B) ;DO ACTION CODE SETZM NUMBER ;RESET COMMAND NUMBER PREFIX SETZM NUMFLG ;AND NUMBER TYPED FLAG PJRST FINOPR ;GET ANOTHER COMMAND FINXC0: PUSHJ P,REFRSH ;GET A FRESH SCREEN SETZM FIRJOB ;ALWAYS START AT THE END FINXC9: HRRM B,PROGRM ;STORE FINAL DISPLAY ADDRESS JRST FINOPR ;AND SEE WHAT MORE IN STORE ;GETOPR GET A CHARACTER IN J IF THERE IS ANY TYPED ;BY THE OPERATOR. RETURN A CONTROL C CHARACTER ;IF CCIOPC IS .NEQ. 0 GETOPR: SKIPN CCIOPC ;DO NOT LOSE CHARACTER LOSER: INCHRS J ;GET ONE IF ANY SKIPE CCIOPC ;NO CHARACTER AND NO ^C SETCNC: AOSA (P) ;PREPARE THE SKIP RETURN RETURN ;NORMAL RETURN NOTHING THERE SKIPE CCIOPC ;A NORMAL CHARACTER? MOVEI J,.CHCNC ;NO GET CONTROL C RETURN ;NDECW -- INPUT A DECIMAL NUMBER FROM OPERATOR ; ;RETURNS NUMBER IN AC N; COUNT OF DIGITS TYPED IN AC N1 NDECW: SETZB N,N1 ;INITIALIZE COUNTS NDECW0: INCHWL CH ;READ IN A CHARACTER CAIL CH,"0" ;VALID DECIMAL DIGIT? CAILE CH,"9" ;. . . POPJ P, ;NOPE, ALL DONE IMULI N,^D10 ;YES, NEXT DECADE ADDI N,-"0"(CH) ;ADD IN THIS DECADE AOJA N1,NDECW0 ;AND COUNT DIGITS ;TABLE FOR ACTION CHARACTER DISPATCH PRGFLG==400000 ;SIGN BIT FLAGS THIS IS A DISPLAY PROGRAM DEFINE DISPLAY(A,B)< PRGFLG+A,,B> CHRTAB: XWD " ",CPOPJ ;UPDATE SCREEN IMMEDIATELY XWD "-",DWNJOB ;BACK UP JOBS BY 20. XWD "+",UPJOB ;MOVE UP JOBS BY 20. XWD .CHCNC,ALLDON ;IF ^C, GO EXIT XWD .CHCNZ,ALLDON ;IF ^Z, GO EXIT XWD .CHESC,ALTMOD ;ALTMOD, FREEZE THE SCREEN XWD "V",STLOCK ;TOGGLE LOCK/UNLOCK HPQ 0/1 STATUS XWD "R",REFRSH ;IMMEDIATE REFRESH ON THE SCREEN XWD "W",WAITIM ;READ WAIT TIME XWD "I",TGLINC ;TOGGLE INCREMENTAL STATISTICS XWD "A",ALTJOB ;AUTO ROLL JOBS XWD "L",LOGSCR ;SCREEN LOGGING XWD "S",TGLSJB ;TOGGLE SYSTEM OR EXPANDED JOBS IN "N" XWD "O",TGLOPR ;TOGGLE [OPR] SUPPRESSION XWD "!",TGLIDL ;TOGGLE NON-IDLE JOBS XWD "#",TGLTTY ;TOGGLE TTY OUTPUT FLAG XWD "%",TGLPCT ;TOGGLE RUNTIME OR PERCENTAGE XWD "^",TGLSKP ;TOGGLE SKIP/ADVANCE OF SYSTEM IN "N" IFE ,< XWD .CHCNR,RVIDEO XWD .CHCNA,ALARM > IFE ,< ; XWD .CHCNR,RVIDEO ; > ; IF2,< IFNDEF DEVPRG, IFNDEF MEMPRG, > ;TABLE FOR SCREEN SELECTOR DISPLAY "N",NORMAL ;NORMAL DISPLAY DISPLAY "F",FILPRG ;FILE SYSTEM DISPLAY DISPLAY "D",DEVPRG ;DEVICES DISPLAY DISPLAY "J",JOBPRG ;JOBS DISPLAY "M",MEMPRG ;MEMORY AND SWAPPER DISPLAY "H",HELP ;HELP TEXT IFN FTNET,< DISPLAY "C",DCNSTA ; List DECNET LINK Status DISPLAY "*",DCNNOD ; Node Status DISPLAY "T",NETPRG ;DISPLAY THE NETWORK TOPOLOGY DISPLAY "\",NETSTT ;DISPLAY THE NETWORK STATISTICS DISPLAY "E",ETHDPY ;ETHERNET DISPLAY DISPLAY "Z",LATDPY ;LAT SERVER DISPLAY > DISPLAY "K",CISTAT ;DISPLAY CI STATISTICS DISPLAY "Q",QUEPRG ;DISPLAY THE QUEUES CHRN==.-CHRTAB ;HERE WHEN USER TYPES +, TO ADVANCE JOBS BY 20. UPJOB: SKIPG A,NUMBER ;USER GIVE EXPLICIT SKIP VALUE? MOVEI A,UPDNJB ;NO, USE DEFAULT INCREMENT TRNE F,FR.VMM ;VM TYPE OF DISPLAY SUBI A,2 ;IN THAT CASE 2 LINES ARE LOST ADDM A,FIRJOB ;ADVANCE JRST MOVJOB ;GO TO COMMON ROUTINE ;HERE WHEN USER TYPES -, TO BACK UP JOBS BY 20. DWNJOB: SKIPG A,NUMBER ;USER GIVE EXPLICIT SKIP VALUE? MOVEI A,UPDNJB ;NO, USE DEFAULT INCREMENT MOVN A,A ;AND MAKE IT A DECREMENT TRNE F,FR.VMM ;VM DISPLAY ON ADDI A,2 ;THEN TWO LESS ADDM A,FIRJOB ;RETARD SKIPGE FIRJOB ;SEE IF TOO FAR SETZM FIRJOB ;YES--SET TO START MOVJOB: SETZM .FRAJR ;CLEAR AUTO ROLL FEATURE HRRZ A,PROGRM ;GET DISPLAY PROGRAM CAIL A,MEMPRG ;IF DISPLAY IS CAILE A,NORMAL ;NOT J/M/N POPJ P, ;THEN NO JOB LIMIT CHECK (E.G., H DISPLAY) MOVE A,XHGHJB ;GET GETTAB PARM FOR HIGHEST ACTIVE JOB PUSHJ P,GETZ ;GO TRY TO READ IT FROM SYSTEM SKIPN A ; GOT IT, SKIP MOVE A,JOBN ; ERROR, GET HIGHEST JOB NUMBER SUB A,FIRJOB ;MINUS FIRST JOB TO BE DISPLAYED SUBI A,UPDNJB-1 ;MINUS # OF JOBS DISPLAYED, MINUS 1 SKIPGE A ;SKIP IF JOBS FOR ENTIRE SCREEN ADDM A,FIRJOB ; ELSE BACK FIRST JOB # DOWN SKIPGE FIRJOB ;TEST FOR TOO FAR BACK SETZM FIRJOB ; YES, LEAVE IT AT ZERO RETURN ;HERE WHEN A TYPED TO FLAG FOR AUTO JOB ROLL ;EACH PASS WILL ADVANCE TO NEXT PAGE OF JOBS UNTIL DONE ;THEN START OVER WITH 1. STOP MODE WITH A, +, -. ALTJOB: SETCMM .FRAJR ;TOGGLE ROLL FLAG RETURN ;HERE WHEN USER TYPES #, TO TOGGLE FLAG WHICH DETERMINES ;WHETHER TTYS DISPLAY FOR OPERATORS OR FOR CLEMENTS TGLTTY: SETCMM REALTT ;TOGGLE FLAG RETURN ;TOGGLE SUPPRESSION OF [OPR] JOBS TGLOPR: TRC F,FR.OPR ;TOGGLE [OPR] SUPPRESSION FLAG POPJ P, ;RETURN ;TOGGLE WHETHER J/M/N DISPLAY RUNTIME OR PERCENTAGE TGLPCT: TRC F,FR.PCT ;TOGGLE PERCENTAGE FLAG POPJ P, ;THAT'S THAT. ;TOGGLE WHETHER EXPANDED JOB (USER NAME, DISK READS/WRITES) OR ;USUAL SYSTEM DISPLAY IN "N" DISPLAY TGLSJB: TRC F,FR.SJB ;TOGGLE SYSTEM/JOB FLAG PJRST REFRSH ;AND MARK A REFRESH NEEDED ;TOGGLE WHETHER TO SKIP THE FIRST PART OF THE SYSTEM STATISTICS IN THE "N" ;DISPLAY (I.E., GO DIRECTLY TO STR/MNFT/FREE AND DEV/BY/HOW DISPLAYS ;TOGGLE WHETHER TO SKIP "NON-VALID" DELAY LINKS IN DECNET DISPLAY TGLSKP: TRC F,FR.SKP ;TOGGLE THE "SKIP" FLAG POPJ P, ;AND CONTINUE ;TOGGLE SUPPRESSION OF IDLE JOBS/ETC TGLIDL: SKIPE A,NUMFLG ;[610] WAS NUMBER TYPED? MOVE A,NUMBER ;[610] YES, USE IT FOR THRESHOLD VALUE IMUL A,TCKSEC ;[610] CONVERT JIFFIES TO SECONDS IDIVI A,^D100 ;[610] AND THEN TO 1/100 SECONDS MOVEM A,TRSHLD ;[610] SAVE THRESHOLD VALUE SKIPN A ;[610] WAS NUMBER GIVEN? TRC F,FR.IDL ;[610] NO, JUST TOGGLE SKIPE A ;[610] ELSE, IF NUMBER WAS GIVEN TRO F,FR.IDL ;[610] SET "!" POPJ P, ;[610] ;HERE WHEN ^C INTERCEPT CCTYPD: PUSH P,A ;SAVE AN AC HRRZ A,CCIOPC ;GET PC IN QUESTION CAIE A,LOSER ;GOING TO LOOSE A CHARACTER CAIN A,FREEZE ;SEE IF HUNG ON AN ALTMODE CCTYPC: MOVEI A,FINX ;YES--GO LOOK AT INPUT HRRM A,CCIOPC ;SAVE NEW OR OLD PC POP P,A ;RESTORE THE AC JRSTF @CCIOPC ;JUST RETURN AND CATCH IN MAIN ;LOOP. DON'T CLEAR IN CASE OF LOOP. ;HERE WHEN USER TYPES ^C OR ^Z, TO EXIT TO MONITOR ALLDON: IFE V.DISP-V.DV61,< ;IF VT61 TRNE F,FR.RVD ;IN REVERSE VIDEO? PUSHJ P,RVIDEO ;YES, CLEAR IT (EXIT WITH NORMAL VIDEO) TRNE F,FR.ALR ;IN "ALARM"ING MODE? PUSHJ P,ALARM ;YES, CLEAR IT > ;END OF IFE V.DISP-V.DV61 IFE V.DISP-V.ANSI,< ;IF VT100 TRNE F,FR.RVD ;IN REVERSE VIDEO? PUSHJ P,RVIDEO ;YES, CLEAR IT (EXIT WITH NORMAL VIDEO) > ;END OF IFE V.DISP-V.ANSI PUSHJ P,HOMDWN ;HOME DOWN SCREEN TLNE F,FL.LOG ;LOGGING SCREENS? CLOSE LOG, ;YES, CLOSE OFF FILE TLZE F,FL.LOG ;LOGGING SCREENS? RELEAS LOG, ;YES, LEGGO OF LOG DEVICE RESET ; & RESET EVERYTHING ELSE, TOO ALLDNE: MOVN J,MYJOB ;GET NEGATIVE OF CURRENT JOB # JOBSTS J, ;FIND OUT ABOUT ME MOVEI J,0 ; ERROR, SET FLAGS TO ZERO TXNE J,JB.ULI ;TEST FOR LOGGED IN JRST DOEXIT ; YES, GO EXIT SKIPE J ;(SKIP MSG IF NO JOBSTS UUO) OUTSTR KJMSG ;GIVE A 'KJOB' & A LOGOUT LOGOUT ; DITTO KJMSG: ASCII /.KJOB/ ;MESSAGE FOR END OF PROGRAM BYTE (7) 15, 12, ".", 0, 0 ; DITTO DOEXIT: EXIT 1, ;RETURN TO MONITOR, WITH .CONT PRIVILEGES TLZ F,FL.LOCK ;CLEAR LOCK (RESET DID IT) PUSHJ P,OPNTTY ;RE-OPEN TTY CHANNEL JRST START ; NOW START FROM THE TOP ALTMOD: TRC F,FR.ALT ;YES--SET FLAG RETURN ;FLAG JUST CLEARED OR SET STLOCK: MOVX J,LK.LLS!LK.LNE!LK.LNP!LK.LLC ;MINIMUM-OVERHEAD LOCK FLAGS TLCE F,FL.LOCK ;TEST FOR LOCKED NOW JRST UNLOCK ; YES, GO RESET & UNLOCK IFN V.DISP-V.DVBX,< LOCK J, ;ATTEMPT TO LOCK US JFCL ; FAILED >; END OF IFN V.DISP-V.DVBX HRROI A,.GTRTD ;REAL TIME WORD PUSHJ P,GETZ ;GO GET IT LDB A,[POINTR A,JR$HPC] ;USER LEVEL SET HPQ COMMAND MOVEM A,HPQCMD ;REMEMBER IT MOVEI A,1 ;GET FLAGS FOR HPQ #1 SKIPN HPQCMD ;IN NOT ALREADY IN HPQ, HPQ A, ;GET IN A HPQ (MAYBE) JFCL ; & IGNORE FAILURES MOVNI A,RELOCK ;SET FOR AUTO UNLOCK MOVEM A,RELCKC ; IN CASE OPER FORGETS SKIPN A,HIBTIW ;GET OPERATOR-SPECIFIED WAIT TIME MOVEI A,^D1000 ;NONE, USE DEFAULT (SHORT) MOVEM A,HIBTIM ;SET WAIT TIME RETURN UNLOCK: TLZ F,FL.LOC ;WE ARE UNCONDITIONALLY UNLOCKED NOW! IFN V.DISP-V.DVBX,< UNLOK. J, ;ATTEMPT TO UNLOCK MYSELF JRST SYSDPY ; FAILED, DO IT VIA 'RESET' >; END OF IFN V.DISP-V.DVBX MOVEI A,0 ;GET FLAGS FOR HPQ #0 SKIPN HPQCMD ;IF NOT SET HPQ COMMAND HPQ A, ;REQUEST NORMAL CPU PRIORITY JFCL ; IGNORE ERROR RETURN MOVE A,HIBTIW ;GET OPERATOR-SPECIFIED WAIT TIME MOVEM A,HIBTIM ;AND RESET WAIT TIME RETURN TGLINC: TLC F,FL.INC ;TOGGLE INCREMENTAL FLAG POPJ P, ;THAT'S THAT REFRSH: TLO F,FL.REF ;FORCE A REFRESH IFN *, ;IF NOT VT61 JUST RETURN, ELSE IFE *,< ;CHECK FOR REVERSE VIDEO TRNN F,FR.RVD ;IN REVERSE VIDEO? POPJ P, ;NO, JUST RETURN TO REFRESH TRO F,FR.RVR ;YES, RESTORE IT LATER JRST RVIDEO ;AND CANCEL IT FOR REFRESH > ;END OF IFE V.DISP-V.DV61 OR V.ANSI ;WAITIM -- SET WAIT TIME BETWEEN SCREEN UPDATES WAITIM: MOVE N,NUMBER ;PICK UP COMMAND ARGUMENT CAILE N,^D60 ;MAX OF (APPROX) ONE MINUTE MOVEI N,^D60 ;SET MAX IMULI N,^D1000 ;CONVERT TO MILLISECONDS CAIG N,0 ;IF USER TYPED EXPLICIT 0 MOVEI N,1 ;THEN MAKE INTO ONE TICK (NOT INFINITY) SKIPN NUMFLG ;BY THE WAY, AN EXPLICIT NUMBER WAS TYPED? SETZ N, ;NO, RETURN TO DEFAULT MOVEM N,HIBTIM ;SET WAIT TIME MOVEM N,HIBTIW ;AND REMEMBER OPERATOR GAVE IT POPJ P, ;RETURN WITH NEW WAIT TIME SET ;SCREEN LOGGING COMMAND AND SUPPORT LOGSCR: TLNE F,FL.LOG ;ALREADY LOGGING? POPJ P, ;YES, NOOP MOVE A,[LOGFLP,,FLPBLK] ;MAKE A COPY OF THE PROTOTYPE BLT A,FLPBLK+FLPLEN-1 ;LOG FILE FILOP. BLOCK MOVE A,[LOGLKE,,LKEBLK] ;MAKE A COPY OF THE PROTOTYPE BLT A,LKEBLK+LKELEN-1 ;LOG FILE ENTER BLOCK MOVE A,[FLPLEN,,FLPBLK] ;FILOP. ARG POINTER FILOP. A, ;APPEND SCREEN LOG JRST NOLOGS ;ERROR, FORGET IT TLO F,FL.LOG ;GOT IT, NOTE WE ARE NOW LOGGING ; SETOM LOGSCT ;SUPPRESS LEADING POPJ P, ;RETURN READY AND WILLING LOGFLP: FO.PRV! ;CHANNEL,,APPEND .IOASL ;ASCII MODE 'DSK ' ;ON DEVICE DSK: LOGOHD,,0 ;OUTPUT RING HEADER 0,,0 ;DEFAULT NUMBER OF BUFFERS 0,,LKEBLK ;ADDRESS OF ENTER BLOCK FLPLEN==.-LOGFLP LOGLKE: 3 ;LENGTH OF BLOCK 0 ;PATH [-] 'SYSDPY' ;FILENAME SYSDPY 'LOG ' ;EXTENSION .LOG LKELEN==.-LOGLKE LISCR: MOVEI T2,.CHFFD ;FORMFEED PUSHJ P,LISCH ;TO START THINGS OFF SETZB A,COL ;START AT COLUMN 0 SETZM LINE ;IN LINE 0 MOVEI B," " ;FOR SPACE FILL LISCR2: PUSHJ P,GETCH ;GET NEXT SCREEN CHARACTER TRNE T2,400 ;*SOMETHING* BLANKED OUT? MOVEI T2," " ;YES, LIST AS BLANK THEN ANDI T2,177 ;JUST THE CHARACTER CAIN T2," " ;A BLANK? AOJA A,LISCR5 ;YES, COUNT UP (MAYBE SUPPRESS) JUMPE A,LISCR4 ;OUTPUT CHAR UNLESS SAVED BLANKS EXCH T2,B ;IN WHICH CASE PUSHJ P,LISCH ;LIST BLANKS INSTEAD SOJG A,.-1 ;UNTIL CAUGHT UP WITH WHERE SHOULD BE EXCH B,T2 ;RETREIVE REAL CHARACTER LISCR4: PUSHJ P,LISCH ;OUTPUT CHARACTER LISCR5: AOS T1,COL ;ADVANCE COLUMN COUNTER CAIGE T1,XSIZE ;UNTIL THIS LINE FINISHED JRST LISCR2 ;MORE OF THIS LINE TO GO MOVEI T2,.CHCRT ;A PUSHJ P,LISCH ;TO END THIS LISTING LINE MOVEI T2,.CHLFD ;AND A PUSHJ P,LISCH ;TO END THE SETZB A,COL ;NO BLANKS, START OF LINE AOS T1,LINE ;ADVANCE TO NEXT LINE CAIGE T1,YSIZE ;DONE YET? JRST LISCR2 ;NOPE, DO ANOTHER LINE POPJ P, ;YES - SCREEN OUTPUT LISCH: SOSGE LOGOHD+2 ;ROOM FOR ANOTHER CHARACTER? JRST LISCH2 ;NO, ASK MONITOR FOR NEXT BUFFER IDPB T2,LOGOHD+1 ;STUFF THIS CHARACTER POPJ P, ;DONE LISCH2: OUTPUT LOG, ;ASK FOR NEXT BUFFER JRST LISCH ;ASSUME GOT ONE . . . SUBTTL VARIOUS "ERROR" MESSAGES ;SPY OR PEEK PRIVILEGES ARE REQUIRED FOR CERTAIN FUNCTIONS NOPRIV: NOSPPK: SET 1,XSIZE,1,YSIZE,0,TAB4 MOVEI M,NOSPTX ;WARNING CALL MSG ;SET UP THE MESSAGE JRST ADVICE ;TELL COMMON EXIT NOSPTX: ASCIZ \You do not have either PEEK or SPY privileges. \ ;"\" COMMAND BUT FTCMSR TURNED OFF IN MONITOR NOCMSR: SET 1,XSIZE,1,YSIZE,0,TAB4 ;STANDARD (FULL) SCREEN MOVEI M,NOCMTX ;SAY WHY IT FAILS PUSHJ P,MSG ;TELL USER PJRST ADVICE ;COMMON EXIT NOCMTX: ASCIZ \This monitor does not support network statistics. \ ;"K" COMMAND BUT FTSCA TURNED OFF IN MONITOR NOSCA: SET 1,XSIZE,1,YSIZE,0,TAB4 ;STANDARD (FULL) SCREEN MOVEI M,NOSCTX ;SAY WHY IT FAILS PUSHJ P,MSG ;TELL USER PJRST ADVICE ;COMMON EXIT NOSCTX: ASCIZ \This monitor does not support Systems Communications Architecture. \ NOCIP: SET 1,XSIZE,1,YSIZE,0,TAB4 ;STANDARD (FULL) SCREEN MOVEI M,NOCITX ;SAY WHY IT FAILS PUSHJ P,MSG ;TELL USER PJRST ADVICE ;COMMON EXIT NOCITX: ASCIZ \This monitor does not have any CI-20 interfaces. \ ;"L" COMMAND CAN'T ENTER/APPEND "LOG" FILE NOLOGS: SET 1,XSIZE,1,YSIZE,0,TAB4 MOVEI M,NOLOTX ;ERROR TEXT PUSHJ P,MSG ;SHOW ON SCREEN PJRST ADVICE ;AND CAP OFF NOLOTX: ASCIZ\? Can't create/append log file DSK:SYSDPY.LOG[-] \ ;COMMON ADVICE PRINTER ADVICE: MOVEI M,ADVTXT ;GET ADVICE TEXT ADDRESS CALL MSG ;AND PRINT IT TRO F,FR.NRM ;AND RETURN TO NORMAL TRZ F,FR.ALT ;DO NOT GET STUCK BY $ MODE TLZ F,FL.REF ;WAIT A SECOND RETURN ADVTXT: ASCIZ \ This display will be automatically replaced by the normal display. Type any command to effect immediate replacement. \ SUBTTL "H" -- DISPLAY HELP MESSAGE HELP: PUSHJ P,THISIS ;GIVE HEADER LINE PUSHJ P,CRLF ;BLANK LINE FOR NEATNESS TABSET TAB7 ;NORMAL TAB STOPS MOVE A,FIRJOB ;COUNT OF "JOBS" TO SKIP MOVEM A,EATCNT ;SET FOR EMSG SKIPN HLPADR ;ALREADY GOT HELP TEXT? JRST HELP0 ;NO, LOOK FOR IT ON DISK MOVE M,HLPADR ;GET HELP TEXT INTO M JRST HELP7 ;AND GO TYPE IT OUT HELP0: MOVEI A,.IODMP ;NO, PREPARE TO READ IT IN MOVSI B,'HLP' ;FROM HLP: SETZ C, ;(IN DUMP MODE) OPEN HLP,A ;OPEN HELP DEVICE JRST HELP6 ;HMMMMM . . . ;NOTICE THAT AT THIS POINT PECULIAR AC USEAGE APPEARS ;AC'S 0 TO 6 ARE USED BUT NOT AS M/A/B/C/D/J/JS . . . MOVEI .RBCNT,.RBSIZ ;LENGTH OF LOOKUP BLOCK SETZ .RBPPN, ;DEFAULT PATH MOVE .RBNAM,['SYSDPY'] ;NAME OF HELP FILE MOVSI .RBEXT,'HLP' ;AND ITS EXTENSION LOOKUP HLP,.RBCNT ;SEE IF HLP:SYSDPY.HLP EXISTS JRST [HRRZ N,.RBEXT;ERROR CODE CAIN N,ERFNF%;FILE NOT FOUND? JRST HELP6 ;YES, USE OUR TEXT MOVEI M,[ASCIZ\? LOOKUP error (\] ;MESSAGE PUSHJ P,MSGOCT;TELL USER OF WOES MOVEI M,[ASCIZ\) for help file HLP:SYSDPY.HLP\] JRST HELP7] ;CAP OFF ERROR MOVE A,.RBSIZ ;GET SIZE OF FILE ;NOW WE RETURN TO MORE RATIONAL AC USAGE . . . MOVN C,A ;FOR IOWD MOVE B,.JBFF ;ADDRESS FOR HELP TEXT ADDI A,1 ;GUARANTEE TRAILING ADDB A,.JBFF ;ALLOCATE SPACE CAMG A,.JBREL ;HAVE WE ROOM? JRST HELP1 ;YES CORE A, ;NO, ASK FOR SOME MORE JRST [MOVEI M,[ASCIZ\? Insufficient memory for reading help file text! \] ;TELL USER OF WOES JRST HELP7] ;GO DISPLAY TEXT MOVE A,.JBFF ;RESTORE AC A FROM CORE UUO ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE HELP1: MOVS C,C ;START IOWD HRRI C,-1(B) ;FINISH IOWD SETZ D, ;FINISH COMMAND LIST IN HLP,C ;READ HELP FILE SKIPA ;GOT IT JRST [MOVEI M,[ASCIZ\? I/O error reading HLP:SYSDPY.HLP \] ;MORE WOES JRST HELP7] ;GO TELL USER MOVEM B,HLPADR ;SAVE ADDRESS OF HELP TEXT RELEAS HLP, ;DITCH I/O CHANNEL SUB A,B ;GET BACK LENGTH SUBI A,1 ;REAL FILE LENGTH IMULI A,5 ;COUNT OF 7-BIT ASCII BYTES TLO B,(POINT 7,) ;MAKE INTO BYTE POINTER MOVE C,B ;COPY FOR RE-WRITTING HELP2: ILDB CH,B ;GET CHARACTER JUMPE CH,HELP3 ;SKIP OVER NULLS IDPB CH,C ;OK CHARACTER, STORE IT HELP3: SOJG A,HELP2 ;LOOP BACK FOR REST OF MESSAGE MOVEI CH,0 ;NOW WE WANT A IDPB CH,C ;TO TERMINATE HELP TEXT MOVE M,HLPADR ;ADDRESS OF HELP TEXT JRST HELP7 ;GO SET TO TYPE IT OUT HELP6: MOVEI M,HLPTXT ;USE OUR OWN MINI-HELP TEXT HELP7: PUSHJ P,EMSG ;LIST ASCIZ TEXT PUSHJ P,CHKDON ;SEE HOW SCREEN FARED JRST HELP ;NOT SO GOOD, TRY AGAIN POPJ P, ;REASONABLY WELL, GO SHOW IT ;AND OUR VERY OWN HELP TEXT HLPTXT: ASCIZ n+ Advance screen by "n" or approximately one screen-full n- Retreat screen by "n" or approximately one screen-full A Toggle Auto roll of all jobs C List DECNET link status E List Ethernet status F List file system statistics H List this text I List incremental statistics (where applicable) J List only jobs (in multiple columns) K List CI network status L Log screens into file DSK:SYSDPY.LOG[-] (Close on ^Z) M List virtual memory data N List normal (some of everything) status O Toggle suppression of [OPR] jobs in "N" & "M" display Q List the system queues R Refresh entire screen immediately S Toggle System or expanded job statistics in "N" display T Topology for network display V Toggle cpu and core priority Z List LAT server statistics nW Set wait time to "n" decimal seconds \ Display network statistics n! Toggle non-idle jobs; "n" specifies runtime threshold = n/100 seconds # Toggle PTY number or controlling job number % Toggle runtime or percentage of cpu ^ Toggle skipping system statistics in "N" display * List DECNET node status ^A Toggle alarm (flashing) mode (if applicable) ^C Terminate SYSDPY execution ^R Toggle reverse video updating (if applicable) ^Z Terminate SYSDPY execution Freeze screen as is (any subsequent command will thaw) SPACE Update screen display immediately  SUBTTL "N" DISPLAY, SOME OF EVERYTHING ;MEMPRG IS THE START OF THE DISPLAY PROGRAM FOR A VM SYSTEM ;NORMAL IS THE START FOR THE CLASSIC SYSTEM DISPLAY ;THE CONTROL FLOW IS REGULATED BY THE FLAG FR.VMM ;ONCE THIS FLAG HAS BEEN SET BY MEMPRG THEN NORMAL ;CAN DO THE JOB. NOTE: THAT IF THE SYSTEM DOES NOT ;SUPPORT VM THAT THE VM DISPLAY AND NORMAL DISPLAY ARE ;IDENTICAL. MEMPRG: TROA F,FR.VMM ;FLAG EXPANDED MEMORY DISPLAY ;AND SKIP INTO NORMAL JOBPRG: TRO F,FR.JOB ;FLAG JOBS ONLY ;AND FALL INTO NORMAL NORMAL: PUSHJ P,STROLL ;START DISPLAY VARIABLES SETOM NLTYPD ;MARK THAT LINES HAVE BEEN TYPED TRZ F,FR.NRM ;ONLY WHEN NORMAL FORGET FLAG PUSHJ P,WNDJOB ;SET JOB WINDOW SETZM JBUBZR ;CLEAR FIRST JOB USAGE WORD MOVE A,[JBUBZR,,JBUBZR+1] ;BLT POINTER TO BLT A,JBUEZR ;CLEAR ALL JOB USAGE FIGURES TRNE F,FR.VMM ;DOING VM DISPLAY? JRST NORMLA ;YES, DO INCREMENTALS IN ROUTINE THISIZ PUSHJ P,GUPTIM ;GET SYSTEM UPTIME SUB A,UPTIME ;A:= INCREMENTAL UPTIME ADDM A,UPTIME ;UPDATE TOTAL UPTIME TLNN F,FL.INC ;WANT INCREMENTAL OR TOTAL? MOVE A,UPTIME ;TOTAL MOVEM A,UPTINC ;SAVE INCREMENTAL UPTIME FOR OTHERS NORMLA: MOVE A,[%NSHJB] ;HIGHEST JOB NUMBER IN USE PUSHJ P,GET ;READ FROM MONITOR MOVE A,JOBN ;??? MOVEM A,JBNMAX ;REMEMBER IT PUSHJ P,GJBDAT ;READ ALL THE JOB DATA MOVN J,JBNMAX ;GET MAX JOB IN USE HRLZ J,J ;MAKE "IOWD" INDEX POINTER HRRI J,1 ;START WITH JOB 1 SUBTTL "N" DISPLAY -- JOBS NORML0: TLOE F,FL.NHED ;GOT HEADER YET? JRST NORML2 ;YES TRNE F,FR.VMM ;DOING VM DISPLAY? PUSHJ P,PAGSYS ;YES, TYPE SOME LEADING INFORMATION MOVEI M,[ASCIZ /Job Who Where What/] CALL MSG ;PRINT PART OF MESSAGE TRNE F,FR.VMM ;IS VIRTUAL M THERE JRST NORML1 ;YES THEN ALL SET MOVEI M,[ASCIZ / #/] CALL MSG ;PRINT MESSAGE CALL KAYPAG ;KAYS OR PAGES NORML1: MOVEI M,[ASCIZ / Virtual Physical PGR /] TRNE F,FR.VMM ;DOING MEMORY DISPLAY? PUSHJ P,MSG ;YES MOVEI M,[ASCIZ / State Runtime/] CALL MSG ;PRINT THE END OF THE LINE MOVEI M,[ASCIZ\ Reads Writes User\] TRNN F,FR.JOB!FR.VMM ;IN "J" OR "M" DISPLAY? TRNN F,FR.SJB ;NO, "N" DISPLAY, IN EXPANDED JOBS? CAIA ;NO, THEN NO DISK READS/WRITES/ETC. PUSHJ P,MSG ;YES, EXTRA HEADER PUSHJ P,CRLF ;CAP OFF HEADER LINE NORML2: MOVE JS,@JBSTS TXNN JS,JS$JNA JRST NORMNJ NORML3: AOS JBNUSE ;COUNT JOBS IN USE TXNE JS,JS$LOG ;JOB LOGGED IN? AOS JBNLOG ;YES, COUNT LOGGED-IN JOBS HRRZM J,CLINE ;WE ARE AT THIS LINE PUSHJ P,SETVIS ;DETERMINE VISIBLITY HRRZ N,J ;GET THE JOB NUMBER SKIPE VISIBL ;NEXT SCREEN DISPLAY CAN SHOW IT CAMGE N,FIRJOB TLO F,FL.SUP ;NO, SUPPRESS THIS JOB PUSHJ P,INCRTL ;[610] COMPUTE INCREMENTALS FOR THIS JOB TRNE F,FR.IDL ;[610] SUPPRESS IDLE JOBS? PUSHJ P,IDLEJB ;[610] YES, SEE IF JOB IDLE AND SUPPRESS IT NL3A: TRNN F,FR.OPR ;WANT TO SUPPRESS [OPR] JOBS? JRST NORML4 ;NO, ALWAYS SHOW MOVE A,@JBPPN ;YES, GET JOB'S PPN CAMN A,OPRPPN ;IS THIS AN [OPR] JOB? TLOA F,FL.SUP ;YES, SUPPRESS THIS JOB NORML4: TLNE F,FL.SUP ;WANT TO SUPPRESS THIS JOB? JRST SYSL0E ;YES, JUST GATHER FIGURES PUSHJ P,DECPRT ;PRINT THE JOB NUMBER PUSHJ P,TAB ;AND TERMINATE WITH A MOVE A,@JBPPN ;GET THE JOB'S PPN ; CAMN A,LOGPPN ;TEST FOR [2,5] ; JRST [PUSHJ P,STRWHO ; YES, PRINT **,** CAUSE WE DON'T KNOW ; JRST SYSL0D] CAMN A,OPRPPN ;TEST FOR [1,2] JRST [MOVE A,[SIXBIT/[OPR]/] ;YES, PRINT [OPR] PUSHJ P,SIXBP JRST SYSL0D] CAMN A,ME ;TEST FOR MY PPN JRST [MOVE A,[SIXBIT/[SELF]/] ;YES, PRINT [SELF] PUSHJ P,SIXBP JRST SYSL0D] PUSHJ P,PNTPPN ;PRINT PRJ-PRG # SYSL0D: PUSHJ P,TAB SYSL0E: SKIPN A,TTYFLG ;DO WE DECIDE HE IS DETACHED? JRST SYS3LD ;YES HE LOSES JUMPL A,SYS2LD ;JUMP IF PRIVILEGED TOPS10 STYLE HRRZ A,J ;GET JOB NUMBER TRMNO. A, ;GET LINE UDX JRST SYS3LD ;CAN ONLY BE DETACHED CAME A,CTYNDX ;IS IT CTY JRST SYS1LD ;NO GO ON MOVSI A,(SIXBIT .CTY.);SAY CTY JRST SYS3LD ;THAT'S ALL SYS1LD: DEVNAM A, ;GET THE DEVICE NAME SETZM A ;ZAP NAME ON FAILURE JRST SYS3LD ;PRINT IT SYS2LD: MOVE A,@TTLDB SYS3LD: PUSHJ P,PTYCTL ;CHANGE TO CONTROLLING JOB IF PTY TLNN A,-1 ;ATTACHED TO A TTY? AOS JBNDET ;COUNT DETACHED JOBS TLNE F,FL.SUP ;OUTPUT FOR THIS JOB? JRST SYSL2 ;NO TLNN A,-1 TLO A,'DET' HLRZ CH,A ;COPY L.H. OF NAME AS R.H. OF AC CAIN CH,'TTY' ;TEST FOR 'TTYNN' HRLZ A,A ; YES, CONVERT TO 'NN ' TRNN A,-1 JRST SYSL1G HRRZ CH,A LSH A,-14 HRR A,CH LSH A,14 TRNE A,-1 SOS COL ;BACK UP ONE IF NO ROOM SYSL1G: PUSHJ P,SIXTAB ;PRINT SIXBIT MSG FOLLOWED BY TAB MOVE A,@JBPRG ;GET THE PROGRAM NAME PUSHJ P,SIXTAB ;PRINT SIXBIT MSG FOLLOWED BY TAB SYSL2: PUSHJ P,VMHILO ;GET PHY AND VIRT LOW AND HIGH SIZES ADDM N,PHYUSE ;COUNT TOTAL (NON-SHARED) PHYSICAL IN USE ADDM N1,VIRUSE ;COUNT TOTAL (NON-SHARED) VIRTUAL IN USE ADDM BP,SHRSAV ;COUNT TOTAL MEMORY SAVED BY SHARING PUSHJ P,INACTC ;TEST FOR ACTIVE PROGRAM PUSHJ P,ACTVC ;YES, COUNT UP IT'S CONTRIBUTION TLNN F,FL.SUP ;SEE IF SUPPRESSED CALL PGDATA ;TYPE PAGING DATA TSTATE: MOVSI A,'^W ' ;"COMMAND WAIT" TXNE JS,JS$RUN ;RUN BIT ON? MOVSI A,'CW ' ;YES, CHANGE INDICATION TXNE JS,JS$CMW ;JOB IN COMMAND WAIT? JRST TSTAT9 ;YES. SAY SO REGARDLESS OF STATE MOVSI A,'OW ' ;"OPERATOR WAIT FOR DEVICE" TXNE JS,JS$OWD ;JOB IN DEVICE ERROR WAIT? JRST TSTAT9 ;YES, SAY SO MOVSI A,'^D ' ;"DAEMON (.DCORE) WAIT" TXNE JS,JS$JDC ;JOB WAITING FOR DAEMON? JRST TSTAT9 ;YES, TELL USER THAT MOVSI A,'^C ' ;"CONTROL-C (HALT) STATE" JUMPGE JS,TSTAT9 ;IF JOB IS NOT RUNNING SAY HALTED MOVSI A,'RU ' ;"RUN/GET[SEG]/MERGE COMMAND/UUO" MOVX N,J2$IGS ;THE "IN GETSEG" BIT TXNN JS,JS$RUU ;IN A RUN UUO OR COMMAND? TDNE N,@JBST2 ;OR IN A GETSEG (MERGE) UUO OR COMMAND? JRST TSTAT8 ;YES, SAY THAT THEN (AND COUNT ACTIVE) LDB B,[POINTR JS,JS$WST] ;GET JOB WAIT STATE QUEUE IDIVI B,3 ;THREE QUEUE NAMES PER WORD IMULI C,^D12 ;EQUALS 12 BITS PER WORD MOVE A,QTAB(B) ;WORD HOLDING QUEUE CODES LSH A,(C) ;LEFT JUSTIFY QUEUE CODE NAME AND A,[7777B11] ;MASK OFF ANY OTHER CODES MOVS B,A ;PUT IN RH(B) FOR EASE OF CHECKING CAIE B,'SL ' ;IN SLEEP QUEUE? JRST TSTAT0 ;NO, CHECK FOR TI MOVX N,J2$HIB ;THE "IN A HIBER" BIT TDNN N,@JBST2 ;PROGRAM IN A HIBER OR A SLEEP? JRST TSTAT8 ;IN A SLEEP, COUNT SLEEPY JOB MOVSI A,'HB ' ;IN A HIBER, INDICATE ACCORDINGLY TXNE JS,JS$CLK ;ALSO GOT A CLOCK REQUEST PENDING? MOVSI A,'HS ' ;YES, "HIBER WITH A SLEEP TIME" JRST TSTAT8 ;COUNT UP A SLEEPY JOB TSTAT0: CAIE B,'DI ' ;IN DISK I/O WAIT? CAIN B,'IO ' ;OR RANDOM I/O WAIT? JRST TSTAT1 ;YES, SEE WHICH DIRECTION CAIE B,'TI ' ;IN TERMINAL I/O WAIT? JRST TSTAT2 ;NO, CHECK FOR OTHER STATES ;TTY'S MUST BE HANDLED SPECIAL SINCE FOR THEM IO$OUT IS IGNORED MOVE B,['TWTITO'] ;YES PUSHJ P,IOWTT ;CHECK IF TTY IS IN OR OUT BLOCKED MOVS B,A ;GET STATE BACK INTO B AGAIN CAIE B,'TI ' ;IN TERMINAL INPUT STATE? JRST TSTAT7 ;NO, COUNT COUNT I/O BLOCKED JRST TSTAT8 ;YES, COUNT AS SLEEPY JOB TSTAT1: CAIN B,'DI ' ;IN DISK I/O WAIT? MOVE B,['DWDIDO'] ;YES CAIN B,'IO ' ;RANDOM I/O WAIT? MOVE B,['IOINOU'] ;YES PUSHJ P,IOWCK ;PICK APPROPRIATE STATE JRST TSTAT7 ;NO, COUNT I/O BLOCK JOBS TSTAT2: CAIE B,'RN ' ;IN THE RN QUEUE(S)? JRST TSTAT3 ;NO--GO ON LDB B,[POINTR @JBRTD,JR$HPQ] ;YES, GET HPQ (IF ANY) JUMPE B,TSTAT6 ;NOT IN HPQ TRZN B,10 ;HPQ .GE. 10? TROA B,' H0' ;NO, PRINT AS HN ADDI B,' 00' ;YES, PRINT AS NN LSHC A,^D36+^D24 ;LEFT JUSTIFY SIXBIT IN A JRST TSTAT6 ;COUNT RN JOBS TSTAT3: CAIE B,'EW ' ;EVENT WAIT? JRST TSTAT7 ;EVERYTHING ELSE COUNTS AS ACTIVE ; BUT "BLOCKED" (EVEN NA) LDB B,[POINTR @JBST2,J2$WEW] ;ESLEEP (EVENT WAIT) CODE CAIN B,EW$TKW ;MAGTAPE KONTROLLER WAIT? MOVSI A,'EK ' ;YES, "EVENT KONTROLLER WAIT" CAIN B,EW$REW ;MAGTAPE REWIND? MOVSI A,'ER ' ;YES, "EVENT REWIND WAIT" CAIN B,EW$LBL ;LABEL PROCESSING WAIT? MOVSI A,'EL ' ;YES, "EVENT LABEL WAIT" CAIN B,EW$NET ;ANF-10 NETWORK WAIT? MOVSI A,'EN ' ;YES, "EVENT NETWORK WAIT" CAIE B,EW$FEI ;FRONT END INPUT WAIT? CAIN B,EW$FEO ;OR FRONT END OUTPUT WAIT? MOVSI A,'EF ' ;YES, "EVENT FRONT-END WAIT" CAIN B,EW$D60 ;DN60 WAIT? MOVSI A,'E6 ' ;YES, "EVENT DN60 WAIT" CAIN B,EW$DCN ;DECNET NETWORK WAIT? MOVSI A,'ED ' ;YES, "EVENT DECNET WAIT" CAIN B,EW$ETH ;ETHERNET WAIT? MOVSI A,'EE ' ;YES, "EVENT ETHERNET WAIT" MOVX N,J2$EWS ;EVENT WAIT SATISFIED BIT TDNN N,@JBST2 ;JOB READY TO WAKE UP? JRST TSTAT8 ;NO, COUNT AS A SLEEPY JOB MOVSI A,'ES ' ;YES, CALL "EVENT WAIT SATISFIED" JRST TSTAT7 ;COUNT AS ACTIVE, BUT NOT IN RN QUEUE(S) TSTAT6: AOS JRNRN ;JOBS IN ACTIVE RN STATE TSTAT7: AOS JRNIO ;JOBS ACTIVE OR IO BLOCKED TSTAT8: AOS JRNSL ;JOBS ACTIVE BUT SLEEPING TSTAT9: TLNE F,FL.SUP ;SUPPRESSING OUTPUT? JRST TSTATL ;YES, NO OUTPUT PUSHJ P,SIXBP TXNN JS,JS$LCK ;SEE IF LOCKED JRST TSTATL ;NO--PROCEED MOVEI CH,"&" ;INDICATE LOCKED PUSHJ P,TYO ;OUTPUT IT SKIPN @JBSGN ;SEE IF HI-SEG LOGIC JRST SYSL1E ;NO--FINISH UP TSTATL: PUSHJ P,GETSGN ;GET HIGH SEGMENT DATA SKIPN A ;JOB HAVE A HISEG? JRST [PUSHJ P,SPACE JRST SYSL1E] JUMPL A,SYSL1S ;JUMP IF SPYING PUSH P,J ;SAVE J MOVE J,A SKIPE B,@JBPRG ;AN OBSOLETED SEGMENT? JRST SYSL1A ;NO-CHECK IF IT'S A NON CUSP HISEG MOVEI CH,"@" MOVE B,@JBSTS TXNE B,JS$SHR ;IS IT SHARABLE? JRST SYSL1B ;YES-FLAG JOB WITH @ JRST SYSL1F ;NO-MUST BE PRIVATE SYSL1S: MOVEI CH,"+" ;GET A "+" PUSHJ P,TYO ;OUTPUT IT TO SHOW SPYING JRST SYSL1E ; CONTINUE ON SYSL1A: MOVE B,@JBPPN ;GET HISEG OWNER MOVEI CH,"#" ;PREPARE TO FLAG JOB WITH # CAMN B,OLDPPN MOVEI CH,"O" CAMN B,NEWPPN MOVEI CH,"N" CAMN B,SYSPPN ;CUSP? SYSL1F: MOVEI CH," " ;PRINT A SPACE SYSL1B: PUSHJ P,TYO ;PRINT @ OR # POP P,J ;RESTORE J & A SYSL1E: PUSHJ P,GETSGN ;GET HIGH SEGMENT NUMBER MOVE N,JOBVIR ;GET JOB'S VIRTUAL MEMORY SIZE(S) SKIPG A ;DOES JOB HAVE A REAL HIGH SEGMENT? TRZ N,-1 ;NO HIGH SEGMENT OR SPY SEGMENT SETZB CH,A ;ZAP BOTH V AND SW WORD CAME N,JOBPHY ;SAME AS PHYSICAL SIZE(S)? MOVEI CH,"V" ;NO, FLAG JOB AS VIRTUAL SYSL2E: PUSHJ P,LHPSWP ;PRINT STATE AND "SW"/"SF" AS APPROPRIATE MOVE A,JITIM ;[610] INCREMENTAL RUNTIME TLNN F,FL.INC ;[610] INCREMENTAL OR TOTALS? MOVE A,@JTTIM ;TOTALS TRNN F,FR.PCT ;RUNTIME OR PERCENTAGE? JRST SYSL2T ;RUNTIME, JUST TYPE IT MOVE B,UPTINC ;PERCENTAGE, GET UPTIME MOVEM B,TEMP ;AND STORE FOR CMPDNA PUSHJ P,CMPDNA ;PRINT OUT PERCENTAGE OF CPU PUSHJ P,PERCNT ;WITH A PERCENT SIGN FOR CUTENESS CAIA ;DON'T BOTHER PRINTING TIME NOW SYSL2T: PUSHJ P,TCKTIM ;JUST PRINT THE RUNTIME TRNN F,FR.SJB ;EXPANDED JOB DISPLAY? JRST SYSL5 ;NO ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;PRINT DISK READS AND WRITES PUSHJ P,TAB ;YES, TAB OVER TO DISK READS COLUMN MOVE N,JIRCT ;[610] INCREMENTAL READS TLNN F,FL.INC ;[610] INCREMENTAL OR TOTALS? MOVE N,@JTRCT ;TOTALS PUSHJ P,DECB8 ;PRINT DISK READS PUSHJ P,TAB ;TAB OVER TO NEXT COLUMN MOVE N,JIWCT ;[610] INCREMENTAL WRITES TLNN F,FL.INC ;[610] INCREMENTAL OR TOTALS? MOVE N,@JTWCT ;TOTALS PUSHJ P,DECB8 ;PRINT DISK WRITES ;PRINT USER NAME NOW PUSHJ P,TAB ;TAB OVER TO USER NAME COLUMN MOVE A,@JBNM1 ;FIRST HALF OF THE USER NAME PUSHJ P,SIXB6 ;TYPE IT OUT SKIPE A,@JBNM2 ;SECOND HALF OF THE USER NAME PUSHJ P,SIXB6 ;TYPE ALL OF IT OUT IF NON-BLANK ;END OF JOBS DISPLAY SYSL5: PUSHJ P,CRLF ;CAP OFF THIS JOB'S DISPLAY LINE NORMNJ: TLZ F,FL.SUP ;CLEAR DISPLAY SUPPRESS FOR NEXT JOB AOBJN J,NORML0 ;LOOP FOR ALL JOBS CALL SETEND ;SET SLINE VARIABLE TO ADAPT TO EMPTY SCREEN TRNE F,FR.JOB!FR.SJB!FR.VMM ;JOBS ONLY? POPJ P, ;YES, THEN ALL DONE JRST NSYS00 ;GO DO "N" DISPLAY SYSTEM STUFF ;SUBROUTINE TO CONVERT TTY NUMBER TO CONTROLLING JOB NUMBER ;IF CONTROLLED OVER A PTY (5.03 AND MORE RECENT ONLY) ;CALL: MOVE A,'TTYNN' ; PUSHJ P,PTYCTL ; RETURN WITH TTYNN OR JOBNN ;USES B,C,D,R PTYCTL: TLNN A,-1 ;SEE IF DETACHED POPJ P, ;YES--LEAVE ALONE HRLZ C,A ;GET TTY NUMBER (0 IF CTY) MOVEI B,0 ;CLEAR ACCUMULATOR LSH C,3 ;CONVERT TO LSHC B,3 ; BINARY FROM JUMPN C,.-2 ; SIXBIT CAML B,PTYOFS ;SEE IF PTY CAML B,PTYMAX ; DRIVEN POPJ P, ;NO--RETURN SUB B,PTYOFS ;YES--GET PTY NUMBER MOVEI R,10 ;CONVERT TO OCTAL PUSHJ P,MAKSIX ; SIXBIT HRLI B,'PTY' ;CHANGE TO DEVICE NAME SKIPE REALTT ;TEST FOR PTY DISPLAY JRST PTYXIT ; YES, JUMP DEVTYP B,1B19 ;PHYSICAL DEVICE--GET JOB OWNER POPJ P, ;ERROR RETURN IF PRE 5.03 LSH B,-11 ;GET JOB NUMBER ANDI B,777 ;REMOVE JUNK JUMPE B,CPOPJ ;IF NOT CONNECTED, GIVE UP MOVEI R,12 ;CONVERT TO DECIMAL PUSHJ P,MAKSIX ; SIXBIT HRLI B,'JOB' ;ADD JOB PREFIX PTYXIT: MOVE A,B ;CHANGE ANSWER POPJ P, ;RETURN ;SUBROUTINE TO CONVERT BINARY TO SIXBIT IN ARBITRARY RADIX ;ARG/ANSWER IN B (0-777) ;USES C,D RADIX IN R MAKSIX: MOVE D,[POINT 6,B,17] ;PRESET POINTER MAKSX1: IDIVI B,(R) ;OLD FASHIONED WAY HRLM C,(P) SKIPE B PUSHJ P,MAKSX1 HLRZ C,(P) ADDI C,'0' IDPB C,D POPJ P, ;SUBROUTINE TO FIND 1ST. JOB USING A SEGMENT ;CALL MOVE J,SEGMENT NO. ; PUSHJ P,SEGSCN ; NONE FOUND RETURN ; FOUND ;AC'S B & C DESTROYED ;AC J IS RESPECTED SEGSCN: PUSH P,A ;PRESERVE FROM CORRUPTION MOVN B,JOBN HRLZS B HRR B,JBSGN ;PREPARE AOBJN PTR. FOR SCANNING JBTSGN HIGH06: HRRZ A,(B) ;GET SEGMENT NO. PUSHJ P,CNVSGN ;CONVERT IT TO USEFUL FORMAT CAIE A,(J) ;DOES IT MATCH WITH CURRENT ONE? HIGH6A: AOBJN B,HIGH06 ;NO-DO AGAIN POP P,A ;RESTORE A SKIPGE B ;WE HAVE A MATCH? CPOPJ1: AOS (P) ;YES - SKIP RETURN POPJ P, ;NO-NONE FOUND RETURN ;SUBROUTINE SEGLOK CHECKS IF A SEGMENT IS LOCKED IN CORE ; J=JOB # OR HIGH SEG # ; N=SIZE OF SEGMENT ; UPDATES MAXMAX TO INCLUDE LOCKED SEG SIZE ; ALWAYS NON-SKIP RETURN SEGLOK: SETOM LOKCHK ;FLAG THAT WE WERE HERE PUSH P,B ;SAVE B MOVE B,@JBSTS ;GET STATUS WORD TXNE B,JS$LCK ;SEE IF LOCKED ADDM N,MAXMAX ;YES,UPDATE MAXMAX W/ SIZE OF LOCKED SEG POP P,B ;(NO)RESTORE B POPJ P, ;RETURN ;SUBROUTINE TO CHECK IF A SEGMENT IS INACTIVE ;INACTIVE IS DEFINED AS RUN BIT OFF OR SL/TI/EW STATE ;ARGS J=SEGMENT NUMBER IN RH ;NON-SKIP RETURN IF ACTIVE, SKIP RETURN IF INACTIVE INACTC: SKIPL D,@JBSTS ;SKIP IF RUN BIT ON JRST CPOPJ1 ;OFF, INACTIVE LDB D,[POINT 5,D,14] ;GET WAIT STATE CODE CAMN D,SLQ ;IN "SL" STATE? JRST CPOPJ1 ;YES, ONE MATCHES, INACTIVE CAME D,TIQ ;IN "TI" STATE? CAMN D,EWQ ;OR "EW" STATE? AOS (P) ;YES, MATCHES, INACTIVE POPJ P, ;NO, MUST BE ACTIVE ;SUBROUTINE ACTVC ADDS UP CURRENT JOB'S CONTRIBUTION TO ACTUSE ;CALL WITH A/SEGMENT INDEX FOR @SGCNT ACTVC: HLRZ N,JOBPHY ;LOSEG PHYSICAL SIZE JUMPLE A,ACTVC3 ;ONLY COUNT HISEGS THAT EXIST MOVX N1,SGC$AC ;THE HISEG-COUNTED FLAG TDNN N1,@SGCNT ;HAS THE HISEG ALREADY GIVEN TO ACTUSE? ADD N,JOBPHY ;NO, FIRST TIME, ADD IN HISEG PHYSICAL SIZE IORM N1,@SGCNT ;MARK THE HISEG'S CONTRIBUTION ACTVC3: ADD N,JOBPPG ;ADD MONITOR PER-PROCESS SPACE OVERHEAD ANDI N,777777 ;STRIP OFF LH GARBAGE ADDM N,ACTUSE ;ACCUMULATE PHYSICAL ACTIVE MEMORY USAGE POPJ P, ;ALL DONE ;SUBROUTINE IDLEJB SUPPRESSES IDLE JOBS ;IDLE JOB = JOB HAS ACCUMULATED NO RUNTIME AND NO DISK READS/WRITES ;ARGS J=JOB NUMBER (RH) IDLEJB: MOVE A,TRSHLD ;[610] GET THRESHOLD VALUE SUB A,JITIM ;[610] SUBTRACT INCREMENTAL RUNTIME SKIPGE A ;[610] NOT ENOUGH FOR US POPJ P, ;[610] MEETS THRESHOLD REQUIREMENTS, SHOW JOB SKIPE TRSHLD ;[610] IF THRESHOLD WAS GIVEN, BUT NOT EXCEEDED TLO F,FL.SUP ;[610] THEN FORCE JOB TO IDLE, OTHERWISE CHECK FOR SKIPN JIRCT ;[610] ANY DISK READS SKIPE JIWCT ;[610] OR WRITES? POPJ P, ;[610] YES, NON-IDLE JOB TLO F,FL.SUP ;[610] MUST BE IDLE, SUPPRESS JOB POPJ P, ;[610] RETURN ;SUBROUTINE INCRTL COMPUTES INCREMENTAL RUNTIME AND DISK I/O ON A ;PER JOB BASIS AND STORES THE RESULTS IN THE "JIXXX" JOB TABLES. INCRTL: MOVE A,@JBTIM ;[610] COMPUTE INCREMENTALS FOR THIS JOB SUB A,@JTTIM ;[610] A := INCREMENTAL RUN TIME JUMPGE A,INCR2 ;[610] VALID? MOVE A,@JBTIM ;[610] NO! JOB HAS CHANGED, USE TOTAL AS INCREMENTAL SETZM @JTTIM ;[610] ZERO RUNTIME, SETZM @JTRCT ;[610] DISK READS SETZM @JTWCT ;[610] AND WRITES TOTALS INCR2: ADDM A,@JTTIM ;[610] UPDATE TOTAL MOVEM A,JITIM ;[610] SAVE INCREMENTAL MOVE A,@JBRCT ;[610] PICK UP DISK READS ANDX A,RC.TTL ;[610] REDUCE TO JOB TOTAL SUB A,@JTRCT ;[610] A := INCREMENTAL DISK READS ADDM A,@JTRCT ;[610] UPDATE TOTAL MOVEM A,JIRCT ;[610] SAVE INCREMENTAL MOVE A,@JBWCT ;[610] DISK WRITES ANDX A,WC.TTL ;[610] REDUCE TO JOB TOTAL SUB A,@JTWCT ;[610] A := INCREMENTAL DISK WRITES ADDM A,@JTWCT ;[610] UPDATE TOTAL MOVEM A,JIWCT ;[610] SAVE INCREMENTAL POPJ P, ;VMHILO COMPUTE PHYSICAL AND VIRTUAL HIGH AND LOW DATA ;THIS SHOULD BE COMPATIBLE WITH THE CORE COMMAND OUTPUT ; ;RETURNS: ; ; N/ NON-SHARABLE PHYSICAL SIZE ; N1/ NON-SHARABLE VIRTUAL SIZE ; ; JOBPHY LOW,,HIGH PHYSICAL SEGMENT SIZES ; JOBVIR LOW,,HIGH VIRTUAL SEGMENT SIZES ; JOBPPG MONITOR PER-PROCESS PAGES FOR THIS JOB VMHILO: SETZ N1, ;ASSUME NO HIGH SEG LDB N,[POINTR @JBIMI,JP$IMI] ;GET LOW SEG "IMGIN" SIZE PUSHJ P,GETSGN ;GET JBTSGN ENTRY JUMPLE A,VMHIL2 ;SPYING OR NO HIGH SEG HRRZ BP,A ;SEGMENT NUMBER ONLY EXCH J,BP ;POINT J AT SEGMENT INDEX TXNN A,JS$SHR ;SHARABLE?? JRST VMHIL0 ;NOPE OTHER ARITHMETIC LDB N1,[POINTR @JBIMI,JP$IMI] ;GET SHARABLE HISEG "IMGIN" SIZE JRST VMHIL1 ;ALL SET VMHIL0: HLRZ N1,@JBSWP ;GET NON-SHARABLE HISEG SIZE SUB N,N1 ;REDUCE LOW SEG SIZE VMHIL1: EXCH BP,J ;RESTORE JOB NUMBER VMHIL2: HRL N1,N ;MAKE LOW,,HIGH PHYSICAL SIZES MOVEM N1,JOBPHY ;REMEMBER PHYSICAL SIZES LDB N,[POINTR @JBVIR,JP$IMV] ;GET LO SEG VIRTUAL SIZE TXNN A,JS$SHR ;SHARABLE HIGH SEGMENT? LDB N1,[POINTR @JBVIR,JP$HMV] ;GET NON-SHARABLE HI SEG VIRTUAL SIZE HRL N1,N ;MAKE LOW,,HIGH VIRTUAL SIZES MOVEM N1,JOBVIR ;REMEMBER VIRTUAL SIZES LDB N,[POINTR @JBPDB,JP$PPP] ;JOB'S PER-PROCESS PAGES MOVEM N,JOBPPG ;REMEMBER MONITOR OVERHEAD PAGES LDB N,[POINTR @JBIMI,JP$NZS] ;JOB'S NON-ZERO-SECTION MAP COUNT ADDM N,JOBPPG ;SECTION-MAPS COUNT AS MONITOR OVERHEAD PAGES HLRZ N,JOBPHY ;LOSEG PHYSICAL SIZE HLRZ N1,JOBVIR ;LOSEG VIRTUAL SIZE JUMPLE A,VMHIL6 ;WAS THERE A HISEG? SUB A,JOBN ;YES, OFFSET FOR "SEGMENT ONLY" TABLE SKIPE @SGCNT ;IS THIS THE FIRST USAGE? JRST VMHIL4 ;NO - COUNT UP SAVED-BY-SHARING USAGE ADD N,JOBPHY ;ACCOUNT FOR FIRST USER OF PHYSICAL HISEG ADD N1,JOBVIR ;ACCOUNT FOR FIRST USER OF VIRTUAL HISEG TDZA BP,BP ;NO MEMORY SAVED HERE VMHIL4: HRRZ BP,JOBPHY ;RETURN "SHRSAV" MEMORY SIZE IN "BP" VMHIL5: AOSA @SGCNT ;COUNT USERS OF THIS SEGMENT VMHIL6: SETZ BP, ;NO MEMORY SAVED IF NO HISEG ADD N,JOBPPG ;RETURN "PHYUSE" MEMORY SIZE IN "N" ANDI N,777777 ;STRIP OFF LH GARBAGE ADD N1,JOBPPG ;RETURN "VIRUSE" MEMORY SIZE IN "N1" ANDI N1,777777 ;STRIP OFF LH GARBAGE POPJ P, ;RETURN WITH MEMORY SIZES ;IOWCK -- DETERMINE IF I/O WAIT JOB IS IN OR OUT BLOCKED ;CALL IS: ; ; MOVX B,SIXBIT/XXYYZZ/ ; PUSHJ P,IOWCK ; RETURN ; ;WHERE 'XX' IS THE INDETERMINATE (NO PEEK OR SPY) STATE, 'YY' IS THE ;INPUT STATE, AND 'ZZ' IS THE OUTPUT STATE. IOWCK: MOVE A,@JBDDB ;[621] ADDRESS OF I/O BLOCKED DDB ADDI A,$DVIOS ;OFFSET INTO DEVIOS WORD PUSHJ P,MPEEK ;READ THE DEVICE I/O STATUS WORD JUMPE A,IOWCK5 ;IF 0 THEN NO PRIVS TXNE A,IO$OUT ;DOING INPUT OR OUTPUT? LSH B,^D12 ;OUTPUT LSH B,^D12 ;INPUT IOWCK5: HLLZ A,B ;GET I/O CODE IN A TLZ A,77 ;AND ONLY 2 CHARS WORTH POPJ P, ;RETURN WITH STATE IN A ;SPECIAL KROCK IOWCK FOR TTY'S SINCE THEY WORK DIFFERENTLY IOWTT: MOVE A,@JBDDB ;[621] ADDRESS OF I/O BLOCKED TTY DDB ADDI A,$DVIOS ;OFFSET INTO DEVIOS WORD PUSHJ P,MPEEK ;READ THE DEVICE I/O STATUS WORD JUMPE A,IOWTT5 ;IF 0 THEN NO PRIVS SKIPGE A ;DOING INPUT OR OUTPUT? LSH B,^D12 ;OUTPUT LSH B,^D12 ;INPUT IOWTT5: HLLZ A,B ;GET I/O CODE IN A TLZ A,77 ;AND ONLY 2 CHARS WORTH POPJ P, ;RETURN WITH TTY STATE IN A ;SUBROUTINE TO PRINT A MSG. FOLLOWED "SW" IF SEGMENT SWAPPED & NOT FRAGMENTED ; OR "SF" IF SWAPPED & FRAGMENTED, OR NOTHING IF IN CORE & NOT FRAGMENTED ;CALL MOVE JS,JOB/HISEG STATUS ; MOVEI CH,CHAR ;VALUE TO BE APPENDED ; PUSHJ P,LOPSWP ; ALWAYS GOOD RETURN ;AC'S A,BP,CH ARE DESTROYED ;AC JS IS RESPECTED *******MSG TO BE PRINTED MUSTN'T EXCEED 4 CHS.******** ;DSKUSE IS UPDATED TO REFLECT SWAPPED MEMORY LHPSWP: PUSH P,CH ;SAVE APPENDENDUM SETZ A, ;INITIALLY ASSUME WHOLE JOB IS IN CORE TXNN JS,JS$SWP ;IS LOSEG SWAPPED? JRST LHPSW2 ;NO - GO CHECK OUT THE ASSOCIATED HISEG (IF ANY) LDB N,[POINTR @JBIMO,JP$IMI] ;YES - GET LOSEG SIZE ON DISK ADD N,JOBPPG ;PLUS OVERHEAD (LOW SEG ONLY) ADDM N,DSKUSE ;ADD TO TOTAL SPACE USED ON SWAPPING SPACE MOVEI A,'S ' ;PREPARE TO PRINT "S" SKIPGE @JBSWP ;IS SEG FRAGMENTED? MOVEI A,'SF ' ;YES - INDICATE SWAPPED & FRAGMENTED LHPSW2: PUSH P,A ;SAVE A PUSHJ P,GETSGN ;GET JBTSGN DATA MOVE N,A ;COPY HERE POP P,A ;RESTORE A JRST LHPSW7 ;NO HISEG (OR SPYSEG) PUSH P,J ;SAVE JOB INDEX HRRZ J,N ;POSITION "SEG" INDEX MOVE CH,@JBSTS ;GET HISEG STATUS TXNN CH,JS$SWP ;IS HISEG SWAPPED? JRST LHPSW6 ;NO - NOTHING FURTHER HERE LDB N,[POINTR @JBIMO,JP$IMI] ;YES - GET HISEG SIZE ON DISK EXCH A,J ;SGCNT WANTS SEG INDEX IN AC "A" SUB A,JOBN ;AND SGCNT IS A "SEGMENT ONLY" TABLE TO BOOT! MOVE CH,@SGCNT ;GET COUNT OF HISEG'S USERS ADD A,JOBN ;MAKE BACK INTO REAL INDEX EXCH J,A ;REPOSITION SWAP CODE IN "A" CAIN CH,1 ;IF THIS IS FIRST USER (COURTESY VMHILO), ADDM N,DSKUSE ;ADD TO TOTAL SPACE USED ON SWAPPING SPACE CAIN A,'SF ' ;LOW SEG ALREADY WORST CASE? JRST LHPSW6 ;YES MOVEI A,'S ' ;NO, THEN MINIMUM IS "S"WAPPED SKIPGE @JBSWP ;IS HISEG FRAGMENTED? MOVEI A,'SF ' ;YES, ADVANCE TO "S"WAPPED "F"RAG'ED LHPSW6: POP P,J ;RESTORE JOB INDEX LHPSW7: MOVS A,A ;REPOSITION SWAPPING CODE (IF ANY) CAIE A,0 ;IF ANYTHING WAS SWAPPED THEN PUSHJ P,SIXBP ;PRINT "S" OR "SF" POP P,CH ;GET APPENDENDUM BACK SKIPE CH ;ANYTHING TO PRINT? CALL TYO ;(YES) DO IT JRST TAB ;PRINT TAB & EXIT SUBTTL "N" DISPLAY -- GENERAL SYSTEM STATISTICS NSYS00: CALL WNDSYS ;WINDOW FOR SYSTEM DATA NSYS01: PUSHJ P,CONFIG ;SHORT FORM OF "THISIS" CALL CRLF ;START A NEW LINE TRNE F,FR.SKP ;WANT TO SKIP FIRST PART? JRST STRLP ;YES, GO DIRECTLY TO STR/DEV STUFF PUSHJ P,PDATIM MOVEI M,[ASCIZ/ UP:/] ;IDENTIFY DATA PUSHJ P,MSG ;TYPE OUT TEXT MOVE A,UPTIME ;ALWAYS PRINT TOTAL UPTIME PUSHJ P,TCKTIM ;TYPE OUT UPTIME PUSHJ P,CRLF ;END LINE SUBTTL "N" DISPLAY -- CPU USAGE STATISTICS CPULP: MOVE A,[%CNCPU] ;MAX CPU'S MONITOR BUILT FOR PUSHJ P,GET ;FIND OUT JRST [MOVEI A,1 ;ASSUME 1 SKIPE DUAL ;UNLESS 1077/1088/1099 MOVEI A,2 ;IN WHICH CASE IS 2 CPU'S JRST .+1] ;CONTINUE MOVEM A,CPMAX ;SAVE FOR LOOP EXIT SUBI A,1 ;FLAG, .GT. 0 IF MULTI-CPU MOVEM A,CPMNY ;REMEMBER FOR DOORBELL ETC. MOVE A,[%CNBCP] ;FIND OUT BOOT CPU PUSHJ P,GETZ ;ON GENERAL PRINCIPLES MOVEM A,CPBTS ;AND REMEMBER IT MOVE A,[%CCTYP] ;FIND OUT CPU TYPE FOR CPU0 PUSHJ P,GETZ ;READ IT CAIE A,.CCKSX ;[633] ON A KS-10? TDZA M,M ;[633] NO SETO M, ;[633] YES MOVEM M,CPKS10 ;[633] FLAG KS'EDNESS CAIE A,.CCKLX ;ON A KL-10? CAIN A,.CCKSX ;OR A KS-10? SETOM CPCSH ;YES, WATCH CACHE FLUSHES MOVEI M,[ASCIZ/ (+)/] ;INDICATE "INCREMENTAL" NUMBERS TLNE F,FL.INC ;INCREMENTAL OR TOTAL? PUSHJ P,MSG ;INCREMENTAL, TELL USER MOVEI M,[ASCIZ/ ID OV LS UPTIME CTX UUO/] PUSHJ P,MSG ;LABEL COLUMNS MOVEI M,[ASCIZ/ DBL/] ;DOORBELLS/SEC SKIPLE CPMNY ;MULTI-CPU? PUSHJ P,MSG ;YES, ADD COLUMN FOR DOORBELLS/SEC MOVEI M,[ASCIZ/ CSH/] ;CACHE SWEEP COUNT SKIPE CPCSH ;WATCHING CACHE FLUSHES? PUSHJ P,MSG ;YES, ADD COLUMN PUSHJ P,CRLF ;END HEADER LINE SETOM CPU ;START WITH CPU-1 ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE CPULP0: AOS J,CPU ;ADVANCE TO NEXT CPU CAML J,CPMAX ;EXCEEDED SYSTEM MAX? JRST CPULP9 ;END CPU STUFF ASH J,1 ;INDEX INTO %CCXXX/%CVXXX TABLES MOVE A,[%CCLOG] ;CPU LOGICAL NAME ADD A,J ;OFFSET FOR THIS CPU PUSHJ P,GET ;GET THIS CPU'S NAME MOVE A,['CPU? '] ;FAILED? MOVEM A,CPNAM(J) ;SAVE IT PUSHJ P,SIXBP ;AND TYPE IT OUT ;MAKE SURE CPU IS RUNNING, ABORT DISPLAY IF NOT SETZ M, ;ASSUME CPU IS OK MOVE A,[%CCOKP] ;CPU "OK" WORD ADD A,J ;OFFSET FOR THIS CPU PUSHJ P,GETZ ;READ IT CAILE A,0 ;CPU RUNNING OK IF .LE. 0 MOVEI M,[ASCIZ/ (Not Running)/] ;SAY NOT RUNNING MOVE A,[%CVRUN] ;CPU RUN/SCHEDULING WORD ADD A,J ;OFFSET FOR THIS CPU PUSHJ P,GETZ ;SEE WHAT MONITOR THINKS TXNE A,CV%RUN ;"NOT RUNNING JOBS"? MOVEI M,[ASCIZ/ (Not Scheduling)/] ;NO TXNE A,CV%SPD ;SUSPENDED (SHOULDN'T HAPPEN TO RUNNING SYSTEM) MOVEI M,[ASCIZ/ (Suspended (???))/] TXNE A,CV%DET ;DETACHED? MOVEI M,[ASCIZ/ (Detached)/] TXNE A,CV%RMV ;REMOVED? MOVEI M,[ASCIZ/ (Removed)/] CPULP1: MOVEM M,CPOKF(J) ;SAVE GOODNESS FOR OTHERS ALSO JUMPE M,CPULP2 ;IF NO ERROR PROCEDE WITH CPU STUFF PUSHJ P,MSG ;TELL USER OF WOES JRST CPULP7 ;THAT'S IT FOR THIS CPU ;CPU IS RUNNING, SET UPTIME FOR CALCULATING INCREMENTAL VALUES CPULP2: MOVE A,[%CVUPT] ;CPU UPTIME ADD A,J ;OFFSET FOR CURRENT CPU PUSHJ P,GETZ ;GET WHAT'S THERE SUB A,CPUPT(J) ;A := INCREMENTAL VALUE ADDM A,CPUPT(J) ;UPDATE TOTALS TABLE TLNN F,FL.INC ;WANT INCREMENTALS OR TOTALS MOVE A,CPUPT(J) ;WANT TOTALS MOVEM A,TEMP ;SAVE IT ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;SHOW CPU IDLE (NO JOBS TO RUN) TIME PUSHJ P,TAB ;TAB OVER TO THE COLUMN MOVE A,[%CVLST] ;CPU LOST TIME ADD A,J ;OFFSET FOR THIS CPU PUSHJ P,GETZ ;READ IT SUB A,CPLST(J) ;A := INCREMENTAL VALUE ADDM A,CPLST(J) ;UPDATE TOTALS TABLE MOVEM A,TEMP1 ;SAVE INCR LOST TIME MOVE A,[%CVNUL] ;CPU NULL (IDLE) TIME ADD A,J ;OFFSET FOR THIS CPU PUSHJ P,GETZ ;READ IT SUB A,CPNUL(J) ;A := INCREMENTAL VALUE SUB A,CPLST(J) ;SUBTRACT INCR LOST TIME ADDM A,CPNUL(J) ;UPDATE TOTALS TABLE TLNN F,FL.INC ;WANT INCREMENTALS OR TOTALS MOVE A,CPNUL(J) ;WANT TOTALS PUSHJ P,CALCNA ;CALCULATE PERCENT IDLE TIME PUSHJ P,DECB2 ;PRINT PERCENT IDLE TIME ;SHOW CPU OVERHEAD (INTERRUPT LEVEL, SCHEDULER, ETC.) TIME PUSHJ P,TAB ;TAB OVER TO THE COLUMN MOVE A,[%CVOHT] ;CPU OVERHEAD TIME ADD A,J ;OFFSET FOR THIS CPU PUSHJ P,GETZ ;READ IT SUB A,CPOHT(J) ;A := INCREMENTAL VALUE ADDM A,CPOHT(J) ;UPDATE TOTALS TABLE TLNN F,FL.INC ;WANT INCREMENTALS OR TOTALS MOVE A,CPOHT(J) ;WANT TOTALS PUSHJ P,CALCNA ;CALCULATE PERCENT OVERHEAD TIME PUSHJ P,DECB2 ;PRINT PERCENT OVERHEAD TIME ;SHOW CPU LOST (JOBS RUNNABLE, BUT COULDN'T) TIME PUSHJ P,TAB ;TAB OVER TO THE COLUMN MOVE A,TEMP1 ;GET INCR LOST TIME TLNN F,FL.INC ;WANT INCREMENTALS OR TOTALS MOVE A,CPLST(J) ;WANT TOTALS PUSHJ P,CALCNA ;CALCULATE PERCENT LOST TIME PUSHJ P,DECB2 ;PRINT PERCENT LOST TIME ;SHOW CPU UPTIME PUSHJ P,TAB ;SPACE OVER FOR UPTIME MOVE A,TEMP ;GET THIS CPU UPTIME PUSHJ P,TCKTIM ;PRINT UPTIME ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;SHOW CPU CONTEXT SWITCHES PER SECOND PUSHJ P,TAB ;TAB OVER TO CONTEXT SWITCHS MOVE A,[%CVTJC] ;CONTEXT SWITCH COUNT ADD A,J ;OFFSET FOR THIS CPU PUSHJ P,GETZ ;READ IT SUB A,CPTJC(J) ;A := INCREMENTAL VALUE ADDM A,CPTJC(J) ;UPDATE TOTALS TABLE TLNN F,FL.INC ;WANT INCREMENTALS OR TOTALS MOVE A,CPTJC(J) ;WANT TOTALS PUSHJ P,CALCPT ;CALCULATE CONTEXT SWITCHES PER SECOND PUSHJ P,DECB3 ;PRINT CONTEXT SWITCHES PER SECOND ;SHOW CPU MONITOR CALLS ("UUO'S") PER SECOND PUSHJ P,TAB ;TAB OVER TO UUOS MOVE A,[%CVTUC] ;UUO COUNT ADD A,J ;OFFSET FOR THIS CPU PUSHJ P,GETZ ;READ IT SUB A,CPTUC(J) ;A := INCREMENTAL VALUE ADDM A,CPTUC(J) ;UPDATE TOTALS TABLE TLNN F,FL.INC ;WANT INCREMENTALS OR TOTALS MOVE A,CPTUC(J) ;WANT TOTALS PUSHJ P,CALCPT ;CALCULATE UUOS PER SECOND PUSHJ P,DECB3 ;PRINT UUOS PER SECOND ;SHOW INTER-CPU DOORBELLS PER SECOND (IF APPLICABLE) SKIPN CPMNY ;ON A MULTI-CPU SYSTEM? JRST CPULP5 ;NO PUSHJ P,TAB ;YES, TAB OVER TO DOORBELLS COLUMN MOVE A,[%CVNDB] ;NUMBER OF TIMES DOORBELL RUNG ADD A,J ;OFFSET FOR THIS CPU PUSHJ P,GETZ ;READ IT SUB A,CPNDB(J) ;A := INCREMENTAL VALUE ADDM A,CPNDB(J) ;UPDATE TOTALS TABLE TLNN F,FL.INC ;WANT INCREMENTALS OR TOTALS MOVE A,CPNDB(J) ;WANT TOTALS PUSHJ P,CALCPT ;CALCULATE DOORBELLS PER SECOND PUSHJ P,DECB3 ;PRINT DOORBELLS PER SECOND ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;SHOW CPU CACHE SWEEPS PER SECOND (IF APPLICABLE) CPULP5: SKIPN CPCSH ;WATCHING CACHE FLUSHES? JRST CPULP7 ;NO, NO CACHE SWEEPS THEN PUSHJ P,TAB ;YES, TAB OVER MOVE A,[%CVCSN] ;CACHE SWEEPS SINCE RELOAD ADD A,J ;OFFSET FOR THIS CPU PUSHJ P,GETZ ;READ IT SUB A,CPCSN(J) ;A := INCREMENTAL VALUE ADDM A,CPCSN(J) ;UPDATE TOTALS TABLE TLNN F,FL.INC ;WANT INCREMENTALS OR TOTALS MOVE A,CPCSN(J) ;WANT TOTALS PUSHJ P,CALCPT ;CALCULATE CACHE SWEEPS PER SECOND PUSHJ P,DECB3 ;PRINT CACHE SWEEPS PER SECOND ;CALCULATE CPU CLOCK RATE IN CASE BPA STUFF TURNED ON MOVE A,[%CCEBS] ;EBOX TICKS PER SECOND ADD A,J ;OFFSET FOR THIS CPU PUSHJ P,GETZ ;READ IT IDIV A,[^D500000] ;CONVERT TO MHZ FOR BPA STUFF CAIGE A,0 ;JUST TO MAKE SURE SETZ A, ;. . . MOVEM A,CPMHZ(J) ;SAVE CPU CLOCK RATE CPULP7: PUSHJ P,CRLF ;END OF THIS LINE JRST CPULP0 ;CHECK OUT ANY MORE CPU'S CPULP9:! SUBTTL "N" DISPLAY -- FILE AND SWAPPING I/O COUNTS CPUIO: TABSET TAB1IO ;SET NEAT TABS FOR I/O MOVEI M,[ASCIZ\ DSKI DSKO SWPI SWPO MTAI MTAO \] ;COLUMN HEADER PUSHJ P,MSG ;LABEL COLUMNS SETOM CPU ;START WITH CPU -1 CPUIO0: AOS J,CPU ;NEXT CPU CAML J,CPMAX ;REACHED END YET? JRST CPUIO9 ;YES, EXIT THIS STUFF ASH J,1 ;DOUBLE WORD INDEX SKIPE CPOKF(J) ;IS CPU RUNNING OK? JRST CPUIO0 ;CPU KNOWN NOT RUNNING MOVE A,CPNAM(J) ;GET THIS CPU'S NAME PUSHJ P,SIXTAB ;AND TYPE IT OUT ;LIST FILE BLOCKS PER SECOND INPUT MOVE A,[%CVFBI] ;FILE BLOCKS INPUT ADD A,J ;OFFSET FOR THIS CPU PUSHJ P,GETZ ;READ FROM MONITOR SUB A,CPFBI(J) ;A := INCREMENTAL ADDM A,CPFBI(J) ;UPDATE TOTALS TLNN F,FL.INC ;INCREMENTAL OR TOTAL MODE? MOVE A,CPFBI(J) ;TOTAL PUSHJ P,CALCTT ;CALCULATE PER-SECOND FIGURE PUSHJ P,DECB4 ;PRINT PER-SECOND FILE READS ;LIST FILE BLOCKS PER SECOND OUTPUT PUSHJ P,TAB ;SPACE OVER MOVE A,[%CVFBO] ;FILE BLOCKS OUTPUT ADD A,J ;OFFSET FOR THIS CPU PUSHJ P,GETZ ;READ FROM MONITOR SUB A,CPFBO(J) ;A := INCREMENTAL ADDM A,CPFBO(J) ;UPDATE TOTAL TLNN F,FL.INC ;INCREMENTAL OR TOTAL? MOVE A,CPFBO(J) ;TOTALS PUSHJ P,CALCTT ;CALCULATE PER-SECOND FILE WRITES PUSHJ P,DECB4 ;PRINT PER-SECOND FILE WRITES ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;LIST SWAP BLOCKS PER SECOND INPUT CPUIO2: PUSHJ P,TAB ;SPACE OVER MOVE A,[%CVSBI] ;SWAP BLOCKS INPUT ADD A,J ;OFFSET FOR THIS CPU PUSHJ P,GETZ ;READ FROM MONITOR SUB A,CPSBI(J) ;A := INCREMENTAL ADDM A,CPSBI(J) ;UPDATE TOTALS TLNN F,FL.INC ;INCREMENTAL OR TOTAL? MOVE A,CPSBI(J) ;TOTAL PUSHJ P,CALCTT ;CALCULATE PER-SECOND SWAP READS PUSHJ P,DECB4 ;PRINT PER-SECOND SWAP READS ;LIST SWAP BLOCKS PER SECOND OUTPUT PUSHJ P,TAB ;SPACE OVER MOVE A,[%CVSBO] ;SWAP BLOCKS OUTPUT ADD A,J ;OFFSET FOR THIS CPU PUSHJ P,GETZ ;READ FROM MONITOR SUB A,CPSBO(J) ;A := INCREMENTAL ADDM A,CPSBO(J) ;UPDATE TOTALS TLNN F,FL.INC ;INCREMENTAL OR TOTAL? MOVE A,CPSBO(J) ;TOTALS PUSHJ P,CALCTT ;CALCULATE PER-SECOND SWAP WRITES PUSHJ P,DECB4 ;PRINT PER-SECOND SWAP WRITES ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;LIST MAGTAPE "BLOCKS" PER SECOND INPUT CPUIO5: PUSHJ P,TAB ;SPACE OVER MOVE A,[%CVTFI] ;TAPE FRAMES INPUT ADD A,J ;OFFSET FOR THIS CPU PUSHJ P,GETZ ;READ VALUE SUB A,CPTFI(J) ;A := INCREMENTAL TAPE FRAMES READ ADDM A,CPTFI(J) ;UPDATE TOTALS TLNN F,FL.INC ;INCREMENTAL OR TOTAL? MOVE A,CPTFI(J) ;TOTALS IDIVI A,^D5 * ^D128 ;CONVERT TO "BLOCKS" (APPROXIMATELY) PUSHJ P,CALCTT ;CALCULATE PER-SECOND TAPE READS PUSHJ P,DECB4 ;PRINT PER-SECOND TAPE READS ;LIST MAGTAPE BLOCKS PER SECOND OUTPUT PUSHJ P,TAB ;SPACE OVER MOVE A,[%CVTFO] ;TAPE FRAMES OUTPUT ADD A,J ;OFFSET FOR THIS CPU PUSHJ P,GETZ ;READ VALUE SUB A,CPTFO(J) ;A := INCREMENTAL TAPE FRAMES WRITTEN ADDM A,CPTFO(J) ;UPDATE TOTALS TLNN F,FL.INC ;INCREMENTAL OR TOTAL? MOVE A,CPTFO(J) ;TOTALS IDIVI A,^D5 * ^D128 ;CONVERT TO "BLOCKS" (APPROXIMATELY) PUSHJ P,CALCTT ;CALCULATE PER-SECOND TAPE WRITES PUSHJ P,DECB4 ;PRINT PER-SECOND TAPE WRITES ;CAP OFF THIS CPU I/O STATISTICS PUSHJ P,CRLF ;END OF LINE JRST CPUIO0 ;LOOP FOR NEXT CPU CPUIO9:! ;END OF CPU DISK I/O SUBTTL "N" DISPLAY -- KL-10 RH20 CHANNEL USAGE ;IT SHOULD BE NOTED (LEST CONFUSION ARISE) THAT THE PERCENTAGES CAL- ;CULATED HERE ARE NOT RH20 USAGE, BUT RATHER RH20 TO MBOX USAGE, AND ;AS SUCH CAN VARY WIDELY (COMME, PAR EXAMPLE, A FACTOR OF TEN) FROM WHAT ;ONE MIGHT INTUITIVELY EXPECT THE NUMBERS TO BE. TYPICALLY THE MORE THE ;SYSTEM IS BEAT UPON (CHANNELS ACTIVE, SWEEPING CACHE, ETC.) THE HIGHER ;THE CHANNEL PERCENTAGES WILL BE FOR THE SAME (!) AMOUNT OF THROUGHPUT. CPUCH: TABSET TAB1CP ;SET NEAT TABS MOVEI M,[ASCIZ\ CH0 CH1 CH2 CH3 CH4 CH5 CH6 CH7 \] ;COLUMN HEADER MOVEM M,CPHDR ;SAVE FOR FIRST OCCURENCE SETOM CPU ;START WITH CPU -1 ;LOOP OVER EACH CPU IN SYSTEM CPUCH0: AOS J,CPU ;NEXT CPU CAML J,CPMAX ;DONE LAST ONE YET? JRST CPUCH9 ;YES, EXIT CHANNEL PERCENTAGES ASH J,1 ;%CCXXX/%CVXXX DOUBLE WORD INDEX SKIPE CPOKF(J) ;IS CPU RUNNING OK? JRST CPUCH0 ;CPU KNOWN NOT RUNNING MOVE A,[%CVBPF] ;SEE IF PERF ANAL COUNTS BEING KEPT ADD A,J ;OFFSET FOR THIS CPU PUSHJ P,GETZ ;AND READ MONITOR'S COUNTER FLAG JUMPGE A,CPUCH0 ;SKIP THIS CPU IF NOT COUNTING MOVE A,[%CCBPA] ;PERF ANAL COUNT SUBTABLE POINTER ADD A,J ;OFFSET FOR THIS CPU PUSHJ P,GETZ ;READ FROM CDB JUMPE A,CPUCH0 ;NONE FOR THIS CPU TXNN A,777B8 ;GOT A LENGTH? JRST CPUCH0 ;NO, SKIP THIS CPU HRLZM A,CPRLX ;SAVE REL OFFSET INTO CDB SKIPE M,CPHDR ;GIVEN COLUMN HEADER YET? PUSHJ P,MSG ;NO, LABEL THE COLUMNS SETZM CPHDR ;NOTE COLUMNS HAVE BEEN IDENTIFIED MOVE A,CPNAM(J) ;NOW GET THIS CPU'S NAME PUSHJ P,SIXBP ;TYPE IT OUT MOVE JS,[-10,,%CVCH0];PRESET JS INDEX FOR RH20 CHANNELS PUSHJ P,CPLQR ;DO ALL THE WORK JRST CPUCH0 ;TRY FOR ANOTHER CPU CPUCH9:! ;END OF KL-10 CHANNEL USAGE SUBTTL "N" DISPLAY -- KL-10 PI CHANNEL USAGE CPUPI: TABSET TAB1CP ;SET NEAT TABS MOVEI M,[ASCIZ\ PI0 PI1 PI2 PI3 PI4 PI5 PI6 PI7 \] ;COLUMN HEADER MOVEM M,CPHDR ;SAVE FOR FIRST OCCURENCE SETOM CPU ;START WITH CPU -1 ;LOOP OVER EACH CPU IN SYSTEM CPUPI0: AOS J,CPU ;NEXT CPU CAML J,CPMAX ;DONE LAST ONE YET? JRST CPUPI9 ;YES, EXIT PI PERCENTAGES ASH J,1 ;%CCXXX/%CVXXX DOUBLE WORD INDEX SKIPE CPOKF(J) ;IS CPU RUNNING OK? JRST CPUPI0 ;CPU KNOWN NOT RUNNING MOVE A,[%CVBPF] ;SEE IF PERF ANAL COUNTS BEING KEPT ADD A,J ;OFFSET FOR THIS CPU PUSHJ P,GETZ ;AND READ MONITOR'S COUNTER FLAG JUMPGE A,CPUPI0 ;SKIP THIS CPU IF NOT COUNTING MOVE A,[%CCBPA] ;PERF ANAL COUNT SUBTABLE POINTER ADD A,J ;OFFSET FOR THIS CPU PUSHJ P,GETZ ;READ FROM CDB JUMPE A,CPUPI0 ;NONE FOR THIS CPU TXNN A,777B8 ;GOT A LENGTH? JRST CPUPI0 ;NO, SKIP THIS CPU HRLZM A,CPRLX ;SAVE REL OFFSET INTO CDB SKIPE M,CPHDR ;GIVEN COLUMN HEADER YET? PUSHJ P,MSG ;NO, LABEL THE COLUMNS SETZM CPHDR ;NOTE COLUMNS HAVE BEEN IDENTIFIED MOVE A,CPNAM(J) ;NOW GET THIS CPU'S NAME PUSHJ P,SIXBP ;TYPE IT OUT MOVE JS,[-10,,%CVPI0];PRESET JS INDEX FOR PI CHANNELS PUSHJ P,CPLQR ;DO ALL THE WORK JRST CPUPI0 ;TRY FOR ANOTHER CPU CPUPI9: JRST NETLA ;END OF KL-10 PI USAGE ;STUFF FOR CPU STATISTICS ABOVE ;CPLQR -- LOOP THROUGH KL10 PERF ANAL SUBTABLE PRINTING PERCENTAGES CPLQR0: ADDI JS,3 ;SUBTABLE IS IN 4 WORD BLOCKS CPLQR: HRLZI A,(JS) ;SUBTABLE ITEM ADD A,CPRLX ;RELOCATE INTO %CVXXX TABLE HRRI A,.GTC0V(J) ;RELOCATE INTO CDB (GETTAB) PUSHJ P,GET4 ;READ 4 WORDS PJRST CRLF ;IT'S ALL OVER ASHC A,-^D12 ;A'B := TOTAL ELAPSED TIME IN USEC ASHC C,-^D12 ;C'D := CPU CYCLES / 2 DMOVE N,A ;HOLD ELAPSED TIME DSUB A,@CIELT(J) ;A'B := INCREMENTAL ELAPSED TIME DMOVEM N,@CIELT(J) ;SET NEW TOTAL ELAPSED TIME TLNE F,FL.INC ;INCREMENTAL OR TOTAL? DMOVE N,A ;N'N1 := ELAPSED TIME (USEC) DMOVE A,C ;TEMP COPY DSUB A,@CIELC(J) ;A'B := INCREMENTAL PERF COUNT DMOVEM C,@CIELC(J) ;SET NEW TOTAL PERF COUNT TLNN F,FL.INC ;INCREMENTAL OR TOTAL? DMOVE A,C ;A'B := PERF COUNT DMUL A,[EXP 0,^D20000] ;PERCENTAGE FIGURE ; (CPU CYCLES * ^D100 * ^D100) DDIV A,CPMHD(J) ;DIVIDE BY CLOCK RATE (IN MHZ) DMOVE C,A ;DDIV WANTS QUAD WORD SETZB A,B ;A'B'C'D := PERF USEC COUNT * ^D10000 DDIV A,N ;A'B := PERCENTAGE (HUNDREDTHS) ASHC C,1 ;ROUND UP DSUB C,N ;(DON'T HAVE DCAM??) CAILE C,0 ;HALFWAY TO NEXT POINT? ADDI B,1 ;YES MOVE N,B ;PUT WHERE DECOUT CAN FIND IT PUSHJ P,TAB ;SEPARATE COLUMNS PUSHJ P,CPCPT ;TYPE OUT PERCENTAGE AOBJN JS,CPLQR0 ;LOOP FOR REST OF LINE PJRST CRLF ;CAP OFF LINE ;CDB SUBTABLE INDEX POINTERS CIELT: Z CP0PAV(JS) ;CPU0 PERF ITEMS (ELAPSED) CIELC: Z CP0PAV+2(JS) ;CPU0 PERF ITEMS (COUNT) Z CP1PAV(JS) ;CPU1 PERF ITEMS (ELAPSED) Z CP1PAV+2(JS) ;CPU1 PERF ITEMS (COUNT) Z CP2PAV(JS) ;CPU2 PERF ITEMS (ELAPSED) Z CP2PAV+2(JS) ;CPU2 PERF ITEMS (COUNT) Z CP3PAV(JS) ;CPU3 PERF ITEMS (ELAPSED) Z CP3PAV+2(JS) ;CPU3 PERF ITEMS (COUNT) Z CP4PAV(JS) ;CPU4 PERF ITEMS (ELAPSED) Z CP4PAV+2(JS) ;CPU4 PERF ITEMS (COUNT) Z CP5PAV(JS) ;CPU5 PERF ITEMS (ELAPSED) Z CP5PAV+2(JS) ;CPU5 PERF ITEMS (COUNT) SUBTTL "N" DISPLAY -- ANF NETWORK BYTE I/O STATISTICS NETLA: TABSET TAB1NT ;SET TO NET I/O TABS ;INPUT BYTES PER SECOND PROCESSED MOVE A,[%NTBYI] ;TOTAL INPUT BYTES PROCESSED PUSHJ P,GETZ ;READ FROM MONITOR JUMPE A,NETLA9 ;SKIP ANF SUMMARY IF NOTHING THERE MOVEI M,[ASCIZ\ANF In:\] ;IDENTIFY ANF SUMMARY PUSHJ P,MSG ;PREFIX INPUT COUNT SUB A,NABYI ;A := INCREMENTAL ADDM A,NABYI ;UPDATE TOTAL TLNN F,FL.INC ;INCREMENTAL OR TOTAL? MOVE A,NABYI ;TOTALS PUSHJ P,CMPCTT ;BYTES PER SECOND ;OUTPUT BYTES PROCESSED PER SECOND MOVEI M,[ASCIZ\ Out:\] ;PREFIX OUT PUSHJ P,MSG ;TELL USER MOVE A,[%NTBYO] ;TOTAL OUTPUT BYTES PROCESSED PUSHJ P,GETZ ;READ FROM MONITOR SUB A,NABYO ;A := INCREMENTAL ADDM A,NABYO ;UPDATE TOTALS TLNN F,FL.INC ;INCREMENTAL OR TOTALS? MOVE A,NABYO ;TOTALS PUSHJ P,CMPCTT ;BYTES PER SECOND ;MONITOR FREE CORE USED MOVEI M,[ASCIZ\ Cor:\] ;PREFIX MSG MOVE A,[%NTCOR] ;NETWORK CORE IN USE PUSHJ P,GETZ ;READ FROM MONITOR MOVE N,A ;POSITION FOR DECPRT PUSHJ P,MSGDEC ;TYPE OUT PREFIX AND MESSAGE ;CAP OFF LINE PUSHJ P,CRLF ;END OF ANF NET I/O STATISTICS NETLA9:! ;FALL INTO NETLD SUBTTL "N" DISPLAY -- DECNET NETWORK BYTE I/O STATISTICS NETLD: TABSET TAB1NT ;SET TO NET I/O TABS ;FIRST TRACK DOWN THE NETWORK BYTES SKIPE CPKS10 ;[633] ON A KS-10? JRST NETLD9 ;[633] YES, FORGET IT (KS/DECNET IS INSANE) MOVE A,[%DNRCH] ;BASE OF DECNET'S CIRCUIT BLOCKS PUSHJ P,GETZ ;READ MONITOR/GETTAB VALUE JUMPE A,NETLD9 ;NO BYTES IF NO CIRCUIT BLOCKS! MOVEI M,[ASCIZ\DCN In:\] ;IDENTIFY DECNET SUMMARY PUSHJ P,MSG ;PREFIX INPUT COUNT SETZB C,D ;INITIAL BYTE COUNTS ACCUMULATED NETLD1: PUSHJ P,MPEEK ;GET ADDRESS OF NEXT CIRCUIT BLOCK SKIPN J,A ;PROTECT CURRENT CIRCUIT BLOCK ADDRESS JRST NETLD3 ;NO MORE CIRCUIT BLOCKS, PRINT COUNT ADDI A,$RCDLB ;OFFSET TO ASSOCIATED DLL BLOCK PUSHJ P,MPEEK ;GET ADDRESS OF DLL BLOCK FOR THIS CIRCUIT PUSH P,A ;SAFE COPY OF DLL BLOCK ADDI A,$DLBYR ;OFFSET TO BYTES RECEIVED PUSHJ P,MPEEK ;READ BYTES RECEIVED ON THIS CIRCUIT ADD C,A ;AND ACCUMULATE DECNET BYTES RECEIVED POP P,A ;RETRIEVE ADDRESS OF DLL BLOCK AGAIN ADDI A,$DLBYS ;OFFSET TO BYTES SENT PUSHJ P,MPEEK ;READ BYTES SENT ON THIS CIRCUIT ADD D,A ;AND ACCUMULATE DECNET BYTES SENT MOVE A,J ;RESET BASE ADDRESS OF CIRCUIT BLOCK ADDI A,$RCNXT ;OFFSET TO POINTER TO NEXT CIRCUIT BLOCK JRST NETLD1 ;LOOP BACK FOR REST OF THE CIRCUIT BLOCKS ;[634] COUNT IN ETHERNET BYTES ALSO NETLD3: PUSH P,D ;[634] PRESERVE OUTPUT COUNT TO DATE PUSH P,C ;[634] PRESERVE INPUT COUNT TO DATE PUSHJ P,ETHRCL ;[634] READ IN LIST OF ETH-0/ETC. JRST NETLD7 ;[634] NONE, NO ETHERNET? MOVE T1,RCLBUF ;[634] GET ETH-0 CHANNEL ID PUSHJ P,ETHRPL ;[634] READ ETH-0 PORTAL LIST JRST NETLD7 ;[634] FAILED??? NO ETHERNET COUNTS THEN. MOVSI P1,-RPLBFL ;[634] AOBJN INDEX COUNTER FOR PORTAL LIST NETLD4: MOVE T1,RPLBUF(P1) ;[634] NEXT "PORTAL ID" PUSHJ P,ETHRPI ;[634] READ PORTAL INFORMATION JRST NETLD5 ;[634] FAILED, SKIP THIS PORTAL HRRZ T2,RPIBUF+.EIPPI;[634] PORTAL PROTOCOL CAIE T2,60003 ;[634] IS THIS DECNET (PROTOCOL 60-03)? JRST NETLD5 ;[634] NOPE, SKIP IT MOVE T1,RPLBUF(P1) ;[634] YUP, GET PORTAL ID BACK AGAIN PUSHJ P,ETHRPC ;[634] AND READ THE PORTAL COUNTERS JRST NETLD5 ;[634] FAILED??? MOVE T2,RPCBUF+.ECPBR;[634] DECNET/ETHERNET BYTES RECEIVED ADDM T2,0(P) ;[634] ACCUMULATE TOTAL DECNET BYTES MOVE T2,RPCBUF+.ECPBX;[634] DECNET/ETHERNET BYTES TRANSMITTED ADDM T2,-1(P) ;[634] ACCUMULATE TOTAL DECNET BYTES NETLD5: AOBJN P1,NETLD4 ;[634] LOOP FOR ALL PORTALS ;INPUT BYTES PER SECOND PROCESSED NETLD7: POP P,A ;[634] RETRIEVE DECNET BYTES RECEIVED SUB A,NDBYI ;A := INCREMENTAL ADDM A,NDBYI ;UPDATE TOTAL TLNN F,FL.INC ;INCREMENTAL OR TOTAL? MOVE A,NDBYI ;TOTALS PUSHJ P,CMPCTT ;BYTES PER SECOND ;OUTPUT BYTES PROCESSED PER SECOND MOVEI M,[ASCIZ\ Out:\] ;PREFIX OUT PUSHJ P,MSG ;TELL USER POP P,A ;RETRIEVE ACCUMULATE OUTPUT TOTAL SUB A,NDBYO ;A := INCREMENTAL ADDM A,NDBYO ;UPDATE TOTALS TLNN F,FL.INC ;INCREMENTAL OR TOTALS? MOVE A,NDBYO ;TOTALS PUSHJ P,CMPCTT ;BYTES PER SECOND ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;MESSAGE BLOCK USAGE (MOST USEFUL "CONCISE" MEMORY VALUE FOR DECNET) MOVE A,[%DNCHB] ;GETTAB POINTER TO READ PUSHJ P,GETZ ;BASE POINTER TO DECNET "CH" POOL(S) ADDI A,$CHLEN ;SKIP OVER EVENT BLOCKS, POINT TO MSG BLOCKS MOVE J,A ;SAVE BASE ADDRESS SETZ N, ;ACCUMULATE CORE ALLOCATION ADDI A,$CHALC ;OFFSET TO ALLOCATED QUANTITIES PUSHJ P,MPEEK ;GET ALLOCATION LDB N,[POINTR A,CH$NUM] ;N := NUMBER OF CHUNKS ALLOCATED MOVEM N,TEMP ;SAVE FOR PERCENTAGE CALCULATION MOVE A,J ;CH BLOCK AGAIN ADDI A,$CHAVL ;OFFSET TO COUNT OF CHUNKS AVAILABLE PUSHJ P,MPEEK ;GET COUNT OF CHUNKS REMAINING SUBB N,A ;N := COUNT OF MSG BLOCKS IN USE MOVEI M,[ASCIZ\ Blk:\] ;PREFIX MSG PUSHJ P,MSGDEC ;TYPE OUT PREFIX AND MESSAGE MOVEI M,[ASCIZ\/\] ;SEPARATE WITH A "/" MOVE N,TEMP ;N := COUNT OF MESSAGE BLOCKS ALLOCATED PUSHJ P,MSGDEC ;CAP OFF MESSAGE BLOCK SUMMARY MOVEI CH,"=" ;SEPARATE ABSOLUTE USAGES PUSHJ P,TYO ; FROM FOLLOWING PERCENTAGE PUSHJ P,CMPCNA ;TYPE OUT PERCENTAGE IN USE MOVEI CH,"%" ;TELL USER IT IS PUSHJ P,TYO ;A PERCENTAGE VALUE ;CAP OFF LINE PUSHJ P,CRLF ;END OF NET I/O STATISTICS NETLD9:! ;FALL INTO NETLE SUBTTL "N" DISPLAY -- ETHERNET BYTE I/O STATISTICS NETLE: TABSET TAB1NT ;SET TO NET I/O TABS ;INPUT BYTES PER SECOND MOVE A,[%EIBYR] ;ETHERNET BYTES RECEIVED PUSHJ P,GETZ ;QUERY THE MONITOR JUMPE A,NETLE9 ;PUNT IF NO ACTIVITY (ASSUME NO KLNI) MOVEI M,[ASCIZ\ETH In:\] ;IDENTIFY ETHERNET ACTIVITY PUSHJ P,MSG ;START UP LINE OF DISPLAY SUB A,NEBYI ;A:=INCREMENTAL BYTES RECEIVED ADDM A,NEBYI ;UPDATE TO-DATE TOTALS TLNN F,FL.INC ;WANT INCREMENTALS OR TOTALS? MOVE A,NEBYI ;TOTALS PUSHJ P,CMPCTT ;LIST BYTES RECEIVED PER SECOND ;ETHERNET BYTES SENT PER SECOND MOVEI M,[ASCIZ\ Out:\] ;PREFIX XMIT COUNT PUSHJ P,MSG ;IDENTIFY NEXT COLUMN MOVE A,[%EIBYX] ;TOTAL BYTES TRANSMITTED PUSHJ P,GETZ ;READ FROM MONITOR SUB A,NEBYO ;A:=INCREMENTAL ADDM A,NEBYO ;UPDATE TOTAL TLNN F,FL.INC ;INCREMENTALS OR TOTALS? MOVE A,NEBYO ;TOTALS PUSHJ P,CMPCTT ;LIST BYTES XMITED PER SECOND ;ETHERNET DATAGRAMS/SECOND (IN/OUT) MOVEI M,[ASCIZ\ Dgm:\] ;PREFIX DATAGRAMS PUSHJ P,MSG ;TELL USER MOVE A,[%EIDGR] ;TOTAL DATAGRAMS RECEIVED PUSHJ P,GETZ ;READ FROM MONITOR SUB A,NEDGI ;A:=INCREMENTAL ADDM A,NEDGI ;UPDATE TOTAL TLNN F,FL.INC ;INCREMENTALS OR TOTALS? MOVE A,NEDGI ;TOTALS PUSHJ P,CMPCTT ;LIST DATAGRAMS RECEIVED PER SECOND MOVEI M,[ASCIZ\/\] ;SEPARATE WITH A "/" PUSHJ P,MSG ;LIST MOVE A,[%EIDGX] ;DATAGRAMS XMITED PUSHJ P,GETZ ;READ FROM MONITOR SUB A,NEDGO ;A:=INCREMENTAL ADDM A,NEDGO ;UPDATE TOTALS TLNN F,FL.INC ;INCREMENTALS OR TOTALS? MOVE A,NEDGO ;TOTALS PUSHJ P,CMPCTT ;DATAGRAMS TRANSMITTED PER SECOND ;CAP OFF LINE PUSHJ P,CRLF ;END OF ETHERNET STATISTICS NETLE9: ;FALL INTO TTYLP SUBTTL "N" DISPLAY -- TTY CHARACTER I/O STATISTICS TTYLP: TABSET TAB1TT ;CHANGE TAB STOPS FOR TTY STATS MOVEI M,[ASCIZ/TTY In:/] ;SHOW TTY STATISTICS PUSHJ P,MSG ;PREPARE USER ;INPUT CHARACTERS RECEIVED MOVE A,[%SCNRI] ;TOTAL RECEIVED CHARACTERS PUSHJ P,GETZ ;READ IT SUB A,SCNRI ;A := INCREMENTAL VALUE ADDM A,SCNRI ;UPDATE TOTALS TLNN F,FL.INC ;WANT INCREMENTALS OR TOTALS MOVE A,SCNRI ;TOTALS PUSHJ P,CMPCTT ;RECEIVED CHARACTERS PER SECOND ;OUTPUT CHARACTERS TRANSMITTED MOVEI M,[ASCIZ/ Out:/] ;SHOW OUTPUT PUSHJ P,MSG ;PREPARE USER MOVE A,[%SCNXI] ;TOTAL CHARACTERS SENT PUSHJ P,GETZ ;READ IT SUB A,SCNXI ;A := INCREMENTAL ADDM A,SCNXI ;UPDATE TOTAL TLNN F,FL.INC ;INCREMENTALS OR TOTALS? MOVE A,SCNXI ;TOTALS PUSHJ P,CMPCTT ;TRANSMITTED CHARACTERS PER SECOND ;CHUNKS IN USE (PERCENTAGE) MOVE A,[%CNTTC] ;TOTAL CHUNKS COUNT PUSHJ P,GETZ ;READ IT HLREM A,TEMP ;SAVE TOTAL FOR PERCENTAGE CALC MOVE A,[%CNTTN] ;TOTAL NUMBER OF FREE CHUNKS PUSHJ P,GETZ ;READ IT MOVN A,A ;ACTUALLY WANT CHUNKS USED ADD A,TEMP ;A := CHUNKS USED MOVE N,A ;N := CHUNKS USED MOVEI M,[ASCIZ/ Cnk:/] ;LABEL IT PUSHJ P,MSGDEC ;TYPE OUT CHUNKS IN USE MOVEI M,[ASCIZ\/\] ;SEPARATE WITH A "/" MOVE N,TEMP ;N := TOTAL CHUNKS ALLOCATED PUSHJ P,MSGDEC ;DISPLAY "USE/ALLOC" MOVEI CH,"=" ;SEPARATE ABSOLUTE VALUE PUSHJ P,TYO ; FROM PERCENTAGE FOLLOWING PUSHJ P,CMPCNA ;TYPE OUT PERCENTAGE CHUNKS USED MOVEI CH,"%" ;TELL USER THAT NUMBER PUSHJ P,TYO ;IS A PERCENTAGE PUSHJ P,CRLF ;END OF TTY STATISTICS TTYLP9:! ;FALL INTO IPCF STATISTICS SUBTTL "N" DISPLAY -- IPCF STATISTICS IPCLP: MOVE A,[%IPCTS] ;GETTAB ARGUMENT TO PUSHJ P,GETZ ;READ TOTAL IPCF PACKETS SENT JUMPE A,IPCLP9 ;IF NONE AT ALL, JUST DISAPPEAR ;TOTAL PACKETS SENT, PER MINUTE MOVEI M,[ASCIZ\IPCF S:\] ;IDENTIFY IPCF STUFF PUSHJ P,MSG ;TELL USER SUB A,IPCTS ;A := INCREMENTAL PACKETS SENT ADDM A,IPCTS ;UPDATE TOTALS TLNN F,FL.INC ;INCREMENTAL OR TOTAL? MOVE A,IPCTS ;TOTAL IMULI A,^D60 ;LIST PER MINUTE PUSHJ P,CMPCTT ;IPCF PACKETS PER MINUTE ;TOTAL PACKETS OUTSTANDING MOVE A,[%IPCTO] ;GETTAB ARGUMENT TO PUSHJ P,GETZ ;READ IPCF PACKETS OUTSTANDING MOVE N,A ;POSITION IN "N" FOR DECPRT MOVEI M,[ASCIZ\ Out:\] ;PREFIX PUSHJ P,MSGDEC ;LIST OUTSTANDING IPCF ;IPCF RATE MOVEI M,[ASCIZ\ W/P:\] ;IDENTIFY WORDS/PAGES PER MINUTE PUSHJ P,MSG ;TO THE USER MOVE A,[%IPTWT] ;GETTAB ARGUMENT TO PUSHJ P,GETZ ;READ TOTAL WORDS TRANSFERED SUB A,IPTWT ;A := INCREMENTAL WORDS ADDM A,IPTWT ;UPDATE TOTALS TLNN F,FL.INC ;INCREMENTAL OR TOTAL? MOVE A,IPTWT ;TOTAL IMULI A,^D60 ;LIST PER MINUTE PUSHJ P,CMPCTT ;PRINT WORDS PER MINUTE MOVEI CH,"/" ;SEPARATE FROM PAGES PUSHJ P,TYO ;WITH A "/" CHARACTER MOVE A,[%IPTPT] ;GETTAB ARGUMENT TO PUSHJ P,GETZ ;READ TOTAL PAGES TRANSFERED SUB A,IPTPT ;A := INCREMENTAL PAGES ADDM A,IPTPT ;UPDATE TOTALS TLNN F,FL.INC ;INCREMENTAL OR TOTALS? MOVE A,IPTPT ;TOTALS IMULI A,^D60 ;LIST PER MINUTE PUSHJ P,CMPCTT ;PRINT PAGES PER MINUTE ;CAP OFF IPCF DISPLAY PUSHJ P,CRLF ;END OF LINE IPCLP9:! ;FALL INTO MEMORY UTILIZATION STATISTICS SUBTTL "N" DISPLAY -- MEMORY AVAILABILITY AND JOB LOADING STATISTICS MEMLP: MOVX A,%NSCMX ;GET CORMAX VALUE PUSHJ P,GETA ;FROM MONITOR MOVEM A,CORMAX ;SAVE FOR MOMENT MOVEM A,N ;HOLD HERE ALSO MOVX A,%NSMXM ;GET MAX USER MEMORY SPACE PUSHJ P,GETA ;FROM MONITOR MOVEM A,MAXMAX ;SAVE FOR MOMENT MOVX A,%CNNWC ;TOTAL (MAX) WORDS OF MEMORY PUSHJ P,GETA ;READ FROM MONITOR MOVE B,A ;HOLD ONTO IT FOR A MOMENT HLRZ A,B ;"SECTIONS" USED BY PHYSICAL MEMORY LSH A,@P2WLSH ;CONVERT TO WORDS USED FOR MAPPING SUB B,A ;ALLOW FOR MEMTAB SUB B,A ;ALLOW FOR PAGTAB MOVX A,%CNSIZ ;GET SIZE OF MONITOR LOW SEG PUSHJ P,GETA ;FROM MONITOR SUB B,A ;SUBTRACT FROM TOTAL MOVX A,%CNMXF ;GET FINAL VIRTUAL ADDRESS PUSHJ P,GETZ ;OF MONITOR HIGHSEG JUMPE A,MEMLP1 ;IF PRE-7.01335 USE OLD VALUE SUB B,A ;REMOVE FROM PHYSICAL MEM AVAILABLE MOVX A,%CNVSH ;GET FIRST VIRTUAL ADDRESS PUSHJ P,GET ;OF MONITOR HIGH SEGMENT MOVEI A,453000 ;DEFAULT ADD B,A ;ALLOW FOR MONITOR HIGH SEGMENT JRST MEMLP2 ;B := MAX POSSIBLE MAXMAX MEMLP1: MOVX A,%CNHSL ;OLD (PRE-HIGHSEG-LDB DAYS) LENGTH PUSHJ P,GETA ;OF MONITOR HIGH SEG SUB B,A ;B := MAX POSSIBLE MAXMAX MEMLP2: MOVEM B,PHYMAX ;REMEMBER IT ;CORMAX := MAXIMUM SINGLE USER PHYSICAL MEMORY AVAILABLE ;MAXMAX := MAXIMUM TOTAL USER PHYSICAL MEMORY AVAILABLE (INCL LOCKED) ;PHYMAX := MAXIMUM PHYSICAL MEMORY AVAILABLE AFTER MONITOR ; ;CORMAX .LE. MAXMAX .LE. PHYMAX (MAXMAX .LT. PHYMAX MEANS SOMEONE HAS ;PUT SOME MEMORY OFFLINE - I.E., THERE IS A HOLE IN MEMORY SOMEWHERE) ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;PRINT THE VARIOUS PHYSICAL MEMORY VALUES MOVEI M,[ASCIZ /Mem:/] LSH N,@W2PLSH ;MAXIMUM SINGLE USER SIZE PUSHJ P,MSGDEC ;ISSUE MOVE A,MAXMAX ;MAXIMUM USER SPACE AVAILABLE CAMN A,CORMAX ;CORMAX SAME AS MAXMAX CAME A,B ;AS WELL AS PHYMAX? CAIA ;NO JRST MEMLP4 ;ALL THREE THE SAME MOVEI M,[ASCIZ \/\] MOVE N,A ;GET CORMAX WHERE DECOUT WANTS IT LSH N,@W2PLSH ;CONVERT TO PAGE COUNT CAMN A,CORMAX ;CORMAX AND MAXMAX THE SAME? PUSHJ P,MSG ;YES, THEN PHYMAX DIFFERENT CAME A,CORMAX ;CORMAX AND MAXMAX THE SAME? PUSHJ P,MSGDEC ;NO, LIST MAXMAX AS WELL ;RDH MOVE N,B ;GET PHYMAX FOR DECOUT ;RDH LSH N,@W2PLSH ;AND MAKE INTO PAGE COUNT ;RDH MOVEI M,[ASCIZ\/\] ;SEPARATOR ;RDH CAME A,B ;MAXMAX AND PHYMAX THE SAME? ;RDH PUSHJ P,MSGDEC ;NO, LIST PHYMAX AS WELL THEN ;RDH ;WE CAN'T GET IT "RIGHT" ANYMORE, SO PUNT IT ;NOW LIST MEMORY SPACE SAVED BY SHARING PAGES (HIGHSEGS) MEMLP4: MOVEI M,[ASCIZ / Shr:/] MOVE N,SHRSAV ;MEMORY SAVED BY SHARING PUSHJ P,MSGDEC ;PRINT MEM SAVED BY SHARING ;DISPLAY ACTIVE JOB LOADING MOVEI M,[ASCIZ\ JRN:\] ;JOBS RUNNING MOVE N,JRNRN ;JOBS IN RN STATE PUSHJ P,MSGDEC ;LIST THEM MOVEI M,[ASCIZ\/\] ;SEPARATE FROM MOVE N,JRNIO ;JOBS RUNNING OR IO BLOCKED PUSHJ P,MSGDEC ;LIST THEM MOVEI M,[ASCIZ\/\] ;SEPARATE FROM MOVE N,JRNSL ;JOBS NOT ^C'ED PUSHJ P,MSGDEC ;LIST THEM PUSHJ P,CRLF ;START A NEW LINE FOR SWAPPING ;CONTINUED ON NEXT PAGE SUBTTL "N" DISPLAY -- SWAPPING AND VIRTUAL MEMORY USAGE SWPLP: MOVEI M,[ASCIZ/Use:/] MOVE N,PHYUSE ;PHYSICAL (WORKING SET) MEMORY PUSHJ P,MSGDEC ;TELL USER MOVEI M,[ASCIZ\/\] ;SEPARATE WITH A "/" MOVE N,VIRUSE ;TOTAL VIRTUAL PROGRAM SIZES CAME N,PHYUSE ;SAME AS PHYSICAL TOTALS? PUSHJ P,MSGDEC ;NO, TYPE VIRTUAL USE ALSO MOVEI M,[ASCIZ/ Swp:/] MOVE N,VIRUSE ;TOTAL VIRTUAL PROGRAM SIZE SUB N,PHYUSE ;LESS THAT PHYSICALLY USED ADD N,DSKUSE ;PLUS PHYSICAL STUFF SWAPPED PUSHJ P,MSGDEC MOVEI M,[ASCIZ \/\] MOVE A,XK4SWP PUSHJ P,GETA MOVE N,A PUSHJ P,MSGDEC MOVEI M,[ASCIZ/ ASR:/];GET MESSAGE FOR ACTIVE SWAPPING RATIO PUSHJ P,MSG ;PREFIX ACTIVE SWAPPING RATIO MOVE N,ACTUSE ;TOTAL ACTIVE USER MEMORY (P) MOVE A,MAXMAX ;TOTAL AVAILABLE PHYSICAL MEMORY (W) LSH A,@W2PLSH ;TOTAL AVAILABLE PHYSICAL MEMORY (P) IMULI N,^D100 ;CONVERT TO HUNDREDTHS OF PERCENT IDIV N,A ;N:=ASR * ^D100 PUSHJ P,CPCPT ;TYPE OUT "PERCENTAGE" PUSHJ P,CRLF ;NEW LINE ;[653] FREE CORE USED DISPLAY MOVE N,[%CNFRU] ;GET NUMBER OF CORE BLOCKS USED GETTAB N, SETZ N, LSH N,2 ;CONVERT TO WORDS PUSH P,N MOVEI M,[ASCIZ/FRU:/] PUSHJ P,MSGDEC ;TYPE CORE USED MOVE N,[%CNFRE] ;GET AOBJN POINTER TO BIT MAP GETTAB N, SETZ N, HLRES N MOVNS N IMULI N,^D36*^D4 ;CONVERT TO WORDS PUSH P,N MOVEI M,[ASCIZ\/\] PUSHJ P,MSGDEC ;TYPE TOTAL MOVEI CH,"=" PUSHJ P,TYO POP P,TEMP ;GET TOTAL POP P,A ;GET USED PUSHJ P,CMPDNA ;TYPE PERCENTAGE MOVEI CH,"%" PUSHJ P,TYO PUSHJ P,CRLF ;CONTINUED ON NEXT PAGE SUBTTL "N" DISPLAY -- SCHEDULE, KSYS, AND ERROR COUNTERS ;CONTINUED FROM PREVIOUS PAGE ERRLP: SETO J, ;INITIALIZE COUNTER ;CHECK KSYS (SYSTEM SHUTDOWN) TIMER MOVX A,%NSKTM ;KSYS TIMER PUSHJ P,GETZ ;GET MINUTES TILL KSYS JUMPE A,ERRLP1 ;SKIP IF NO KSYS TIMER IN EFFECT MOVEI M,[ASCIZ\KSYS:+\] ;WARN USER CAIGE A,0 ;KSYS ALREADY EXPIRED? MOVEI M,[ASCIZ\KSYS:-\] ;YES, SO INDICATE MOVMS N,A ;POSITION POSITIVE COUNT OF MINUTES PUSHJ P,MSPDHM ;GIVE KSYS TIMER ;CHECK FOR SYSTEM-WIDE HARDWARE ERRORS ERRLP1: MOVX A,%SYERR ;GET HARDWARE ERROR COUNT PUSHJ P,GETZ ; OR 0 MOVEI M,[ASCIZ/HDE:/] ;HARDWARE ERROR HEADER SKIPE N,A ;MOVE TO AC PUSHJ P,MSPDEC ;PRINT IF NON-ZERO ;CHECK FOR ANY JOB AND/OR DEBUG MONITOR STOPCD'S MOVX A,%SYNDS ;GET SOFTWARE DEBUG STOPS PUSHJ P,GETZ ; OR 0 MOVE B,A ;SAVE AWAY MOVX A,%SYNJS ;GET SOFTWARE JOB STOPS PUSHJ P,GETZ ; OR 0 MOVEI M,[ASCIZ/STP:/] ;SOFTWARE ERROR HEADER SKIPN N,B ;MOVE TO AC SKIPE A ; IF NON-ZERO PUSHJ P,MSPDEC ; PRINT MOVEI M,[ASCIZ\/\] ;SEPARATE DEBUG AND JOB SKIPE N,A ;GET DEBUG STOPCODES PUSHJ P,MSPDEC ;PRINT IF ANY ;CHECK FOR SYSTEM MAIN MEMORY PARITY ERRORS MOVX A,%NSTPE ;TOTAL SYSTEM MEMORY PARITY ERRORS PUSHJ P,GETZ ;READ FROM MONITOR MOVEI M,[ASCIZ/MPE:/] ;PARITY ERROR HEADER SKIPE N,A ;ANY PARITY ERRORS? PUSHJ P,MSPDEC ;YES, LIST THE COUNT ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;CHECK FOR FILE SYSTEM RETRIEVAL INFORMATION BLOCK ERRORS MOVX A,%LDTOT ;TOTAL FILE SYSTEM RIB ERRORS PUSHJ P,GETZ ;SEE HOW IT'S DOING MOVEI M,[ASCIZ/RIB:/] ;RIB ERROR HEADER SKIPE N,A ;IF ANY RIB ERRORS PUSHJ P,MSPDEC ;TELL OPERATOR ;SHOW COUNT OF POKE.'S DONE TO MONITOR IF NON-ZERO MOVX A,%CNPUC ;JOB,,COUNT OF POKE.'S PUSHJ P,GETZ ;READ FROM MONITOR JUMPE A,ERRLP6 ;SKIP IF NO POKE.'S HAVE BEEN DONE MOVEI M,[ASCIZ/POK:/] ;POKE COUNT HEADER HRRZ N,A ;COUNT OF POKE.'S PUSHJ P,MSPDEC ;PRINT OUT COUNT OF POKE.'S MOVEI M,[ASCIZ\/\] ;SEPARATOR HLRZ N,A ;JOB WHICH LAST POKE.'ED PUSHJ P,MSGDEC ;TYPE THAT TOO ERRLP6: ;SHOW CURRENT RUNNING SCHEDULE (STATES) IF NON-ZERO MOVX A,%CNSTS ;GET SYSTEM STATES PUSHJ P,GETZ ;FROM MONITOR ANDI A,1777 ;REDUCE TO SCHEDULING PARMS MOVEI M,[ASCIZ/SCH:/] ;SHOW OPR SCHEDULING SKIPE N,A ;IF NON-ZERO PUSHJ P,MSPOCT ;SOME SORT OF SCHED SET CAIL J,0 ;IF NEGATIVE, NOTHING TYPED PUSHJ P,CRLF ;END OF THIS LINE ;HERE TO PRINT RESPONSE MEASURES REPEAT 0,< ;DON'T BOTHER, SINCE NO ONE SEEMS TO KNOW WHAT ;THEY ARE, LET ALONE CARE. MOVEI M,[ASCIZ /RSP:/];HEADER FOR RESPONSES SETZM CPU ;SET FOR CPU0 ;LOOP TO PRINT RESPONSE FOR EACH CPU RSPLP1: SKIPE CPU ;IF FIRST CPU OR SKIPE DUAL ;SEVERAL CPU'S THEN SKIPA ;PRINT JRST RSP1C ;ELSE SKIP IT MOVEI A,%CVRNX ;NO. OF RESPONSES SINCE STARTUP PUSHJ P,GETRSP ;GET FROM MONITOR REL TABLE JRST RSP1C ;NOT PRESENT FOR THIS CPU PUSH P,A ;SAVE TOTAL NO. OF RESPONSES MOVEI A,%CVRSX ;SUM OF RESPONSE TIMES IN JIFFIES PUSHJ P,GETRSP ;GET FROM MONITOR REL TABLE JRST RSP1B ;NOT PRESENT FOR THIS CPU MOVE N,A ;MOVE TO N FOR PNTSEC ROUTINE MUL A,A ;GET SQUARE OF SUM OF RESPONSES PUSH P,A ;SAVE FOR STANDARD DEV PUSH P,B ; .. IDIV N,-2(P) ;AVERAGE RSP=SUM/NUMBER(IN JIFFIES) PUSHJ P,PNTSEC ;PRINT IN SECONDS + TENTHS POP P,N1 ;RESTORE SQUARE OF SUM POP P,N ; .. MOVEI M,[ASCIZ / /] ;SEPARATE AVER FROM STAND DEV MOVEI A,%CVRLX ;SUM OF SQUARES OF RESPONSES PUSHJ P,GETRSP ;GET FROM MONITOR REL TABLE JRST RSP1B ;NOT THERE MOVE B,A ;POSITION MOVEI A,%CVRHX ;ASK FOR HIGH SUM OF SQUARES PUSHJ P,GETRSP ;FROM MONITOR JRST RSP1B ;(STRANGE!) MUL B,(P) ;MULT BY NUMBER IMUL A,(P) ; BOTH HALVES ADD A,B ;INCLUDE CROSS CARRY MOVE B,C ;POSITION LOW HALF SETCMM N ;COMPLEMENT SQUARE OF SUM MOVNS N1 ; .. SKIPN N1 ;HANDLE CARRY ADDI N,1 ; YES TLZ N1,(1B0) ;GOT (N,N1)=-SQ.SUM ADD B,N1 ;ADD TO N*SUM SQ. ADD A,N ; .. TLZE B,(1B0) ;SEE IF CARRY ADDI A,1 ;YES. GOT (A,B)=N*SUM SQ.-SQ.SUM PUSHJ P,ISQRT ;COMPUTE N=SQRT((A,B)) IDIV N,(P) ;DIVIDE BY NUMBER; N=STD.DEV PUSHJ P,PNTSEC ;PRINT AS SECONDS PLUS TENTHS POP P,A ;REMOVE NO. MOVEI M,[ASCIZ /+/] ;SEPARATE CPU0 AND CPU1 STUFF AOS CPU ;STEP TO NEXT CPU JRST RSPLP1 ;GO SEE IF EXISTS ;HERE WHEN PRINTED MEAN AND STANDARD DEV FOR ALL CPUS RSP1B: POP P,A ;REMOVE NUMBER RSP1C: MOVEI M,[ASCIZ " #/M:"] ;HEADER FOR NUMBER OF RESPONSES MOVE T1,UPTIME ;UP TIME IN JIFFIES IDIV T1,TCKSEC ;NO. OF SECONDS UP IDIVI T1,^D60 ;NO. OF MINUTES UP MOVEM T1,TEMP ;STORE FOR CMPCNA SETZM CPU ;START WITH CPU0 RSPLP2: SKIPE CPU ;IF FIRST CPU OR SKIPE DUAL ;SEVERAL CPU'S SKIPA ;THEN PRINT JRST RSP2 ;ELSE SKIP MOVEI A,%CVRNX ;NO. OF RESPONSES FOR THIS CPU PUSHJ P,GETRSP ;GET FROM MONITOR TABLE JRST RSP2 ;NOT THERE PUSHJ P,CMPDFA ;PRINT NO. RESPONSES PER MIN MOVEI M,[ASCIZ /+/] ;SEPARATE CPUS WITH + AOS CPU ;STEP TO NEXT CPU JRST RSPLP2 ;TRY NEXT CPU ;HERE WHEN PRINTED FOR ALL CPUS RSP2: PUSHJ P,CRLF > ;END OF REPEAT 0 FROM PREVIOUS PAGE SUBTTL "N" DISPLAY -- JOBS-IN-USE STATISTICS PRJOB: MOVEI M,[ASCIZ /Job:/] MOVE N,JBNLOG ;COUNT OF JOBS LOGGED-IN PUSHJ P,MSGDEC ;TELL USER MOVE N,JBNUSE ;TOTAL JOBS IN USE SUB N,JBNLOG ;N := NUMBER OF NOT-LOGGED-IN JOBS JUMPE N,PRJOB2 ;IF BLANK, DON'T BOTHER MOVEI M,[ASCIZ\+\] ;SEPARATE WITH A "+" CHARACTER PUSHJ P,MSGDEC ;LIST SEPARATE NOT-LOGGED-IN JOBS PRJOB2: MOVE A,[%CNLMX] ;LOGMAX PUSHJ P,GETZ ;GET IT JUMPN A,PRJOB4 ;IF ZERO, MOVE A,JOBN ;USE JOBMAX SUBI A,1 ;MINUS ONE (NUL JOB) PRJOB4: MOVE N,A ;SET UP FOR OUTPUT MOVEI M,[ASCIZ \/\] ;SEPARATOR PUSHJ P,MSGDEC ;OUTPUT IT MOVE N,JOBN ;GET JOBMAX SUBI N,1 ;LESS NULL JOB CAMG N,A ;LOGMAX .LT. JOBMAX? JRST PRJOB6 ;NO, LEAVE IT ALONE MOVEI M,[ASCIZ\/\] ;YES, SEPARATE LOGMAX FROM JOBMAX PUSHJ P,MSGDEC ;AND LIST JOBMAX AS WELL PRJOB6: MOVEI M,[ASCIZ / Det:/] MOVE N,JBNDET ;NUMBER OF DETACHED JOBS PUSHJ P,MSGDEC ;INFORM USER PUSHJ P,CRLF ;START ON A NEW LINE ;FALL INTO STRUCTURE DISPLAY SUBTTL "N" DISPLAY -- DISK STRUCTURES STRCL==/^D20 ;NUMBER OF STR COLUMNS ON SCREEN STRLP: SKIPL A,LINE ;OFF BOTTOM OF SCREEN? CAILE A,YSIZE-2 ;ROOM FOR AT LEAST ONE LINE OF STRS? JRST STRLP9 ;NO, NO STRUCTURES DISPLAY TABSET TAB1ST ;SET UP STRUCTURE COLUMNS SETZM CURFS ;INITIALIZE SYSSTR LOOP MOVEI J,STRCL ;NUMBER OF COLUMNS MOVEI M,[ASCIZ/Struc Mnt Free /] ;COLUMN HEADER PUSHJ P,MSG ;LABEL COLUMN SOJG J,.-2 ;LABEL ALL COLUMNS ;LOOP FOR ALL STRUCTURES IN SYSTEM STRLP1: PUSHJ P,CRLF ;START A FRESH LINE MOVEI J,STRCL ;RESET COLUMN COUNTER STRLP3: MOVE A,CURFS ;LAST STRUCTURE SYSSTR A, ;SEE WHAT'S NEXT JRST STRLP8 ;??? JUMPE A,STRLP8 ;0 IS END MOVEM A,CURFS ;SAVE FOR NEXT ITERATION MOVEM A,DSKBLK ;SETUP FOR DSKCHR MOVE B,[DSKBKL,,DSKBLK] ;POINTER FOR DSKCHR TO DSKCHR B, ;RETURN STRUCTURE INFORMATION JRST STRLP8 ;??? CAN'T FAIL HERE PUSHJ P,SIXTAB ;ISSUE STRUCTURE NAME, MOVE N,DSKBLK+.DCSMT ;STRUCTURE MOUNT COUNT PUSHJ P,DECPRT ;TYPE IT OUT PUSHJ P,TAB ;SPACE OVER MOVE N,DSKBLK+.DCFCT ;FREE BLOCKS COUNT PUSHJ P,DECPRT ;TYPE IT OUT ALSO SOJE J,STRLP1 ;END OF SCREEN? PUSHJ P,TAB ;NO, ADVANCE TO NEXT COLUMN JRST STRLP3 ;AND DO ANOTHER STRUCTURE STRLP8: CAIE J,STRCL ;AT START OF A LINE? PUSHJ P,CRLF ;NO, CAP OFF CURRENT LINE STRLP9:! ;END OF STRUCTURES DISPLAY SUBTTL "N" DISPLAY -- DEVICES ASSIGNED OR IN USE DEVCL==/^D13 ;NUMBER OF DEVICE COLUMNS DEVLP: SKIPL A,LINE ;IF NOT OFF BOTTOM OF SCREEN CAILE A,YSIZE-2 ;THEN ROOM FOR AT LEAST ONE LINE OF DEV? JRST DEVLP9 ;NO, FORGET THE DEVICES DISPLAY TABSET TAB1DV ;SET DEVICE COLUMNS MOVEI J,DEVCL ;NUMBER OF DEVICE COLUMNS MOVEM J,CPHDR ;MARK NO HEADER OUTPUT YET MOVE A,XDVLST ;GET THE BASE OF THE DDB CHAIN CALL GET ;GET THE VALUE JRST DEVLP9 ;END OF DEVICES DISPLAY DEVLP1: TLNN A,-1 ;IS THIS THE END OF THE DDB LIST JRST DEVLP8 ;END OF DEVICES DISPLAY HLRZ D,A ;GET THE DDB ADDRESS MOVEI A,$DVMOD(D) PUSHJ P,MPEEK ;SPY OR PEEK MOVE B,A ;(EDIT 2) REMEMBER THE DEVMOD ENTRY TXNE A,DV$ASC!DV$ASP ;IN USE BY ANYONE? TXNE A,DV$TTA!DV$DSK ;SHOW TTY'S NOT CONTROLLING JOBS JRST DEVLP6 ;LOOK AT NEXT DEVICE MOVEI A,@PJOBNO ;GET ADDRESS OF DEVJOB WORD PUSHJ P,MPEEK ;SPY OR PEEK MOVE C,A ;GET A COPY OF THE RESULT MOVEI A,$DVNAM(D) PUSHJ P,MPEEK ;SPY OR PEEK HLRZ BP,A CAIN BP,'PTY' JRST DEVLP6 ;LOOK AT NEXT DEVICE TRZ BP,77 ;ONLY FIRST TWO CHARACTERS CAIN BP,'''L ' ;TAPE LABEL PROCESSOR DUMMY DDB? JRST DEVLP6 ;YES, DON'T CLUTTER UP SCREEN SKIPN CPHDR ;PRINTED COLUMN HEADER YET? JRST DEVLP2 ;YES, JUST PRINT DEVICE MOVEI M,[ASCIZ /Dev By How /] ;DEVICE HEADER PUSHJ P,MSG ;LABEL COLUMN SOJG J,.-2 ;LABEL ALL COLUMNS PUSHJ P,CRLF ;END COLUMN HEADERS EXCH J,CPHDR ;MARK HEADER AS HAVING BEEN PRINTED ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE DEVLP2: PUSHJ P,SIXTAB ;PRINT SIXBIT DEVICE NAME FOLLOWED BY TAB LDB N,PJOBNP ;GET JOB NUMBER OWNING DDB JUMPE N,[MOVEI M,[ASCIZ/Det /] ;IF "ASSIGNED" TO JOB 0 PUSHJ P,MSG ;SAY DEVICE IS DETACHED JRST DEVLP3] ;CAP OFF PUSHJ P,DECPRT ;SHOW OWNER JOB NUMBER PUSHJ P,TAB ;TAB OVER TO "HOW" COLUMN MOVEI CH,"A" ;IN CASE "A"SSIGNED TXNE B,DV$ASC ;IS DEVICE ASSIGNED BY CONSOLE COMMAND? PUSHJ P,TYO ;YES (OR REASSI CALLI) MOVEI CH,"I" ;IN CASE "I"NITED OR OPENED TXNE B,DV$ASP ;IS DEVICE IN USE FOR I/O? PUSHJ P,TYO ;YES DEVLP3: SOJG J,DEVLP4 ;UNLESS STILL ROOM ON SCREEN PUSHJ P,CRLF ;END THIS LINE TROA J,DEVCL ;AND RESET COLUMN COUNT DEVLP4: PUSHJ P,TAB ;JUST TAB OVER TO NEXT COLUMN DEVLP6: MOVEI A,$DVSER(D) PUSHJ P,MPEEK ;SPY OR PEEK JRST DEVLP1 DEVLP8: CAIE J,DEVCL ;IN MIDDLE OF A LINE? PUSHJ P,CRLF ;YES, CAP IT OFF DEVLP9:! ;END OF DEVICES DISPLAY POPJ P, ;END OF "N" DISPLAY SUBTTL "F" -- FILE SYSTEM DISPLAY PROGRAM FILPRG: CALL STROLL ;START THE ROLL CALL MOVEI M,[ASCIZ\Disk Status for\] ;FILE SYSTEM HEADER PREFIX PUSHJ P,THISIM ;OUTPUT HEADER TABSET TAB4FS ;FILE SYSTEM TABS PUSHJ P,SETVIS ;DETERMINE INITIAL SCREEN VISIBILITY HEADER < MOVEI M,[ASCIZ .Unit or F/S Free BR BW DR DW MR MW.] CALL IMSG ;PRINT HEADER CALL ICRLF ;AND A NEW LINE > SETZM CURFS ;INITIALIZE STRUCTURE "INDEX" SETZM SWPTAB ;INITIALIZE SWAP UNIT TABLE MOVE A,[SWPTAB,,SWPTAB+1] ;BLT POINTER TO BLT A,SWPTAB+SWPTLN-A ;BLAST THE SWAP UNIT TABLE FLFSL: MOVE A,CURFS SYSSTR A, JFCL JUMPE A,FILEXI ;NONE OR ALL DONE MOVEM A,CURFS MOVEM A,DSKBLK PUSHJ P,ISIXBP ;TYPE STRUCTURE NAME MOVE A,[XWD DSKBKL,DSKBLK] ;SET FOR DISK CHARACTERISTICS UUO DSKCHR A, ;FOR THE STRUCTURE FIRST JRST FILEXI ;SHOULDN'T FAIL MOVEI M,[ASCIZ / Mnt:/] CALL IMSG ;PRINT IF VISIBLE MOVE N,DSKBLK+.DCSMT ;GET MOUNT COUNT CALL IDECPR ;PRINT IF VISIBLE CALL ITAB ;TAB OVER TO "FREE" COLUMN MOVE N,DSKBLK+.DCFCT ;GET BLOCKS LEFT PUSHJ P,IDECPR ;ON STR CALL ICRLF ;END OF STRUCTURE ;FALL INTO FLUNL ;LIST INFO ON EACH UNIT WITHIN FILE STRUCTURE FLUNL: MOVE A,DSKBLK+.DCUPN ;START WITH FIRST UNIT WITHIN FILE STRUCTURE FLUNL0: MOVEM A,DSKBLK ;SET FOR DSKCHR MOVE A,[XWD DSKBKL,DSKBLK] ;ARG POINTER FOR DSKCHR TO DSKCHR A, ;READ LOGICAL UNIT INFORMATION JRST FLFSL ;SHOULD NEVER HAPPEN MOVEM A,DSKBLK ;SAVE BITS CALL ISPACE ;INDENT A SPACE FOR NEATNESS MOVE A,DSKBLK+.DCUPN ;UNIT PHYSICAL NAME SKIPL N,DSKBLK+.DCPAS ;IS THIS UNIT IN THE ACTIVE SWAP LIST? SKIPE CURUN2 ;(IGNORE IF ALTERNATE PORT) CAIA ;NO MOVEM A,SWPTAB(N) ;FLAG SWAPPING UNIT CALL ISIXBP ;PRINT IF VISIBLE MOVEI M,[ASCIZ /(/] ;PREPARE FOR UNIT LOGICAL NAME CALL IMSG ;PRINT IF VISIBLE SKIPE CURUN2 ;LOOKING AT SECOND PORT? SKIPA A,['..... '] ;YES, THEN SO INDICATE MOVE A,DSKBLK+.DCULN ;NO, READ STRUCTURE UNIT NAME CALL ISIXBP ;PRINT IF VISIBLE MOVEI M,[ASCIZ /) /] CALL IMSG ;PRINT IF VISIBLE MOVE N,DSKBLK+.DCUNT ;UNIT FREE BLOCKS SKIPN CURUN2 ;IF LOOKING AT ALTERNATE PORT NO FREE CALL IDECPR ;MAIN PORT, PRINT IF VISIBLE CALL ITAB ;ALWAYS TAB OVER MOVE N,DSKBLK+.DCBRC ;BUFFERED READ COUNT CALL IDECTAB ;PRINT IF VISIBLE MOVE N,DSKBLK+.DCBWC ;BUFFERED WRITE COUNT CALL IDECTAB ;PRINT IF VISIBLE MOVE N,DSKBLK+.DCDRC ;DUMP READ COUNT CALL IDECTAB ;PRINT IF VISIBLE MOVE N,DSKBLK+.DCDWC ;DUMP WRITE COUNT CALL IDECTAB ;PRINT IF VISIBLE MOVE N,DSKBLK+.DCMRC ;MONITOR READ COUNT SUB N,DSKBLK+.DCSRC ;DISCOUNT SWAP READS SUB N,DSKBLK+.DCPRC ;DISCOUNT PAGE READS TOO CALL IDECTAB ;PRINT IF VISIBLE MOVE N,DSKBLK+.DCMWC ;MONITOR WRITE COUNT SUB N,DSKBLK+.DCSWC ;DISCOUNT SWAP WRITES SUB N,DSKBLK+.DCPWC ;DISCOUNT PAGE WRITES TOO CALL IDECTAB ;PRINT IF VISIBLE CALL ICRLF ;NEW LINE IF VISIBLE TRNE F,FR.SKP ;SKIP THE ERROR/ETC STUFF? JRST FLUNL7 ;YEAH ;LIST THE PER-UNIT ERROR INFORMATION FLUNL2: TLZ F,FL.NBK+FL.DEV HLLZ A,DSKBLK TLZ A,BITMSK JUMPE A,FLUNL5 MOVSI C,-BITTL FLUNL3: SKIPGE A PUSHJ P,PRTBIT LSH A,1 AOBJN C,FLUNL3 ;HERE TO DO 5.03 OR LATER UNIT ERROR INFO FLUNL5: MOVSI C,-UER2TL FLUNL6: HLRZ A,UER2T1(C) HRRZ M,UER2T1(C) ;ERROR IDENTIFICATION TEXT TLO F,FL.CRF ;ADVANCE TO NEW LINE IF NEEDED SKIPE N,DSKBLK(A) ;PICK UP ERROR INFO (IF ANY) PUSHJ P,@UER2T3(C) ;PRINT OUT ERROR INFO TLZ F,FL.CRF ;CLEAR FREE CRLF FLAG AOBJN C,FLUNL6 TLZE F,FL.NBK+FL.DEV ;HAVE WE TYPED ANYTHING ON THIS LINE? PUSHJ P,ICRLF ;YES, WE NEED A NEW LINE IF VISIBLE FLUNL7: SKIPE A,DSKBLK+.DCALT ;MULTI-PORTED DISK UNIT? CAMN A,CURUN2 ;HAVE WE WRAPPED TO THE "PRIME" UNIT YET? JRST FLUNL8 ;ADVANCE TO NEXT UNIT IN F/S MOVE N,DSKBLK+.DCUPN ;NO, GET THIS UNIT PHYSICAL NAME SKIPN CURUN2 ;IS THIS "PRIME" UNIT? MOVEM N,CURUN2 ;YES, REMEMBER PRIME UNIT NAME JRST FLUNL0 ;TYPE UNIT INFO FOR ALTERNATE PORT FLUNL8: SETZM CURUN2 ;NO LONGER DOING ALTERNATE UNITS SKIPE A,DSKBLK+.DCNUS ;NAME OF NEXT UNIT WITHIN FILE STRUCTURE JRST FLUNL0 ;TYPE UNIT INFO FOR NEXT UNIT JRST FLFSL ;LOOP FOR NEXT STRUCTURE FILEXI: CALL ICRLF ;A BLANK LINE FOR NEATNESS HEADER < MOVEI M,[ASCIZ /Swap Unit SR SW PR PW Used(/] CALL MSG ;AND PRINT IT CALL KAYPAG ;PRINT K OR P MOVEI M,[ASCIZ /)/] ;RIGHT BRACKET CALL IMSG ;FINISH IT NICELY CALL ICRLF ;PRINT NEW LINE > SETZM CURUN2 ;NO ALTERNATE PORTS YET MOVSI D,-SWPTLN ;INITIALIZE INDEX INTO SWAPPING TABLE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE SWLP1: SKIPN A,SWPTAB(D) ;GET NEXT UNIT FROM SWAPPING (IF ANY) JRST SWLP7 ;BLANK HERE, TRY NEXT SLOT SWLP2: MOVEM A,DSKBLK ;SAVE FOR DSKCHR CALL ISIXBP ;PRINT IF VISIBLE MOVE A,[XWD DSKBKL,DSKBLK] ;DSKCHR UUO ARG POINTER TO DSKCHR A, ;READ ALL ABOUT THIS SWAPPING UNIT JFCL ;DUH? MOVEI M,[ASCIZ /(/] ;GET LEFT-PAREN MESSAGE CALL IMSG ;PRINT IF VISIBLE SKIPE CURUN2 ;LOOKING AT ALTERNATE PORT? SKIPA A,['..... '] ;YES, SO INDICATE MOVE A,DSKBLK+.DCULN ;NO, GET UNIT LOGICAL NAME CALL ISIXBP ;PRINT IF VISIBLE MOVEI M,[ASCIZ /) /] ;GET RIGHT-PAREN & TAB MESSAGE CALL IMSG ;PRINT IF VISIBLE MOVE N,DSKBLK+.DCSRC ;SWAPPING BLOCKS READ CALL IDECTAB ;PRINT IF VISIBLE MOVE N,DSKBLK+.DCSWC ;SWAPPING BLOCKS WRITTEN PUSHJ P,IDECTAB ;PRINT IF VISIBLE MOVE N,DSKBLK+.DCPRC ;PAGING BLOCKS READ CALL IDECTAB ;PRINT IF VISIBLE MOVE N,DSKBLK+.DCPWC ;PAGING BLOCKS WRITTEN CALL IDECTAB ;PRINT IF VISIBLE SKIPE CURUN2 ;LOOKING AT MAIN OR ALTERNATE JRST SWLP4 ;ALTERNATE, HAS JUNK NUMBERS MOVE A,DSKBLK+.DCK4S ;SWAPPING SPACE ALLOCATED ON UNIT MOVE N,DSKBLK+.DCFKS ;SWAPPING SPACE LEFT ON UNIT TRNE F,FR.KIP LSH A,1 MOVEM A,TEMP SUBB A,N CALL IPRPCNT ;PRINT PERCENTAGE SWLP4: CALL ICRLF ;END THE LINE NICELY ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;CHECK FOR SECOND PORT ACCESS TO THIS SWAPPING UNIT SKIPE A,DSKBLK+.DCALT ;THIS UNIT HAVE AN ALTERNATE PORT? CAMN A,CURUN2 ;HAVE WE WRAPPED TO THE "PRIME" UNIT YET? JRST SWLP7 ;ADVANCE TO NEXT UNIT IN SWAPPING LIST MOVE N,DSKBLK+.DCUPN ;THIS UNIT'S PHYSICAL NAME SKIPN CURUN2 ;IS THIS THE PRIME PORT? MOVEM N,CURUN2 ;YES, REMEMBER PRIME UNIT NAME JRST SWLP2 ;TYPE OUT ALTERNATE PORT STATISTICS SWLP7: SETZM CURUN2 ;CLEAR ALTERNATE-PORT FLAGS AOBJN D,SWLP1 ;LOOP FOR REST OF SWAPPING TABLE ;HERE TO CHECK FOR SWAP READ ERRORS MOVE A,XSWPER PUSHJ P,GETZ JUMPE A,SWFIN MOVE D,A CALL ICRLF ;PRINT NEW LINE MOVEI M,[ASCIZ /Swap errors: /] CALL IMSG ;PRINT IF VISIBLE HLRZ N,D CALL IDECTAB ;PRINT IF VISIBLE MOVEI M,[ASCIZ / CHK/] TXZE D,IO$IMP CALL IMSG ;PRINT IF VISIBLE MOVEI M,[ASCIZ / DEV/] TXZE D,IO$DER CALL IMSG ;PRINT IF VISIBLE MOVEI M,[ASCIZ / DAT/] TXZE D,IO$DTE CALL IMSG ;PRINT IF VISIBLE MOVEI M,[ASCIZ / Lost: /] HRRZ N,D TRZ N,070000 ;ZAP TWO MORE ERROR BITS SKIPGE VISIBLE ;CAN WE SEE IT? PUSHJ P,MSGDEC CALL ICRLF ;PRINT NEW LINE SWFIN: RETURN ;END OF DISPLAY PROGRAM PRTBIT: MOVEI M,BITTAB(C) SKIPN @M ;THIS BIT MEAN ANYTHING? POPJ P, ;NO, NO TYPEOUT THEN PUSHJ P,ISPACE ;WANT LEADING SPACE SEPARATOR PUSHJ P,ISPACE ;AND ANOTHER PUSHJ P,ISPACE ;AND ANOTHER PUSHJ P,IMSG ;PRINT IF VISIBLE TLO F,FL.NBK ;NOTE SOMETHING OUTPUT POPJ P, ;RETURN HAVING PRINTED FLAG PRTUED: TLO F,FL.NBK ;NOTE SOMETHING OUTPUT PUSH P,M MOVE M,RTEND ;GET RIGHT-HAND MARGIN SUB M,COL ;M := SPACES LEFT ON SCREEN CAIGE M,^D11 ;REASONABLE AMOUNT LEFT? PUSHJ P,IFRCL ;NO, FORCE NEW (INDENTED) LINE MOVEI M,[ASCIZ / Errors:/] TLON F,FL.DEV PUSHJ P,IMSG ;PRINT IF VISIBLE POP P,M PUSHJ P,ISPACE ;GET LEADING SPACE PUSHJ P,IMSG ;PRINT IF VISIBLE PJRST IDECPR ;PRINT IF VISIBLE PRTUEO: TLO F,FL.NBK ;NOTE SOMETHING OUTPUT PUSH P,M MOVE M,RTEND ;GET RIGHT-HAND MARGIN SUB M,COL ;M := SPACES LEFT ON SCREEN CAIGE M,^D18 ;REASONABLE AMOUNT LEFT? PUSHJ P,IFRCL ;NO, FORCE NEW (INDENTED) LINE MOVEI M,[ASCIZ / Errors:/] TLON F,FL.DEV PUSHJ P,IMSG ;PRINT IF VISIBLE POP P,M PUSHJ P,ISPACE ;LEADING SPACE SEPARATOR PUSHJ P,IMSG ;PRINT IF VISIBLE SKIPGE VISIBL ;CAN WE SEE IT? PJRST OCTPRT POPJ P, BITMSK=77 ;CLEAR, LEAVING BITS IN 777700,,0 BITTAB: ASCIZ /RHB/ ;REREAD HOME BLOCKS ASCIZ /OFL/ ;UNIT IS OFFLINE ASCIZ /HWP/ ;HARDWARE WRITE PROTECT ASCIZ /SWP/ ;SOFTWARE WRITE PROTECT ASCIZ /SAF/ ;SINGLE-ACCESS FILE STRUCTURE Z ;ZERO MOUNT COUNT ASCIZ /PRF/ ;PRIVATE FILE STRUCTURE Z ;FIRST HALF OF DC.STS FIELD Z ;SECOND HALF OF DC.STS FIELD Z ;MULTIPLE SAT BLOCKS ASCIZ /NNA/ ;NO NEW ACCESSES ASCIZ /AWL/ ;WRITE-LOCKED FOR ALL JOBS Z ;NOT ASSIGNED Z ;NOT ASSIGNED ASCIZ /2PT/ ;DUAL-PORTED UNIT BITTL==.-BITTAB UER2T1: XWD .DCHDV,[ASCIZ /HDEV:/] XWD .DCHDT,[ASCIZ /HDAT:/] XWD .DCSDV,[ASCIZ /SDEV:/] XWD .DCSDT,[ASCIZ /SDAT:/] XWD .DCECT,[ASCIZ /RETRIES:/] XWD .DCSER,[ASCIZ /SER:/] XWD .DCRER,[ASCIZ /RER:/] XWD .DCCER,[ASCIZ /CER:/] XWD .DCPHG,[ASCIZ /PHUNG:/] XWD .DCTHG,[ASCIZ /THUNG:/] XWD .DCNHG,[ASCIZ /NTHUNG:/] XWD .DCSHG,[ASCIZ /SHUNG:/] XWD .DCHBN,[ASCIZ /LBN:/] XWD .DCSOF,[ASCIZ /1CONI:/] XWD .DCERR,[ASCIZ /2CONI:/] XWD .DCSDI,[ASCIZ /1DATAI:/] XWD .DCHDI,[ASCIZ /2DATAI:/] UER2TL==.-UER2T1 UER2T3: IFIW PRTUED ;HDEV IFIW PRTUED ;HDAT IFIW PRTUED ;SDEV IFIW PRTUED ;SDAT IFIW PRTUED ;RETRIES IFIW PRTUED ;SER IFIW PRTUED ;RER IFIW PRTUED ;CER IFIW PRTUED ;PHUNG IFIW PRTUED ;THUNG IFIW PRTUED ;NTHUNG IFIW PRTUED ;SHUNG IFIW PRTUED ;LBN IFIW PRTUEO ;1CONI IFIW PRTUEO ;2CONI IFIW PRTUEO ;1DATAI IFIW PRTUEO ;2DATAI SUBTTL "\" NETWORK STATISTICS DISPLAY PROGRAM IFN FTNET,< X2SIZE==XSIZE/2 NETSTT: MOVE A,[+.GTFET] ;GET FTCMSR PUSHJ P,GETZ ;FROM MONITOR TRNN A, ;IS FTCMSR TURNED ON? JRST NOCMSR ;NO, THIS DISPLAY USELESS ;LINE 1 MOVEI M,[ASCIZ\ANF Statistics for\] ;HEADER PREFIX PUSHJ P,THISIM ;GIVE STANDARD HEADER LINE TABSET TAB7 ;NETWORK TABS ;LINE 2 MOVEI M,[ASCIZ /NTCOR= /] PUSHJ P,MSG MOVE A,[%NTCOR] PUSHJ P,GETA MOVEI N,(A) PUSHJ P,DECTAB MOVEI M,[ASCIZ /NTMAX= /] PUSHJ P,MSG MOVE A,[%NTMAX] PUSHJ P,GETA MOVEI N,(A) PUSHJ P,DECTAB MOVEI M,[ASCIZ /NTBAD= /] PUSHJ P,MSG MOVE A,[%NTBAD] PUSHJ P,GETA MOVEI N,(A) PUSHJ P,DECPRT NETST4: PUSHJ P,CRLF ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;UN-NUMBERED CONTROL WINDOW SET 1,X2SIZE-1,3,12,0,TAB9A SETZM NTRTL ;INITIALIZE RECEIVED TOTAL SETZM NTXTL ;INITIALIZE TRANSMITTED TOTAL MOVEI M,[ASCIZ /Unnumbered CTL XMIT'ed RECV'ed /] PUSHJ P,MSG MOVSI J,-^D7 ;MAX ENTRIES UNPRT1: MOVE M,[[ASCIZ \0 DAP/DATA \] [ASCIZ /1 ACK /] [ASCIZ /2 NAK /] [ASCIZ /3 REP /] [ASCIZ /4 START /] [ASCIZ /5 STACK /] [ASCIZ /6 NODE ID /]](J) PUSHJ P,MSG MOVE A,[%NTXTP] ;RECEVICE TABLE PUSHJ P,GETA ADDI A,(J) MOVSI A,(A) HRRI A,.GTNTP PUSHJ P,GETA SUB A,NTXTP(J) ;A := INCREMENTAL ADDM A,NTXTP(J) ;UPDATE TOTAL TLNN F,FL.INC ;INCREMENTAL OR TOTAL? SKIPA N,NTXTP(J) ;TOTAL MOVE N,A ADDM N,NTXTL ;ACCUMULATE TOTAL SENT TRNN J,-1 ;DAP/DATA MESSAGES? MOVNM N,NTXTH ;YES, REMEMBER FOR HISTOGRAM PUSHJ P,DECTAB MOVE A,[%NTRTP] PUSHJ P,GETA ADDI A,(J) MOVSI A,(A) HRRI A,.GTNTP PUSHJ P,GETA SUB A,NTRTP(J) ;A := INCREMENTAL ADDM A,NTRTP(J) ;UPDATE TOTAL TLNN F,FL.INC ;INCREMENTAL OR TOTAL? SKIPA N,NTRTP(J) ;TOTAL MOVE N,A ADDM N,NTRTL ;ACCUMULATE TOTAL RECEIVED TRNN J,-1 ;DAT/DATA MESSAGES? MOVNM N,NTRTH ;YES, REMEMBER FOR HISTOGRAM PUSHJ P,DECPRT PUSHJ P,CRLF AOBJN J,UNPRT1 ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;NUMBERED MESSAGE WINDOW SET X2SIZE,XSIZE,3,12,0,TAB9B MOVEI M,[ASCIZ /Numbered CTL XMIT'ed RECV'ed /] PUSHJ P,MSG MOVSI J,-^D7 HRRI J,1 NUPRT1: MOVE M,[[ASCIZ /0 /] [ASCIZ /1 CONNECT /] [ASCIZ /2 DISCONNECT /] [ASCIZ /3 NEIGHBORS /] [ASCIZ /4 REQ CONFIG /] [ASCIZ /5 CONFIG /] [ASCIZ /6 DATA REQUEST /] [ASCIZ /7 STATION CTL /]](J) PUSHJ P,MSG MOVE A,[%NTXMT] ;RECEVICE TABLE PUSHJ P,GETA ADDI A,(J) MOVSI A,(A) HRRI A,.GTNTP PUSHJ P,GETA SUB A,NTXMT(J) ;A := INCREMENTAL ADDM A,NTXMT(J) ;UPDATE TOTAL TLNN F,FL.INC ;INCREMENTAL OR TOTAL? SKIPA N,NTXMT(J) ;TOTAL MOVE N,A ADDM N,NTXTH ;ACCUMULATE TOTAL DATA SENT PUSHJ P,DECTAB MOVE A,[%NTRMT] PUSHJ P,GETA ADDI A,(J) MOVSI A,(A) HRRI A,.GTNTP PUSHJ P,GETA SUB A,NTRMT(J) ;A := INCREMENTAL ADDM A,NTRMT(J) ;UPDATE TOTAL TLNN F,FL.INC ;INCREMENTAL OR TOTAL? SKIPA N,NTRMT(J) ;TOTAL MOVE N,A ADDM N,NTRTH ;ACCUMULATE TOTAL DATA RECEIVED PUSHJ P,DECPRT PUSHJ P,CRLF AOBJN J,NUPRT1 ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;HERE TO DO A HISTOGRAM OF MESSAGE LENGTHS SET 1,X2SIZE-1,11,YSIZE,0,TAB7 MOVEI M,[ASCIZ /XMIT'ed=/] PUSHJ P,MSG MOVE N,NTXTL ;TOTAL MESSAGES SENT PUSHJ P,DECTAB MOVEI M,[ASCIZ /Average=/] PUSHJ P,MSG MOVE N,NTXTL ;GET TOTAL SENT AGAIN MOVE A,UPTINC ;UPTIME IDIV A,TCKSEC IDIV N,A PUSH P,N+1 PUSHJ P,DECPRT MOVEI CH,"." PUSHJ P,TYO POP P,N IMULI N,^D100 ;- SCALE REMAINDER IDIV N,A ; PUSHJ P,DECPRT MOVEI M,[ASCIZ \/sec\] PUSHJ P,MSG PUSHJ P,CRLF ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE IFGE ,< ;DON'T BOTHER FOR VT50'S, ETC. ;PRINT THE ACTUAL HISTOGRAM MOVEI M,[ASCIZ / 2**N 0% 20% 40% 60% 80% 99% /] PUSHJ P,MSG MOVE A,[%NTXDL] PUSHJ P,GETA LDB J,[POINT 9,A,8] ;NUMBER OF ENTRIES MOVNS J MOVSI J,(J) ;AOBJN POINTER HRRI J,(A) ;TABLE INDEX SETZB N,JS ;SETUP COUNT/INDEX MOVMS NTXTH ;POSITIFY TOTAL DATA SENT LEN2: HRLI A,1(J) ;OFF BY ONE HRRI A,.GTNTP PUSHJ P,GETA SUB A,NTXDL(JS) ;A := INCREMENTAL ADDM A,NTXDL(JS) ;UPDATE TOTAL TLNN F,FL.INC ;INCREMENTAL OR TOTAL? MOVE A,NTXDL(JS) ;TOTAL IMULI A,^D100 IDIV A,NTXTH ;SCALE BY TOTAL DATA SENT HRRI N,1(JS) ;SIZE (LOG 2) MOVEI CH," " ;LEADING SPACE CAIGE N,^D10 ;"EXPONENT" ONLY ONE DIGIT? PUSHJ P,TYO ;YES, MAKE TWO FOR NEATNESS PUSHJ P,DECPRT PUSHJ P,SPACE MOVE N,A MOVEI CH,"0" ;LEADING 0 CAIGE N,^D10 ;PERCENTAGE ONLY ONE DIGIT? PUSHJ P,TYO ;YES, MAKE TWO FOR NEATNESS PUSHJ P,DECPRT MOVEI CH,"%" PUSHJ P,TYO JUMPE A,LEN3 PUSHJ P,TAB ADDI A,3 ;ROUNDING ASH A,-2 MOVEI CH,"*" PUSHJ P,TYO SOJG A,.-1 LEN3: PUSHJ P,CRLF ADDI JS,1 ;INDEX TO INTERNAL TABLE AOBJN J,LEN2 > ;END IFGE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;HERE TO DO THE HISTOGRAM OF RECEIVED MESSAGES SET X2SIZE,XSIZE,11,YSIZE,0,TAB8 MOVEI M,[ASCIZ /RECV'ed=/] PUSHJ P,MSG MOVE N,NTRTL ;GET TOTAL RECEIVED PUSHJ P,DECTAB MOVEI M,[ASCIZ/Average=/] PUSHJ P,MSG MOVE N,NTRTL ;TOTAL RECEIVED AGAIN MOVE A,UPTINC ;UPTIME IDIV A,TCKSEC IDIV N,A PUSH P,N+1 PUSHJ P,DECPRT MOVEI CH,"." PUSHJ P,TYO POP P,N IMULI N,^D100 ;- SCALE REMAINDER IDIV N,A ; PUSHJ P,DECPRT MOVEI M,[ASCIZ \/sec\] PUSHJ P,MSG PUSHJ P,CRLF ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE IFGE ,< ;DON'T BOTHER IF VT50'S, ETC. MOVEI M,[ASCIZ / 2**N 0% 20% 40% 60% 80% 99% /] PUSHJ P,MSG MOVE A,[%NTRDL] PUSHJ P,GETA LDB J,[POINT 9,A,8] ;NUMBER OF ENTRIES MOVNS J MOVSI J,(J) ;AOBJN POINTER HRRI J,(A) ;TABLE INDEX SETZB N,JS ;INITIALIZE COUNT/INDEX MOVMS NTRTH ;POSITIFY TOTAL DATA RECEIVED LEN5: HRLI A,1(J) ;OFF BY ONE HRRI A,.GTNTP PUSHJ P,GETA SUB A,NTRDL(JS) ;A := INCREMENTAL VALUE ADDM A,NTRDL(JS) ;UPDATE TOTAL TLNN F,FL.INC ;INCREMENTAL OR TOTAL? MOVE A,NTRDL(JS) ;TOTAL IMULI A,^D100 IDIV A,NTRTH ;SCALE BY TOTAL DATA RECEIVED HRRI N,1(JS) ;GET SIZE (LOG 2) MOVEI CH," " ;LEADING SPACE CAIGE N,^D10 ;"EXPONENT" ONLY ONE DIGIT? PUSHJ P,TYO ;YES, MAKE TWO FOR NEATNESS PUSHJ P,DECPRT PUSHJ P,SPACE MOVE N,A MOVEI CH,"0" ;LEADING 0 CAIGE N,^D10 ;PERCENTAGE ONLY ONE DIGIT? PUSHJ P,TYO ;YES, MAKE TWO FOR NEATNESS PUSHJ P,DECPRT MOVEI CH,"%" PUSHJ P,TYO JUMPE A,LEN6 PUSHJ P,TAB ADDI A,3 ;ROUNDING ASH A,-2 MOVEI CH,"*" PUSHJ P,TYO SOJG A,.-1 LEN6: PUSHJ P,CRLF ADDI JS,1 ;OFFSET FOR INTERNAL TABLE AOBJN J,LEN5 > ;END IFGE POPJ P, SUBTTL "T" NETWORK DISPLAY OF THE TOPOLOGY NETPRG: MOVEI M,[ASCIZ\ANF Topology for\] ;HEADER TEXT PREFIX PUSHJ P,THISIM ;GIVE STANDARD HEADER LINE N.1: TABSET TAB7 ;SET STANDARD TABS NETPI0: MOVE A,[%CNNDB] ;GET THE GETTAB POINTER TO THE NDB'S PUSHJ P,GET ;GET IT CAIA JUMPN A,NETPI2 ;OK THERE IS A NETWORK SET 1,XSIZE,2,YSIZE,0,TAB4 MOVEI M,[ASCIZ \The T command can only be executed if: 1.The requester has SPY or PEEK privileges. 2. And the monitor was built for network support =603 \] CALL MSG JRST ADVICE NETPI2: TLNN F,FL.SPY!FL.PEK ;IS THE USER PRIVILEGED JRST NOPRIV ;NO PUSH P,A ;SAVE FIRST NDB MOVSI B,-NDBTLN ;NDB POINTERS TABLE LENGTH NETPI4: MOVE A,NDBGTB(B) ;NEXT POINTER GETTAB TABLE INDEX GETTAB A, ;(MUST GETTAB SINCE IN HIGH SEG) JRST NETPI5 ;MUST BE PRE-7.01 TLZ A,37 ;CLEAR INDEX AND INDIRECT BITS TRNE B,-1 ;FIRST ENTRY? ADDI A,XDBBLK ;NO (NOT LENGTH) RELOCATE POINTER MOVEM A,NDBPTB(B) ;SAVE IN NDB POINTER TABLE AOBJN B,NETPI4 ;LOOP MOVEI A,N ;ADDRESS OF NEIGHBORS INFO HRRM A,NDBNGN ;SET UP BYTE POINTER NETPI5: POP P,A ;GET BACK FIRST NDB DPB A,NDBNXT ;SAVE THE FIRST NDB POINTER SKIPG N,FIRJOB ;ANY "+" COMMANDS SEEN? JRST NETPI8 ;NO NETPI6: PUSHJ P,NXTNDB ;YES, SKIP THAT MANY NDB'S JRST [PUSHJ P,DWNJOB ;TOO MANY, BACKUP SOME JRST NETPI0] ;TRY AGAIN SOJG N,NETPI6 ;SKIP NODES NETPI8: CALL STROLL SETOM NLTYPD ;YES, WE TYPED ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE SKIPG NETMNY ;LOTS OF NEIGHBORS SOMEWHERE? JRST NETPR0 ;NO, NORMAL DISPLAY SET 1,XSIZE,2,YSIZE,0,TAB6X ;YES, COMPRESS SCREEN JRST NETPR1 ;AND BUILD DISPLAY NETPR0: SET 1,XSIZE,2,YSIZE,0,TAB6 ;NORMAL TOPOLOGY DISPLAY NETPR1: MOVEI M,[ASCIZ \ Node Neighbors OPR CTL LAR LAP LMS LMA LMR LMP \] CALL MSG NETPR2: SKIPGE LINE ;FILLED SCREEN YET? POPJ P, ;YEAH, QUIT NOW PUSHJ P,NXTNDB ;NO, ADVANCE TO NEXT NODE JRST [PUSHJ P,CHKDON;SCREEN NICELY FILLED UP YET? JRST NETPRG ;NO, TRY AGAIN POPJ P,] ;YES, SCREEN OK TO SHOW LDB A,NDBSNM ;GET THE NODE NAME ADDRESS PUSHJ P,MPEEK ;GET NODE NAME PUSHJ P,SIXBP MOVEI CH,"(" PUSHJ P,TYO LDB N,NDBNNM ;GET THE NODE NUMBER PUSHJ P,OCTPRT MOVEI M,[ASCIZ \)\] CALL MSG PUSHJ P,TAB SETZ A, ;COUNT THE NEIGHBORS SKIPA C,NDBNGH ;GET THE TOPOLOGY POINTER NETPR4: IBP C ;ADVANCE TOPOLOGY POINTER LDB N,C ;GET A NEIGHBOR ENTRY LDB N,NDBNGN ;GET NODE NUMBER OF NEIGHBOR SKIPE N PUSHJ P,[TRNN N,700 ;FULL THREE DIGITS? PUSHJ P,SPACE ;NO MORE THAN TWO TRNN N,770 ;HOW MAY DIGITS PUSHJ P,SPACE ;ONLY ONE PUSHJ P,OCTPRT;PRINT OCTAL NODE NUMBER AOJA A,COMMA];COUNT NEIGHBORS AND SEPARATE CAME C,NDBNGL ;LAST NEIGHBOR? JRST NETPR4 ;NOT YET, KEEP GOING SUBI A,</7>;SEE IF LOTS OF NEIGHBORS MOVEM A,NETMNY ;(COMPRESS SCREEN IF .GT. 0) PUSHJ P,TAB LDB A,NDBOPR ;GET THE OPR ENTRY JUMPE A,NETPR5 ;NO OPR TERMINAL ADD A,DCHOFF ;YES, POINT TO THE LDBDCH ENTRY IN THE LDB ADD A,LTBOFF ;MAKE SURE OF RIGHT SECTION PUSHJ P,MPEEK ;READ IT ANDI A,777 ;ONLY NINE BITS MOVEI N,(A) ;COPY PUSHJ P,OCTPRT ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE NETPR5: PUSHJ P,TAB LDB N,NDBCTJ ;IS STATION CONTROL BUSY SKIPE N PUSHJ P,DECPRT ;YES, PRINT THE JOB NUMBER PUSHJ P,TAB LDB N,NDBLAR ;LAR PUSHJ P,DECTAB LDB N,NDBLAP ;LAP PUSHJ P,DECTAB LDB N,NDBLMS PUSHJ P,DECTAB LDB N,NDBLMA ;LMA PUSHJ P,DECTAB LDB N,NDBLMR ;LMR PUSHJ P,DECTAB LDB N,NDBLMP ;LMP PUSHJ P,DECPRT PUSHJ P,CRLF ;END OF LINE 1 JRST NETPR2 ;DO NEXT NODE IN NETWORK NXTNDB: LDB B,NDBNXT ;ADDRESS OF NEXT NDB JUMPE B,CPOPJ ;0 TERMINATES LIST MOVE C,NDBLEN ;LENGTH OF NDB CAILE C,XDBLEN ;SMALL ENOUGH FOR US? MOVEI C,XDBLEN ;ONLY READ IN FIRST PART MOVN C,C ;NEGATIVE LENGTH ASH C,^D18 ;AOBJN POINTER NXTND1: MOVE A,B ;ADDRESS OF NDB WORD PUSHJ P,MPEEK ;GET A WORD MOVEM A,XDBBLK(C) ;STORE AOBJP C,CPOPJ1 ;EXIT IF LAST WORD AOJA B,NXTND1 ;GET NEXT WORD SUBTTL LOCAL STORAGE FOR "T" DISPLAY ;LIST OF BYTE POINTERS TO BE GETTAB'ED FROM MONITOR (MATCHES NDBPTB) NDBGTB: %NDLEN ;LENGTH OF NDB %NDNXT ;ADDRESS OF NEXT NDB %NDNNM ;NODE NUMBER %NDSNM ;ADDRESS OF STATION NAME %NDNGH ;FIRST NEIGHBOR POINTER %NDNGL ;LAST NEIGHBOR POINTER %NDNGN ;NODE NUMBER IN %NDNGH %NDOPR ;ADDRESS OF OPR LDB IF ANY %NDCTJ ;STATION CONTROL JOB NUMBER %NDLAR ;LAST ACK RECEIVED %NDLAP ;LAST MESSAGE ACK'ED %NDLMS ;LAST MESSAGE SENT %NDLMA ;LAST MESSAGE ASSIGNED %NDLMR ;LAST MESSAGE RECEIVED %NDLMP ;LAST MESSAGE PROCESSED NDBTLN==.-NDBGTB >;END FTNET SUBTTL "K" DISPLAY OF CI STATISTICS CISTAT: MOVE A,[+.GTFET] ;GETTAB FOR SCA FEATURE TEST PUSHJ P,GETZ ;GET IT FROM MONITOR TRNN A, ;MONITOR SUPPORT SCA? JRST NOSCA ;NO, THEN THIS IS USELESS SETZM CIVARB ;CLEAR VARIABLES MOVE A,[CIVARB,,CIVARB+1] BLT A,CIVARE ;ZEROES TO END MOVE A,[%CNCPU] ;GETTAB POINTER FOR NUMBER OF CPUS IN SYSTEM PUSHJ P,GET ;GET IT JRST [MOVEI A,1 ;ASSUME 1 SKIPE DUAL ;UNLESS 1077/1088/1099 MOVEI A,2 ;IN WHICH CASE IS 2 CPU'S JRST .+1] ;CONTINUE MOVN P1,A ;COPY -VE NUMBER OF CPUS TO P1 HRLZS P1 ;MAKE AN AOBJN POINTER MOVEM P1,CPUPTR ;SAVE IT SETZ N, ;INIT COUNT OF CI PORTS CISTS1: HRRZ A,P1 ;GET CPU NUMBER LSH A,1 ;TIMES TWO ADDX A,%CCCIP ;GETTAB TO GET CI PORT BLOCK ADDRESS PUSHJ P,GETZ ;GET IT OR ZERO SKIPE A ;CI PORT ON THIS CPU? AOS N ;YES, COUNT THEM UP MOVE T1,[.SQLNN+1,,.SSGLN] ;SCS. FUNCTION TO GET LOCAL NODE NUMBER DPB P1,[POINTR T1,SS.CPU] ;PLUG IN CPU NUMBER MOVEM T1,SCSBLK+.SQFNC ;STORE IN BLOCK MOVEI A,SCSBLK ;POINT AT ARGUMENTS SCS. A, ;ASK MONITOR SKIPA A,[-1] ;ERROR, GET FUNNY NUMBER MOVE A,SCSBLK+.SQLNN ;GET LOCAL NODE NUMBER MOVEM A,CPULNN(P1) ;SAVE IT AOBJN P1,CISTS1 ;LOOP FOR REMAINING CPUS JUMPE N,NOCIP ;JUMP IF NO CI PORTS ON SYSTEM MOVEI M,[ASCIZ\CI Status of\] ;LABEL OUR DISPLAY PUSHJ P,THISIM ;FIRE UP HEADER LINE MOVEI M,[ASCIZ / Open Paths: CI Node /] PUSHJ P,MSG ;START HEADER MOVSI P1,-MAXNDS ;SET TO PRINT COLUMNS CISTS2: PUSHJ P,SPACE ;SPACE OVER HRRZ N,P1 ;GET NODE NUMBER PUSHJ P,DECZ2 ;PRINT IT AOBJN P1,CISTS2 ;LOOP FOR REMAINDER PUSHJ P,CRLF ;END WITH CRLF ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE MOVE P1,CPUPTR ;GET AOBJN POINTER TO CPUS CISTS3: SKIPGE CPULNN(P1) ;OUR NODE NUMBER KNOWN? JRST CIST4A ;NO MOVEI M,[ASCIZ /CPU/] ;[635] ASSUME MULTI-PROCESSOR CONFIGURATION SKIPN DUAL ;[635] IS IT? MOVEI M,[ASCIZ / /];[635] NO, JUST PRINT 4 SPACES PUSHJ P,MSG ;PRINT MESSAGE HRRZ N,P1 ;GET CPU NUMBER SKIPE DUAL ;DON'T PRINT IF SINGLE PROCESSOR PUSHJ P,DECPRT ;ADD CPU NUMBER MOVEI M,[ASCIZ / /] ;4 SPACES PUSHJ P,MSG ;PRINT MESSAGE MOVSI P2,-MAXNDS ;LOOP FOR EACH NODE CISTS4: PUSHJ P,SPACE ;SPACE OVER TO CORRECT COLUMN MOVE A,[.SQRPS+1,,.SSRPS] ;SET UP ARGUMENT BLOCK DPB P1,[POINTR A,SS.CPU] ;PLUG IN CPU NUMBER MOVEM A,SCSBLK+.SQFNC ;STORE HRRZM P2,SCSBLK+.SQRPN ;NODE NUMBER MOVEI T1,SCSBLK ;POINT AT ARGUMENTS SCS. T1, ;ASK MONITOR TDZA A,A ;IF ERROR, ASSUME BOTH PATHS DOWN MOVE A,SCSBLK+.SQRPS ;GET PATH STATUS TLZE A,1 ;PATH A OPEN? TLOA A,"A" ;YES, MARK SO TLO A," " ;NO TRZE A,1 ;PATH B OPEN? TROA A,"B" ;YES, MARK SO TRO A," " ;NO HRRZ T1,SCSBLK+.SQRPN ;GET NODE NUMBER CAMN T1,CPULNN(P1) ;IS THIS "OUR" NODE? MOVE A,["-",,"-"] ;YES, PRINT DASHES TO INDICATE SUCH HLRZ CH,A ;GET FIRST CHARACTER PUSHJ P,TYO ;PRINT IT HRRZ CH,A ;GET SECOND CHARACTER PUSHJ P,TYO ;PRINT IT AOBJN P2,CISTS4 ;LOOP FOR REMAINING PATHS ON THIS CPU PUSHJ P,CRLF ;NEW LINE CIST4A: AOBJN P1,CISTS3 ;LOOP FOR REMAINING CPUS MOVE P1,CPUPTR ;SET TO SCAN CPU'S AGAIN CISTS5: MOVEI P2,NOSTCT ;GET OFFSET IN STATISTICS COUNTERS BLOCK IMULI P2,(P1) ;... HRLZ A,P1 ;GET CPU NUMBER HRRI A,.DIACC ;FUNCTION TO READ CI STATISTICS COUNTERS MOVEM A,CTRBLK(P2) ;STORE IN FIRST WORD MOVE A,[7,,.DICRD] ;CHANNEL,,SUB-FUNCTION TO READ COUNTERS MOVEM A,CTRBLK+1(P2) ;STORE IN SECOND WORD MOVSI A,-NOSTCT ;-VE NUMBER OF WORDS HRRI A,CTRBLK(P2) ;OFFSET SKIPL CPULNN(P1) ;PUNT IF WE DON'T HAVE A CI PORT DIAG. A, ;READ CI PORT COUNTERS SETOM CPULNN(P1) ;IF IT FAILED, ASSUME CI PORT WENT AWAY AOBJN P1,CISTS5 ;LOOP FOR REMAINING CPUS ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE TABSET TABCI ;SET TAB STOPS MOVEI M,[ASCIZ " Packet counts: XMT Avg/sec RCV Avg/sec Discarded Node "] PUSHJ P,MSG ;PRINT HEADER MOVE P1,CPUPTR ;GET POINTER AGAIN CISTS6: SKIPGE CPULNN(P1) ;HAVE A CI PORT? JRST CIST6A ;NO MOVEI P2,NOSTCT ;GET OFFSET IN STATISTICS COUNTERS BLOCK IMULI P2,(P1) ;... MOVEI M,[ASCIZ /CPU/] ;GET MESSAGE SKIPE DUAL ;MULTI-PROCESSOR CONFIGURATION? PUSHJ P,MSG ;YES, PRINT MESSAGE HRRZ N,P1 ;GET CPU NUMBER SKIPE DUAL ;DON'T PRINT IF SINGLE PROCESSOR PUSHJ P,DECPRT ;ADD CPU NUMBER PUSHJ P,TAB ;PRINT A TAB MOVE N,CTRBLK+13(P2) ;GET TRANSMITTED PACKET COUNT TLNE F,FL.INC ;INCREMENTAL? SUB N,CTRSAV+13(P2) ;YES, REMOVE BASE PUSHJ P,DECB8 ;PRINT IT PUSHJ P,TAB ;ANOTHER TAB MOVE N,CTRBLK+13(P2) ;GET TRANSMITTED PACKET COUNT AGAIN TLNE F,FL.INC ;INCREMENTAL? SUB N,CTRSAV+13(P2) ;YES, REMOVE BASE MOVE A,UPTINC ;GET UPTIME IDIV A,TCKSEC ;DIVIDE BY TICKS/SECOND MOVEM A,TEMP ;SAVE FOR USE AGAIN PUSHJ P,CMPDDN ;PRINT 4 DIGITS, ".", 2 DIGITS PUSHJ P,TAB ;PRINT A TAB MOVE N,CTRBLK+14(P2) ;GET RECEIVED PACKET COUNT TLNE F,FL.INC ;INCREMENTAL? SUB N,CTRSAV+14(P2) ;YES, REMOVE BASE PUSHJ P,DECB8 ;PRINT IT PUSHJ P,TAB ;ANOTHER TAB MOVE N,CTRBLK+14(P2) ;GET RECEIVED PACKET COUNT AGAIN TLNE F,FL.INC ;INCREMENTAL? SUB N,CTRSAV+14(P2) ;YES, REMOVE BASE PUSHJ P,CMPDDN ;PRINT 4 DIGITS, ".", 2 DIGITS PUSHJ P,TAB ;ADD A TAB MOVE N,CTRBLK+12(P2) ;GET DATAGRAMS DISCARDED TLNE F,FL.INC ;INCREMENTAL? SUB N,CTRSAV+12(P2) ;YES, REMOVE BASE PUSHJ P,SPACE ;SPACE OVER PUSHJ P,DECB8 ;PRINT IT PUSHJ P,TAB ;ADD A TAB MOVEI M,[ASCIZ / /] ;AND A FEW SPACES PUSHJ P,MSG ;... LDB N,[POINT 8,CTRBLK+15(P2),31] ;GET SELECTED NODE CAIN N,377 ;-1 IN 8 BITS? JRST [MOVEI M,[ASCIZ /ALL/] ;YES, GET TEXT PUSHJ P,MSG ;PRINT IT JRST .+2] ;CONTINUE PUSHJ P,DECZ2 ;ADD SELECTED NODE PUSHJ P,CRLF ;ADD CRLF CIST6A: AOBJN P1,CISTS6 ;LOOP FOR REMAINING CPUS ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE MOVEI M,[ASCIZ " Statistics: A ACK A NAK A NRS B ACK B NAK B NRS "] PUSHJ P,MSG ;PRINT HEADER MOVE P1,CPUPTR ;GET POINTER AGAIN CISTS7: SKIPGE CPULNN(P1) ;HAVE A CI PORT? JRST CIST7A ;NO MOVEI P2,NOSTCT ;GET OFFSET IN STATISTICS COUNTERS BLOCK IMULI P2,(P1) ;... MOVEI M,[ASCIZ /CPU/] ;GET MESSAGE SKIPE DUAL ;MULTI-PROCESSOR CONFIGURATION? PUSHJ P,MSG ;YES, PRINT MESSAGE HRRZ N,P1 ;GET CPU NUMBER SKIPE DUAL ;DON'T PRINT IF SINGLE PROCESSOR PUSHJ P,DECPRT ;ADD CPU NUMBER PUSHJ P,TAB ;PRINT A TAB MOVE N,CTRBLK+4(P2) ;GET A ACKS TLNE F,FL.INC ;INCREMENTAL? SUB N,CTRSAV+4(P2) ;YES, REMOVE BASE PUSHJ P,DECB8 ;PRINT PUSHJ P,TAB ;TAB MOVE N,CTRBLK+5(P2) ;GET A NAKS TLNE F,FL.INC ;INCREMENTAL? SUB N,CTRSAV+5(P2) ;YES, REMOVE BASE PUSHJ P,DECB8 ;PRINT PUSHJ P,TAB ;TAB MOVE N,CTRBLK+6(P2) ;GET A NRS TLNE F,FL.INC ;INCREMENTAL? SUB N,CTRSAV+6(P2) ;YES, REMOVE BASE PUSHJ P,DECB8 ;PRINT PUSHJ P,TAB ;TAB MOVE N,CTRBLK+7(P2) ;GET B ACKS TLNE F,FL.INC ;INCREMENTAL? SUB N,CTRSAV+7(P2) ;YES, REMOVE BASE PUSHJ P,DECB8 ;PRINT PUSHJ P,TAB ;TAB MOVE N,CTRBLK+10(P2) ;GET B NAKS TLNE F,FL.INC ;INCREMENTAL? SUB N,CTRSAV+10(P2) ;YES, REMOVE BASE PUSHJ P,DECB8 ;PRINT PUSHJ P,TAB ;TAB MOVE N,CTRBLK+11(P2) ;GET B NRS TLNE F,FL.INC ;INCREMENTAL? SUB N,CTRSAV+11(P2) ;YES, REMOVE BASE PUSHJ P,DECB8 ;PRINT PUSHJ P,CRLF ;ADD CRLF CIST7A: AOBJN P1,CISTS7 ;LOOP FOR REMAINING CPUS ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE MOVE P1,CPUPTR ;GET POINTER AGAIN TLZ F,FL.DEV ;NO HEADER PRINTED YET CISTS8: SKIPGE CPULNN(P1) ;HAVE A CI PORT? JRST CISTS0 ;NO MOVEI P2,NOSTCT ;GET OFFSET IN STATISTICS COUNTERS BLOCK IMULI P2,(P1) ;... SETZ N, ;ACCUMULATE TOTAL MOVSI A,-7 ;NUMBER OF ERROR COUNTERS HRR A,P2 ;OFFSET FOR THIS CPU ADD N,CTRBLK+16(A) ;ADD IN THIS PAIR TLNE F,FL.INC ;INCREMENTAL? SUB N,CTRSAV+16(A) ;YES, REMOVE BASE AOBJN A,.-3 ;LOOP FOR ALL ERROR COUNTERS JUMPE N,CISTS0 ;JUMP IF NO ERRORS MOVEI M,[ASCIZ / Errors: /] TLON F,FL.DEV ;NEED THE HEADER? PUSHJ P,MSG ;YES, PRINT IT MOVEI M,[ASCIZ /CPU/] ;GET MESSAGE SKIPE DUAL ;MULTI-PROCESSOR CONFIGURATION? PUSHJ P,MSG ;YES, PRINT MESSAGE HRRZ N,P1 ;GET CPU NUMBER SKIPE DUAL ;DON'T PRINT IF SINGLE PROCESSOR PUSHJ P,DECPRT ;ADD CPU NUMBER PUSH P,P1 ;SAVE AN AC MOVSI P1,-CTRLEN ;LENGTH OF ERROR COUNTERS TABLES CISTS9: MOVEI T1,CTRBLK(P2) ;GET ADDRESS OF BLOCK ADD T1,CTRGET(P1) ;ADD IN BYTE POINTER LDB N,T1 ;GET THE CURRENT VALUE ADDI T1,CTRSAV-CTRBLK ;OFFSET TO SAVED AREA LDB T2,T1 ;GET THE PREVIOUS VALUE TLNE F,FL.INC ;INCREMENTAL? SUB N,T2 ;YES, REMOVE BASE MOVE M,CTRTXT(P1) ;GET ADDRESS OF TEXT SKIPE N ;IF ANYTHING, PUSHJ P,MSGDEC ; PRINT IT AOBJN P1,CISTS9 ;LOOP FOR ALL COUNTERS PUSHJ P,CRLF ;END THE LINE POP P,P1 ;RESTORE P1 CISTS0: AOBJN P1,CISTS8 ;LOOP FOR REMAINING CPUS MOVE A,[CTRBLK,,CTRSAV] ;NOW COPY THE INFO TO THE SAVE AREA BLT A,CTRSVE ;... RETURN ;END OF DISPLAY PROGRAM ;MACRO TO DEFINE CI ERROR COUNTER NAMES AND OFFSETS DEFINE CICTRS,< CTR , CTR , CTR , CTR , CTR , CTR , CTR , CTR , CTR , CTR , CTR , CTR , CTR , >; END DEFINE CICTRS DEFINE CTR(TEXT,PTR), CTRGET: CICTRS CTRLEN==.-CTRGET ;LENGTH OF TABLES DEFINE CTR(TEXT,PTR),<[ASCIZ / TEXT/]> CTRTXT: CICTRS SUBTTL "E" DISPLAY OF ETHERNET STATUS IFN FTNET,< ETHDPY: MOVEI M,[ASCIZ |Ethernet Status of|] PUSHJ P,THISIM ;FIRE UP SYSTEM HEADER LINE TABSET TABETH ;ETHERNET TABS PUSHJ P,ETHRCL ;READ ETHERNET CHANNEL LIST POPJ P, ;ERROR, RETURN SKIPL P2,T1 ;SAVE AOBJN POINTER TO LIST POPJ P, ;EMPTY LIST, RETURN ND %NTNIP,<15,,.GTNTP> ;IN CASE NOT YET IN UUOSYM MOVX A,%NTNIP ;GETTAB ITEM FOR ANF/ETHERNET PROTOCOL PUSHJ P,GETZ ;GET PROTOCOL NUMBER OR ZERO HRLM A,EPTANF ;PATCH THE TABLE WITH THE VALUE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;LOOP FOR EACH CIRCUIT IN THE SYSTEM ETHDP0: PUSHJ P,CRLF ;BLANK LINE BEFORE DISPLAY MOVEI M,[ASCIZ |Chan/Kont State E-Net Address DgmXmt DgmRcv|] PUSHJ P,MSG ;... PUSHJ P,CRLF ;END LINE SETZ J, ;INCREMENTAL STATISTICS TABLE INDEX MOVE T1,(P2) ;GET NEXT CHANNEL ID PUSHJ P,ETHRCI ;READ CHANNEL INFO JRST ETHDPX ;ERROR, TRY NEXT CHANNEL MOVE P1,T1 ;SAVE AOBJN POINTER TO BUFFER MOVEI M,[ASCIZ |ETH-|] ;OUTPUT CHANNEL STATUS LINE PUSHJ P,MSG ;... MOVE N,.EICNM(P1) ;GET ETHERNET CHANNEL NUMBER PUSHJ P,DECPRT ;PRINT OUT PUSHJ P,TAB ;TAB OVER TO STATUS COLUMN LDB T1,[POINTR (ENTBLK+.ETCSW,ET.CON)] ;GET CHANNEL ONLINE FLAG MOVE M,ONFSTS(T1) ;GET ADDRESS OF ONLINE/OFFLINE STRING PUSHJ P,MSG ;PRINT STATUS PUSHJ P,TAB ;TAB OVER TO ETHERNET ADDRESS COLUMN MOVEI T1,.EICEA(P1) ;GET ADDRESS OF ETHERNET ADDRESS PUSHJ P,EADPRT ;PRINT ETHERNET ADDRESS MOVE T1,(P2) ;GET CHANNEL ID PUSHJ P,ETHRCC ;READ CHANNEL COUNTERS JRST ETHDP1 ;ERROR, SKIP DISPLAY MOVE P1,T1 ;SAVE AOBJN POINTER TO BUFFER PUSHJ P,TAB ;TAB TO DATAGRAMS TRANSMITTED COLUMN PUSHJ P,TAB ;... MOVE N,.ECCDX(P1) ;GET DATAGRAMS TRANSMITTED COUNT TLNE F,FL.INC ;WANT INCREMENTAL? SUB N,DGMXMT(J) ;YES, COMPUTE VALUE PUSHJ P,DECB8 ;PRINT OUT PUSHJ P,TAB ;TAB TO DATAGRAMS RECEIVED COLUMN MOVE N,.ECCDR(P1) ;GET DATAGRAMS RECEIVED COUNT TLNE F,FL.INC ;WANT INCREMENTAL? SUB N,DGMRCV(J) ;YES, COMPUTE VALUE PUSHJ P,DECB8 ;PRINT OUT MOVE N,.ECCDX(P1) ;GET DATAGRAMS TRANSMITTED COUNT MOVEM N,DGMXMT(J) ;SAVE CURRENT VALUE MOVE N,.ECCDR(P1) ;GET DATAGRAMS RECEIVED COUNT MOVEM N,DGMRCV(J) ;SAVE CURRENT VALUE AOJ J, ;UPDATE TABLE INDEX ETHDP1: PUSHJ P,CRLF ;FINISH STATUS LINE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ETHDP2: MOVE T1,(P2) ;GET CHANNEL ID PUSHJ P,ETHRKL ;READ KONTROLLER LIST JRST ETHDP5 ;ERROR, DO PORTAL LIST JUMPGE T1,ETHDP5 ;SKIP DISPLAY IF EMPTY LIST PUSH P,P2 ;SAVE CHANNEL LIST AOBJN POINTER MOVE P2,T1 ;SET UP KONTROLLER LIST AOBJN POINTER ETHDP3: MOVE T1,(P2) ;GET KONTROLLER ID PUSHJ P,ETHRKI ;READ KONTROLLER INFO JRST ETHDP4 ;ERROR, TRY NEXT KONTROLLER MOVE P1,T1 ;SAVE AOBJN POINTER TO BUFFER PUSHJ P,SPACE ;INDENT THE KONTROLLER PUSHJ P,SPACE ; BY A TAD OR TWO DMOVE T1,.EIKCP(P1) ;GET CPU NUMBER AND KONTROLLER TYPE MOVE T4,.EIKNO(P1) ;AND KONTROLLER NUMBER PUSHJ P,KTYPRT ;OUTPUT PUSHJ P,TAB ;TAB OVER TO STATUS COLUMN LDB T1,[POINTR (ENTBLK+.ETKSW,ET.KON)] ;GET KONTROLLER ONLINE FLAG MOVE M,ONFSTS(T1) ;GET ADDRESS OF ONLINE/OFFLINE STRING PUSHJ P,MSG ;PRINT STATUS PUSHJ P,TAB ;TAB OVER TO ETHERNET ADDRESS COLUMN MOVEI T1,.EIKHA(P1) ;GET ADDRESS OF ETHERNET ADDRESS PUSHJ P,EADPRT ;PRINT ETHERNET ADDRESS MOVE T1,(P2) ;GET KONTROLLER ID PUSHJ P,ETHRKC ;READ KONTROLLER COUNTERS JRST ETHDP4 ;ERROR, TRY NEXT KONTROLLER MOVE P1,T1 ;SAVE AOBJN POINTER TO BUFFER PUSHJ P,TAB ;TAB TO DATAGRAMS TRANSMITTED COLUMN PUSHJ P,TAB ;... MOVE N,.ECKDX(P1) ;GET DATAGRAMS TRANSMITTED COUNT TLNE F,FL.INC ;WANT INCREMENTAL? SUB N,DGMXMT(J) ;YES, COMPUTE VALUE PUSHJ P,DECB8 ;PRINT OUT PUSHJ P,TAB ;TAB TO DATAGRAMS RECEIVED COLUMN MOVE N,.ECKDR(P1) ;GET DATAGRAMS RECEIVED COUNT TLNE F,FL.INC ;WANT INCREMENTAL? SUB N,DGMRCV(J) ;YES, COMPUTE VALUE PUSHJ P,DECB8 ;PRINT OUT MOVE N,.ECKDX(P1) ;GET DATAGRAMS TRANSMITTED COUNT MOVEM N,DGMXMT(J) ;SAVE CURRENT VALUE MOVE N,.ECKDR(P1) ;GET DATAGRAMS RECEIVED COUNT MOVEM N,DGMRCV(J) ;SAVE CURRENT VALUE AOJ J, ;UPDATE TABLE INDEX ETHDP4: PUSHJ P,CRLF ;FINISH STATUS LINE AOBJN P2,ETHDP3 ;LOOP BACK FOR ALL KONTROLLERS POP P,P2 ;RESTORE CHANNEL LIST AOBJN POINTER ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ETHDP5: MOVE T1,(P2) ;GET CHANNEL ID PUSHJ P,ETHRPL ;READ PORTAL LIST JRST ETHDPX ;SKIP DISPLAY IF ERROR JUMPGE T1,ETHDPX ;SKIP DISPLAY IF EMPTY LIST PUSH P,P2 ;SAVE CHANNEL LIST AOBJN POINTER MOVE P2,T1 ;SET UP PORTAL LIST AOBJN POINTER PUSHJ P,CRLF ;BLANK LINE BEFORE DISPLAY MOVEI M,[ASCIZ |Protocol State Kont User DgmXmt DgmRcv FQE|] PUSHJ P,MSG ;PRINT SUBHEADER PUSHJ P,CRLF ;END LINE ETHDP6: MOVE T1,(P2) ;GET PORTAL ID PUSHJ P,ETHRPI ;READ PORTAL INFO JRST ETHDP8 ;ERROR, TRY NEXT PORTAL MOVE P1,T1 ;SAVE AOBJN POINTER TO BUFFER PUSHJ P,SPACE ;INDENT PROTOCOL TYPES PUSHJ P,SPACE ; BY A LITTLE BIT HRRE N,.EIPPI(P1) ;GET PROTOCOL TYPE CODE PUSHJ P,EPTPRT ;PRINT OUT PUSHJ P,TAB ;TAB OVER TO STATUS COLUMN LDB T1,[POINTR (ENTBLK+.ETPSW,ET.PON)] ;GET PORTAL ONLINE FLAG MOVE M,ONFSTS(T1) ;GET ADDRESS OF ONLINE/OFFLINE STRING PUSHJ P,MSG ;PRINT STATUS PUSHJ P,TAB ;TAB OVER TO KONTROLLER COLUMN MOVE T1,.EIPKS(P1) ;GET KONTROLLER ID PUSHJ P,ETHRKI ;READ KONTROLLER INFO JRST ETHDP7 ;ERROR, SKIP KONTROLLER COLUMN DMOVE T1,RKIBUF+.EIKCP ;GET CPU NUMBER AND KONTROLLER TYPE MOVE T4,RKIBUF+.EIKNO ;AND KONTROLLER NUMBER PUSHJ P,KTYPRT ;OUTPUT ETHDP7: PUSHJ P,TAB ;TAB OVER TO OWNER COLUMN SKIPN .EIPJC(P1) ;PORTAL BELONG TO SYSTEM? JRST [MOVEI M,[ASCIZ |System|] ;YES, SAY SO PUSHJ P,MSG ;... JRST ETHDP8] ;AND CONTINUE MOVEI M,[ASCIZ |Job |] ;OUTPUT JOB INFO PUSHJ P,MSG ;... LDB N,[POINT 9,.EIPJC(P1),35] ;GET JOB NUMBER PUSHJ P,DECPRT ;OUTPUT MOVEI M,[ASCIZ | Ctx |] ;OUTPUT CONTEXT INFO PUSHJ P,MSG ;... LDB N,[POINT 9,.EIPJC(P1),26] ;GET CONTEXT NUMBER PUSHJ P,DECPRT ;OUTPUT ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ETHDP8: MOVE T1,(P2) ;GET PORTAL ID PUSHJ P,ETHRPC ;READ PORTAL COUNTERS JRST ETHDP9 ;ERROR, SKIP DISPLAY MOVE P1,T1 ;SAVE AOBJN POINTER TO BUFFER PUSHJ P,TAB ;TAB TO DATAGRAMS TRANSMITTED COLUMN MOVE N,.ECPDX(P1) ;GET DATAGRAMS TRANSMITTED COUNT TLNE F,FL.INC ;WANT INCREMENTAL? SUB N,DGMXMT(J) ;YES, COMPUTE VALUE PUSHJ P,DECB8 ;PRINT OUT PUSHJ P,TAB ;TAB TO DATAGRAMS RECEIVED COLUMN MOVE N,.ECPDR(P1) ;GET DATAGRAMS RECEIVED COUNT TLNE F,FL.INC ;WANT INCREMENTAL? SUB N,DGMRCV(J) ;YES, COMPUTE VALUE PUSHJ P,DECB8 ;PRINT OUT PUSHJ P,TAB ;TAB TO FREE QUEUE ERROR COLUMN MOVE N,.ECPUU(P1) ;GET FREE QUEUE ERROR COUNT TLNE F,FL.INC ;WANT INCREMENTAL? SUB N,DGMFQE(J) ;YES, COMPUTE VALUE PUSHJ P,DECB6 ;YES, PRINT OUT MOVE N,.ECPDX(P1) ;GET DATAGRAMS TRANSMITTED COUNT MOVEM N,DGMXMT(J) ;SAVE CURRENT VALUE MOVE N,.ECPDR(P1) ;GET DATAGRAMS RECEIVED COUNT MOVEM N,DGMRCV(J) ;SAVE CURRENT VALUE MOVE N,.ECPUU(P1) ;GET FREE QUEUE ERROR COUNT MOVEM N,DGMFQE(J) ;SAVE CURRENT VALUE AOJ J, ;UPDATE TABLE INDEX ETHDP9: PUSHJ P,CRLF ;FINISH STATUS LINE AOBJN P2,ETHDP6 ;LOOP BACK FOR ALL PORTALS POP P,P2 ;RESTORE CHANNEL LIST AOBJN POINTER ETHDPX: AOBJN P2,ETHDP0 ;LOOP BACK FOR ALL CHANNELS POPJ P, ;AND RETURN ;ROUTINE TO READ ETHERNET CHANNEL LIST ETHRCL: MOVE T1,[.ETRCL,,4] ;SET UP ETHNT. TO READ LIST MOVEM T1,ENTBLK+.ETFCN ;... MOVEI T1,RCLBFL ;SIZE OF BUFFER MOVEI T2,RCLBUF ;ADDRESS OF BUFFER DMOVEM T1,ENTBLK+.ETAR1 ;... PJRST ETHRXL ;READ LIST AND RETURN ;ROUTINE TO READ ETHERNET CHANNEL INFORMATION ETHRCI: MOVEM T1,ENTBLK+.ETCSW ;STORE CHANNEL ID MOVE T1,[.ETRCI,,4] ;SET UP ETHNT. TO READ CHANNEL INFO MOVEM T1,ENTBLK+.ETFCN ;... MOVEI T1,RCIBFL ;SIZE OF BUFFER MOVEI T2,RCIBUF ;ADDRESS OF BUFFER DMOVEM T1,ENTBLK+.ETAR1 ;... PJRST ETHRXL ;READ LIST AND RETURN ;ROUTINE TO READ ETHERNET CHANNEL COUNTERS ETHRCC: MOVEM T1,ENTBLK+.ETCSW ;STORE CHANNEL ID MOVE T1,[.ETRCC,,4] ;SET UP ETHNT. TO READ CHANNEL COUNTERS MOVEM T1,ENTBLK+.ETFCN ;... MOVEI T1,RCCBFL ;SIZE OF BUFFER MOVEI T2,RCCBUF ;ADDRESS OF BUFFER DMOVEM T1,ENTBLK+.ETAR1 ;... PJRST ETHRXL ;READ LIST AND RETURN ;ROUTINE TO READ ETHERNET KONTROLLER LIST ETHRKL: MOVEM T1,ENTBLK+.ETCSW ;STORE CHANNEL ID MOVE T1,[.ETRKL,,4] ;SET UP ETHNT. TO READ KONTROLLER LIST MOVEM T1,ENTBLK+.ETFCN ;... MOVEI T1,RKLBFL ;SIZE OF BUFFER MOVEI T2,RKLBUF ;ADDRESS OF BUFFER DMOVEM T1,ENTBLK+.ETAR1 ;... PJRST ETHRXL ;READ LIST AND RETURN ;ROUTINE TO READ ETHERNET KONTROLLER INFORMATION ETHRKI: MOVEM T1,ENTBLK+.ETCSW ;STORE KONTROLLER ID MOVE T1,[.ETRKI,,4] ;SET UP ETHNT. TO READ KONTROLLER INFO MOVEM T1,ENTBLK+.ETFCN ;... MOVEI T1,RKIBFL ;SIZE OF BUFFER MOVEI T2,RKIBUF ;ADDRESS OF BUFFER DMOVEM T1,ENTBLK+.ETAR1 ;... PJRST ETHRXL ;READ LIST AND RETURN ;ROUTINE TO READ ETHERNET KONTROLLER COUNTERS ETHRKC: MOVEM T1,ENTBLK+.ETCSW ;STORE KONTROLLER ID MOVE T1,[.ETRKC,,4] ;SET UP ETHNT. TO READ KONTROLLER COUNTERS MOVEM T1,ENTBLK+.ETFCN ;... MOVEI T1,RKCBFL ;SIZE OF BUFFER MOVEI T2,RKCBUF ;ADDRESS OF BUFFER DMOVEM T1,ENTBLK+.ETAR1 ;... PJRST ETHRXL ;READ LIST AND RETURN ;ROUTINE TO READ ETHERNET PORTAL LIST ETHRPL: MOVEM T1,ENTBLK+.ETCSW ;STORE CHANNEL ID MOVE T1,[.ETRPL,,4] ;SET UP ETHNT. TO READ PORTAL LIST MOVEM T1,ENTBLK+.ETFCN ;... MOVEI T1,RPLBFL ;SIZE OF BUFFER MOVEI T2,RPLBUF ;ADDRESS OF BUFFER DMOVEM T1,ENTBLK+.ETAR1 ;... PJRST ETHRXL ;READ LIST AND RETURN ;ROUTINE TO READ ETHERNET PORTAL INFORMATION ETHRPI: MOVEM T1,ENTBLK+.ETCSW ;STORE PORTAL ID MOVE T1,[.ETRPI,,4] ;SET UP ETHNT. TO READ PORTAL INFO MOVEM T1,ENTBLK+.ETFCN ;... MOVEI T1,RPIBFL ;SIZE OF BUFFER MOVEI T2,RPIBUF ;ADDRESS OF BUFFER DMOVEM T1,ENTBLK+.ETAR1 ;... PJRST ETHRXL ;READ LIST AND RETURN ;ROUTINE TO READ ETHERNET PORTAL COUNTERS ETHRPC: MOVEM T1,ENTBLK+.ETCSW ;STORE PORTAL ID MOVE T1,[.ETRPC,,4] ;SET UP ETHNT. TO READ PORTAL COUNTERS MOVEM T1,ENTBLK+.ETFCN ;... MOVEI T1,RPCBFL ;SIZE OF BUFFER MOVEI T2,RPCBUF ;ADDRESS OF BUFFER DMOVEM T1,ENTBLK+.ETAR1 ;... PJRST ETHRXL ;READ LIST AND RETURN ;ROUTINE TO READ ETHERNET LIST AND RETURN AOBJN POINTER ETHRXL: MOVEI T1,ENTBLK ;READ ETHERNET LIST ETHNT. T1, ;... POPJ P, ;ERROR MOVNS T1 ;MAKE AOBJN POINTER TO BUFFER HRLZS T1 ;... HRR T1,ENTBLK+.ETAR2 ;... JRST CPOPJ1 ;RETURN ;ROUTINE TO PRINT OUT AN ETHERNET ADDRESS EADPRT: PUSH P,[5] ;SET LOOP ITERATION COUNT HRLI T1,(POINT 8,) ;BUILD BYTE POINTER TO ADDRESS PUSH P,T1 ;SAVE BYTE POINTER ON STACK EADPR1: ILDB N,(P) ;GET NEXT HEX BYTE PUSHJ P,HEXPRB ;PRINT OUT MOVEI CH,"-" ;PRINT HYPHEN PUSHJ P,TYO ;... SOSLE -1(P) ;DECREMENT AND TEST ITERATION COUNT JRST EADPR1 ;LOOP BACK FOR FIRST 5 BYTES ILDB N,(P) ;GET LAST BYTE OF ADDRESS POP P,(P) ;CLEAN STACK POP P,(P) ;... PJRST HEXPRB ;OUTPUT LAST BYTE AND RETURN ;ROUTINE TO PRINT OUT AN ETHERNET PROTOCOL TYPE EPTPRT: JUMPL N,EPPPRT ;JUMP IF PSEUDO-PROTOCOL TYPE CODE PUSH P,N ;SAVE PROTOCOL TYPE ON STACK ANDI N,177777 ;MASK TO SIXTEEN BITS LSH N,-^D8 ;GET HIGH BYTE PUSHJ P,HEXPRB ;PRINT IT OUT MOVEI CH,"-" ;PRINT HYPHEN PUSHJ P,TYO ;... MOVE N,0(P) ;GET LOW BYTE OF PROTOCOL TYPE ANDI N,377 ;... PUSHJ P,HEXPRB ;PRINT OUT MOVEI N,EPTTAB ;ADDRESS OF NAME STRING TABLE EPTPR2: HLRZ CH,0(N) ;GET PROTOCOL TYPE JUMPE CH,EPTPR3 ;DONE WHEN 0 ENCOUNTERED CAME CH,0(P) ;IS THIS OURS? AOJA N,EPTPR2 ;NO, CHECK REST OF TABLE HRRZ M,0(N) ;YES, GET ADDRESS OF NIFTY STRING PUSHJ P,SPACE ;SPACE OVER A BIT PUSHJ P,MSG ;AND TYPE OUT TEXT EPTPR3: POP P,N ;ADJUST STACK POPJ P, ;AND RETURN EPTTAB: HEX (6001),,[ASCIZ\DNA/MOP\] ;DNA LOAD/DUMP (MOP) HEX (6002),,[ASCIZ\RmtCon\] ;DNA Remote Console (MOP) HEX (6003),,[ASCIZ\DECnet\] ;DNA Routing HEX (6004),,[ASCIZ\LAT\] ;Local Area Terminal HEX (6005),,[ASCIZ\Diag's\] ;Diagnostics HEX (6006),,[ASCIZ\Customer\] ;Reserved for customer HEX (6007),,[ASCIZ\SCA\] ;System Comm Architecture HEX (9000),,[ASCIZ\Loopback\] ;Loopback testing EPTANF:! HEX (000),,[ASCIZ\ANF-10\] ;ANF (Patched on the fly) 0 EPPPRT: MOVNS N ;CONVERT TO POSITIVE OFFSET CAILE N,EPPMAX ;IN RANGE? SETZ N, ;NO, GET DEFAULT MOVE M,EPPTAB(N) ;GET ADDRESS OF PSEUDO-PROTOCOL TYPE STRING PJRST MSG ;PRINT PROTOCOL TYPE AND RETURN EPPTAB: [ASCIZ |-???-|] ;UNKNOWN [ASCIZ |-Inf-|] ;INFO [ASCIZ |-Prm-|] ;PROMISCUOUS [ASCIZ |-Unk-|] ;UNKNOWN PROTOCOL TYPES EPPMAX==.-EPPTAB-1 ;MAXIMUM PSEUDO-PROCOTOL TYPE CODE ;ROUTINE TO PRINT OUT AN ETHERNET KONTROLLER ID KTYPRT: PUSH P,P1 ;SAVE P1 PUSH P,T4 ;SAVE KONTROLLER NUMBER PUSH P,T1 ;AND CPU NUMBER CAILE T2,KTYMAX ;KONTROLLER TYPE IN RANGE? SETZ T2, ;NO, GET DEFAULT MOVE P1,KTYTAB(T2) ;GET KONTROLLER TABLE VALUE HRRZ M,P1 ;GET ADDRESS OF KONTROLLER TYPE STRING PUSHJ P,MSG ;PRINT KONTROLLER TYPE POP P,N ;GET BACK CPU NUMBER TLNN P1,(KY.CPU) ;PRINT CPU NUMBER? JRST KTYPR1 ;NO, SKIP OVER MOVEI CH,"-" ;GET HYPHEN PUSHJ P,TYO ;PRINT PUSHJ P,DECPRT ;PRINT CPU NUMBER KTYPR1: POP P,N ;GET BACK KONTROLLER NUMBER TLNN P1,(KY.KNO) ;PRINT KONTROLLER NUMBER? JRST KTYPR2 ;NO, SKIP OVER MOVEI CH,"-" ;GET HYPHEN PUSHJ P,TYO ;PRINT PUSHJ P,DECPRT ;PRINT KONTROLLER NUMBER KTYPR2: POP P,P1 ;RESTORE P1 POPJ P, ;AND RETURN KY.CPU==1B0 ;PRINT CPU NUMBER KY.KNO==1B1 ;PRINT KONTROLLER NUMBER KTYTAB: KY.CPU+KY.KNO+[ASCIZ |???|] ;UNKNOWN KONTROLLER TYPE CODE KY.CPU+ [ASCIZ |NI|] ;KLNI KY.KNO+ [ASCIZ |UNA|] ;DEUNA KTYMAX==.-KTYTAB-1 ;MAXIMUM KONTROLLER TYPE CODE ;ONLINE/OFFLINE STATUS STRINGS ONFSTS: [ASCIZ |Offline|] [ASCIZ |Online|] >; END IFN FTNET SUBTTL "Z" DISPLAY OF LAT SERVER COUNTERS IFN FTNET,< LATDPY: MOVEI M,[ASCIZ /LAT Status on/] PUSHJ P,THISIM ;FIRE UP HEADER LINE TABSET TABLAT ;SELECT LAT TABS MOVEI M,[ASCIZ /Server Received Xmitted Re-Xmitted Seq error Ill msg Ill slot /] PUSHJ P,MSG DMOVE T1,[.LAQUA+1 .LASAS] ;SET UP TO FIND ALL SERVERS DMOVEM T1,LASARG DMOVE T1,[^D20*7 ;SPACE FOR 20 SERVERS LASBUF] DMOVEM T1,LASARG+.LABCT SETZM LASARG+.LAQUA ;ZERO MEANS LIST ALL SERVERS MOVEI T1,LASARG LATOP. T1, POPJ P, HLRZ T1,LASARG+.LABCT ;GET COUNT OF WORDS RETURNED IDIVI T1,^D7 ;CONVERT TO NUMBER OF SERVERS MOVN P2,T1 HRLZS P2 ;MAKE AN AOBJN POINTER HRRI P2,LASBUF ;TO POINT TO LIST OF SERVER NAMES LATDP1: PUSHJ P,CRLF DMOVE T1,[.LAQUA+1 .LASAS] ;SET UP ARGS TO GET LAT INFO DMOVEM T1,LASARG DMOVE T1,[^D26 LASCBF] DMOVEM T1,LASARG+.LABCT HRROI T1,1(P2) ;MAKE CANONICAL ASCIZ POINTER MOVEM T1,LASARG+.LAQUA ;AS QUALIFIER MOVEI T1,LASARG LATOP. T1, ;OH WHELL JFCL HRRZ T1,LASCBF+5 MOVEI CH,"*" CAIE T1,2 MOVEI CH," " PUSHJ P,TYO MOVEI M,1(P2) ;POINT TO SERVER NAME PUSHJ P,MSG ;OUTPUT IT MOVEI CH,"(" PUSHJ P,TYO MOVEI M,LASCBF+14 PUSHJ P,MSG MOVEI M,[ASCIZ /) /] PUSHJ P,MSG DMOVE T1,[.LAQUA+1 .LASCO] ;SET UP ARGS TO GET LAT COUNTERS DMOVEM T1,LASARG DMOVE T1,[^D8 LASCBF] ;8 COUNTERS DMOVEM T1,LASARG+.LABCT HRROI T1,1(P2) ;MAKE CANONICAL ASCIZ POINTER MOVEM T1,LASARG+.LAQUA ;AS QUALIFIER MOVEI T1,LASARG LATOP. T1, ;OH WHELL JFCL MOVE P1,[-6,,LASCBF] LATDP2: PUSHJ P,TAB MOVE N,(P1) PUSHJ P,DECB8 AOBJN P1,LATDP2 ADDI P2,6 AOBJN P2,LATDP1 POPJ P, >; END IFN FTNET SUBTTL "Q" DISPLAY OF THE SYSTEM QUEUES QUEPRG: PUSHJ P,UNLOCK ;DEFEAT "V" COMMAND, ALLOW IPCF TO WORK PUSHJ P,STROLL ;[611] START DISPLAY VARIABLES SETOM NLTYPD ;[611] MARK THAT LINES HAVE BEEN TYPED MOVEI M,[ASCIZ\Queues for\] ;HEADER TEXT PREFIX PUSHJ P,THISIM ;IDENTIFY US PUSHJ P,CRLF ;BLANK LINE FOR NEATNESS TABSET TAB7 ;SET NORMAL TAB STOPS PUSHJ P,SETVIS ;[611] DETERMINE VISIBILITY MOVE A,FIRJOB ;COUNT OF "JOBS" TO SKIP MOVEM A,EATCNT ;SET FOR EMSG ;ASK [SYSTEM] QUASAR FOR A LISTING OF THE QUEUES MOVE A,[1000,,IPCPAG];PAGE POINTER TO USE PUSHJ P,RSTIPC ;CLEAR OUT ANY SPURIOUS IPCF PACKETS SKIPN B,QSRPID ;PID FOR [SYSTEM] QUASAR JRST QSRPD2 ;NO PID--TRY AGAIN PIDOK: PUSHJ P,CREPAG ;CREATE PAGE TO SEND TO QUASAR JRST QUEERR ;NO PAGE, NO QUEUES MOVX N,LIQALL ;LIST ALL QUEUES MOVEM N,QSRFLG ;SET IN FLAG WORD TO QUASAR MOVE N,[QSRMSG,,] ;BLT POINTER TO BLT N,+QSRLEN-1 ;COPY QUASAR REQUEST MESSAGE PUSHJ P,SNDIPC ;SEND REQUEST TO QUASAR JRST QUEERR ;QUE ERROR ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;NOW RECEIVE IPCF REPLY PACKET(S) QUELOP: PUSHJ P,RECIPC ;GET ANSWER PACKET JRST QUEERR ;DOESN'T WORK CAME B,IPCBLK+.IPCFS ;THIS PACKET FROM [SYSTEM]QUASAR? JRST QUELOP ;NO, EAT IT MOVEI C,+.OHDRS ;FIRST ARGUMENT ADDRESS ;LOOP OVER ARGUMENT BLOCKS WITHIN IPCF MESSAGE QUELO1: ;MACRO %53A(1072) AND MACTEN %2(26) BLOW THE POINTR FORM: ; LDB D,[POINTR ARG.HD(C),AR.LEN] ;LENGTH OF THIS ARGUMENT BLOCK ; LDB N,[POINTR ARG.HD(C),AR.TYP] ;TYPE OF THIS ARGUMENT BLOCK HLRZ D,ARG.HD(C) ;LENGTH OF ARG BLOCK HRRZ N,ARG.HD(C) ;TYPE OF ARG BLOCK CAIN N,.ORDSP ;OPR DISPLAY ARGUMENT? JRST QUELO6 ;YES, JUST EAT IT MOVEI M,ARG.DA(C) ;START OF TEXT (ASCIZ) STRING HRLI M,(POINT 7,) ;MAKE ASCII BYTE POINTER MOVE N,EATCNT ;GET EAT COUNTER CAME N,FIRJOB ;STARTED DISPLAY YET? JRST QUELO4 ;YES, PASS TEXT VERBATIM QUELO3: MOVE N,M ;COPY OF BYTE POINTER ILDB CH,N ;GET A CHARACTER CAIE CH,.CHCRT ;A ? JRST QUELO4 ;NO, REAL TEXT, DISPLAY IT IBP M ;YES, EAT IT IBP M ;AND ASSUMED FOLLOWING JRST QUELO3 ;CHECK FOR MORE BLANK LINES QUELO4: PUSHJ P,EMSG ;NO - GO DISPLAY THE TEXT QUELO6: SOSG +.OARGC ;MORE ARGUMENT BLOCKS? JRST QUELOS ;NO, SEE IF MORE IPCF PACKETS ADD C,D ;POINT TO NEXT ARGUMENT BLOCK JRST QUELO1 ;BACK TO TYPE IT ;LOOP OVER ALL IPCF PACKETS COMPRISING ANSWER FROM [SYSTEM]QUASAR QUELOS: MOVE N,+.OFLAG ;QUASAR FLAGS TXNE N,WT.MOR ;MORE TO COME? JRST QUELOP ;YES, GO READ IT PUSHJ P,CHKDON ;NO, SEE HOW THIS SCREEN FARED JRST QUEPRG ;NOT SO GOOD POPJ P, ;OK QSRPD2: PUSH P,A ;SAVE A MOVX A,%SIQSR ;GETTAB ARG TO PUSHJ P,GETZ ;GET PID FOR [SYSTEM] QUASAR OR ZERO MOVEM A,QSRPID ;SAVE IT POP P,A ;RESTORE A SKIPE B,QSRPID ;ANY GOOD? JRST PIDOK ;YES -- LET'S CONTINUE QUEERR: MOVEI M,[ASCIZ\? Queues cannot be listed \] ;HORRIBLE ERROR MESSAGE PJRST MSG ;GO LIST IT ON SCREEN SUBTTL DCNNOD - Display DECnet node status DCNNOD: SET 1,XSIZE,1,YSIZE,0,TAB7 ; Set the terminal up MOVEI M,[ASCIZ | DECnet Node Status for System |]; Use this one for NON-ANSI PUSHJ P,MSG ; Output as a message PUSHJ P,CONFI0 ; Output the system name PUSHJ P,SPACE ; Type a space PUSHJ P,PDATIM ; and the date and time SET 1,XSIZE,2,YSIZE,0,TABDNN ; Set up header tab stops MOVEI M,[ASCIZ |Node Delay Hops Cost Links Address Circuit|] PUSHJ P,MSG ; Output it as a message SET 1,XSIZE,3,YSIZE,0,TABDNN ; Set up for Job information MOVX T1,DN.FLK!<.DNLNN,,^D1024+3> ; Known, list, length MOVEM T1,KNONOD ; Get list of known nodes MOVEI T1,KNONOD ; Get the address of the list DNET. T1, ; do it RETURN ; None there MOVE P1,KNONOD+.DNCNT; Get the count of nodes returned SUB P1,FIRJOB ; Do the right thing JUMPLE P1,CPOPJ ; Return if none MOVE P2,FIRJOB ; Get the first job ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE DCNND0: MOVE T1,KNONOD+.DNNMS(P2) ; Get the first one on the list JUMPE T1,DCNND5 ; Do the next one if no name MOVEM T1,NODSTA+.DNNAM; Save as node name for DNET. function MOVX T1, ; Get the function code and length MOVEM T1,NODSTA ; Save it MOVEI T1,NODSTA ; Get the address of the block DNET. T1, ; Get the information JRST DCNND5 ; None available LDB T1,[POINTR(NODSTA+.DNRTR,DN.RCH)] ; Get the valid flag TRNE F,FR.SKP ;Checking for "skip" (valid delay)? JUMPE T1,DCNND5 ;Yes, then skip if it isn't TRNE F,FR.IDL ; List all or just active (suppress idle)? JRST [LDB T1,[POINTR(NODSTA+.DNLLI,DN.VLD)] ; Get links JUMPE T1,DCNND5 ; If invalid, then skip it LDB T1,[POINTR(NODSTA+.DNLLI,DN.LNK)] ; Get links JUMPE T1,DCNND5 ; If none and valid, then skip it JRST .+1] ; Continue on below MOVE A,NODSTA+.DNNAM ; Get the node name we used CALL SIXBP ; Type it out CALL TAB ; And position for the next one LDB N,[POINTR(NODSTA+.DNLLI,DN.DLY)] ; Get the delay SKIPGE NODSTA+.DNLLI ; Blank field if not valid info CALL DECB6 ; Type it in decimal NODT1: CALL TAB ; And position for the next one LDB N,[POINTR(NODSTA+.DNRTR,DN.HOP)] ; Get the number of hops away CALL DECB3 ; Type it out CALL TAB ; And position to the next one LDB N,[POINTR(NODSTA+.DNRTR,DN.CST)] ; Get the cost CALL DECB3 ; Type it out CALL TAB ; And to the next column LDB N,[POINTR(NODSTA+.DNLLI,DN.VLD)] ; Get the number of links SKIPE N ; Anything there JRST [LDB N,[POINTR(NODSTA+.DNLLI,DN.LNK)] ; Getactive links JUMPE N,.+1 ; Nothing if zero CALL DECB4 ; Print it out JRST .+1] ; And do the next one CALL TAB ; No, then position to the next column ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE MOVE A,NODSTA+.DNADR ; Node address IDIVI A,2000 ; A := "area"; B := "node number" JUMPE A,[MOVEI M,[ASCIZ\ \] ;Place holder text PUSHJ P,MSG ;Type it out JRST DCNND2] ;And cap off with the local number MOVE N,A ; N := area number PUSHJ P,DECB2 ; Type out two-digit number MOVEI CH,"." ; Area separator PUSHJ P,TYO ; Tell user the difference DCNND2: MOVE N,B ; N := local node number PUSHJ P,DECB4 ; Type out four-digit node number PUSHJ P,TAB ; Cap off address column, position to next SKIPN NODSTA+.DNCKT ; Have an output circuit JRST [MOVEI M,[ASCIZ | |] CALL MSG ; Type it out JRST DCNND3] ; And type out tab and next field MOVEI M,NODSTA+.DNCKT ; Get the byte pointer back CALL MSG ; Type it out DCNND3: ;[604] CALL TAB ; Tab to right place ;[604] LDB T1,[POINTR(NODSTA+.DNRTR,DN.BNT)] ; Get the node type ;[604] CAIGE T1,2 ; Is it legal ;[604] JRST DCNND1 ; Nope ;[604] MOVE M,[[ASCIZ |Phase II|] ;[604] [ASCIZ |Phase III|] ;[604] [ASCIZ |Phase IV|]]-2(T1) ; Get the phase number ;[604] CALL MSG DCNND1: CALL CRLF ; Type a CRLF DCNND5: AOS P2 ; Increment index SOJGE P1,DCNND0 ; Loop for the next one POPJ P, ; or return to caller POPJ P, ; Return to caller SUBTTL DCNSTA - Display DECnet link status information DCNSTA: SET 1,XSIZE,1,YSIZE,0,TAB7 ; Set the terminal up MOVEI M,[ASCIZ | DECnet Link Status for System |] ; Use this one for NON-ANSI PUSHJ P,MSG ; Output as a message PUSHJ P,CONFI0 ;Type out node name and time PUSHJ P,SPACE ;Type a space PUSHJ P,PDATIM ;Type the date and time SET 1,XSIZE,2,YSIZE,0,TABDNL ; Set up to type header MOVEI M,[ASCIZ |Job Node Chn State XMIT RCVD DOBJ SOBJ Seg XFLOW RFLOW|] CALL MSG ; To the TTY DCNJOB: SET 1,XSIZE,3,YSIZE,0,TABDNL ; Reset for Job INFO SKIPN P1,FIRJOB ; Have A first job SETZM P1 ; Place for job number HRLZS P1 ; Job number is in the left half MOVEM P1,DNTBLK+.DNJCN ; Save the job number ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE DCNJB1: MOVX X,DN.FLS!; Get a block of the correct length for all MOVEM X,DNTBLK ; Save it ; Please note that in order for this to work, You must save the contents of ; DNTBLK+.DNJCN if you use the UUO block for something else. Or else it ; will do the next function with garbage in this word. MOVEI X,DNTBLK ; Get the address of the block DNET. X, ; Get the arguments SKIPA ; Skip if he errors to us SKIPN DNTBLK+.DNJCN ; Any jobs returned POPJ P, ; No, then return to caller TRNN F,FR.IDL ; Want to supress "idle" links? JRST DCN.0 ; No, print all links HRRZ A,DNTBLK+.DNSTA ; Link status CAIN A,'CW ' ; Waiting for a connect? JRST DCNJB1 ; Yes, "idle", suppress DCN.0: HLRE P1,DNTBLK+.DNJCN ; Get the job number in T1 SKIPGE P1 ; Have a live one? JRST [MOVEI M,[ASCIZ |NRTSER|] CALL MSG ; Output a line JRST DCN.1] ; And continue on below MOVE N,P1 ; Get the job number PUSHJ P,DECPRT ; Output a decimal number DCN.1: SKIPN DNTBLK+.DNMPR ; Monitor process word? JRST DCN.11 ; no skip it. MOVEI M,[ASCIZ |_|] ; Yes, type out additional info PUSHJ P,MSG ; Type it out MOVE N,DNTBLK+.DNMPR ; Get the process info (line number) PUSHJ P,OCTPRT ; Print out an octal number DCN.11: CALL TAB ; Go to the next column SKIPN A,DNTBLK+.DNNOD ; Any node name JRST [MOVEI M,[ASCIZ | --|] ; Get a string PUSHJ P,MSG ; onto the terminal JRST DCN.M] ; Do the next one CALL SIXBP ; Output sixbit word DCN.M: CALL TAB ; Go to the next column ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE HRRZ N,DNTBLK+.DNJCN ; Get the channel CALL DECB3 ; Output it CALL TAB ; Get to the next column HRLZ A,DNTBLK+.DNSTA ; Get the status CALL SPACE ; Space over to center within column CALL SIXBP ; Output sixbit status word CALL TAB ; And get to the next column HLRZ N,DNTBLK+.DNMSG ; Get XMIT count JUMPE N,DCN.NM ; And go to the Receive count CALL DECB6 ; Output it in Decimal DCN.NM: CALL TAB ; Type a TAB HRRZ N,DNTBLK+.DNMSG ; Get Received messages JUMPE N,DCN.N2 ; None, then don't output this CALL DECB6 ; Output the number in decimal DCN.N2: CALL TAB ; Type a Tab HLRZ N,DNTBLK+.DNOBJ ; Get the destination object type ANDI N,377 ; Make it 8-bits CALL DCNTOB ; Type out object type DCN.M1: CALL TAB ; Position it HRRZ N,DNTBLK+.DNOBJ ; And the source ANDI N,377 ; Make it 8-bits CALL DCNTOB ; Type out object type DCN.M2: CALL TAB ; And on to the next column HRRZ N,DNTBLK+.DNSEG ; Get the segment size CALL DECB3 ; And output it CALL TAB ; And get to the next column HLRZ T1,DNTBLK+.DNFLO ; Get the XMIT flow control option MOVE M,FLOPTR(T1) ; Get the option CALL MSG ; Output it CALL TAB ; ANd type it out HRRZ T1,DNTBLK+.DNFLO ; And the receive flow control option MOVE M,FLOPTR(T1) ; Get the type CALL MSG CALL CRLF ; Output a CRLF JRST DCNJB1 ; DO the next job ;Type out DECnot object type names, or decimal object type if unknown DCNTOB: SETZ M, ; No idea yet CAIG N,DCNOTL ; Is it in our table? MOVE M,DCNOTB(N) ; Get the object type name CAIN N,^D63 ; Is it DTR? MOVEI M,[ASCIZ |DTR|] ; DTR/DTS CAIN N,^D123 ; PSTHRU? MOVEI M,[ASCIZ |PST|] ; Get the passthrough task name CAIN N,^D201 ; TOPS-10/20 MS/MAIL? MOVEI M,[ASCIZ |MAIL|] ; Get 36-bit mail name CAIN N,^D255 ; "-1" ? MOVEI M,[ASCIZ | **|] ; Yeah, anything goes JUMPN M,MSG ; Print out known object type name CALL SPACE ; Elstwise one space for good form PJRST DECPRT ; Print unknown object type numerically ;DCNOTB - DECnot object type table DCNOTB: [ASCIZ |ANY|] ; 0 is any task [ASCIZ |FAL|] ; 1 is FAL [ASCIZ |URD|] ; 2 is Unit Record Devices [ASCIZ |ATS|] ; 3 is application terminal service [ASCIZ |CTS|] ; 4 is Command terminal Services [ASCIZ |TCV|] ; 5 is RSX-11M Task control Version 1 [ASCIZ |OSI|] ; 6 Operator Services Interface [ASCIZ |NRM|] ; 7 Node Resources Manager [ASCIZ |70G|] ; 8 IMB 3270-BSC Gateway [ASCIZ |80G|] ; 9 IBM 2780-BSC Gateway [ASCIZ |90G|] ;10 IBM 3790-BSC Gateway [ASCIZ |TPS|] ;11 TPS Application [ASCIZ |RDA|] ;12 RT-11 DIBOL Application [ASCIZ |T2TH|] ;13 TOPS-20 Terminal Handler [ASCIZ |T2RS|] ;14 TOPS-20 Remote Spooler [ASCIZ |TCV2|] ;15 RSX-11M Task control version 2 [ASCIZ |TLK|] ;16 TLK Utility [ASCIZ |FAL|] ;17 FAL [ASCIZ |RTL|] ;18 RSX-11M Remote Task Loader [ASCIZ |NICE|] ;19 NICE process [ASCIZ |MTP|] ;20 RSTS/E Media Transfer Program [ASCIZ |HNCT|] ;21 RSTS/E Homogeneous Network CTH [ASCIZ |MAIL|] ;22 Mail Listener [ASCIZ |NRT|] ;23 NRT program [ASCIZ |CTH|] ;24 Concentrator Terminal Handler [ASCIZ |LBM|] ;25 Loop back mirror [ASCIZ |ERCV|] ;26 Event Receiver [ASCIZ |VPMU|] ;27 VAX/VMS Personal Message Utility [ASCIZ |FTS|] ;28 FTS [ASCIZ |PHON|] ;29 PHONE Utility [ASCIZ |DDMF|] ;30 Distributed Data Management Facility [ASCIZ |X25G|] ;31 X.25 Gateway server [ASCIZ |UETP|] ;32 UETP [ASCIZ |VMAI|] ;33 VAX/VMS MAIL utility [ASCIZ |X29S|] ;34 X.29 Terminal server [ASCIZ |CAL|] ;35 Calendar system [ASCIZ |X25A|] ;36 X.25 Gateway access [ASCIZ |SNAG|] ;37 SNA Gateway access [ASCIZ |SNAR|] ;38 SNA RJE utility Z ;39 Z ;40 Z ;41 [ASCIZ |CTRM|] ;42 CTERM terminal protocol DCNOTL==.-DCNOTB ; Maximum ;FLOPTR - Pointers to output flow control options FLOPTR: POINT 7,[ASCIZ | |] POINT 7,[ASCIZ | None|] POINT 7,[ASCIZ | Seg |] POINT 7,[ASCIZ | Msg |] SUBTTL PAGE CREATE/DESTROY SUBROUTINES ;CREPAG -- CREATE A PAGE ;CALL IS: ; ; MOVX A, ; PUSHJ P,CREPAG ; ERROR ; NORMAL ; ;WHERE IS THE DESIRED PAGE NUMBER. ; ;ON ERROR THE PAGE COULD NOT BE CREATED (ERROR CODE IN M) ; ;ON NORMAL RETURN THE DESIRED PAGE IS CREATED AND ADDRESSABLE. ; ;USES M, N, N1 CREPAG: HRRZ N1,A ;DESIRED PAGE NUMBER MOVEI N,1 ;ONLY ONE ARGUMENT MOVE M,[.PAGCD,,N] ;PAGE. ARGUMENT BLOCK TO PAGE. M, ;CREATE A NEW PAGE CAIN M,PAGCE% ;ERROR UNLESS PAGE ALREADY EXISTED AOS (P) ;SUCCESSFUL RETURN POPJ P, ;RETURN AS APPROPRIATE ;DESPAG -- DESTROY PAGE ;CALL IS: ; ; MOVX A, ; PUSHJ P,DESPAG ; ERROR ; NORMAL ; ;WHERE IS THE DESIRED PAGE TO BE DESTROYED. ; ;ON ERROR THE PAGE COULD NOT BE MADE NON-EXISTANT ; ;ON NORMAL RETURN THE PAGE DOES NOT EXIST ; ;USES M, N, N1 DESPAG: HRRZ N1,A ;DESIRED PAGE NUMBER TXO N1,PA.GAF ; (WANT TO DESTROY) MOVEI N,1 ;ONLY ONE ARGUMENT MOVE M,[.PAGCD,,N] ;PAGE. ARGUMENT BLOCK TO PAGE. M, ;DESTROY THE PAGE CAIN M,PAGME% ;ERROR ONLY IF PAGE ALREADY NON-EXTANT AOS (P) ;SKIP RETURN POPJ P, ;RETURN AS APPROPRIATE SUBTTL IPCF SEND/RECEIVE ROUTINES ;RSTIPC -- RESET IPCF (CLEAR ANY "BOGUS" PAGES) ;CALL IS: ; ; MOVX A, ; PUSHJ P,RSTIPC ; RETURN ; ;WHERE IS A SCRATCH PAGE AVAILABLE TO RECEIVE ANY STRAY ;IPCF PAGES. ; ;ON RETURN THERE ARE NO IPCF PAGES WAITING TO BE RECEIVED BY THIS ;JOB. ; ;USES M, N, N1 RSTIPC: PUSHJ P,DESPAG ;MAKE SURE PAGE AVAILABLE TO RECEIVE POPJ P, ;DUH? MOVX N,IP.CFB!IP.CFV ;NON-BLOCKING RECEIVE MOVEM N,IPCBLK+.IPCFL ;SET FLAGS WORD SETZM IPCBLK+.IPCFS ;CLEAR SENDERS PID SETZM IPCBLK+.IPCFR ;CLEAR RECEIVERS PID MOVEM A,IPCBLK+.IPCFP ;SET WHERE TO RECEIVE PAGE MOVE N,[.IPCFP+1,,IPCBLK] ;IPCFR. ARGUMENT BLOCK TO IPCFR. N, ;RECEIVE ANY PAGE (NON-BLOCKING) POPJ P, ;GOOD ENOUGH JRST RSTIPC ;AH HA! MAKE SURE NO MORE PAGES LEFT ;RECIPC -- RECEIVE IPCF PAGE, BLOCKING ;CALL IS: ; ; MOVX A, ; PUSHJ P,RECIPC ; ERROR ; NORMAL ; ;WHERE IS THE DESIRED PAGE NUMBER TO RECEIVE THE IPCF ;MESSAGE PACKET. ; ;ON ERROR RETURN EITHER THE PAGE COULD NOT BE MADE AVAILABLE ;(DESTROYED) FOR RECEIVING OR AN IPCF FAILURE OCCURED ; ;ON NORMAL RETURN THE IPCF MESSAGE PACKET IS IN AND N ;CONTAINS THE IPCF "ASSOCIATED VARIABLE" ; ;USES M, N, N1 RECIPC: PUSHJ P,DESPAG ;MAKE SURE PAGE AVAILABLE POPJ P, ;IS NOT, ERROR MOVX N,IP.CFV ;PAGE MODE (BLOCKING) MOVEM N,IPCBLK+.IPCFL ;SET IPCF FLAGS SETZM IPCBLK+.IPCFS ;CLEAR SENDERS PID SETZM IPCBLK+.IPCFR ;CLEAR RECEIVERS PID MOVEM A,IPCBLK+.IPCFP ;SET RECEIVE POINTER MOVE N,[.IPCFP+1,,IPCBLK] ;IPCFR. ARGUMENT POINTER TO IPCFR. N, ;RECEIVE A PAGE POPJ P, ;ERROR JRST CPOPJ1 ;SUCCESS, MESSAGE IN PAGE ;SNDIPC -- SEND AN IPCF MESSAGE PAGE ;CALL IS: ; ; MOVX A, ; MOVX B, ; PUSHJ P,SNDIPC ; ERROR ; NORMAL ; ;WHERE IS THE PAGE NUMBER OF THE MESSAGE PAGE TO BE SENT, ;AND IS THE IPCF PID TO WHOM THE MESSAGE IS TO BE SENT. ; ;ON ERROR THE MESSAGE COULD NOT BE SENT (ERROR OTHER THAN RECEIVER ;OR SYSTEM FULL) ; ;ON NORMAL THE IPCF MESSAGE PAGE HAS BEEN SENT. ; ;USES M, N, N1 SNDIPC: MOVX N,IP.CFV ;PAGE MODE MOVEM N,IPCBLK+.IPCFL ;SET FLAGS WORD SETZM IPCBLK+.IPCFS ;CLEAR SENDERS PID MOVEM B,IPCBLK+.IPCFR ;SET RECEIVERS PID MOVEM A,IPCBLK+.IPCFP ;SET MESSAGE POINTER SNDIPD: MOVE N,[.IPCFP+1,,IPCBLK] ;IPCFS. ARGUMENT POINTER TO IPCFS. N, ;SEND THE IPCF MESSAGE PAGE CAIA ;MAYHAPS AN ERROR JRST CPOPJ1 ;PACKET SENT CAIE N,IPCRR% ;RECEIVER FULL? CAIN N,IPCRY% ;OR SYSTEM FULL? CAIA ;YES, NOT REALLY AN ERROR POPJ P, ;ERROR MOVEI N,1 ;ONE SECOND SLEEP N, ;TO WAIT FOR THINGS TO IMPROVE JRST SNDIPD ;TRY ANOTHER SEND SUBTTL SUBROUTINES FOR STATUS COMPUTATION ;SUBROUTINE TO READ JOB DATA AND VARIOUS PARAMETERS IJBDAT: MOVE A,[%CNSTS] ;GET FEATURES CALL GETZ ;IF ANY THERE MOVEI B,^D50 ;50 HERTZ?? TXNN A,ST%CYC ;IF 60 HERTZ THEN MOVEI B,^D60 ;CHANGE THE VALUE MOVEM B,FREAK ;REMEMBER FREQUENCY MOVE A,[%VMPPB] ;GETTAB INDEX TO PUSHJ P,GETZ ;READ "PER-PROCESS" START ADDRESS HRLI A,1 ;*** HO HUM ASSUME SECTION 1 HRRZM A,VMPPB0 ;SET SECTION-0 PER-PROCESS BEGIN ADDRESS MOVEM A,VMPPB1 ;SET SECTION-1 PER-PROCESS BEGIN ADDRESS MOVE A,[%VMPPE] ;GETTAB INDEX TO PUSHJ P,GETZ ;READ "PER-PROCESS" END (+1) ADDRESS HRLI A,1 ;*** HO HUM ASSUME SECTION 1 HRRZM A,VMPPE0 ;SET SECTION-0 PER-PROCESS END ADDRESS MOVEM A,VMPPE1 ;SET SECTION-1 PER-PROCESS END ADDRESS MOVE A,XDDBLD ;GET DDBLDB VALUE FROM THE SYSTEM PUSHJ P,GETZ ;SEE IF GETTAB IMPLEMENTED MOVEM A,VDDLDB ;REMEMBER THE VALUE PUSHJ P,GUPTIM ;GET SYSTEM UPTIME MOVEM A,UPTIME ;FOR INCREMENTAL DISPLAYS SETZM TTYTAB ;FIND ADDRESS OF TTYTAB MOVEI A,10 ;TABLE INDEX FOR GETTAB UUO PUSHJ P,GET0 ;TRY TO GET THE SPY ADDRESS JRST IJBDA1 ;LOOK UP INDIVIDUALLY JRST IJBDA1 ;PEEK NEEDED MOVEM N1,TTYTAB ;FOR LATER IJBDA1: PJOB A, MOVEM A,MYJOB ;GET JOB NUMBER SETOM TTYFLG ;SUPPOSE TOPS10 MOVE A,[%CNMNT] ;TRY TO GET MONITOR TYPE CALL GETZ ;GET IT OR A ZERO LDB A,[POINT 6,A,23];GET MONITOR TYPE CAIE A,1 ;TOPS-10? JRST IJBDA2 ;NO TRY UUO'S TLNE F,FL.PEK ;CLAIRVOYANT? JRST IJBDA3 ;YES THEN ALL SET IJBDA2: SETZM TTYFLG ;ASSUME DETACHED MOVE A,MYJOB ;GET LINE NUMBER OF MY JOB TRMNO. A, ;TRY TO GET INDEX JRST IJBDA3 ;I CANNOT HELP YOU AOS TTYFLG ;MAKE FLAG >0 MOVSI A,(SIXBIT /CTY/);GET INDEX OF CTY IONDX. A, ;AND GET ITS INDEX SETOM A ;ERROR NEVER MATCH MOVEM A,CTYNDX ;REMEBER CTY INDEX ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE IJBDA3: MOVE A,XOPPN ;GET GETTAB PARAMETER PUSHJ P,GETZ ;GO READ OPERATOR PPN SKIPE A ; SKIP IF ERROR MOVEM A,OPRPPN ;ELSE STORE AWAY HRROI A,.GTSTS ;MY STATUS PUSHJ P,GETA HRROI B,.GTPPN ;MY PPN GETTAB B, TLOA B,-1 ;NON DISK SYSTEM-FLAG AS UNGODLY CAMN B,OPRPPN ;SEE IF OPERATOR TXNN A,JS$LOG ;YES-LOGGED IN? SKIPA ;NOT GODLY TLO F,FL.GOD ;WE'RE GOD MOVEM B,ME MOVE A,XOPR PUSHJ P,GETA ;FIND OUT WHO'S OPERATOR MOVEM A,OPR MOVE A,XSPPN ;WHERE IS SYS PUSHJ P,GETZ SKIPE A MOVEM A,SYSPPN ;IF NONE, DONT STORE MOVX A,%LDOLD PUSHJ P,GETZ MOVEM A,OLDPPN MOVX A,%LDNEW PUSHJ P,GETZ MOVEM A,NEWPPN MOVE A,XLPPN ;GET GETTAB PARAMETER PUSHJ P,GETZ ;GO READ LOGIN PPN SKIPE A ; SKIP IF ERROR MOVEM A,LOGPPN ;ELSE STORE AWAY MOVX A,%CNDCH ;FETCH LDBDCH OFFSET FOR "T" DISPLAY PUSHJ P,GETZ ;GET IT OR ZERO SKIPN A MOVEI A,23 ;DEFAULT TO 702 MOVEM A,DCHOFF ;SAVE IT MOVX A,%CNLNP ;AOBJN POINTER TO LINTAB PUSHJ P,GETZ ;FETCH HRRZS A ;ISOLATE ADDRESS PUSHJ P,MPEEK ;GET LDB ADDRESS TLZ A,^-37 ;ISOLATE HLLZM A,LTBOFF ;SAVE AS LINTAB OFFSET ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE MOVSI B,LQTAB SETZ C, ;CLEAR WORK AREA QTLP: MOVEI A,.GTWSN ;GET Q TABLE FROM MONITOR HRL A,B PUSHJ P,GETZ JUMPE A,QTLP1 ;ZERO WHEN RUN OUT MOVEM A,QTAB(B) ;STORE QUEUE SIXBIT MOVE D,[POINT 12,QTAB(B)] ;GET BYTE-POINTER FOR QUEUE NAMES HRLI C,-3 ;GET AOBJN WORD FOR 3 ENTRIES / DATA ITEM QTLP2: ILDB A,D ;GET NEXT QUEUE ENTRY CAIN A,'SL' ;"SL" STATE? HRRZM C,SLQ ;YES, REMEMBER Q CODE CAIN A,'TI' ;"TI" STATE? HRRZM C,TIQ ;YES, REMEMBER Q CODE CAIN A,'EW' ;"EW" STATE? HRRZM C,EWQ ;YES, REMEMBER Q CODE AOBJN C,QTLP2 ;LOOP OVER 3 ENTRIES PER WORD AOBJN B,QTLP QTLP1: MOVE A,XSTATS PUSHJ P,GETZ MOVEM A,STATES JUMPE A,DNTSTO ;DONT OVERRIDE TCKSEC IF GETTAB UUO UNDEFINED MOVEI B,^D60 TLNE A,4000 MOVEI B,^D50 MOVEM B,TCKSEC TLNE A,100 ;NEW SCANNER SERVICE? TLO F,FL.SCN ;YES. REMEMBER IT. TLNN A,(6B9) ;SEE IF 5.03 JRST DNTSTO ;NO--SKIP PTY MOVE A,XPTYCN ;YES--GET PTY RANGE PUSHJ P,GETZ HLRZM A,PTYOFS ADD A,PTYOFS HRRZM A,PTYMAX DNTSTO: MOVX A,%SIQSR ;GETTAB ARGUMENT TO PUSHJ P,GETZ ;GET THE PID FOR [SYSTEM]QUASAR MOVEM A,QSRPID ;SAVE IT FOR QUEPRG MOVE A,XSEGPT PUSHJ P,GETA MOVEM A,SEGPTR HLRE B,A MOVNM B,SEGN HRRZM A,JOBN HRRZM A,GT.JOB ;FOR 60722 LOAD AND ONWARDS ADD A,SEGN HRRZM A,BOTH HRRZM A,GT.SEG ;FOR 60722 AND ONWARDS HRRZ B,.JBFF MOVEM B,ZERLOW SUBTTL CORE ALLOCATION MOVE D,[-NTABLE,,TABLE] GJB6: LDB A,PSPYTB ;SPYABLE TABLE (SPYTAB SET)? JUMPE A,GJB4 ;NO, INTERNAL SYSDPY TABLE LDB A,PTABLE ;YES, GET THE GETTAB TABLE INDEX TRZ F,FR.PDB ;PREVENT OLD DATA TO CLOBBER US TLNE F,FL.SPY ;CAN WE SPY PUSHJ P,GET0 ;TRY IT JRST GJB4 ;NO CANNOT SPY JRST GJB4 ;NO SPY THERE TRZE F,FR.PDB ;PDB DATA JRST GJB4 ;YES ALLOCATE CORE HRR B,(D) ;GET THE TABLE POINTER HRRM N1,(B) ;AND STORE THE SPY ADDRESS MOVEI B,1 ;GET SPY FLAG JRST GJB5 ;SKIP CORE STUUF GJB4: MOVE A,.JBFF ;START ALLOCATING CORE HRRZ B,(D) ;GET TABLE ADDRESS POINTER HRRM A,(B) ;STORE THE ADDRESS LDB B,PSIZE ;GET INDEX IN TABLE SIZE TABLE MOVE B,TSIZE(B) ;GET THE SIZE ADD B,A ;GET NEW FREE ADDRESS MOVEM B,.JBFF ;AND ACCOUNT IT CAMG B,.JBREL ;DO WE HAVE ENOUGH CORE JRST GJB7 ;YES ALL IS THERE CORE B, ;GET IT IF NOT THERE THEN JRST NOCOR ;THAT'S THE END GJB7: SETZ B, ;NO SPYING GJB5: DPB B,PSPY ;SET THE SPY FLAG AOBJN D,GJB6 ;PROCESS ALL TABLES HRRZ A,SGCNT ;ADDRESS OF SEGMENT COUNT ADD A,SEGN ;AND COMPUTE LAST ADDRESS FOR SOS A ;FOR A BLT MOVEM A,.SEGLS ;IN SET UP LOOP ; SETZM @ZERLOW ;CLEAR CORE ; MOVE A,ZERLOW ; HRLS A ; ADDI A,1 ;ABOVE 4 INSTRUCTIONS LEFT OVER??? OR NEXT INSTRUCTION LOST??? POPJ P, NOCOR: OUTSTR [ASCIZ /?Need More Core /] RESET LOGOUT GJBDAT: MOVN D,JOBN ;MINUS THE NUMBER OF JOBS HRLZS D ;-JOBN,,0 FOR AOBJN GJBL2: SKIPN B,TTYTAB ;CANN DATA BE SPIED? JRST GJBL5 ;NO GETTAB IT HLRZ C,D ;GET JOB NUMBER ADD B,D ;AND GET ADDRES MOVE B,(B) ;ELSE DIRECTLY FROM SPY SEGMENT JRST GJBL6 ;SKIP GETTAB STUFF GJBL5: MOVS B,D ;GET THE JOB NUMBER HRRI B,10 ;AND THE TABLE INDEX GETTAB B, ;AND GET THE TTYTAB ENTRY JRST GJB3 GJBL6: LDB J,TPCJOB ;IF OLD SCNSRF, GET JOB NO TLNE F,FL.SCN ;NEW SCNSER? MOVEI J,0(D) ;YES. DIFFERENT LAYOUT. GET JOB NO. SETZM @TTLDB TLZ B,-1 JUMPE B,GJBN2 MOVEI A,$DVNAM(B) ;GET TTY NAME PUSHJ P,MPEEK ;GET THE WORD MOVEM A,@TTLDB ;STORE IN TABLE MOVEI A,$DVIOS(B) ;GET TTY DEVIOS PUSHJ P,MPEEK ;GET THE WORD MOVEM A,@TTIOS ;STORE TLNN F,FL.SCN ;WHICH SCANNER LAYOUT? JRST GJBN2 ;OLD. MOVE A,VDDLDB ;GET OFFSET ADDI A,(B) ;AND GET ADDRESS PUSHJ P,MPEEK ;GET THE VALUE TRNE A,-1 ;ANY LDB LINK? JRST GJBN2 ;YES. OK TO TYPE NAME. HRLM A,@TTLDB GJBN2: AOBJN D,GJBL2 ;ALL JOBS GJB3: MOVE J,MYJOB MOVE A,@TTLDB CAME A,[SIXBIT /CTY/] CAMN A,OPR TLO F,FL.GOD MOVE D,[XWD -NTAB,TABPTR] INIT0: LDB B,PSPY ;SPYABLE? JUMPN B,INIT1 ;THEN FORGET LOOKUP LDB B,PSIZE ;GET THE TABLE SIZE MOVN B,TSIZE(B) ;VIA INDEX MOVSS B ;SWAP HALVES HRRZ C,(D) ;GET POINTER TO TABLE POINTER HRR B,(C) ;GET TABLE ADDRESS INIT2: LDB J,PTABLE ;GET THE TABLE VALUE INIT3: MOVE A,J ;GET GETTAB PARAMETER PUSHJ P,GETZ ;GET THE VALUE MOVEM A,(B) ;STORE THE RESULT ADD J,[1,,0] ;NEXT JOB AOBJN B,INIT3 ;FOR ALL TABLE MEMBERS INIT1: AOBJN D,INIT0 MOVE A,SGCNT HRLS A SETZM (A) ADDI A,1 BLT A,@.SEGLS POPJ P,0 ;END OF GET JOB DATA ROUTINE ;JBTSGN ENTRIES CONVERTED HERE GETSGN: MOVE A,@JBSGN ;GET THE ENTRY CNVSGN: SKIPE A ;ANYTHING THERE? TRNN F,FR.NSF ;SOMETHING, DO WE NEED TO CONVERT IT? POPJ P, ;RETURN MOVEI A,1(A) ;ADDRESS OF OLD JBTSGN DATA IN HIGH SEG BLOCK PJRST MPEEK4 ;FETCH OLD JBTSGN DATA AND RETURN ;PSEUDO OPCODES AREA INTERPRETED HERE PSEUDO: LDB T1,[POINT 9,(A),8] ;GET THE OPCODE CAILE T1,.OPMAX ;VALID?? AOJA A,PSEUDO ;SEE IF THIS HELPS PUSH P,A ;SAVE PSEUDO PC CALL @PSOPC(T1) ;DO THE OPERATION POP P,A ;RESTORE THE PC AOJA A,PSEUDO ;THERE IS ARETURN CODE PSOPC: .PRTXT ;PRINT TEXT .PRGTD ;PRINT GETTAB VALUE DECIMAL CRLF ;PRINT CRLF .STOP ;LAST INSTRUCTION PLD ;PRINT LEFT HALF IN DECIMAL PRD ;PRINT RIGHT HALF IN DECIMAL GTB ;DO GETTAB INTO CEL PFLS ;PRINT A FLOAT WITH SCALE FACTOR TAB ;PRINT A TAB PLPA ;PRINT LEFT PAREN PRPA ;PRINT RIGHT PAREN OPPER ;PRINT PERIOD OPPLS ;PRINT A PLUS PRDP ;PRINT RIGHT HALF DECIMAL PADDED .PRTXT: HRRZ M,(A) ;GET THE ADDRESS PJRST MSG ;RETURN VIA MSG .PRGTD: MOVE A,(A) ;GET GETTAB CODE TLZ A,777000 ;ZAP THE OPCODE CALL GETZ ;ZERO OR VALUE MOVE N,A ;GET THE VALUE PJRST DECPRT ;RETURN VIA DECIMAL PRINTER .STOP: POP P,A ;POP OFF RETURN POP P,A ;AND SAVED A JRST 1(A) ;BACK TO NORMAL CODE PLD: HLRZ N,@(A) ;GET THE VALUE PJRST DECPRT ;AND PRINT IT PRDP: AOS -1(P) ;POINT TO FACTOR MOVE N,@-1(P) ;LOAD THE FACTOR PRDP0: IDIVI N,^D10 ;GET REDUCED SCALE HRRZ N1,@(A) ;AND GET THE DATA CAMG N,N1 ;PADDING NEEDED JRST PRDP1 ;NO TYPE IT MOVEI CH,"0" ;GET A ZERO CALL TYO ;PRINT THE PADDING CHAR JRST PRDP0 ;TRY IT AGAIN PRDP1: HRRZ N,@(A) ;GET DATA JUMPN N,DECPRT ;PRINT NON ZERO VALUES ONLY POPJ P, PRD: HRRZ N,@(A) ;GET THE VALUE PJRST DECPRT ;AND PRINT IT GTB: MOVE A,(A) ;GET CODE TLZ A,777000 ;AFTER MASKING OPCODE CALL GETZ ;GET ZERO OR VALUE IN A! AOS T1,-1(P) ;POINT TO TARGET ADDRESS MOVEM A,@(T1) ;AND STORE THE VALUE RETURN PFLS: MOVE N,@(A) ;GET THE FLOATING NUMBER AOS -1(P) ;POINT TO SCALE FACTOR FLTR N1,@-1(P) ;GET THE SCALE FLOATING FMPR N,N1 ;AND GET THE PART WE WANT TO SEE FIXR N,N ;FIX THE RESULT IDIV N,@-1(P) ;NOW USE IT AS AN INTEGER PUSH P,N1 ;SAVE FRACTION CALL DECPRT ;PRINT IT DECIMAL MOVEI CH,"." ;TAKE DIVIDING CHARACTER CALL TYO ;AND PRINT THAT POP P,N ;GET FRACTION PJRST DECPRT ;AND PRINT THAT PLPA: MOVEI CH,"(" ;GET LEFT PAREN PJRST TYO ;AND PRINT IT OPPER: MOVEI CH,"." ;GET A PERIOD PJRST TYO ;AND PRINT IT OPPLS: MOVEI CH,"+" ;GET A PLUS PJRST TYO ;AND PRINT IT PRPA: MOVEI CH,")" ;GET RIGHT PAREN PJRST TYO ;AND TYPE IT SUBTTL SUBROUTINES FOR CHAR AND PAGE HANDLING THISIS: SET 1,XSIZE,1,YSIZE,0,TAB4 THISIZ: PUSHJ P,CONFIG ;TYPE SYSTEM NAME JRST THISI1 ;CONTINUE ;ENTER AT "THISIM" WITH HEADER TEXT IN "M" (TO REPLACE "THIS IS" STRING) THISIM: SET 1,XSIZE,1,YSIZE,0,TAB4 PUSHJ P,CONFIM ;SKIP THE "THIS IS" BLURB THISI1: PUSHJ P,SPACE ;SPACE OVER PUSHJ P,PDATIM ;TYPE CURRENT DATE AND TIME PUSHJ P,SPACE ;SPACE OVER PUSHJ P,GUPTIM ;GET SYSTEM UPTIME SUB A,UPTIME ;A:= INCREMENTAL UPTIME ADDM A,UPTIME ;KEEP TOTAL UP TO DATE TLNN F,FL.INC ;INCREMENTAL OR TOTAL? MOVE A,UPTIME ;TOTAL MOVEM A,UPTINC ;SAVE FOR LATER USE MOVEI M,[ASCIZ/(+) /] ;IN CASE INCREMENTAL TLNE F,FL.INC ;INCREMENTAL DISPLAY? PUSHJ P,MSG ;YES, TELL USER PUSHJ P,PUPTIM ;TYPE SYSTEM UPTIME PJRST CRLF IFE ******, <; ; ; DISPLAY SUBROUTINES FOR THE VT06 DISPLAY TERMINAL ; FINR: DPB CH,T1 ;STORE WITHOUT NEW BIT ; TLNE F,FL.2PT+FL.REF ;IN SECOND PART AND CAIE CH," " ;SPACE? TLZA F,FL.EOL ;NO. TLON F,FL.EOL ;YES. SEE IF FIRST OR LATER JRST FINR1 ;OUTPUT NON-SPACE OR FIRST SPACE POPJ P,0 ;MULT SPACE. DONT OUTPUT FINR1: MOVE A,COL ;DESTINATION IS IN COL, LINE MOVE B,LINE ; .. MOVEM C,COL ;STORE CURSOR, FOR GETCH MOVEM D,LINE IFE V.DISP-V.DVT6,< CAIE B,0(D) ;NEED TO MOVE VERTICALLY? PUSHJ P,FILLIT ;YES--ADD FILLERS >; END OF IFE V.DISP-V.DVT6 FINR4: MOVX CH,CDOWN ; CAIN B,0(D) ;ON RIGHT LINE NOW? JRST FINR2 ;YES. GO LOOK AT X DIRECTION CAIG B,0(D) ;NO. NEED TO GO UP OR DOWN? SOSA D,LINE ;UP AOSA D,LINE ;DOWN MOVX CH,CUP ;UP PUSHJ P,DPYOUT IFE V.DISP-V.DV5B,< PUSHJ P,FILLIT ;ADD FILLER AFTER CURSOR >; END OF IFE V.DISP-V.DV5B JRST FINR4 FINR2: CAIN A,0(C) ;ALREADY AT RIGHT PLACE? JRST FINR5 ;YES CAIG A,0(C) ;NO. LEFT OR RIGHT? JRST FINR8 ;LEFT PUSHJ P,GETCH ;GET OLD CHAR AT THIS POS TO RE-SEND MOVE CH,T2 AOS C,COL ;MOVE CURSOR PAST THIS CHAR FINR6: PUSHJ P,DPYOUT ;OUTPUT JRST FINR2 ;SEE IF TO DEST YET FINR5: PUSHJ P,GETCH ;GET NEW CHAR AT DEST MOVE CH,T2 ;TO RIGHT AC PUSHJ P,DPYOUT ;SEND IT CAIGE C,XSIZE-1 ;AND UNLESS UP AGAINST STOP, MOVEI C,1(C) ;COUNT THIS POSITION OF CURSOR POPJ P,0 ;RETURN FINR8: MOVEI T1,0(C) ;DEST COLUMN SUBI T1,0(A) ;DIST=DEST-CURRENT CAILE T1,0(A) ;DIST .LE. DEST FROM LEFT? JRST FINR7 ;NO. BETTER TO CR SOS C,COL ;MOVE CURSOR LEFT 1 PLACE MOVX CH,CLEFT ;PHYSICALLY, TOO JRST FINR6 ; .. FINR7: SETZB C,COL ;DO A CR MOVEI CH,15 JRST FINR6 >;END IFE ****** IFE V.DISP-V.DVT6,< ;SUBROUTINE TO POSITION CURSOR TO BOTTOM LEFT ;HOMEDN CODE CAN NOT BE USED BECAUSE OF HIGH-SPEED OPERATION ;THEREFORE, SIMULATE IT WITH 25 CURSOR DOWNS AND HOMDWN: OUTSTR [BYTE (7)CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,15,ERASE,CFILL,CFILL,CFILL,0] POPJ P, >; END OF IFE V.DISP-V.DVT6 IFE *, < ; ; DISPLAY SUBROUTINES FOR THE DIGITAL VT05 ; DPYX: CAILE C,4(XCUR) JRST DPYPOS MOVE A,D IMULI A,XSIZE ADDI A,-1(XCUR) IDIVI A,4 ADD A,BPTAB(B) DPYX1: ILDB CH,A PUSHJ P,DPYOUT ADDI XCUR,1 CAIE C,(XCUR) JRST DPYX1 POPJ P, DPYPOS: MOVEI XCUR,(C) MOVEI YCUR,(D) MOVEI CH,16 PUSHJ P,DPYOUT MOVEI CH," "(D) PUSHJ P,DPYOUT IFE V.DISP-V.DV5B,< PUSHJ P,FILLIT ;FILLERS FOR 2400 BAUD >; END OF IFE V.DISP-V.DV5B MOVEI CH," "(C) PJRST DPYOUT ;OUTPUT ADDRESS AND RETURN HOMDWN: IONEOU [16] ;START OF CURSOR POSITIONING IONEOU [<" "+YSIZE-2>] ;JUMP DOWN THE SCREEN IONEOU [CFILL] ;NEED IONEOU [CFILL] ; LOTS IONEOU [CFILL] ; OF IONEOU [CFILL] ; FILLERS IONEOU [" "] ;STAY AT LEFT MARGIN IONEOU [ERASE] ;CLEAR TO END OF SCREEN IONEOU [CFILL] ;SOME IONEOU [CFILL] ; MORE IONEOU [CFILL] ; FILL IONEOU [CFILL] ; CHARACTERS POPJ P, >; END OF IFE * IFE **,< ;SUBROUTINE TO CLEAR THE SCREEN CLEAR: PUSHJ P,HOME ;GET TO START OF SCREEN MOVX CH,ERASE ;COMMAND TO CLEAR THE SCREEN PJRST DPYOUT ;SEND TO TERMINAL ;SUBROUTINE TO HOME UP AND FILL HOME: MOVEI CH,HOMEUP ;ISSUE HOME PUSHJ P,DPYOUT ;TO DISPLAY ;THEN FALL INTO FILLERS >; END IFE ** IFE V.DISP-V.DV5A,< POPJ P, ;NO FILLERS ON VT05A >; END IFE V.DISP-V.DV5A IFE *,< ;SUBROUTINE TO EMIT ENOUGH FILLER CHARACTERS TO KEEP VT06 HAPPY ;EVEN AT 2400 BAUD IN 50 CYCLE COUNTRIES. ;CLOBBERS CH FILLIT: MOVEI CH,CFILL ;GET FILLER CHARACTER REPEAT 3, JRST DPYOUT >; END OF IFE * IFE ***,< ; ; DISPLAY SUBROUTINES FOR THE DIGITAL VT61 ; ESC61==33 IFN ,< ;NOT FOR VT50'S DPYX: CAILE C,4(XCUR) JRST DPYPOS MOVE A,D IMULI A,XSIZE ADDI A,-1(XCUR) IDIVI A,4 ADD A,BPTAB(B) DPYX1: ILDB CH,A PUSHJ P,DPYOUT ADDI XCUR,1 CAIE C,(XCUR) JRST DPYX1 POPJ P, DPYPOS: MOVEI XCUR,(C) MOVEI YCUR,(D) MOVEI CH,ESC61 ;ESC PUSHJ P,DPYOUT IFE V.DISP-V.ANSI,< ;VT100 POSITIONING MOVEI CH,"[" ; PUSHJ P,DPYOUT ; MOVEI N,1(D) ; PUSHJ P,DPYPRN ; MOVEI CH,";" ; PUSHJ P,DPYOUT ; MOVEI N,1(C) ; PUSHJ P,DPYPRN ; MOVEI CH,"H" ; >;END OF IFE V.DISP-V.ANSI IFN V.DISP-V.ANSI,< ; MOVEI CH,"Y" PUSHJ P,DPYOUT MOVEI CH," "(D) PUSHJ P,DPYOUT MOVEI CH," "(C) >;END OF IFN V.DISP-V.ANSI PJRST DPYOUT ;OUTPUT ADDRESS AND RETURN HOMDWN: IFE V.DISP-V.ANSI,< ; OUTSTR [BYTE(7)ESC61,"[","2","3","H",ESC61,"[","J",0] ; > ; IFN V.DISP-V.ANSI,< ; OUTSTR [BYTE (7)ESC61,"Y",<" "+YSIZE-2>," ",,<&177>,0] > ; POPJ P, > ;END OF NOT-VT50 CONDITIONAL IFE ,< ;VT50'S ARE STUPID HOMDWN: OUTSTR [BYTE (7)CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,,<&177>,0] POPJ P, > ;END OF VT50 CONDITIONAL HOME: MOVX CH,HOMEUP ;POSITION-TO-HOME COMMAND JRST DPYOUT ;SUBROUTINE TO CLEAR THE SCREEN CLEAR: PUSHJ P,HOME ;POSITION TO START OF SCREEN MOVX CH,ERASE ;CLEAR-TO-EOS COMMAND PJRST DPYOUT IFE V.DISP-V.ANSI,< ; RVIDEO: MOVE CH,[BYTE (9) "m","7","[",.CHESC] ; TRCE F,FR.RVD ;IF CLEARING, THEN TLZ CH,7 ;CHANGE THAT "7" TO A "0" PUSHJ P,DPYOUT ; JRST FRCOUT ; >;END OF IFE V.DISP-V.ANSI IFE V.DISP-V.DV61,< RVIDEO: MOVEI CH,ESC61 PUSHJ P,DPYOUT MOVEI CH,"O" PUSHJ P,DPYOUT MOVEI CH,"J" TRCE F,FR.RVD MOVEI CH,"j" PUSHJ P,DPYOUT JRST FRCOUT ALARM: MOVEI CH,ESC61 PUSHJ P,DPYOUT MOVEI CH,"O" PUSHJ P,DPYOUT MOVEI CH,"G" TRCE F,FR.ALR MOVEI CH,"g" PUSHJ P,DPYOUT JRST FRCOUT > ; END OF IFE V.DISP-V.DV61 >; END OF IFE *** IFE V.DISP-V.DHZL, < ; ; DISPLAY SUBROUTINES FOR THE HAZELTINE 2000 ; DPYX: CAILE C,4(XCUR) JRST DPYPOS MOVE A,D IMULI A,XSIZE ADDI A,-1(XCUR) IDIVI A,4 ADD A,BPTAB(B) DPYX1: ILDB CH,A PUSHJ P,DPYOUT ADDI XCUR,1 CAIE C,(XCUR) JRST DPYX1 POPJ P, DPYPOS: PUSHJ P,CURSOR MOVEI CH,(C) PUSHJ P,DPYOUT MOVEI CH,(D) JRST DPYOUT CLEAR: MOVEI M,[BYTE (7) 176,34,177,177,177,0,0,0,0,0] MOVE A,[XWD 040040,040040] MOVEM A,DBUF MOVE A,[XWD DBUF,DBUF+1] BLT A,DBFEND JRST DPYCHR CURSOR: MOVEI XCUR,(C) MOVEI YCUR,(D) MOVEI M,[BYTE (7) 176,21,0,0,0] JRST DPYCHR HOME: MOVEI M,[BYTE (7) 176,22,0,0,0] DPYCHR: HRLI M,() DPYCH1: ILDB CH,M JUMPE CH,CPOPJ PUSHJ P,DPYOUT JRST DPYCH1 HOMDWN: OUTSTR [BYTE (7)176,34,177,177,177,176,22,0] POPJ P, >; END OF IFE V.DISP-V.DHZL IFE V.DISP-V.DDLT, < ; ; DISPLAY SUBROUTINES FOR THE DELTA DATA TELTERM ; DPYSPC: MOVE B,BP ;COPY BUFFER BYTE POINTER MOVEI A,XSIZE ;GET # OF CHARS IN A LINE SUBI A,1(C) ;GET # OF CHARS REMAINING IN THIS ONE JUMPLE A,CPOPJ ; NONE, RETURN SETZB M,T1 ;CLEAR CHARACTER COUNTERS DPYSP1: ILDB CH,B ;GET NEXT CHARACTER FROM BUFFER CAIN CH,400!" " ;TEST FOR BLANK CHANGED TO BLANK JRST DPYSP3 ; YES, JUMP TO NEXT CHAR TRNE CH,400 ;TEST FOR SOMETHING CHANGED TO BLANK MOVEI CH,200!" " ; YES, CONVERT TO THAT FORMAT CAIN CH,200!" " ;TEST FOR MODIFIED BLANK AOS M ; YES, COUNT IT ANDI CH,177 ;MASK OFF FOR 7 BITS ONLY CAIE CH," " ;TEST FOR A SPACE AOS T1 ; NO, COUNT NON-BLANKS DPYSP3: SOJG A,DPYSP1 ;DECR COUNT & REPEAT TLNE F,FL.REF ;TEST FOR REFRESHING NOW JUMPN T1,CPOPJ ; YES, THEN DON'T CLEAR IF CHARS REMAIN SUBI M,(T1) ;GET # OF MODIFIED BLANKS - # OF OTHER CAIG M,(T1) ;TEST FOR MORE BLANKS THAN OTHER (YET) POPJ P, ; NO, RETURN MOVEI A,0 ;CLEAR REGISTER AS A FLAG CAIN D,YSIZE-1 ;TEST FOR LAST ROW ON CRT TLNN F,FL.REF ;TEST FOR FULL REFRESH AOBJN J,DPYSP2 ; NO TO EITHER, UPDATE & SKIP POPJ P, ; YES TO BOTH, RETURN DPYSP2: SKIPN A ;TEST FOR POINTER ALREADY SAVED MOVE T1,BP ; ELSE SAVE BYTE POINTER ILDB CH,BP ;GET CHARACTER FROM BUFFER TRNE CH,400 ;TEST FOR CHANGED TO A BLANK MOVEI CH," " ; YES, GET A BLANK ANDI CH,177 ; & CLEAR MODIFY BIT CAIE CH," " ;TEST FOR BLANK TRO CH,200 ; NO, MUST OUTPUT THIS TIME DPB CH,BP ;STORE PROPER CHARACTER BACK TRNE CH,200 ;TEST FOR NON-BLANK SKIPE A ;TEST FOR FIRST NON-BLANK JRST DPYSP4 ; NO, JUMP MOVE A,J ;SAVE POSITION POINTER SUB A,[1,,1] ;SUBTRACT ONE FROM EACH HALF! MOVE M,T1 ; & SAVE BYTE POINTER DPYSP4: CAME BP,B ;TEST FOR CAUGHT UP AOBJN J,DPYSP2 ; NO, UPDATE POSITION & LOOP MOVEI T2,23 ;GET A CLEAR LINE CHARACTER JUMPE A,CPOPJ ;TEST FOR BLANK LINE MOVE J,A ; NO, POINT AT NEXT CHARACTER TO OUTPUT MOVE BP,M ; DITTO POPJ P, ;RETURN NOW DPYX: ;ENTRY FOR X-POSITION CHANGING ONLY DPYPOS: MOVEI B,(D) ;GET DESIRED Y POSITION SUBI B,(YCUR) ; MINUS CURRENT Y POSITION MOVMS B ;GET DELTA-Y = ABS(DESIRED-CURRENT) MOVEI A,(C) ;GET DESIRED COLUMN ADDI A,(B) ; PLUS DELTA-Y CAIGE A,4 ;TEST FOR .LT. LIMIT JRST DPYCAR ; YES, GO DO +INCREMENTAL MOVEI A,(C) ;GET DESIRED COLUMN ADDI A,(D) ; PLUS DESIRED ROW CAIGE A,4 ;TEST FOR .LT. LIMIT JRST DPYHOM ; YES, GO DO +INCREMENTAL MOVEI A,(C) ;GET DESIRED X POSITION SUBI A,(XCUR) ; MINUS CURRENT X POSITION MOVMS A ;GET DELTA-X = ABS(DESIRED-CURRENT) ADDI A,(B) ;ADD DELTA-X & DELTA-Y CAIGE A,5 ;TEST FOR .LT. LIMIT JRST DPYINC ; YES, GO DO INCRMENTAL SHIFT CAMLE C,LASTCR(D) ;TEST FOR FORMATTING POSITION RQST JRST DPYFOR ; YES, JUMP MOVEI XCUR,(C) MOVEI YCUR,(D) MOVEI M,[BYTE (7) 20, 16, 0,0,0] PUSHJ P,DPYCHR MOVEI CH,(C) PUSHJ P,DPYOUT MOVEI CH,(D) PUSHJ P,DPYOUT ;OUTPUT Y POSITION POPJ P, ;RETURN TO CALLER DPYCAR: SETZ XCUR, ;CLEAR CURRENT X POSITION MOVEI CH,15 ;GET A CHARACTER JRST DPYCOM ;GO TO COMMON ROUTINE DPYHOM: SETZB XCUR,YCUR ;CLEAR CURRENT X & Y POSITIONS MOVEI CH,24 ;GET A CHARACTER DPYCOM: PUSHJ P,DPYOUT ;OUTPUT CONTROL CHARACTER PUSHJ P,DPYFIL ;PUT OUT A FILL CHARACTER ADDI A,2 ; & REQUEST TWO MORE LATER DPYINC: MOVEI CH,13 ;ASSUME DOWN CAIN D,(YCUR) ;TEST FOR CORRECT LINE JRST DPYHOR ; YES, JUMP CAIG D,(YCUR) ;TEST FOR DIRECTION SOSA YCUR ; UP, DECR CURRENT Y & SKIP AOSA YCUR ; DOWN, INCR CURRENT Y & SKIP MOVEI CH,32 ;CHANGE TO UPWARD CHARACTER PUSHJ P,DPYOUT ;OUTPUT VERTICAL CONTROL CHARACTER JRST DPYINC ;REPEAT AS NECESSARY DPYHOR: MOVEI CH,10 ;ASSUME LEFT CAIN C,(XCUR) ;TEST FOR CORRECT COLUMN POPJ P, ; YES, RETURN CAIG C,(XCUR) ;TEST FOR DIRECTION SOJA XCUR,DPYPUT ; LEFT, DECR CURRENT X & JUMP AOS XCUR ; RIGHT, INCR CURRENT X MOVEI CH,31 ;CHANGE FOR RIGHTWARD DIRECTION CAMLE XCUR,LASTCR(YCUR) ;TEST FOR UNFORMATTED AREA MOVEI CH," " ; YES, PUT OUT A GOOD OLD BLANK DPYPUT: PUSHJ P,DPYOUT ;OUTPUT THE CHARACTER JRST DPYHOR ;REPEAT AS NECESSARY DPYFOR: PUSH P,C ;SAVE DESIRED X POSITION MOVE C,LASTCR(D) ;GET LAST CHARACTER WRITTEN ON SAME LINE PUSHJ P,DPYPOS ; & GO POSITION THERE NOW MOVEI A,(XCUR) ;SAVE CURRENT POSITION OF THE LINE POP P,XCUR ;RESTORE DESIRED AS CURRENT POSITION NOW MOVEI C,(XCUR) ; DITTO CAMLE XCUR,LASTCR(YCUR) ;TEST FOR EXCEEDING CURRENT POSITION MOVEM XCUR,LASTCR(YCUR) ; YES, SHOW AS LAST CHARACTER WRITTEN SUBM XCUR,A ;GET NUMBER OF CHARACTERS TO SEND DPYBLK: JUMPLE A,CPOPJ ; NONE, RETURN MOVEI CH," " ;GET A BLANK PUSHJ P,DPYOUT ; & OUTPUT IT SOJA A,DPYBLK ;DECR COUNT & REPEAT HOME: MOVEI CH,24 ;GET A CONTROL CHARACTER PJRST DPYOUT ; & OUTPUT IT CLEAR: MOVEI M,[BYTE (7) 20, 22, 20, 05, 0] SETZM LASTCR ;CLEAR LAST-CHARACTER POSITION ARRAY MOVE A,[XWD LASTCR,LASTCR+1] ; DITTO BLT A,LASTCR+YSIZE-1 ; DITTO DPYCHR: HRLI M,() DPYCH1: ILDB CH,M JUMPE CH,CPOPJ PUSHJ P,DPYOUT JRST DPYCH1 DPYFIL: MOVEI CH,177 ;GET A NICE FILL CHARACTER PJRST DPYOUT ;GO OUTPUT IT & RETURN HOMDWN: OUTSTR [BYTE (7)20,22,20,05,24,0] POPJ P, >; END OF IFE V.DISP-V.DHZL ;MPEEK -- READ WORD FROM MONITOR EXEC VIRTUAL ADDRESS SPACE ;CALL IS: ; ; MOVX A, ; MOVX J, ; PUSHJ P,MPEEK ; RETURN ; ;WHERE IS THE EXEC VIRTUAL ADDRESS TO BE READ. IF IS IN THE ;"PER-PROCESS" RANGE THEN A JOBPEK WILL BE USED TO READ THE SPECIFIED ;JOB'S PER-PROCESS AREA. IF THE JOB IS SWAPPED, OR CURRENTLY RUNNING ON ;ANOTHER CPU (STUCK IN THE OTHER CPU'S CACHE) THEN 0 IS RETURNED. ; ;THE MONITOR WORD IS RETURNED IN AC A. ; ;USES N, N1 MPEEK: CAML A,VMPPB0 ;IS DESIRED ADDRESS IN SECTION-0 CAML A,VMPPE0 ; PER-PROCESS ADDRESS SPACE? CAML A,VMPPB1 ;IS DESIRED ADDRESS IS SECTION-1 CAML A,VMPPE1 ; PER-PROCESS ADDRESS SPACE? JRST MPEEK4 ;NO, TRY PEEK/SPY HRLZ N,J ;YES, GET JOB NUMBER TXO N,JK.EVA!JK.AIO+1 ;READ ONE WORD FROM PER PROCESS AREA HRLZ N1,A ;ADDRESS TO BE READ HRRI N1,A ;WHERE TO READ CONTENTS INTO MOVEI A,N ;A := ADDRESS OF ARG BLOCK TO JOBPEK A, ;ASK MONITOR FOR FUNNY ADDRESS SETZ A, ;CAN'T (SWAPPED OR NOT PRIVILEGED) POPJ P, ;RETURN WITH WORD IN A MPEEK4: TLNN F,FL.SPY ;CAN WE SPY? JRST MPEEK7 ;CAN'T SPY, TRY PEEK TLNN A,7776 ;IS ADDRESS PAST SECTION 1 (NOT SPYABLE)? ANDI A,777777 ;ADDR IN SECTION 0/1, MAP TO SECTION 0 CAMG A,SPYSIZ ;CAN WE SPY THE DATA? MPEEK6: SKIPA A,400000(A) ;SPY THE INFORMATION (FASTER) MPEEK7: PEEK A, ;PEEK THE INFORMATION (SLOWER) POPJ P,0 ;SUB TO GET MONITOR WORD - RETURN 0 IN A IF CANNOT GET ; AND PRINT "?" BECAUSE UNEXPECTED ERROR GETA: PUSHJ P,GET TDZA A,A ;RETURN 0 POPJ P, ;OK MOVEI CH,"?" ;PRINT QUESTION MARK PJRST TYO ;PRINT ;SUBROUTINE TO GET MONITOR WORD - RETURN 0 IN A IF CANNOT ; NOT AN ERROR IF NOT THERE - USE 0 AS VALUE GETZ: PUSHJ P,GET0 ;DECIPHER WORD ADDRESS JRST GETZ0 ;NO SUCH ENTITY, RETURN 0 JRST GETZ1 ;CAN'T SPY/ETC, JUST TRY GETTAB MOVE A,0(N1) ;SPY THE WORD DIRECTLY POPJ P, ;ALWAYS RETURN GETZ1: PUSHJ P,GETPEK ;TRY FOR THE WORD THE HARD WAY GETZ0: SETZ A, ;UNABLE TO GET WORD, RETURN 0 POPJ P, ;RETURN ALWAYS ;SUBROUTINE TO GET MONITOR WORD - SKIP IF CAN, NO SKIP IF CANNOT GET: PUSHJ P,GET0 ;SEE WHERE THE WORD IS POPJ P, ;WORD DOES NOT EXIST PJRST GETPEK ;PEEK FOR IT MOVE A,0(N1) ;GET THE WORD BY SPYING JRST CPOPJ1 ;WIN RETURN ;GET 4 CONSECUTIVE MONITOR WORDS GET4: PUSHJ P,GET0 ;SEE WHERE WORD IS POPJ P, ;WORD DOES NOT EXIST PJRST GETPK4 ;GO GETTAB THEM DMOVE A,0(N1) ;GOT THE WORD(S) DMOVE C,2(N1) ;GOT THE OTHER WORDS TOO JRST CPOPJ1 ;SUCCESSFUL RETURN ;DO THE WORK FOR THE GET ROUTINES GET0: TLNN F,FL.SPY ;SPYING?? PJRST CPOPJ1 ;NO, JUST GETTAB THE VALUE LDB BP,[POINT 9,GTTSLF,8] CAIGE BP,0(A) ;TABLE OK? POPJ P, ;NO THEN IT DOES NOT EXIST HRRZ BP,GTTSLF ;YES. GET THE DESIRED TABLE BASE WORD ADDI BP,(A) ;OFFSET TO DESIRED TABLE ENTRY MOVE BP,400000(BP) ;FETCH GETTAB TABLE POINTER FROM MONITOR HRRZ CH,BP ;EXTRACT THE GETTAB TABLE BASE ADDRESS JUMPE CH,CPOPJ ;[612] RETURN IF NO TABLE CAMLE CH,SPYSIZ ;IS IT WITHIN SPY'ABLE MEMORY? JRST CPOPJ1 ;NO, JUST GETTAB IT THEN HLRZ N1,A ;GET DESIRED ITEM IN TABLE SKIPGE A ;WANT SELF? MOVE N1,MYJOB ;YES. LDB CH,[POINT 3,BP,11] ;GET ENTRY TYPE SKIPL CH,LENTAB(CH) ;GET TABLE LENGTH JRST GETSPR ;REGULAR (E.G., JOB/SEGMENT) TABLE AOJE CH,GETPDB ;PDB DATA LDB CH,[POINT 9,BP,8] ;GET TABLE LENGTH GETSPR: CAIGE CH,0(N1) ;IS ITEM WITHIN TABLE LIMITS? POPJ P, ;DOES NOT EXIST TLNN BP,(17B17) ;SEE IF INDEXED GETSPP: MOVEI N1,0 ;NO--KILL INDEX ADDI N1,400000(BP) ;COMPUTE ADDRESS TO GET WORD CPOPJ2: AOS 0(P) ;WIN RETURN JRST CPOPJ1 ;DOUBLE SKIP GETPDB: TRO F,FR.PDB ;SET A FLAG FOR GETBLK CODE SKIPE PDBPTR ;FAIL IF NO PDB POINTER CAML N1,JOBN ;SKIP IF LEGAL JOB NUMBER JRST CPOPJ1 ;TRY PEEK BETTER POPJ ?? SKIPGE PDBPTR ;SEE IF SWAPPING PDBS JRST [MOVNS N1 ;YES--GET -N ADD N1,PDBPTR;INCLUDE OFFSET MOVE N1,(N1) ;GET JBTADR(-JOB) TRNN N1,-1 ;SEE IF IN CORE JRST CPOPJ1 ;NO--GO LET MONITOR TRY JRST GETSPP] ;YES--SPY ON IT ADD BP,@PDBPTR ;ADD ADDR OF PDB FOR THIS JOB JRST GETSPP ;GET ENTRY FROM PDB ;HERE IF SPY FAILED - TRY GETTAB UUO GETPEK: GETTAB A, POPJ P, ;ERROR GETTAB NOT THERE JRST CPOPJ1 ;OK, RETURN GETPK4: MOVE B,A ;ADDRESS OF WORD PLUS ONE ADD B,[1,,0] ;PLUS ONE DMOVE C,A ;PLUS TWO MORE WORDS DADD C,[EXP <2,,0>,<2,,0>] ;LAST TWO WORD "ADDRESS"ES GETTAB A, ;TRY FOR WORD 1 POPJ P, ;NOPE GETTAB B, ;TRY FOR WORD 2 POPJ P, ;NOPE GETTAB C, ;TRY FOR WORD 3 POPJ P, ;NOPE GETTAB D, ;TRY FOR WORD 4 POPJ P, ;NOPE JRST CPOPJ1 ;GOT ALL FOUR! STRWHO: MOVE A,[SIXBIT /**,**/] SIXBP: MOVE BP,[POINT 6,A] SIXBP1: ILDB CH,BP JUMPE CH,CPOPJ ADDI CH,40 PUSHJ P,TYO TLNE BP,770000 JRST SIXBP1 CPOPJ: POPJ P,0 SIXB6: MOVE BP,[POINT 6,A] SIXB61: ILDB CH,BP ADDI CH,40 PUSHJ P,TYO TLNE BP,770000 JRST SIXB61 POPJ P, CRLF: MOVEI M,[ASCIZ / /] MSG: TLNN M,777700 ;UNLESS ALREADY HAVE BYTE POINTER HRLI M,() ;MAKE ADDRESS INTO BYTE POINTER MSG1: ILDB CH,M JUMPE CH,CPOPJ PUSHJ P,TYO JRST MSG1 COLON: MOVEI CH,":" JRST TYO COMMA: MOVEI CH,"," JRST TYO DOT: MOVEI CH,"." ;A DOT OR PERIOD CHARACTER PJRST TYO ;TO BE TYPED OUT. PERCNT: MOVEI CH,"%" ;A PERCENT SIGN PJRST TYO ;TO BE TYPED OUT. ;PRINT PERCENT PRPCNT: MOVEM N,TEMP1 PUSHJ P,MSGDEC MOVSI A,(SIXBIT ./.) MOVE N,TEMP PUSHJ P,SIXDEC MOVEI M,[ASCIZ / = /] MOVE N,TEMP1 PUSHJ P,CMPCNT MOVEI CH,"%" ;PRINT PERCENT PJRST TYO EMSG: TLNN M,777700 ;ADDRESS OR BYTE POINTER HRLI M,(POINT 7,) ;ADDRESS, MAKE INTO BYTE POINTER EMSG1: ILDB CH,M ;NEXT CHARACTER JUMPE CH,CPOPJ ;NUL ENDS STRING CAIE CH,.CHLFD ;NEW LINE YET? JRST EMSG2 ;NO, REGULAR CHARACTER AOS CLINE ;[611] BUMP CURRENT LINE COUNTER SKIPE .FRAJR ;[611] SKIP OVERHEAD IF NO AUTO ROLL PUSHJ P,SETVIS ;[611] DETERMINE VISIBILITY SOSL EATCNT ;DECREMENT LINES TO BE EATEN JRST EMSG1 ;NEED TO EAT STILL MORE EMSG2: SKIPG EATCNT ;ON SCREEN YET? PUSHJ P,TYO ;YES, LIST CHARACTER JRST EMSG1 ;LOOP BACK FOR MORE CHKDON: SKIPGE N,LINE ;GET LINES FILLED WITH DATA JRST CPOPJ1 ;LINE .LT. 0 MEANS FULL SCREEN CAIGE N, ;IF LESS THAN 4 LINES SKIPG FIRJOB ;AND WE ARE "+"'ED CAIA ;NO SOS (P) ;THEN FLAG TO REDO THE SCREEN IMMED. SUBI N,YSIZE ;SEE HOW MANY LINES LEFT ON SCREEN JUMPGE N,CPOPJ1 ;IF SCREEN FULL JUST EXIT OK ADDB N,FIRJOB ;SCREEN HAS EMPTY LINES, "-" IT JUMPGE N,CPOPJ1 ;AND LET NEXT CYCLE SKIPGE IT DOWN SETZM FIRJOB ;BUT NEVER LET IT GO NEGATIVE JRST CPOPJ1 ;RETURN APPROPRIATELY ;PRINTERS OF PAGE ORIENTED DATA KAYPAG: MOVEI CH,"P" ;ASSUME PAGING TRNN F,FR.KIP ;SO LOOK TO PROCESSOR MOVEI CH,"K" ;AND CHANGE TO KAYS IF KA10 PJRST TYO ;EXIT VIA PRINTER ;PRINT PAGING DATA FOR THE CURRENT JOB CONTAINED IN J ;BEFORE SWITCHING TO INLINE CODE THE FOLLOWING DATA IS COLLECTED ;1 GETAB1 MAX VIRTUAL AND PHYSICAL LIMITS ;2 GETAB2 INTEGER PAGING RATE FRACTION,,FRACTIONAL PGR DATA PGDATA: TRNE F,FR.VMM ;HAS THE SYSTEM ANY VIRTUES JRST PGDATV ;(YES) DO THINGS DIFFERENT MOVS N,JOBPHY ;GET LOSEG PHYSICAL SIZE ADD N,JOBPHY ;ADD HISEG PHYSICAL SIZE ADD N,JOBPPG ;ADD MONITOR OVERHEAD (PER-PROCESS) SIZE ANDI N,777777 ;STRIP OFF GARBAGE CALL DECPRT ;PRINT IN DECIMAL P PJRST TAB ;RETURN AFTER THE TAB PGDATV: HRL A,J ;GET JOB NUMBER HRRI A,.GTMVL ;GET MAXIMUM VALUES FOR JOB CALL GETZ ;NOW OR ZER AND A,[377777,,377777] ;ZAP NON CORE BITS MOVEM A,GETAB1 ;REMEMBER MAX VALUE HRL A,J ;GET THE JOBNUMBER HRRI A,.GTCVL ;GET GUIDELINE CALL GETZ ;AND TAKE THAT AS PHYS AND A,[377777,,377777] ;ZAP NON CORE BITS HRRM A,GETAB1 ;AND STORE IT FOR PRINTING SETZM GETAB2 ;ZAP PAGING RATE COMPLETELY HLRZ N1,@JBVRT ;GET PAGING RATE JUMPE N1,PGDAT0 ;CERTAINLY NOT PAGING CALL CMPPGR ;COMPUTE PAGING RATE PGDAT0: .INL ;START INLINE PSEUDO CODE .PLD JOBVIR ;PRINT LOWSEG VIRTUAL SIZE .PLS ;SEPARATE WITH A PLUS .PRD JOBVIR ;PRINT HISEG VIRTUAL SIZE .LPA ;PRINT A LEFT PAREN .PLD GETAB1 ;PRINT MAXIMUM VIRTUAL .RPA ;AND A RIGHT PAREN .TAB ;SPACE 2 PRINTS .PLD JOBPHY ;PRINT LOWSEG PHYSICAL SIZE .PLS ;SEPARATE WITH A PLUS SIGN .PRD JOBPHY ;PRINT HIGHSEG PHYSICAL SIZE .PLS ;SEPARATE WITH A PLUS .PRD JOBPPG ;PRINT MONITOR PER-PROCESS PAGES .LPA ;( .PRD GETAB1 ;MAX PHYS .RPA ;) .TAB .PLD GETAB2 ;PRINT FRACTION .PER ;PERIOD .PRDP GETAB2,^D100 ;FACTOR 100 .END ;END OF PSEUDO CODE PJRST TAB ;EXIT AFTER PRINTING A TAB ;CMPPGR COMPUTES THE PAGING RATE PER SECOND THE INVERSE IS PASSED ;IN N1 THE RESULT IS RETURNED IN GETAB2, ;THE LEFTHALF IS THE INTEGER PART ;THE RIGHT HALF THE FRACTION CMPPGR: PUSH P,N1 ;SAVE THE INTERVAL MOVEI N,^D100000 ;TO MAKE A FRACTION IDIVI N,(N1) ;GET REMAINDER IN N1 HRLM N,GETAB2 ;STORE INTEGER PART MOVE N,N1 ;GET THE FARCTION IMULI N,^D100 ;FACTOR 100 POP P,N1 ;GET THE INTERVAL BACK IDIVI N,(N1) ;GET FRACTION HRRM N,GETAB2 ;AND STORE IT FOR PRINTING RETURN PAGSYS: PUSHJ P,THISIZ ;GIVE HEADER MOVE A,[11,,113] ;GET USER LIMIT CALL GETZ ;GET THE VALUE MOVEM A,N1 ;GET VALUE FOR CONVERSION CALL CMPPGR ;PRINT PAGING RATE ;GETAB1 CONTAINS SYSTEM PAGING RATE LIMIT AS AN INTEGER ;GETAB2 CONTAINS USER PGR LIMIT AS XWD FORMAT .INL ;START OF INLINE CODE .TXT .GTB 5,113,GETAB .PRD GETAB ;PRINT MAX VALUE .TXT <,USED=> .PGTBD 4,113 .TXT <) PGR.USER=> .PLD GETAB2 ;PRINT INTEGER PART .PER ;PERIOD .PRD GETAB2 ;AND FRACTION .TXT < PFC:NIW=> .GTB 13,113,GETAB ;PAGE FAULT COUNT .PLD GETAB .TXT < IW=> .PRD GETAB .NWLIN .END RETURN ;RETURN TO CALLER ;CPCPT -- ROUTINE TO PRINT N IN HUNDREDTHS OF PERCENT ;CALL IS: ; ; MOVX N, ; PUSHJ P,CPCPT ; RETURN ; ;THE PERCENT IS ALWAYS PRINTED AS THREE CHARACTERS: ; 1) 100 ; 2) NN. ; 3) N.M ; 4) .NN CPCPT: CAIG N,^D999 ;NN% FORM? JRST CPCPT2 ;NO IDIVI N,^D100 ;YES, REDUCE TO JUST PERCENT CAILE N,^D99 ;100%? PJRST DECPRT ;YES, THAT'S OUR THREE DIGITS PUSHJ P,DECPRT ;NO, PRINT TWO DIGITS MOVEI CH,"." ;FOLLOW BY PERCENT INDICATOR PJRST TYO ;AND CAP IT OFF CPCPT2: CAIG N,^D99 ;N.N FORM? JRST CPCPT4 ;NO IDIVI N,^D100 ;GET PERCENTAGE DIGIT MOVEI CH,"0"(N) ;IN ASCII PUSHJ P,TYO ;AND PRINT IT OUT MOVEI CH,"." ;SEPARATING DOT PUSHJ P,TYO ;PRINT IT ALSO MOVE N,N1 ;GET BACK THE HUNDREDTHS IDIVI N,^D10 ;TENTHS OF PERCENT MOVEI CH,"0"(N) ;IN ASCII PJRST TYO ;AND PRINT IT OUT CPCPT4: MOVEI CH,"." ;LEADING DECIMAL PUSHJ P,TYO ;INDICATE HUNDREDTHS MOVEI CH,"0" ;IN CASE NEED LEADING "0" CAIG N,^D9 ;LESS THAN .10 PERCENT? PUSHJ P,TYO ;YES, NEED LEADING "0" PJRST DECPRT ;TYPE HUNDREDTHS OF PERCENT ;SUBROUTINE TO DIVIDE A NUMBER IN AC N BY TEMP ;ROUND UP RESULT IF NECESSARY AND PRINT MESSAGE FOLLOWED BY N (%) ;CALL MOVEM AC,TEMP ; MOVE N,NUMBER TO BE DIVIDED ; MOVEI M,[ASCIZ /TEXT/] ; PUSHJ P,DIVRPT ; ALWAYS RETURN ;ACS N1,N,M,CH & R ARE DESTROYED CMPCNA: MOVE N,A CMPCNT: IMULI N,^D100 IDIV N,TEMP LSH N1,1 CAML N1,TEMP ADDI N,1 PJRST MSGDEC ;GO PRINT MESSAGE AND DECIMAL CALCNA: MOVE N,A CALCNT: IMULI N,^D100 IDIV N,TEMP LSH N1,1 CAML N1,TEMP ADDI N,1 POPJ P, ;CMPDNA -- PRINT PERCENTAGE.HUNDREDTHS (N/TEMP) ;CALL IS: ; ; TEMP/ BASE FOR PERCENTAGE ; MOVX A,VALUE ; PUSHJ P,CMPDNA ; RETURN ; ;USES A-D, N, N1 CMPDNA: IMULI A,^D100*^D100 ;TO GET HUNDREDTHS IDIV A,TEMP ;A := PERCENT * ^D100 IDIVI A,^D100 ;A := PERCENT MOVE N,A ;POSITION FOR DECZ2 PUSHJ P,DECZ2 ;PRINT TWO DIGIT PERCENTAGE PUSHJ P,DOT ;FINISH WITH A "." MOVE N,B ;POSITION FOR DECZ2 PJRST DECZ2 ;TYPE TWO DIGIT HUNDREDTHS MSPDEC: AOJE J,MSGDEC ;IF FIRST SKIP SPACE PUSHJ P,SPACE ;OTHERWISE NEED SPACE SEPARATOR MSGDEC: PUSHJ P,MSG JRST DECPRT SIXDEC: PUSHJ P,SIXBP JRST DECPRT MSPOCT: AOJE J,MSGOCT ;IF FIRST NO SEPARATOR PUSHJ P,SPACE ;OTHERWISE NEED SEPARATOR MSGOCT: PUSHJ P,MSG ;PRINT LEADING TEXT PJRST OCTPRT ;AND TRAILING OCTAL NUMBER MSPDHM: AOJE J,MSGDHM ;IF FIRST SKIP SPACE PUSHJ P,SPACE ;OTHERWISE NEED A SPACE MSGDHM: PUSHJ P,MSG ;PRINT THE MESSAGE TEXT JRST DHMPRT ;PRINT [[DAYS:]HOURS:]MINUTES ;SUBROUTINE TO PRINT JIFFY TIME TO NEAREST TENTH OF SECONDS ;CALL: MOVE N,TIME IN JIFFIES ; PUSHJ P,PNTSEC PNTSEC: MOVE T1,TCKSEC ;NO. OF JIFFIES IN 1 SECOND MOVEM T1,TEMP ;STORE FOR CMPDFN PJRST CMPDFN ;GO PRINT RATIO ;CMPDFA -- SUBROUTINE TO PRINT INTEGER+1 DIGIT FRACTION ;CALL: MOVEM TEMP NUMBER TO DIVIDE BY ; MOVE A,NUMBER TO BE DIVIDED ; PUSHJ P,CMPDFA ; ALWAYS RETURN CMPDFA: MOVE N,A CMPDFN: IMULI N,^D10 ; * 10 IDIV N,TEMP ;DIVIDE BY #K AVAILABLE LSH N1,1 ;REMAINDER * 2 CAML N1,TEMP ;TEST FOR ROUNDING NEEDED AOJ N, ; YES, INCR QUOTIENT BY 1 IDIVI N,^D10 ;DIVIDE TO GET INTEGER/FRACTION PUSH P,N1 ;SAVE FRACTION FOR LATER PUSHJ P,MSGDEC ;PRINT MSG & INTEGRAL PART POP P,N ;RESTORE FRACTIONAL DIGIT MOVEI CH,"." ;DECIMAL POINT PUSHJ P,TYO ;SEPARATE FRACTION PJRST DECPRT ;AND TYPE FRACTION ;CMPCPT -- PRINT "A" PER SECOND CPU UPTIME (FROM TEMP) ;CMPCTT -- PRINT "A" PER SECOND SYS UPTIME (FROM UPTINC) CMPCPT: SKIPA N,TEMP ;GET UPTIME FROM TEMP CMPCTT: MOVE N,UPTINC ;GET UPTIME OF SYSTEM IDIV N,TCKSEC ;CONVERT TO SECONDS EXCH N,A ;(PRINT FROM N) IDIV N,A ;WHATEVER'S PER SECOND PJRST DECPRT ;TYPE NUMBER ;CALCPT -- CALCULATE "A" PER SECOND CPU UPTIME (FROM TEMP) ;CALCTT -- CALCULATE "A" PER SECOND SYS UPTIME (FROM UPTINC) CALCPT: SKIPA N,TEMP ;GET UPTIME FROM TEMP CALCTT: MOVE N,UPTINC ;GET UPTIME OF SYSTEM IDIV N,TCKSEC ;CONVERT TO SECONDS EXCH N,A ;(PRINT FROM N) IDIV N,A ;WHATEVER'S PER SECOND POPJ P, ;RETURN PER-SECOND COUNT IN N ;CMPDDN -- SUBROUTINE TO PRINT 4-DIGIT INTEGER PLUS 2-DIGIT FRACTION ;CALL: MOVEM TEMP NUMBER TO DIVIDE BY ; MOVE N,NUMBER TO BE DIVIDED ; PUSHJ P,CMPDDN ; ALWAYS RETURN CMPDDN: IMULI N,^D100 ;WANT IN HUNDREDTHS IDIV N,TEMP ;GET REMAINDER LSH N1,1 ;SEE IF MORE THAN HALF CAML N1,TEMP ;... AOJ N, ;YES, ROUND UP IDIVI N,^D100 ;GET UNITS AND HUNDREDTHS PUSH P,N+1 ;SAVE REMAINDER PUSHJ P,DECB4 ;PRINT FIRST PART MOVEI CH,"." ;GET A POINT PUSHJ P,TYO ;PRINT IT POP P,N ;GET REMAINDER BACK PJRST DECZ2 ;AND TYPE FRACTION ;SUBROUTINE TO GET REL ENTRY FROM MONITOR GETTAB SUB-TABLE ;CALL: MOVEI A,DESIRED REL ENTRY IN RESPONSE TABLE ; MOVEM CPU #,CPU ;STORE CPU NUMBER = 0,1 ; PUSHJ P,GETRSP ; ERROR RETURN NOT PRESENT FOR THIS CPU ; OK RETURN CONTENTS IN AC A GETRSP: PUSH P,N1 ;SAVE N1 PUSH P,A ;SAVE RELATIVE ADR IN SUB-TABLE MOVE A,[%CCRSP] ;GETTAB IN CPU CONSTANTS TABLE ; FOR REL ENTRY IN CPU VARIABLE TABLE ; FOR RESPONSE DATA ADD A,CPU ;FORM FOR THIS CPU ADD A,CPU ;CONSTANTS GETTABS ARE EVERY OTHER PUSHJ P,GET ;GET ENTRY FROM MONITORJ JRST GTRSPX ;NOT PRESENT, ERROR RETURN ADD A,(P) ;FORM ADR IN CPU VARIABLE TABLE HRL A,A ;TO LH HRRI A,.GTC0V ;VARIABLE GETTAB FOR CPU0 ADD A,CPU ;FOR FOR CPU N ADD A,CPU ;VARIABLE TABLE IS EVERY OTHER PUSHJ P,GET ;GET FROM MONITOR SOS -2(P) ;NOT PRESENT, SET FOR ERROR RETURN AOS -2(P) ;SKIP RETURN(UNLESS ERROR) GTRSPX: POP P,N1 ;RESTORE PD LIST POP P,N1 ;RESTORE N1 POPJ P, ;ERROR OR OK RETURN ;STROLL STARTS THE OUTPUT OF A PAGE ON THE DISPLAY SCREEN STROLL: PUSH P,A ;SAVE A SCRATCH ONE MOVEI A,STREND ;SO ALWAYS GET EXIT FROM DISPLAY EXCH A,-1(P) ;GET OLD RETURN EXCH A,(P) ;GET A BACK SETZM .FRAJS ;NO ONE SKIPPED YET SETZM CLINE ;NO ONE PRINTED YET SETZM NLTYPD ;NO ONE TYPED YET SETZM HDRVAL ;NO RESIDUES RETURN ;SETEND FREEZE VALUE OF LINE IN SLNE SO STREND CAN ADAPT TO ;EMPTY SCREENS SETEND: PUSH P,LINE ;GET CURRENT LINE VALUE POP P,SLINE ;REMEMBER IT PUSH P,BOTTOM ;GET BOTTOM POP P,SBOTTM ;TO RECOMPUTE FIRJOB RETURN ;STREND IS ENTERED WHEN THE DISPLAY PROGRAM ENDS STREND: SKIPE .FRAJR ;AUTOMATIC ROLL ON? JRST STREN0 ;(YES) DO DIFFERENT THINGS MOVE A,SLINE ;ANY SPACE LEFT? JUMPL A,CPOPJ ;NOPE ALL USED SUB A,SBOTTM ;MINUS NUMBER LEFT ADDB A,FIRJOB ;REINITIALIZE BORDER JUMPGE A,CPOPJ ;ALL SET SETZM FIRJOB ;NO NEGATIVE LINE NUMBERS RETURN STREN0: SETZM FIRJOB ;ASSUME BACK TO THE BEGINNING MOVE A,LSTLNE ;LAST LINE NUMBER SKIPE .FRAJS ;ANY JOBS SKIPPED? MOVEM A,FIRJOB ;(YES) UPDATE NEXT LINE START RETURN ;PRINTERS FOR THE PAGED F DISPLAY ;IFPRNT CHECKS WHETHER THE CURRENT LINE CAN BE PRINTED OR NOT ;CPOPJ LINE IS INVISIBLE ;CPOPJ1 LINE IS VISIBLE IFPRNT: SKIPL VISIBL ;CAN WE SEE IT? RETURN ;NO ALL DONE PUSH P,A ;SAVE A MOVE A,HDRVAL ;IS A HEADER TO BE PRINTED? JUMPE A,IFPRN0 ;NOPE EXIT SETZM HDRVAL ;NO RECURSIVE ENTRIES CALL (A) ;GET IT OUT IFPRN0: POP P,A ;GET A BACK JRST CPOPJ1 ;GO BACK ;SETVIS SORT OUT WHETHER LINE CAN BE SEEN SETVIS: PUSH P,CH ;SAVE A SCRATCH SETZM VISIBL ;ASSUME NO VISIBILITY SKIPGE LINE ;BUT VERIFY FIRST JRST SETVI0 ;CHECK SCREEN LOGIC AOS VISIBL ;IF BELOW HORIZONT MOVE CH,CLINE ;GET CURRENT LINE NUMBER CAML CH,FIRJOB ;IS BELOW THE HORIZONT SETOM VISIBL ;NO ITS ON THE SCREEN JRST SETVI1 ;GO BACK SETVI0: SKIPE .FRAJR ;IF NO AUTO ROLL OR SKIPE .FRAJS ;SKIP LOGIC DONE JRST SETVI1 ;ALL SET SETOM .FRAJS ;JOBS ARE SKIPPED MOVE CH,CLINE ;GET LAST LINE MOVEM CH,LSTLNE ;HERE TO BEGIN NEXT SETVI1: POP P,CH ;GET JUNK BACK RETURN ;AND ALL HAS BEEN DONE ;ICRLF START A NEW LINE THIS MEANS UPDATE LINE LOGIC ICRLF: CALL IFPRNT ;VISIBLE JRST ICRLF0 ;NOT TO US CALL CRLF ;SHOW IT CALL SETEND ;UPDATE LAST LINE VALUE AOS NLTYPD ;ONE MORE TYPED ICRLF0: AOS CLINE ;UPDATE THE LINE NUMBER PJRST SETVIS ;AND SEE HOW OUR VISION IS NOW ;SETHDR GENERATE THE CALL TO A HEADER PRINTER SETHDR: POP P,HDRVAL ;ROUTINE ADDRESS -1 PUSH P,HDRVAL ;RESTORE RETURN ADDRESS AOS HDRVAL ;CODE IS JUST PAST RETURN RETURN ;CONDITIONAL PRINTERS IMSG: CALL IFPRNT ;VISIBLE RETURN ;NO GO BACK PJRST MSG ;YES PRINT IT ISIXBP: CALL IFPRNT ;VISIBLE RETURN PJRST SIXBP IDECPR: CALL IFPRNT RETURN PJRST DECPRT ITAB: CALL IFPRNT RETURN PJRST TAB IFRCL: PUSHJ P,ICRLF ;GIVE A "FREE" PUSHJ P,ISPACE ;AND A SPACE TO INDENT PUSHJ P,ISPACE ;AND ANOTHER PUSHJ P,ISPACE ;AND YET ANOTHER ;FALL INTO FINAL ISPACE ISPACE: CALL IFPRNT RETURN PJRST SPACE IDECTA: CALL IFPRNT RETURN PJRST DECTAB IPRPCN: CALL IFPRNT RETURN PJRST PRPCNT SIXTAB: PUSHJ P,SIXBP TAB: SKIPA CH,[11] SPACE: MOVEI CH,40 TYO: TLNN F,FL.SUP ;SUPPRESSED? SKIPGE LINE ;DO NOTHING IF OUT OF ROOM POPJ P, ANDI CH,177 CAIN CH,15 JRST TYCR ;SIMULATE CAR. RET. CAIN CH,12 JRST TYLF ;SIMULATE LINE FEED SKIPGE COL ;IGNORE LINE TOO WIDE JRST TYO3 ;GO CHECK FOR FREE CRLF CAIN CH,11 JRST TYTAB ;SIMULATE TAB PUSHJ P,GETCH ANDI T2,377 ;CLEAR 400 BIT CAIN CH," " ;TEST FOR CHANGING TO BLANK MOVEI CH,400(T2) ; YES, CONVERT TO 400! TRNE CH,400 ;TEST FOR 400 BIT NOW ON MOVEI T2,(CH) ; YES, COPY REGISTER TO AVOID 200 BIT CAME CH,T2 TRO CH,200 ;NOT THE SAME AS LAST TIME DPB CH,T1 AOS T1,COL ;INCREMENT COLUMN COUNT CAMLE T1,RTEND SETOM COL ;LINE TOO WIDE POPJ P, ;LINE EXHAUSTED, CHECK FOR FREE CRLF ACTION TYO3: TLNN F,FL.CRF ;HIGH LEVEL WANT FREE CRLF? POPJ P, ;NO, JUST TOSS OUT THE CHARACTER PUSH P,CH ;YES, SAVE THE REAL CHARACTER PUSHJ P,TYCR3 ;GIVE THE FREE CR PUSHJ P,TYLF ;AND THE FREE LF FOLLOWING PUSHJ P,SPACE ;SPACE PUSHJ P,SPACE ; OVER PUSHJ P,SPACE ; CONTINUATION PUSHJ P,SPACE ; LINES POP P,CH ;RESTORE THE REAL CHARACTER PJRST TYO ;AND FINALLY OUTPUT IT TYCR: MOVEI CH," " PUSHJ P,TYO ;CLEAR REMAINDER OF LINE SKIPL COL JRST TYCR TYCR3: MOVE T1,LTEND ;MOVE TO LEFT EDGE OF WINDOW MOVEM T1,COL MOVE T1,LTTEND MOVEM T1,TABCTR POPJ P, GETCH: MOVE T1,LINE IMULI T1,XSIZE ADD T1,COL ;CALC. CHAR POSITION IN BUF IDIVI T1,4 ADD T1,BPTAB(T2) ;MAKE BYTE POINTER TO CHAR LDB T2,T1 ;GET THE CHAR POPJ P,0 ;RETURN TYLF: AOS T1,LINE ;INCREMENT LINE COUNT CAMG T1,BOTTOM POPJ P, ;SPACE LEFT LDB T2,PCONT JUMPN T2,TYLF2 ;CONTINUATION COLUMN? TYLF1: SETOM LINE ;NO ROOM LEFT POPJ P, TYLF2: ADD T2,LTEND ;ADD SPACE BETWEEN COLUMNS LDB T1,PWIDTH ;MOVE OVER A FULL COLUMN WIDTH ADD T2,T1 MOVEM T2,COL EXCH T2,LTEND ADD T1,LTEND CAILE T1,XSIZE JRST TYLF1 ;COLUMN WON'T FIT MOVEM T1,RTEND SKIPA T1,TABCTR ;GET CURRENT VALUE OF TABCTR & SKIP NEXT AOS T1,TABCTR MOVEM T1,LTTEND MOVE T1,TAB0(T1) CAMG T1,LTEND JRST .-4 LDB T1,PTOP ;GO TO TOP OF NEW COLUMN MOVEM T1,LINE TLZE F,FL.NHED ;TEST FOR HEADING SUPPRESSED POPJ P, ; YES, THEN EXIT W/O ACTION IMULI T1,XSIZE ;COPY HEADING ADD T1,T2 SOS T1 IDIVI T1,4 ;SPLIT WORD/BYTE ADD T1,BPTAB(T2) PUSH P,T1 TYLF3: ILDB CH,(P) ANDI CH,177 PUSHJ P,TYO SKIPL COL JRST TYLF3 POP P,T1 ;MOVE TO FRESH LINE AND RETURN JRST CRLF TYTAB: MOVE T2,COL AOS T2 MOVE T1,TABCTR ;GET NEXT TAB POSITION AOS TABCTR ;UPDATE TAB COUNTER SUB T2,TAB0(T1) ;CALCULATE # OF SPACES NEEDED PUSH P,T2 TYTAB1: MOVEI CH," " PUSHJ P,TYO ;OUTPUT SPACES AOSGE (P) JRST TYTAB1 POP P,T1 POPJ P, PLTEND: POINT 7,WINDOW,6 PWIDTH: POINT 7,WINDOW,13 PTOP: POINT 5,WINDOW,18 PBOTTO: POINT 5,WINDOW,23 PCONT: POINT 2,WINDOW,25 PTABST: POINT 10,WINDOW,35 SETUP: MOVE T1,@(P) ;PICK UP INFO WORD MOVEM T1,WINDOW LDB T1,PLTEND ;UNPACK NECESSARY DATA MOVEM T1,LTEND MOVEM T1,COL LDB T2,PWIDTH ADD T1,T2 MOVEM T1,RTEND LDB T1,PTOP MOVEM T1,LINE LDB T1,PBOTTO MOVEM T1,BOTTOM LDB T1,PTABST SETUP7: MOVEM T1,LTTEND ;SET TAB STOPS MOVEM T1,TABCTR JRST CPOPJ1 ;SKIP OVER INFO WORD TSETUP: MOVE T1,@(P) ;GET INFO WORD DPB T1,PTABST ;UPDATE "WINDOW" PJRST SETUP7 ;AND FIX TAB STOPS SUBTTL DISPLAY WINDOW SETTERS ;DISPLAY INDEPENDENT WINDOW OPERATIONS ;WNDJOB SETS THE WINDOW FOR THE JOB AREA ON THE SCREEN ;WNDSYS SETS THE WINDOW FOR SYSTEM INFORMATION WNDJOB: TRNN F,FR.VMM ;IS THERE VM DATA JRST WNDJO0 ;(NO) CLASSIC STUFF SET 1,XSIZE,1,YSIZE,0,TABV0 RETURN ;THAT WAS ALL WNDJO0: TRNN F,FR.JOB ;JOBS ONLY DISPLAY? JRST WNDJO1 ;NO SET 1,39,1,YSIZE,2,TABJ0 ;SET FOR JOBS ONLY (MULTI COLUMN) RETURN ;THAT'S ALL WNDJO1: TRNN F,FR.SJB ;EXPANDED JOB (NO SYSTEM STUFF)? JRST WNDJO9 ;NO SET 1,72,1,YSIZE,2,TABS0 ;SET FOR EXPANDED JOBS POPJ P, ;RETURN WITH WINDOW SET UP WNDJO9: SET 1,39,1,YSIZE,0,TAB0 RETURN WNDSYS: TRNN F,FR.VMM ;A VM DISPLAY?? JRST WNDSY0 ;(NO) CLASSIC CHANGE 1,XSIZE,1,2,0,TAB5 RETURN WNDSY0: CHANGE 41,XSIZE,NSYSYS,YSIZE,0,TAB1 RETURN IFN V.DISP-V.DVBX,< IFE V.DISP-V.ANSI,< ; DPYPRN: SETZ CH, ; DPYPR1: LSH CH,^D9 ; IDIVI N,^D10 ; IORI CH,"0"(N1) ; JUMPN N,DPYPR1 ; ; ; ; ;PJRST DPYOUT ; >;;END OF IFE V.DISP-V.ANSI DPYOUT: SKIPE CCIOPC POPJ P, DPYOU2: PUSH P,CH ;SAVE CH IN CASE MULT CHARS ANDI CH,177 ;ONLY 7-BIT ASCII CHARACTERS GET OUTPUT PUSHJ P,DPYCHO ;OUTPUT THIS CHARACTER POP P,CH ;GET BACK CH LSH CH,-^D9 ;SHIFT OVER BY ONE "CHARACTER" JUMPN CH,DPYOU2 ;LOOP BACK IF MORE CHARACTERS POPJ P, ;ALL DONE DPYCHO: SOSG THED+2 PUSHJ P,FRCOUT ;FORCE OUTPUT IDPB CH,THED+1 POPJ P, NRMDEV=='TTY' ;NORMALLY TO TTY: >; END OF IFN V.DISP-V.DVBX IFE V.DISP-V.DVBX,< NRMDEV=='DIS' ;NORMALLY TO DIS: >; END IFE V.DISP-V.DVBX OPNTTY: MOVE T1,[SIXBIT /SYSDPY/] DEVCHR T1, JUMPN T1,OPNTT1 MOVSI T1,NRMDEV DEVCHR T1, MOVSI B,NRMDEV OPNTT2: IFN V.DISP-V.DVBX,< TRNN T1,1_10 TDZA A,A MOVEI A,10 TRO A,700 ;NO ECHO TXNN T1,DV.TTY ;SEE IF A TTY TRZ A,-1 ;NO--KILL SPECIAL MODES MOVSI C,THED OPEN TTY,A EXIT OUTBUF TTY,3 MOVE A,[SIXBIT /SYSDPY/] MOVSI B,(SIXBIT /TXT/) SETZB C,D ENTER TTY,A JFCL >; END IFN V.DISP-V.DVBX IFE V.DISP-V.DVBX,< MOVEI A,15 ;SET DISPLAY DUMP MODE MOVEI C,0 ;NO BUFFERS OPEN DIS,A ;GET EQUIPMENT JRST [OUTSTR [ASCIZ /? DIS NOT AVAILABLE /] EXIT] ;(EDIT 1 PART 2) CODE MOVED TO FRONT OF MODULE TRZ F,FR.DIS ;INDICATE TO INITIALIZE DIS >; END OF IFE V.DISP-V.DVBX POPJ P,0 OPNTT1: MOVE B,[SIXBIT /SYSDPY/] JRST OPNTT2 ;ROUTINE TO FORCE OUT TTY DISPLAY FRCOUT: SKIPE CCIOPC ;UNLESS ^C INTERCEPT, SKIP JRST FRCOU1 ;IF SO--OMIT THE OUTPUT FRCUUO: OUTPUT TTY, ;ELSE, DO THE OUTPUT POPJ P, ;AND RETURN FRCOU1: PUSH P,A ;FREE UP AN AC MOVEI A,5*20 ;NUM CHARS/BUF ADDM A,THED+2 ;MAKE ROOM MOVNI A,20 ;NUM WORDS/BUF ADDM A,THED+1 ;BACK UP POINTER POP P,A ;RESTORE AC POPJ P, ;RETURN ;DHMPRT -- PRINT "A" IN [[DAYS:]HOURS:]MINUTES DHMPRT: CAIGE N,^D60 ;NEED HOURS? PJRST DECPRT ;NO, JUST STRAIGHT MINUTES IDIVI A,^D60*^D24 ;A:=DAYS TO GO SKIPN N,A ;SKIP IF NO DAYS JRST DHMPR2 ;JUST PRINT HOURS:MINUTES PUSHJ P,DECPRT ;PRINT DAYS MOVEI CH,"D" ;SEPARATOR PUSHJ P,TYO ;PRINT IT DHMPR2: IDIVI B,^D60 ;B:=HOURS MOVE N,B ;N:=HOURS CAIE A,0 ;DID WE TYPE DAYS? PUSHJ P,DECZ2 ;YES, PRINT TWO-DIGIT HOURS CAIN A,0 ;DID WE TYPE DAYS? PUSHJ P,DECPRT ;NO, PRINT ONE-OR-TWO-DIGIT HOURS PUSHJ P,COLON ;SEPARATE FROM MINUTES MOVE N,C ;N:=MINUTES PJRST DECZ2 ;PRINT TWO-DIGIT MINUTES ;TCKTIM -- PRINT "A" IN HH:MM:SS OR MM:SS.CC FORMAT TCKTIM: IMULI A,^D100 ;"INCREASED" PRECISION IDIV A,TCKSEC ;JUNK JIFFIES CAXGE A,^D60*^D60*^D100 ;TIME EXTEND INTO HOURS? JRST TCKTM4 ;NO, PRINT MM:SS.CC INSTEAD IDIVX A,^D60*^D60*^D100 ;YES, A := HOURS MOVE N,A PUSHJ P,DECZ2 PUSHJ P,COLON TCKTM1: IDIVI B,^D60*^D100 ;B := MINUTES MOVE N,B PUSHJ P,DECZ2 PUSHJ P,COLON IDIVI C,^D100 ;C := SECONDS MOVE N,C PJRST DECZ2 ;CAP OFF WITH MINUTES TCKTM4: IDIVI A,^D60*^D100 ;A:= MINUTES MOVE N,A ;POSTION FOR DECZ2 PUSHJ P,DECZ2 ;TYPE TWO DIGIT DECIMAL PUSHJ P,COLON ;TERMINATE MINUTES IDIVI B,^D100 ;B := SECONDS; C := HUNDREDTHS MOVE N,B ;POSITION SECONDS FOR DECZ2 PUSHJ P,DECZ2 ;TYPE TWO DIGIT DECIMAL PUSHJ P,DOT ;TERMINATE WITH A "." MOVE N,C ;POSITION HUNDREDTHS FOR DECZ2 PJRST DECZ2 ;TYPE TWO DIGIT DECIMAL ;HEXPRB -- PRINT A HEX BYTE HEXPRB: ANDI N,377 ;MASK BYTE PUSH P,N ;SAVE VALUE LSH N,-4 ;GET HIGH DIGIT PUSHJ P,HEXPRT ;PRINT IT POP P,N ;GET BACK VALUE ANDI N,17 ;GET LOW DIGIT PJRST HEXPRT ;PRINT OUT AND RETURN ;DECPRT -- PRINT A GENERAL DECIMAL NUMBER HEXPRT: SKIPA R,[^D16] DECPRT: MOVEI R,12 RDXPRT: MOVEI CH,"-" JUMPGE N,RADIX1 PUSHJ P,TYO MOVMS N RADIX1: IDIVI N,(R) HRLM N1,0(P) SKIPE N PUSHJ P,RADIX1 HLRZ CH,0(P) ADDI CH,"0" CAILE CH,"9" ADDI CH,"A"-"9"-1 JRST TYO ;DECPN? -- PRINT A ?-DIGIT DECIMAL NUMBER ;CALL IS: ; ; MOVX N, ; MOVX A,<-DIGITS,,"FILLER"> ; PUSHJ P,DECPN ; ;WHERE DIGITS IS THE COUNT OF DIGITS TO BE OUTPUT; FILLER IS THE ;FILL CHARACTER TO USE FOR LEADING CHARACTERS. NEGATIVE NUMBERS ;DON'T WORK. DECB8: MOVE A,[-^D8,," "] ;EIGHT-DIGIT NUMBER FIELD PJRST DECPN ;GO DO GENERALIZED STUFF DECB7: SKIPA A,[-^D7,," "] ;SEVEN-DIGIT NUMBER FIELD DECB6: MOVE A,[-^D6,," "] ;SIX-DIGIT NUMBER FIELD PJRST DECPN ;GO DO GENERALIZED STUFF DECB5: SKIPA A,[-^D5,," "] ;FIVE-DIGIT NUMBER FIELD DECB4: MOVE A,[-^D4,," "] ;FOUR-DIGIT NUMBER FIELD PJRST DECPN ;GO DO GENERALIZED STUFF DECB3: SKIPA A,[-^D3,," "] ;THREE-DIGIT NUMBER FIELD DECB2: MOVE A,[-^D2,," "] ;TWO-DIGIT NUMBER FIELD PJRST DECPN ;GO DO GENERALIZED STUFF DECZ2: MOVE A,[-^D2,,"0"] ;TWO-DIGIT NUMBER FIELD PJRST DECPN ;GO DO GENERALIZED STUFF DECPN: MOVEI R,^D10 ;DECIMAL RADIX RDXPN: HRRZM A,L0FILL ;LEADING ZERO FILL CHARACTER RDXPN0: IDIVI N,(R) ;GET NEXT ---ADE ADDI N1,"0" ;ASCII-IZE IT HRLM N1,(P) ;AND SAVE IT AWAY FOR TYPEOUT AOBJN A,.+1 ;COUNT UP DIGITS JUMPE N,RDXPN4 ;EXIT LOOP IF DONE WITH NON-ZERO DIGITS PUSHJ P,RDXPN0 ;RECURSE FOR WHOLE NUMBER RDXPN2: HLRZ CH,(P) ;RETRIEVE ASCII DIGIT PJRST TYO ;AND OUTPUT IT RDXPN4: JUMPGE A,RDXPN2 ;IF ALREADY FULL, NO FILLERS RDXPN5: HRRZ CH,L0FILL ;GET LEADING FILLER PUSHJ P,TYO ;OUTPUT LEADING FILLER AOBJN A,RDXPN5 ;LOOP FOR NOT-YET-FILLED FIELD JRST RDXPN2 ;NOW OUTPUT THE REAL DIGITS PNTPPN: MOVE N,A ;PRINT OCTAL AS UNSIGNED HALVES OCTPRT: PUSH P,N HLRZ N,(P) JUMPE N,OCTRH MOVEI R,10 PUSHJ P,RDXPRT PUSHJ P,COMMA OCTRH: HRRZ N,(P) MOVEI R,10 PUSHJ P,RDXPRT POP P,N POPJ P, JRST RDXPRT DECTAB: PUSHJ P,DECPRT JRST TAB CONFIG: MOVEI M,[ASCIZ /This is/] CONFIM: PUSHJ P,MSG PUSHJ P,SPACE CONFI0: MOVEI B,0 MOVEI C,11 CONFL: MOVEI M,A MOVE A,C PUSHJ P,GETA PUSHJ P,MSG AOBJN C,.+1 TRNE A,376 SOJA C,CONFL POPJ P,0 PDATIM: MOVE A,XDATE ;DATE CALL GETA ;GET THE DATE IDIVI A,^D31 MOVEI N,1(B) MOVE B,A ;SAVE A PUSHJ P,DECZ2 ;PRINT TWO-DIGIT DAY OF THE MONTH MOVE A,B ;RESTORE A IDIVI A,^D12 MOVE B,MONTAB(B) MOVEI C,0 MOVEI M,B MOVEI N,^D64(A) PUSHJ P,MSGDEC ;PRINT MESSAGE FOLLOWED BY DECIMAL NO. PUSHJ P,SPACE MOVE A,XTIME PUSHJ P,GETA JRST TCKTIM PUPTIM: MOVEI M,[ASCIZ/UP:/] ;IDENTIFY WHAT FOLLOWS PUSHJ P,MSG ;TYPE IT MOVE A,UPTINC ;GET APPROPRIATE UPTIME FIGURE PJRST TCKTIM ;AND TYPE IT OUT GUPTIM: MOVE A,XSMPTM ;SYSTEM UPTIME GETTAB PUSHJ P,GET ;SEE HOW LONG SYSTEM UP SKIPA A,XUPTIM ;MUST BE PRE-SMP MONITOR POPJ P, ;SMP TOTAL SYSTEM UPTIME PJRST GETZ ;SEE HOW LONG MASTER UP ;ROUTINE TO COMPUTE INTEGER SQRT: N=ISQRT(A,B) ;CALLED WITH POS ARG IN "A,B", RESULT RETURNED IN "N", USES N1 ISQRT: MOVEI N,0 ;PRESET NULL ANSWER JUMPL A,CPOPJ ;RETURN 0 IF NEG MOVE N,A ;COPY ARG JFFO N,.+2 ;SET N1 TO NUM 0S MOVEI N1,^D36 ; IN CASE ALL ZERO SOS N1 ;BACK DOWN FOR SIGN BIT TRZ N1,1 ;MAKE SMALLER EVEN LSH B,1 ;COMPRESS OUT SIGN BIT OF B LSHC A,-^D35(N1) ;POSITION MOST SIG. BITS IN B ASH N1,-1 ;DIVIDE SHIFT BY 2 MOVNS N1 ;SET TO OTHER WAY FOR ANSWER TRO B,1 ;FORCE SOME BITS ON TO TERMINATE MOVEI N,0 ;CLEAR ANSWER ISQ1: ASH N,1 ;MOVE TO NEXT BIT CAMG A,N ;SEE IF REMAINDER IS BIG JRST ISQ2 ;NO--LOOP ON SUB A,N ;DECREASE REMAINDER SUBI A,1 ; .. TRO N,2 ;INCREASE RESULT ISQ2: LSHC A,2 ;SHIFT REMAINDER TWO BITS JUMPN B,ISQ1 ;LOOP UNTIL DONE ASH A,-1 ;BACK OFF REMAINDER CAMLE A,N ;SEE IF ROUNDING NEEDED ADDI N,1 ;YES--INCREASE RESULT ASH N,^D17(N1) ;POSITION RESULT POPJ P, ;RETURN SUBTTL CONSTANTS AND DATA ;CONSTANTS FOR GETTAB UUO XTIME: XWD 10,11 XDATE: XWD 11,11 XSEGPT: XWD 15,11 XUPTIM: XWD 15,12 XSMPTM: %CNSUP ;TOTAL SMP SYSTEM UPTIME XDVLST: XWD 14,11 XSTATS: XWD 17,11 XLSTIM: XWD 22,12 XK4SWP: XWD 1,15 XSYSSZ: XWD 12,11 XMEMSZ: XWD 23,12 XSPPN: XWD 1,16 XOPR: XWD 13,11 XGETTS: XWD 23,23 ;GET TAB SELF POINTER XSYSUNI: XWD 7,16 XSWPER: XWD 5,13 XSWPUN: XWD 10,16 XPTYCN: XWD 22,11 ;PTY CONFIGURATION XOPPN: XWD 2,16 ;OPERATOR PPN XLPPN: XWD 3,16 ;LOGIN PPN XHGHJB: XWD 20,12 ;HIGHEST JOB CURRENTLY ACTIVE XPDBPT: XWD 45,11 ;PTR TO LIST OF PDB'S XDDBLD: XWD 75,11 ;POINTER TO VALUE OF LDB LINK IN TTY DDB QTAB: SIXBIT /RNWSTS/ SIXBIT /STAUMQ/ SIXBIT /DADTDC/ SIXBIT /MTIOTI/ SIXBIT /SLNL^C/ SIXBIT /AABBCC/ SIXBIT /DDEEFF/ SIXBIT /GGHHII/ SIXBIT /JJKKLL/ SIXBIT /MMNNOO/ SIXBIT /PPQQRR/ LQTAB==QTAB-. MONTAB: ASCII /-Jan-/ ASCII /-Feb-/ ASCII /-Mar-/ ASCII /-Apr-/ ASCII /-May-/ ASCII /-Jun-/ ASCII /-Jul-/ ASCII /-Aug-/ ASCII /-Sep-/ ASCII /-Oct-/ ASCII /-Nov-/ ASCII /-Dec-/ SYSPPN: XWD 1,1 OLDPPN: Z NEWPPN: Z OPRPPN: XWD 1,2 ;DEFAULT OPERATOR PPN LOGPPN: XWD 2,5 ;DEFAULT LOGIN PPN COMMENT & TABPTR IS A TABLE USED TO INITIALIZE ALL TABLES NEEDED BY SYSDPY BASICALLY THERE ARE TWO TYPES OF TABLES: 1 TABLES IN THE SPY SEGMENT 2 TABLES IN SYSDPY CORE THE TABLES ARE DESCRIBED BY FOUR FIELDS IN THE LEFTHALF POINTER OF THE TABPTR ENTRIES. THESE FIELDS ARE ADDRESSED BY 4 BYTE POINTERS: 1 PSIZE A TWO BIT LEFT ADJUSTED FIELD USED TO INDEX TABLE TSIZE THIS OPERATION GIVES THE THE TABLE LENGTH 2 PSPY A BIT IF SET FLAGGING THAT TABLE IS IN SPY SPACE NOW 3 PSPYTB A BIT THAT INDICATES TABLE IS SPYABLE FROM MONITOR 4 PTABLE AN INDEX OF THE TABLE FOR GETTAB UUOS (IFF SPYTAB SET) NOTE: THE SIZE OF BOTH IS ONPURPOSE 2,THIS SATISFIES OLD SIGN TESTS & LJOBN==0B1 ;TABLE INDEX BY JOB NUMBER LSEGN==1B1 ;TABLE INDEX BY SEGMENT NUMBER LBOTH==2B1 ;TABLE INDEX BY JOB OR SEGMENT NUMBER ;3B1 IS ILLEGAL ;1B2 IS USED BY PSPY SPYTAB==1B3 ;TABLE IS SPYABLE FROM MONITOR PSIZE: POINT 2,(D),1 ;TSIZE INDEX PSPY: POINT 1,(D),2 ;TABLE IS CURRENTLY BEING SPYED PSPYTB: POINT 1,(D),3 ;TABLE IS SPYABLE FROM MONITOR PTABLE: POINT 9,(D),17;GETTAB TABLE INDEX (IFF SPYTAB SET) ;THE TABLE USED TO INITIALIZE SYSDPY'S JOB DATA TABLES ; ;THE TABLES AT TABLE ARE INTERNAL SYSDPY BOOKKEEPING TABLES. ; ;THE TABLES AT TABPTR ARE MONITOR TABLES WHICH, IF THEY CANNOT BE ;SPIED, ARE CONVERTED TO INTERNAL SYSDPY TABLES AND FILLED BY ;GETTAB'ING THE INFORMATION FROM THE MONITOR (SLOW, BUT SURE) TABLE: EXP LJOBN+TTIOS EXP LJOBN+TTLDB EXP LJOBN+JTTIM EXP LJOBN+JTRCT EXP LJOBN+JTWCT TABPTR: EXP LBOTH!SPYTAB+<.GTSTS,,JBSTS> EXP LBOTH!SPYTAB+<.GTADR,,JBADR> EXP LBOTH!SPYTAB+<.GTPPN,,JBPPN> EXP LBOTH!SPYTAB+<.GTPRG,,JBPRG> EXP LJOBN!SPYTAB+<.GTTIM,,JBTIM> EXP LBOTH!SPYTAB+<.GTSWP,,JBSWP> EXP LJOBN!SPYTAB+<.GTSGN,,JBSGN> EXP LJOBN!SPYTAB+<.GTRCT,,JBRCT> EXP LJOBN!SPYTAB+<.GTWCT,,JBWCT> EXP LJOBN!SPYTAB+<.GTNM1,,JBNM1> EXP LJOBN!SPYTAB+<.GTNM2,,JBNM2> EXP LJOBN!SPYTAB+<.GTRTD,,JBRTD> EXP LJOBN!SPYTAB+<.GTVRT,,JBVRT> EXP LJOBN!SPYTAB+<.GTST2,,JBST2> ; EXP LJOBN!SPYTAB+<.GTPC,,JBPC> EXP LJOBN!SPYTAB+<.GTPDB,,JBPDB> EXP LBOTH!SPYTAB+<.GTIMI,,JBIMI> EXP LBOTH!SPYTAB+<.GTIMO,,JBIMO> EXP LJOBN!SPYTAB+<.GTDDB,,JBDDB> EXP LJOBN!SPYTAB+<.GTVIR,,JBVIR> NTAB==.-TABPTR EXP LSEGN+SGCNT NTABLE=.-TABLE ;THE ACTUAL TABLE POINTERS (INITIALIZED BY GJBDAT TO EITHER BE ;INTERNAL TO SYSDPY TABLES (MEMORY ALLOCATED AT RUN TIME BASED ;ON MONITOR'S JOB CAPACITY) OR THE ACTUAL MONITOR TABLE ADDRESS ;RELOCATED INTO THE SPY SPACE. ;THE TT--- TABLES ARE UNAVAILABLE WITHOUT PEEKING OR SPYING ABILITIES. TTIOS: Z 0(J) ;CONTROLLING TTY DEVIOS WORD TTLDB: Z 0(J) ;TTY LDB ADDRESS ;THE JI--- VARIABLES ARE THE INCREMENTAL STATISTICS FOR PRESENT JOB. JITIM: Z ;[610] INCREMENTAL RUNTIME JIRCT: Z ;[610] INCREMENTAL DISK READS JIWCT: Z ;[610] INCREMENTAL DISK WRITES ;THE JT--- TABLES ARE USED FOR PER-JOB INCREMENTAL STATISTICS DISPLAY JTTIM: Z 0(J) ;RUNTIME (TOTAL) LAST UPDATE CYCLE JTRCT: Z 0(J) ;DISK READS (TOTAL) LAST UPDATE CYCLE JTWCT: Z 0(J) ;DISK WRITES (TOTAL) LAST UPDATE CYCLE ;THE JB--- TABLES ARE THE REAL JOB TABLES JBSTS: Z 0(J) ;JOB STATUS (RUN, SWAPPED, ETC.) JBADR: Z 0(J) ;PROGRAM SIZE (NON-VM) JBPPN: Z 0(J) ;JOB'S ACCOUNT (PPN) JBPRG: Z 0(J) ;PROGRAM NAME JBTIM: Z 0(J) ;TOTAL RUNTIME JBSWP: Z 0(J) ;SWAPPING POINTER AND SIZE JBSGN: Z 0(J) ;HIGH SEG NUMBER AND FLAGS JBRCT: Z 0(J) ;INCREMENTAL AND TOTAL DISK READS JBWCT: Z 0(J) ;INCREMENTAL AND TOTAL DISK WRITES JBNM1: Z 0(J) ;FIRST HALF OF USER NAME JBNM2: Z 0(J) ;SECOND HALF OF USER NAME JBRTD: Z 0(J) ;REAL-TIME (HPQ) WORD JBVRT: Z 0(J) ;PROGRAM (SEGMENT) VIRTUAL SIZES JBST2: Z 0(J) ;SECOND JOB STATUS (EW CODE, ETC.) JBPC: Z 0(J) ;PROGRAM PC JBPDB: Z 0(J) ;ADDRESS OF PDB, MONITOR PAGES, ETC. JBIMI: Z 0(J) ;PROGRAM/SEGMENT "IMGIN" SIZE JBIMO: Z 0(J) ;PROGRAM/SEGMENT "IMGOUT" SIZE JBddb: Z 0(J) ;I/O WAIT DDB JBVIR: Z 0(J) ;PROGRAM VIRTUAL SIZE ;THE SG--- TABLES ARE INTERNAL INFO FOR THE SEGMENTS SGCNT: Z 0(A) ;HIGH SEGMENT COUNTS SGC$AC==1B1 ; LH = FLAGS: SGC$AC SEGMENT COUNTED IN ACTUSE ; RH = COUNT OF JOBS USING THIS SEGMENT TAB0: DEC 4,12,16,23,26,32 ;FOR JOB DISPLAY TABJ0: DEC 4,12,16,23,26,32,44,52,56,63,66,72 ;JOBS ONLY TABS0: DEC 4,12,16,23,26,32,40,50,60 ;FOR EXPANDED JOB DISPLAY TABV0: DEC 4,12,16,23,40,58,64,70 TAB1: DEC 46,49,52,55,65,69,73,77 ;CPU STUFF TAB1CP: DEC 46,50,54,58,62,66,70,74 ;KL PERF PERCENTAGES TAB1IO: DEC 46,51,56,61 ;DISK I/O TAB1NT: ;NETWORK I/O TAB1TT: DEC 53,62 ;TTY STATISTICS TAB1ST: DEC 48,52,61,68,72 ;STRUCTURES DISPLAY TAB1DV: DEC 48,51,54,61,64,67,74,77 ;DEVICES DISPLAY COLUMNS TAB2: DEC 48,51,54,65,68,71 ;FOR HISEG DISPLAY TABV2: DEC 59,62,65,76,79,82 TAB4: DEC 16,23,30,37,44,51,58,65,72 ;RANDOM TAB4FS: DEC 16,25,34,43,52,61,70 ;FOR FILE SYSTEM DISPLAY TAB5: DEC 10 TAB6: DEC 13,XSIZE-39,XSIZE-34,XSIZE-29,XSIZE-24,XSIZE-19,XSIZE-14,XSIZE-9,XSIZE-4 TAB6X: DEC 13,XSIZE-31,XSIZE-27,XSIZE-23,XSIZE-19,XSIZE-15,XSIZE-11,XSIZE-7,XSIZE-3 TAB7: DEC 8,16,24,32,40,48,56,64,72 IFN FTNET,< ;NETWORK VARIABLES TAB8: DEC X2SIZE+7,X2SIZE+15,X2SIZE+23,X2SIZE+31,X2SIZE+39 TAB9A: DEC 1+16,1+16+9 ;UNNUMBERED CTL TAB9B: DEC X2SIZE+16,X2SIZE+16+9 ;NUMBERED CTL > ; TAB10: DEC 48,52,68,72 ;STRUCTURE DISPLAY TABCI: DEC 8,18,28,38,48,58,68 ;CI STUFF TABDNL: DEC 12,21,26,33,41,49,55,61,66,72 ;DECNET LINKS TABDNN: DEC 9,17,23,29,36,45 ;DECNET NODES IFN FTNET,< TABETH: DEC 20,29,36,52,63 ;ETHERNET DISPLAY TABLAT: DEC 12,24,36,48,60,72 ;LAT DISPLAY >; END IFN FTNET BPTAB: POINT 9,DBUF,8 POINT 9,DBUF,17 POINT 9,DBUF,26 POINT 9,DBUF,35 XLIST ;THE LITERALS LIT LIST ;MORE MONITOR INTERFACE PJOBNO: Z (D) ;RH SET WITH DEVJOB OFFSET INTO DDB PJOBNP: Z C ;LH SET WITH BYTE POINTER INTO C ;LENTAB CORRESPONDENCE BETWEEN TABLE LENGTH AND ENTRY TYPE IN NUMTAB ;>0 YOU GOT THE LENTH ;=0 TABLE DOES NOT EXIST (NO ENTRIES) ;-1 PDB DATA ;-2 NUMTAB CONTAINS THE LENGTH LENTAB: EXP 0 ;GT.UND UNDEFINED EXP -2 ;GT.ITM NUMTAB ENTRY HAS LENGTH GT.JOB: EXP 0 ;GT.JOB CHANGED BY IJBDAT CODE GT.SEG: EXP 0 ;GT.SEG SET BY IJBDAT CODE EXP -1 ;GTJBPDB PDB DATA TPCJOB: POINT 8,B,10 IMGOUT: POINT 9,@JBSWP,26 IMGIN: POINT 9,@JBSWP,35 DSKLEV: POINT 3,STATES,9 ;DISK MONITOR LEVEL NO. TTYTAB: EXP ;ADDRESS OF TTYTAB FOR EFFICIENT SPY VDDLDB: EXP ;VALUEDDBLDB .SEGLS: EXP ;LAST WORD IN SGCNT TABLE CCINT: 4,,CCTYPD ;^C INTERCEPT BLOCK ER.ICC CCIOPC: Z Z TTYFLG: EXP 0 ;0 WHEN NO LINE NUMBERS CAN BE GOTTEN ;-1 WHEN SPYING ON OLD TOPS10 ;+1 WHEN ISUING TRMNO. AND DEVNAM UUO'S TO GET DATA CTYNDX: EXP 0 ;CONTAINS INDEX OF CTY WHEN TTYFLG=+1 L0FILL: BLOCK 1 ;HOLDS FILLER FOR DECP?? IFE V.DISP-V.DVBX,< DISPLA: 020137 ;MODE 0/1: FULL INTENSITY,SCALE=1, 60HZ. SYNC. 221750,,160000 ;MODE 1:X=1000.; MODE 1:Y=0. 060000,,DISBUF ;MODE 7:JUMP AND GO TO MODE 3(SIXBIT) >; END IFE V.DISP-V.DVBX PDLST: BLOCK PDLEN ;ALLOCATE STACK SPACE IFN FTNET,< ;LIST OF BYTE POINTERS INTO NDB (MATCHES NDBGTB) NDBPTB: NDBLEN: 24 ;LENGTH OF NDB NDBNXT: POINT 18,XDBBLK+00,35 ;ADDRESS OF NEXT NDB NDBNNM: POINT 18,XDBBLK+00,17 ;NODE NUMBER NDBSNM: POINT 18,XDBBLK+02,17 ;ADDRESS OF STATION NAME NDBNGH: POINT 18,XDBBLK+07,17 ;FIRST NEIGHBOR ENTRY NDBNGL: POINT 18,XDBBLK+16,35 ;LAST NEIGHBOR ENTRY NDBNGN: POINT 10,N,27 ;NODE NUMBER FROM NDBNGH NDBOPR: POINT 18,XDBBLK+17,35 ;ADDRESS OF OPR LDB IF ANY NDBCTJ: POINT 18,XDBBLK+23,17 ;STATION CONTROL JOB NUMBER NDBLAR: POINT 8,XDBBLK+03,11 ;LAST ACK RECEIVED NDBLAP: POINT 8,XDBBLK+03,19 ;LAST OUTPUT MESSAGE# ACK'ED NDBLMS: POINT 8,XDBBLK+03,27 ;LAST MESSAGE SENT NDBLMA: POINT 8,XDBBLK+03,35 ;LAST MESSAGE NUMBER ASSIGNED NDBLMR: POINT 8,XDBBLK+02,35 ;LAST INPUT MESSAGE RECEIVED NDBLMP: POINT 8,XDBBLK+02,27 ;LAST MESSAGE PROCESSED > ;END IFN FTNET ;PROTOTYPE QUEUES-LISTING REQUEST MESSAGE FROM QUASAR QSRMSG: XWD QSRLEN,.QOLIS ;TYPE OF FUNCTION AND LENGTH XWD 0,'SYS' ;FLAGS AND 3 LETTER MNENOMIC EXP 0 ;ACKNOWLEDGE WORD EXP 0 ;NO SPECIAL FLAGS EXP 1 ;ONE ARGUMENT BLOCK FOLLOWING XWD 2,.LSQUE ;QUEUE BLOCK QSRFLG: EXP 0 ;WHICH QUEUES TO LIST, FILLED IN AT RUNTIME QSRLEN==.-QSRMSG ;SIZE OF PACKET ZER:! BLOCK 21 ;START OF AREA TO ZERO ;9 BYTE/CH CH IF SAME; 200+CH IF DIFF; 400+OLD IF SPACE DBUF: BLOCK +1 DBFEND=.-1 IFE V.DISP-V.DVBX,< DISBUF: BLOCK +10 DISBEN: 353537,,160000 ;NULLS,ESCAPE; MODE 0:NULL 0,,DISPLA ;MODE 7:JUMP TO START DISBES: DISBEN-1 ;OLD END OF BUFFER >; END IFE V.DISP-V.DVBX IFE V.DISP-V.DDLT, < LASTCR: BLOCK YSIZE ;LAST CHARACTER POSITION ARRAY ; FOR DELTA-DATA TELTERM >; END OF IFE V.DISP-V.DDLT HIBTIM: BLOCK 1 ;WAIT TIME BETWEEN UPDATES HIBTIW: BLOCK 1 ;AS ENTERED BY OPERATOR HLPADR: EXP 0 ;ADDRESS OF HELP TEXT IF READ IN P2WLSH: BLOCK 1 ;LSH @P2WLSH FOR "PAGES" TO WORDS W2PLSH: BLOCK 1 ;LSH @W2PLSH FOR WORDS TO "PAGES" GETAB: Z ;TEMP USED BY PSEUDO CODE GETAB1: Z ;TEMP USED BY PSEUDO CODE GETAB2: Z ;USED BY PSEUDO CODE GETAB3: 0 ;ANOTHER TEMP TEMP: 0 TEMP1: 0 REPS: 0 JOBPHY: BLOCK 1 ;JOB LOW,,HIGH PHYSICAL SIZE JOBPPG: BLOCK 1 ;COUNT OF PER-PROCESS PAGES JOBVIR: BLOCK 1 ;JOB LOW,,HIGH VIRTUAL SIZE CPU: BLOCK 1 ;CPU NUMBER FOR RESPONSES(0,1) CPMAX: BLOCK 1 ;MAX CPU NUMBER SYS IS BUILT FOR CPMNY: BLOCK 1 ;.GT. 0 IF MULTI-CPU CPBTS: BLOCK 1 ;SYSTEM BOOT CPU CPHDR: BLOCK 1 ;ADDR OF HEADER STRING IF NEEDED CPRLX: BLOCK 1 ;OFFSET FOR CPLQR CPCSH: BLOCK 1 ;.NE. 0 IF CACHE MEMORY SYSTEM CPKS10: BLOCK 1 ;[633] .NE. 0 IF KS-10 ;TABLES FOR CPU INCREMENTAL STATISTICS. THESE TABLES ARE TWO-WAY ;INTERLEAVED SINCE CPU INDEX IN CPULP IS A TWO-WORD INDEX FOR THE ;.CCXXX/.CVXXX MONITOR TABLES CPNAM: BLOCK 1 ;CPU NAME CPOKF: BLOCK 1+5+5 ;.NE. 0 THEN CPU NOT RUNNING CPUPT: BLOCK 1 ;CPU UPTIME (IN TICKS) CPNUL: BLOCK 1+5+5 ;CPU IDLE (NULL) TIME (IN TICKS) CPOHT: BLOCK 1 ;CPU OVERHEAD TIME (IN TICKS) CPLST: BLOCK 1+5+5 ;CPU LOST TIME (IN TICKS) CPTJC: BLOCK 1 ;TOTAL JOB CONTEXT SWITCHS CPNDB: BLOCK 1+5+5 ;NUMBER OF TIMES DOORBELL RUNG (MULTI-CPU) CPCSN: BLOCK 1 ;NUMBER OF TIMES CACHE SWEPT (KL-10 ONLY) CPTUC: BLOCK 1+5+5 ;TOTAL UUOS CPFBI: BLOCK 1 ;DISK (FILE) BLOCKS INPUT CPFBO: BLOCK 1+5+5 ;DISK (FILE) BLOCKS OUTPUT CPSBI: BLOCK 1 ;DISK (SWAP) BLOCKS INPUT CPSBO: BLOCK 1+5+5 ;DISK (SWAP) BLOCKS OUTPUT CPTFI: BLOCK 1 ;MAGTAPE "BLOCKS" INPUT CPTFO: BLOCK 1+5+5 ;MAGTAPE "BLOCKS" OUTPUT CPMHD: BLOCK 1 ;DOUBLE WORD CLOCK RATE (MHZ) CPMHZ: BLOCK 1+5+5 ;SINGLE WORD CLOCK RATE (MHZ) ;CPMHD ALWAYS 0 SO CAN DDIV IN CPLQR ;THE KL-10 PERFORMANCE ANALYSIS COUNTS ;NOTE THEY ARE INDEXED "STRAIGHT" - THEY ARE NOT INTERLEAVED CP0PAV: BLOCK ^D16*4 ;CPU0 BACKGROUND PERFORMANCE ANALYSYS CP1PAV: BLOCK ^D16*4 ;CPU1 BACKGROUND PERFORMANCE ANALYSYS CP2PAV: BLOCK ^D16*4 ;CPU2 BACKGROUND PERFORMANCE ANALYSYS CP3PAV: BLOCK ^D16*4 ;CPU3 BACKGROUND PERFORMANCE ANALYSYS CP4PAV: BLOCK ^D16*4 ;CPU4 BACKGROUND PERFORMANCE ANALYSYS CP5PAV: BLOCK ^D16*4 ;CPU5 BACKGROUND PERFORMANCE ANALYSYS NABYI: BLOCK 1 ;ANF NETWORK BYTES RECEIVED NABYO: BLOCK 1 ;ANF NETWORK BYTES TRANSMITTED NDBYI: BLOCK 1 ;DECNET NETWORK BYTES RECEIVED NDBYO: BLOCK 1 ;DECNET NETWORK BYTES TRANSMITTED NEBYI: BLOCK 1 ;ETHERNET BYTES RECEIVED NEBYO: BLOCK 1 ;ETHERNET BYTES TRANSMITTED NEDGI: BLOCK 1 ;ETHERNET DATAGRAMS RECEIVED NEDGO: BLOCK 1 ;ETHERNET DATAGRAMS TRANSMITTED SCNRI: BLOCK 1 ;NUMBER OF RECEIVED CHARACTERS SCNXI: BLOCK 1 ;NUMBER OF TRANSMITTED CHARACTERS IPCTS: BLOCK 1 ;NUMBER OF IPCF PACKETS TRANSFERED IPTWT: BLOCK 1 ;NUMBER OF WORDS IN WORD-MODE PACKETS IPTPT: BLOCK 1 ;NUMBER OF PAGES IN PAGE-MODE PACKETS IFN FTNET,< ;NETWORKS STATISTICS INCREMENTAL DISPLAY DATA NTXTP: BLOCK ^D10 ;UNNUMBERED CONTROL SENT NTRTP: BLOCK ^D10 ;UNNUMBERED CONTROL RECEIVED NTXMT: BLOCK ^D10 ;NUMBERED CONTROL SENT NTRMT: BLOCK ^D10 ;NUMBERED CONTROL RECEIVED NTXDL: BLOCK ^D12 ;MESSAGES SENT BY LENGTH NTRDL: BLOCK ^D12 ;MESSAGES RECEIVED BY LENGTH NTRTL: BLOCK 1 ;TOTAL MESSAGES RECEIVED NTXTL: BLOCK 1 ;TOTAL MESSAGES TRANSMITTED NTRTH: BLOCK 1 ;TOTAL DATA MESSAGES RECEIVED NTXTH: BLOCK 1 ;TOTAL DATA MESSAGES SENT > ;END IFN FTNET UPTIME: 0 ;UPTIME OF SYSTEM IN JIFFIES UPTINC: BLOCK 1 ;UPTIME (MAYBE INCREMENTAL) THED: BLOCK 3 LOGOHD: BLOCK 3 ;LOG FILE RING HEADER ;THE SEQUENCE OF JOBN SEGN AND BOTH MUST NOT BE CHANGED NOR MUST ;OTHER ENTRIES BE INSERTED TSIZE: JOBN: 0 SEGN: 0 BOTH: 0 JBNMAX: BLOCK 1 ;LARGEST JOB NUMBER IN USE CORMAX: BLOCK 1 ;LARGEST SIZE FOR SINGLE JOB MAXMAX: BLOCK 1 ;TOTAL PHYSICAL USER MEMORY AVAILABLE PHYMAX: BLOCK 1 ;MAX POSSIBLE MAXMAX JBUBZR: ;START OF JOB USAGE FIGURES CLEARED EACH PASS JBNUSE: BLOCK 1 ;NUMBER OF JOBS IN USE JBNLOG: BLOCK 1 ;NUMBER OF JOBS LOGGED-IN JBNDET: BLOCK 1 ;NUMBER OF JOBS DETACHED ACTUSE: BLOCK 1 ;TOTAL MEMORY USED BY "ACTIVE" JOBS DSKUSE: BLOCK 1 ;TOTAL DSK (SWAP) MEMORY USED PHYUSE: BLOCK 1 ;TOTAL PHYSICAL (WORKING SET) MEMORY USED VIRUSE: BLOCK 1 ;TOTAL VIRTUAL MEMORY USED SHRSAV: BLOCK 1 ;MEMORY SAVED BY SHARING JRNRN: BLOCK 1 ;JOBS RUNNING ACTIVELY JRNIO: BLOCK 1 ;JOBS RUNNING OR IO BLOCKED JRNSL: BLOCK 1 ;JOBS NOT ^C'ED JBUEZR==.-1 ;END OF JOB USAGE FIGURES CLEARED EACH PASS SLQ: BLOCK 1 ;"SL" STATE Q CODE TIQ: BLOCK 1 ;"TI" STATE Q CODE EWQ: BLOCK 1 ;"EW" STATE Q CODE LOKCHK: BLOCK 1 ;CHECKED FOR LOCKED SEGMENT FLAG SEGPTR: 0 ZERLOW: 0 ZERHGH: 0 TCKSEC: 0 STATES: 0 GTTSLF: 0 MONVER: 0 ;VERSION OF RUNNING MONITOR FREAK: 0 ;FREQUENCY OF LINE CLOCK JIFFIES VMPPB0: 0 ;SECTION-0 PER-PROCESS BEGIN ADDRESS VMPPE0: 0 ;SECTION-0 PER-PROCESS END ADDRESS VMPPB1: 0 ;SECTION-1 PER-PROCESS BEGIN ADDRESS VMPPE1: 0 ;SECTION-1 PER-PROCESS END ADDRESS ME: 0 MYJOB: 0 OPR: 0 LINE: 0 COL: 0 BOTTOM: 0 WINDOW: 0 LTEND: 0 LTTEND: 0 RTEND: 0 RELCKC: 0 ;COUNT UP TO RELEASE /V TABCTR: 0 ;COUNTER OF TABS IN THIS LINE SO FAR PROGRM: 0 ;WHICH DISPLAY PROGRAM CURFS: 0 ;CURRENT FILE STRUCTURE CURUN: 0 ;CURRENT UNIT NAME CURUN2: BLOCK 1 ;CURRENT UNIT "PRIME" PORT NAME DSKBLK: BLOCK DSKBKL ;DSKCHR UUO BLOCK SWPTAB: BLOCK SWPTLN ;SWAPPING UNIT TABLE PTYOFS: 0 DUAL: 0 ;-1 IF DUAL PROCESSOR SYSTEM ELSE 0 QSRPID: BLOCK 1 ;PID FOR [SYSTEM]QUASAR IPCBLK: BLOCK .IPCFP+1;IPCF PACKET HEADER BLOCK ;PRINT CONTROL VARIABLES ;ONLY USED BY F DISPLAY CURRENTLY(FIRJOB BY N DISPLAY) VISIBL: Z ;MIN 1 WHEN CURRENT LINE IS VISIBLE ;EQL 0 WHEN SCREEN IS FULL ;PLS 1 WHEN LINE IS BELOW OUR HORIZONT ;MANIPULATED BY ICRLF &STROLL HDRVAL: Z ;ZERO IF NO HEADER HAS BEEN DELAYED ELSE ADDRESS ;OF HEADER STRING GENERATOR NLTYPD: Z ;NUMBER OF LINES TYPED ON SCREEN CLINE: Z ;LOGICAL LINE NUMBER E.G. JOB NUMBER +HEADER LENGTH LSTLNE: Z ;LAST LINE NOT TYPED FIRJOB: Z ;FIRST LINE VISIBLE IN CURRENT WINDOW EATCNT: BLOCK 1 ;LINES TO EAT (EMSG) SLINE: Z ;SAVE REMAINDER ON SCREEN HERE SBOTTM: Z ;SAVE OLD BOTTOM VALUE .FRAJR: Z ;AUTO JOB ROLL FACILITY .FRAJS: Z ;JOBS SKIPPED DURING AUTO ROLL PTYMAX: BLOCK 1 PDBPTR: BLOCK 1 ;ADDR OF LIST OF PDB'S +400000 BIT FOR SPYING ;LH=N1 TO OFFSET FOR THE DESIRED JOB SPYSIZ: BLOCK 1 ;MAX EXEC VIRTUAL ADDRESS (LOSEG) WE CAN SPY REALTT: BLOCK 1 ;-1 IF REAL TTY NAME DESIRED TRSHLD: 0 ;[610] RUNTIME THRESHOLD VALUE (= 1/100 SECONDS) NUMBER: BLOCK 1 ;NUMBER FOR COMMAND (E.G., "W") NUMFLG: BLOCK 1 ;NUMBER FOR COMMAND WAS TYPED HPQCMD: BLOCK 1 ;HPQ LEVEL FROM SET HPQ COMMAND NETMNY: BLOCK 1 ;.GT. 0 IF NEED TO COMPRESS SCREEN DCHOFF: BLOCK 1 ;LDB OFFSET FOR LDBDCH LTBOFF: BLOCK 1 ;SECTION OFFSET FOR LDBS XDBBLK: BLOCK XDBLEN ;SCRATCH DATA BLOCK FLPBLK: BLOCK FLPLEN ;FILOP. BLOCK LKEBLK: BLOCK LKELEN ;LOOKUP/ENTER BLOCK SUBTTL Low segment -- DCN Stuff KNONOD: BLOCK ^D1028 ; Block for DNET. Function .DNLNN NODSTA: BLOCK .DNNLN ; Block for DNET. function .DNNDI DNTBLK: BLOCK .DNSLN ; Block for DNET. function .DNSLS TRMBLK: BLOCK 4 ; TRMOP. Block SAVCRL: BLOCK 1 ; Storage for TTY CRLF ;ETHERNET DATA STORAGE IFN FTNET,< ENTBLK: BLOCK .ETAR2+1 ;ETHNT. UUO ARGUMENT BLOCK RCLBFL==^D5 ;SIZE OF READ CHANNEL LIST BUFFER RCLBUF: BLOCK RCLBFL ;READ CHANNEL LIST BUFFER RCIBFL==^D5 ;SIZE OF READ CHANNEL INFO BUFFER RCIBUF: BLOCK RCIBFL ;READ CHANNEL INFO BUFFER RCCBFL==^D50 ;SIZE OF READ CHANNEL COUNTERS BUFFER RCCBUF: BLOCK RCCBFL ;READ CHANNEL COUNTERS BUFFER RKLBFL==^D5 ;SIZE OF READ KONTROLLER LIST BUFFER RKLBUF: BLOCK RKLBFL ;READ KONTROLLER LIST BUFFER RKIBFL==^D10 ;SIZE OF READ KONTROLLER INFO BUFFER RKIBUF: BLOCK RKIBFL ;READ KONTROLLER INFO BUFFER RKCBFL==^D50 ;SIZE OF READ KONTROLLER COUNTERS BUFFER RKCBUF: BLOCK RKCBFL ;READ KONTROLLER COUNTERS BUFFER RPLBFL==^D20 ;SIZE OF READ PORTAL LIST BUFFER RPLBUF: BLOCK RPLBFL ;READ PORTAL LIST BUFFER RPIBFL==^D20 ;SIZE OF READ PORTAL INFO BUFFER RPIBUF: BLOCK RPIBFL ;READ PORTAL INFO BUFFER RPCBFL==^D50 ;SIZE OF READ PORTAL COUNTERS BUFFER RPCBUF: BLOCK RPCBFL ;READ PORTAL COUNTERS BUFFER DGMXMT: BLOCK RCLBFL+RKLBFL+RPLBFL ;DATAGRAM TRANSMITTED COUNTS DGMRCV: BLOCK RCLBFL+RKLBFL+RPLBFL ;DATAGRAM RECEIVED COUNTS DGMFQE: BLOCK RCLBFL+RKLBFL+RPLBFL ;DATAGRAM FREE QUEUE ERROR COUNTS >; END IFN FTNET ;LAT DATA STORAGE IFN FTNET,< LASARG: BLOCK .LAQUA+1 LASCBF: BLOCK ^D26 LASBUF: BLOCK ^D20*7 >; END IFN FTNET SUBTTL Low segment -- CI Stuff CIVARB:! ;BEGINNING OF CI VARIABLES CPUPTR: BLOCK 1 ;AOBJN POINTER FOR LEGAL CPUS CPULNN: BLOCK 6 ;LOCAL CI NODE NUMBER FOR EACH CPU SCSBLK: BLOCK 20 ;GENERAL SCS. UUO BLOCK CTRBLK: BLOCK 6*NOSTCT ;STATISTICS COUNTERS (PER CPU) CIVARE==.-1 ;END OF CI VARIABLES CTRSAV: BLOCK 6*NOSTCT ;SAVED COPY OF STATISTICS COUNTERS CTRSVE==.-1 ;END OF SAVE COUNTERS AREA LZER==.-1 XLIST ;THE LITERALS LIT LIST REPEAT 0,< IF1,< IFE V.DISP-V.DVT6, IFE V.DISP-V.DV5A, IFE V.DISP-V.DV5B, IFE V.DISP-V.DVBX, IFE V.DISP-V.DV50, IFE V.DISP-V.DV52, IFE V.DISP-V.DV61, IFE V.DISP-V.ANSI, IFE V.DISP-V.DHZL, IFE V.DISP-V.DDLT, > ;END OF IF1 > ;END OF REPEAT 0 END SYSDPY