From 6f71e92385ca75f54c0e9c8d53dafe0a52dcbcbe Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 31 Aug 2025 23:33:42 +0200 Subject: [PATCH] Implemented the "Parallel port FIFO" mode of ECP, made config.c sanitize the jumpered DMA on load and save, and made the PC87306 no longer able set the ECP dma if one is jumpered. --- src/config.c | 9 ++++++++- src/device/lpt.c | 8 +++++--- src/sio/sio_pc87306.c | 3 ++- 3 files changed, 15 insertions(+), 5 deletions(-) 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); }