summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus
diff options
context:
space:
mode:
author 0kmg <9137159+0kmg@users.noreply.github.com>2021-10-14 06:57:04 -0800
committer GitHub <noreply@github.com>2021-10-14 10:57:04 -0400
commit0c7a624ce90aa426813f4a5ff5cc2cfe4d91e924 (patch)
tree9ddfd5e7947d2e59fa985ddaffcc950e91abaed9 /src/devices/bus
parentffe92ecc7276ce37a6bc0994d69f36bb8364362e (diff)
bus/nes: Corrected VRC4/6/7 IRQ pseudo-scanline counter. (#8695)
- This eliminates the constant shaking in TMNT2J and Akumajo Special's status bars and full screen shaking in some vertical stages (Clock Tower at least) in Akumajo Densetsu.
Diffstat (limited to 'src/devices/bus')
-rw-r--r--src/devices/bus/nes/konami.cpp38
-rw-r--r--src/devices/bus/nes/konami.h3
2 files changed, 20 insertions, 21 deletions
diff --git a/src/devices/bus/nes/konami.cpp b/src/devices/bus/nes/konami.cpp
index 64b8d92d1f0..e91e4318132 100644
--- a/src/devices/bus/nes/konami.cpp
+++ b/src/devices/bus/nes/konami.cpp
@@ -174,7 +174,7 @@ void nes_konami_vrc4_device::pcb_reset()
chr8(0, m_chr_source);
m_irq_mode = 0;
- m_irq_prescale = 341;
+ m_irq_prescale = 0;
m_irq_enable = 0;
m_irq_enable_latch = 0;
m_irq_count = 0;
@@ -214,7 +214,7 @@ void nes_konami_vrc7_device::pcb_reset()
chr8(0, m_chr_source);
m_irq_mode = 0;
- m_irq_prescale = 341;
+ m_irq_prescale = 0;
m_irq_enable = 0;
m_irq_enable_latch = 0;
m_irq_count = 0;
@@ -468,6 +468,19 @@ void nes_konami_vrc4_device::device_timer(emu_timer &timer, device_timer_id id,
}
}
+void nes_konami_vrc4_device::irq_ctrl_w(uint8_t data)
+{
+ m_irq_mode = data & 0x04;
+ m_irq_enable = data & 0x02;
+ m_irq_enable_latch = data & 0x01;
+ if (m_irq_enable)
+ {
+ m_irq_count = m_irq_count_latch;
+ m_irq_prescale = 341;
+ }
+ set_irq_line(CLEAR_LINE);
+}
+
void nes_konami_vrc4_device::set_prg()
{
if (m_latch & 0x02)
@@ -534,12 +547,7 @@ void nes_konami_vrc4_device::write_h(offs_t offset, uint8_t data)
m_irq_count_latch = (m_irq_count_latch & 0x0f) | ((data & 0x0f) << 4);
break;
case 0x200:
- m_irq_mode = data & 0x04;
- m_irq_enable = data & 0x02;
- m_irq_enable_latch = data & 0x01;
- if (data & 0x02)
- m_irq_count = m_irq_count_latch;
- set_irq_line(CLEAR_LINE);
+ irq_ctrl_w(data);
break;
case 0x300:
m_irq_enable = m_irq_enable_latch;
@@ -608,12 +616,7 @@ void nes_konami_vrc6_device::write_h(offs_t offset, uint8_t data)
m_irq_count_latch = data;
break;
case 0x100:
- m_irq_mode = data & 0x04;
- m_irq_enable = data & 0x02;
- m_irq_enable_latch = data & 0x01;
- if (data & 0x02)
- m_irq_count = m_irq_count_latch;
- set_irq_line(CLEAR_LINE);
+ irq_ctrl_w(data);
break;
case 0x200:
m_irq_enable = m_irq_enable_latch;
@@ -719,12 +722,7 @@ void nes_konami_vrc7_device::write_h(offs_t offset, uint8_t data)
m_irq_count_latch = data;
break;
case 0x7000:
- m_irq_mode = data & 0x04;
- m_irq_enable = data & 0x02;
- m_irq_enable_latch = data & 0x01;
- if (data & 0x02)
- m_irq_count = m_irq_count_latch;
- set_irq_line(CLEAR_LINE);
+ irq_ctrl_w(data);
break;
case 0x7008: case 0x7010: case 0x7018:
m_irq_enable = m_irq_enable_latch;
diff --git a/src/devices/bus/nes/konami.h b/src/devices/bus/nes/konami.h
index 1a451b00733..5c3383b58ee 100644
--- a/src/devices/bus/nes/konami.h
+++ b/src/devices/bus/nes/konami.h
@@ -109,7 +109,8 @@ protected:
uint8_t m_latch, m_mmc_prg_bank;
void irq_tick();
- uint16_t m_irq_count, m_irq_count_latch;
+ void irq_ctrl_w(uint8_t data);
+ uint8_t m_irq_count, m_irq_count_latch;
int m_irq_enable, m_irq_enable_latch;
int m_irq_mode;
int m_irq_prescale;