{IE TERMINAL DRIVER}
 
{Richard Marshall August 1984}

%external %string (255) Copyright %alias "TERMINAL_(C)_RMM" %c
                                  = "(C) 1984 Richard M. Marshall"

%include "Sysdep.Inc"
%include "Terminal.Inc"

{APM} %include "Inc:Util.Imp"

%external %string (80) EOF Marker %alias "IE_EOF_MARKER"

%external %byte V Terminal Model %alias "IE_TT_MODEL" = Visual 200

%external %integer V Terminal Characteristics %alias "IE_TT_CHAR"

%external %integer V Terminal Width %alias "IE_TT_WIDTH" = 80

%own %integer Terminal Family
%constant %integer Visual  = 0,
                   Digital = 1,
                   Freedom = 2,
                   Wyse    = 3,
                   Esprit Family = 4,
                   Newbury Family = 5

{Newbury and Esprit have been added for Ian Nixon - they are only supported}
{in a small subset of the full terminal spec.   Information was provided by}
{someone else so accuracy is not guaranteed}

{APM} %include "Inc:CharIO.Imp"

{APM}%include "Inc:Dict.Imp"
{APM}%record %format IE Stuff fm (%string (127) Memory,
{APM}                                           Last,
{APM}                                           Journal File,
{APM}                                           Profile File,
{APM}                                           Keyboard File,
{APM}                             %byte Terminal,
{APM}                             %integer Line, Position)
{APM}
{APM}%own %record (IE Stuff fm) %name IE Stuff == Nil
{APM}%own %integer Stuff At
{APM}
{APM}{DEFAULT TERMINAL}
{APM}
{APM}%external %integer %function Default Terminal %alias "IE_DEF_TER"
{APM}   %integer At
{APM}   %string (255) Value

{APM}   {look up symbol TERMINAL}
{APM}   At = Ref Name ("TERMINAL", Com Dict)
{APM}   %unless At = 0 %start
{APM}      Trans Name (Integer (At), Value)
{APM}      To Upper (Value)
{APM}      %result = Visual 55  %if Value = "VISUAL55"
{APM}      %result = Visual 55  %if Value = "V55"
{APM}      %result = VT220      %if Value = "VT220"
{APM}      %result = WY75       %if Value = "WY75"
{APM}   %finish   
{APM}   %if IE Stuff == Nil %start
{APM}      Stuff At = Ref Name ("IE_Stuff", Sys Dict)
{APM}      IE Stuff == Record (Stuff At)
{APM}   %finish
{APM}   %if IE Stuff == Nil %start
{APM}      %result = Visual 200
{APM}   %else
{APM}      %result = IE Stuff_Terminal
{APM}   %finish
{APM}%end {Default Terminal}
{APM}
{APM} %external %integerfn get symbol %alias "IE_GET_SYMBOL"
{APM}    %integer Ch,
{APM}             Stream = In Stream
{APM} 
{APM}    Select Input (0) %if Stream # 0
{APM}    Read Symbol (Ch)
{APM}    Select Input (Stream) %if Stream # 0
{APM}    %result = Ch
{APM} %end
{APM} 
{APM} %external %routine set up terminal %alias "IE_SET_UP_TERMINAL"
{APM}    Set Terminal Mode (Single ! No Page ! No Echo)
{APM}    Prompt ("")
{APM}    Exempt Mask = 16_FFFFFFFF
{APM} %end
{APM} 
{APM} %external %routine %spec Reset Terminal Characteristics %alias "IE_TT_RESET"
{APM}
{APM} %externalroutine reset terminal %alias "IE_RESET_TERMINAL"
{APM}    Reset Terminal Characteristics
{APM}    Exempt Mask = 0
{APM}    Set Terminal Mode (0)
{APM} %end
{APM} 
{APM} {PUT SYMBOL}
{APM} 
{APM} %external %routine put symbol %alias "IE_PUT_SYMBOL" %c
{APM}                               (%integer ch)
{APM}   @ 16_3FA2 %routine print symbol (%integer ch)
{APM} 
{APM} !  @16_4000C1 %byte Status
{APM} !  @16_4000C3 %byte D Out
{APM} 
{APM} !   %cycle
{APM} !   %repeat %until Status&2 # 0
{APM} !   D Out = Ch
{APM}   print symbol(ch)  {quick hack for fred emulator}
{APM} %end

!VAX!%external %string (255) %function %spec VAX Terminal Model %c
!VAX!   %alias "TERMINALMODEL"

!VAX!{DEFAULT TERMINAL}
!VAX!
!VAX!%external %integer %function Default Terminal %alias "IE_DEF_TER"
!VAX!   %string (255) Term
!VAX!   %integer T
!VAX!
!VAX!   Term = VAX Terminal Model
!VAX!   %if Term = "VISUAL200" %start
!VAX!      T = Visual 200
!VAX!   %else %if Term = "VISUAL55"
!VAX!      T = Visual 55
!VAX!   %else %if Term = "VT100"
!VAX!      T = VT100
!VAX!   %else %if Term = "VT220"
!VAX!      T = VT220
!VAX!   %else %if Term = "FREEDOM100"
!VAX!      T = Freedom 100
!VAX!   %else %if Term = "WY50"
!VAX!      T = WY50
!VAX!   %else %if Term = "WY75"
!VAX!     T = WY 75
!VAX!   %finish
!VAX!   %result = T
!VAX!%end {Default Terminal}

{PUT STRING}

%external %routine put string %alias "IE_PUT_STRING" (%string (255) S)
   %integer I, ch

   %for I = 1, 1, length (S) %cycle
      ch = char no (S, I)
      put symbol (ch) %if ch >= ' '
   %repeat
