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.

This commit is contained in:
OBattler
2025-08-31 23:33:42 +02:00
parent de64f74c30
commit 6f71e92385
3 changed files with 15 additions and 5 deletions

View File

@@ -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++) {

View File

@@ -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);

View File

@@ -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);
}