.PAGE
;******************************************************
;*						      *
;*		  DISPLAY COMMAND		      *
;*						      *
;*  COPYRIGHT (c) 1982, 1983 SAGE Computer Technology *
;*  All Rights Reserved				      *
;*						      *
;******************************************************

CMD
	LEA	SCMD,A1		;Find command in table
	BRA	SRCHCMND

;DM [$X+]XXXXXX [$X,#]XXXXXX
; - Display memory starting at arg 1 until arg 2

CMDM:
	BSR	SKIPSPAC	;Move to first nonspace
	MOVE.L	LASTMEM,D4	;Get old memory
	MOVEA.W LASTBASE,A4	;Get old base register
	MOVE.B	(A0),D0		;Any characters there
	BEQ.S	$02		;No input
	BSR	CNVTADDR	;Decode first argument
	BNE	CMNDERRA	;Error in command
				;Error - # not legal for 1st arg
	MOVE.L	A1,D4		;Save address register
	MOVEA.L A2,A4		;Save base register offset
	MOVE.W	A2,LASTBASE	;Set current base register
$02
	BSR	SKIPSPAC	;Move to next command group
	MOVEA.W #100H,A1	;Set number of bytes to print
	MOVE.B	(A0),D0		;End of line reached
	BEQ.S	$04
	BSR	CNVTADDR	;Get ending address
	BMI	CMNDERRA	;Illegal number
	BEQ.S	$05		;Number not #
$04
	ADDA.L	D4,A1		;Compute ending address
	SUBQ.L	#1,A1
$05
	ADDQ.L	#1,A1		;Compute end of transfer
	MOVE.L	A1,LASTMEM	; and next display address
	MOVE.L	A1,D5
	
;Print memory

$1
	BSR.S	DISPMEM		;Display memory
	BEQ.S	$6		;Done
	MOVE.L	A3,D4		;Move to next group
	BSR	TESTTERM	;Any characters waiting
	BEQ	$1		;No - continue with next line
$5
	BSR	KEYBCH		;Get awaiting char
	CMPI.B	#CNTRLS,D0	;Break character
	BEQ	$5		;Yes - await next char
	CMPI.B	#CNTRLC,D0	;Escape character?
	BNE	$1		;No - print next line
$6
	RTS

;Display block of memory (16 byte maximum, one line)

;			D4 : Physical memory address
;			A4 : Base register index
;			D5 : Maximum address to print
;	BSR	DISPMEM
;			D0 : ?
;			D3 : ? (used as max line counter)
;			D4 : Physical memory start address
;			D5 : Maximum address to print
;			A3 : Next memory block
;			A4 : Base register index
;			EQ : Printed all chars up to D5

DISPMEM
	BSR	TERMCRLF
	MOVE.L	D4,D0		;Print absolute address
	BSR	TERMHEXL
	CMPA.W	#BASEADDR,A4	;Is base register $0?
	BEQ.S	$1		;Yes, don't print relative stuff
	BSR	TERMSPAC
	MOVE.L	D4,D0		;Print relative address
	SUB.L	(A4),D0
	BSR	TERMHEXL
$1
	BSR	TERMCOLN	;Delineate address
	MOVEQ	#15.,D3		;16 bytes / line
	MOVEA.L D4,A3
$2
	EXG	A3,A1		;Move memory address into A1
	BSR	CHKMEM		;Verify memory is good
	EXG	A3,A1		;Restore registers
	BNE	CMNDERRA	;Memory bad
	MOVE.B	(A3)+,D0	;Print byte
	BSR	TERMHEXB
	BTST	#0,D3		;Print word
	BNE	$25
	BSR	TERMSPAC
$25
	CMP.L	A3,D5		;Done?
	DBEQ	D3,$2

; Print character equivalent

	BSR	TERMSPAC	;Skip 2 spaces before starting
	MOVEQ	#15.,D3		;16 chars / line
	MOVEA.L D4,A3		;Starting at beginning
$3
	MOVE.B	(A3)+,D0	;Get char
	BSR	PRNTCHAR	;Convert to printable char
	BSR	TERMCHAR	;Print char
	CMP.L	A3,D5		;Done
	DBEQ	D3,$3		;Repeat until done of eol
	RTS

;D$X - Display base register(s)

CMDB
	LEA	BASEADDR,A1
	MOVE.W	#" $",D1
	MOVEQ	#MAXBASE-1,D2		;Max size = 2
	BRA.S	CMDDDX
	
;DAX - Display register A register(s)

CMDA
	LEA	REGA,A1		;Display A registers
	MOVE.W	#REGNA,D1
	BRA.S	CMDDD
	
;DDX - Displays D register(s)

CMDD
	LEA	REGD,A1		;Display D registers
	MOVE.W	#REGND,D1
CMDDD
	MOVEQ	#7,D2		;Max register # = 7
CMDDDX
	BSR	GETCHAR		;Get register to display (if any)
	BEQ.S	CMDAA		;No register - Display all registers
	SUB.B	#ZERO,D0	;Convert to binary
	BMI	CMNDERRA	;Number to small
	MOVEQ	#0,D4
	MOVE.B	D0,D4		;Set register to print
	CMP.B	D2,D4		;> Max register
	BGT	CMNDERRA	;Yes - report error
	BSR.S	DISPREG
	BSR	TERMCRLF
	RTS
	
;Display all registers of same type 

CMDAA
	CLR.L	D4		;Print all registers
	BSR.S	DISPREG		;Display register
$1
	ADDQ.L	#1,D4		;Move to next register
	BSR	TERMSPAC
	CMPI.B	#4,D4		;Extra space in middle
	BNE.S	$2
	BSR	TERMSPAC
$2
	BSR.S	DISPVAL		;Print next register
	CMP.B	D2,D4		;Done
	BLT	$1		;Repeat until done
	RTS
	
;Display a given register

DISPREG
	BSR	TERMCRLF	;Start on new line
	CLR.L	D3		;Enable print register number
DISPREGC
	MOVE.W	D1,D0		;Output register type
	LSR.L	#8,D0
	CMPI.B	#SPACE,D0	;Skip space
	BEQ	$05
	BSR	TERMCHAR
$05
	MOVE.B	D1,D0
	BSR	TERMCHAR
	
	OR.L	D3,D3		;Print register number?
	BNE.S	$1		;No
	MOVE.B	D4,D0		;Print register number
	BSR	TERMDIGT
$1
	BSR	TERMCOLN	;Print ': '
DISPVAL
	MOVE.L	D4,D0		;Convert base reg # to offset
	ASL.L	#2,D0
	ANDI.L	#0FFH,D0
	TST.L	D3		;16 or 32 bits?
	BPL.S	$2		;32 bits
	MOVE.W	0(A1,D0),D0	;Print 16 bit register value
	BSR	TERMHEXW
	
	CMPI.W	#"SR",D1	;Status register?
	BNE.S	$3		;No - Skip
	MOVEM.L D1-D3/A1,-(A7)	;Save working registers
	MOVE.W	D0,D3		;Set status bits
	BSR	TERMSPAC	;Print (
	MOVEQ	#"(",D0
	BSR	TERMCHAR
	CLR.L	D2		;Clear shift register
	LEA	STAT,A1		;Set status table 
$4
	MOVE.B	(A1)+,D2	;Get shift count
	BEQ.S	$5		;Done
	MOVE.B	(A1)+,D0	;Get status character
	ROL.W	D2,D3
	BCS.S	$6		;Print character if flag set
	MOVEQ	#" ",D0		;Print space if flag not set
$6
	BSR	TERMCHAR	;Print flag character
	BRA.S	$4
$5
	MOVEM.L (A7)+,D1-D3/A1	;Restore working registers
	MOVEQ	#")",D0		;Print )
	BSR	TERMCHAR
	BRA.S	$3
$2
	MOVE.L	0(A1,D0),D0	;Print 32 bit register value
	BSR	TERMHEXL
$3
	RTS
	
;DR - Displays all registers

CMDR
	BSR	GETCHAR		;No more chars allowed
	BNE	CMNDERRA
	BSR	CMDA		;Display A registers
	BSR	CMDD		;Display D registers
	BSR.S	CMDPC		;Display Program Counter
	BSR.S	$1		;Delineate fields
	BSR.S	CMDUS1		;Display User Stack
	BSR.S	$1		;Delineate fields
	BSR.S	CMDSR1		;Display Status Register
	RTS
$1
	BSR	TERMSPAC
	BSR	TERMSPAC
	RTS
DSPCRLF
	BRA	TERMCRLF	;Short access to CRLF
	
;DP - Print Program Counter

CMDPC
	BSR	DSPCRLF
	MOVE.B	#"P",D0		;Print 'PC: '
	BSR	TERMCHAR
	MOVE.B	#"C",D0
	BSR	TERMCHAR
	BSR	TERMCOLN
	MOVE.L	REGPC,D0	;Get contents of PC
	MOVEA.W LOCCNTR,A0	; and address of base register
	BRA	PRNTADDR	;Display them
	
;DS - Print Program status register

CMDSR
	BSR	DSPCRLF
CMDSR1
	MOVEQ	#-1,D3		;Set 16 bit display
	LEA	REGSR,A1
	MOVE.L	#"SR",D1
	BRA.S	CMDREGA
	
;DU - Print User stack

CMDUS
	BSR	DSPCRLF
CMDUS1
	LEA	REGUS,A1
	MOVE.L	#"US",D1

;Display command register

CMDREG
	MOVEQ	#1,D3		;Disable display register number
CMDREGA
	CLR.L	D4		;Only register 1 exist
	BSR	DISPREGC	;Display register
	RTS
	
;DB - Display break points

CMDBR
	MOVEQ	#0,D6		;Set display only flag
	BRA	PRCBRKPT	;Process break point control

;DT - Display TRAP-tracing status

CMDT
	MOVEQ	#0,D0		;First TRAP to display
	MOVEQ	#16.,D1		;Last TRAP (+1) to display
	TST.B	(A0)		;Any more characters?
	BEQ.S	$1		;No, display all TRAPs
	BSR	GETNUM		;Find out which TRAP to display
	BMI	CMNDERRA
	MOVE.B	D0,D1		;Set to display this TRAP only
	
$1
	BSR	DISPTRAP	;Display TRAP tracing status
	ADDQ.B	#1,D0		;Display next TRAP
	CMP.B	D1,D0		;Are we done?
	BLT	$1
	BSR	TERMCRLF
	RTS
	
;Subroutine to display TRAP-tracing status

DISPTRAP
	BSR	TERMCRLF
	LEA	DTMSG1,A0	;Print "TRAP #"
	BSR	TERMTEXT
	BSR	TERMDIGT	;Print the TRAP number in one hex digit
	LEA	DTMSG2,A0	;Print "No trace"
	MOVE.W	TTARRAY,D2	;Do we trace this TRAP?
	BTST	D0,D2
	BEQ.S	$1		;No
	LEA	DTMSG3,A0	;Print "Trace"
$1
	BSR	TERMTEXT
	RTS
	
DTMSG1
	.ASCII	"TRAP #"
	.BYTE	0
DTMSG2
	.ASCII	"  No trace "
	.BYTE	0
DTMSG3
	.ASCII	"  Trace    "
	.BYTE	0
	.ALIGN	2

                                                                                                                                                         