diff --git a/src/device/serial.c b/src/device/serial.c index 56d905c4e..e4cf493e6 100644 --- a/src/device/serial.c +++ b/src/device/serial.c @@ -106,6 +106,13 @@ serial_transmit_period(serial_t *dev) dev->sd->transmit_period_callback(dev, dev->sd->priv, dev->transmit_period); } +void +serial_do_irq(serial_t *dev, int set) +{ + if (dev->irq != 0xff) + picint_common(1 << dev->irq, !!(dev->type >= SERIAL_16450), set, &dev->irq_state); +} + void serial_update_ints(serial_t *dev) { @@ -135,17 +142,7 @@ serial_update_ints(serial_t *dev) dev->iir = 0; } - if (stat && (dev->irq != 0xff) && ((dev->mctrl & 8) || (dev->type == SERIAL_8250_PCJR))) { - if (dev->type >= SERIAL_16450) - picintlevel(1 << dev->irq, &dev->irq_state); - else - picint(1 << dev->irq); - } else { - if (dev->type >= SERIAL_16450) - picintclevel(1 << dev->irq, &dev->irq_state); - else - picintc(1 << dev->irq); - } + serial_do_irq(dev, stat && ((dev->mctrl & 8) || (dev->type == SERIAL_8250_PCJR))); } static void @@ -603,7 +600,7 @@ serial_write(uint16_t addr, uint8_t val, void *p) dev->sd->rcr_callback(dev, dev->sd->priv); } if (!(val & 8) && (dev->mctrl & 8)) - picintc(1 << dev->irq); + serial_do_irq(dev, 0); if ((val ^ dev->mctrl) & 0x10) serial_reset_fifo(dev); dev->mctrl = val;