diff --git a/src/config.c b/src/config.c index 43757d6a4..9fce92ded 100644 --- a/src/config.c +++ b/src/config.c @@ -884,6 +884,10 @@ load_ports(void) if (!has_jumpers || (jumpered_internal_ecp_dma == def_jumper)) ini_section_delete_var(cat, "jumpered_internal_ecp_dma"); + else if (has_jumpers && !(machine_has_jumpered_ecp_dma(machine, jumpered_internal_ecp_dma))) { + jumpered_internal_ecp_dma = def_jumper; + ini_section_delete_var(cat, "jumpered_internal_ecp_dma"); + } for (int c = 0; c < (SERIAL_MAX - 1); c++) { sprintf(temp, "serial%d_enabled", c + 1); @@ -2908,7 +2912,10 @@ save_ports(void) if (!has_jumpers || (jumpered_internal_ecp_dma == def_jumper)) ini_section_delete_var(cat, "jumpered_internal_ecp_dma"); - else + else if (has_jumpers && !(machine_has_jumpered_ecp_dma(machine, jumpered_internal_ecp_dma))) { + jumpered_internal_ecp_dma = def_jumper; + ini_section_set_int(cat, "jumpered_internal_ecp_dma", jumpered_internal_ecp_dma); + } else ini_section_set_int(cat, "jumpered_internal_ecp_dma", jumpered_internal_ecp_dma); for (int c = 0; c < (SERIAL_MAX - 1); c++) { diff --git a/src/device/lpt.c b/src/device/lpt.c index 29689d2de..268e4200e 100644 --- a/src/device/lpt.c +++ b/src/device/lpt.c @@ -319,7 +319,7 @@ lpt_write(const uint16_t port, const uint8_t val, void *priv) switch (port & mask) { case 0x0000: if (dev->ecp) { - if ((dev->ecr & 0xe0) == 0x60) + if (((dev->ecr & 0xe0) == 0x40) || ((dev->ecr & 0xe0) == 0x60)) /* AFIFO */ lpt_write_fifo(dev, val, 0x00); else if (!(dev->ecr & 0xc0) && (!(dev->ecr & 0x20) || !(lpt_get_ctrl_raw(dev) & 0x20)) && @@ -424,7 +424,7 @@ lpt_write(const uint16_t port, const uint8_t val, void *priv) timer_set_delay_u64(&dev->fifo_out_timer, (uint64_t) ((1000000.0 / 2500000.0) * (double) TIMER_USEC)); } else { dev->state = LPT_STATE_WRITE_FIFO; - if (lpt_get_ctrl_raw(dev) & 0x20) + if (((dev->ecr & 0xe0) == 0x40) || (lpt_get_ctrl_raw(dev) & 0x20)) dev->fifo_stat = fifo_get_ready(dev->fifo) ? 0x04 : 0x00; else dev->fifo_stat = fifo_get_ready(dev->fifo) ? 0x00 : 0x04; @@ -463,7 +463,7 @@ lpt_fifo_d_ready_evt(void *priv) lpt_t *dev = (lpt_t *) priv; if (!(dev->ecr & 0x08)) { - if (lpt_get_ctrl_raw(dev) & 0x20) + if (((dev->ecr & 0xe0) == 0x40) || (lpt_get_ctrl_raw(dev) & 0x20)) dev->fifo_stat = fifo_get_ready(dev->fifo) ? 0x04 : 0x00; else dev->fifo_stat = fifo_get_ready(dev->fifo) ? 0x00 : 0x04; @@ -480,6 +480,8 @@ lpt_write_to_fifo(void *priv, const uint8_t val) if (dev->ecp) { if (((dev->ecr & 0xe0) == 0x20) && (lpt_get_ctrl_raw(dev) & 0x20)) dev->dat = val; + else if (((dev->ecr & 0xe0) == 0x40) && !fifo_get_full(dev->fifo)) + fifo_write_evt_tagged(0x01, val, dev->fifo); else if (((dev->ecr & 0xe0) == 0x60) && (lpt_get_ctrl_raw(dev) & 0x20) && !fifo_get_full(dev->fifo)) fifo_write_evt_tagged(0x01, val, dev->fifo); diff --git a/src/sio/sio_pc87306.c b/src/sio/sio_pc87306.c index e95292fbb..f3c635dc8 100644 --- a/src/sio/sio_pc87306.c +++ b/src/sio/sio_pc87306.c @@ -174,7 +174,8 @@ lpt_handler(pc87306_t *dev) lpt_port_irq(dev->lpt, lpt_irq); - if ((dev->regs[0x18] & 0x06) != 0x00) + if (((jumpered_internal_ecp_dma < 0) || (jumpered_internal_ecp_dma == 4)) && + ((dev->regs[0x18] & 0x06) != 0x00)) lpt_port_dma(dev->lpt, (dev->regs[0x18] & 0x08) ? 3 : 1); }