;***************************************************************************;
;									    ;
;				    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