home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_100 / 183_01 / comtrm.c < prev    next >
Text File  |  1984-06-22  |  8KB  |  408 lines

  1. /*
  2.   commterm.c - a stupid communications program demonstrating the use of
  3.            commsupp.c and commasm.a
  4.  
  5.   Tom Poindexter, March 1984
  6.  
  7. */
  8.  
  9. #include "comsup.h"
  10.  
  11. #define ALT_H  0x2300  /* help    */
  12. #define ALT_B  0x3000  /* break */
  13. #define ALT_X  0x2d00  /* exit    */
  14. #define ALT_E  0x1200  /* echo    */
  15. #define ALT_S  0x1f00  /* pause */
  16. #define ALT_Q  0x1000  /* resume*/
  17. #define PGUP   0x4900  /* upload */
  18. #define PGDN   0x5100  /* download */
  19. #define NUL    0
  20. #define BS     8
  21. #define LF     10
  22. #define CR     13
  23. #define XON    17
  24. #define XOFF   19
  25. #define DELAY  5000
  26.  
  27. int max;
  28. unsigned total,min_sp;
  29.  
  30. #include "stdio.h"
  31.  
  32. main ()
  33.  
  34. {
  35.   int port,baud,parity,data,stop,buff_len;
  36.   int c,e,x,i,n,x_state,counter;
  37.   int bytecount();
  38.   FILE f;
  39.   char strn[128];
  40.  
  41.  
  42.   puts("\n\n\ncommterm\n");
  43.  
  44.   puts("\nComm port (1 or 2)? ");
  45.   gets(strn);
  46.   port = atoi(strn);
  47.  
  48.   puts("\nBaud rate? ");
  49.   gets(strn);
  50.   baud = atoi(strn);
  51.  
  52.   puts("\nParity (0=none, 1=odd, 2=even, 3=mark, 4=space)? ");
  53.   gets(strn);
  54.   parity = atoi(strn);
  55.  
  56.   puts("\nData length (5 - 8)? ");
  57.   gets(strn);
  58.   data = atoi(strn);
  59.  
  60.   puts("\nStop bits (1 or 2)? ");
  61.   gets(strn);
  62.   stop = atoi(strn);
  63.  
  64.   puts("\nBuffer length? ");
  65.   gets(strn);
  66.   buff_len = atoi(strn);
  67.  
  68.   puts("\nXON/XOFF enabled (y or n)? ");
  69.   gets(strn);
  70.   x_state = (tolower(strn[0]) == 'y') ? TRUE : FALSE;
  71.  
  72.   if (init_com(port,baud,parity,data,stop,buff_len) == ERROR)
  73.    {
  74.     putchar(7);
  75.     puts("\n\nSorry, you screwed up somewhere along the line.\n\n");
  76.     exit();
  77.    }
  78.   else
  79.    {
  80.     set_xoff(port,x_state);
  81.     on_com(port,bytecount);
  82.    }
  83.  
  84.   puts("\nEnter modem initialization string: ");
  85.   gets(strn);
  86.   outp_strn(port,strn,128);
  87.   outp_char(port,CR);
  88.  
  89.   puts("\n\nPress ALT-H for help on special keys.\n\n");
  90.   total = max = c = e = n = 0;
  91.   min_sp = 0xffff;
  92.  
  93.   while (c != ALT_X)
  94.    {
  95.  
  96.     termin(port,1);
  97.  
  98.     if (com_stat(port) & BREAK_IND)
  99.       puts("\n\n**B R E A K**\n\n");
  100.  
  101.     c = key_in();
  102.     if (c > 0)
  103.      {
  104.       switch (c)
  105.        {
  106.     case ALT_H:
  107.      puts("\n\ncommterm help\n\n");
  108.      puts("press.........to\n");
  109.      puts("Alt-E.........echo key strokes\n");
  110.      puts("Alt-B.........send break signal\n");
  111.      puts("Alt-H.........help on keys\n");
  112.      puts("Alt-X.........exit program\n");
  113.      puts("Alt-S.........pause (XOFF)\n");
  114.      puts("Alt-Q.........resume (XON)\n");
  115.      puts("PgUp..........upload a file\n");
  116.      puts("PgDn..........download to a file\n");
  117.      puts("\n\ncontinue...\n\n");
  118.      break;
  119.  
  120.     case ALT_B:
  121.      send_brk(port);
  122.      break;
  123.  
  124.     case ALT_E:
  125.      e = !e;
  126.      break;
  127.  
  128.     case PGUP:
  129.      puts("\n\nUpload what file? ");
  130.      gets(strn);
  131.      f=fopen(strn,"r");
  132.      if (f == FALSE)
  133.       {
  134.        puts("\nERROR - file ");
  135.        puts(strn);
  136.        puts(" not found.....\n");
  137.       }
  138.      else
  139.       {
  140.        puts("\nUploading ");
  141.        puts(strn);
  142.        puts(", press PgUp key to abort.....\n\n");
  143.        while (fgets(strn,128,f) != FALSE && key_in() != PGUP)
  144.         {
  145.          termin(port,0);
  146.          for (i = 0; i < 128 && strn[i] != '\0'; i++)
  147.            {
  148.         if (x_state && recd_xoff(port) == TRUE)
  149.          {
  150.           puts("\nXOFF received.  Waiting for XON or press any key to continue.\n");
  151.           while (inp_char(port) != XON && csts() == FALSE)
  152.             ;
  153.          }
  154.         outp_char(port,strn[i]);
  155.         termin(port,0);
  156.            }
  157.           outp_char(port,CR);
  158.         }
  159.        fclose(f);
  160.        puts("\nUpload complete.\n\n");
  161.       }
  162.      break;
  163.  
  164.     case PGDN:
  165.      puts("\n\nDownload to what file? ");
  166.      gets(strn);
  167.      if ((f=fopen(strn,"r")) == FALSE)
  168.       {
  169.        if (strlen(strn) > 0)
  170.         {
  171.          puts("\nCreating ");
  172.          puts(strn);
  173.          puts("\n\n");
  174.          f = creat(strn);
  175.         }
  176.        else
  177.          f = 0;
  178.       }
  179.      else
  180.       {
  181.        fclose(f);
  182.        puts("\nFile ");
  183.        puts(strn);
  184.        puts(" exists, press 'e' to erase file or 'a' to add to it: ");
  185.        i = getchar();
  186.        if (tolower(i) == 'e')
  187.          f = creat(strn);
  188.        else
  189.          f = fopen(strn,"a");
  190.       }
  191.      puts("\n\nDownloading, press PgDn again to close file.\n\n");
  192.      counter = DELAY;
  193.      while (((c=key_in()) != PGDN) && (f != 0))
  194.       {
  195.        if (c != 0)
  196.          conout(c,e,port);
  197.        if (inp_cnt(port) > max) max = inp_cnt(port);
  198.        i = inp_cnt(port);
  199.        i = (i <= 127) ? i : 127;
  200.        inp_strn(port,strn,i);
  201.        strn[i] = '\0';
  202.        fputs(strn,f);
  203.        for (n = 0; strn[n] != '\0'; n++)
  204.          switch (strn[n])
  205.           {
  206.            case BS:
  207.         putchar('\b');
  208.         break;
  209.            case CR:
  210.         putchar(CR);
  211.         putchar(LF);
  212.         break;
  213.            case LF:
  214.         break;
  215.            case NUL:
  216.         break;
  217.            default:
  218.         putchar(strn[n]);
  219.           }
  220.        if (x_state && sent_xoff(port) == TRUE)
  221.         {
  222.          puts("\nXOFF sent. No test delay till buffer empties to 25%.\n");
  223.          outp_char(port,XOFF);
  224.          counter = 0;
  225.         }
  226.        if (x_state && counter == 0)
  227.         {
  228.          if (inp_cnt(port) < (buff_len * 1/4))
  229.            {
  230.         puts("\nXON sent\n");
  231.         outp_char(port,XON);
  232.         counter = DELAY;
  233.            }
  234.         }
  235.        else
  236.          if (x_state)
  237.            /* dummy loop to test the XON/XOFF flow control */
  238.            for(i=0; i<counter; i++)
  239.          ;
  240.       }
  241.      fclose(f);
  242.      puts("\nDownload complete.\n\n");
  243.  
  244.      break;
  245.  
  246.     default:
  247.      conout(c,e,port);
  248.      break;
  249.     }
  250.       }
  251.    }
  252.  
  253.   puts("\n\nExiting..\n");
  254.   puts("\nLeave port initialized (y or n)? ");
  255.   gets(strn);
  256.   x = (tolower(strn[0]) == 'y') ? TRUE : FALSE;
  257.  
  258.   uninit_com(port,x);
  259.  
  260.   printf("\nThe buffer high water mark reached %d of a buffer length of %d",
  261.      max,buff_len);
  262.  
  263.   printf("\nThe total number of characters received was %u",
  264.      total);
  265.  
  266.   printf("\nThe smallest stack space available was %u",
  267.      min_sp);
  268.  
  269. }  /* end of commterm.c */
  270.  
  271. bytecount () /* on comm routine */
  272. {
  273.  int m;
  274.  
  275.  m = _showsp();
  276.  if (m < min_sp)
  277.    min_sp = m;
  278.  total++;
  279. }
  280.  
  281. conout(c,e,port) /* send a character over the serial port, optionally echo */
  282. int c,e,port;
  283. {
  284.   switch (c)
  285.    {
  286.     case ALT_S:
  287.      /* DOS sometimes eats ^S as a pause (ala Ctrl-NumLock) */
  288.      outp_char(port,XOFF);
  289.      break;
  290.  
  291.     case ALT_Q:
  292.      outp_char(port,XON);
  293.      break;
  294.  
  295.     case CR:
  296.      if (e)
  297.       {
  298.        putchar(CR);
  299.        putchar(LF);
  300.       }
  301.      outp_char(port,CR);
  302.      break;
  303.  
  304.     case BS:
  305.      if (e)
  306.        putchar ('\b');
  307.      outp_char(port,BS);
  308.      break;
  309.  
  310.     default:
  311.      if (c < 128)
  312.       {
  313.        if (e)
  314.     putchar(c);
  315.        outp_char(port,c);
  316.       }
  317.      break;
  318.     }
  319. }
  320.  
  321.  
  322.  
  323. termin(port,x)    /* get characters from the serial port and print it */
  324. int port,x;
  325. {
  326.   int c;
  327.  
  328.     if (x)
  329.       if (recd_xoff(port))
  330.     puts("<<XOFF>>");
  331.  
  332.     if (inp_cnt(port) > max) max = inp_cnt(port);
  333.     while (inp_cnt(port))
  334.      {
  335.       c = inp_char(port);
  336.       switch (c)
  337.        {
  338.     case NUL:
  339.      break;
  340.  
  341.     case CR:
  342.      putchar(CR);
  343.      putchar(LF);
  344.      break;
  345.  
  346.     case LF:
  347.      break;
  348.  
  349.     case BS:
  350.      putchar('\b');
  351.      break;
  352.  
  353.     default:
  354.      putchar(c);
  355.      break;
  356.        }
  357.      }
  358.  
  359. }  /* end of termin */
  360.  
  361. /* ********************************************************************** */
  362.  
  363. /* key_in.c
  364.  
  365.       direct read of keyboard, including special keys.
  366.  
  367.       written to replace scr_in() in pcio.a because scr_in()
  368.       filters most special keys, and returns char.
  369.       key_in, returns an int value.  see tech reference manual
  370.       or basic manual for values of different key combinations.
  371.  
  372.       key_in() returns: 0 = no key pressed
  373.             other = key and/or special key code
  374.  
  375.             when value < 128 : normal ASCII
  376.             when value >=128 : special key
  377.  
  378.  
  379.     calls: sysint
  380.  
  381. */
  382.  
  383. #define KEYBOARD 0x16
  384. #define GET_KEY  0x0000
  385. #define KEY_STAT 0x0100
  386. #define ZERO     0x0040
  387. /* ZERO is a mask for the 8088 flag register zero bit */
  388.  
  389. key_in ()
  390.  
  391. {
  392.  struct {int ax,bx,cx,dx,si,di,ds,es;} r;
  393.  
  394.  r.ax = r.bx = r.cx = r.dx = r.si = r.di = r.ds = r.es = 0;
  395.  
  396.  r.ax = KEY_STAT;
  397.  
  398.  if ( !(sysint (KEYBOARD, &r, &r) & ZERO))
  399.   {
  400.    r.ax = GET_KEY;
  401.    sysint (KEYBOARD, &r, &r);
  402.    return ( (r.ax & 0x00ff) ? (r.ax & 0x00ff) : (r.ax) );
  403.   }
  404.  else
  405.   return (0);
  406.  
  407. } /* end of key_in.c */
  408.