diff options
author | 2020-02-23 10:59:39 +0100 | |
---|---|---|
committer | 2020-02-23 11:11:06 +0100 | |
commit | 047dfdd5d797bc978cadfde1a4e6f6d7b10cda43 (patch) | |
tree | 08b17142edd18915e6381c3ade137efa9bb0c77b /src | |
parent | c906df602cd7e52a5bc8f35cc372e003541e1a6f (diff) |
x2: some fixes (nw)
Diffstat (limited to 'src')
-rw-r--r-- | src/devices/cpu/xavix2/xavix2.cpp | 76 | ||||
-rw-r--r-- | src/devices/cpu/xavix2/xavix2.h | 35 | ||||
-rw-r--r-- | src/mame/drivers/xavix2.cpp | 40 |
3 files changed, 73 insertions, 78 deletions
diff --git a/src/devices/cpu/xavix2/xavix2.cpp b/src/devices/cpu/xavix2/xavix2.cpp index b07f8166e0b..d15d74c5c22 100644 --- a/src/devices/cpu/xavix2/xavix2.cpp +++ b/src/devices/cpu/xavix2/xavix2.cpp @@ -24,9 +24,9 @@ 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("%5s").noshow(); + state_add(STATE_GENFLAGS, "GENFLAGS", m_hr[4]).callimport().formatstr("%5s").noshow(); state_add(XAVIX2_PC, "PC", m_pc).callimport(); - state_add(XAVIX2_FLAGS, "FLAGS", m_f).callimport(); + state_add(XAVIX2_FLAGS, "FLAGS", m_hr[4]).callimport(); state_add(XAVIX2_R0, "R0", m_r[0]); state_add(XAVIX2_R1, "R1", m_r[1]); state_add(XAVIX2_R2, "R2", m_r[2]); @@ -104,7 +104,6 @@ void xavix2_device::device_start() save_item(NAME(m_pc)); - save_item(NAME(m_f)); save_item(NAME(m_r)); save_item(NAME(m_ilr1)); save_item(NAME(m_if1)); @@ -116,7 +115,6 @@ void xavix2_device::device_start() set_icountptr(m_icount); m_pc = 0; - m_f = 0; m_int_line = false; m_wait = false; @@ -126,7 +124,7 @@ void xavix2_device::device_start() void xavix2_device::device_reset() { - m_f = F_I; + m_hr[4] = F_I; m_pc = 0x40000000; } @@ -147,13 +145,13 @@ uint32_t xavix2_device::execute_input_lines() const noexcept u32 xavix2_device::check_interrupt(u32 cpc) { - if(m_int_line && (!(m_f & F_I) || m_wait)) { + if(m_int_line && (!(m_hr[4] & F_I) || m_wait)) { standard_irq_callback(0); m_ilr1 = m_wait ? cpc + 1 : cpc; m_wait = false; m_ei_count = 0; - m_if1 = m_f; - m_f |= F_I; + m_if1 = m_hr[4]; + m_hr[4] |= F_I; return 0x40000010; } return cpc; @@ -181,11 +179,11 @@ void xavix2_device::state_string_export(const device_state_entry &entry, std::st 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' : '-'); + m_hr[4] & F_I ? 'I' : '-', + m_hr[4] & F_V ? 'V' : '-', + m_hr[4] & F_C ? 'C' : '-', + m_hr[4] & F_N ? 'N' : '-', + m_hr[4] & F_Z ? 'Z' : '-'); break; } } @@ -358,42 +356,42 @@ void xavix2_device::execute_run() break; } - case 0xc8: case 0xc9: m_r[r1(opcode)] = snz(m_hr[val6u(opcode)]); break; + case 0xc8: case 0xc9: m_r[r1(opcode)] = m_hr[val6u(opcode)]; break; case 0xca: case 0xcb: m_hr[val6u(opcode)] = m_r[r1(opcode)]; break; - case 0xd0: if(m_f & F_V) npc = m_pc + val8s(opcode); break; - case 0xd1: if(m_f & F_C) npc = m_pc + val8s(opcode); break; - case 0xd2: if(m_f & F_Z) npc = m_pc + val8s(opcode); break; - case 0xd3: if((m_f & F_Z) || (m_f & F_C)) npc = m_pc + val8s(opcode); break; - case 0xd4: if(m_f & F_N) npc = m_pc + val8s(opcode); break; + case 0xd0: if(m_hr[4] & F_V) npc = m_pc + val8s(opcode); break; + case 0xd1: if(m_hr[4] & F_C) npc = m_pc + val8s(opcode); break; + case 0xd2: if(m_hr[4] & F_Z) npc = m_pc + val8s(opcode); break; + case 0xd3: if((m_hr[4] & F_Z) || (m_hr[4] & F_C)) npc = m_pc + val8s(opcode); break; + case 0xd4: if(m_hr[4] & F_N) npc = m_pc + val8s(opcode); break; case 0xd5: npc = m_pc + val8s(opcode); break; - case 0xd6: if(((m_f & F_N) && !(m_f & F_V)) || ((m_f & F_V) && !(m_f & F_N))) npc = m_pc + val8s(opcode); break; - case 0xd7: if((m_f & F_Z) || ((m_f & F_N) && !(m_f & F_V)) || ((m_f & F_V) && !(m_f & F_N))) npc = m_pc + val8s(opcode); break; - case 0xd8: if(!(m_f & F_V)) npc = m_pc + val8s(opcode); break; - case 0xd9: if(!(m_f & F_C)) npc = m_pc + val8s(opcode); break; - case 0xda: if(!(m_f & F_Z)) npc = m_pc + val8s(opcode); break; - case 0xdb: if(!(m_f & F_Z) && !(m_f & F_C)) npc = m_pc + val8s(opcode); break; - case 0xdc: if(!(m_f & F_N)) npc = m_pc + val8s(opcode); break; + case 0xd6: if(((m_hr[4] & F_N) && !(m_hr[4] & F_V)) || ((m_hr[4] & F_V) && !(m_hr[4] & F_N))) npc = m_pc + val8s(opcode); break; + case 0xd7: if((m_hr[4] & F_Z) || ((m_hr[4] & F_N) && !(m_hr[4] & F_V)) || ((m_hr[4] & F_V) && !(m_hr[4] & F_N))) npc = m_pc + val8s(opcode); break; + case 0xd8: if(!(m_hr[4] & F_V)) npc = m_pc + val8s(opcode); break; + case 0xd9: if(!(m_hr[4] & F_C)) npc = m_pc + val8s(opcode); break; + case 0xda: if(!(m_hr[4] & F_Z)) npc = m_pc + val8s(opcode); break; + case 0xdb: if(!(m_hr[4] & F_Z) && !(m_hr[4] & F_C)) npc = m_pc + val8s(opcode); break; + case 0xdc: if(!(m_hr[4] & F_N)) npc = m_pc + val8s(opcode); break; case 0xdd: break; - case 0xde: if(((m_f & F_N) && (m_f & F_V)) || (!(m_f & F_V) && !(m_f & F_N))) npc = m_pc + val8s(opcode); break; - case 0xdf: if((!(m_f & F_Z) && (m_f & F_N) && (m_f & F_V)) || (!(m_f & F_Z) && !(m_f & F_V) && !(m_f & F_N))) npc = m_pc + val8s(opcode); break; + case 0xde: if(((m_hr[4] & F_N) && (m_hr[4] & F_V)) || (!(m_hr[4] & F_V) && !(m_hr[4] & F_N))) npc = m_pc + val8s(opcode); break; + case 0xdf: if((!(m_hr[4] & F_Z) && (m_hr[4] & F_N) && (m_hr[4] & F_V)) || (!(m_hr[4] & F_Z) && !(m_hr[4] & F_V) && !(m_hr[4] & F_N))) npc = m_pc + val8s(opcode); break; case 0xe0: npc = m_r[7]; break; - case 0xe1: m_f = m_if1; npc = m_ilr1; break; + case 0xe1: m_hr[4] = m_if1; npc = m_ilr1; break; // e2 case 0xe3: /* rti2 */ break; // e4-ef - case 0xf0: m_f |= F_C; break; - case 0xf1: m_f &= ~F_C; break; - case 0xf2: m_f |= F_Z; break; - case 0xf3: m_f &= ~F_Z; break; - case 0xf4: m_f |= F_N; break; - case 0xf5: m_f &= ~F_N; break; - case 0xf6: m_f |= F_V; break; - case 0xf7: m_f &= ~F_V; break; - case 0xf8: m_f |= F_I; break; - case 0xf9: m_f &= ~F_I; m_ei_count = 2; break; + case 0xf0: m_hr[4] |= F_C; break; + case 0xf1: m_hr[4] &= ~F_C; break; + case 0xf2: m_hr[4] |= F_Z; break; + case 0xf3: m_hr[4] &= ~F_Z; break; + case 0xf4: m_hr[4] |= F_N; break; + case 0xf5: m_hr[4] &= ~F_N; break; + case 0xf6: m_hr[4] |= F_V; break; + case 0xf7: m_hr[4] &= ~F_V; break; + case 0xf8: m_hr[4] |= F_I; break; + case 0xf9: m_hr[4] &= ~F_I; m_ei_count = 2; break; // fa-fb case 0xfc: break; // fd diff --git a/src/devices/cpu/xavix2/xavix2.h b/src/devices/cpu/xavix2/xavix2.h index 1fdcc74e814..7693874b1e5 100644 --- a/src/devices/cpu/xavix2/xavix2.h +++ b/src/devices/cpu/xavix2/xavix2.h @@ -46,7 +46,6 @@ protected: u32 m_pc; u32 m_r[8], m_hr[64]; u32 m_ilr1; - u8 m_f; u8 m_if1; bool m_int_line, m_wait; @@ -83,7 +82,7 @@ protected: f |= F_C; if(((v1 ^ r) & (v2 ^ r)) & 0x80000000) f |= F_V; - m_f = (m_f & ~F_MASK) | f; + m_hr[4] = (m_hr[4] & ~F_MASK) | f; return r; } @@ -98,7 +97,7 @@ protected: f |= F_C; if(((v1 ^ v2) & (v2 ^ r)) & 0x80000000) f |= F_V; - m_f = (m_f & ~F_MASK) | f; + m_hr[4] = (m_hr[4] & ~F_MASK) | f; return r; } @@ -108,67 +107,67 @@ protected: f |= F_Z; if(r & 0x80000000) f |= F_N; - m_f = (m_f & ~F_MASK) | f; - return r; - } + m_hr[4] = (m_hr[4] & ~F_MASK) | f; + return r; + } inline u32 do_lsl(u32 v1, u32 shift) { if(!shift) { - m_f = (m_f & ~F_MASK) | (v1 ? v1 & 0x80000000 ? F_N : 0 : F_Z); + m_hr[4] = (m_hr[4] & ~F_MASK) | (v1 ? v1 & 0x80000000 ? F_N : 0 : F_Z); return v1; } else if(shift < 32) { u32 r = v1 << shift; u32 f = v1 ? v1 & 0x80000000 ? F_N : 0 : F_Z; if(v1 & (1 << (32-shift))) f |= F_C; - m_f = (m_f & ~F_MASK) | f; + m_hr[4] = (m_hr[4] & ~F_MASK) | f; return r; } else if(shift == 32) { - m_f = (m_f & ~F_MASK) | (v1 & 1 ? F_C|F_Z : F_Z); + m_hr[4] = (m_hr[4] & ~F_MASK) | (v1 & 1 ? F_C|F_Z : F_Z); return 0; } else { - m_f = (m_f & ~F_MASK) | F_Z; + m_hr[4] = (m_hr[4] & ~F_MASK) | F_Z; return 0; } } inline u32 do_lsr(u32 v1, u32 shift) { if(!shift) { - m_f = (m_f & ~F_MASK) | (v1 ? v1 & 0x80000000 ? F_N : 0 : F_Z); + m_hr[4] = (m_hr[4] & ~F_MASK) | (v1 ? v1 & 0x80000000 ? F_N : 0 : F_Z); return v1; } else if(shift < 32) { u32 r = v1 >> shift; u32 f = v1 ? 0 : F_Z; if(v1 & (1 << (shift - 1))) f |= F_C; - m_f = (m_f & ~F_MASK) | f; + m_hr[4] = (m_hr[4] & ~F_MASK) | f; return r; } else if(shift == 32) { - m_f = (m_f & ~F_MASK) | (v1 & 0x80000000 ? F_C|F_Z : F_Z); + m_hr[4] = (m_hr[4] & ~F_MASK) | (v1 & 0x80000000 ? F_C|F_Z : F_Z); return 0; } else { - m_f = (m_f & ~F_MASK) | F_Z; + m_hr[4] = (m_hr[4] & ~F_MASK) | F_Z; return 0; } } inline u32 do_asr(u32 v1, u32 shift) { if(!shift) { - m_f = (m_f & ~F_MASK) | (v1 ? v1 & 0x80000000 ? F_N : 0 : F_Z); + m_hr[4] = (m_hr[4] & ~F_MASK) | (v1 ? v1 & 0x80000000 ? F_N : 0 : F_Z); return v1; } else if(shift < 32) { u32 r = static_cast<s32>(v1) >> shift; u32 f = v1 ? v1 & 0x80000000 ? F_N : 0 : F_Z; if(v1 & (1 << (shift - 1))) f |= F_C; - m_f = (m_f & ~F_MASK) | f; + m_hr[4] = (m_hr[4] & ~F_MASK) | f; return r; } else { if(v1 & 0x80000000) { - m_f = (m_f & ~F_MASK) | F_C; + m_hr[4] = (m_hr[4] & ~F_MASK) | F_C; return 0xffffffff; } else { - m_f = (m_f & ~F_MASK) | F_Z; + m_hr[4] = (m_hr[4] & ~F_MASK) | F_Z; return 0; } } diff --git a/src/mame/drivers/xavix2.cpp b/src/mame/drivers/xavix2.cpp index 7cb949e017e..ce7984ef72c 100644 --- a/src/mame/drivers/xavix2.cpp +++ b/src/mame/drivers/xavix2.cpp @@ -46,7 +46,7 @@ private: u16 m_dma_count; emu_timer *m_dma_timer; - u16 m_port0_ddr, m_port0_data; + u32 m_port0_ddr, m_port0_data; u16 m_gpu_adr, m_gpu_descsize_adr, m_gpu_descdata_adr; u32 m_int_active; @@ -80,10 +80,10 @@ private: u8 debug_port_r(); u8 debug_port_status_r(); - void port0_ddr_w(u16 data); - u16 port0_ddr_r(); - void port0_w(u16 data); - u16 port0_r(); + void port0_ddr_w(offs_t, u32 data, u32 mem_mask); + u32 port0_ddr_r(); + void port0_w(offs_t, u32 data, u32 mem_mask); + u32 port0_r(); void crtc_w(offs_t reg, u16 data); @@ -280,7 +280,6 @@ TIMER_CALLBACK_MEMBER(xavix2_state::dma_end) INTERRUPT_GEN_MEMBER(xavix2_state::vblank_irq) { - logerror("clear\n"); memset(m_sd, 0, sizeof(m_sd)); irq_raise(IRQ_TIMER); } @@ -308,30 +307,30 @@ u8 xavix2_state::debug_port_status_r() return 1<<1; } -void xavix2_state::port0_ddr_w(u16 data) +void xavix2_state::port0_ddr_w(offs_t, u32 data, u32 mem_mask) { - m_port0_ddr = data; - logerror("port0 ddr %04x\n", data); + COMBINE_DATA(&m_port0_ddr); + logerror("port0 ddr %08x\n", data); } -u16 xavix2_state::port0_ddr_r() +u32 xavix2_state::port0_ddr_r() { return m_port0_ddr; } -void xavix2_state::port0_w(u16 data) +void xavix2_state::port0_w(offs_t, u32 data, u32 mem_mask) { - m_port0_data = data; - m_i2cmem->write_sda(data & 0x20); - m_i2cmem->write_scl(data & 0x10); - logerror("port0_w %04x\n", data); + COMBINE_DATA(&m_port0_data); + m_i2cmem->write_sda((m_port0_data & 0x00200000) && m_i2cmem->read_sda()); + m_i2cmem->write_scl(!!(m_port0_data & 0x00100000)); + logerror("port0_w %08x\n", m_port0_data); } -u16 xavix2_state::port0_r() +u32 xavix2_state::port0_r() { // Slightly hacky, should take ddr into account - u16 data = m_port0_data & (m_i2cmem->read_sda() ? ~0x00 : ~0x20); - logerror("port0_r %04x\n", data); + u32 data = m_i2cmem->read_sda() ? m_port0_data | 0x00200000 : m_port0_data & ~0x00200000; + logerror("port0_r %08x\n", data); return data; } @@ -386,8 +385,8 @@ void xavix2_state::mem(address_map &map) map(0xffffe00c, 0xffffe00c).w(FUNC(xavix2_state::dma_control_w)); map(0xffffe010, 0xffffe010).rw(FUNC(xavix2_state::dma_status_r), FUNC(xavix2_state::dma_status_w)); - map(0xffffe204, 0xffffe205).rw(FUNC(xavix2_state::port0_ddr_r), FUNC(xavix2_state::port0_ddr_w)); - map(0xffffe20a, 0xffffe20b).rw(FUNC(xavix2_state::port0_r), FUNC(xavix2_state::port0_w)); + map(0xffffe204, 0xffffe207).rw(FUNC(xavix2_state::port0_ddr_r), FUNC(xavix2_state::port0_ddr_w)); + map(0xffffe208, 0xffffe20b).rw(FUNC(xavix2_state::port0_r), FUNC(xavix2_state::port0_w)); map(0xffffe238, 0xffffe238).rw(FUNC(xavix2_state::debug_port_r), FUNC(xavix2_state::debug_port_w)); map(0xffffe239, 0xffffe239).r(FUNC(xavix2_state::debug_port_status_r)); @@ -406,7 +405,6 @@ void xavix2_state::mem(address_map &map) uint32_t xavix2_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - logerror("draw\n"); constexpr int dx = 0x400 - 320; constexpr int dy = 0x200 - 200; |