summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2020-02-23 10:59:39 +0100
committer Olivier Galibert <galibert@pobox.com>2020-02-23 11:11:06 +0100
commit047dfdd5d797bc978cadfde1a4e6f6d7b10cda43 (patch)
tree08b17142edd18915e6381c3ade137efa9bb0c77b /src
parentc906df602cd7e52a5bc8f35cc372e003541e1a6f (diff)
x2: some fixes (nw)
Diffstat (limited to 'src')
-rw-r--r--src/devices/cpu/xavix2/xavix2.cpp76
-rw-r--r--src/devices/cpu/xavix2/xavix2.h35
-rw-r--r--src/mame/drivers/xavix2.cpp40
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;