#include <dos.h>
#include <stdio.h>

union REGS inregs, outregs;
struct SREGS segregs;

struct crec {
                void far *asc_rcv_exit;
                short asc_speed;
                unsigned char asc_width ; /* word width */
                unsigned char asc_parity; /* port & parity */
                unsigned char asc_stops; /* number of stop bits */
            } rec;

extern speed;
extern width;
extern parity;
extern n_port;
extern stop_num;
extern void rout(void);

pattach(n,pdata,len)
   char far *pdata;   /* RQB pointer */
   int n;  /* 0-open,1-send,2-close */
   int len; /* length of data */
        {
            unsigned short mask;
            int i, j;
            char far *p;

         if ( n == 0) {

            rec.asc_rcv_exit = rout;
            rec.asc_speed = speed;
            rec.asc_width = width; /* word length */
            rec.asc_parity = parity ; /* parity yes, even */
            mask = n_port;
            mask = mask << 4;
            rec.asc_parity = rec.asc_parity | mask;
            rec.asc_stops = stop_num; /* 1 stop bit */

            /* Open COM1 */

            p = &rec;
            inregs.x.dx = FP_OFF( p );
            segregs.ds = FP_SEG( p );
            inregs.h.ah = 0x00;
            inregs.h.al = 0x50;

            int86x( 0x6e, &inregs, &outregs, &segregs);
            return;
        }  /*   open   */
        if ( n == 1){
            p = pdata-12;
            i = len + 28;

            inregs.x.dx = FP_OFF( p );
            segregs.ds = FP_SEG( p );
            inregs.x.cx = i;
            inregs.h.ah = 0x02;
            int86x( 0x6e, &inregs, &outregs, &segregs);
            return;
       }   /*   send   */
       if ( n == 2){
            inregs.h.ah = 0x01;
	    inregs.h.al = n_port;
            int86x( 0x6e, &inregs, &outregs, &segregs);
       }  /*   close   */
}
