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:
@@ -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++) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user