OBJNAM KBDTST.LIT ; Created 18-Dec-85, Last modified 11-Jan-86
; by Irv Bromberg, Medic/OS Consultants, 78 Wildginger Way, Toronto,
; Ontario, CANADA, M3H 5X1
RADIX 10
VEDIT=19
VMINOR=1
VMAJOR=3
VSUB=0
IF EQ,1
Under AMOS/L 1.3 KBDTST.LIT 3.1(19) size=732 bytes, hash=413-467-020-176.
Syntax: KBDTST {IMI} {ILC} {DAT} {XLT} {NFK}
Terminal keyboard input/Terminal Driver Input Routine test program. When
no mnemonics are specified a completely data transparent test will be
done setting ECS and DAT and temporarily changing the user's terminal
driver to PSEUDO so that all input characters (single and
multi-character sequences) are passed through unmodified. The original
terminal driver is automatically restored when KBDTST ends.
The mnemonics shown may be used to set the desired terminal status for
the test (ECS is always set). Any terminal status mnemonic that is
omitted is cleared for the test. When DAT is specified prompts user for
exit character otherwise CTRL-C will abort the test. A comma may
optionally be used as separator between terminal status mnemonics. When
a terminal status mode is specified KBDTST tests the user's current
terminal driver and multi-character sequences (special function keys,
editing keys) may be modified by the terminal driver input processing
routine before they reach KBDTST.
Each character received by KBDTST is displayed in binary, octal,
decimal, hexadecimal and ASCII until the exit character is received (or
CTRL-C abort when DAT is not on).
Examples:
.kbdtst ; data transparent keyboard test with PSEUDO.TDV
.kbdtst ilc ; line input mode, lowercase & function keys enabled
.kbdtst ilc nfk ; as above but No Function Key translation
.kbdtst dat xlt ; 8-bit terminal driver input routine test with user's
; current terminal driver, translate function/editing
; keys to parity-set bytes
.kbdtst dat nfk ; 8-bit TDV input test but No Function Key translation
.kbdtst imi ; image-mode terminal driver input routine test, optionally
; translate function/editing keys to VUE control codes
Triple ^C can also be used to abort KBDTST in DAT mode, in case you
forget which exit character you specified.
Note that when the NFK bit is set your Terminal Driver input routine can
do to nothing to prevent multi-character keys from passing through
character by character processing since all attempts to invoke the
multi-character processing feature of TRMSER are ignored while NFK is set.
When testing in line input mode (ILC on and both IMI and DAT off) be
aware that TRMSER (and any system input line editor you may have
installed) will process all input before it reaches KBDTST. This will
be most noticeable for control codes which will probably not be passed
through in line input mode (careful, ^S will freeze the output, ^Q will
resume it).
Edit history:
1.7(13) 16-Dec-85 Corrected bug causing HEX to be output in DEC if OCTPCH on
1.8(14) 17-Dec-85 Added BINARY to output display
1.9(15) 17-Dec-85 Build output line in memory and output in one TTYL call,
replace KBD calls with TIN (CMD file processing not needed)
2.0(16) 17-Dec-85 Deleted KBDTST.TDV from in-line code, use monitor's PSEUDO
terminal driver instead (safer in case RESET/MURDER used).
2.1(17) 18-Dec-85 Deleted initial clear screen TCRT call.
3.0(18) 18-Dec-85 Major re-write, added Terminal Driver Input Routine testing
with ability to specify Terminal Status Mode bits.
3.1(19) 11-Jan-86 backup for RES:/MEM: TDVNAM display only if "TDV" there
ENDC
ETX=3
CR=13
SPACE=32
XLT=^O40 ; define XLT & NFK here in case assembled under AMOS/L
NFK=^O100 ; versions before defined (1.1 & 1.3 respectively)
J.DEC=J.HEX*256
PHDR -1,0,PH$REE!PH$REU
PUSH #50 ; get 50-byte line workspace
PUSH
GETMEM @SP
BEQ 10$
TYPECR <?Out of memory>
EXIT
10$: POP Worksp
POP
CLR AbtCnt ; pre-clear
MOV JOBCUR,JCB ; get user's TCB
MOV JOBTRM(JCB),TCB
PUSH T.TDV(TCB) ; save user's Terminal Driver
TSTS: MOVW #ECS,Flags ; pre-set ECS default
LIN ; any parameters?
BNE PackIt ; yes, go process them
; No parameters, change user's terminal driver to PSEUDO and set DAT mode
; so that the test will be guaranteed completely 8-bit data transparent
; for all input characters or sequences.
ORW #DAT,Flags ; set DAT mode too
LEA TDV,TRMTDC ; index the terminal driver chain
MOV @TDV,TDV ; first driver is PSEUDO.TDV
ADD #8,TDV ; bypass link and name longwords
MOV TDV,T.TDV(TCB) ; set user TDV=PSEUDO
TYPE <Keyboard test (8-bit data transparent)>
BR SetMode
PackIt: MOV Worksp,RD50 ; pack into workspace
PACK ; pack first specified mnemonic
MOVW @Worksp,Dtemp ; get word for table lookup
LEA Atemp,Table ; index T.STS flags table
10$: MOVW (Atemp)+,Mnem ; get next packed mnemonic
BEQ Syntax ; illegal mnemonic
CMPW Mnem,Dtemp ; match here?
BNE 20$
ORW @Atemp,Flags ; set that bit in Flags
BYP
CMPB @Buffer,#', ; allow comma separators
BNE 15$
INC Buffer
BYP ; skip spaces/tabs
15$: LIN ; end of line yet?
BNE PackIt ; no, go back for more
TYPE <Terminal Driver Input test>
BR SetMode
20$: ADD #2,Atemp ; point to next entry
BR 10$ ; search for more
SetMode:ORW Flags,T.STS(TCB) ; set specified T.STS mode
MOV #-1,ExChar ; special signal for no exit character
ANDW #DAT,Flags ; was DAT specified?
BEQ NoExit
CRLF
TYPE <Enter exit character: >
TIN ; input exit character
MOV Char,ExChar ; save exit character
BR SavTYP
NoExit: TYPECR < - hit CTRLC to abort>
SavTYP: PUSHW JOBTYP(JCB) ; save J.HEX and J.DEC status
MOVB #13+128,Char ; cursor return
TTY
; overwrite prompt with header:
TYPE <-BINARY- OCT DEC HEX ASCII (Terminal driver = >
TDVNAM: MOV T.TDV(TCB),RD50 ; index the terminal driver
MOV MEMBAS,Atemp ; is driver in user partition?
CMP RD50,Atemp
BLO 10$
TYPE <MEM:> ; yes, tell user that it is
BR 20$
10$: MOV SYSBAS,Atemp ; is driver in SYSTEM memory?
CMP RD50,Atemp
BLO 30$
TYPE <RES:>
20$: CMPW -2(RD50),#[TDV] ; if it's a module, with .TDV
BNE 30$ ; extension then back up two more
SUB #2,RD50
30$: SUB #4,RD50 ; back up to terminal driver name
MOV Worksp,Buffer
UNPACK ; unpack & display name pointed to by A1
UNPACK
Strip: CMPB -(Buffer),#SPACE ; strip trailing spaces
BNE 10$
CLRB @Buffer
BR Strip
10$: INC Buffer ; compensate for last pre-decrement
MOVB #'),(Buffer)+ ; ) CR-LF-NULL to end
MOVB #CR,(Buffer)+
CLRB @Buffer
TTYL @Worksp
; the exit character will always be the first one displayed
MOV ExChar,Char ; restore character for display
BMI Wait ; none defined, wait for input
Show: MOV Worksp,Buffer ; point to start of workspace
MOV #8-1,BitNum ; set pre-decremented bit# counter
TstBit: BTST BitNum,Char ; test the next bit
BNE One
Zero: MOVB #'0,(Buffer)+ ; output a "0" to workspace if 0
BR NxtBit
One: MOVB #'1,(Buffer)+ ; else output a "1" to workspace
NxtBit: DBF BitNum,TstBit ; loop until done
MOVB #SPACE,(Buffer)+ ; output a trailing space
ANDW #^C<J.DEC!J.HEX>,JOBTYP(JCB) ; turn off DEC/HEX bits
OCVT 3,OT$MEM!OT$LSP!OT$ZER!OT$TSP ; output in octal
DCVT 3,OT$LSP!OT$MEM!OT$TSP!OT$ZER ; output in decimal
ORW #J.HEX,JOBTYP(JCB)
OCVT 2,OT$MEM!OT$LSP!OT$TSP ; output in hex
MOVB #SPACE,(Buffer)+
MOVB #SPACE,(Buffer)+
MOVB #SPACE,(Buffer)+
ANDB #127,Char ; strip parity bit
CMPB Char,#SPACE ; ?control code
BHIS Normal
MOVB #'^,(Buffer)+
ADDB #64,Char ; make printable
BR ASC
Normal: MOVB #SPACE,(Buffer)+
ASC: MOVB Char,(Buffer)+ ; display ASCII value
MOVB #CR,(Buffer)+ ; terminate with CR-LF-NULL
CLRB @Buffer
TTYL @Worksp ; output the assembled buffer
MOVW T.STS(TCB),Dtemp ; IMI or DAT set?
ANDW #IMI!DAT,Dtemp
BEQ Wait ; no, do line input char wait
TIN ; yes, efficient wait for next char
BR ChkChr ; and go process it
Wait: ; Special loop to wait for an input character to arrive in line
; input mode without wasting a lot of CPU time, then grab it
; from input buffer (therefore need not wait for CR to be hit):
TST T.ICC(TCB) ; any input yet?
BNE GetChr
TSTB JOBSTS(JCB) ; ^C abort pending?
JMI Exit
SLEEP #1000 ; no, wait 0.1 s
BR Wait
GetChr: TTYIN ; yes, get the input
ChkChr: TSTB JOBSTS(JCB) ; abort if ^C pending (not DAT)
JMI Exit
MOVB Char,Dtemp ; check for ^C
ANDB #^H7F,Dtemp ; strip parity
CMPB Char,#ETX ; is it ^C?
BNE 10$
INCB AbtCnt ; increment abort counter
CMPB AbtCnt,#3 ; >2 ^C's in a row?
BLO 20$ ; no, keep going
TYPE <Triple ^C in a row - >
BR Exit
10$: CLR AbtCnt ; clear abort counter, wasn't ^C
20$: TST ExChar ; exit character defined?
JMI Show ; no, just show the char
CMPB Char,ExChar ; exit?
JNE Show ; no, show it
Exit: POPW JOBTYP(JCB)
POP T.TDV(TCB) ; restore user's terminal driver
ANDW #^C<J.CCC>,JOBSTS(JCB) ; clear pending ^C if any
TYPECR <KBDTST exit>
EXIT ; Note: allow the monitor to restore normal Terminal Status
Table: WORD [IMI],IMI ; OIP LCL ECS intentionally left out
WORD [ILC],ILC ; OIP is not concerned with input
WORD [DAT],DAT ; ECS is always set
WORD [XLT],XLT ; LCL has no further effect if ECS set
WORD [NFK],NFK
WORD 0
EVEN