home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / telecomm / t100 / vt100.c < prev   
C/C++ Source or Header  |  1993-09-26  |  19KB  |  983 lines

  1. #define DEBUG
  2.  
  3. /*
  4.  *    vt100.c - emulates a vt100 using vt52 codes when possible
  5.  *
  6.  *    this code handles an escape sequence only. on entry, the ESC has
  7.  *    already been read from AUX:. it writes all output to CON: via bios.
  8.  *
  9.  *    this compiles (and runs :-) with gcc 1.40 and mint libraries, PL 10.
  10.  *    it should also work with "normal" gcc libraries.
  11.  */
  12.  
  13.  
  14. #ifndef lint
  15. static char *rcsid_vt100_c = "$Id: vt100.c,v 1.0 1991/09/12 20:32:56 rosenkra Exp $";
  16. #endif
  17.  
  18. /*
  19.  * $Log: vt100.c,v $
  20.  * Revision 1.0  1991/09/12  20:32:56  rosenkra
  21.  * Initial revision
  22.  *
  23.  */
  24.  
  25. #include <stdio.h>
  26. #include <stdlib.h>
  27. #include <osbind.h>
  28. #include "t100.h"
  29.  
  30.  
  31.  
  32. /*
  33.  *    macro to get a char from AUX. we check status some number of times.
  34.  *    if no char available, we may have a hosed connection or host screwed
  35.  *    up. otherwise, if char available, get it. use BIOS...
  36.  */
  37. #define GET_NEXT_CHAR \
  38. { \
  39.     long counter; \
  40.     for (counter = 1000; counter; counter--) {\
  41.     if (Bconstat (AUX)) break; \
  42.     } \
  43.     if (counter == 0) goto no_char_avail; \
  44.     c = (int) Bconin (AUX); \
  45. }
  46.  
  47.  
  48. /*
  49.  *    default value if none specified. if not 0, be careful!
  50.  */
  51. #define VAL_DEFAULT    0
  52.  
  53.  
  54. /*
  55.  *    modes, etc...
  56.  */
  57. extern int    bold;            /* OFF 1m */
  58. extern int    underline;        /* OFF 4m */
  59. extern int    blinking;        /* OFF 5m */
  60. extern int    reverse;        /* OFF 7m */
  61. extern int    wrap;            /* ON (set) */
  62. extern int    video;            /* 0=normal (reset) */
  63. extern int    repeat;            /* ON (set) */
  64. extern int    curskey;        /* OFF (reset) */
  65. extern int    keypad;            /* 0=normal (reset) */
  66. extern int    colwidth;        /* 0=80 (reset), 1=132 */
  67. extern int    smooth;            /* OFF (reset) */
  68. extern int    origmode;        /* 0=normal (reset) */
  69.  
  70.  
  71.  
  72. /*------------------------------*/
  73. /*    vt100            */
  74. /*------------------------------*/
  75. void vt100 ()
  76. {
  77.  
  78. /*
  79.  *    emulate vt100. upon entry, we got a ESC char from AUX. only the
  80.  *    ESC was read so far.
  81.  *
  82.  *    note: in order to report things back to the host, we must know
  83.  *    things like baud rate, parity, etc. these are not in the termcap,
  84.  *    however, so don't sweat it for now. we also can't report postion.
  85.  *
  86.  *    we do not do character generators (g0 and g1).
  87.  *
  88.  *    we do not do LEDs.
  89.  *
  90.  *    here is the basic logic:
  91.  *
  92.  *        we got an ESC already from AUX.
  93.  *
  94.  *        get_next_char.
  95.  *        if (current_char == >,=,8,7,or M)
  96.  *            handle.
  97.  *            done.
  98.  *        else if (current_char == [)
  99.  *            get_next_char.
  100.  *            if (current_char == ?)
  101.  *                get_next_char. it should be 1-8. save val.
  102.  *                get_next_char. it should be h or l.
  103.  *                handle.
  104.  *                done.
  105.  *            else if (current_char == number)
  106.  *                read all of number. convert and save.
  107.  *                get_next_char.
  108.  *            else
  109.  *                val1 = 0 (or 1)
  110.  *            if (current_char == ;)
  111.  *                get_next_char.
  112.  *                if (current_char == number)
  113.  *                    read all of number. convert and save.
  114.  *                    get_next_char.
  115.  *                else
  116.  *                    val2 = 0 (or 1)
  117.  *                switch (current_char)
  118.  *                  H or f
  119.  *                  r
  120.  *                  R
  121.  *            else
  122.  *                switch (current_char)
  123.  *                  A
  124.  *                  B
  125.  *                  C
  126.  *                  D
  127.  *              H
  128.  *                  J
  129.  *                  K
  130.  *                  L
  131.  *                  M
  132.  *                  P
  133.  *                  g
  134.  *                  h
  135.  *                  l
  136.  *                  m
  137.  *                  n
  138.  *                  x
  139.  *                  @
  140.  *        else
  141.  *            error?
  142.  *
  143.  */
  144.  
  145. /*
  146.  
  147. here are likely codes to be seen. xxx is optional, 0, 1, or 2 chars:
  148.  
  149. \E    [    xxx    J
  150. \E    [    xxx    K
  151. \E    [    xxx    ;    xxx    H    position cursor
  152. \E    [    xxx    H            special case of position cursor
  153. \E    [    xxx    ;    xxx    r
  154. \E    [    xxx    C            cursor right
  155. \E    [    xxx    D            cursor left
  156. \E    [    xxx    B            cursor down
  157. \E    [    xxx    A            cursor up
  158. \E    8
  159. \E    7
  160. \E    M
  161. \E    [    ?    1    l        cursor key mode reset
  162. \E    [    ?    1    h                set
  163. \E    [    ?    3    l        col width reset (to 80)
  164. \E    [    ?    4    l
  165. \E    [    ?    5    l
  166. \E    [    ?    7    h
  167. \E    [    ?    8    h        auto repeat mode set
  168. \E    >
  169. \E    =
  170. \E    [    1    m
  171. \E    [    4    m
  172. \E    [    5    m
  173. \E    [    7    m
  174. \E    [    0    m
  175. \E    [    m
  176.  
  177.  
  178. this is a real vt100 termcap with equiv vt52 codes:
  179.  
  180. vt100            vt52        desc
  181.  
  182. :cd=\E[J:        :\EJ:        clear display after cursor
  183. :ce=\E[K:        :\EK:        clear to end of line
  184. :cl=\E[;H\E[2J:        :\EH\EJ:    home cursor, clear screen
  185. :cm=\E[%i%d;%dH:    :\EY%+ %+ :    move to row #1 and col #2
  186. :cs=\E[%i%d;%dr:    ---        change scrolling region to rows #1 to #2
  187. :ho=\E[H:        :\EH:        move cursor home
  188. :is=\E[1;24r\E[24;1H:    :\Ev\Ee:    initialization string (wrapon, curs vis)
  189. :nd=\E[C:        :\EC:        non-destructive space (move right)
  190. :rc=\E8:        :\Ek:        restore cursor to position saved by sc
  191. :sc=\E7:        :\Ej:        save absolute cursor position
  192. :sr=\EM:        :\EI:        scroll reverse one line
  193. :up=\E[A:        :\EA:        move cursor up
  194.  
  195. :rs=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:    reset to sane modes
  196.  
  197. :ke=\E[?1l\E>:        ---        turn keypad off, if possible
  198. :ks=\E[?1h\E=:        ---        turn keypad on, if possible
  199.  
  200. :mb=\E[5m:        ---        turn on blinking attribute
  201. :md=\E[1m:        ---        turn on bold
  202. :me=\E[m:        :\Eq:        turn off all attributes
  203. :mr=\E[7m:        :\Ep:        turn on reverse video
  204.  
  205. :se=\E[m:        :\Eq:        end standout (reverse) mode
  206. :so=\E[7m:        :\Ep:        begin standout (reverse) mode
  207. :ue=\E[m:        ---        end underline mode
  208. :us=\E[4m:        ---        begin underline mode
  209.  
  210.  */
  211.  
  212.  
  213.     register int    c;
  214.     register int    val1;
  215.     register int    val2;
  216.     int        row;
  217.     int        col;
  218.     int        i;
  219.  
  220.  
  221.  
  222.  
  223.     /*
  224.      *   this is first char after an ESC.
  225.      */
  226.     GET_NEXT_CHAR;
  227.  
  228.  
  229.     /*
  230.      *   what is it?
  231.      */
  232.     switch (c)
  233.     {
  234.     case 'Z':            /* terminal ID */
  235.         /* this is obsolete. use ESC [ c */
  236.         return;
  237.         break;    /*NOTREACHED*/
  238.  
  239.     case 'c':            /* reset to initial state */
  240.         vt100_reset ();
  241.         return;
  242.         break;    /*NOTREACHED*/
  243.  
  244.     case 'H':            /* set tab at current position */
  245.         return;
  246.         break;    /*NOTREACHED*/
  247.  
  248.     case 'D':            /* index */
  249.         Bconout (CON, (int) 27);
  250.         Bconout (CON, (int) 'B');
  251.         return;
  252.         break;    /*NOTREACHED*/
  253.  
  254.     case 'M':            /* scroll reverse one line */
  255.         Bconout (CON, (int) 27);
  256.         Bconout (CON, (int) 'I');
  257.         return;
  258.         break;    /*NOTREACHED*/
  259.  
  260.     case 'E':            /* next line */
  261.         Bconout (CON, (int) 13);
  262.         Bconout (CON, (int) 27);
  263.         Bconout (CON, (int) 'B');
  264.         return;
  265.         break;    /*NOTREACHED*/
  266.  
  267.     case '>':            /* reset keypad (normal) */
  268.         keypad = 0;
  269.         return;
  270.         break;    /*NOTREACHED*/
  271.  
  272.     case '=':            /* set keypad (application) */
  273.         keypad = 1;
  274.         return;
  275.         break;    /*NOTREACHED*/
  276.  
  277.     case '8':            /* restore cursor to saved loc */
  278.         Bconout (CON, (int) 27);
  279.         Bconout (CON, (int) 'k');
  280.         return;
  281.         break;    /*NOTREACHED*/
  282.  
  283.     case '7':            /* save cursor location */
  284.         Bconout (CON, (int) 27);
  285.         Bconout (CON, (int) 'j');
  286.         return;
  287.         break;    /*NOTREACHED*/
  288.  
  289.     case '[':
  290.         /*
  291.          *   get next one...
  292.          */
  293.         GET_NEXT_CHAR;
  294.  
  295.         if (c == '?')
  296.         {
  297.             /*
  298.              *   next char SHOULD be a number...
  299.              */
  300.             GET_NEXT_CHAR;
  301.  
  302.             if ((c >= '0') && (c <= '9'))
  303.             {
  304.                 /*
  305.                  *   get all of number. store as int val1.
  306.                  */
  307.                 val1 = 0;
  308.                 do
  309.                 {
  310.                     val1 = (10 * val1) + (c - '0');
  311.  
  312.                     GET_NEXT_CHAR;
  313.     
  314.                 } while ((c >= '0') && (c <= '9'));
  315.  
  316.  
  317.                 /*
  318.                  *   what was last char? (one causing do/while
  319.                  *   to stop)
  320.                  */
  321.                 if (c == 'l')
  322.                 {
  323.                     switch (val1)
  324.                     {
  325.                     case 1:        /* reset cursor key */
  326.                         curskey = 0;
  327.                         return;
  328.                         break;    /*NOTREACHED*/
  329.  
  330.                     case 2:        /* change mode */
  331.                         /*
  332.                          *   this may not be portable
  333.                          */
  334.                         return;
  335.                         break;    /*NOTREACHED*/
  336.  
  337.                     case 3:        /* reset col width */
  338.                         colwidth = 0;
  339.                         return;
  340.                         break;    /*NOTREACHED*/
  341.  
  342.                     case 4:        /* reset smooth scroll*/
  343.                         smooth = 0;
  344.                         return;
  345.                         break;    /*NOTREACHED*/
  346.  
  347.                     case 5:        /* reset screen mode */
  348.                         /*
  349.                          *   normal video. bg is color
  350.                          *   0. fg depends on rez.
  351.                          *   black is low intens (0),
  352.                          *   white is high (777).
  353.                          */
  354.                         switch (Getrez ())
  355.                         {
  356.                         case 0:
  357.                             Setcolor (0,  0x777);
  358.                             Setcolor (15, 0);
  359.                             break;
  360.                         case 1:
  361.                             Setcolor (0, 0x777);
  362.                             Setcolor (3, 0);
  363.                             break;
  364.                         case 2:
  365.                             Setcolor (0, 0x777);
  366.                             Setcolor (1, 0);
  367.                             break;
  368.                         }
  369.                         video = 0;
  370.                         return;    /*NOTREACHED*/
  371.                         break;
  372.  
  373.                     case 6:        /* reset origin mode */
  374.                         origmode = 0;
  375.                         return;
  376.                         break;    /*NOTREACHED*/
  377.  
  378.                     case 7:        /* reset wrap */
  379.                         Bconout (CON, (int) 27);
  380.                         Bconout (CON, (int) 'w');
  381.                         wrap = 0;
  382.                         return;
  383.                         break;    /*NOTREACHED*/
  384.  
  385.                     case 8:        /* reset auto repeat*/
  386.                         Kbrate (0, 0);
  387.                         repeat = 0;
  388.                         return;
  389.                         break;    /*NOTREACHED*/
  390.  
  391.                     default:
  392.                         /* ERROR... */
  393. #ifdef DEBUG
  394. Cconws ("\r\n\nvt100: error in ESC ? xxx l code\r\n\n");
  395. goto error_in_code;
  396. #endif
  397.                         break;
  398.                     }
  399.                 }
  400.                 else if (c == 'h')
  401.                 {
  402.                     switch (val1)
  403.                     {
  404.                     case 1:        /* set cursor key */
  405.                         curskey = 1;
  406.                         return;
  407.                         break;    /*NOTREACHED*/
  408.  
  409.                     case 3:        /* set col width */
  410.                         colwidth = 1;
  411.                         return;
  412.                         break;    /*NOTREACHED*/
  413.  
  414.                     case 4:        /* set smooth scroll*/
  415.                         smooth = 1;
  416.                         return;
  417.                         break;    /*NOTREACHED*/
  418.  
  419.                     case 5:        /* set screen mode */
  420.                         /*
  421.                          *   reverse video. bg is color
  422.                          *   0. fg depends on rez.
  423.                          *   black is low intens (0),
  424.                          *   white is high (777).
  425.                          */
  426.                         switch (Getrez ())
  427.                         {
  428.                         case 0:
  429.                             Setcolor (0, 0);
  430.                             Setcolor (15, 0x777);
  431.                             break;
  432.                         case 1:
  433.                             Setcolor (0, 0);
  434.                             Setcolor (3, 0x777);
  435.                             break;
  436.                         case 2:
  437.                             Setcolor (0, 0);
  438.                             Setcolor (1, 0x777);
  439.                             break;
  440.                         }
  441.                         video = 1;
  442.                         return;
  443.                         break;    /*NOTREACHED*/
  444.  
  445.                     case 6:        /* set origin mode */
  446.                         origmode = 1;
  447.                         return;
  448.                         break;    /*NOTREACHED*/
  449.  
  450.                     case 7:        /* set wrap */
  451.                         Bconout (CON, (int) 27);
  452.                         Bconout (CON, (int) 'v');
  453.                         wrap = 1;
  454.                         return;
  455.                         break;    /*NOTREACHED*/
  456.  
  457.                     case 8:        /* set auto repeat*/
  458.                         Kbrate (50, 2);
  459.                         repeat = 1;
  460.                         return;
  461.                         break;    /*NOTREACHED*/
  462.  
  463.                     default:    /* ERROR... */
  464. #ifdef DEBUG
  465. Cconws ("\r\n\nvt100: error in ESC ? xxx h code\r\n\n");
  466. goto error_in_code;
  467. #endif
  468.                         break;
  469.                     }
  470.                 }
  471.                 else if (c == 'i')
  472.                 {
  473.                     switch (val1)
  474.                     {
  475.                     case 1:        /* print line */
  476.                         return;
  477.                         break;    /*NOTREACHED*/
  478.  
  479.                     default:    /* ERROR... */
  480. #ifdef DEBUG
  481. Cconws ("\r\n\nvt100: error in ESC ? xxx i code\r\n\n");
  482. goto error_in_code;
  483. #endif
  484.                         break;
  485.                     }
  486.                 }
  487.                 else
  488.                 {
  489.                     /* ERROR... */
  490. #ifdef DEBUG
  491. Cconws ("\r\n\nvt100: error in ESC ? code (unknown param)\r\n\n");
  492. goto error_in_code;
  493. #endif
  494.                 }
  495.             }
  496.             else
  497.             {
  498.                 /* ERROR... */
  499. #ifdef DEBUG
  500. Cconws ("\r\n\nvt100: error in ESC ? code (no param)\r\n\n");
  501. goto error_in_code;
  502. #endif
  503.             }
  504.  
  505.             return;
  506.         }
  507.         else if ((c >= '0') && (c <= '9'))
  508.         {
  509.             /*
  510.              *   read all of number. could be 1,2, or 3 digits.
  511.              */
  512.             val1 = 0;
  513.             do
  514.             {
  515.                 val1 = (10 * val1) + (c - '0');
  516.  
  517.                 GET_NEXT_CHAR;
  518.  
  519.             } while ((c >= '0') && (c <= '9'));
  520.         }
  521.         else
  522.             val1 = VAL_DEFAULT;
  523.  
  524.         /*
  525.          *   this char should not be a number...
  526.          */
  527.         if (c == ';')
  528.         {
  529.             GET_NEXT_CHAR;
  530.  
  531.             if ((c >= '0') && (c <= '9'))
  532.             {
  533.                 val2 = 0;
  534.                 do
  535.                 {
  536.                     val2 = (10 * val2) + (c - '0');
  537.  
  538.                     GET_NEXT_CHAR;
  539.  
  540.                 } while ((c >= '0') && (c <= '9'));
  541.             }
  542.             else
  543.                 val2 = VAL_DEFAULT;
  544.  
  545.  
  546.             /*
  547.              *   ok. we have a 2 parameter command. there are
  548.              *   not too many of these...
  549.              */
  550.             switch (c)
  551.             {
  552.             case 'H':        /* absolute cursor position */
  553.             case 'f':
  554.                 if (val1 == 0)
  555.                     val1 = 1;
  556.                 if (val2 == 0)
  557.                     val2 = 1;
  558.                 row = val1 - 1 + ' ';
  559.                 col = val2 - 1 + ' ';
  560.                 Bconout (CON, (int) 27);
  561.                 Bconout (CON, (int) 'Y');
  562.                 Bconout (CON, (int) row);
  563.                 Bconout (CON, (int) col);
  564.                 return;
  565.                 break;    /*NOTREACHED*/
  566.  
  567.             case 'r':        /* set scroll region */
  568.                 return;
  569.                 break;    /*NOTREACHED*/
  570.  
  571.             case 'R':        /* cursor position report */
  572.                 return;
  573.                 break;    /*NOTREACHED*/
  574.  
  575.             case 'y':        /* initiate self test, reset*/
  576.                 if ((val1 != 2) && (val2 != 1))
  577.                 {
  578.                     /* ERROR... */
  579. #ifdef DEBUG
  580. Cconws ("\r\n\nvt100: error in ESC [ xxx ; yyy y code\r\n\n");
  581. goto error_in_code;
  582. #endif
  583.                 }
  584.                 vt100_reset ();
  585.                 return;
  586.                 break;    /*NOTREACHED*/
  587.  
  588.             default:        /* ERROR... */
  589. #ifdef DEBUG
  590. Cconws ("\r\n\nvt100: error in ESC [ xxx ; yyy * code (unknown cmd)\r\n\n");
  591. goto error_in_code;
  592. #endif
  593.                 break;
  594.             }
  595.  
  596.             return;
  597.         }
  598.  
  599.         /*
  600.          *   single parameter command.
  601.          */
  602.         switch (c)
  603.         {
  604.         case 'A':            /* cursor up */
  605.             if (val1 == 0)
  606.                 val1 = 1;
  607.             for ( ; val1; val1--)
  608.             {
  609.                 Bconout (CON, (int) 27);
  610.                 Bconout (CON, (int) c);
  611.             }
  612.             return;
  613.             break;    /*NOTREACHED*/
  614.  
  615.         case 'B':            /* cursor down */
  616.             if (val1 == 0)
  617.                 val1 = 1;
  618.             for ( ; val1; val1--)
  619.             {
  620.                 Bconout (CON, (int) 27);
  621.                 Bconout (CON, (int) c);
  622.             }
  623.             return;
  624.             break;    /*NOTREACHED*/
  625.  
  626.         case 'C':            /* cursor right */
  627.             if (val1 == 0)
  628.                 val1 = 1;
  629.             for ( ; val1; val1--)
  630.             {
  631.                 Bconout (CON, (int) 27);
  632.                 Bconout (CON, (int) c);
  633.             }
  634.             return;
  635.             break;    /*NOTREACHED*/
  636.  
  637.         case 'D':            /* cursor left */
  638.             if (val1 == 0)
  639.                 val1 = 1;
  640.             for ( ; val1; val1--)
  641.             {
  642.                 Bconout (CON, (int) 27);
  643.                 Bconout (CON, (int) c);
  644.             }
  645.             return;
  646.             break;    /*NOTREACHED*/
  647.  
  648.         case 'H':            /* home (special case) */
  649.         case 'f':
  650.             Bconout (CON, (int) 27);
  651.             Bconout (CON, (int) c);
  652.             return;
  653.             break;    /*NOTREACHED*/
  654.  
  655.         case 'J':            /* erase in display */
  656.             if (val1 == 0)
  657.             {
  658.                 /* from cursor to end of page */
  659.                 Bconout (CON, (int) 27);
  660.                 Bconout (CON, (int) 'J');
  661.             }
  662.             else if (val1 == 1)
  663.             {
  664.                 /* from cursor to begin of page */
  665.                 Bconout (CON, (int) 27);
  666.                 Bconout (CON, (int) 'd');
  667.             }
  668.             else if (val1 == 2)
  669.             {
  670.                 /* clear entire screen */
  671.                 Bconout (CON, (int) 27);
  672.                 Bconout (CON, (int) 'E');
  673.             }
  674.             else
  675.             {
  676.                 /* ERROR... */
  677. #ifdef DEBUG
  678. Cconws ("\r\n\nvt100: error in ESC [ xxx J code\r\n\n");
  679. goto error_in_code;
  680. #endif
  681.             }
  682.             return;
  683.             break;    /*NOTREACHED*/
  684.  
  685.         case 'K':            /* erase in line */
  686.             if (val1 == 0)
  687.             {
  688.                 /* from cursor to end of line */
  689.                 Bconout (CON, (int) 27);
  690.                 Bconout (CON, (int) 'K');
  691.             }
  692.             else if (val1 == 1)
  693.             {
  694.                 /* from cursor to begin of line */
  695.                 Bconout (CON, (int) 27);
  696.                 Bconout (CON, (int) 'o');
  697.             }
  698.             else if (val1 == 2)
  699.             {
  700.                 /* clear entire line */
  701.                 Bconout (CON, (int) 27);
  702.                 Bconout (CON, (int) 'l');
  703.             }
  704.             else
  705.             {
  706.                 /* ERROR... */
  707. #ifdef DEBUG
  708. Cconws ("\r\n\nvt100: error in ESC [ xxx K code\r\n\n");
  709. goto error_in_code;
  710. #endif
  711.             }
  712.             return;
  713.             break;    /*NOTREACHED*/
  714.  
  715.         case 'L':            /* insert line */
  716.             if (val1 == 0)
  717.                 val1 = 1;
  718.             for ( ; val1; val1--)
  719.             {
  720.                 Bconout (CON, (int) 27);
  721.                 Bconout (CON, (int) c);
  722.             }
  723.             return;
  724.             break;    /*NOTREACHED*/
  725.  
  726.         case 'M':            /* delete line */
  727.             if (val1 == 0)
  728.                 val1 = 1;
  729.             for ( ; val1; val1--)
  730.             {
  731.                 Bconout (CON, (int) 27);
  732.                 Bconout (CON, (int) c);
  733.             }
  734.             return;
  735.             break;    /*NOTREACHED*/
  736.  
  737.         case 'P':            /* delete char */
  738.             return;
  739.             break;    /*NOTREACHED*/
  740.  
  741.         case 'c':            /* device attributes */
  742.             return;
  743.             break;    /*NOTREACHED*/
  744.  
  745.         case 'g':            /* clear tabs */
  746.             return;
  747.             break;    /*NOTREACHED*/
  748.  
  749.         case 'i':
  750.             if (val1 == 7)        /* enable ext port */
  751.             {
  752.             }
  753.             else if (val1 == 6)    /* disable ext port */
  754.             {
  755.             }
  756.             else if (val1 == 0)    /* print screen */
  757.             {
  758.             }
  759.             else if (val1 == 4)    /* reset transp print mode */
  760.             {
  761.             }
  762.             else if (val1 == 5)    /* set transp print mode */
  763.             {
  764.             }
  765.             return;
  766.             break;    /*NOTREACHED*/
  767.  
  768.         case 'h':
  769.             if (val1 == 4)        /* set insert mode */
  770.             {
  771.             }
  772.             else if (val1 == 2)    /* set keybd action mode */
  773.             {
  774.             }
  775.             else if (val1 == 20)    /* set newline mode */
  776.             {
  777.             }
  778.             else
  779.             {
  780.                 /* ERROR... */
  781.             }
  782.             return;
  783.             break;    /*NOTREACHED*/
  784.  
  785.         case 'l':
  786.             if (val1 == 4)        /* reset insert mode */
  787.             {
  788.             }
  789.             else if (val1 == 2)    /* reset keybd action mode */
  790.             {
  791.             }
  792.             else if (val1 == 20)    /* reset newline mode */
  793.             {
  794.             }
  795.             else
  796.             {
  797.                 /* ERROR... */
  798.             }
  799.             return;
  800.             break;    /*NOTREACHED*/
  801.  
  802.         case 'm':            /* select graphics mode */
  803.             if (val1 == 0)
  804.             {
  805.                 blinking  = 0;
  806.                 bold      = 0;
  807.                 reverse   = 0;
  808.                 underline = 0;
  809. #ifdef USE_FONTS
  810.                 fnt_roman ();
  811. #else
  812.                 Bconout (CON, (int) 27);
  813.                 Bconout (CON, (int) 'q');
  814. #endif
  815.  
  816.                 return;
  817.             }
  818.             else
  819.             {
  820.                 blinking  = 0;
  821.                 bold      = 0;
  822.                 reverse   = 0;
  823.                 underline = 0;
  824.  
  825.                 switch (val1)
  826.                 {
  827.                 case 1:
  828.                     bold = 1;
  829. #ifdef USE_FONTS
  830.                     fnt_bold ();
  831. #else
  832.                     Bconout (CON, (int) 27);
  833.                     Bconout (CON, (int) 'p');
  834. #endif
  835.                     return;
  836.                     break;    /*NOTREACHED*/
  837.  
  838.                 case 4:
  839.                     underline = 1;
  840. #ifdef USE_FONTS
  841.                     fnt_uline ();
  842. #else
  843.                     Bconout (CON, (int) 27);
  844.                     Bconout (CON, (int) 'p');
  845. #endif
  846.                     return;
  847.                     break;    /*NOTREACHED*/
  848.  
  849.                 case 5:
  850.                     blinking = 1;
  851.                     return;
  852.                     break;    /*NOTREACHED*/
  853.  
  854.                 case 7:
  855.                     reverse = 1;
  856. #ifdef USE_FONTS
  857.                     fnt_reverse ();
  858. #else
  859.                     Bconout (CON, (int) 27);
  860.                     Bconout (CON, (int) 'p');
  861. #endif
  862.                     return;
  863.                     break;    /*NOTREACHED*/
  864.  
  865.                 default:    /* ERROR... */
  866. #ifdef DEBUG
  867. Cconws ("\r\n\nvt100: error in ESC [ xxx m code (unknown param)\r\n\n");
  868. goto error_in_code;
  869. #endif
  870.                     break;
  871.                 }
  872.             }
  873.             return;
  874.             break;    /*NOTREACHED*/
  875.  
  876.         case 'n':            /* status report/req */
  877.             return;
  878.             break;    /*NOTREACHED*/
  879.  
  880.         case 'x':            /* req term params */
  881.             return;
  882.             break;    /*NOTREACHED*/
  883.  
  884.         case '@':            /* insert char */
  885.             return;
  886.             break;    /*NOTREACHED*/
  887.         }
  888.  
  889.         return;
  890.         break;    /*NOTREACHED*/
  891.  
  892.  
  893.     default:                /* ERROR or unrecognized... */
  894. /*        Bconout (CON, (int) c);*/
  895. #ifdef DEBUG
  896. Cconws ("\r\n\nvt100: error in ESC code (unknown cmd)\r\n\n");
  897. goto error_in_code;
  898. #endif
  899.         goto error_in_code;
  900.         break;
  901.  
  902.     } /* end main switch */
  903.  
  904.  
  905.  
  906.  
  907.     /*
  908.      *   phew...THAT was fun...
  909.      */
  910.     return;
  911.  
  912.  
  913.  
  914.  
  915. no_char_avail: ;
  916.  
  917.     Cconws ("\r\n\nvt100: error, no_char_avail from AUX\r\n\n");
  918.  
  919.     return;
  920.  
  921.  
  922.  
  923. error_in_code: ;
  924.  
  925.     return;
  926. }
  927.  
  928.  
  929.  
  930.  
  931.  
  932. /*------------------------------*/
  933. /*    vt100_reset        */
  934. /*------------------------------*/
  935. void vt100_reset ()
  936. {
  937.  
  938. #ifdef USE_FONTS
  939.     fnt_roman ();            /* normal ESC [ 0 m */
  940. #endif
  941.     blinking  = 0;
  942.     bold      = 0;
  943.     reverse   = 0;
  944.     underline = 0;
  945.  
  946.     repeat = 1;
  947.     Kbrate (50, 2);            /* repeat ESC [ ? 8 h */
  948.  
  949.     wrap = 1;
  950.     Bconout (CON, (int) 27);    /* wrap ESC [ ? 7 h */
  951.     Bconout (CON, (int) 'v');
  952.  
  953.     video = 0;
  954.     switch (Getrez ())        /* normal ESC [ ? 5 l */
  955.     {
  956.     case 0:
  957.         Setcolor (0,  0x777);
  958.         Setcolor (15, 0);
  959.         break;
  960.     case 1:
  961.         Setcolor (0, 0x777);
  962.         Setcolor (3, 0);
  963.         break;
  964.     case 2:
  965.         Setcolor (0, 0x777);
  966.         Setcolor (1, 0);
  967.         break;
  968.     }
  969.  
  970.     curskey = 0;
  971.  
  972.     keypad = 0;
  973.  
  974.     colwidth = 0;
  975.  
  976.     smooth = 0;
  977.  
  978.     origmode = 0;
  979.  
  980.     return;
  981. }
  982.  
  983.