Hi Everyone,

I have a question. I've been working on a program in DOS for a small touchscreen computer that goes in my house. The touchscreen input on internally attached to COM3 (0x2E8h I think is the base address) using interrupt 15.

I've worked with programming the serial port before, but only on ports 1 & 2. I found some C code that I used before (found it on the internet a while ago) and modified it so that it can use COM3. Now, I'm not quite sure if something needs to be changed because it is on a different interrupt (I think COM3 is normally on IRQ4?)... but that's where I am confused. Its very messy code, I'm just trying to get some input from the controller. Can anyone help me out, maybe point out things that need to be changed? It initializes fine, but I don't receive any input from the controller. Anyway, any help would be appreciated!


Code:
/*---------------------------------------------------------------------*
   FILENAME:                     SERIAL.H

                  Some definitions used by SERIAL.C

 *--------------------------------------------------------------------*/

/* Defines Serial Ports Base Address ADDED BY ME*/
/* COM1 0x3F8                        */
/* COM2 0x2F8			       */
/* COM3 0x3E8			       */
/* COM4 0x2E8			       */


#define COM1            1
#define COM2            2
#define COM1BASE        0x3F8   /*  Base port address for COM1  */
#define COM2BASE        0x2F8   /*  Base port address for COM2  */

/*
    The 8250 UART has 10 registers accessible through 7 port addresses.
    Here are their addresses relative to COM1BASE and COM2BASE. Note
    that the baud rate registers, (DLL) and (DLH) are active only when
    the Divisor-Latch Access-Bit (DLAB) is on. The (DLAB) is bit 7 of
    the (LCR).

	o TXR Output data to the serial port.
	o RXR Input data from the serial port.
	o LCR Initialize the serial port.
	o IER Controls interrupt generation.
	o IIR Identifies interrupts.
	o MCR Send contorl signals to the modem.
	o LSR Monitor the status of the serial port.
	o MSR Receive status of the modem.
	o DLL Low byte of baud rate divisor.
	o DHH High byte of baud rate divisor.
*/
#define TXR             0       /*  Transmit register (WRITE) */
#define RXR             0       /*  Receive register  (READ)  */
#define IER             1       /*  Interrupt Enable          */
#define IIR             2       /*  Interrupt ID              */
#define LCR             3       /*  Line control              */
#define MCR             4       /*  Modem control             */
#define LSR             5       /*  Line Status               */
#define MSR             6       /*  Modem Status              */
#define DLL             0       /*  Divisor Latch Low         */
#define DLH             1       /*  Divisor latch High        */


/*-------------------------------------------------------------------*
  Bit values held in the Line Control Register (LCR).
	bit		meaning
	---		-------
	0-1		00=5 bits, 01=6 bits, 10=7 bits, 11=8 bits.
	2		Stop bits.
	3		0=parity off, 1=parity on.
	4		0=parity odd, 1=parity even.
	5		Sticky parity.
	6		Set break.
	7		Toggle port addresses.
 *-------------------------------------------------------------------*/
#define NO_PARITY       0x00
#define EVEN_PARITY     0x18
#define ODD_PARITY      0x08



/*-------------------------------------------------------------------*
  Bit values held in the Line Status Register (LSR).
	bit		meaning
	---		-------
	0		Data ready.
	1		Overrun error - Data register overwritten.
	2		Parity error - bad transmission.
	3		Framing error - No stop bit was found.
	4		Break detect - End to transmission requested.
	5		Transmitter holding register is empty.
	6		Transmitter shift register is empty.
	7               Time out - off line.
 *-------------------------------------------------------------------*/
#define RCVRDY          0x01
#define OVRERR          0x02
#define PRTYERR         0x04
#define FRMERR          0x08
#define BRKERR          0x10
#define XMTRDY          0x20
#define XMTRSR          0x40
#define TIMEOUT		0x80

/*-------------------------------------------------------------------*
  Bit values held in the Modem Output Control Register (MCR).
	bit     	meaning
	---		-------
	0		Data Terminal Ready. Computer ready to go.
	1		Request To Send. Computer wants to send data.
	2		auxillary output #1.
	3		auxillary output #2.(Note: This bit must be
			set to allow the communications card to send
			interrupts to the system)
	4		UART ouput looped back as input.
	5-7		not used.
 *------------------------------------------------------------------*/
