home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / alde_c / misc / lib / r_la4_02 / minimo.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-01-20  |  9.3 KB  |  288 lines

  1. /* MINIMO.C - From page 503 of "Microsoft C Programming for     */
  2. /* the IBM" by Robert Lafore. This is a full modem program,     */
  3. /* although rather limited. I slightly changed this program.    */
  4. /* The #define BUFSIZE is changed from 8192 to 60416 and the    */
  5. /* check() function is called after all commands to the modem   */
  6. /* instead of only once as it is in the book.                   */
  7. /****************************************************************/
  8.  
  9. #include <dos.h>        /*for union REGS*/
  10. #include <fcntl.h>      /*for system lovel I/O*/
  11. #include <types.h>      /* " */  /*extracted from subdir \include\sys*/
  12. #include <stat.h>       /* " */  /* " */
  13. #define COM 1           /*serial port no. (0 = COM1, 1 = COM2)*/
  14. #define CONF 0x83       /*1200 bps, no par, 1 stop, 8 bits*/
  15. #define RS232 0x14      /*RS232 serial port int number*/
  16. #define VIDEO 0x10      /*video int number*/
  17. #define DATAR 0x100     /*data ready bit in status word*/
  18. #define DELAY 500       /*make larger for faster computers*/
  19. #define TRUE 1
  20. #define FALSE 0
  21. #define OK 0            /*modem result code*/
  22. #define BUFSIZ 60416    /*size of disk file buffer*/
  23. union REGS inregs, outregs;   /* for ROM BIOS calls*/
  24. int far *fptr;          /*pointer to screen memory*/
  25. int row, col;           /*row and col of cursor position*/
  26. char buff[BUFSIZ];      /*disk file buffer*/
  27. int hnd;                /*disk file handle*/
  28. int bytes;              /*number of bytes stored in buffer*/
  29. int saveflag = FALSE;   /*TRUE when data being saved to disk*/
  30.  
  31. main()
  32. {
  33. char ch, receive();
  34.  
  35.    init(CONF);          /*initialize port*/
  36.    reset();             /*initialize modem*/
  37.    while(TRUE)  {
  38.       printf("\nPress  [F1] to dial a call");
  39.       printf("\n       [F2] to await call");
  40.       printf("\n       [F3] to resume call");
  41.       printf("\n       [F4] save to disk");
  42.       printf("\n       [F5] close disk file");
  43.       printf("\n       [F10] return to function menu");
  44.       printf("\nCommand: ");
  45.       if(getche() == 0)  {       /*if extended code*/
  46.          switch(getch())  {
  47.             case 59:             /* [F1] dial & call */
  48.                dial();
  49.                sr();
  50.                break;
  51.             case 60:             /* [F2] await call */
  52.                answ();
  53.                sr();
  54.                break;
  55.             case 61:             /* [F3] resume call */
  56.                sr();
  57.                break;
  58.             case 62:             /* [F4] save to disk */
  59.                save();
  60.                break;
  61.             case 63:             /* [F5] close file */
  62.                clo();
  63.                break;
  64.          }     /*end switch*/
  65.       }     /*end if*/
  66.    }     /*end while*/
  67. }     /*end main*/
  68.  
  69. /* reset() */  /* reset modem parameters */
  70. reset()
  71. {
  72.  
  73.    command("AT Z\r");            /*reset modem*/
  74.    check();                      /*check result code*/
  75.    /***  echo on, full-duplex, send result codes, numer codes ***/
  76.    command("AT E1 F1 Q0 V0\r");  /*initialize modem*/
  77.    check();                      /*check result code*/
  78.    command("AT\r");              /*reset bps rate*/
  79.    check();                      /*check result code*/
  80. }
  81.  
  82. /* clscr() */     /*clear the screen*/
  83. clscr()
  84. {
  85. int addr;
  86.  
  87.    fptr = (int far *) 0xB0000000;
  88.    for(addr = 0; addr < 2000; addr++)
  89.       *(fptr + addr) = 0x0700;
  90.    row = 0; col = 0;          /*initialize for putscr()*/
  91.    inregs.h.ah = 2;           /*'set cursor position' service*/
  92.    inregs.h.dh = row;
  93.    inregs.h.dl = col;
  94.    inregs.h.bh = 0;           /*page number*/
  95.    int86(VIDEO, &inregs, &outregs);
  96. }
  97.  
  98. /* dial() */   /* dials number */
  99. dial()
  100. {
  101. char phonum[30];              /*space for phone number*/
  102.  
  103.    reset();                   /*resets modem*/
  104.    printf("\n\nEnter phone number (example: 555-1212):  ");
  105.    gets(phonum);
  106.    command("AT DT ");         /*set up modem*/
  107.    check();                      /*check result code*/
  108.    command(phonum);           /*send number to modem*/
  109.    check();                      /*check result code*/
  110.    command("\r");             /*terminate command*/
  111.    check();                      /*check result code*/
  112. }
  113.  
  114. /* answ() */   /* sets up answer mode */
  115. answ()
  116. {
  117.  
  118.    reset();                   /*reset modem*/
  119.    command("AT S0 = 1\r");    /*answer on first ring*/
  120.    check();                      /*check result code*/
  121. }
  122.  
  123. /* sr() */     /*send-receive, full-duplex communication*/
  124. sr()
  125. {
  126. char ch, receive();
  127.  
  128.    clscr();
  129.    while(TRUE)  {
  130.       if(kbhit())  {                /*keyboard char ?*/
  131.          if((ch = getch()) != 0)    /*get char from keybd*/
  132.             send(ch);               /*send normal char*/
  133.          else if(getch() == 68)     /*if F[10] function key*/
  134.             return;                 /*return to menu*/
  135.       }
  136.       if(ready())  {             /*port has char ? */
  137.          ch = receive();
  138.          putscr(ch);
  139.          if(saveflag)  {         /*if saving to disk*/
  140.             buff[bytes++] = ch;  /*put in disk buffer*/
  141.             if(bytes > BUFSIZ)  {      /*if buffer full*/
  142.                printf("\n\nBuffer full.\n");
  143.                return;           /*return to menu*/
  144.             }
  145.          }
  146.       }  /*end if(ready())*/
  147.    }  /*end while*/
  148. }  /*end sr*/
  149.  
  150. /* save() */   /* opens disk file, sets up saveflag to write disk */
  151. save()
  152. {
  153. char fname[20];
  154.  
  155.    printf("\n\nName of file to save to: ");
  156.    gets(fname);
  157.    if((hnd = open(fname,
  158.                O_CREAT | O_WRONLY | O_TEXT, S_IWRITE)) < 0)
  159.       printf("\n\nCan't open file.\n");
  160.    else  {
  161.       printf("\n\nFile opened. Press [F5] to close.\n");
  162.       bytes = 0;              /*start of buffer*/
  163.       saveflag = TRUE;        /* 'write to disk' flag */
  164.    }
  165. }
  166.  
  167. /* clo() */    /* writes data from buffer to file & closes file */
  168. clo()
  169. {
  170.  
  171.    write(hnd, buff, bytes);      /*write buffer to file*/
  172.    close(hnd);
  173.    saveflag = FALSE;             /*turn off flag*/
  174. }
  175.  
  176. /* command */  /* send command string to modem */
  177. command(comstr)
  178. char *comstr;                    /*pointer to command*/
  179. {
  180. int j, k;
  181. long int jj;
  182. char ch;
  183.  
  184.    putch('*');                /*reassure user*/
  185.    for(jj = 0; jj < 50*DELAY; jj++)    /*ensure last command done*/
  186.       ;
  187.    for(j = 0; (ch = *(comstr + j)) != '\0'; j++)  {
  188.       send(ch);               /*send each char in turn*/
  189.       for(k = 0; k < DELAY && !ready(); k++)    /*wait for echo*/
  190.          ;                    /*before doing next one*/
  191.       ch = receive();
  192.    }
  193. }
  194.  
  195. /* check() */  /* check that modem returns '0' for OK */
  196. check()
  197. {
  198. char ch;
  199. int j, k;
  200.  
  201.    for(j = 0; j < 10; j++)  {       /*read up to 10 chars ? */
  202.       for(k = 0; k < DELAY && !ready(); k++)    /*wait for char*/
  203.          ;
  204.       ch = receive();               /*if we get an OK*/
  205.       if(ch == OK)
  206.          return;
  207.    }                 /*otherwise error*/
  208.    printf("\n\nCan't initialize modem.\n");
  209. }
  210.  
  211. /* putscr() */    /* puts char on screen at row, col */
  212. putscr(ch)
  213. char ch;
  214. {
  215. int j;
  216.  
  217.    switch(ch)  {
  218.       case(0x0A):             /*if return*/
  219.          col = 0;             /*start at beginning of line*/
  220.          break;
  221.       case(0x0D):             /*if linefeed*/
  222.          ++row;               /*go to next row*/
  223.          break;
  224.       case(0x08):             /*if backspace*/
  225.          if(col > 0)
  226.             --col;            /*backspace cursor*/
  227.          *(fptr + col + row*80) = 0x0700;  /*print space*/
  228.          break;
  229.       default:
  230.          *(fptr + col + row*80) = (int)ch | 0x0700;
  231.          ++col;               /*display & go to next col*/
  232.    }
  233.    if(col >= 80)  {           /*if past end of row*/
  234.       col = 0;                /*do carriage return and*/
  235.       ++row;                  /*linefeed*/
  236.    }
  237.    if(row >= 25)              /*if below bottom row*/
  238.       row = 0;                /*start at top*/
  239.    if(col == 0)               /*if at beginning of line*/
  240.       for(j = 0; j < 80; j++)    /*clear line*/
  241.          *(fptr + j + row*80) = 0x0700;
  242.    inregs.h.ah = 2;           /* 'set cursor position' service*/
  243.    inregs.h.dh = row;
  244.    inregs.h.dl = col;
  245.    inregs.h.bh = 0;           /*page number*/
  246.    int86(VIDEO, &inregs, &outregs);
  247. }
  248.  
  249. /* init() */      /* initialize serial port */
  250. init(conf)
  251. char conf;        /*addr of configuration code*/
  252. {
  253.    inregs.h.ah = 0;        /* 'initialize port' service */
  254.    inregs.x.dx = COM;      /*port number*/
  255.    inregs.h.al = CONF;     /*configuration*/
  256.    int86(RS232, &inregs, &outregs);
  257. }
  258.  
  259. /* send() */      /* send char to serial port */
  260. send(c)
  261. char c;
  262. {
  263.    inregs.h.ah = 1;        /* 'send char' service */
  264.    inregs.x.dx = COM;      /*port number*/
  265.    inregs.h.al = c;        /*character*/
  266.    int86(RS232, &inregs, &outregs);
  267. }
  268.  
  269. /* ready */    /* get serial port ready status */
  270. ready()
  271. {
  272.    inregs.h.ah = 3;        /* 'get status' service */
  273.    inregs.x.dx = COM;      /*port number*/
  274.    int86(RS232, &inregs, &outregs);
  275.    return(outregs.x.ax & DATAR);    /*return 'data ready' status*/
  276. }
  277.  
  278. /* receive */     /* get character from serial port */
  279. char receive()
  280. {
  281.    inregs.h.ah = 2;        /* 'receive char' service */
  282.    inregs.x.dx = COM;      /*port number*/
  283.    int86(RS232, &inregs, &outregs);
  284.    return(outregs.h.al & 0x7F);     /*return character*/
  285.                                     /* (AND off 8th bit*/
  286. }
  287.  
  288.