25 |
* SUCH DAMAGE. |
* SUCH DAMAGE. |
26 |
* |
* |
27 |
* |
* |
28 |
* $Id: dev_ns16550.c,v 1.51 2006/02/18 13:42:39 debug Exp $ |
* $Id: dev_ns16550.c,v 1.54 2006/04/06 18:08:42 debug Exp $ |
29 |
* |
* |
30 |
* NS16550 serial controller. |
* NS16550 serial controller. |
31 |
* |
* |
91 |
* If interrupts are enabled, and interrupts are pending, then |
* If interrupts are enabled, and interrupts are pending, then |
92 |
* cause a CPU interrupt. |
* cause a CPU interrupt. |
93 |
*/ |
*/ |
94 |
|
|
95 |
if (((d->reg[com_ier] & IER_ETXRDY) && (d->reg[com_iir] & IIR_TXRDY)) || |
if (((d->reg[com_ier] & IER_ETXRDY) && (d->reg[com_iir] & IIR_TXRDY)) || |
96 |
((d->reg[com_ier] & IER_ERXRDY) && (d->reg[com_iir] & IIR_RXRDY))) { |
((d->reg[com_ier] & IER_ERXRDY) && (d->reg[com_iir] & IIR_RXRDY))) { |
97 |
d->reg[com_iir] &= ~IIR_NOPEND; |
d->reg[com_iir] &= ~IIR_NOPEND; |
215 |
d->fcr = idata; |
d->fcr = idata; |
216 |
} else { |
} else { |
217 |
odata = d->reg[com_iir]; |
odata = d->reg[com_iir]; |
218 |
|
if (d->reg[com_iir] & IIR_TXRDY) |
219 |
|
d->reg[com_iir] &= ~IIR_TXRDY; |
220 |
debug("[ ns16550 (%s): read from iir: 0x%02x ]\n", |
debug("[ ns16550 (%s): read from iir: 0x%02x ]\n", |
221 |
d->name, (int)odata); |
d->name, (int)odata); |
222 |
dev_ns16550_tick(cpu, d); |
dev_ns16550_tick(cpu, d); |
290 |
d->reg[com_mcr] = idata; |
d->reg[com_mcr] = idata; |
291 |
debug("[ ns16550 (%s): write to mcr: 0x%02x ]\n", |
debug("[ ns16550 (%s): write to mcr: 0x%02x ]\n", |
292 |
d->name, (int)idata); |
d->name, (int)idata); |
293 |
|
if (!(d->reg[com_iir] & IIR_TXRDY) |
294 |
|
&& (idata & MCR_IENABLE)) |
295 |
|
d->reg[com_iir] |= IIR_TXRDY; |
296 |
|
dev_ns16550_tick(cpu, d); |
297 |
} else { |
} else { |
298 |
odata = d->reg[com_mcr]; |
odata = d->reg[com_mcr]; |
299 |
debug("[ ns16550 (%s): read from mcr: 0x%02x ]\n", |
debug("[ ns16550 (%s): read from mcr: 0x%02x ]\n", |
365 |
DEV_NS16550_LENGTH * d->addrmult, dev_ns16550_access, d, |
DEV_NS16550_LENGTH * d->addrmult, dev_ns16550_access, d, |
366 |
DM_DEFAULT, NULL); |
DM_DEFAULT, NULL); |
367 |
machine_add_tickfunction(devinit->machine, |
machine_add_tickfunction(devinit->machine, |
368 |
dev_ns16550_tick, d, TICK_SHIFT); |
dev_ns16550_tick, d, TICK_SHIFT, 0.0); |
369 |
|
|
370 |
/* |
/* |
371 |
* NOTE: Ugly cast into a pointer, because this is a convenient way |
* NOTE: Ugly cast into a pointer, because this is a convenient way |