	ALWAYS	26MAR4	DISPLAY	<DISPLAY VIRTUAL MEMORY>			;26MAR4
	.MCALL	DIR$,PUT$S,CLOSE$,OPEN$W,QIOW$					;**-1
;************************************************************************
;*									*
;*	MODULE:  DISPLAY						*
;*									*
;*	FUNCTION:  DISPLAY A RANGE OF VIRTUAL MEMORY			*
;*									*
;*	INPUT PARAMETERS:						*
;*									*
;*	R0 POINTS TO THE COMMAND LINE IN PROCESS			*
;*									*
;*	OUTPUT PARAMETERS:						*
;*									*
;*	DESTROYS ALL REGISTERS						*
;*									*
;*	AUTHOR:  KEVIN ANGLEY						*
;*									*
;*	DATE:  02-SEP-80						*
;*									*
;* Modifications Record:						*
;* =====================						*
;* CJD01 13-Jul-83							*
;*	Change PRINT$ to CALL .PRINT, which may be in FCSRES (doesn't	*
;*	cost any more if it isn't).					*
;*									*
;* CJD02 Nov 83								*
;*	Support STEP option.						*
;*	Show program name and transfer address (if any).		*
;*	Change PUT$ to PUT$S for separate in/out overlays.		*
;*	Attach TI: (if output device) so that ctrl/O will work.		*
;*	Add DISPLAY ASCII ... option.					*
;*									*
;* CJD03 Jan 84								*
;*	Bring into line with Aug 82 version.				*
;*	Return cs on error.						*
;*									*
;************************************************************************
DISPLAY::
	CLRB	ERRFLG		; Assume success
	MOV	#PUTHX2,PUTSUB	; Default to hex byte display
	GETKEY	ASCII		; But see if it should be ASCII
	BNE	1$		; No, keep hex
	MOV	#PUTASC,PUTSUB	; Yes, use PUTASCII routine instead
1$:
	CALL	FROMTH		; COLLECT FROM/THRU/STEP
	BCS	11$ ; (255$)	;  CC: SUCCESS, CS: TAKE ERROR EXIT
	CMP	STEP,#1		; Unless not printing all values,
	BNE	3$		; when we must start exactly at address given
	BICB	#^B00001111,R1	; ROUND FROM ADDRESS DOWN TO XXX0
3$:	MOVB	(R0),R5		; TI:/FILE FLAG
	BNE	10$		; NE: MUST BE FILE
	MOV	#TI,%0		; SET UP TI: POINTER
	MOV	#IO.ATT,ATTDET+Q.IOFN ; Attach to TI:
	DIR$	#ATTDET		; So ^O will work
	BR	12$		; Do file parse for FDB setup
10$:
	GETKEY	FILE		; GET FILE KEYBOARD
	BCC	12$		; CC: GOT IT
	OUTPUT	MSK		; MISSING KEYWORD
11$:	COMB	ERRFLG		; Set error flag
	JMP	255$		; TAKE ERROR EXIT
12$:
	PUSH	RWFORMAT	; Save format number
	MOV	#F.LIST,RWFORMAT ; Change to list format temporarily (type .LST)
	CALL	PARSE		; PARSE FILE DESCRIPTOR
	POP	RWFORMAT	; Restore format code
	BCS	11$		;  CC: SUCCESS, CS: TAKE ERROR EXIT
15$:
	OPEN$W	#FDB		; OPEN FILE FOR WRITE
	BCC	20$		; CC: OPENED O.K.
	MOV	#FOE+FOELEN-4,%0 ; Address file error no
	MOV	FDB+F.ERR,%1
	CALL	PUTHX4		; Show number in hex
	OUTPUT	FOE		; FILE OPEN ERROR
	BR	11$ ; (255$)	; TAKE ERROR EXIT
20$:
	PUT$S	,,#0		; OUTPUT BLANK LINE
	MOV	#RECORD,%0	; Address start of record
	CMPB	PRGNAM,#SPACE	; See if there is a program name
	BEQ	22$		; Don't insert it if not
	MOV	#FNM+1,%1	; Else address "Name: PRGNAM       ", less CR
	MOV	#FNMLEN+7-1,%4	; Load count
21$:	MOVB	(%1)+,(%0)+	; Copy in name
	SOB	%4,21$
22$:	MOV	TRNSFR+2,%2	; Get transfer address hi
	PUSH	%2
	BIS	TRNSFR,(SP)+	; Unless 00000000
	BEQ	24$		; which means there isn't one
	MOV	#RDT+1,%1	; Address string "Transfer: ", less CR prefix
	MOV	#RDTLEN-8.-1,%4	; Load length
23$:	MOVB	(%1)+,(%0)+	; Copy string
	SOB	%4,23$
	MOV	TRNSFR,%1	; Get address lo
	CALL	PUTHXJ		; Add value in hex
24$:	MOV	FROM,%2		; Load first address
	SUB	#RECORD,%0	; Compute length
	BEQ	31$		; 0 means neither name nor transfer, no output
	MOV	%0,FDB+F.NRBD	; <>0, store length in FDB
	PUT$S	#FDB		; Show name/transfer address
30$:	PUT$S	,,#0		; and another blank line
31$:	MOV	#RECORD,R0	; FORMAT HEADER
	MOV	#"Ad,(R0)+	; PUT ADDR HEADER
	MOV	#"dr,(R0)+
	MOV	#"es,(R0)+
	MOV	#"s ,(R0)+
	CALL	SPACER		; PUT IN SPACES AFTER IT
	MOV	%2,%1		; Put out 16 headers
	BIC	#^C^B1111,%1	; from start address modulus 16
	MOV	#16.,R4
32$:
	CALL	SPACER		; SPACE BEFORE IT
	CALL	PUTHX2		; PUT 2 HEX DIGITS
	ADD	STEP,R1		; Advance by display step
	SOB	R4,32$		; FOR 16 TIMES
	SUB	#RECORD,R0	; COMPUTE COUNT
	MOV	R0,R1		; COUNT GOES INTO R1
	PUT$S	#FDB,,R1	; PUT THE HEADER
	BCS	245$		; CS: ERROR EXIT WITH CLOSE
	MOV	#RECORD,R0	; CHANGE NON-BLANKS TO HYPHEN
35$:
	CMPB	#SPACE,(R0)+	; IS IT A SPACE?
	BEQ	37$		; EQ: YES - LEAVE IT
	MOVB	#HYPHEN,-1(R0)	; REPLACE WITH HYPHEN
37$:
	SOB	R1,35$		; CONTINUE UNTIL DONE
	PUT$S	#FDB		; OUTPUT THE RECORD (same length)
	BCS	245$		; CS: ERROR EXIT WITH CLOSE
	PUT$S	,,#0		; OUTPUT BLANK LINE
	BCS	245$		; CS: ERROR EXIT WITH CLOSE
40$:				; OUTPUT LINE OF MEMORY
	MOV	#RECORD,R0
	PUSH	R3		; SAVE COUNT
	CALL	UNOFFSET	; UN-OFFSET
	PUSH	R2		; SAVE OFFSETTED ADDRESS
	MOV	R3,R1		; PUT REAL 32-BIT ADDRESS IN R1/R2
	MOV	R4,R2
	CALL	PUTHXJ		; PUT OUT THE ADDRESS
	CALL	SPACER 		; SPACE AFTER IT
	POP	R2		; RESTORE OFFSETTED ADDRESS
	POP	R3		; RESTORE COUNT
	MOV	#16.,R4		; PUT OUT 16. BYTES
45$:
	CALL	SPACER		; SPACE BEFORE IT
	MOVB	MEMORY(R2),R1	; LOAD THE BYTE
	CALL	@PUTSUB		; Put it out in required format
	ADD	STEP,R2		; Increment from address
	SOB	R4,45$		; PUT OUT 16. BYTES
	SUB	#RECORD,R0	; CALCULATE RECORD LENGTH
	MOV	R0,R1		; PUT RECORD LENGTH IN R1
	PUT$S	#FDB,,R1	; OUTPUT THE RECORD
	BCS	245$		;  CS: FAILED - EXIT WITH CLOSE
	CMP	R2,THRU		; DONE?
	BHI	250$		; HI: FROM > TO
	TSTB	R2		; NEED A HEADER?
	BEQ	30$		; EQ: PAGE BOUNDARY
	BR	40$		; NO, PUT OUT MORE
245$:				; ERROR EXIT WITH CLOSE
	CALL	IOERROR		; Show error number
250$:
	PUT$S	#FDB,,#0	; OUTPUT BLANK LINE (Sets %0->FDB)
	TSTB	R5		; TERMINAL OR FILE?
	BNE	252$		; NE: FILE
	CLOSE$			; TERMINAL - JUST CLOSE
	BR	254$
252$:
	CALL	.PRINT		; FILE - SPOOL TO PRINTER
254$:
	BCC	255$		; IF PROPERLY CLOSED, EXIT
	CALL	IOERROR		; Show I/O error number
255$:
	MOV	#IO.DET,ATTDET+Q.IOFN ; Load detach TI: function, in case it is	;CJD02
	DIR$	#ATTDET		; Doesn't matter if it wasn't
	RORB	ERRFLG		; Return error flag in carry
	RETURN			; EXIT

	.PAGE
; PUT EVEN # SPACES
SPACER:
	MOV	#"  ,(R0)+	; TWO SPACES FOR TI:
	TSTB	R5		; TI: OR FILE?
	BEQ	10$		; EQ: TI: WE ARE DONE
	MOV	#"  ,(R0)+	; TWO MORE FOR FILE
10$:	RETURN

; Display I/O error number.
IOERROR:
	MOV	#IOE+IOELEN-4,%0 ; Address I/O error number
	MOV	FDB+F.ERR,%1
	CALL	PUTHX4		; Show it in hex
	OUTPUT	IOE		; I/O ERROR
	MOVB	#377,ERRFLG	; Set error exit flag
	RETURN

	.PSECT	DATA	D,RW

ATTDET:	QIOW$	IO.ATT,TILUN,TILUN ; Attach/detach TI: DPB
PUTSUB:	.BLKW	1		; Display routine address, PUTHX2 or PUTASC
ERRFLG:	.BYTE	0		; Error exit flag
	.EVEN

	.PSECT	PURE	D,RO

	KEY	ASCII
TI:	.ASCIZ	"TI:"		; Default device, MUST be ASCIZ, or PARSE
	.EVEN			; may think a name follows

	.END