%end {of put string}

{PUT INTEGER}

%external %routine put integer %alias "IE_PUT_INTEGER" (%integer i)
   put string (I to S (i, 0))
%end {put integer}

{PUT HEX}

%external %routine Put Hex %alias "IE_PUT_HEX" (%integer What)
   %integer I,
            Digit

   %for I = 28, -4, 0 %cycle
      Digit = (What&(2_1111<<I))>>I
      %if Digit > 9 %start
         Digit = Digit + 'A' - 10
      %else
         Digit = Digit + '0'
      %finish
      Put Symbol (Digit)
   %repeat
%end {Put Hex}

{APM} {FLUSH SYMBOLS}
{APM} 
{APM} %external %routine flush symbols %alias "IE_FLUSH_SYMBOLS"
{APM}    {NOP}
{APM} %end
{APM} 
{APM} %external %integer %function Interrupted %alias "IE_INTERRUPTED"
{APM}    %if Probe Symbol ('C' - 64) %start     {Control-C}
{APM}       Cancel Input
{APM}       %result = 1 
{APM}    %finish
{APM}    %result = 0
{APM} %end

%routine Escape Symbol (%integer S)
   Put Symbol (ESC)
   Put Symbol (S)
%end {Escape Symbol}

%routine Escape String (%string (255) S)
   Put Symbol (ESC)
   Put String (S)
%end {Escape String}

%own %integer Top Margin,
              Bottom Margin

{-SET TERMINAL CHARACTERISTICS-}

%external %routine Set Terminal Characteristics %alias "IE_TT_STC"
   %switch Type (0 : VT52)

   Top Margin = -1
   Bottom Margin = -1
   -> Type (Terminal Model)

Type (Visual 200):
   Terminal Characteristics = %c
                              Noisy Insert     Ability! %c
                              Delete Character Ability! %c
                              Reverse Scroll   Ability! %c
                              Dim Text         Ability
   Terminal Family = Visual
   EOF Marker = "s``````````l"
   %return
   
Type (Visual 55):
   Terminal Characteristics = %c
                              Dynamic Insert   Ability! %c
                              Reverse Scroll   Ability! %c
                              Dim Text         Ability
   Terminal Family = Visual
   EOF Marker = "s``````````l"
   %return
   
Type (VT100):
   Terminal Characteristics = %c
                              Reverse Scroll   Ability! %c
                              Bright Text      Ability! %c
                              Reverse Text     Ability! %c
                              Blink Text       Ability! %c
                              Underline Text   Ability! %c
                              Double Height    Ability! %c
                              Double Width     Ability
   Terminal Family = Digital
   EOF Marker = "lqqqqqqqqqqk"
   Escape String ("[?4l")              {Jump Scroll}
   %return
   
Type (VT220):
   Terminal Characteristics = %c
                              Dynamic Insert   Ability! -
                              Delete Character Ability! %c
                              Reverse Scroll   Ability! %c
                              Bright Text      Ability! %c
                              Reverse Text     Ability! %c
                              Blink Text       Ability! %c
                              Supress Cursor   Ability! %c
                              Double Height    Ability! %c
                              Double Width     Ability! %c
                              Underline Text   Ability
!!!                              Static Insert    Ability! %c
   Terminal Family = Digital
   EOF Marker = "lqqqqqqqqqqk"
   !!! Escape String ("[62;1""p")          {VT220 Mode}
   Escape String ("[?4l")              {Jump Scroll}
   Flush Symbols
{APM} Exempt Mask = Exempt Mask & (\(1<<('S' - '@') ! 1<<('Q' - '@')))
   %return

Type (Freedom 100):
   Terminal Characteristics = %c
                              Static Insert    Ability! %c
                              Delete Character Ability! %c
                              Reverse Scroll   Ability! %c
                              Reverse Text     Ability! %c
                              Blink Text       Ability! %c
                              Supress Cursor   Ability! %c
                              Underline Text   Ability! %c
                              Line 25          Ability
   Terminal Family = Freedom
   EOF Marker = "FKKKKKKKKKKG"
   Escape Symbol ('m')        {Set attribute by character}
   Escape Symbol ('g')        {display User Line}
   %return

Type (WY 50):
   Terminal Characteristics = %c
                              Static Insert    Ability! %c
                              Delete Character Ability! %c
                              Reverse Text     Ability! %c
                              Reverse Scroll   Ability! %c
                              Supress Cursor   Ability! %c
                              Line 25          Ability
   Terminal Family = Wyse
   EOF Marker = "2::::::::::3"
{APM} Exempt Mask = Exempt Mask & (\(1<<('S' - '@') ! 1<<('Q' - '@')))
   %return

Type (WY 75):
   Terminal Characteristics = %c
                              Dynamic Insert   Ability! -
                              Delete Character Ability! %c
                              Reverse Text     Ability! %c
                              Reverse Scroll   Ability! %c
                              Line 25          Ability! %c
                              Supress Cursor   Ability
!!!                              Static Insert    Ability! %c
   Terminal Family = Digital     {almost}
{APM} Exempt Mask = Exempt Mask & (\(1<<('S' - '@') ! 1<<('Q' - '@')))
   EOF Marker = "lqqqqqqqqqqk"
   %return

   {Following types are not fully supported, added for Ian Nixon}

Type (Esprit):
   Terminal Family = Esprit Family
   Terminal Characteristics = 0
   EOF Marker = "Not In Fully"
   %return

Type (Newbury):
   Terminal Family = Newbury Family
   Terminal Characteristics = 0
   EOF Marker = "Not In Fully"
   %return
Type (VT52):
   Terminal Characteristics = %c
                              Dim Text         Ability
   Terminal Family = Visual
   EOF Marker = "Not In Fully"
   %return
