home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / modem / term.zip / INSTALL.C next >
C/C++ Source or Header  |  1987-07-15  |  4KB  |  266 lines

  1. #include <dos.h>
  2. #include <stdio.h>
  3.  
  4. #define BYTE unsigned char
  5. #define WORD unsigned int
  6.  
  7. char tbuf[4096];
  8. char copyr[] = "HiTerm   memory resident terminal program\
  9.     Version 2.2   04-09-87\n\
  10. Copyright (c) Hans Irtel & Karl Gegenfurtner\n";
  11.  
  12. main(argc, argv)
  13. int argc;
  14. char **argv;
  15. {
  16.    char *tfile;
  17.    unsigned char linepar = 227;
  18.    unsigned char fg = 0x74;
  19.    unsigned char bg = 0x47;
  20.    unsigned int port = 2;
  21.    unsigned int sw = 0x3400;
  22.    int i, baud, stop, word;
  23.    int td, tlen;
  24.    char parity;
  25.    BYTE getlpar();
  26.    WORD getcode();
  27.  
  28.    printf(copyr);
  29.    printf("\nInstallation procedure\n");
  30.    if (argc > 1)
  31.       tfile = argv[1];
  32.    else
  33.       tfile = "term.com";
  34.  
  35.    if ((td = open(tfile, 0x8000)) == -1) {
  36.       printf("File %s not found\n", tfile);
  37.       exit(1);
  38.    }
  39.    tlen = read(td, tbuf, 4096);
  40.    close(td);
  41.  
  42.    printf("Installing file %s\n", tfile);
  43.  
  44.     /*
  45.      * get the comm port
  46.      */
  47.  
  48. l1:
  49.    printf("\nWhat comm port are you using (1 or 2) ? ");
  50.    scanf("%d", &i);
  51.    if (i == 1 || i == 2)
  52.       port = i;
  53.    else {
  54.       printf("illegal port number, try again");
  55.       goto l1;
  56.    }
  57.  
  58.    /*
  59.     * get line parameters
  60.     */
  61.    
  62.    printf("Enter baudrate: "); scanf("%d", &baud);
  63.    printf("Parity 0 (even) 1 (odd) other values (no): "); scanf("%d", &parity); 
  64.    if (parity == 0) 
  65.       parity = 'e';
  66.    else if (parity == 1) 
  67.       parity = 'o';
  68.    else 
  69.       parity = 'n';
  70.    printf("Word length: ");      scanf("%d", &word);
  71.    printf("Stop bits: ");        scanf("%d", &stop);
  72.    linepar = getlpar(baud, stop, word, parity);
  73.  
  74.    /*
  75.     * get colors
  76.     */
  77.  
  78.    drawcolors();
  79.    printf("Normal Video Color: "); scanf("%d", &fg);
  80.    printf("Reverse Video Color: "); scanf("%d", &bg);
  81.  
  82.    /*
  83.     * get hotkey
  84.     */
  85.  
  86.    printf("Press the key with which to activate term: ");
  87.    sw = getcode();
  88.  
  89.    /*
  90.     * now patch it
  91.     */
  92.  
  93.     tbuf[3] = fg;
  94.     tbuf[4] = bg;
  95.     tbuf[5] = port;
  96.     tbuf[7] = linepar;
  97.     tbuf[8] = (BYTE)(sw & 0xff);
  98.     tbuf[9] = (BYTE)(sw >> 8);
  99.  
  100.    /*
  101.     * and write it back
  102.     */
  103.    if ((td = open(tfile, 0x8001)) < 0) {
  104.       printf("cannot open %s for writing\n", tfile);
  105.       exit(1);
  106.    }
  107.    write(td, tbuf, tlen);
  108.    close(td);
  109.    printf("\nInstallation complete");
  110.  
  111.    return(0);
  112. }
  113.  
  114. drawcolors()
  115. {
  116.    WORD i;
  117.    WORD col, row;
  118.  
  119.    printf ("\033[J");
  120.    set_cur(0);
  121.    for (i=0,row=0; row<8; row++) {
  122.        for (col=0; col<16; col++,i++)
  123.            wr_color(i);
  124.        nextline();
  125.    }
  126.    nextline();
  127.    nextline();
  128. }
  129.  
  130.  
  131. #define NBAUDS    8
  132. static struct baudT {
  133.     WORD rate;
  134.     BYTE pat;
  135. } bT [NBAUDS] = {
  136.   110, 0,
  137.   150, 1,
  138.   300, 2,
  139.   600, 3,
  140.   1200, 4,
  141.   2400, 5,
  142.   4800, 6,
  143.   9600, 7
  144. };
  145.  
  146. BYTE getlpar(b, s, w, p )
  147. WORD b;
  148. BYTE p, s, w;
  149. {
  150.     int i;
  151.     BYTE actual_pars;
  152.  
  153.     actual_pars = 0;
  154.     for (i=0; i<NBAUDS; i++)
  155.        if (bT[i].rate == b) {
  156.             actual_pars &= 31;
  157.             actual_pars |= bT[i].pat << 5;
  158.         }
  159.     actual_pars &= 231;
  160.       if (p == 'o')
  161.         actual_pars |= 32;
  162.     else if (p == 'e')
  163.         actual_pars |= 96;
  164.     actual_pars &= 251;
  165.     actual_pars |= (s-1) << 2;
  166.     actual_pars &= 252;
  167.     actual_pars |= w - 5;
  168.     return (actual_pars);
  169. }
  170.  
  171. WORD getcode()
  172. {
  173.    WORD ch, key_get();
  174.    BYTE scan, ascii;
  175.    union REGS kr;
  176.  
  177.    kr.h.ah = 0;
  178.    int86(0x16, &kr, &kr);
  179.    return kr.x.ax;
  180. }
  181.  
  182.  
  183. #define intr(n, r)  int86(n, r, r)
  184. #define VIDEO     0x10
  185.  
  186. WORD cur_page()
  187. {
  188.    union REGS vr;
  189.  
  190.    vr.h.ah = 0x0f;
  191.    intr(VIDEO, &vr);
  192.    return(vr.h.bh);
  193. }
  194.    
  195. set_cur(xy)
  196. WORD xy;
  197. {
  198.    union REGS vr;
  199.    
  200.    vr.h.bh = cur_page();
  201.    vr.h.ah = 0x02;
  202.    vr.x.dx = xy;
  203.    intr(VIDEO, &vr);
  204. }
  205.  
  206. WORD get_cur()
  207. {
  208.    union REGS vr;
  209.  
  210.    vr.h.bh = cur_page();
  211.    vr.h.ah = 0x03;
  212.    intr(VIDEO, &vr);
  213.    return (vr.x.dx);
  214. }            
  215.  
  216. ch_out(c, c_attr)
  217. BYTE c, c_attr;
  218. {
  219.   union REGS vr;
  220.  
  221.   vr.h.ah = 0x09;
  222.   vr.h.al = c;
  223.   vr.h.bl = c_attr;
  224.   vr.h.bh = cur_page();
  225.   vr.x.cx = 1;
  226.   intr(VIDEO, &vr);
  227. }
  228.  
  229. wrtty(c)
  230. BYTE c;
  231. {
  232.    union REGS vr;
  233.  
  234.    vr.h.ah = 0x0e;
  235.    vr.h.al = c;
  236.    vr.h.bh = cur_page();
  237.    intr(VIDEO, &vr);
  238. }
  239.  
  240. wr_color(i)
  241. WORD i;
  242. {
  243.    char str[4];
  244.    int j;
  245.    WORD xy;
  246.  
  247.    str[0] = ' ';
  248.    str[1] = i/100 + '0';
  249.    str[2] = (i%100)/10 + '0';
  250.    str[3] = i % 10 + '0';
  251.    for (j=0; j<4;j++) {
  252.        ch_out(str[j], i);
  253.        xy = get_cur();
  254.        set_cur(xy+1);
  255.    }
  256. }
  257.  
  258. nextline()
  259. {
  260.    WORD xy;
  261.  
  262.    xy = get_cur();
  263.    set_cur((xy + 256)&0xff00);
  264. }
  265.  
  266.