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_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

View File

@ -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;
}
}

View File

@ -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;