Skip to content

Commit 47fe973

Browse files
authored
cpu/i960: Only trigger interrupts if the input changes to the asserted state. (#14186)
* namco/namcofl.cpp: Implemented interrupt acknowledge, and drop interrupts on reset. * sega/model2.cpp: Drop interrupts on reset.
1 parent a115d4c commit 47fe973

File tree

4 files changed

+75
-46
lines changed

4 files changed

+75
-46
lines changed

src/devices/cpu/i960/i960.cpp

Lines changed: 54 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
#include "i960.h"
55
#include "i960dis.h"
66

7+
#include <algorithm>
8+
79
#ifdef _MSC_VER
810
/* logb prototype is different for MS Visual C */
911
#include <cfloat>
@@ -2218,6 +2220,11 @@ void i960_cpu_device::execute_run()
22182220

22192221
void i960_cpu_device::execute_set_input(int irqline, int state)
22202222
{
2223+
if (m_irq_line_state[irqline] == state)
2224+
return;
2225+
2226+
m_irq_line_state[irqline] = state;
2227+
22212228
int int_tab = m_program.read_dword(m_PRCB+20); // interrupt table
22222229
int cpu_pri = (m_PC>>16)&0x1f;
22232230
int vector =0;
@@ -2311,55 +2318,56 @@ void i960_cpu_device::device_start()
23112318
save_item(NAME(m_stall_state.t1));
23122319
save_item(NAME(m_stall_state.t2));
23132320
save_item(NAME(m_stall_state.burst_mode));
2314-
2315-
2316-
state_add( I960_SAT, "sat", m_SAT).formatstr("%08X");
2317-
state_add( I960_PRCB, "prcb", m_PRCB).formatstr("%08X");
2318-
state_add( I960_PC, "pc", m_PC).formatstr("%08X");
2319-
state_add( I960_AC, "ac", m_AC).formatstr("%08X");
2320-
state_add( I960_IP, "ip", m_IP).formatstr("%08X");
2321-
state_add( I960_PIP, "pip", m_PIP).formatstr("%08X");
2322-
state_add( I960_R0, "pfp", m_r[ 0]).formatstr("%08X");
2323-
state_add( I960_R1, "sp", m_r[ 1]).formatstr("%08X");
2324-
state_add( I960_R2, "rip", m_r[ 2]).formatstr("%08X");
2325-
state_add( I960_R3, "r3", m_r[ 3]).formatstr("%08X");
2326-
state_add( I960_R4, "r4", m_r[ 4]).formatstr("%08X");
2327-
state_add( I960_R5, "r5", m_r[ 5]).formatstr("%08X");
2328-
state_add( I960_R6, "r6", m_r[ 6]).formatstr("%08X");
2329-
state_add( I960_R7, "r7", m_r[ 7]).formatstr("%08X");
2330-
state_add( I960_R8, "r8", m_r[ 8]).formatstr("%08X");
2331-
state_add( I960_R9, "r9", m_r[ 9]).formatstr("%08X");
2332-
state_add( I960_R10, "r10", m_r[10]).formatstr("%08X");
2333-
state_add( I960_R11, "r11", m_r[11]).formatstr("%08X");
2334-
state_add( I960_R12, "r12", m_r[12]).formatstr("%08X");
2335-
state_add( I960_R13, "r13", m_r[13]).formatstr("%08X");
2336-
state_add( I960_R14, "r14", m_r[14]).formatstr("%08X");
2337-
state_add( I960_R15, "r15", m_r[15]).formatstr("%08X");
2338-
state_add( I960_G0, "g0", m_r[16]).formatstr("%08X");
2339-
state_add( I960_G1, "g1", m_r[17]).formatstr("%08X");
2340-
state_add( I960_G2, "g2", m_r[18]).formatstr("%08X");
2341-
state_add( I960_G3, "g3", m_r[19]).formatstr("%08X");
2342-
state_add( I960_G4, "g4", m_r[20]).formatstr("%08X");
2343-
state_add( I960_G5, "g5", m_r[21]).formatstr("%08X");
2344-
state_add( I960_G6, "g6", m_r[22]).formatstr("%08X");
2345-
state_add( I960_G7, "g7", m_r[23]).formatstr("%08X");
2346-
state_add( I960_G8, "g8", m_r[24]).formatstr("%08X");
2347-
state_add( I960_G9, "g9", m_r[25]).formatstr("%08X");
2348-
state_add( I960_G10, "g10", m_r[26]).formatstr("%08X");
2349-
state_add( I960_G11, "g11", m_r[27]).formatstr("%08X");
2350-
state_add( I960_G12, "g12", m_r[28]).formatstr("%08X");
2351-
state_add( I960_G13, "g13", m_r[29]).formatstr("%08X");
2352-
state_add( I960_G14, "g14", m_r[30]).formatstr("%08X");
2353-
state_add( I960_G15, "fp", m_r[31]).formatstr("%08X");
2354-
2355-
state_add( STATE_GENPC, "GENPC", m_IP).noshow();
2356-
state_add( STATE_GENPCBASE, "CURPC", m_IP).noshow();
2357-
state_add( STATE_GENFLAGS, "GENFLAGS", m_AC).noshow().formatstr("%2s");
2321+
save_item(NAME(m_irq_line_state));
2322+
2323+
state_add(I960_SAT, "sat", m_SAT).formatstr("%08X");
2324+
state_add(I960_PRCB, "prcb", m_PRCB).formatstr("%08X");
2325+
state_add(I960_PC, "pc", m_PC).formatstr("%08X");
2326+
state_add(I960_AC, "ac", m_AC).formatstr("%08X");
2327+
state_add(I960_IP, "ip", m_IP).formatstr("%08X");
2328+
state_add(I960_PIP, "pip", m_PIP).formatstr("%08X");
2329+
state_add(I960_R0, "pfp", m_r[ 0]).formatstr("%08X");
2330+
state_add(I960_R1, "sp", m_r[ 1]).formatstr("%08X");
2331+
state_add(I960_R2, "rip", m_r[ 2]).formatstr("%08X");
2332+
state_add(I960_R3, "r3", m_r[ 3]).formatstr("%08X");
2333+
state_add(I960_R4, "r4", m_r[ 4]).formatstr("%08X");
2334+
state_add(I960_R5, "r5", m_r[ 5]).formatstr("%08X");
2335+
state_add(I960_R6, "r6", m_r[ 6]).formatstr("%08X");
2336+
state_add(I960_R7, "r7", m_r[ 7]).formatstr("%08X");
2337+
state_add(I960_R8, "r8", m_r[ 8]).formatstr("%08X");
2338+
state_add(I960_R9, "r9", m_r[ 9]).formatstr("%08X");
2339+
state_add(I960_R10, "r10", m_r[10]).formatstr("%08X");
2340+
state_add(I960_R11, "r11", m_r[11]).formatstr("%08X");
2341+
state_add(I960_R12, "r12", m_r[12]).formatstr("%08X");
2342+
state_add(I960_R13, "r13", m_r[13]).formatstr("%08X");
2343+
state_add(I960_R14, "r14", m_r[14]).formatstr("%08X");
2344+
state_add(I960_R15, "r15", m_r[15]).formatstr("%08X");
2345+
state_add(I960_G0, "g0", m_r[16]).formatstr("%08X");
2346+
state_add(I960_G1, "g1", m_r[17]).formatstr("%08X");
2347+
state_add(I960_G2, "g2", m_r[18]).formatstr("%08X");
2348+
state_add(I960_G3, "g3", m_r[19]).formatstr("%08X");
2349+
state_add(I960_G4, "g4", m_r[20]).formatstr("%08X");
2350+
state_add(I960_G5, "g5", m_r[21]).formatstr("%08X");
2351+
state_add(I960_G6, "g6", m_r[22]).formatstr("%08X");
2352+
state_add(I960_G7, "g7", m_r[23]).formatstr("%08X");
2353+
state_add(I960_G8, "g8", m_r[24]).formatstr("%08X");
2354+
state_add(I960_G9, "g9", m_r[25]).formatstr("%08X");
2355+
state_add(I960_G10, "g10", m_r[26]).formatstr("%08X");
2356+
state_add(I960_G11, "g11", m_r[27]).formatstr("%08X");
2357+
state_add(I960_G12, "g12", m_r[28]).formatstr("%08X");
2358+
state_add(I960_G13, "g13", m_r[29]).formatstr("%08X");
2359+
state_add(I960_G14, "g14", m_r[30]).formatstr("%08X");
2360+
state_add(I960_G15, "fp", m_r[31]).formatstr("%08X");
2361+
2362+
state_add(STATE_GENPC, "GENPC", m_IP).noshow();
2363+
state_add(STATE_GENPCBASE, "CURPC", m_IP).noshow();
2364+
state_add(STATE_GENFLAGS, "GENFLAGS", m_AC).noshow().formatstr("%2s");
23582365

23592366
m_immediate_vector = 0;
23602367
m_immediate_pri = 0;
2361-
memset(m_rcache_frame_addr, 0, sizeof(m_rcache_frame_addr));
2362-
memset(m_fp, 0, sizeof(m_fp));
2368+
std::fill(std::begin(m_rcache_frame_addr), std::end(m_rcache_frame_addr), 0);
2369+
std::fill(std::begin(m_fp), std::end(m_fp), 0.0);
2370+
std::fill(std::begin(m_irq_line_state), std::end(m_irq_line_state), CLEAR_LINE);
23632371
m_PIP = 0;
23642372

23652373
set_icountptr(m_icount);

src/devices/cpu/i960/i960.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ class i960_cpu_device : public cpu_device
132132
int m_immediate_vector;
133133
int m_immediate_pri;
134134

135+
int8_t m_irq_line_state[4];
136+
135137
memory_access<32, 2, 0, ENDIANNESS_LITTLE>::cache m_cache;
136138
memory_access<32, 2, 0, ENDIANNESS_LITTLE>::specific m_program;
137139

src/mame/namco/namcofl.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,8 @@ class namcofl_state : public driver_device
241241
uint8_t m_mcu_port6 = 0;
242242
uint32_t m_sprbank = 0;
243243

244+
static constexpr int irq_type[] = { I960_IRQ0, I960_IRQ1, I960_IRQ2, I960_IRQ3 };
245+
244246
uint32_t unk1_r();
245247
uint8_t network_r(offs_t offset);
246248
uint32_t sysreg_r();
@@ -353,6 +355,11 @@ void namcofl_state::sysreg_w(offs_t offset, uint32_t data, uint32_t mem_mask)
353355
// 1: ROM at 00000000, RAM at 10000000
354356
m_mainbank.select(data & 1);
355357
}
358+
else if (offset >= 0x10 && offset <= 0x13) // clear i960 IRQ line
359+
{
360+
// data value doesn't seem to matter
361+
m_maincpu->set_input_line(irq_type[offset & 3], CLEAR_LINE);
362+
}
356363
}
357364

358365
// FIXME: remove this trampoline once the IRQ is moved into the actual device
@@ -650,6 +657,12 @@ void namcofl_state::machine_reset()
650657

651658
std::fill_n(&m_workram[0], m_workram.bytes() / 4, 0);
652659
m_mainbank.select(1);
660+
661+
662+
for (auto irq : irq_type)
663+
{
664+
m_maincpu->set_input_line(irq, CLEAR_LINE);
665+
}
653666
}
654667

655668

src/mame/sega/model2.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,12 @@ void model2_state::machine_reset()
269269
m_copro_fifo_out->clear();
270270
m_geo_write_start_address = 0;
271271
m_geo_read_start_address = 0;
272+
273+
const int irq_type[] = { I960_IRQ0, I960_IRQ1, I960_IRQ2, I960_IRQ3 };
274+
for (auto irq : irq_type)
275+
{
276+
m_maincpu->set_input_line(irq, CLEAR_LINE);
277+
}
272278
}
273279

274280
void model2_state::reset_model2_scsp()

0 commit comments

Comments
 (0)