From 31ec471cf6aa5a157e9d1d4297b4aed14555f4d6 Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Tue, 11 Feb 2020 19:34:35 +0100 Subject: hack some interrupts in --- src/devices/cpu/xavix2/xavix2.cpp | 34 ++++++++++++++++++++++++++++------ src/devices/cpu/xavix2/xavix2.h | 6 ++++-- src/mame/drivers/xavix2.cpp | 14 ++++++++++++-- 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 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); -- cgit v1.2.3