;*; Updated on 27-Oct-92 at 10:36 AM by James A. Jarboe I V; edit time: 6:00:37
;***************************************************************************
;* *
;* WYSE 50/WYSE 60 TERMINAL DRIVER *
;* *
;***************************************************************************
;Copyright (C) 1987, 1991 UltraSoft Corp. All Rights Reserved.
;
;Written by: Lee & David Pallmann
;
;Conditional Assembly:
;
; For Wyse 50 Terminal Driver: .M68 WYSE/V:50 ...creates WY50.TDV
;
; For Wyse 60 Terminal Driver: .M68 WYSE/V:60 ...creates WY60.TDV
; (in Wyse 50+ emmlation mode)
;
;Edit History:
;
;1.0(100) 01-Jun-87 created. /LVP&DFP
;1.1(101) 21-Jul-88 made lots of miscellaneous corrections. /DFP
;1.1(102) 06-Oct-88 fix TCRT 129 (end status line). /DFP
;1.1(103) 18-Oct-88 add conditional assembly for WY-50 or WY-60. /DFP
;1.1(104) 09-Jan-89 fix definition of -1,64 & -1,65. /DFP
;1.1(105) 02-Oct-92 Added AMOS compatible function key translation. /JAJ
; Added More downloaded characters and now uses unused
; control char display for downloaded characters.
; Added more features.
;1.1(106) 26-Oct-92 Added WY60 support for 24,25,42 and 43 data lines
; per screen. CAUTION - NOTE - while this driver
; does support row changes, you will loose the
; downloaded special characters when changing to
; or from a 2? to 4? row length.
;1.1(107) 27-Oct-92 Now does not auto load font bank so special chars will
; NOT change as indicated in edit 106.
;**************************
;* CONDITIONAL ASSEMBLY *
;**************************
NVALU VALUE
IF EQ,50-VALUE,$MODEL=50
IF EQ,60-VALUE,$MODEL=60
IF NDF,$MODEL,ASMERP "?Please specify /V:model"
IF NDF,$MODEL,ASMMSG "?Model not specified"
IF NDF,$MODEL,ASMMSG "? Use .M68 WYSE/V:50 for Wyse 50"
IF NDF,$MODEL,ASMMSG "? Use .M68 WYSE/V:60 for Wyse 60 emulating Wyse 50+"
IF EQ, $MODEL-50
ASMMSG "==== Wyse 50 Terminal Driver (WY50.TDV) ===="
ASMMSG " With AMOS Function key translations "
ASMMSG " "
OBJNAM WY50.TDV
ENDC
IF EQ, $MODEL-60
ASMMSG "==== Wyse 60 Terminal Driver (WY60.TDV) ===="
ASMMSG " With AMOS Function key translations "
ASMMSG " "
OBJNAM WY60.TDV
ENDC
;********************
;* WY50 *
;********************
;Terminal driver communications area
WY50: WORD TD$NEW!TD$TCH ; terminal attributes
BR JMPINP ; input routine
RTN ; output routine
BR ECHO ; echo routine
BR JMPCRT ; crt control
BR JMPINI ; INIT routine
WORD 2 ; impure area of one word.
ROWCNT: BYTE 24. ; number of rows
BYTE 80. ; number of columns
LWORD TDVFLG ; terminal has:
; insert/delete line
; insert/delete character
; reverse video attribute
; dim video attribute
; blinking video attribute
; underlined video attribute
; erase to end of screen
; erase to end of line
; split screen
; status line
; is an AlphaTERMINAL
; line graphics
BR JMPTCH
;********************
;* ECHO *
;********************
;SPECIAL ECHO PROCESSING IS PERFORMED HERE
;RUBOUTS WILL BACKSPACE AND ERASE THE PREVIOUS CHARACTER
;CONTROL-U WILL ERASE THE ENTIRE LINE BY BACKSPACING AND ERASING
ECHO: CMPB D1,#25 ;CONTROL-U
BEQ CTRLU
CMPB D1,#177 ;RUBOUT
BNE ECHX
;RUBOUTS ARE HANDLED BY THE OLD BACKSPACE-AND-ERASE GAME
;SPECIAL HANDLING MUST BE PERFORMED IF WE ARE RUBBING OUT A TAB
;D6 CONTAINS THE CHARACTER BEING RUBBED OUT
RUBOUT: CMPB D6,#11 ;WAS IT A TAB?
BEQ RBTB ; YES
;RUBOUT WAS OF A PRINTABLE CHARACTER - QUEUE UP THE BACKSPACE SEQUENCE
KRTG: MOV #3,D3 ;SET CHARACTER COUNT
LEA A6,ERUB ;SET BUFFER ADDRESS
MOV A6,D1 ; INTO D1
TRMBFQ ;QUEUE THE BACKSPACE SEQUENCE
RTN
ERUB: BYTE 10,40,10,0
;RUBOUT WAS OF A TAB - WE MUST CALCULATE HOW BIG THE TAB WAS AND BACKUP OVER IT
RBTB: CLR D3 ;PRECLEAR D3
MOVW T.POB(A5),D3 ;SET BEGINNING POSITION COUNT
MOV T.ICC(A5),D2 ;SET INPUT CHARACTER COUNT
MOV T.IBF(A5),A6 ;SET INPUT BUFFER BASE
KRTS: DEC D2 ;DONE WITH SCAN?
BMI KRTQ ; YES
MOVB (A6)+,D1 ;SCAN FORWARD CALCULATING POSITION
CMPB D1,#11 ; TAB
BEQ KRTT
CMPB D1,#15 ; CR
BEQ KRTC
CMPB D1,#33 ; ALTMODE
BEQ KRTI
CMPB D1,#40 ; CONTROL-CHAR
BLO KRTS
CMPB D1,#172
BHI KRTS
KRTI: INC D3 ;INCREMENT POSITION FOR ONE CHARACTER
BR KRTS
KRTT: ADD #10,D3 ;ADJUST POSITION FOR TAB
AND #^C7,D3
BR KRTS
KRTC: CLR D3 ;CLEAR POSITION FOR CR
BR KRTS
KRTQ: COM D3 ;CALCULATE NECESSARY BACKSPACES
AND #7,D3
INC D3
MOV #10,D1 ;SET IMMEDIATE BACKSPACE CHARACTER
TRMBFQ ;QUEUE THE BACKSPACES
ECHX: RTN
;ECHO A CONTROL-U BY ERASING THE ENTIRE LINE
CTRLU: TST D6 ;NO ACTION IF NOTHING TO ERASE
BEQ CTUX
CLR D3 ;PRECLEAR D3
MOVW T.POO(A5),D3 ;CALCULATE BACKSPACE NUMBER TO ERASE THE LINE
SUBW T.POB(A5),D3
BEQ ECHX
CMP D3,T.ILS(A5) ;INSURE NOT GREATER THAN TERMINAL WIDTH
BLOS CLUA
MOV T.ILS(A5),D3
CLUA: MOV #10,D1 ;QUEUE UP BACKSPACES
TRMBFQ
ASL D1,#2 ;QUEUE UP SPACES
TRMBFQ
MOV #10,D1 ;QUEUE UP BACKSPACES
TRMBFQ
CTUX: RTN
;********************
;* INP *
;********************
;Input character processing subroutine
;Return a negative flag to indicate possible multi-byte key codes
;Detect a negative flag which indicates the multi-byte processing return
INP: BMI INMLT ; skip if multi-byte processing
CMPB D1,#1 ; function code?
BEQ INPM ; yes - could be multi-byte sequence
CMPB D1,#33 ; escape?
BEQ INPM ; yes - could be multi-byte sequence
LCC #0 ; no - normal processing
RTN
INPM: LCC #PS.N ; possible multi-byte - return N flag
RTN
;Multi-byte processing is done here
;This occurs when TRMSER has accumulated all bytes of a multi-byte keystroke
;D0 contains the character count and A0 indexes the data string
;A5 indexes the terminal definition block and must be preserved
;The translated character must be returned in D1 for storage
;This routine may destroy only A0,A3,A6,D0,D6,D7
;
INMLT: MOVB (A0)+,D1 ; get the first character
DECB D0 ; no translation if single character
BEQ INMX
CMPB D1,#1 ; function sequences start with SOH
BEQ INMF ; function sequence -
;Escape sequences are translated directly by setting bit 7 on
;This will cause them to map to 240-377.
;[105] But first we check our translation table to see if we are redefining
;any keys that will become function keys.
;
MOVB (A0)+,D1 ; get the second character
INMG: ORB #200,D1 ; set bit 7 on
BR INMNOT ; Check our translation first [105]
INMR: ; Check for function key? [105]
BIT #T$XLT,T.STS(A5) ; are we doing translation?
;;;; BEQ INMNOT ; no - check for other translation [105]
BEQ INMX2 ; no - set proper flags. [105]
INMX: LCC #0 ; reset the flags
INMX2: RTN
;Function codes require additional translation so that they become 200-237
;
INMF: MOVB (A0)+,D1 ; get the second character
SUBB #'@,D1 ; offset so that F1 becomes 0
BR INMG ; and go finish up
;Come here if program is not doing translation and we must do our own
;
INMNOT: LEA A6,XLTTBL ; index the translation table
10$: MOVB (A6)+,D7 ; get character
;;;; BEQ INMX2 ; end of table - ignore char [105]
BEQ INMR ; End of table..check for funkey [105]
CMPB D1,D7 ; is it in the table?
BEQ 20$ ; yes -
INC A6 ; no - bypass translation
BR 10$ ; loop for more -
;Come here to translate the character
;
20$: MOVB @A6,D1 ; translate the character
CMPB D1, #200 ; See if translate if funkey [105]
BHI INMR ; Yes..process it [105]
BR INMX ; Leave as our translation [105]
;Translation table so that Wyse?? function keys react properly, and gives
;the user the addition of an EXECUTE key and Shift-EXECUTE key equivalents.
;A Wyse 60 using the WY60.TDV does not need this translation table as
;we download the key changes to the Wyse 60 in Wyse 50 mode when terminal
;is initialized. MAKE SURE TERMINAL IS ON WHEN REBOOTING.
;
XLTTBL:
IF EQ, $MODEL-50
BYTE 312, 18. ; Prev-Page = ^R
BYTE 313, 20. ; Next-Page = ^T
BYTE 321, 6. ; Ins-Char = ^F
BYTE 327, 4. ; Del-Char = ^D
BYTE 361, 276 ; Ins = shift-EXECUTE
BYTE 362, 274 ; Repl = EXECUTE
BYTE 373, 5. ; Shift-Home = ^E
ENDC
BYTE 000,000
;********************
;* INI *
;********************
;Handle initialization of the terminal
;
INI: MOV T.IDV(A5),A6 ; index the interface driver [106]
CMP -(A6),#<[PSE]_16.>+[UDO]; is it the pseudo interface driver? [106]
BEQ 5$ ; yes - no initialization wanted [106]
CMP QFREE,#12. ; are there at least 12 queue blocks? [106]
BLO 5$ ; no - skip the initialization [106]
SAVE D1,D2 ; save registers
MOV #INISIZ,D3 ; get size of first command
LEA A6,INISTR ; index the first init string
MOV A6,D1
TRMBFQ
SLEEP #7500. ; wait for reset to complete
; (105) Reprogram Function keys so that they are AMOS compatible.
; To use AMOS function key translation files work with this driver,
; Copy the AM65 function key translation file to:
; WY50.??? for /V:50
; WY60.??? for /V:60
; Where ??? indicates the function key file extension.
; (.AMX, .VUX, .MLX, .WRX, etc...)
; This will allow the AMOS function key translation files to work
; with this driver. TERMINAL MUST BE TURNED ON FOR THIS TO LOAD.
;
MOV #INISZ1, D3 ; Get Size of second init string.
LEA A6, INIST1 ; Index second init string.
MOV A6, D1
TRMBFQ
SLEEP #7500.
; The Wyse 60 terminal allows the redefining of keys to the remote system.
; Thus we will redefine the keys to act like an AM6?.
;
IF EQ,$MODEL-60
MOV #INISZ2, D3 ; Get size of redefine key seq.
LEA A6, INIST2 ; Index sequence.
MOV A6, D1 ; Set it up.
TRMBFQ ; Do it.
SLEEP #5500. ; Sleep while it does it.
MOV #INISZ3, D3 ; Get size of rest of redifine.
LEA A6, INIST3 ; Index next sequence.
MOV A6, D1 ; Set it up.
TRMBFQ ; Do it.
SLEEP #7500. ; Sleep, redefine takes some time.
ENDC
REST D1,D2 ; restore registers
5$: MOV T.IMP(A5),A6 ; index impure area
MOVW #80.,@A6 ; preset to 80 columns
MOVW #24.,2(A6) ; Preset to 24 columns [106]
RTN
;Initialization string - program special characters
;
INISTR:
IF EQ,$MODEL-60
; Wyse50 emulation on a Wyse60 has downloadable characters.
;
BYTE ESC,'~,'" ; Ensure Wyse50 mode on a Wyse60.
BYTE ESC,'e,'( ; Ensure 24 rows. [106]
; End of line character.
;
BYTE '[-'@
ASCII /cA00F/
ASCII /000002060E1E3E7E3E1E0E0602000000/
BYTE 'Y-'@
; Reprogram function keys to emulate AlphaMicro AM65 function key sequence.
; This will enable the user to copy an exising AM65 function key translation
; file and have full function of the translation file. TERMINAL MUST BE
; TURNED ON FOR THE FOLLOWING TO LOAD.
; Example:
; COPY WY50.AMX=AM65.AMX ; Alphamicro line editor funkey file.
; COPY WY60.WRX=AM65.WRX ; AlphaWrite function key file.
; COPY WY60.DMX=AM65.DMX ; ESP function key file.
;
INIST1: BYTE 233,'+ ; Clear all to spaces.
BYTE 233,'`,': ; Set into 80 column mode.
BYTE 200,200,200,200,200,200 ; Nulls...
BYTE 233,'x,'0 ; Set into normal display format.
BYTE 200,200,200,200,200,200 ; Nulls...
BYTE 233,'z,'@,33,'5,177 ; Set up F1 (unshifted).
BYTE 233,'z,'`,33,'7,177 ; Set up F1 (shifted).
BYTE 233,'z,'A,33,'4,177 ; Set up F2 (unshifted).
BYTE 233,'z,'a,33,'6,177 ; Set up F2 (shifted).
BYTE 233,'z,'B,33,'S,177 ; Set up F3 (unshifted).
BYTE 233,'z,'b,33,'s,177 ; Set up F3 (shifted).
BYTE 233,'z,'C,33,'@,177 ; Set up F4 (unshifted).
BYTE 233,'z,'c,33,'P,177 ; Set up F4 (shifted).
BYTE 233,'z,'D,01,'@,177 ; Set up F5 (unshifted).
BYTE 233,'z,'d,01,'H,177 ; Set up F5 (shifted).
BYTE 233,'z,'E,01,'A,177 ; Set up F6 (unshifted).
BYTE 233,'z,'e,01,'I,177 ; Set up F6 (shifted).
BYTE 233,'z,'F,01,'B,177 ; Set up F7 (unshifted).
BYTE 233,'z,'f,01,'J,177 ; Set up F7 (shifted).
BYTE 233,'z,'G,01,'C,177 ; Set up F8 (unshifted).
BYTE 233,'z,'g,01,'K,177 ; Set up F8 (shifted).
BYTE 233,'z,'H,01,'D,177 ; Set up F9 (unshifted).
BYTE 233,'z,'h,01,'L,177 ; Set up F9 (shifted).
BYTE 233,'z,'I,01,'E,177 ; Set up F10 (unshifted).
BYTE 233,'z,'i,01,'M,177 ; Set up F10 (shifted).
BYTE 233,'z,'J,01,'F,177 ; Set up F11 (unshifted).
BYTE 233,'z,'j,01,'N,177 ; Set up F11 (shifted).
BYTE 233,'z,'K,01,'G,177 ; Set up F12 (unshifted).
BYTE 233,'z,'k,01,'O,177 ; Set up F12 (shifted).
BYTE 233,'z,'L,33,'E,177 ; Set up F13 (unshifted).
BYTE 233,'z,'l,33,'|,177 ; Set up F13 (shifted).
BYTE 233,'z,'M,33,'R,177 ; Set up F14 (unshifted).
BYTE 233,'z,'m,33,'~,177 ; Set up F14 (shifted).
BYTE 233,'z,'N,33,'T,177 ; Set up F15 (unshifted).
BYTE 233,'z,'n,33,'t,177 ; Set up F15 (shifted).
BYTE 233,'z,'O,33,'Y,177 ; Set up F16 (unshifted).
BYTE 233,'z,'o,33,'y,177 ; Set up F16 (shifted).
INISZ1=.-INIST1
; These are the redefine key, sequence codes. Redefining keys appears
; to take some time. So they are divided up so they are attacked in
; Two steps with sleep time in between to load the sequences.
;
INIST2:
CHGKEY 'q,'N ; Ins Char = <316>
CHGKEY 'p,'h ; Ins Line = <350>
CHGKEY '5,'O ; Del Char = <317>
CHGKEY '6,'K ; Del Line = <313>
CHGKEY 'u,'9 ; Send = <271> (Help)
CHGKEY 't,'l ; Print = <354> (Print)
INISZ2=.-INIST2
EVEN
INIST3:
CHGKEY '7,74 ; Ins = EXECUTE
CHGKEY '8,'> ; Repl = Shift - EXECUTE
CHGKEY 'r,24,NOESC ; Nxt page = ^T
CHGKEY 'w,22,NOESC ; Pre page = ^R
CHGKEY '},31,NOESC ; Clr line = ^Y
CHGKEY '/,5, NOESC ; Sft Home = ^E
BYTE 233,'Z,'1,'z,25,31,177 ; Clear Screen = ^U^Y
BYTE 33,'e,'N ; Auto font loading off.
INISZ3=.-INIST3
EVEN
PAGE
;********************
;* CRT *
;********************
;SPECIAL CRT CONTROL PROCESSING
;D1 CONTAINS THE CONTROL CODE FOR X
,T POSITIONING OR SPECIAL COMMANDS
;IF D1 IS POSITIVE WE HAVE SCREEN POSITIONING (ROW IN HI BYTE, COL IN LO BYTE)
;IF D1 IS NEGATIVE WE HAVE THE SPECIAL COMMAND IN THE LOW BYTE
;
CRT: TSTW D1 ;IS IT CURSOR POSITION?
BMI CRTS ; NO
MOV T.IMP(A5),A6 ; index impure area
CMPW @A6,#80. ; in wide mode?
JNE CRT132 ; yes - special cursor addressing
ADD #17437,D1 ;ADD POSITION OFFSETS
ROR D1,#8. ;SEND ROW FIRST
TTY
ROL D1,#8. ;SEND COLUMN SECOND
TTY
RTN
CRT132: SAVE D0 ;
MOV D1,D0 ;
TTYI ;
BYTE ESC,'a,0 ;
EVEN ;
ROR D1,#8. ;
AND #377,D1 ;
DCVT 0,OT$TRM ;
TTYI ;
BYTE 'R,0 ;
EVEN ;
MOV D0,D1 ;
AND #377,D1 ;
DCVT 0,OT$TRM ;
TTYI ;
BYTE 'C,0 ;
EVEN ;
REST D0 ;
RTN ;
;SPECIAL COMMANDS - D1 CONTAINS THE COMMAND CODE IN THE LOW BYTE
;
CRTS:
IF EQ,$MODEL-60
CMPW D1, #177400 ; Is it a -1 in the high byte? [106]
JLO CRTMSC ; no - must be another command [106]
ENDC
CMPB D1,#80. ; set to wide format?
BEQ CRTWID ; yes - special handling
CMPB D1,#81. ; set to normal format?
BEQ CRTNOR ; yes - special handling
AND #377,D1 ;STRIP THE HIGH BYTE
BNE CRTU ; AND BRANCH UNLESS CLEAR SCREEN
TTYI ;SPECIAL CASE FOR CLEAR SCREEN
BYTE ESC,52,0
EVEN
CRTZ: RTN
;COMMAND PROCESSING PER DIRECTOR TABLES
CRTU: PUSH A2 ;SAVE A2
CMP D1,#<<CRCB-CRCA>/2> ;CHECK FOR VALID CODE
BHI CRTX ; AND BYPASS IF BAD
LEA A2,CRCA-2 ;INDEX THE TABLE
ADD D1,A2 ;ADD COMMAND CODE
ADD D1,A2 ; TWICE
MOVW @A2,D1 ;PICK UP DATA FIELD OFFSET
ADD D1,A2 ;MAKE ABSOLUTE DATA ADDRESS
TTYL @A2 ;PRINT THE DATA FIELD
CRTX: POP A2 ;RESTORE A2
RTN
CRTXZ: POP A2 ;RESTORE A2
RTN
;Set terminal to wide format
;
CRTWID: TTYI
BYTE 33,'`,';,0
EVEN
MOV #132.,D1 ; get new width
WIDSET: MOV T.IMP(A5),A6 ; index impure area
MOVW D1,@A6 ; store the new width
SLEEP #5000. ; pause while command completes [108]
RTN
;Set terminal to normal format
;
CRTNOR: TTYI
BYTE 33,'`,':,0
EVEN
MOV #80.,D1 ; get the new width
BR WIDSET ; go store it
IF EQ,$MODEL-60
CRTMSC:
CMPW D1,#-5._8. ; Is it -5
BHIS VARROW ; Yes- variable row.
BR CRTZ ; No - ignore command.
VARROW:
CMPB D1,#24. ; Asking for 25 lines.
BHI 10$ ; Yes - do 24 lines.
TTYI
BYTE 33,'e,'(,0 ; Set 24 lines.
EVEN
MOV #24., D6
BR 50$
10$:
CMPB D1,#25.
BHI 20$
TTYI
BYTE 33,'e,'),0 ; Set 25 lines.
EVEN
MOV #25., D6
BR 50$
20$:
CMPB D1, #42.
BHI 30$
; set 42 lines
TTYI
BYTE 33,'e,'*,0 ; Set 42 lines.
EVEN
MOV #42., D6
BR 50$
30$: TTYI
BYTE 33,'e,'+,0 ; Set 43 lines.
EVEN
MOV #43., D6
50$: MOV T.IMP(A5), A6
MOVW D6, 2(A6)
RTN
ENDC
;Null characters for long commands
;
;BYTE OFFSET AND DATA TABLES FOLLOW FOR ALL COMMANDS
;
CRCA: WORD C1-.,C2-.,C3-.,C4-.,C5-.,C6-.,C7-.,C8-.
WORD C9-.,C10-.,C11-.,C12-.,C13-.,C14-.
WORD C15-.,C16-.,C17-.,C18-.,C19-.,C20-.
WORD C21-.,C22-.,C23-.,C24-.,C25-.,C26-.,C27-.,C28-.,C29-.,C30-.
WORD C31-.,C32-.,C33-.,C34-.,C35-.
WORD C36-.,C37-.,C38-.,C39-.,C40-.
WORD C41-.,C42-.,C43-.,C44-.,C45-.
WORD C46-.,C47-.,C48-.,C49-.,C50-.
WORD C51-.,C52-.,C53-.,C54-.,C55-.,C56-.,C57-.,C58-.,C59-.,C60-.
WORD C61-.,C62-.,C63-.,C64-.,C65-.,C66-.,C67-.,C68-.,C69-.,C70-.
WORD C71-.,C72-.,C73-.,C74-.,C75-.,C76-.,C77-.,C78-.,C79-.,C80-.
WORD C81-.,C82-.,C83-.,C84-.,C85-.,C86-.,C87-.,C88-.,C89-.,C90-.
WORD C91-.,C92-.,C93-.,C94-.,C95-.,C96-.,C97-.,C98-.,C99-.,C100-.
WORD C101-.,C102-.,C103-.,C104-.,C105-.,C106-.,C107-.,C108-.,C109-.,C110-.
WORD C111-.,C112-.,C113-.,C114-.,C115-.,C116-.,C117-.,C118-.,C119-.,C120-.
WORD C121-.,C122-.,C123-.,C124-.,C125-.,C126-.,C127-.,C128-.,C129-.,C130-.
WORD C131-.,C132-.,C133-.,C134-.,C135-.,C136-.,C137-.,C138-.,C139-.,C140-.
WORD C141-.,C142-.,C143-.,C144-.,C145-.,C146-.,C147-.
;
CRCB:
C1: BYTE 36,0 ;CURSOR HOME
C2: BYTE 215,0 ;CURSOR RETURN
C3: BYTE 13,0 ;CURSOR UP
C4: BYTE 12,0 ;CURSOR DOWN
C5: BYTE 10,0 ;CURSOR LEFT
C6: BYTE 14,0 ;CURSOR RIGHT
C7: BYTE ESC,43,0 ;LOCK KEYBOARD
C8: BYTE ESC,42,0 ;UNLOCK KEYBOARD
C9: BYTE ESC,124,0 ;ERASE TO END OF LINE
C10: BYTE ESC,131,0 ;ERASE TO END OF SCREEN
C11: BYTE ESC,51,0 ;PROTECT FIELD
C12: BYTE ESC,50,0 ;UNPROTECT FIELD
C13: BYTE ESC,46,0 ;ENABLE PROTECTED FIELDS
C14: BYTE ESC,47,0 ;DISABLE PROTECTED FIELDS
C15: BYTE ESC,'R,0 ;DEL LINE
C16: BYTE ESC,'E,0 ;INS LINE
C17: BYTE ESC,'W,0 ;DEL CHAR
C18: BYTE ESC,'Q,0 ;INS CHAR
C19: BYTE 233, 'b, 0 ; Read Cursor at address.
C20: BYTE 233, 'M, 0 ; Read character at Current position.
C21: BYTE ESC,'G,'2,0 ; Blink on
C22: BYTE ESC,'G,'0,0 ; Blink off
C23: BYTE ESC,'H,2,0 ; Start line Drawing.
C24: BYTE ESC,'H,3,0 ; End line Drawing.
C25:
C26:
C27: BYTE 233,'A,0 ; Set terminal attributes.
C28: BYTE ESC,'`,'1,0 ; cursor on
C29: BYTE ESC,'`,'0,0 ; cursor off
C30: BYTE ESC,'G,'8,0 ; underscore on
C31: BYTE ESC,'G,'0,0 ; underscore off
C32: BYTE ESC,'G,'4,0 ; reverse video on
C33: BYTE ESC,'G,'0,0 ; reverse video off
C34: BYTE 233, 'G, '6, 0 ;Start rev/blink.
C35: BYTE 233, 'G, '0, 0 ;End rev/blink.
C36: BYTE ESC,'`,'8,0 ; screen off
C37: BYTE ESC,'`,'9,0 ; screen on
C38: BYTE '2,0 ; top left corner
C39: BYTE '3,0 ; top right corner
C40: BYTE '1,0 ; bottom left corner
C41: BYTE '5,0 ; bottom right corner
C42: BYTE '0,0 ; top intersection
C43: BYTE '9,0 ; right intersection
C44: BYTE '4,0 ; left intersection
C45: BYTE '=,0 ; bottom intersection
C46: BYTE ':,0 ; horizontal line
C47: BYTE '6,0 ; vertical line
C48: BYTE '8,0 ; center intersection
C49: BYTE '7,0 ; solid block
C50: BYTE ';,0 ; slant block
C51: BYTE '?,0 ; cross-hatch block
C52: BYTE '<,0 ; double line horizontal
C53: BYTE '>,0 ; double line vertical
C54: BYTE ESC,'z,'(,0 ; send message to function key line
C55: BYTE ESC,'z,'),0 ; send message to shifted function key line
IF EQ,$MODEL-60
; Wyse50 emulation on a Wyse60 has split screen.
;
C56: BYTE ESC,'x,'0,0 ; set normal display format (no clear)
C57: BYTE ESC,'x,'A,0 ; set horiz split (follow with row)
IFF
; A Wyse50 has no split screen.
;
C56: BYTE 0
C57: BYTE 0
ENDC
C58: BYTE 0 ; set vertical split (39 char columns)
C59: BYTE 0 ; set vertical split (40 char columns)
C60: BYTE 0 ; set vertical split col to next char
C61: BYTE ESC,'],0,0 ; activate split segment 0
C62: BYTE ESC,'},0,0 ; activate split segment 1
C63: BYTE 27.,'F,0,0 ; send message to host message field
IF EQ,$MODEL-60
; For Wyse50 emulation on a Wyse60 we use downloaded font characters.
;
C64: BYTE ESC,'H,3,ESC,'H,^H0D,ESC,'H,2,0 ; up-arrow
C65: BYTE ESC,'H,3,ESC,'H,^H0C,ESC,'H,2,0 ; down-arrow
C66: BYTE '_,0 ; raised dot (shaded block)
C67: BYTE ESC,'H,3,ESC,'H,^H0F,ESC,'H,2,0 ; end of line marker
C68: BYTE ESC,'H,3,ESC,'H,^H0E,ESC,'H,2,0 ; horizontal tab symbol
C69: BYTE ESC,'H,3,ESC,'H,^H0B,ESC,'H,2,0 ; paragraph
C70: BYTE ESC,'H,3,'t,ESC,'H,2,0 ; dagger
C71: BYTE ESC,'H,3,'S,ESC,'H,2,0 ; section
C72: BYTE ESC,'H,3,'c,ESC,'H,2,0 ; cent sign
C73: BYTE ESC,'H,3,ESC,'H,^H0A,ESC,'H,2,0 ; one-quarter
C74: BYTE ESC,'H,3,ESC,'H,^H07,ESC,'H,2,0 ; one-half
C75: BYTE ESC,'H,3,'o,ESC,'H,2,0 ; degree
C76: BYTE ESC,'H,3,ESC,'H,^H08,ESC,'H,2,0 ; trademark
C77: BYTE ESC,'H,3,'@,ESC,'H,2,0 ; copyright
C78: BYTE ESC,'H,3,'R,ESC,'H,2,0 ; registered
C79: BYTE 233,'P ; print screen
C80: BYTE 33,GRAVE,SEMI,0 ; reserved for set to wide mode
C81: BYTE 33,GRAVE,COLON,0 ; reserved for set to normal mode
IF EQ,$MODEL-60
; Wyse50 emulation on a Wyse60 uses following sequence for aux port.
;
C82: BYTE 33,'d,'#,0 ; Wyse60 enter transparent print mode
IFF
; Wyse50 uses following sequence for aux port. If using this driver on a
; Wyse60 with Wyse50 emulation, ENHANCED mode must be OFF.
;
C82: BYTE 'X-'@,0 ; Wyse50 enter transparent mode.
ENDC
C83: BYTE 'T-'@,0 ; exit transparent print mode
C84: BYTE 0 ; begin writing to alternate page
C85: ; end writing to alternate page
C86: BYTE ESC,'K,0,0 ; toggle page
C87: ; copy to alternate page
C88: ; insert column
C89: ; delete column
C90: ; block fill with attribute
C91: ; block fill with character
C92: ; draw a box
C93: ; scroll box up one line
C94: BYTE 0 ; scroll box down one line
C95: BYTE 233,'`,'@, 0 ; select jump scroll
C96: BYTE 233,'`,'?, 0 ; select fast smooth scroll
C97: BYTE 233,'`,'>, 0 ; select med-fast smooth scroll
C98: BYTE 233,'`,'=, 0 ; select med-slow smooth scroll
C99: BYTE 233,'`,'<, 0 ; select slow smooth scroll
C100: BYTE 40,33,'G,':,0,0 ; start underscore/blink
C101: BYTE 33,'G,'0,40,0,0 ; end underscore/blink
C102: BYTE 40,33,'G,'<,0,0 ; start underscore/reverse
C103: BYTE 33,'G,'0,40,0,0 ; end underscore/reverse
C104: BYTE 40,33,'G,'>,0,0 ; start underscore/reverse/blink
C105: BYTE 33,'G,'0,40,0,0 ; end underscore/reverse/blink
C106: BYTE 33,'G,'8,0 ; start underscore w/o space
C107: BYTE 33,'G,'0,0 ; end underscore w/o space
C108: BYTE 33,'G,'4,0 ; start reverse w/o space
C109: BYTE 33,'G,'0,0 ; end reverse w/o space
C110: BYTE 33,'G,'6,0 ; start reverse/blinking w/o space
C111: BYTE 33,'G,'0,0 ; end reverse/blinking w/o space
C112: BYTE 33,'G,':,0 ; start underscore/blinking w/o space
C113: BYTE 33,'G,'0,0 ; end underscore/blinking w/o space
C114: BYTE 33,'G,'<,0 ; start underscore/reverse w/o space
C115: BYTE 33,'G,'0,0 ; end underscore/reverse w/o space
C116: BYTE 33,'G,'>,0 ; start underscore/reverse/blink w/o space
C117: BYTE 33,'G,'0,0 ; end underscore/reverse/blink w/o space
C118: BYTE 33,'G,'2,0 ; start blink w/o space
C119: BYTE 33,'G,'0,0 ; end blink w/o space
C120: BYTE ESC,'`,'5,0 ; set cursor to blinking block
C121: BYTE ESC,'`,'2,0 ; set cursor to steady block
C122: BYTE ESC,'`,'3,0 ; set cursor to blinking underline
C123: BYTE ESC,'`,'4,0 ; set cursor to steady underline
C124: ; SPARE
C125: ; SPARE
C126: ; SPARE
C127: ; SPARE
C128: BYTE ESC,'F,0,0 ; select top status line w/o address
C129: BYTE 215,0 ; end status line
C130: BYTE ESC,'z,'(,0 ; select unshifted status line w/o addr
C131: BYTE ESC,'z,'),0 ; select shifted status line w/o addr
C132: ; select black text
C133: ; select white text
C134: ; select blue text
C135: ; select magenta text
C136: ; select red text
C137: ; select yellow text
C138: ; select green text
C139: ; select cyan text
C140: ; select black reverse text
C141: ; select white reverse text
C142: ; select blue reverse text
C143: ; select magenta reverse text
C144: ; select red reverse text
C145: ; select yellow reverse text
C146: ; select green reverse text
C147: BYTE 0 ; select cyan reverse text
EVEN
WORD 0
;********************
;* TCH *
;********************
;Handle TRMCHR call
;A1 points to argument block, A2 indexes this TDV, D2 contains flags
;Can only use A1,A2,A6,D1,D2,D6,D7
TCH: MOV TD.FLG(A2),TC.FLG(A1) ; transfer flags
MOV JOBCUR,A6 ; index job
MOV JOBTRM(A6),A6 ; index terminal control area
MOV T.IMP(A6),A6 ; index impure area
CLR D6 ; preclear register
MOVW 2(A6), TC.ROW(A1) ; Get row count [106]
;;; MOVB ROWCNT(A2),D6 ; get row count [106]
;;; MOVW D6,TC.ROW(A1) ; transfer row count [106]
MOVW @A6,TC.COL(A1) ; transfer column count
CLRW TC.CLR(A1) ; no colors
MOVW #39.,TC.TSL(A1) ; set length of top status line [104]
CLRW TC.SSL(A1) ; set length of shifted status line [104]
MOVW #78.,TC.USL(A1) ; set length of unshifted status line [104]
MOV D2,D7 ; get TRMCHR argument flags [104]
AND #TC$BMP,D7 ; does user want bitmap? [104]
BEQ 20$ ; no - skip bitmap transfer code [104]
;User has requested bitmap -- return it to him [104]
PUSH A1 ; save argument block index [104]
ADDW #TC.BMP,A1 ; index bitmap return area [104]
LEA A6,TCHBMP ; index our bitmap [104]
MOV #<256./16.>-1,D7 ; get amount to transfer [104]
10$: MOVW (A6)+,(A1)+ ; transfer to user [104]
DBF D7,10$ ; loop until done [104]
POP A1 ; restore register [104]
20$: RTN ; return to TRMCHR monitor routine [104]