1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-01-31 05:42:03 +00:00
Files
PDP-10.stacken/files/stacken-tape-backup/dskb:10_7/sysdpy/sysdpy.mac
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

8202 lines
250 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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=<T4==4>
J=<P4==5>
JS=<XCUR==6>
P1==6
P2==3
R=<YCUR==7>
N=<X==10>
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 <V.DISP-V.DV5A>*<V.DISP-V.DV5B>,<
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 <V.DISP-V.DV5A>*<V.DISP-V.DV5B>
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 <NUM><0>,<...X==^D00>
IFIDN <NUM><1>,<...X==^D01>
IFIDN <NUM><2>,<...X==^D02>
IFIDN <NUM><3>,<...X==^D03>
IFIDN <NUM><4>,<...X==^D04>
IFIDN <NUM><5>,<...X==^D05>
IFIDN <NUM><6>,<...X==^D06>
IFIDN <NUM><7>,<...X==^D07>
IFIDN <NUM><8>,<...X==^D08>
IFIDN <NUM><9>,<...X==^D09>
IFIDN <NUM><A>,<...X==^D10>
IFIDN <NUM><B>,<...X==^D11>
IFIDN <NUM><C>,<...X==^D12>
IFIDN <NUM><D>,<...X==^D13>
IFIDN <NUM><E>,<...X==^D14>
IFIDN <NUM><F>,<...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 <V.DISP-V.DV61>*<V.DISP-V.ANSI>,< ;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 <V.DISP-V.ANSI>*<V.DISP-V.DV5A>*<V.DISP-V.DV5B>*<V.DISP-V.DV61>*<V.DISP-V.DV52>,<
TLNN F,FL.REF ;SEE IF REFRESH CYCLE
JRST FINISQ ;NO--USE DIRECT CURSOR ADDRESSING
;YES--DO IT THE LONG WAY
> ;END OF IFE <V.DISP-V.ANSI>*<V.DISP-V.DV5A>*<V.DISP-V.DV5B>*<V.DISP-V.DV61>*<V.DISP-V.DV52>
IFE <V.DISP-V.ANSI>*<V.DISP-V.DVT6>*<V.DISP-V.DV5A>*<V.DISP-V.DV5B>*<V.DISP-V.DV61>*<V.DISP-V.DV50>*<V.DISP-V.DV52>,<
; 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 <V.DISP-V.DV5B>*<V.DISP-V.DVT6>,<
PUSHJ P,FILLIT ;ADD FILLERS
> ;END OF IFE <V.DISP-V.DV5B>*<V.DISP-V.DVT6>
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 <V.DISP-V.ANSI>*<V.DISP-V.DV5A>*<V.DISP-V.DV5B>*<V.DISP-V.DV61>*<V.DISP-V.DV52>*<V.DISP-V.DHZL>*<V.DISP-V.DDLT>,<
;
; BUFFER DUMP ROUTINE FOR ABSOLUTE POSITIONING DISPLAYS
; (HAZELTINE 2000, DELTA DATA TELTERM, VT05)
FINISQ: SETZB XCUR,YCUR
MOVSI J,-<XSIZE*YSIZE-1> ;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 <V.DISP-V.DV5A>*<V.DISP-V.DV5B>*<V.DISP-V.DHZL>*<V.DISP-V.DDLT>
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 <V.DISP-V.DV61>,<
XWD .CHCNR,RVIDEO
XWD .CHCNA,ALARM
>
IFE <V.DISP-V.ANSI>,< ;
XWD .CHCNR,RVIDEO ;
> ;
IF2,<
IFNDEF DEVPRG,<DEVPRG=FILPRG>
IFNDEF MEMPRG,<MEMPRG=NORMAL>
>
;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 <V.DISP-V.ANSI>*<V.DISP-V.DV61>,<POPJ P,> ;IF NOT VT61 JUST RETURN, ELSE
IFE <V.DISP-V.ANSI>*<V.DISP-V.DV61>,< ;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 <FF>
POPJ P, ;RETURN READY AND WILLING
LOGFLP: FO.PRV!<LOG,,.FOAPP> ;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 <CR>
PUSHJ P,LISCH ;TO END THIS LISTING LINE
MOVEI T2,.CHLFD ;AND A <LF>
PUSHJ P,LISCH ;TO END THE <CR><LF>
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 <NUL>
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 <NUL>
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
<ESC> 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 <TAB>
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==<XSIZE-^D40>/^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, <TAB>
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==<XSIZE-^D40>/^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,[<F%CMSR&777000000>+.GTFET] ;GET FTCMSR
PUSHJ P,GETZ ;FROM MONITOR
TRNN A,<F%CMSR&777777> ;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 <YSIZE-20>,< ;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 <YSIZE-20>
;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 <YSIZE-20>,< ;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 <YSIZE-20>
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,<<XSIZE-40>/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,[<F%SCA&777000000>+.GTFET] ;GETTAB FOR SCA FEATURE TEST
PUSHJ P,GETZ ;GET IT FROM MONITOR
TRNN A,<F%SCA&777777> ;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 <CRC:>,<POINT 36,16,35>
CTR <MVR PAR:>,<POINT 18,17,17>
CTR <CBUS PAR:>,<POINT 18,17,35>
CTR <REG PLIPE:>,<POINT 18,20,17>
CTR <DATA PLIPE:>,<POINT 18,20,35>
CTR <CHN:>,<POINT 18,21,17>
CTR <EBUS PAR:>,<POINT 18,21,35>
CTR <SPR CHN:>,<POINT 18,22,17>
CTR <CBUS AVL TMO:>,<POINT 18,22,35>
CTR <SPR RCV ATTN:>,<POINT 18,23,17>
CTR <SPR XMT ATTN:>,<POINT 18,23,35>
CTR <XMT BFR PAR:>,<POINT 18,24,17>
CTR <XMT TMO:>,<POINT 18,24,35>
>; END DEFINE CICTRS
DEFINE CTR(TEXT,PTR),<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,,<IPCPAG*1000>] ;BLT POINTER TO
BLT N,<IPCPAG*1000>+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,<IPCPAG*1000>+.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 <CR>?
JRST QUELO4 ;NO, REAL TEXT, DISPLAY IT
IBP M ;YES, EAT IT
IBP M ;AND ASSUMED <LF> FOLLOWING
JRST QUELO3 ;CHECK FOR MORE BLANK LINES
QUELO4: PUSHJ P,EMSG ;NO - GO DISPLAY THE TEXT
QUELO6: SOSG <IPCPAG*1000>+.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,<IPCPAG*1000>+.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,<XWD .DNNDI,.DNNLN> ; 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!<XWD .DNSLS,.DNSLN>; 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,<PAGE>
; PUSHJ P,CREPAG
; ERROR
; NORMAL
;
;WHERE <PAGE> 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,<PAGE>
; PUSHJ P,DESPAG
; ERROR
; NORMAL
;
;WHERE <PAGE> 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,<PAGE>
; PUSHJ P,RSTIPC
; RETURN
;
;WHERE <PAGE> 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,<PAGE>
; PUSHJ P,RECIPC
; ERROR
; NORMAL
;
;WHERE <PAGE> 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 <PAGE> 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 <PAGE>
;SNDIPC -- SEND AN IPCF MESSAGE PAGE
;CALL IS:
;
; MOVX A,<PAGE>
; MOVX B,<PID>
; PUSHJ P,SNDIPC
; ERROR
; NORMAL
;
;WHERE <PAGE> IS THE PAGE NUMBER OF THE MESSAGE PAGE TO BE SENT,
;AND <PID> 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 <V.DISP-V.ANSI>*<V.DISP-V.DVT6>*<V.DISP-V.DV5A>*<V.DISP-V.DV5B>*<V.DISP-V.DV61>*<V.DISP-V.DV50>*<V.DISP-V.DV52>, <;
;
; 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 <V.DISP-V.ANSI>*<V.DISP-V.DVT6>*<V.DISP-V.DV5A>*<V.DISP-V.DV5B>*<V.DISP-V.DV61>*<V.DISP-V.DV50>*<V.DISP-V.DV52>
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 <CR>
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 <V.DISP-V.DV5A>*<V.DISP-V.DV5B>, <
;
; 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 <V.DISP-V.DV5A>*<V.DISP-V.DV5B>
IFE <V.DISP-V.DVT6>*<V.DISP-V.DV5A>*<V.DISP-V.DV5B>,<
;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 <V.DISP-V.DVT6>*<V.DISP-V.DV5A>*<V.DISP-V.DV5B>
IFE V.DISP-V.DV5A,<
POPJ P, ;NO FILLERS ON VT05A
>; END IFE V.DISP-V.DV5A
IFE <V.DISP-V.DVT6>*<V.DISP-V.DV5B>,<
;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,<PUSHJ P,DPYOUT>
JRST DPYOUT
>; END OF IFE <V.DISP-V.DVT6>*<V.DISP-V.DV5B>
IFE <V.DISP-V.ANSI>*<V.DISP-V.DV61>*<V.DISP-V.DV50>*<V.DISP-V.DV52>,<
;
; DISPLAY SUBROUTINES FOR THE DIGITAL VT61
;
ESC61==33
IFN <V.DISP-V.DV50>,< ;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>," ",<ERASE&177>,<<ERASE_-^D9>&177>,0]
> ;
POPJ P,
> ;END OF NOT-VT50 CONDITIONAL
IFE <V.DISP-V.DV50>,< ;VT50'S ARE STUPID
HOMDWN: OUTSTR [BYTE (7)CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,CDOWN,<ERASE&177>,<<ERASE_-^D9>&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 <V.DISP-V.ANSI>*<V.DISP-V.DV61>*<V.DISP-V.DV50>*<V.DISP-V.DV52>
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,(<POINT 7>)
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 <CR>+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 <HOME>+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 <CR> CHARACTER
JRST DPYCOM ;GO TO COMMON ROUTINE
DPYHOM: SETZB XCUR,YCUR ;CLEAR CURRENT X & Y POSITIONS
MOVEI CH,24 ;GET A <HOME> 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 <HOME> 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,(<POINT 7>)
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,<ADR>
; MOVX J,<JOB>
; PUSHJ P,MPEEK
; RETURN
;
;WHERE <ADR> IS THE EXEC VIRTUAL ADDRESS TO BE READ. IF <ADR> 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,(<POINT 7>) ;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,<YSIZE/2> ;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 <VM(MAX=>
.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,<PERCENT*100>
; 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" <CR><LF>
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!<ORIGINAL VALUE>
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,<NUMBER>
; 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 <YSIZE*XSIZE/4>+1
DBFEND=.-1
IFE V.DISP-V.DVBX,<
DISBUF: BLOCK <YSIZE*XSIZE/5>+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,<PRINTX [End of pass 1 SYSDPY]>
IFE V.DISP-V.DV5A,<PRINTX [End of pass 1 SYSDPA]>
IFE V.DISP-V.DV5B,<PRINTX [End of pass 1 SYSDPB]>
IFE V.DISP-V.DVBX,<PRINTX [End of pass 1 SYSVBX]>
IFE V.DISP-V.DV50,<PRINTX [End of pass 1 SYSV50]>
IFE V.DISP-V.DV52,<PRINTX [End of pass 1 SYSV52]>
IFE V.DISP-V.DV61,<PRINTX [End of pass 1 SYSV61]>
IFE V.DISP-V.ANSI,<PRINTX [End of pass 1 SYSANS]>
IFE V.DISP-V.DHZL,<PRINTX [End of pass 1 SYSHZL]>
IFE V.DISP-V.DDLT,<PRINTX [End of pass 1 SYSDLT]>
> ;END OF IF1
> ;END OF REPEAT 0
END SYSDPY