	ALWAYS	3FEB84	EDIT	<EDIT VIRTUAL MEMORY>
	.MCALL	DIR$,QIOW$C
;
;	MODULE:	EDIT
;
;	FUNCTION: EXAMINE AND OPTIONALLY MODIFY VIRTUAL MEMORY
;
;	INPUT PARAMETERS:
;
;	R0 POINTS TO COMMAND LINE IN PROCESS
;
;	OUTPUT PARAMETERS:
;
;	NONE
;
;	DESTROYS:
;
;	R0,R1,R2,R3,R4
;
;	AUTHOR: KEVIN ANGLEY
;
;	DATE: 27-JUL-82
;
; Modifications Record
; ====================
; CJD03	Jan 84
;	Support STEP option.
;	Use LUN TILUN, not CMILUN for prompt/read -- CMILUN could be a file!
;	Add ^ option to backup to previous address after store.
;	Display in ASCII as well as hex, and accept 'char = insert ASCII
;	  character value (parity clear).
;	Use separate read/write QIO's if read-after-prompt not supported.
;	Accept ctrl/Z = exit EDIT mode.
;	Use common COMPRESS routine for line compression/upper case convert.
;
	.ENABL	LSB
EDIT::
	CALL	GETHXL		; GET FIRST ADDRESS TO EDIT (HEX DIGITS)
				;	LONG WORD IN R1 (LOW WORD) & R2 (HIGH)
	BCC	7$		;  CC: O.K.
5$:	JMP	ERREXIT		; else take error exit
7$:
	MOV	R1,R3		; PUT LONG WORD IN R3 (LOW WORD) & R4 (HIGH)
	MOV	R2,R4
	MOV	#1,STEP		; Assume edit byte step of 1
	GETKEY	STEP		; See if there is a STEP argument
	BNE	8$		; No, keep 1
	CALL	GETHX2		; Get no of bytes to step by
	BCS	5$ ; (ERREXIT)	; Trap error
	MOVB	%1,STEP		; Set step
8$:
	CALL	EXTRA		; PURGE COMMAND LINE OF SUPERFLUOUS JUNK
	BCS	5$		; Exit if any found
NEXT:
	MOV	#EDT+1,R0	; FORMAT EDIT MESSAGE (SKIPPING CR)
	MOV	R3,R1		; PREPARE REAL 32-BIT ADDRESS FOR CONVERSION
	MOV	R4,R2
	CALL	PUTHXJ		; PUT IN ADDRESS TO EDIT
				;  (8 CHARACTERS - LEFT JUSTIFIED WITH SPACES
				;			IF NECESSARY)
	CALL	VALID		; VALIDATE AND OFFSET ADDRESS
				;	OFFSETTED ADDRESS IN R3/R4
	BCS	5$		;  CS: FAILED

	MOVB	MEMORY(R2),R1	; RETRIEVE THE BYTE
	INC	R0		; SKIP OVER THE TAB IN EDT MESSAGE
	CALL	PUTHAS		; Put current value in message -- hex & ASCII

				; ISSUE READ AFTER PROMPTING WITH EDT MESSAGE
.IF DF T$$RPR
	QIOW$C	IO.RPR,TILUN,TILUN,,IOSB,,<RECORD,80.,,EDT,EDTLEN,44>,EDIT
.IFF
	MOVB	#'$,OUTDIR+Q.IOPL+4 ; Set prompting mode
	OUTPUT	EDT		; Print
	MOV	#SPACE,OUTDIR+Q.IOPL+4 ; Reset standard carriage-control
	QIOW$C	IO.RLB,TILUN,TILUN,,IOSB,,<RECORD,80.>,EDIT ; Get reply
.ENDC
	BCC	20$		;  CC: SUCCESS
	OUTPUT	CIE		; COMMAND INPUT ERROR
	SEC			; Set error flag
	BR	ERREXIT		; Abort
20$:
	MOV	IOSB+2,R0	; SAVE COUNT IN R0
	CLRB	RECORD(R0)	; MAKE ASCIZ
	MOV	#RECORD,R0	; PREPARE TO COMPRESS
	CALL	COMPRESS	; Do it
	TSTB	(R0)		; WAS A VALUE GIVEN?
	BEQ	50$		;  EQ: NO
; A 1-byte record beginning ^ is backup only. A 2-byte one beginning ^ is a
; control code, so check that it is ^<null>.
45$:	CMP	@%0,(PC)+	; Backup only?
	.BYTE	'^,0
	BEQ	50$		; Yes, no value to get
	CALL	GETHAS		; else should be ASCII char or hex digits
	BCS	ERREXIT		;  CS: ERROR EXIT
47$:	MOVB	R1,MEMORY(R2)	; PUT NEW VALUE INTO MEMORY
50$:
	CMP	#IS.ESC,IOSB	; WAS TERMINATOR ESCAPE ?
	BEQ	255$		;  EQ: ESCAPE ---> EXIT EDIT
	CMPB	IOSB,#IE.EOF	; Or ctrl/Z?
	BEQ	255$		; that's exit too
	MOV	R2,R1		; PUT OFFSETTED VALUE INTO R1
	CALL	UNOFFSET	; UN OFFSET VALUE IN R2 IN R3/R4
	CMPB	@%0,#'^		; Back to previous location?
	BNE	60$		; No, must be forward to next
	DECR34	STEP		; Yes, decrement real address by STEP
	BR	70$		; Do it again
60$:
	INCR34	STEP		; Increment real address by STEP
70$:	JMP	NEXT		; LET'S DO IT AGAIN

255$:
ERREXIT:
	RETURN
	.DSABL	LSB
	.PAGE
	.SBTTL	EDIT DATA AREA

	.PSECT	DATA	D,RW

	DEFM	EDT	<00000000	00= X->
	.EVEN

IOSB:	.BLKW	2		; I/O STATUS BLOCK FOR DIRECTIVE QIOW$

	.END
