VEDIT = 3			; edit level, change every time
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;*									   *
;*  Copyright (c) 1986 by Software Designs, PO Box 9227, Spokane WA 99209  *
;*  All rights reserved.  Phone: (509) 326-2480.			   *
;*  Written by Tom Faust, author of RELIEF Input Line Editor.		   *
;*									   *
;*   This program may be "freely" copied and used but may never be sold.   *
;*									   *
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;
;   Pgm Name:	CHR.LIT
;
;   Pgm Desc:	Display any character in ascii & decimal & (hex or octal).
;
;   Version:	1.0(3)
;
;   Hash Total:	130-170-010-302
;
; Patch Log
; Version	   Date		Inits	Description of Change
; -------	---------	-----	-------------------------------------
;  1.0		17 Nov 83	TGF	New.
;	(2)	11 Jan 86	TGF	Allow toggle of xlt mode.
;	(3)	26 Aug 86	TGF	Add new ^C message, OCT/HEX, etc.
;					Add notice of 'CHR ?' option.
;					Fix XLT toggle on/off message
;

	RADIX	8			; code is written in octal

	SEARCH	SYS
	SEARCH	SYSSYM
	SEARCH	TRM

;; program major and minor version = 1.0

	VMAJOR	= 1			; program version
	VMINOR	= 0

;; misc character equates

	CTL.C	=   3			; control-C
	CR	=  15			; carriage return
	SPA	=  40			; space char
	DEL	= 177			; del char

;; macro to test a bit in a word (non-destructive)

DEFINE	BITW	SRC,DST
	MOVW	DST,D7
	ANDW	SRC,D7
	ENDM

;; macro to define ascii text followed by a CR

DEFINE	ASCIIC	TEXT
	ASCII	TEXT
	BYTE	CR
	ENDM


BASE:	PHDR	-1,0,PH$REE!PH$REU

START:	JOBIDX	A0			; Point A6 to job control block
	MOV	JOBTRM(A0),A5		; index A5 to terminal control block
	MOVW	JOBTYP(A0),D4		; save current...
	ANDW	#J.HEX,D4		;   ...octal/hex setting (save j.hex)
	SWAP	D4			;   ...in high order word
	MOVW	@A5,D4			; save current...
	ANDW	#T$XLT,D4		;   ...XLT setting in low order word
	ANDW	#~T$XLT,@A5		; be sure it's not set now

1$:	BYP
	CMPB	@A2,#'?			; request help?
	JEQ	USAGE
	CMPB	(A2)+,#'/		; switch specified?
	BNE	10$
	CMPB	@A2,#'T			; transparent mode?
	BNE	2$
	ORW	#<T$XLT>,@a5		;   then set translation mode
	BR	9$
2$:	CMPB	@A2,#'H			; request hex?
	BNE	3$
	ORW	#J.HEX,JOBTYP(A0)	;   then set hex
	BR	9$
3$:	CMPB	@A2,#'O			; request octal?
	BNE	4$
	ANDW	#~J.HEX,JOBTYP(A0)	;   then set octal
;	BR	9$
4$:
9$:	INC	A2
	BR	1$

10$:	ORW	#<T$DAT!T$ECS>,@a5	; Set image mode & echo suppress
	TTYL	CRIGHT
	TYPECR	<From AMOS, type 'CHR ?' for usage>
	TYPECR	<Enter desired character, or type CTRL-C to end.>

RESTRT:	TYPE	<Chr  Dec  >
	BITW	#J.HEX,JOBTYP(A0)	; hex set?
	BNE	10$
	TYPE	<Oct>
	BR	20$
10$:	TYPE	<Hex>
20$:	TYPE	<  XLT >
	BITW	#T$XLT,@A5		; is XLT set now?
	BEQ	30$
	TYPE	<On>
	BR	40$
30$:	TYPE	<Off>
40$:	CRLF


LOOP:	MOVW	#1,D0			; default space count
	KBD				; get a character
	PUSHB	D1
	CMPB	D1,#DEL			; > del?
	BLOS	10$
	TYPE	<+>
	SUBB	#200,D1			; adjust to control or printable char
	BR	11$
10$:	INCW	D0

11$:	CMPB	D1,#SPA			; less than a space?
	BGE	20$
	TYPE	<^>
	ADD	#100,D1			; adjust to printable character
	BR	21$
20$:	INCW	D0

21$:	CMPB	D1,#177			; del or greater?
	BLO	ECHO
	TYPE	DEL			; (special case)
	DECW	D0
	BR	NOECHO


ECHO:	TTY				; display the char
	DECW	D0
	BMI	NOECHO
10$:	TYPE	< >
	DBF	D0,10$


NOECHO:	TYPE	< >
	POPB	D1
	DCVT	3,OT$TRM!OT$TSP		; display decimal ascii value
	OCVT	3,OT$TRM!OT$LSP		; display octal/hex ascii value
	CMPB	D1,#CTL.C		; Ctrl-C?
	JNE	DOLOOP
	TYPESP	<   Y=Exit, H=Hex, O=Octal, T=XLT on|off, N=Continue:>
10$:	KBD				; get another char
	UCS
	CMPB	D1,#'T			; toggle XLT mode?
	BNE	15$
	XORW	#T$XLT,@A5		; toggle translation mode
	BR	100$
15$:	CMPB	D1,#'Y
	BEQ	EXIT
	CMPB	D1,#3			; ctrlc again?
	BEQ	CTLC
	CMPB	D1,#'N
	BEQ	100$
	CMPB	D1,#'H			; request hex?
	BNE	20$
	ORW	#J.HEX,JOBTYP(A0)	;   then set hex
	BR	100$
20$:	CMPB	D1,#'O			; request octal?
	BNE	30$
	ANDW	#~J.HEX,JOBTYP(A0)	;   then set octal
	BR	100$
30$:
99$:	MOV	#7,D1
	TTY
	BR	10$
100$:	TTY				; display the N
	CRLF
	JMP	RESTRT
DOLOOP:	CRLF
	JMP	LOOP


CTLC:	TYPE	^C			; display ^C
	MOV	#7,D1			; and ring the bell
EXIT:	TTY				; display the Y or bell
	CRLF
EXIT2:	ANDW	#~T$XLT,@A5		; reset t$xlt bit
	ORW	D4,@A5			; reset original XLT setting
	SWAP	D4			; shift j.hex into position
	ANDW	#~J.HEX,JOBTYP(A0)	; reset j.hex bit
	ORW	D4,JOBTYP(A0)		; reset original octal/hex setting
	EXIT


USAGE:	TTYI
	ASCIIC	"Usage:	CHR {/H/O/T}"
	ASCIIC	"	/H = Display decimal and hex"
	ASCIIC	"	/O = Display decimal and octal"
	ASCIIC	"	/T = Begin in Fkey translation mode"
	ASCIIC	"	^C to exit"
	ASCIIC
	ASCIIC	"	For character display:"
	ASCIIC	"	  the symbol ^ signifies a control character"
	ASCIIC	"	  the symbol + signifies the parity bit is set"
	ASCIIC
CRIGHT:	ASCIIC	<"Copyright 1983,1986 Software Designs, Spokane, WA">
	BYTE	0
	EVEN
	JMP	EXIT2

	END