;*; 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

       SEARCH  SYS
       SEARCH  SYSSYM
       SEARCH  TRM

       OBJNAM  .TDV

;Define capability flags

       TDVFLG=TD$DIM!TD$EOS!TD$EOL!TD$MLT!TD$132!TD$LID!TD$CID!TD$RVA!TD$BLN
       TDVFLG=TDVFLG+TD$UND!TD$SMT!TD$PRT ;!TD$STS

       IF EQ,$MODEL-60,TDVFLG=TDVFLG+TD$SPL+TD$VRC ; WY-60 has split-screen

       ESC     =27.                    ; escape
       COLON   =58.                    ; colon
       SEMI    =59.                    ; semi-colon
       GRAVE   =96.                    ; grave accent

;********************
;*       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

JMPINP: JMP     INP                     ;
JMPCRT: JMP     CRT                     ; go handle TCRT codes
JMPINI: JMP     INI                     ;
JMPTCH: JMP     TCH                     ; return terminal characteristics

;********************
;*       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-'@

; Tab marker character.
;
       BYTE    '[-'@
       ASCII   /cA00E/
       ASCII   /000002022232FAFEFA32220202000000/
       BYTE    'Y-'@

; Up arrow character.
;
       BYTE    '[-'@
       ASCII   /cA00D/
       ASCII   /000010387CFE38383838383838000000/
       BYTE    'Y-'@

; Down Arrow character.
;
       BYTE    '[-'@
       ASCII   /cA00C/
       ASCII   /000038383838383838FE7C3810000000/
       BYTE    'Y-'@

; Paragraph character.
;
       BYTE    '[-'@
       ASCII   /cA00B/
       ASCII   /00007E92929292927E12121212000000/
       BYTE    'Y-'@

; 1/4 character.
;
       BYTE    '[-'@
       ASCII   /cA00A/
       ASCII   /004042444810244C94247E0404000000/
       BYTE    'Y-'@

; 1/2 character.
;
       BYTE    '[-'@
       ASCII   /cA007/
       ASCII   /004042444810204C920408101E000000/
       BYTE    'Y-'@

; Tradmark character.
;
       BYTE    '[-'@
       ASCII   /cA008/
       ASCII   /00FE1010101010C6AA92828282000000/
       BYTE    'Y-'@

       ENDC

       BYTE    0

INISIZ=.-INISTR
       EVEN

; 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

       EVEN

DEFINE  CHGKEY  KEY, SEQ, NOESC
       IF      NB,NOESC
       BYTE    233,'Z,'1, KEY, SEQ,177
       IFF
       BYTE    233,'Z,'1, KEY, 33, SEQ,177
       ENDC
ENDM

; 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

;CURSOR POSITIONING - D1 CONTAINS X,Y COORDINATES
       TTYI                    ;SEND POSITION COMMAND
       BYTE    ESC,75,0,0

       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

       IFF
; For a Wyse50 we use character representation of graphics.
;
C64:    BYTE    ^H12, 0         ; up-arrow (graphic upleftcorner)
C65:    BYTE    ^H11, 0         ; down-arrow (graphic lowleftcorner)
C66:    BYTE    '_,0            ; raised dot (shaded block)
C67:    BYTE    ^H1E, 0           ; end of line marker (double vertical)
C68:    BYTE    ^H19, 0           ; horizontal tab symbol (left intersect)
C69:    BYTE    ESC,'H,3,'P,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,'4,ESC,'H,2,0  ; one-quarter
C74:    BYTE    ESC,'H,3,'2,ESC,'H,2,0  ; one-half
C75:    BYTE    ESC,'H,3,'o,ESC,'H,2,0  ; degree
C76:    BYTE    ESC,'H,3,'T,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
       ENDC

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]

;Define feature bitmap                                                          [104]
;
TCHBMP: BYTE    ^B11111111              ; 0 - 7
       BYTE    ^B11111111              ; 8 - 15
       BYTE    ^B11111111              ; 16 - 23
       BYTE    ^B11111001              ; 24 - 31    (no horiz or vert pos)
       BYTE    ^B11111111              ; 32 - 39
       BYTE    ^B11111111              ; 40 - 47
       BYTE    ^B00111111              ; 48 - 55
       BYTE    ^B01100011              ; 56 - 63    (no vertical split)
       BYTE    ^B11111111              ; 64 - 71
       BYTE    ^B11111111              ; 72 - 79
       BYTE    ^B00001111              ; 80 - 87    (no alternate page)
       BYTE    ^B11111111              ; 88 - 95
       BYTE    ^B11111111              ; 96 - 103
       BYTE    ^B00000011              ; 104 - 111  (no non-space attributes)
       BYTE    ^B00000000              ; 112 - 119  (no non-space attributes)
       BYTE    ^B00001111              ; 120 - 127  (spare)
       BYTE    ^B00000000              ; 128 - 135  (no AM-70 style color)
       BYTE    ^B00000000              ; 136 - 143
       BYTE    ^B00000000              ; 144 - 151
       BYTE    ^B00000000              ; 152 - 159
       BYTE    ^B00000000              ; 160 - 167
       BYTE    ^B00000000              ; 168 - 175
       BYTE    ^B00000000              ; 176 - 183
       BYTE    ^B00000000              ; 184 - 191
       BYTE    ^B00000000              ; 192 - 199
       BYTE    ^B00000000              ; 200 - 207
       BYTE    ^B00000000              ; 208 - 215
       BYTE    ^B00000000              ; 216 - 223
       BYTE    ^B00000000              ; 224 - 231
       BYTE    ^B00000000              ; 232 - 239
       BYTE    ^B00000000              ; 240 - 247
       BYTE    ^B00000000              ; 248 - 255
       EVEN

       WORD    0

       END END END