summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/spg2xx.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/spg2xx.cpp')
-rw-r--r--src/devices/machine/spg2xx.cpp34
1 files changed, 20 insertions, 14 deletions
diff --git a/src/devices/machine/spg2xx.cpp b/src/devices/machine/spg2xx.cpp
index 28c34103492..5a5d8bdda34 100644
--- a/src/devices/machine/spg2xx.cpp
+++ b/src/devices/machine/spg2xx.cpp
@@ -1385,7 +1385,7 @@ WRITE16_MEMBER(spg2xx_device::io_w)
{ 128, 256, 512, 1024 },
{ 105000, 210000, 420000, 840000 }
};
- LOGMASKED(LOG_IO_WRITES, "io_w: Timebase Control = %04x (Source:%s, TMB2:%s, TMB1:%s)\n", data,
+ LOGMASKED(LOG_TIMERS, "io_w: Timebase Control = %04x (Source:%s, TMB2:%s, TMB1:%s)\n", data,
BIT(data, 4) ? "27MHz" : "32768Hz", s_tmb2_sel[BIT(data, 4)][(data >> 2) & 3], s_tmb1_sel[BIT(data, 4)][data & 3]);
const uint16_t old = m_io_regs[offset];
m_io_regs[offset] = data;
@@ -1408,11 +1408,11 @@ WRITE16_MEMBER(spg2xx_device::io_w)
}
case 0x11: // Timebase Clear
- LOGMASKED(LOG_IO_WRITES, "io_w: Timebase Clear = %04x\n", data);
+ LOGMASKED(LOG_TIMERS, "io_w: Timebase Clear = %04x\n", data);
break;
case 0x12: // Timer A Data
- LOGMASKED(LOG_IO_WRITES, "io_w: Timer A Data = %04x\n", data);
+ LOGMASKED(LOG_TIMERS, "io_w: Timer A Data = %04x\n", data);
m_io_regs[offset] = data;
m_timer_a_preload = data;
break;
@@ -1421,7 +1421,7 @@ WRITE16_MEMBER(spg2xx_device::io_w)
{
static const char* const s_source_a[8] = { "0", "0", "32768Hz", "8192Hz", "4096Hz", "1", "0", "ExtClk1" };
static const char* const s_source_b[8] = { "2048Hz", "1024Hz", "256Hz", "TMB1", "4Hz", "2Hz", "1", "ExtClk2" };
- LOGMASKED(LOG_IO_WRITES, "io_w: Timer A Control = %04x (Source A:%s, Source B:%s)\n", data,
+ LOGMASKED(LOG_TIMERS, "io_w: Timer A Control = %04x (Source A:%s, Source B:%s)\n", data,
s_source_a[data & 7], s_source_b[(data >> 3) & 7]);
m_io_regs[offset] = data;
switch (data & 7)
@@ -1480,7 +1480,7 @@ WRITE16_MEMBER(spg2xx_device::io_w)
case 0x15: // Timer A IRQ Clear
{
- LOGMASKED(LOG_IO_WRITES, "io_w: Timer A IRQ Clear\n");
+ LOGMASKED(LOG_TIMERS, "io_w: Timer A IRQ Clear\n");
const uint16_t old = IO_IRQ_STATUS;
IO_IRQ_STATUS &= ~0x0800;
if (IO_IRQ_STATUS != old)
@@ -1489,7 +1489,7 @@ WRITE16_MEMBER(spg2xx_device::io_w)
}
case 0x16: // Timer B Data
- LOGMASKED(LOG_IO_WRITES, "io_w: Timer B Data = %04x\n", data);
+ LOGMASKED(LOG_TIMERS, "io_w: Timer B Data = %04x\n", data);
m_io_regs[offset] = data;
m_timer_b_preload = data;
break;
@@ -1497,7 +1497,7 @@ WRITE16_MEMBER(spg2xx_device::io_w)
case 0x17: // Timer B Control
{
static const char* const s_source_c[8] = { "0", "0", "32768Hz", "8192Hz", "4096Hz", "1", "0", "ExtClk1" };
- LOGMASKED(LOG_IO_WRITES, "io_w: Timer B Control = %04x (Source C:%s)\n", data, s_source_c[data & 7]);
+ LOGMASKED(LOG_TIMERS, "io_w: Timer B Control = %04x (Source C:%s)\n", data, s_source_c[data & 7]);
m_io_regs[offset] = data;
if (m_io_regs[0x18] == 1)
{
@@ -1508,7 +1508,7 @@ WRITE16_MEMBER(spg2xx_device::io_w)
case 0x18: // Timer B Enable
{
- LOGMASKED(LOG_IO_WRITES, "io_w: Timer B Enable = %04x\n", data);
+ LOGMASKED(LOG_TIMERS, "io_w: Timer B Enable = %04x\n", data);
m_io_regs[offset] = data & 1;
if (data & 1)
{
@@ -1523,7 +1523,7 @@ WRITE16_MEMBER(spg2xx_device::io_w)
case 0x19: // Timer B IRQ Clear
{
- LOGMASKED(LOG_IO_WRITES, "io_w: Timer B IRQ Clear\n");
+ LOGMASKED(LOG_TIMERS, "io_w: Timer B IRQ Clear\n");
const uint16_t old = IO_IRQ_STATUS;
IO_IRQ_STATUS &= ~0x0400;
if (IO_IRQ_STATUS != old)
@@ -1860,16 +1860,20 @@ void spg2xx_device::device_timer(emu_timer &timer, device_timer_id id, int param
case TIMER_TMB1:
{
LOGMASKED(LOG_TIMERS, "TMB1 elapsed, setting IRQ Status bit 0 (old:%04x, new:%04x, enable:%04x)\n", IO_IRQ_STATUS, IO_IRQ_STATUS | 1, IO_IRQ_ENABLE);
+ const uint16_t old = IO_IRQ_STATUS;
IO_IRQ_STATUS |= 1;
- check_irqs(0x0001);
+ if (old ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE))
+ check_irqs(0x0001);
break;
}
case TIMER_TMB2:
{
LOGMASKED(LOG_TIMERS, "TMB2 elapsed, setting IRQ Status bit 1 (old:%04x, new:%04x, enable:%04x)\n", IO_IRQ_STATUS, IO_IRQ_STATUS | 2, IO_IRQ_ENABLE);
+ const uint16_t old = IO_IRQ_STATUS;
IO_IRQ_STATUS |= 2;
- check_irqs(0x0002);
+ if (old ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE))
+ check_irqs(0x0002);
break;
}
@@ -1916,6 +1920,7 @@ void spg2xx_device::device_timer(emu_timer &timer, device_timer_id id, int param
void spg2xx_device::system_timer_tick()
{
+ const uint16_t old = IO_IRQ_STATUS;
uint16_t check_mask = 0x0040;
IO_IRQ_STATUS |= 0x0040;
@@ -1943,7 +1948,8 @@ void spg2xx_device::system_timer_tick()
}
}
- check_irqs(check_mask);
+ if (old ^ (IO_IRQ_STATUS & IO_IRQ_ENABLE))
+ check_irqs(check_mask);
}
void spg2xx_device::uart_transmit_tick()
@@ -2011,7 +2017,7 @@ void spg2xx_device::check_irqs(const uint16_t changed)
if (changed & 0x0c00) // Timer A, Timer B IRQ
{
- LOGMASKED(LOG_IRQS, "%ssserting IRQ2 (%04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0c00) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0c00));
+ LOGMASKED(LOG_TIMERS, "%ssserting IRQ2 (%04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0c00) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0c00));
m_cpu->set_state_unsynced(UNSP_IRQ2_LINE, (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0c00) ? ASSERT_LINE : CLEAR_LINE);
}
@@ -2043,7 +2049,7 @@ void spg2xx_device::check_irqs(const uint16_t changed)
if (changed & 0x0070) // 1024Hz, 2048Hz, 4096Hz IRQ
{
- LOGMASKED(LOG_IRQS, "%ssserting IRQ6 (%04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0070) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0070));
+ LOGMASKED(LOG_TIMERS, "%ssserting IRQ6 (%04x)\n", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0070) ? "A" : "Dea", (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0070));
m_cpu->set_state_unsynced(UNSP_IRQ6_LINE, (IO_IRQ_ENABLE & IO_IRQ_STATUS & 0x0070) ? ASSERT_LINE : CLEAR_LINE);
}