summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2012-11-07 21:09:10 +0000
committer Olivier Galibert <galibert@pobox.com>2012-11-07 21:09:10 +0000
commita2d20ed58f2847da4cc4e0740ca21fb443973a77 (patch)
treefc1bc04fcf5a2a2a0b5365020b5099197900e697
parentbd8de01d512c70c5d6607ac6f706c930bc504dfa (diff)
n2a03: Put a second irq line logically-ored with the normal one [O. Galibert]
-rw-r--r--src/emu/cpu/m6502/m6502.c6
-rw-r--r--src/emu/cpu/m6502/m6502.h3
-rw-r--r--src/emu/cpu/m6502/n2a03.h1
-rw-r--r--src/emu/sound/nes_apu.c4
4 files changed, 10 insertions, 4 deletions
diff --git a/src/emu/cpu/m6502/m6502.c b/src/emu/cpu/m6502/m6502.c
index 853b565ea69..5cdd7b07acc 100644
--- a/src/emu/cpu/m6502/m6502.c
+++ b/src/emu/cpu/m6502/m6502.c
@@ -96,6 +96,7 @@ void m6502_device::init()
save_item(NAME(IR));
save_item(NAME(nmi_state));
save_item(NAME(irq_state));
+ save_item(NAME(apu_irq_state));
save_item(NAME(v_state));
save_item(NAME(inst_state));
save_item(NAME(inst_substate));
@@ -116,6 +117,7 @@ void m6502_device::init()
IR = 0x00;
nmi_state = false;
irq_state = false;
+ apu_irq_state = false;
irq_taken = false;
v_state = false;
inst_state = STATE_RESET;
@@ -131,6 +133,7 @@ void m6502_device::device_reset()
inst_substate = 0;
nmi_state = false;
irq_state = false;
+ apu_irq_state = false;
irq_taken = false;
v_state = false;
end_cycles = 0;
@@ -416,6 +419,7 @@ void m6502_device::execute_set_input(int inputnum, int state)
{
switch(inputnum) {
case IRQ_LINE: irq_state = state == ASSERT_LINE; break;
+ case APU_IRQ_LINE: apu_irq_state = state == ASSERT_LINE; break;
case NMI_LINE: nmi_state = nmi_state || (state == ASSERT_LINE); break;
case V_LINE:
if(!v_state && state == ASSERT_LINE)
@@ -612,7 +616,7 @@ void m6502_device::prefetch()
IR = mintf->read_decrypted(PC);
sync = false;
- if((nmi_state || (irq_state && !(P & F_I))) && !inhibit_interrupts) {
+ if((nmi_state || ((irq_state || apu_irq_state) && !(P & F_I))) && !inhibit_interrupts) {
irq_taken = true;
IR = 0x00;
} else
diff --git a/src/emu/cpu/m6502/m6502.h b/src/emu/cpu/m6502/m6502.h
index 1368f96f15e..21ae3cc5b58 100644
--- a/src/emu/cpu/m6502/m6502.h
+++ b/src/emu/cpu/m6502/m6502.h
@@ -47,6 +47,7 @@ class m6502_device : public cpu_device {
public:
enum {
IRQ_LINE = INPUT_LINE_IRQ0,
+ APU_IRQ_LINE = INPUT_LINE_IRQ1,
NMI_LINE = INPUT_LINE_NMI,
V_LINE = 10
};
@@ -176,7 +177,7 @@ protected:
memory_interface *mintf;
int inst_state, inst_substate;
int icount;
- bool nmi_state, irq_state, v_state;
+ bool nmi_state, irq_state, apu_irq_state, v_state;
bool irq_taken, sync, direct_disabled, inhibit_interrupts;
UINT64 end_cycles;
diff --git a/src/emu/cpu/m6502/n2a03.h b/src/emu/cpu/m6502/n2a03.h
index 6c5a2c515b5..38d72ef2035 100644
--- a/src/emu/cpu/m6502/n2a03.h
+++ b/src/emu/cpu/m6502/n2a03.h
@@ -87,6 +87,7 @@ protected:
enum {
N2A03_IRQ_LINE = m6502_device::IRQ_LINE,
+ N2A03_APU_IRQ_LINE = m6502_device::APU_IRQ_LINE,
N2A03_NMI_LINE = m6502_device::NMI_LINE,
N2A03_SET_OVERFLOW = m6502_device::V_LINE,
};
diff --git a/src/emu/sound/nes_apu.c b/src/emu/sound/nes_apu.c
index e40aad5e4fb..33f15ca2a53 100644
--- a/src/emu/sound/nes_apu.c
+++ b/src/emu/sound/nes_apu.c
@@ -371,7 +371,7 @@ static int8 apu_dpcm(nesapu_state *info, dpcm_t *chan)
if (chan->regs[0] & 0x80) /* IRQ Generator */
{
chan->irq_occurred = TRUE;
- downcast<n2a03_device &>(info->APU.dpcm.memory->device()).set_input_line(N2A03_IRQ_LINE, ASSERT_LINE);
+ downcast<n2a03_device &>(info->APU.dpcm.memory->device()).set_input_line(N2A03_APU_IRQ_LINE, ASSERT_LINE);
}
break;
}
@@ -521,7 +521,7 @@ INLINE void apu_regwrite(nesapu_state *info,int address, uint8 value)
case APU_WRE0:
info->APU.dpcm.regs[0] = value;
if (0 == (value & 0x80)) {
- downcast<n2a03_device &>(info->APU.dpcm.memory->device()).set_input_line(N2A03_IRQ_LINE, CLEAR_LINE);
+ downcast<n2a03_device &>(info->APU.dpcm.memory->device()).set_input_line(N2A03_APU_IRQ_LINE, CLEAR_LINE);
info->APU.dpcm.irq_occurred = FALSE;
}
break;