#define DTR             0x01
#define RTS             0x02
#define MC_INT		0x08


/*------------------------------------------------------------------*
  Bit values held in the Modem Input Status Register (MSR).
	bit		meaning
	---		-------
	0		delta Clear To Send.
	1		delta Data Set Ready.
	2		delta Ring Indicator.
	3		delta Data Carrier Detect.
	4		Clear To Send.
	5		Data Set Ready.
	6		Ring Indicator.
	7		Data Carrier Detect.
 *------------------------------------------------------------------*/
#define CTS             0x10
#define DSR             0x20


/*------------------------------------------------------------------*
  Bit values held in the Interrupt Enable Register (IER).
	bit		meaning
	---		-------
	0		Interrupt when data received.
	1		Interrupt when transmitter holding reg. empty.
	2		Interrupt when data reception error.
	3		Interrupt when change in modem status register.
	4-7		Not used.
 *------------------------------------------------------------------*/
#define RX_INT          0x01


/*------------------------------------------------------------------*
  Bit values held in the Interrupt Identification Register (IIR).
	bit		meaning
	---		-------
	0		Interrupt pending
	1-2             Interrupt ID code
			00=Change in modem status register,
			01=Transmitter holding register empty,
			10=Data received,
			11=reception error, or break encountered.
	3-7		Not used.
 *------------------------------------------------------------------*/
#define RX_ID           0x04
#define RX_MASK         0x07


/*
    These are the port addresses of the 8259 Programmable Interrupt
    Controller (PIC).
*/
#define IMR             0x21   /* Interrupt Mask Register port */
#define ICR             0x20   /* Interrupt Control Port       */


/*
    An end of interrupt needs to be sent to the Control Port of
    the 8259 when a hardware interrupt ends.
*/
#define EOI             0x20   /* End Of Interrupt */


/*
    The (IMR) tells the (PIC) to service an interrupt only if it
    is not masked (FALSE).
*/
#define IRQ3            0xF7  /* COM2 */
#define IRQ4            0xEF  /* COM1 */

//
// #defines removed from serial.c - 18 Aug 1991
//
#define VERSION 0x0101

#define SFALSE           0
#define STRUE           (!FALSE)

#define NOERROR         0       /* No error               */
#define BUFOVFL         1       /* Buffer overflowed      */

#define ESC             0x1B    /* ASCII Escape character */
#define ASCII           0x007F  /* Mask ASCII characters  */
#define SBUFSIZ         0x4000  /* Serial buffer size     */
Now, for the main program....

I commented a lot of the parts out that I didn't think were needed

Code:
//		* Compile this program with Test Stack Overflow OFF.
//  *------------------------------------------------------------------*/
#include <dos.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include "serial2.h"
int            SError          = NOERROR;
int            portbase        = 0x2E8;
void           interrupt(*oldvects[2])();

static   char  ccbuf[SBUFSIZ];
unsigned int   startbuf        = 0;
unsigned int   endbuf          = 0;


/* Handle communications interrupts and put them in ccbuf */
void   interrupt com_int(void)
{
//snap_rx	*net_rx;
	 disable();
	 if ((inportb(portbase + IIR) & RX_MASK) == RX_ID)
	 {
		  if (((endbuf + 1) & SBUFSIZ - 1) == startbuf)
				SError = BUFOVFL;

		  ccbuf[endbuf++] = inportb(portbase + RXR);

		  endbuf &= SBUFSIZ - 1;
	 }

	 /* Signal end of hardware interrupt */
	 outportb(ICR, EOI);
	 enable();
}

/* Output a character to the serial port */
int    serialOut(char x)
{
	 long int           timeout = 0x0000FFFFL;

	 outportb(portbase + MCR,  MC_INT | DTR | RTS);

	 /* Wait for Clear To Send from modem */
	 while ((inportb(portbase + MSR) & CTS) == 0)
		  if (!(--timeout))
				return (-1);

	 timeout = 0x0000FFFFL;

	 /* Wait for transmitter to clear */
	 while ((inportb(portbase + LSR) & XMTRDY) == 0)
		  if (!(--timeout))
				return (-1);

	 disable();
	 outportb(portbase + TXR, x);
	 enable();

	 return (0);
}

/* Output a string to the serial port */
void   serialString(char *string)
{
	 while (*string)
		 serialOut(*string++);
}