%end {Set Terminal Characteristics}

%own %integer Line 25 Enabled = 0

{RESET TERMINAL CHARACTERISICS}

%external %routine Reset Terminal Characteristics %alias "IE_TT_RESET"
   %if Terminal Family = Digital %start
!!!   Escape String ("[?4h")           {Smooth scroll}
      Escape String ("[1;24r")         {Reset Scroll window to whole screen}
      Top Margin = 0
      Bottom Margin = 23
      Escape String ("[24;1H")         {Cursor bottom left}
      !!! Escape String ("[61""p") %if Terminal Model = VT220  {VT100 mode}
   %finish
   Close Line 25 %if Line 25 Enabled # 0
%end {Reset Terminal Characteristics}

{CURSOR}

%external %routine Cursor %alias "IE_TT_CURSOR" (%integer X, Y)
   %if Terminal Family = Visual %start
      Escape Symbol ('Y')
      Put Symbol (Y + 32)
      Put Symbol (X + 32)
   %else %if Terminal Family = Digital
      Escape Symbol ('[')
      Put Integer (Y + 1)
      Put Symbol (';')
      Put Integer (X + 1)
      Put Symbol ('H')
   %else %if Terminal Family = Freedom %or %c
             Terminal Family = Wyse
      Escape Symbol ('=')
      Put Symbol (Y + 32)
      Put Symbol (X + 32)
   %else %if Terminal Family = Esprit Family
      Escape Symbol (16_11)
      Put Symbol (X)
      Put Symbol (Y)
   %else %if Terminal Family = Newbury Family
      Put Symbol (16_16)
      Put Symbol (X + 32)
      Put Symbol (Y + 32)
   %finish
%end {Cursor}

%external %routine Forward Scroll %alias "IE_TT_FS" (%integer Top, Bottom)
   %if Terminal Family = Visual %start
      Cursor (0, Top)
      Escape Symbol ('M')
      Cursor (0, Bottom)
      Escape Symbol ('L')
   %else %if Terminal Family = Digital
      %unless Top = Top Margin %and %c
              Bottom = Bottom Margin %start
         Escape Symbol ('[')
         Put Integer (Top + 1)
         Put Symbol (';')
         Put Integer (Bottom + 1)
         Put Symbol ('r')
         Top Margin = Top
         Bottom Margin = Bottom
      %finish
      Cursor (0, Bottom)
      Escape Symbol ('D')
   %else {%if Terminal Family = Freedom %or %c}
             {Terminal Family = Wyse}
      Cursor (0, Top)
      Escape Symbol ('R')
      Cursor (0, Bottom)
      Escape Symbol ('E')
   %finish
%end {Forward Scroll}

%external %routine Reverse Scroll %alias "IE_TT_RS" (%integer Top, Bottom)
   %if Terminal Family = Visual %start
      Cursor (0, Bottom)
      Escape Symbol ('M')
      Cursor (0, Top)
      Escape Symbol ('L')
   %else %if Terminal Family = Digital
      %unless Top = Top Margin %and %c
              Bottom = Bottom Margin %start
         Escape Symbol ('[')
         Put Integer (Top + 1)
         Put Symbol (';')
         Put Integer (Bottom + 1)
         Put Symbol ('r')
         Top Margin = Top
         Bottom Margin = Bottom
      %finish
      Cursor (0, Top)
      Escape Symbol ('M')
   %else {%if Terminal Family = Freedom %or %c}
             {Terminal Family = Wyse}
      Cursor (0, Bottom)
      Escape Symbol ('R')
      Cursor (0, Top)
      Escape Symbol ('E')
   %finish
%end {Reverse Scroll}

%external %routine Clear Line %alias "IE_TT_CL"
   %if Terminal Family = Visual %start
      %if Terminal Model = VT52 %start
         Put Symbol (CR)
         Escape Symbol ('K')
      %else
         Escape Symbol ('t')
      %finish
   %else %if Terminal Family = Digital
      Escape String ("[2K")
      Put Symbol (CR)                           {Emulate V200}
   %else %if Terminal Family = Freedom %or %c
             Terminal Family = Wyse
      Put Symbol (CR)
      Escape Symbol ('t')
   %else %if Terminal Family = Esprit Family
      Put Symbol (CR)
      Escape Symbol (16_0F)
   %else %if Terminal Family = Newbury Family
      Put Symbol (CR)
      Put Symbol (16_19)
   %finish
%end {Clear Line}

%external %routine Clear Screen %alias "IE_TT_CS"  
   %if Terminal Family = Visual %start
      %if Terminal Model = VT52 %start
         Escape Symbol ('H')
         Escape Symbol ('J')
      %else
         Escape Symbol ('v')
      %finish
   %else %if Terminal Family = Digital
      Escape String ("[2J")
      Cursor (0, 0)
   %else %if Terminal Family = Freedom %or %c
             Terminal Family = Wyse
      Escape Symbol ('+')
   %else %if Terminal Family = Esprit Family
      Escape Symbol (16_1C)
   %else %if Terminal Family = Newbury Family
      Put Symbol (16_1D)
      Put Symbol (16_1F)
   %finish
%end {Clear Screen}

%external %routine Erase Line %alias "IE_TT_EL"
   %if Terminal Family = Visual %start
      Escape Symbol ('x')
   %else %if Terminal Family = Digital
      Escape String ("[K")
   %else %if Terminal Family = Freedom %or %c
             Terminal Family = Wyse
      Escape Symbol ('t')
   %else %if Terminal Family = Esprit Family
      Escape Symbol (16_0F)
   %else %if Terminal Family = Newbury Family
      Put Symbol (16_19)
   %finish
