summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/vrc5074.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/vrc5074.cpp')
-rw-r--r--src/devices/machine/vrc5074.cpp22
1 files changed, 14 insertions, 8 deletions
diff --git a/src/devices/machine/vrc5074.cpp b/src/devices/machine/vrc5074.cpp
index 8988676c269..ade82af624e 100644
--- a/src/devices/machine/vrc5074.cpp
+++ b/src/devices/machine/vrc5074.cpp
@@ -240,6 +240,7 @@ void vrc5074_device::device_start()
save_item(NAME(m_cpu_regs));
save_item(NAME(m_nile_irq_state));
save_item(NAME(m_sdram_addr));
+ save_item(NAME(m_uart_irq));
machine().save().register_postload(save_prepost_delegate(FUNC(vrc5074_device::postload), this));
}
@@ -259,7 +260,7 @@ void vrc5074_device::device_reset()
m_dma_timer->adjust(attotime::never);
m_sdram_addr[0] = 0;
m_sdram_addr[1] = 0;
-
+ m_uart_irq = 0;
}
void vrc5074_device::map_cpu_space()
@@ -679,6 +680,12 @@ void vrc5074_device::update_nile_irqs()
uint8_t irq[6];
int i;
+ /* check for UART transmit IRQ enable and synthsize one */
+ if (m_uart_irq)
+ m_nile_irq_state |= 0x0010;
+ else
+ m_nile_irq_state &= ~0x0010;
+
irq[0] = irq[1] = irq[2] = irq[3] = irq[4] = irq[5] = 0;
m_cpu_regs[NREG_INTSTAT0 + 0] = 0;
m_cpu_regs[NREG_INTSTAT0 + 1] = 0;
@@ -1018,11 +1025,8 @@ WRITE32_MEMBER(vrc5074_device::cpu_reg_w)
WRITE_LINE_MEMBER(vrc5074_device::uart_irq_callback)
{
- if (state ^ ((m_nile_irq_state >> 4) & 0x1)) {
- if (state)
- m_nile_irq_state |= 1 << 4;
- else
- m_nile_irq_state &= ~(1 << 4);
+ if (state ^ m_uart_irq) {
+ m_uart_irq = state;
update_nile_irqs();
if (LOG_NILE)
logerror("uart_irq_callback: state = %d\n", state);
@@ -1034,13 +1038,15 @@ READ32_MEMBER(vrc5074_device::serial_r)
uint32_t result = m_uart->ins8250_r(space, offset>>1);
if (LOG_NILE)
- logerror("%06X:serial_r offset %03X = %08X\n", m_cpu_space->device().safe_pc(), offset>>1, result);
+ logerror("%06X:serial_r offset %03X = %08X (%08x)\n", m_cpu_space->device().safe_pc(), offset>>1, result, offset*4);
return result;
}
WRITE32_MEMBER(vrc5074_device::serial_w)
{
m_uart->ins8250_w(space, offset>>1, data);
+ if (PRINTF_SERIAL && offset == NREG_UARTTHR)
+ printf("%c", data);
if (LOG_NILE)
- logerror("%06X:serial_w offset %03X = %08X & %08X\n", m_cpu_space->device().safe_pc(), offset>>1, data, mem_mask);
+ logerror("%06X:serial_w offset %03X = %08X & %08X (%08x)\n", m_cpu_space->device().safe_pc(), offset>>1, data, mem_mask, offset*4);
}