mirror of
https://github.com/holub/mame
synced 2025-07-04 17:38:08 +03:00
x2: some fixes (nw)
This commit is contained in:
parent
c906df602c
commit
047dfdd5d7
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user