%end {Erase Line}

%external %routine Left  %alias "IE_TT_C_L"
   %if Terminal Family = Visual %start
      Escape Symbol ('D')
   %else %if Terminal Family = Digital
      Escape String ("[D")
   %else 
      {Good for Freedom, Wyse, Esprit, Newsbury - leave as %else case as}
      {it will usually work on anything}
      Put Symbol (BS)
   %finish
%end {Left}

%external %routine Right %alias "IE_TT_C_R"
   %if Terminal Family = Visual %start
      Escape Symbol ('C')
   %else %if Terminal Family = Digital
      Escape String ("[C")
   %else %if Terminal Family = Freedom %or %c
             Terminal Family = Wyse
      Put Symbol (FF)
   %else %if Terminal Family = Esprit Family 
      Put Symbol (16_10)
   %else %if Terminal Family = Newbury Family
      Put Symbol (16_18)
   %finish
%end {Right}

%external %routine Up    %alias "IE_TT_C_U"
   %if Terminal Family = Visual %start
      Escape Symbol ('A')
   %else %if Terminal Family = Digital
      Escape String ("[A")
   %else %if Terminal Family = Esprit Family 
      Escape Symbol (FF)
   %else {%if Terminal Family = Freedom %or %c}
             {Terminal Family = Wyse %or %c}
             {Terminal Family = Newbury Family}
      Put Symbol (VT)                           
   %finish
%end {Up}

%external %routine Down  %alias "IE_TT_C_D"
   %if Terminal Family = Visual %start
      Escape Symbol ('B')
   %else %if Terminal Family = Digital
      Escape String ("[B")
   %else %if Terminal Family = Freedom %or %c
             Terminal Family = Wyse
      Put Symbol (SYN)
   %else %if Terminal Family = Esprit Family 
      Escape Symbol (VT)
   %else %if Terminal Family = Newbury Family
      Put Symbol (LF)
   %finish
%end {Down}

{-KEY PACKAGE-}

{-KEY NAME-}

%external %string (255) %function Key Name %alias "IE_KEY_NAME" (%integer K)

   %constant %string (20) %array Function Key Names (0 : 128) = %c
      "DEL",
      "Unknown Key", {0}
      "Up", {1}
      "Down", {2}
      "Right", {3}
      "Left", {4}
      "Unused Key", {5}
      "Unused Key", {6}
      "Unused Key", {7}
      "Unused Key", {8}
      "Unused Key", {9}
      "Keypad 0", {10}
      "Keypad 1", {11}
      "Keypad 2", {12}
      "Keypad 3", {13}
      "Keypad 4", {14}
      "Keypad 5", {15}
      "Keypad 6", {16}
      "Keypad 7", {17}
      "Keypad 8", {18}
      "Keypad 9", {1}
      "Keypad ,", {20}
      "Keypad .", {21}
      "Keypad -", {22}   
      "Keypad Enter", {23}
      "Unused Key", {24}
      "Unused Key", {25}
      "Unused Key", {26}
      "Unused Key", {27}
      "Unused Key", {28}
      "Unused Key", {29}
      "Function Keypad 0", {30}
      "Function Keypad 1", {31}
      "Function Keypad 2", {32}
      "Function Keypad 3", {33}
      "Function Keypad 4", {34}
      "Function Keypad 5", {35}
      "Function Keypad 6", {36}
      "Function Keypad 7", {37}
      "Function Keypad 8", {38}
      "Function Keypad 9", {3}
      "Function Keypad ,", {40}
      "Function Keypad .", {4}
      "Function Keypad -", {42}
      "Function Enter", {43}
      "Unused Key", {44}
      "Unused Key", {45}
      "Unused Key", {46}
      "Unused Key", {47}
      "Unused Key", {48}
      "Unused Key", {49}
      "F0", {50}
      "F1", {51}
      "F2", {52}
      "F3", {53}
      "F4", {54}
      "F5", {55}
      "F6", {56}
      "F7", {57}
      "F8", {58}
      "F9", {59}
      "F10", {60}
      "F11", {61}
      "F12", {62}
      "F13", {6}
      "F14", {64}
      "F15", {65}
      "F16", {66}
      "F17", {67}
      "F18", {68}
      "F19", {69}
      "F20", {70}
      "F21", {71}
      "F22", {72}
      "F23", {73}
      "F24", {74}
      "F25", {75}
      "F26", {76}
      "F27", {77}
      "F28", {78}
      "F29", {79}
      "F30", {80}
      "F31", {81}
      "F32", {82}
      "Unused Key", {83}
      "Unused Key", {84}
      "Unused Key", {85}
      "Unused Key", {86}
      "Unused Key", {87}
      "Unused Key", {88}
      "Unused Key", {89}
      "Unused Key", {90}
      "Unused Key", {91}
      "Unused Key", {92}
      "Unused Key", {93}
      "Unused Key", {94}
      "Unused Key", {95}
      "Unused Key", {96}
      "Unused Key", {97}
      "Unused Key", {98}
      "Unused Key", {99}
      "Panic!", {100}
      "PF1", {101}
      "PF2", {102}
      "PF3", {103}
      "PF4", {104}
      "Home", {105}
      "BTAB", {106}
      "CP", {107}
      "CL", {108}
      "Find", {109}
      "Insert Here", {110}
      "Remove", {111}
      "Select", {112}
      "Prev Screen", {113}
      "Next Screen", {114}
      "Del Line", {115}
      "Ins Line", {116}
      "Del Char", {117}
      "Ins Char", {118}
      "CLR", {119}
      "Print", {120}
      "Shift Home", {121}
      "Function PF2", {122}
      "Function PF3", {123}
      "Function PF4", {124}
      "Send", {125}
      "Ins", {126}
      "Repl"  {127}
      
   %if K < ' ' %start
      %result = "^" . To String (K + '@')
   %else %if K > '~'
      %result = Function Key Names (K - 127)
   %else
      %result = To String (K) 
   %finish