/* This routine returns the current value in the buffer */
int    getccb(void)
{
	 int                res;

	 if (endbuf == startbuf)
		  return (-1);

	 res = (int) ccbuf[startbuf++];
	 startbuf %= SBUFSIZ;
	 return (res);
}

/* Install our functions to handle communications */
void   setvects(void)
{
	 oldvects[0] = getvect(0x0B);
	 oldvects[1] = getvect(0x0C);
	 setvect(0x0B, com_int);
	 setvect(0x0C, com_int);
}

/* Uninstall our vectors before exiting the program */
void   resvects(void)
{
	 setvect(0x0B, oldvects[0]);
	 setvect(0x0C, oldvects[1]);
}

/* Turn on communications interrupts */
void   i_enable(int pnum)
{
	 int                c;

	 disable();
	 c = inportb(portbase + MCR) | MC_INT;
	 outportb(portbase + MCR, c);
	 outportb(portbase + IER, RX_INT);
	 c = inportb(IMR) & (0xEF);
	 outportb(IMR, c);
	 enable();
}

/* Turn off communications interrupts */
void   i_disable(void)
{
	 int                c;

	 disable();
	 c = inportb(IMR) | ~IRQ3 | ~IRQ4;
	 outportb(IMR, c);
	 outportb(portbase + IER, 0);
	 c = inportb(portbase + MCR) & ~MC_INT;
	 outportb(portbase + MCR, c);
	 enable();
}

/* Tell modem that we're ready to go */
void   comm_on(void)
{
	 int                c, pnum;

//	 pnum = (portbase == COM1BASE ? COM1 : COM2);
//	 i_enable(3);
	 c = inportb(portbase + MCR) | DTR | RTS;
	 outportb(portbase + MCR, c);
}

/* Go off-line */
void   comm_off(void)
{
	 i_disable();
	 outportb(portbase + MCR, 0);
}

void   initSerial(void)
{
	 endbuf = startbuf = 0;
	 setvects();
	 comm_on();
}

void   closeSerial(void)
{
	 comm_off();
	 resvects();
}

/* Set the port number to use */
int    setPort(int port)
{
	 int                offset, far *RS232_Addr;

//	 switch (port)
//	 { /* Sort out the base address */
//		case COM1 : offset = 0x0000;
//						break;
//		case COM2 : offset = 0x0002;
//						break;
//		default   : return (-1);
//	 }

//	 RS232_Addr = MK_FP(0x0040, offset);  /* Find out where the port is. */
//	 if (*RS232_Addr == NULL) return (-1);/* If NULL then port not used. */
//	 portbase = *RS232_Addr;              /* Otherwise set portbase      */

	 return (0);
}

/* This routine sets the speed; will accept funny baud rates. */
/* Setting the speed requires that the DLAB be set on.        */
int    setSpeed(int speed)
{
	 char		c;
	 int		divisor;

	 if (speed == 0)            /* Avoid divide by zero */
		  return (-1);
	 else
		  divisor = (int) (115200L/speed);

	 if (portbase == 0)
		  return (-1);

	 disable();
	 c = inportb(portbase + LCR);
	 outportb(portbase + LCR, (c | 0x80)); /* Set DLAB */
	 outportb(portbase + DLL, (divisor & 0x00FF));
	 outportb(portbase + DLH, ((divisor >> 8) & 0x00FF));
	 outportb(portbase + LCR, c);          /* Reset DLAB */
	 enable();

	 return (0);
}

/* Set other communications parameters */
int    setOthers(int parity, int bits, int stopBit)
{
	 int                setting;

	 if (portbase == 0)					return (-1);
	 if (bits < 5 || bits > 8)                           return (-1);
	 if (stopBit != 1 && stopBit != 2)                   return (-1);
	 if (parity != NO_PARITY && parity != ODD_PARITY && parity != EVEN_PARITY)
							return (-1);

	 setting  = bits-5;
	 setting |= ((stopBit == 1) ? 0x00 : 0x04);
	 setting |= parity;

	 disable();
	 outportb(portbase + LCR, setting);
	 enable();

	 return (0);
}

/* Set up the port */
int    setSerial(int port, int speed, int parity, int bits, int stopBit)
{
	 if (setPort(port))                    return (-1);
	 if (setSpeed(speed))                  return (-1);
	 if (setOthers(parity, bits, stopBit)) return (-1);

	 return (0);
}


Thanks everyone!

Jon scott