Код
void sio_irq (void) __irq {
volatile char dummy;
volatile char IIR;
struct buf_st *p;
/*------------------------------------------------
Repeat while there is at least one interrupt source.
------------------------------------------------*/
while (((IIR = U1IIR) & 0x01) == 0) {
switch (IIR & 0x0E) {
case 0x06: /* Receive Line Status */
dummy = U1LSR; /* Just clear the interrupt source */
break;
case 0x04: /* Receive Data Available */
case 0x0C: /* Character Time-Out */
p = &rbuf;
if (((p->in - p->out) & ~(RBUF_SIZE-1)) == 0) {
p->buf [p->in & (RBUF_SIZE-1)] = U1RBR;
p->in++;
}
break;
case 0x02: /* THRE Interrupt */
p = &tbuf;
if (p->in != p->out) {
U1THR = p->buf [p->out & (TBUF_SIZE-1)];
p->out++;
tx_restart = 0;
}
else {
tx_restart = 1;
}
break;
case 0x00: /* Modem Interrupt */
dummy = U1MSR; /* Just clear the interrupt source */
break;
default:
break;
}
}
VICVectAddr = 0; /* Acknowledge Interrupt */
}
volatile char dummy;
volatile char IIR;
struct buf_st *p;
/*------------------------------------------------
Repeat while there is at least one interrupt source.
------------------------------------------------*/
while (((IIR = U1IIR) & 0x01) == 0) {
switch (IIR & 0x0E) {
case 0x06: /* Receive Line Status */
dummy = U1LSR; /* Just clear the interrupt source */
break;
case 0x04: /* Receive Data Available */
case 0x0C: /* Character Time-Out */
p = &rbuf;
if (((p->in - p->out) & ~(RBUF_SIZE-1)) == 0) {
p->buf [p->in & (RBUF_SIZE-1)] = U1RBR;
p->in++;
}
break;
case 0x02: /* THRE Interrupt */
p = &tbuf;
if (p->in != p->out) {
U1THR = p->buf [p->out & (TBUF_SIZE-1)];
p->out++;
tx_restart = 0;
}
else {
tx_restart = 1;
}
break;
case 0x00: /* Modem Interrupt */
dummy = U1MSR; /* Just clear the interrupt source */
break;
default:
break;
}
}
VICVectAddr = 0; /* Acknowledge Interrupt */
}