;***************************************************************************;
; ;
; MSTAT ;
; Displays dynamic memory map for all jobs ;
; ;
;***************************************************************************;
;Copyright (C) 1986 by UltraSoft. All Rights Reserved.
;
;Written by: David Pallmann
;
;Edit History:
;1.0 29-Oct-86 created. /DFP
;1.0A 31-Oct-86 correct bug where mor than seven job names were displayed. /DFP
VMAJOR=1
VMINOR=0
VSUB=1
SEARCH SYS
SEARCH SYSSYM
SEARCH TRM
MEM=A5
.OFINI
.OFDEF HASH,7*4 ; memory hash totals for 7 jobs
.OFDEF OFFSET,4 ; starting job offset
.OFDEF BUFFER,12. ; pack-unpack buffer
.OFDEF FLAGS,2 ; flags:
F$HIGH=1 ; high intensity
.OFSIZ MEMSIZ
DEFINE CURSOR ROW,COL
MOVB ROW,D1
ROLW D1,#8.
MOVB COL,D1
TCRT
ENDM
DEFINE TCALL CODE
MOVW #-1_8.+CODE,D1
TCRT
ENDM
DEFINE CLS=TCALL 0
DEFINE HOME=TCALL 1
DEFINE CLREOL=TCALL 9.
DEFINE LOW=TCALL 11.
DEFINE HIGH=TCALL 12.
DEFINE GRAFIX=TCALL 23.
DEFINE TEXT=TCALL 24.
DEFINE CURON=TCALL 28.
DEFINE CUROFF=TCALL 29.
DEFINE TLCORN=TCALL 38.
DEFINE TRCORN=TCALL 39.
DEFINE BLCORN=TCALL 40.
DEFINE BRCORN=TCALL 41.
DEFINE TINTER=TCALL 42.
DEFINE RINTER=TCALL 43.
DEFINE LINTER=TCALL 44.
DEFINE BINTER=TCALL 45.
DEFINE HLINE=TCALL 46.
DEFINE VLINE=TCALL 47.
;allocate impure area
START: PHDR -1,,PH$REE!PH$REU ; program heaer
GETIMP MEMSIZ,MEM
;set image mode, no-echo, no function key translation
TERM: JOBIDX
MOV JOBTRM(A6),A6
ORW #T$IMI!T$ECS!T$XLT,T.STS(A6)
;clear screen, draw graphics border
SCREEN: LEA A0,HASH(MEM)
MOV #7,D0
4$: CLR (A0)+
SOB D0,4$
CLS
HIGH
MOVW #F$HIGH,FLAGS(MEM)
CUROFF
GRAFIX
HOME
TLCORN
MOV #76.,D0
5$: HLINE
SOB D0,5$
TRCORN
CURSOR #2,#1
VLINE
CURSOR #2,#78.
VLINE
CURSOR #3,#1
LINTER
MOV #7,D0
41$: MOV #10.,D2
42$: HLINE
SOB D2,42$
CMP D0,#1
BEQ 43$
TINTER
SOB D0,41$
43$: RINTER
MOV #3,D2
7$: INC D2
MOV #8.,D4
MOV #1,D3
8$: CURSOR D2,D3
VLINE
ADD #11.,D3
SOB D4,8$
CMP D2,#23.
BLO 7$
CURSOR #23.,#1
BLCORN
MOV #7.,D0
81$: MOV #10.,D2
82$: HLINE
SOB D2,82$
CMP D0,#1
BEQ 83$
BINTER
83$: SOB D0,81$
BRCORN
TEXT
CALL LOW
CURSOR #24.,#35.
TYPE MemorySTAT
CALL HIGH
;output job name headers
JOBHDR: MOV #4,D2
MOV JOBTBL,A0
MOV OFFSET(MEM),D0
BEQ 14$
10$: MOV (A0)+,D7
BEQ 10$
BMI 20$
SOB D0,10$
14$: MOV #7,D0
20$: MOV (A0)+,D7
BEQ 20$
BMI SCAN
MOV D7,A1
LEA A1,JOBNAM(A1)
LEA A2,BUFFER(MEM)
UNPACK
UNPACK
CLRB @A2
CURSOR #2,D2
TTYL BUFFER(MEM)
ADD #11.,D2
SOB D0,20$
;scan memory partitions of the seven (or less) "active" jobs
SCAN: CTRLC EXIT
JOBIDX
MOV JOBTRM(A6),A6
TST T.ICC(A6)
JNE CHAR
LEA A0,HASH(MEM)
MOV JOBTBL,A1
MOV OFFSET(MEM),D0
BEQ 20$
10$: MOV (A1)+,D7
BEQ 10$
BMI 20$
SOB D0,10$
20$: MOV #7,D0
MOV #2,D2
LOOP: MOV (A1)+,D7
BEQ LOOP
JMI SLEEP
MOV D7,A4
MOV JOBSIZ(A4),D3
JEQ EMPTY
CLR D5
MOV JOBBAS(A4),A3
20$: MOV @A3,D7
BEQ 30$
ADD D7,D5
ADD D7,A3
BR 20$
30$: CMM D5,@A0
BEQ NEXT
MOV D5,@A0
MOV JOBBAS(A4),A3
MOV #4,D3
40$: TST @A3
BEQ 50$
CURSOR D3,D2
SAVE A1
LEA A1,6(A3)
LEA A2,BUFFER(MEM)
UNPACK
UNPACK
MOVB #'.,(A2)+
UNPACK
CLRB @A2
MOVW 4(A3),D6
ANDW #FIL,D6
BEQ 41$
CALL HIGH
BR 42$
41$: CALL LOW
42$: TTYL BUFFER(MEM)
REST A1
INC D3
CMP D3,#24.
BEQ NEXT
MOV @A3,D7
BEQ 50$
ADD D7,A3
BR 40$
50$: CURSOR D3,D2
TYPE < >
INC D3
CMP D3,#23.
BLO 50$
NEXT: ADD #4,A0
ADD #11.,D2
DEC D0
JNE LOOP
SLEEP: CTRLC EXIT
SLEEP #1000.
JMP SCAN
EMPTY: TST @A0
JEQ NEXT
MOV #4,D3
10$: CURSOR D3,D2
TYPE < >
INC D3
CMP D3,#23.
BLO 10$
CLR @A0
JMP NEXT
;get char from terminal
CHAR: KBD EXIT
UCS
CMPB D1,#'^-'@ ; HOME goes to beginning of job list
JEQ HOME
CMPB D1,#'H-'@ ; left arrow scrolls left
JEQ SLEFT
CMPB D1,#'L-'@ ; right arrow scrolls right
JEQ SRIGHT
CMPB D1,#33 ; ESCape exits
JEQ EXIT
CMPB D1,#'C-'@ ; ^C exits
JEQ EXIT
CMPB D1,#'Q ; Q exits
JEQ EXIT
CMPB D1,#'R ; R redisplays screen
JEQ SCREEN
JMP SCAN
;back to start of job list
HOME: CLR OFFSET(MEM)
JMP SCREEN
;shift display left a job
SLEFT: TST OFFSET(MEM)
JEQ SCAN
DEC OFFSET(MEM)
JMP SCREEN
;shift display right a job
SRIGHT: INC OFFSET(MEM)
JMP SCREEN
;exit
EXIT: CURON
CURSOR #24.,#1
CLREOL
HIGH
EXIT
;set low intensity - does no unnecessary I/O
LOW: MOVW FLAGS(MEM),D7
ANDW #F$HIGH,D7
BEQ 10$
LOW
ANDW #^C<F$HIGH>,FLAGS(MEM)
10$: RTN
;set high intensity - does no unnecessary I/O
HIGH: MOVW FLAGS(MEM),D7
ANDW #F$HIGH,D7
BNE 10$
HIGH
ORW #F$HIGH,FLAGS(MEM)
10$: RTN
END