summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2020-02-11 19:34:35 +0100
committer Olivier Galibert <galibert@pobox.com>2020-02-11 19:34:35 +0100
commit31ec471cf6aa5a157e9d1d4297b4aed14555f4d6 (patch)
treeb0a858f072fdacce184969259d64a7a078ebbdf2
parente242fcd03322db2b7de5004008d44f273d6ee20c (diff)
hack some interrupts in
-rw-r--r--src/devices/cpu/xavix2/xavix2.cpp34
-rw-r--r--src/devices/cpu/xavix2/xavix2.h6
-rw-r--r--src/mame/drivers/xavix2.cpp14
3 files changed, 44 insertions, 10 deletions
diff --git a/src/devices/cpu/xavix2/xavix2.cpp b/src/devices/cpu/xavix2/xavix2.cpp
index 689d8626dd1..ac352aba46b 100644
--- a/src/devices/cpu/xavix2/xavix2.cpp
+++ b/src/devices/cpu/xavix2/xavix2.cpp
@@ -24,7 +24,7 @@ void xavix2_device::device_start()
state_add(STATE_GENPC, "GENPC", m_pc).callexport().noshow();
state_add(STATE_GENPCBASE, "CURPC", m_pc).callexport().noshow();
state_add(STATE_GENSP, "GENSP", m_r[7]).noshow();
- state_add(STATE_GENFLAGS, "GENFLAGS", m_f).callimport().formatstr("%4s").noshow();
+ state_add(STATE_GENFLAGS, "GENFLAGS", m_f).callimport().formatstr("%5s").noshow();
state_add(XAVIX2_PC, "PC", m_pc).callimport();
state_add(XAVIX2_FLAGS, "FLAGS", m_f).callimport();
state_add(XAVIX2_R0, "R0", m_r[0]);
@@ -109,11 +109,14 @@ void xavix2_device::device_start()
save_item(NAME(m_ilr1));
save_item(NAME(m_if1));
save_item(NAME(m_hr));
+ save_item(NAME(m_int_line));
set_icountptr(m_icount);
m_pc = 0;
m_f = 0;
+ m_int_line = false;
+
memset(m_r, 0, sizeof(m_r));
memset(m_hr, 0, sizeof(m_hr));
}
@@ -135,17 +138,25 @@ uint32_t xavix2_device::execute_max_cycles() const noexcept
}
uint32_t xavix2_device::execute_input_lines() const noexcept
-{
- return 0;
+{
+ return 1;
}
-u32 xavix2_device::check_interrupts(u32 npc)
+u32 xavix2_device::check_interrupt(u32 cpc)
{
- return npc;
+ if(m_int_line && !(m_f & F_I)) {
+ standard_irq_callback(0);
+ m_ilr1 = cpc;
+ m_if1 = m_f;
+ m_f |= F_I;
+ return 0x40000010;
+ }
+ return cpc;
}
void xavix2_device::execute_set_input(int inputnum, int state)
{
+ m_int_line = state;
}
device_memory_interface::space_config_vector xavix2_device::memory_space_config() const
@@ -162,10 +173,21 @@ std::unique_ptr<util::disasm_interface> xavix2_device::create_disassembler()
void xavix2_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
+ switch(entry.index()) {
+ case STATE_GENFLAGS:
+ str = util::string_format("%c%c%c%c%c",
+ m_f & F_I ? 'I' : '-',
+ m_f & F_V ? 'V' : '-',
+ m_f & F_C ? 'C' : '-',
+ m_f & F_N ? 'N' : '-',
+ m_f & F_Z ? 'Z' : '-');
+ break;
+ }
}
void xavix2_device::execute_run()
{
+ m_pc = check_interrupt(m_pc);
while(m_icount > 0) {
if(machine().debug_flags & DEBUG_FLAG_ENABLED)
debugger_instruction_hook(m_pc);
@@ -351,7 +373,7 @@ void xavix2_device::execute_run()
case 0xe3: /* rti2 */ break;
// e4-fb
case 0xf8: m_f |= F_I; break;
- case 0xf9: m_f &= ~F_I; npc = check_interrupts(npc); break;
+ case 0xf9: m_f &= ~F_I; npc = check_interrupt(npc); break;
case 0xfc: break;
// fd-ff
diff --git a/src/devices/cpu/xavix2/xavix2.h b/src/devices/cpu/xavix2/xavix2.h
index 4b6f080f663..c5d86074356 100644
--- a/src/devices/cpu/xavix2/xavix2.h
+++ b/src/devices/cpu/xavix2/xavix2.h
@@ -46,8 +46,10 @@ protected:
u32 m_r[8], m_hr[64];
u32 m_ilr1;
u8 m_f;
-
u8 m_if1;
+
+ bool m_int_line;
+
static inline int r1(u32 opcode) { return (opcode >> 22) & 7; }
static inline int r2(u32 opcode) { return (opcode >> 19) & 7; }
static inline int r3(u32 opcode) { return (opcode >> 16) & 7; }
@@ -170,7 +172,7 @@ protected:
}
}
- u32 check_interrupts(u32 npc);
+ u32 check_interrupt(u32 npc);
};
enum {
diff --git a/src/mame/drivers/xavix2.cpp b/src/mame/drivers/xavix2.cpp
index c6587351852..f165cd77688 100644
--- a/src/mame/drivers/xavix2.cpp
+++ b/src/mame/drivers/xavix2.cpp
@@ -45,13 +45,19 @@ private:
void xavix2_state::mem(address_map &map)
{
- map(0x00000000, 0x00001fff).ram();
+ map(0x00000000, 0x00001fff).ram().share("part1");
map(0x00002630, 0x00002631).lr16(NAME([]() { return 0x210; }));
map(0x00002632, 0x00002633).lr16(NAME([]() { return 0x210; }));
-
+ map(0x00003c00, 0x00003c00).lr8(NAME([]() { return 7; })); // Current active interrupt number
+ map(0x00004000, 0x0000ffff).ram().share("part2");
map(0x00010000, 0x00ffffff).rom().region("maincpu", 0x010000);
map(0x40000000, 0x40ffffff).rom().region("maincpu", 0);
+
+ map(0xc0000000, 0xc0001fff).ram().share("part1");
+ map(0xc0002000, 0xc0003fff).ram();
+ map(0xc0004000, 0xc000ffff).ram().share("part2");
+ map(0xc0010000, 0xc001ffff).ram();
}
uint32_t xavix2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
@@ -65,6 +71,9 @@ void xavix2_state::machine_start()
void xavix2_state::machine_reset()
{
+ auto &prg = m_maincpu->space(AS_PROGRAM);
+ for(u32 adr=0; adr != 0x2000; adr++)
+ prg.write_byte(adr, prg.read_byte(0x40000000 + adr));
}
static INPUT_PORTS_START( xavix2 )
@@ -75,6 +84,7 @@ void xavix2_state::xavix2(machine_config &config)
// unknown CPU 'SSD 2002-2004 NEC 800208-51'
XAVIX2(config, m_maincpu, 98'000'000);
m_maincpu->set_addrmap(AS_PROGRAM, &xavix2_state::mem);
+ m_maincpu->set_vblank_int("screen", FUNC(xavix2_state::irq0_line_hold));
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(60);