home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / zip / telecomm / zmdm.zoo / main.c < prev    next >
C/C++ Source or Header  |  1991-04-27  |  16KB  |  887 lines

  1. /*
  2.  *     Main Module
  3.  *
  4.  *    Jwahar Bammi
  5.  *     bang:   {any internet host}!dsrgsun.ces.CWRU.edu!bammi
  6.  *     domain: bammi@dsrgsun.ces.CWRU.edu
  7.  *    GEnie:    J.Bammi
  8.  */
  9.  
  10. #include "config.h"
  11.  
  12. #include "zmdm.h"
  13. #include "common.h"
  14.  
  15. #ifndef Vsync             /* Atari forgot these in osbind.h */
  16. #define Vsync()    xbios(37)
  17. #endif
  18.  
  19. #define    esc    27
  20. #define cr    0x0d
  21. #define mvto(r,c)    EscSeq('Y');Bconout(2,r+040);Bconout(2,c+040)
  22.  
  23. #ifdef PHONES    /* common to this module and phone.c */
  24. char    *PhoneFile;
  25. #endif
  26.      /* Globals belonging to this module only */
  27.  
  28. int    rs232 = 1,        /* Ports */
  29.         console = 2;
  30. int    speed,              /* rs232 setup parameters */
  31.       flowctl = 0,
  32.     ucr = -1,
  33.     rsr = -1,
  34.     tsr = -1,
  35.     scr = -1;
  36. static int duplex = 0;        /* full duplex_p */
  37.  
  38. #ifdef FLOW_CTRL
  39. /*
  40.  * setFlow() - set rs232 flow control
  41.  */
  42. #ifndef REMOTE
  43. void setFlow ()
  44. {
  45.     long conin;
  46.     int ch, i;
  47.     char cc[4] = " 0=";
  48.  
  49.     Bconws("Flow control: ");
  50.     EscSeq('p');
  51.     for (i=0; i<4; i++) {
  52.         Bconws(cc);
  53.         Bconws(vflows[i].sflow);
  54.         cc[1]++;
  55.     }
  56.     Bconws("\r\n");
  57.     EscSeq('q');
  58.     Bconout(2, '\t');
  59.     EscSeq('p');
  60.     Bconws("What type==>");
  61.     EscSeq('q');
  62.     
  63.     conin = Bconin(console);    /* get flow type */
  64.     if ((conin & 0x00FF0000L) == 0x00610000L)
  65.     {
  66.         his_screen();    /* hit UNDO */
  67.          ResetIoBuf();
  68.         finish();
  69.     }
  70.     ch = (conin & 0x007f) - '0';
  71.     Bconout(2, ' ');
  72.  
  73.     if ((ch >= 0) && (ch < i))
  74.         flowctl = ch;
  75.  
  76.     Bconws(FLOW_STRING(flowctl));
  77.     Bconws("\r\n");
  78.     Rsconf(-1, flowctl, -1, -1, -1, -1);
  79. }
  80. #else
  81. void setFlow ()
  82. {
  83.     long conin;
  84.     int ch, i;
  85.     char cc[4] = " 0=";
  86.  
  87.     Bauxws("Flow control: ");
  88.     for (i=0; i<4; i++) {
  89.         Bauxws(cc);
  90.         Bauxws(vflows[i].sflow);
  91.         cc[1]++;
  92.     }
  93.     Bauxws("\r\n");
  94.     Bconout(1, '\t');
  95.     Bauxws("What type==>");
  96.     
  97.     conin = Bconin(1);    /* get flow type */
  98.     if (((int)(conin & 0x007f) & CTRL('U')) == CTRL('U'))
  99.     {
  100.         his_screen();    /* hit UNDO */
  101.          ResetIoBuf();
  102.         finish();
  103.     }
  104.     ch = (conin & 0x007f) - '0';
  105.     Bconout(1, ' ');
  106.  
  107.     if ((ch >= 0) && (ch < i))
  108.         flowctl = ch;
  109.  
  110.     Bauxws(FLOW_STRING(flowctl));
  111.     Bauxws("\r\n");
  112.     Rsconf(-1, flowctl, -1, -1, -1, -1);
  113. }
  114. #endif /* REMOTE */
  115. #endif /* FLOW_CTRL */
  116.         
  117. /*
  118.  * setBaud() - set rs232 port speed
  119.  */
  120. #ifndef REMOTE
  121. void setBaud ()
  122. {
  123.       long conin;
  124.     int ch, i;
  125.     char cc[4] = " 0=";
  126.     
  127.     Bconws("Baud rate:");
  128.     EscSeq('p');
  129.     for (i=0; vbauds[i].sbaud != NULL; i++) {
  130.         Bconws(cc);
  131.         Bconws(vbauds[i].sbaud);
  132.         cc[1]++;
  133.     }
  134.     Bconws("\r\n");
  135.     EscSeq('q');
  136.     Bconout(2, '\t');
  137.     EscSeq('p');
  138.     Bconws("What speed==>");
  139.     EscSeq('q');
  140.     
  141.     conin = Bconin(console);    /* get speed */
  142.     if ((conin & 0x00FF0000L) == 0x00610000L)
  143.     {
  144.         his_screen();
  145.         ResetIoBuf();
  146.         finish();
  147.     }
  148.     ch = (conin & 0x007f) - '0';
  149.     Bconout(2, ' ');
  150.  
  151.     if ((ch >= 0) && (ch < i))
  152.         speed = ch;
  153.     else
  154.          speed = getbaud();
  155.  
  156.     Bconws(BAUD_STRING(speed));
  157.     Baudrate = BAUD_RATE(speed);
  158.  
  159.      Bconws(" Baud\r\n");
  160.     
  161.     /* Set new Baud rate */
  162.  
  163. /*    Txoff(); */
  164. #ifndef    HIBAUD
  165.     Rsconf(vbauds[speed].ibaud, flowctl, ucr, rsr, tsr, scr);
  166. #else
  167.     {
  168.     register char *mfp_ptr = (char *) 0xfffffa00L;
  169.     conin=Super(0L);
  170.     mfp_ptr[0x29] &= 0x7f;    /* Clear divide by 16 mode */
  171.     mfp_ptr[0x1d] &= 0xf0;    /* Stop TImer D */
  172.     for (mfp_ptr[0x25] = cbauds[speed].tdd;    /* Load Timer D data */
  173.         mfp_ptr[0x25] != cbauds[speed].tdd;
  174.         mfp_ptr[0x25] = cbauds[speed].tdd);
  175.     mfp_ptr[0x1d] |= cbauds[speed].tdc;    /* Set Timer D mode */
  176.     Super(conin);
  177.     }
  178. #endif
  179.     
  180.     Vsync(); Vsync();
  181. /*    Txon(); */    
  182. }
  183. #else
  184. void setBaud ()
  185. {
  186.     char ch;
  187.     long conin;
  188.     
  189.     Bauxws("Baud rate: ");
  190.     Bauxws("0=19200 1=9600, 2=4800, 3=2400, 4=1200, 5=300\r\n");
  191.     Bconout(1, '\t');
  192.     Bauxws("What speed==>");
  193.     
  194.     conin = Bconin(1);    /* get speed */
  195.     if (((int)(conin & 0x007f) & CTRL('U')) == CTRL('U'))
  196.     {
  197.         his_screen();
  198.         ResetIoBuf();
  199.         finish();
  200.     }
  201.     ch = (char) (conin & 0x007f);
  202.     Bconout(1, ' ');
  203.     switch (ch)
  204.     {
  205.         case '0':        /* 19200 */
  206.         speed = 0;
  207.         Bauxws("19200");
  208.         Baudrate = 19200;
  209.         break;
  210.         
  211.         case '1':
  212.         speed = 1;    /* 9600 */
  213.         Bauxws("9600");
  214.         Baudrate = 9600;
  215.         break;
  216.         
  217.         case '2':
  218.         speed = 2;    /* 4800 */
  219.         Bauxws("4800");
  220.         Baudrate = 4800;
  221.         break;
  222.         
  223.         case '3':
  224.         speed = 4;    /* 2400 */
  225.         Bauxws("2400");
  226.         Baudrate = 2400;
  227.         break;
  228.         
  229.         case '4':
  230.         speed = 7;    /* 1200 */
  231.         Bauxws("1200");
  232.         Baudrate = 1200;
  233.         break;
  234.         
  235.         case '5':
  236.         speed = 9;    /* 300 */
  237.         Bauxws("300");
  238.         Baudrate = 300;
  239.         break;
  240.  
  241.         default:
  242.         speed = getbaud();
  243.         Bauxws(BAUD_STRING(speed));
  244.         Baudrate = BAUD_RATE(speed);
  245.     }
  246.     Bauxws(" Baud\r\n");
  247.     
  248.     /* Set new Baud rate */
  249.  
  250. /*    Txoff(); */
  251.     Rsconf(speed, flowctl, ucr, rsr, tsr, scr);
  252.     Vsync(); Vsync();
  253. /*    Txon(); */
  254.  
  255.     
  256. }
  257. #endif /* REMOTE */
  258.  
  259. /*
  260.  * help() - display help info and menu
  261.  */
  262. #ifndef REMOTE
  263. void help ()
  264. {
  265.     register long conin;
  266.     register int x;
  267.     extern char *r_filename();
  268.     
  269.     my_screen();        /* Switch to my screen memory */
  270.     EscSeq('v');        /* wrap at end of line */
  271.     EscSeq('E');        /* clear screen */
  272.     
  273.     mvto(2,11);
  274.     EscSeq('p');
  275.     Bconws("ZMDM Version: ");
  276.     Bconws(ZMDMVERSION);
  277.     EscSeq('q');
  278.     EscSeq('p');
  279.     x =(int) strlen(COMPILER);
  280.     x = (80 - x)/2;
  281.     mvto(3,x);
  282.     Bconws(COMPILER);
  283.     EscSeq('q');
  284.     mvto(5,21);
  285.     Bconws("bammi@cadence.com\r\n\n");
  286.  
  287.     /* Put up menu */
  288.     Bconws("\r\n\t");
  289.     EscSeq('p');        /* reverse video */
  290.     Bconws("Undo");
  291.     EscSeq('q');        /* quit reverse video */
  292.     Bconws(" to exit.\r\n");
  293.     
  294.     Bconws("\t");
  295.     EscSeq('p');        /* reverse video */
  296.     Bconws("Help");
  297.     EscSeq('q');        /* quit reverse video */
  298.     Bconws(" for this message.\r\n");
  299.  
  300.     Bconws("\t");
  301.     EscSeq('p');        /* reverse video */
  302.     Bconws("Escape");
  303.     EscSeq('q');        /* quit reverse video */
  304.     Bconws(" to send a break.\r\n");
  305.     
  306.     Bconws("\t");
  307.     EscSeq('p');        /* reverse video */
  308.     Bconws("T or t");
  309.     EscSeq('q');        /* quit reverse video */
  310.     Bconws(" to do file transfers and local functions.\r\n");
  311.  
  312. #ifdef PHONES
  313.     Bconws("\t");
  314.     EscSeq('p');        /* reverse video */
  315.     Bconws("P or p");
  316.     EscSeq('q');        /* quit reverse video */
  317.     Bconws(" for Phone services.\r\n");
  318. #endif
  319.  
  320.     if(rez == 2)
  321.     {
  322.         Bconws("\t");
  323.         EscSeq('p');        /* reverse video */
  324.         Bconws("H or h");
  325.         EscSeq('q');        /* quit reverse video */
  326.         Bconws(" for Hi Rez Toggle (25/50 Lines).\r\n");
  327.     }
  328.  
  329.     Bconws("\t");
  330.     EscSeq('p');        /* reverse video */
  331.     Bconws("I or i");
  332.     EscSeq('q');        /* quit reverse video */
  333.     Bconws(" to Invert screen colors.\r\n");
  334.  
  335.     Bconws("\t");
  336.     EscSeq('p');        /* reverse video */
  337.     Bconws("D or d");
  338.     EscSeq('q');        /* quit reverse video */
  339.     Bconws(" to toggle duplex.\r\n");
  340.     
  341.     Bconws("\t");
  342.     EscSeq('p');        /* reverse video */
  343.     Bconws("Return");
  344.     EscSeq('q');        /* quit reverse video */
  345.     Bconws(" to do nothing.\r\n");
  346.     
  347. #ifdef    FLOW_CTRL
  348.     Bconws("\t");
  349.     EscSeq('p');        /* reverse video */
  350.     Bconws("F or f");
  351.     EscSeq('q');        /* quit reverse video */
  352.     Bconws(" to set flow control.  Currently is ");
  353.     EscSeq('p');
  354.     Bconws(FLOW_STRING(flowctl));
  355.     Bconws(".\r\n");
  356.     EscSeq('q');
  357. #endif
  358.  
  359.     Bconws("\t");
  360.     EscSeq('p');        /* reverse video */
  361.     Bconws("B or b");
  362.     EscSeq('q');        /* quit reverse video */
  363.     Bconws(" to set baud rate.     Currently is ");
  364.     EscSeq('p');
  365.     Bconws(BAUD_STRING(speed));
  366.     Bconws(" Baud.\r\n\r\n");
  367.     EscSeq('q');
  368.  
  369.     /* get response */
  370.     conin = Bconin(console);
  371.  
  372.     if ((conin & 0x00FF0000L) == 0x00610000L)
  373.     {
  374.         /* He hit <UNDO> */
  375.         his_screen();
  376.         ResetIoBuf();
  377.         finish();
  378.     }
  379.     
  380.     switch((int)(conin & 0x007f))
  381.     {
  382.         case 'B':
  383.         case 'b':
  384.         /* Set baud rate */
  385.         setBaud();
  386.         break;
  387.  
  388. #ifdef    FLOW_CTRL
  389.         case 'F':
  390.         case 'f':
  391.         /* Set flow control */
  392.         setFlow();
  393.         break;
  394. #endif
  395.         
  396.         case 'T':
  397.         case 't':
  398.             EscSeq('E');        /* clear screen */
  399.  
  400.             /* Set no flow Control */
  401. #if 0
  402. #ifdef FLOW_CTRL
  403.             Rsconf(-1,0,-1,-1,-1,-1);
  404.             Vsync(); Vsync();
  405.  
  406. #endif
  407. #endif
  408.         /* Go do transfers */
  409.         transfer();
  410.             
  411. #if 0
  412. #ifdef FLOW_CTRL
  413.             /* Flow Control On */
  414. /*            Txoff(); */
  415.             Rsconf(-1,flowctl,-1,-1,-1,-1);
  416.             Vsync(); Vsync();
  417. /*            Txon(); */
  418. #endif
  419. #endif
  420.         his_screen();
  421.         return;
  422.         
  423.         case '\033':
  424.         /* Send a break */
  425.         sendbrk();
  426.         his_screen();    /* Don't wait for the key hit */
  427.  
  428.         return;
  429.  
  430.           case 'd':
  431.           case 'D':
  432.         duplex ^= 1;
  433.         his_screen();
  434.         return;
  435.         
  436.         case 'i':
  437.         case 'I':
  438.         /* Invert screen colors */
  439.         his_screen();
  440.         if(scolor == 0)
  441.         {
  442.             EscSeq('b');    /* Foreground color 0 */
  443.             Bconout(2, 0);
  444.             EscSeq('c');    /* Background color 1 */
  445.             Bconout(2, 1);
  446.             scolor = 1;
  447.         }
  448.         else
  449.         {
  450.             EscSeq('b');    /* Foreground color 1 */
  451.             Bconout(2, 1);
  452.             EscSeq('c');    /* Background color 0 */
  453.             Bconout(2, 0);
  454.             scolor = 0;
  455.         }
  456.         EscSeq('E');        /* Clear the screen */
  457.         return;
  458.  
  459. #ifdef PHONES
  460.         case 'p':
  461.         case 'P':
  462.         /* Phone Services */
  463.         phone();
  464.         return;
  465. #endif
  466.         case 'h':
  467.         case 'H':
  468.         /* Hi rez 25/50 toggle */
  469.         if(rez == 2)
  470.         {
  471.             if(hlines < 50)
  472.             {
  473.                 hlines = 50;
  474.                 hi50();
  475.             }
  476.             else
  477.             {
  478.                 hlines = 25;
  479.                 hi25();
  480.             }
  481.             his_screen();
  482.             EscSeq('E');        /* clear screen */
  483.             return;
  484.         }
  485.         /* else fall Through */
  486.         
  487.         default:
  488.         Bconws("No Change\r\n");
  489.     }
  490.  
  491.     /* Wait for a key hit */
  492.     hit_key();
  493.     /* back to terminal screen */
  494.     his_screen();
  495. }
  496. #else
  497. void help ()
  498. {
  499.     register long conin;
  500.     extern char *r_filename();
  501.     
  502.     my_screen();        /* Switch to my screen memory */
  503.     
  504.     Bauxws("\r\n\n");
  505.     Bauxws("          ZMDM Version: ");
  506.     Bauxws(ZMDMVERSION);
  507.     Bauxws("\r\n                         ");
  508.     Bauxws(COMPILER);
  509.     Bauxws("\r\n\n         bammi@cadence.com\r\n\n");
  510.  
  511.     /* Put up menu */
  512.     Bauxws("\r\n\t");
  513.     Bauxws("CTRL-U");
  514.     Bauxws(" to exit.\r\n");
  515.     
  516.     Bauxws("\t");
  517.     Bauxws("CTRL-Z");
  518.     Bauxws(" for this message.\r\n");
  519.  
  520.     Bauxws("\t");
  521.     Bauxws("Escape");
  522.     Bauxws(" to send a break.\r\n");
  523.     
  524.     Bauxws("\t");
  525.     Bauxws("T or t");
  526.     Bauxws(" to do file transfers and local functions.\r\n");
  527.  
  528.     Bauxws("\t");
  529.     Bauxws("Return");
  530.     Bauxws(" to do nothing.\r\n");
  531.  
  532. #ifdef    FLOW_CTRL
  533.     Bauxws("\t");
  534.     Bauxws("F or f");
  535.     Bauxws(" to set flow control.  Currently is ");
  536.     Bauxws(FLOW_STRING(flowctl));
  537.     Bauxws(".\r\n");
  538. #endif /* FLOW_CTRL */
  539.     
  540.     Bauxws("\t");
  541.     Bauxws("B or b");
  542.     Bauxws(" to set baud rate.     Curently is ");
  543.     Bauxws(BAUD_STRING(speed));
  544.     Bauxws(" Baud.\r\n\r\n");
  545.  
  546.     /* get response */
  547.     conin = Bconin(1);
  548.  
  549.     if (((int)(conin & 0x007f) & CTRL('U')) == CTRL('U'))
  550.     {
  551.         /* He hit <UNDO> */
  552.         his_screen();
  553.         ResetIoBuf();
  554.         finish();
  555.     }
  556.     
  557.     switch((int)(conin & 0x007f))
  558.     {
  559.         case 'B':
  560.         case 'b':
  561.         /* Set baud rate */
  562.         setBaud();
  563.         break;
  564.         
  565.         case 'T':
  566.         case 't':
  567.             Bauxws("\r\n\n");        /* clear screen */
  568.  
  569.             /* Set no flow Control */
  570. #if 0
  571. #ifdef FLOW_CTRL
  572.             Rsconf(-1,0,-1,-1,-1,-1);
  573.             Vsync(); Vsync();
  574.  
  575. #endif
  576. #endif
  577.         /* Go do transfers */
  578.         transfer();
  579.             
  580. #if 0
  581. #ifdef FLOW_CTRL
  582.             /* Flow Control On */
  583. /*            Txoff(); */
  584.             Rsconf(-1,flowctl,-1,-1,-1,-1);
  585.             Vsync(); Vsync();
  586. /*            Txon(); */
  587. #endif
  588. #endif
  589.         his_screen();
  590.         return;
  591.         
  592.         case '\033':
  593.         /* Send a break */
  594.         sendbrk();
  595.         his_screen();    /* Don't wait for the key hit */
  596.  
  597.         return;
  598.  
  599.         /* else fall Through */
  600.         
  601.         default:
  602.         Bauxws("No Change\r\n");
  603.     }
  604.  
  605.     /* back to terminal screen */
  606.     his_screen();
  607. }
  608. #endif /* REMOTE */
  609.  
  610. main (argc, argv)
  611. int argc;
  612. char **argv;
  613. {
  614.     register int    c;        /* rs232 input */
  615.     register int    i;
  616.     register long    conin;
  617. #ifndef REMOTE
  618.     extern int *aaddress(); /* Routine that returns base address of
  619.                  * line A variables
  620.                  */
  621. #ifdef OVERSCAN
  622.     extern long *ms_log;
  623.     long ms_off;
  624. #endif
  625. #else
  626.     extern FILE *fopen();
  627. #endif
  628.  
  629. #if (MWC || __GNUC__)
  630. #ifdef MWC
  631.     extern char *lmalloc();
  632. #else    
  633. #define lmalloc malloc
  634.     extern void *lmalloc(unsigned long);
  635. #endif
  636. #endif
  637.  
  638. #ifdef PHONES
  639.     if(argc > 1)
  640.         PhoneFile = *++argv;
  641. #endif
  642.     /* Set up Dta */
  643.     Fsetdta(&statbuf);
  644.  
  645.     /* Get screen rez */
  646.     rez = Getrez();
  647.     drv_map = Drvmap();
  648.  
  649. #ifndef    REMOTE
  650.     aline_addr = aaddress();
  651. #ifdef OVERSCAN
  652.     ms_off=Logbase()-Physbase();
  653. #endif
  654. #endif
  655.  
  656. #if (MWC || MANX || __GNUC__)
  657. #ifndef REMOTE
  658. #ifndef OVERSCAN
  659. #if (MWC || __GNUC__)
  660.        if((m_screen = (long *)lmalloc(
  661.                    (unsigned long)((8L*1024L+32L)*(long)sizeof(long))))
  662.                             == (long *)NULL)
  663. #else
  664.        if((m_screen = (long *)Malloc(
  665.                    (unsigned long)((8L*1024L+32L)*(long)sizeof(long))))
  666.                             == (long *)NULL)
  667. #endif
  668. #else
  669.        conin=(long)aline_addr[-1]*aline_addr[-2]+ms_off+512;
  670. #if (MWC || __GNUC__)
  671.        if((m_screen = (long *)lmalloc((unsigned long)conin))== (long *)NULL)
  672. #else
  673.        if((m_screen = (long *)Malloc((unsigned long)conin))== (long *)NULL)
  674. #endif
  675. #endif /* OVERSCAN */
  676.     {
  677.         Bconws("Sorry, could not allocate enough memory\r\n");
  678.         Pterm(3);
  679.     }
  680. #ifdef OVERSCAN
  681.     {
  682.         register long j,k;
  683.         k=0;
  684.         if (rez == 2) {
  685.             c=Setcolor(0,-1)&1;
  686.             Setcolor(0,c);
  687.             if (c)
  688.                 k=~k;
  689.         };
  690.         for (j=conin/4;j>0;j--)
  691.             m_screen[j]=k;
  692.     }
  693. #endif /* OVERSCAN */
  694. #endif /* REMOTE */
  695. #ifndef DYNABUF
  696. #ifdef MANX
  697.     if((bufr = (unsigned char *)Malloc((unsigned long)BBUFSIZ))
  698.                      == (unsigned char *)NULL)
  699. #else
  700.     if((bufr = (unsigned char *)lmalloc((unsigned long)BBUFSIZ))
  701.                      == (unsigned char *)NULL)
  702. #endif
  703. #else
  704.     if((bufr = dalloc()) == (unsigned char *)NULL)
  705. #endif /* DYNABUF */
  706.     {
  707. #ifdef REMOTE
  708.         Bauxws("Sorry, could not allocate enough memory\r\n");
  709. #else
  710.         Bconws("Sorry, could not allocate enough memory\r\n");
  711. #endif
  712.  
  713.         Pterm(4);
  714.     }
  715.  
  716. #else /* MWC || MANX */
  717. #ifdef DYNABUF
  718.     if((bufr = dalloc()) == (unsigned char *)NULL)
  719.     {
  720. #ifdef REMOTE
  721.         Bauxws("Sorry, could not allocate enough memory\r\n");
  722. #else
  723.         Bconws("Sorry, could not allocate enough memory\r\n");
  724. #endif
  725.         Pterm(5);
  726.     }
  727. #endif /* DYNABUF */
  728. #endif /* MWC || MANX */
  729.  
  730. #ifndef REMOTE
  731. #if (MWC || MANX || __GNUC__)
  732.     ms_ptr = (long *) ((0xffffff00L & ((long)(m_screen))) + 0x00000100L);
  733. #else
  734.     ms_ptr = (long *) ((0xffffff00L & ((long)(&m_screen[0]))) + 0x00000100L);
  735. #endif /* MWC */
  736. #ifdef OVERSCAN
  737.     ms_log=(long *)((long)ms_ptr+ms_off);
  738. #endif
  739.  
  740. /*    EscSeq('e');        renamed to .ttp to  Turn on the cursor */
  741.     EscSeq('v');        /* wrap at end of line */
  742.     EscSeq('E');        /* clear screen */
  743. #endif /* REMOTE */
  744.  
  745.     SetIoBuf();
  746.  
  747. #ifndef    HIBAUD
  748.     speed = getbaud();
  749. #else
  750.     speed = 0;
  751. #endif
  752.  
  753. /*    Txoff(); */
  754.     Rsconf((int) speed, flowctl, ucr, rsr, tsr, scr);  /* init set */
  755.     Vsync(); Vsync();
  756. /*    Txon();     */
  757.  
  758.     Baudrate = BAUD_RATE(speed);
  759.     
  760. #ifndef REMOTE
  761.     if(rez == 2)
  762.         ihlines = hlines = aline_addr[-21] + 1;    /* 42(lineAbase) */
  763.     STDERR = stderr;
  764. #else
  765. #ifndef DLIBS
  766.     if((STDERR = fopen("aux:", "rw")) == (FILE *)NULL)
  767.     {
  768.         Bauxws("Could not Open Aux Stream for Stderr\r\n");
  769.         finish();
  770.     }
  771.     setbuf(STDERR, (char *)NULL);
  772. #else
  773.     STDERR = stdaux;
  774. #endif /* DLIBS */
  775.     
  776. #endif /* remote */
  777.  
  778.     help();
  779.  
  780.     i = 0;
  781.     for (;;)    /* infinite loop */
  782.     {
  783. #ifndef REMOTE
  784.         while (Bconstat(rs232) != 0)
  785.         {
  786.             /* Char at Modem */
  787.             c = Bconin(rs232) & 0x007f;
  788.             Bconout(console, c);
  789.  
  790.             /* Check the console once in a while */
  791.             /* important at High speeds */
  792.             if ((++i) & 32)
  793.             {
  794.                 if (Bconstat(console) != 0)
  795.                       {
  796.                     c = Bconin(console) & 0x007f;
  797.                     Bconout(rs232, c);
  798.                     if(duplex) Bconout(console, c);
  799.                 }
  800.                 i = 0;
  801.             }
  802.                 
  803.         }
  804.         
  805.         if (Bconstat(console) != 0)
  806.         {
  807.             /* Char at Console */
  808.             conin = Bconin(console);
  809.             if ((conin & 0x00FF0000L) == 0x00610000L)  /* Undo */
  810.             {
  811.                 ResetIoBuf();
  812.                 finish();
  813.             }
  814.             
  815.             if ((conin & 0x00FF0000L) == 0x00620000L)  /* Help */
  816.                 help();
  817.             else
  818.             {
  819.                 c = conin & 0x007f;
  820.                 Bconout(rs232, c);
  821.                 if(duplex) Bconout(console, c);
  822.             }
  823.         }
  824. #else
  825.         while (Bconstat(rs232) != 0)
  826.         {
  827.             /* Char at Modem */
  828.             c = Bconin(rs232) & 0x007f;
  829.  
  830.             if ((c & CTRL('U')) == CTRL('U'))  /* Undo */
  831.             {
  832.                 ResetIoBuf();
  833.                 finish();
  834.             }
  835.             
  836.             if ((c & CTRL('Z')) == CTRL('Z'))  /* Help */
  837.                 help();
  838.             else
  839.                 Bconout(rs232,c);
  840.         }
  841.  
  842. #endif /* REMOTE */
  843.     }
  844. }
  845.  
  846. finish()
  847. {
  848. #ifdef PHONES
  849.     /* Save phone directory if it changed */
  850.     extern int dchanged;
  851.  
  852.     if(dchanged)
  853.     {
  854.         if(writedir() == 1)
  855.             hit_key();
  856.     }
  857. #endif
  858.     /* restore hlines if changed */
  859.     if((rez == 2) && (ihlines != hlines))
  860.     {
  861.         if(hlines == 25)
  862.         hi50();
  863.         else
  864.         hi25();
  865.     }
  866. #if (MWC || MANX || __GNUC__)
  867. #ifdef DYNABUF
  868.     Mfree(bufr);
  869. #else
  870.     free(bufr);
  871. #endif
  872.  
  873. #ifndef REMOTE
  874.     free(m_screen);
  875. #endif
  876.  
  877. #else
  878.  
  879. #ifdef DYNABUF
  880.     Mfree(bufr);
  881. #endif
  882. #endif
  883.     exit(0);
  884. }
  885.  
  886. /* -eof- */
  887.