%end {Key Name}
   
{- GET KEY -}

%external %byte %function Get Key %alias "IE_KEY_GET" 
   %integer Ch, 
            K, 
            N,
            Shift = 0,
            Question = 0
   %label Again

Again:
   Ch = Get Symbol
   %if Ch = ESC %start
      {Parse an Escape Sequence}
      K = Unknown Key
      Ch = Get Symbol 
      %if Ch = '?' %and %c
          Terminal Family = Visual %start
         Ch = Get Symbol 
         %if Ch = 'm' %start
            K = Keypad Minus
         %else %if Ch = 'M'
            K = Keypad Enter
         %else %if Ch = 'l'
            K = Keypad Comma
         %else %if Ch = 'n'
            K = Keypad Dot
         %else %if 'p' <= Ch <= 'y'
            K = Keypad 0 + (Ch - 'p')
         %finish
      %else %if Ch = 'O' %and %c
                Terminal Family = Digital
         Ch = Get Symbol
         %if 'p' <= Ch <= 'y' %start
            K = Keypad 0 + Ch - 'p'
         %else %if 'A' <= Ch <= 'D'
            K = Up Key + (Ch - 'A')
         %else %if Ch = 'm'
            K = Keypad Minus
         %else %if Ch = 'l'
            K = Keypad Comma
         %else %if Ch = 'n'
            K = Keypad Dot
         %else %if Ch = 'M'
            K = Keypad Enter
         %else %if Ch = 'P'
            {GOLD Key}
            %if Shift = 0 %start
               Shift = 20
               -> Again
            %finish
            Shift = 0
            K = PF1 Key
         %else %if 'Q' <= Ch <= 'S'
            K = PF2 Key + Ch - 'Q'
         %finish
         K = K + Shift
      %else %if Ch = '[' %and %c
                Terminal Family = Digital
         Ch = Get Symbol
         %if 'A' <= Ch <= 'D' %start
            %result = Up Key + Ch - 'A'
         %else %if Ch = 'H'
            %result = Home Key
         %else %if Ch = '@'
            %result = Key F4
         %else %if Ch = 'L'
            %result = Key F20
         %else %if Ch = 'M'
            %result = Key F5
         %else %if Ch = 'K'
            %result = Key F21
         %else %if Ch = '?'
            Question = 1
            Ch = Get Symbol
         %finish
         N = 0
         %cycle
            N = N*10 + Ch - '0'
            Ch = Get Symbol
         %repeat %until Ch = '~' %or %c
                        Ch = 'i'
         %if Ch = 'i' %start
            %if 4 <= N <= 5 %start
               %if Question = 1 %start
                  %result = Key F1 
               %else
                  %result = Key F17
               %finish
            %else %if N = 3    
               %result = Key F2 
            %else %if N = 1
               %result = Key F18
            %else %if N = 2
               %result = Key F3
            %else %if N = 0
               %result = Key F19
            %else                   
               %result = Unknown Key
            %finish
         %finish
         %if 1 <= N <= 6 %start
            K = Find Key + N - 1
         %else %if 17 <= N <= 21
            K = Key F6 + N - 17
         %else %if 23 <= N <= 26
            K = Key F11 + N - 23
         %else %if 28 <= N <= 29
            K = Help Key + N - 28
         %else %if 31 <= N <= 34
            K = Key F17 + N - 31
         %finish
      %else
         %if Ch = ESC %start
            K = Panic Key
         %else %if Ch = 'H'
            K = Home Key
         %else %if Terminal Family = Visual 
            %if Ch = 'z' %start
               K = BTAB Key
            %else %if 'P' <= Ch <= 'R'
               K = Key F0 + (Ch - 'P')
               K = K + 1 %if Terminal Model = Visual 55
            %else %if ' ' <= Ch <= '*'
               K = Key F3 + (Ch - ' ')
               K = K + 1 %if Terminal Model = Visual 55
            %else %if 'A' <= Ch <= 'D'
               K = Up Key + (Ch - 'A')
            %else %if Terminal Model = Visual 200
               %if Ch = '^' %or %c
                   Ch = '-' %start
                  K = Function Keypad Comma
               %else %if Ch = ']'
                  K = Function Keypad Dot
               %else %if Ch = 'K'
                  K = Function Keypad 1
               %else %if Ch = 'f'
                  K = Function Keypad 2
               %else %if Ch = 'J'
                  K = Function Keypad 3
               %else %if Ch = 'M'
                  K = Function Keypad 4
               %else %if Ch = 'O'
                  K = Function Keypad 5
               %else %if Ch = '2'
                  K = Function Keypad 6
               %else %if Ch = 'L'
                  K = Function Keypad 7
               %else %if Ch = 'i' %or %c
                         Ch = 'j'
                  K = Function Keypad 8
               %else %if Ch = '1'
                  K = Function Keypad 9
               %else %if Ch = 't'
                  K = CL Key
               %else %if Ch = 'v'
                  K = CP Key
               %finish
            %else %if Terminal Model = Visual 55
               %if Ch = 'L' %start
                  K = Function Keypad 1
               %else %if Ch = 'v'
                  K = Function Keypad 2
               %else %if Ch = 'M'
                  K = Function Keypad 3
               %else %if Ch = 'f'
                  K = Function Keypad 4
               %else %if Ch = 'K'
                  K = Function Keypad 5
               %else %if Ch = 'J'
                  K = Function Keypad 6
               %else %if Ch = 'i' %or %c
                         Ch = 'j'
                  K = Function Keypad 7
               %else %if Ch = 'O'
                  K = Function Keypad 9
               %finish
            %finish
         %else %if Terminal Family = Freedom %or %c
                   Terminal Family = Wyse
            %if Ch = 'T' %start
               {CLR Line - Gold one}
               Shift = 1
               -> Again
            %else %if Ch = 'Y'
               {CLR SCRN - Gold Two}
               Shift = 2
               -> Again
            %else %if Ch = 'I'
               K = BTAB Key
            %else %if Ch = 'R'
               K = Del Line Key
            %else %if Ch = 'E'
               K = Ins Line Key
            %else %if Ch = 'W'
               K = Del Char Key
            %else %if Ch = 'Q'
               K = Ins Char Key
            %else %if Ch = 'P'
               K = Print Key
            %else %if Terminal Family = Wyse
               %if Ch = '{' %start
                  K = Shift Home Key
               %else %if Ch = 'J'
                  K = Prev Screen Key
               %else %if Ch = 'K'
                  K = Next Screen Key
               %else %if Ch = 'r'
                  K = Repl Key
               %else %if Ch = 'q'
                  K = Ins Key
               %else %if Ch = '7'
                  K = Send Key
               %finish
            %finish
         %finish
      %finish
   %else
      {Ordinary keys in here!}
      %if Terminal Family = Digital %and -
          Shift # 0 %start
         %if '0' <= Ch <= '9' %and -
             Terminal Model # WY 75 %start
            K = Key F0 + Ch - '0'
         %else %if Ch = TAB
            K = BTAB Key
         %else
            K = Ch
         %finish
      %else %if Terminal Family = Freedom %or %c
                Terminal Family = Wyse
         {All sorts of nasty things here!}
         %if Ch = SOH %start
            Ch = Get Symbol
            %if Terminal Family = Freedom %start
               %if '@' <= Ch <= 'I' %start
                  K = Key F1 + Ch - '@'
               %else %if Ch = ' '
                  K = Key F11
               %else
                  K = Key F12 + Ch - 'a'
               %finish
            %else {%if Terminal Family = Wyse
               %if '@' <= Ch <= 'O' %start
                  K = Key F1 + Ch - '@'
               %else %if '`' <= Ch <= 'o'
                  K = Key F17 + Ch - '`'
               %finish
            %finish
            Ch = Get Symbol            {skip the CR}
         %else %if Ch = VT
            K = Up Key
         %else %if Ch = FF
            K = Right Key
         %else %if Terminal Family = Freedom %and %c
                   Ch = SYN
            K = Down Key
         %else %if Terminal Family = Wyse %and %c
                   Ch = LF
            K = Down Key
         %else %if Ch = BS
            K = Left Key
         %else %if Ch = {RS} 16_1E
            K = Home Key
         %else %if Ch = SUB
            K = CLR Key
         %else %if Shift # 0
            %if '0' <= Ch <= '9' %start
               K = Keypad 0 + Ch - '0'
            %else %if Ch = CR
               K = Keypad Enter
            %else %if Ch = '.'
               K = Keypad Dot
            %else %if Ch = '-'
               K = Keypad Minus
            %else %if Ch = ','
               K = Keypad Comma
            %else
               %result = Ch
            %finish
            K = K + 20 %if Shift = 2
         %else
            K = Ch
         %finish
      %else    
         K = Ch
      %finish
   %finish
   %result = K
%end {Get Key}

%external %routine Keypad On  %alias "IE_TT_KP_1"
   %if Terminal Family = Visual %or %c
       Terminal Family = Digital %start
      Escape Symbol ('=')
   %finish
%end {Keypad On}

%external %routine Keypad Off %alias "IE_TT_KP_0"
   %if Terminal Family = Visual %or %c
       Terminal Family = Digital %start
      Escape Symbol ('>')
      Flush Symbols
   %finish
%end {Keypad Off}

%external %routine Cursor On %alias "IE_TT_CUR_1"
   %if Terminal Model = VT220 %or %c
       Terminal Model = WY 75 %start
      Escape String ("[?25h")
   %else %if Terminal Family = Freedom
      Escape String (".0")
   %else %if Terminal Family = Wyse
      Escape String ("`1")
   %finish
%end {Cursor On}

%external %routine Cursor Off %alias "IE_TT_CUR_0"
   %if Terminal Model = VT220 %or %c
       Terminal Model = WY 75 %start
      Escape String ("[?25l")
   %else %if Terminal Family = Freedom
      Escape String (".1")
   %else %if Terminal Family = Wyse
      Escape String ("`0")
   %finish
%end {Cursor Off}

%external %routine Dim On %alias "IE_TT_DIM"
   %if Terminal Family = Visual %start
      Escape Symbol ('4')
   %finish
%end {Dim On}

%external %routine Reverse On %alias "IE_TT_REVERSE"
   %if Terminal Family = Digital %start
      Escape String ("[0;7m")
   %else %if Terminal Family = Freedom
      Escape String ("G4")
   %else {%if Terminal Family = Wyse}
      Escape Symbol (')')
   %finish
%end {Reverse On}

%external %routine Feature %alias "IE_TT_FANCY"
   %if Terminal Family = Visual %start
      Dim On
   %else %if Terminal Family = Digital %or %c
             Terminal Family = Freedom %or %c
             Terminal Family = Wyse 
      Reverse On
   %finish
%end {Feature}

%external %routine Underline On %alias "IE_TT_UNDERLINE"
   {Digital Only}
   %if Terminal Family = Digital %start
      Escape String ("[0;4m")
   %else {%if Terminal Family = Freedom}
      Escape String ("G8")
   %finish
%end {Underline On}

%external %routine Blink On %alias "IE_TT_BLINK"
   {Digital Only}
   %if Terminal Family = Digital %start
      Escape String ("[0;5m")
   %else {%if Terminal Family = Freedom
      Escape String ("G2")
   %finish
%end {Blink On}

%external %routine Normal  %alias "IE_TT_NORMAL"
   %if Terminal Family = Visual %start
      Escape Symbol ('3')
   %else %if Terminal Family = Digital
      Escape String ("[m")
   %else %if Terminal Family = Freedom
      Escape String ("G0")
   %else {%if Terminal Family = Wyse}
      Escape Symbol ('(')
   %finish
%end {Normal}

%external %routine Delete Characters %alias "IE_TT_DC" (%integer N)
   %integer I

   %if Terminal Family = Visual %start
      Escape Symbol ('O') %for I = 1, 1, N
   %else %if Terminal Family = Digital
      Escape Symbol ('[')
      Put Integer (N)
      Put Symbol ('P')
   %else {%if Terminal Family = Freedom %or %c}
             {Terminal Family = Wyse}
      Escape Symbol ('W') %for I = 1, 1, N
   %finish
%end {Delete Characters}

%own %integer Insert State = 0

%external %routine Insert On  %alias "IE_TT_IC_1"
   %if Terminal Family = Visual %start
      Escape Symbol ('i') %if Insert State = 0
      Insert State = 1
   %else {%if Terminal Family = Digital}
      Escape String ("[4h")
   %finish
%end {Insert On}

%external %routine Insert Off %alias "IE_TT_IC_0"
   %if Terminal Family = Visual %start
      Escape Symbol ('j') %if Insert State = 1
      Insert State = 0
   %else {%if Terminal Family = Digital}
      Escape String ("[4l")
   %finish
%end {Insert Off}

%external %routine Static Insert %alias "IE_TT_IC_S" (%integer N)
   %integer I

   %if Terminal Model = VT220 %or %c
       Terminal Model = WY 75 %start
      {VT200}
      Escape Symbol ('[')
      Put Integer (N)
      Put Symbol ('@')
   %else %if Terminal Family = Freedom %or %c
             Terminal Family = Wyse
      Escape Symbol ('Q') %for I = 1, 1, N
   %else %if Terminal Family = Visual
      {simulate the effect}
      Insert On
      Put Symbol (' ') %for I = 1, 1, N
      Insert Off
      Left %for I = 1, 1, N
   %finish                             
%end {Static Insert}

%external %routine Graph On %alias "IE_GR_1"
   %if Terminal Family = Visual %start
      Escape Symbol ('F')
   %else %if Terminal Family = Digital
      Escape String ("(0")
   %else %if Terminal Family = Freedom
      Escape Symbol ('$')
   %else {%if Terminal Family = Wyse}
      Escape Symbol ('H')
      Put Symbol (STX)
   %finish
%end {Graph On}

%external %routine Graph Off %alias "IE_GR_0"
   %if Terminal Family = Visual %start
      Escape Symbol ('G')
   %else %if Terminal Family = Digital
      Escape String ("(B")
   %else %if Terminal Family = Freedom
      Escape Symbol ('%')
   %else {%if Terminal Family = Wyse}
      Escape Symbol ('H')
      Put Symbol (ETX)
   %finish
%end {Graph Off}

%external %routine Yen Sign    %alias "IE_GR_YEN"
   %if Terminal Family = Visual %start
      Put Symbol ('p')
   %else %if Terminal Family = Digital
      Put Symbol ('a')
   %else %if Terminal Family = Freedom
      Put Symbol ('A')
   %else {%if Terminal Family = Wyse}
      Put Symbol ('?')
   %finish
%end {Yen Sign}

%external %routine Degree Sign %alias "IE_GR_DEG"
   %if Terminal Family = Visual %or %c
       Terminal Family = Digital %start
      Put Symbol ('f')
   %else %if Terminal Family = Freedom
      Put Symbol ('D')
   %else {%if Terminal Family = Wyse}
      Put Symbol ('>')
   %finish
%end {Degree Sign}

%external %routine Left T      %alias "IE_GR_L_T"
   %if Terminal Family = Visual %start
      Put Symbol ('o')
   %else %if Terminal Family = Digital
      Put Symbol ('u')
   %else %if Terminal Family = Freedom
      Put Symbol ('M')
   %else {%if Terminal Family = Wyse}
      Put Symbol ('4')
   %finish
%end {Left T}

%external %routine TAB Representation %alias "IE_GR_TAB"
   %if Terminal Family = Visual %start
      Put Symbol ('i')
   %else %if Terminal Family = Digital
      Put Symbol ('b')
   %else %if Terminal Family = Freedom
      Put Symbol ('N')
   %else {%if Terminal Family = Wyse}
      Put Symbol ('<')
   %finish
%end {TAB Representation}

%external %routine Top Left   %alias "IE_GR_TL"
   %if Terminal Family = Visual %start
      Put Symbol ('s')
   %else %if Terminal Family = Digital
      Put Symbol ('l')
   %else %if Terminal Family = Freedom
      Put Symbol ('F')
   %else {%if Terminal Family = Wyse}
      Put Symbol ('2')
   %finish
%end {Top Left}

%external %routine Horizontal %alias "IE_GR_HOR"
   %if Terminal Family = Visual %start
      Put Symbol ('`')
   %else %if Terminal Family = Digital
      Put Symbol ('q')
   %else %if Terminal Family = Freedom
      Put Symbol ('K')
   %else {%if Terminal Family = Wyse}
      Put Symbol (':')
   %finish
%end {Horizontal}

%external %routine Vertical %alias "IE_GR_VER"
   %if Terminal Family = Visual %start
      Put Symbol ('a')
   %else %if Terminal Family = Digital
      Put Symbol ('x')
   %else {%if Terminal Family = Freedom}
      Put Symbol ('J')
!!   %else {%if Terminal Family = Wyse}
!!      Put Symbol (':')
   %finish
%end {Horizontal}
%external %routine Top Right  %alias "IE_GR_TR"
   %if Terminal Family = Visual %start
      Put Symbol ('l')
   %else %if Terminal Family = Digital
      Put Symbol ('k')
   %else %if Terminal Family = Freedom
      Put Symbol ('G')
   %else {%if Terminal Family = Wyse}
      Put Symbol ('3')
   %finish
%end {Top Right}

%external %routine Bottom Right %alias "IE_GR_BR"
   %if Terminal Family = Visual %start
      Put Symbol ('m')
   %else %if Terminal Family = Digital
      Put Symbol ('j')
   %else {%if Terminal Family = Freedom}
      Put Symbol ('H')
!!   %else {%if Terminal Family = Wyse}
!!      Put Symbol ('3')
   %finish
%end {Bottom Right}

%external %routine Bottom Left %alias "IE_GR_BL"
   %if Terminal Family = Visual %start
      Put Symbol ('e')
   %else %if Terminal Family = Digital
      Put Symbol ('m')
   %else {%if Terminal Family = Freedom}
      Put Symbol ('E')
!!   %else {%if Terminal Family = Wyse}
!!      Put Symbol ('3')
   %finish
%end {Bottom Left}

%external %routine Right T     %alias "IE_GR_R_T"
   %if Terminal Family = Visual %start
      Put Symbol ('n')
   %else %if Terminal Family = Digital
      Put Symbol ('t')
   %else {%if Terminal Family = Freedom}
      Put Symbol ('M')
!!   %else {%if Terminal Family = Wyse}
!!      Put Symbol ('3')
   %finish
%end {Right T}

%external %routine Top T       %alias "IE_GR_T_T"
   %if Terminal Family = Visual %start
      Put Symbol ('d')
   %else %if Terminal Family = Digital
      Put Symbol ('w')
   %else %if Terminal Family = Freedom
      Put Symbol ('N')
   %else {%if Terminal Family = Wyse}
      Put Symbol ('3')
   %finish
%end {Top T}

%external %routine Bottom T    %alias "IE_GR_B_T"
   %if Terminal Family = Visual %start
      Put Symbol ('c')
   %else %if Terminal Family = Digital
      Put Symbol ('v')
   %else {%if Terminal Family = Freedom}
      Put Symbol ('I')
!!   %else {%if Terminal Family = Wyse}
!!      Put Symbol ('3')
   %finish
%end {Bottom T}

%external %routine Cross       %alias "IE_GR_X"
   %if Terminal Family = Visual %start
      Put Symbol ('b')
   %else %if Terminal Family = Digital
      Put Symbol ('n')
   %else {%if Terminal Family = Freedom}
      Put Symbol ('G')
!!   %else {%if Terminal Family = Wyse}
!!      Put Symbol ('3')
   %finish
%end {Cross}

%external %routine Upper Half Double Height %alias "IE_TT_DHU"
   %if Terminal Family = Digital %start
      Escape String ("#3")
   %finish
%end {Upper Half Double Height}

%external %routine Lower Half Double Height %alias "IE_TT_DHL"
   %if Terminal Family = Digital %start
      Escape String ("#4")
   %finish
%end {Lower Half Double Height}

%external %routine Normal Size %alias "IE_TT_NS"
   %if Terminal Family = Digital %start
      Escape String ("#5")
   %finish
%end {Normal Size}

%external %routine Put Line 25 %alias "IE_PUT_25" (%string (80) Text)
   %if Terminal Family = Freedom %start
      Escape Symbol (SO) %if Line 25 Enabled # 0      {disable display}
      Escape Symbol ('f')                             {down load text start}
      Put Symbol (DEL);    Put Symbol (DEL)           {splodges}
      Length (Text) = 78 %if Length (Text) > 78       {Trim the text}
      Put String (Text)
      Put Symbol (CR) %if Length (Text) < 78          {terminate text}
      Escape Symbol (SI)
      Line 25 Enabled = 1
   %else %if Terminal Family = Wyse
      %if Terminal Width = 132 %start
         {Wider top line in 132 mode!}
         Length (Text) = 98 %if Length (Text) > 98
      %else
         Length (Text) = 44 %if Length (Text) > 44
      %finish
      Escape Symbol ('F')
      Put Symbol (ESC);   Put Symbol (ESC)            {blotches}
      Put String (Text)
      Put Symbol (CR)
      Line 25 Enabled = 1
   %else %if Terminal Model = WY 75
      %if Terminal Width = 132 %start
         {Wider top line in 132 mode!}
         Length (Text) = 128 %if Length (Text) > 128
      %else
         Length (Text) = 76 %if Length (Text) > 76
      %finish
      Escape String ("[>,`")
      Put Symbol (STX);    Put Symbol (STX)
      Put String (Text)
      Put Symbol ('`')
      Line 25 Enabled = 1
   %finish
%end {Put Line 25}

%external %routine Close Line 25 %alias "IE_25_0"
   %if Line 25 Enabled # 0 %start
      %if Terminal Family = Freedom %start
         Escape Symbol (SO)
         Line 25 Enabled = 0
      %else %if Terminal Family = Wyse
         Escape Symbol ('F')
         Put Symbol (CR)
      %else %if Terminal Model = WY 75
         Escape STring ("[>,//")
      %finish
   %finish
%end {Close Line 25}  


%end %of %file
