x2: some fixes (nw)

This commit is contained in:
Olivier Galibert 2020-02-23 10:59:39 +01:00
parent c906df602c
commit 047dfdd5d7
3 changed files with 73 additions and 78 deletions

View File

@ -24,9 +24,9 @@ void xavix2_device::device_start()
state_add(STATE_GENPC, "GENPC", m_pc).callexport().noshow(); state_add(STATE_GENPC, "GENPC", m_pc).callexport().noshow();
state_add(STATE_GENPCBASE, "CURPC", 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_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_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_R0, "R0", m_r[0]);
state_add(XAVIX2_R1, "R1", m_r[1]); state_add(XAVIX2_R1, "R1", m_r[1]);
state_add(XAVIX2_R2, "R2", m_r[2]); 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_pc));
save_item(NAME(m_f));
save_item(NAME(m_r)); save_item(NAME(m_r));
save_item(NAME(m_ilr1)); save_item(NAME(m_ilr1));
save_item(NAME(m_if1)); save_item(NAME(m_if1));
@ -116,7 +115,6 @@ void xavix2_device::device_start()
set_icountptr(m_icount); set_icountptr(m_icount);
m_pc = 0; m_pc = 0;
m_f = 0;
m_int_line = false; m_int_line = false;
m_wait = false; m_wait = false;
@ -126,7 +124,7 @@ void xavix2_device::device_start()
void xavix2_device::device_reset() void xavix2_device::device_reset()
{ {
m_f = F_I; m_hr[4] = F_I;
m_pc = 0x40000000; m_pc = 0x40000000;
} }
@ -147,13 +145,13 @@ uint32_t xavix2_device::execute_input_lines() const noexcept
u32 xavix2_device::check_interrupt(u32 cpc) 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); standard_irq_callback(0);
m_ilr1 = m_wait ? cpc + 1 : cpc; m_ilr1 = m_wait ? cpc + 1 : cpc;
m_wait = false; m_wait = false;
m_ei_count = 0; m_ei_count = 0;
m_if1 = m_f; m_if1 = m_hr[4];
m_f |= F_I; m_hr[4] |= F_I;
return 0x40000010; return 0x40000010;
} }
return cpc; return cpc;
@ -181,11 +179,11 @@ void xavix2_device::state_string_export(const device_state_entry &entry, std::st
switch(entry.index()) { switch(entry.index()) {
case STATE_GENFLAGS: case STATE_GENFLAGS:
str = util::string_format("%c%c%c%c%c", str = util::string_format("%c%c%c%c%c",
m_f & F_I ? 'I' : '-', m_hr[4] & F_I ? 'I' : '-',
m_f & F_V ? 'V' : '-', m_hr[4] & F_V ? 'V' : '-',
m_f & F_C ? 'C' : '-', m_hr[4] & F_C ? 'C' : '-',
m_f & F_N ? 'N' : '-', m_hr[4] & F_N ? 'N' : '-',
m_f & F_Z ? 'Z' : '-'); m_hr[4] & F_Z ? 'Z' : '-');
break; break;
} }
} }
@ -358,42 +356,42 @@ void xavix2_device::execute_run()
break; 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 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 0xd0: if(m_hr[4] & F_V) npc = m_pc + val8s(opcode); break;
case 0xd1: if(m_f & F_C) npc = m_pc + val8s(opcode); break; case 0xd1: if(m_hr[4] & F_C) npc = m_pc + val8s(opcode); break;
case 0xd2: if(m_f & F_Z) npc = m_pc + val8s(opcode); break; case 0xd2: if(m_hr[4] & 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 0xd3: if((m_hr[4] & F_Z) || (m_hr[4] & F_C)) npc = m_pc + val8s(opcode); break;
case 0xd4: if(m_f & F_N) 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 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 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_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 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_f & F_V)) npc = m_pc + val8s(opcode); break; case 0xd8: if(!(m_hr[4] & F_V)) npc = m_pc + val8s(opcode); break;
case 0xd9: if(!(m_f & F_C)) npc = m_pc + val8s(opcode); break; case 0xd9: if(!(m_hr[4] & F_C)) npc = m_pc + val8s(opcode); break;
case 0xda: if(!(m_f & F_Z)) npc = m_pc + val8s(opcode); break; case 0xda: if(!(m_hr[4] & 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 0xdb: if(!(m_hr[4] & F_Z) && !(m_hr[4] & F_C)) npc = m_pc + val8s(opcode); break;
case 0xdc: if(!(m_f & F_N)) npc = m_pc + val8s(opcode); break; case 0xdc: if(!(m_hr[4] & F_N)) npc = m_pc + val8s(opcode); break;
case 0xdd: 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 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_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 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 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 // e2
case 0xe3: /* rti2 */ break; case 0xe3: /* rti2 */ break;
// e4-ef // e4-ef
case 0xf0: m_f |= F_C; break; case 0xf0: m_hr[4] |= F_C; break;
case 0xf1: m_f &= ~F_C; break; case 0xf1: m_hr[4] &= ~F_C; break;
case 0xf2: m_f |= F_Z; break; case 0xf2: m_hr[4] |= F_Z; break;
case 0xf3: m_f &= ~F_Z; break; case 0xf3: m_hr[4] &= ~F_Z; break;
case 0xf4: m_f |= F_N; break; case 0xf4: m_hr[4] |= F_N; break;
case 0xf5: m_f &= ~F_N; break; case 0xf5: m_hr[4] &= ~F_N; break;
case 0xf6: m_f |= F_V; break; case 0xf6: m_hr[4] |= F_V; break;
case 0xf7: m_f &= ~F_V; break; case 0xf7: m_hr[4] &= ~F_V; break;
case 0xf8: m_f |= F_I; break; case 0xf8: m_hr[4] |= F_I; break;
case 0xf9: m_f &= ~F_I; m_ei_count = 2; break; case 0xf9: m_hr[4] &= ~F_I; m_ei_count = 2; break;
// fa-fb // fa-fb
case 0xfc: break; case 0xfc: break;
// fd // fd

View File

@ -46,7 +46,6 @@ protected:
u32 m_pc; u32 m_pc;
u32 m_r[8], m_hr[64]; u32 m_r[8], m_hr[64];
u32 m_ilr1; u32 m_ilr1;
u8 m_f;
u8 m_if1; u8 m_if1;
bool m_int_line, m_wait; bool m_int_line, m_wait;
@ -83,7 +82,7 @@ protected:
f |= F_C; f |= F_C;
if(((v1 ^ r) & (v2 ^ r)) & 0x80000000) if(((v1 ^ r) & (v2 ^ r)) & 0x80000000)
f |= F_V; f |= F_V;
m_f = (m_f & ~F_MASK) | f; m_hr[4] = (m_hr[4] & ~F_MASK) | f;
return r; return r;
} }
@ -98,7 +97,7 @@ protected:
f |= F_C; f |= F_C;
if(((v1 ^ v2) & (v2 ^ r)) & 0x80000000) if(((v1 ^ v2) & (v2 ^ r)) & 0x80000000)
f |= F_V; f |= F_V;
m_f = (m_f & ~F_MASK) | f; m_hr[4] = (m_hr[4] & ~F_MASK) | f;
return r; return r;
} }
@ -108,67 +107,67 @@ protected:
f |= F_Z; f |= F_Z;
if(r & 0x80000000) if(r & 0x80000000)
f |= F_N; f |= F_N;
m_f = (m_f & ~F_MASK) | f; m_hr[4] = (m_hr[4] & ~F_MASK) | f;
return r; return r;
} }
inline u32 do_lsl(u32 v1, u32 shift) { inline u32 do_lsl(u32 v1, u32 shift) {
if(!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; return v1;
} else if(shift < 32) { } else if(shift < 32) {
u32 r = v1 << shift; u32 r = v1 << shift;
u32 f = v1 ? v1 & 0x80000000 ? F_N : 0 : F_Z; u32 f = v1 ? v1 & 0x80000000 ? F_N : 0 : F_Z;
if(v1 & (1 << (32-shift))) if(v1 & (1 << (32-shift)))
f |= F_C; f |= F_C;
m_f = (m_f & ~F_MASK) | f; m_hr[4] = (m_hr[4] & ~F_MASK) | f;
return r; return r;
} else if(shift == 32) { } 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; return 0;
} else { } else {
m_f = (m_f & ~F_MASK) | F_Z; m_hr[4] = (m_hr[4] & ~F_MASK) | F_Z;
return 0; return 0;
} }
} }
inline u32 do_lsr(u32 v1, u32 shift) { inline u32 do_lsr(u32 v1, u32 shift) {
if(!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; return v1;
} else if(shift < 32) { } else if(shift < 32) {
u32 r = v1 >> shift; u32 r = v1 >> shift;
u32 f = v1 ? 0 : F_Z; u32 f = v1 ? 0 : F_Z;
if(v1 & (1 << (shift - 1))) if(v1 & (1 << (shift - 1)))
f |= F_C; f |= F_C;
m_f = (m_f & ~F_MASK) | f; m_hr[4] = (m_hr[4] & ~F_MASK) | f;
return r; return r;
} else if(shift == 32) { } 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; return 0;
} else { } else {
m_f = (m_f & ~F_MASK) | F_Z; m_hr[4] = (m_hr[4] & ~F_MASK) | F_Z;
return 0; return 0;
} }
} }
inline u32 do_asr(u32 v1, u32 shift) { inline u32 do_asr(u32 v1, u32 shift) {
if(!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; return v1;
} else if(shift < 32) { } else if(shift < 32) {
u32 r = static_cast<s32>(v1) >> shift; u32 r = static_cast<s32>(v1) >> shift;
u32 f = v1 ? v1 & 0x80000000 ? F_N : 0 : F_Z; u32 f = v1 ? v1 & 0x80000000 ? F_N : 0 : F_Z;
if(v1 & (1 << (shift - 1))) if(v1 & (1 << (shift - 1)))
f |= F_C; f |= F_C;
m_f = (m_f & ~F_MASK) | f; m_hr[4] = (m_hr[4] & ~F_MASK) | f;
return r; return r;
} else { } else {
if(v1 & 0x80000000) { if(v1 & 0x80000000) {
m_f = (m_f & ~F_MASK) | F_C; m_hr[4] = (m_hr[4] & ~F_MASK) | F_C;
return 0xffffffff; return 0xffffffff;
} else { } else {
m_f = (m_f & ~F_MASK) | F_Z; m_hr[4] = (m_hr[4] & ~F_MASK) | F_Z;
return 0; return 0;
} }
} }

View File

@ -46,7 +46,7 @@ private:
u16 m_dma_count; u16 m_dma_count;
emu_timer *m_dma_timer; 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; u16 m_gpu_adr, m_gpu_descsize_adr, m_gpu_descdata_adr;
u32 m_int_active; u32 m_int_active;
@ -80,10 +80,10 @@ private:
u8 debug_port_r(); u8 debug_port_r();
u8 debug_port_status_r(); u8 debug_port_status_r();
void port0_ddr_w(u16 data); void port0_ddr_w(offs_t, u32 data, u32 mem_mask);
u16 port0_ddr_r(); u32 port0_ddr_r();
void port0_w(u16 data); void port0_w(offs_t, u32 data, u32 mem_mask);
u16 port0_r(); u32 port0_r();
void crtc_w(offs_t reg, u16 data); 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) INTERRUPT_GEN_MEMBER(xavix2_state::vblank_irq)
{ {
logerror("clear\n");
memset(m_sd, 0, sizeof(m_sd)); memset(m_sd, 0, sizeof(m_sd));
irq_raise(IRQ_TIMER); irq_raise(IRQ_TIMER);
} }
@ -308,30 +307,30 @@ u8 xavix2_state::debug_port_status_r()
return 1<<1; 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; COMBINE_DATA(&m_port0_ddr);
logerror("port0 ddr %04x\n", data); logerror("port0 ddr %08x\n", data);
} }
u16 xavix2_state::port0_ddr_r() u32 xavix2_state::port0_ddr_r()
{ {
return m_port0_ddr; 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; COMBINE_DATA(&m_port0_data);
m_i2cmem->write_sda(data & 0x20); m_i2cmem->write_sda((m_port0_data & 0x00200000) && m_i2cmem->read_sda());
m_i2cmem->write_scl(data & 0x10); m_i2cmem->write_scl(!!(m_port0_data & 0x00100000));
logerror("port0_w %04x\n", data); 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 // Slightly hacky, should take ddr into account
u16 data = m_port0_data & (m_i2cmem->read_sda() ? ~0x00 : ~0x20); u32 data = m_i2cmem->read_sda() ? m_port0_data | 0x00200000 : m_port0_data & ~0x00200000;
logerror("port0_r %04x\n", data); logerror("port0_r %08x\n", data);
return 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(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(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(0xffffe204, 0xffffe207).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(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(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)); 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) 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 dx = 0x400 - 320;
constexpr int dy = 0x200 - 200; constexpr int dy = 0x200 - 200;