Comtrol API (6508) for the MS-DOS User Manual
Page 38

38
Troubleshooting
Troubleshooting
/* Update Tx queue In index */
q[Dev].TxIn = In;
asm sti;
/* enable interrupts */
return(NumOpen);
}
/********************************************************
Function:
DeqRxData
Purpose:
Remove data from a Rx queue.
Call:
DeqRxData(Dev,Buf,Cnt)
int Dev; Device number
unsigned char *Buf;
Buffer takes data removed from Rx queue.
int Cnt; Count of bytes to remove
Return:
int: Number of bytes removed from Rx queue
*/
int DeqRxData(int Dev,unsigned char *Buf,int Cnt)
{
int i;
/* balance of bytes to copy after q wrap */
int Out;
/* Out index into Rx buffer */
int BCnt;
/* count of bytes copied */
asm cli;
/* no interrupts until done, do not want
periodic event function modifying q
while we are working on it */
Out = q[Dev].RxOut;/* local copy of Out index */
/* Get number of bytes in Rx buffer */
if((BCnt = q[Dev].RxIn - Out) < 0)
BCnt += RXBUF_SIZE; /* adjust for queue wrap */
else if(BCnt == 0)
return(BCnt);
/* nothing in Rx buffer */
if(Cnt < BCnt)
BCnt = Cnt;
/* do not move more than asked for */
i = BCnt - (RXBUF_SIZE - Out); /* i = whats left after wrap around */
if(i < 0)
i = 0;
/* Copy to end of Rx buffer */
memcpy(Buf,&q[Dev].RxBuf[Out],BCnt - i);
/* Updata Out index, point to beginning of buffer if already at end of it */
Out = (Out + (BCnt - i)) % RXBUF_SIZE;
/* Copy the rest of the buffer, if any left */
if (i != 0)
{
memcpy(&Buf[BCnt - i],q[Dev].RxBuf,i);
Out = i;
}
/* Update Rx queue Out index */
q[Dev].RxOut = Out;
asm sti;
/* enable interrupts */
return(BCnt);
}
/********************************************************
Function:
EvRxData
Purpose:
Receive event function, read data from a serial device
and add it to a Rx queue.
Call
EvRxData(Dev)
int Dev; Device number
Return:
void
*/
void EvRxData(int Dev) /* receive event function */
{
int i;
/* balance of bytes to copy after q wrap */
int NumOpen;
/* num bytes open in Rx buffer */
int In;
/* In index into Rx buffer */
int Cnt;
/* total count of bytes read */
In = q[Dev].RxIn;
/* local copy of In index */
/* Get number bytes open in Rx buffer */
if((NumOpen = q[Dev].RxOut - In - 1) < 0)
NumOpen += RXBUF_SIZE; /* adjust for q wrap */
if(NumOpen == 0)
return; /* no room in Rx buffer */
i = NumOpen - (RXBUF_SIZE - In); /* i = whats left after wrap around */
if (i < 0)
i = 0;
/* Read data in up to end of Rx buffer */
Cnt = aaRead(Dev,NumOpen - i,&q[Dev].RxBuf[In]);
/* Update In index, point to beginning of buffer if already at end of it */
In = (In + Cnt) % RXBUF_SIZE;