summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2020-02-17 16:37:56 +0100
committer Olivier Galibert <galibert@pobox.com>2020-02-17 16:19:51 +0100
commitfd3259981241d63f38d3cbede3406e31b8e705b3 (patch)
treedfe0b2eabb12241028d529efd3ef73d1c350eacd
parent9e9325a23dd72c330b45b0f1c19c7178afa8830a (diff)
More opcodes and some fixes (nw)
-rw-r--r--src/devices/cpu/xavix2/xavix2.cpp21
-rw-r--r--src/devices/cpu/xavix2/xavix2d.cpp19
-rw-r--r--src/mame/drivers/xavix2.cpp24
3 files changed, 51 insertions, 13 deletions
diff --git a/src/devices/cpu/xavix2/xavix2.cpp b/src/devices/cpu/xavix2/xavix2.cpp
index 670195ac48e..3f238acaa1f 100644
--- a/src/devices/cpu/xavix2/xavix2.cpp
+++ b/src/devices/cpu/xavix2/xavix2.cpp
@@ -362,17 +362,17 @@ void xavix2_device::execute_run()
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_Z) || (m_f & F_C)) 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_C) 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 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_Z) && !(m_f & F_C)) 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_C)) 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 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;
@@ -382,10 +382,19 @@ void xavix2_device::execute_run()
case 0xe1: m_f = m_if1; npc = m_ilr1; break;
// e2
case 0xe3: /* rti2 */ break;
- // e4-fb
+ // 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;
-
+ // fa-fb
case 0xfc: break;
// fd
case 0xfe: m_wait = true; npc = check_interrupt(npc-1); if(m_wait) m_icount = 0; break;
diff --git a/src/devices/cpu/xavix2/xavix2d.cpp b/src/devices/cpu/xavix2/xavix2d.cpp
index f9c0d085a8a..ad8a5dd15cf 100644
--- a/src/devices/cpu/xavix2/xavix2d.cpp
+++ b/src/devices/cpu/xavix2/xavix2d.cpp
@@ -320,17 +320,17 @@ offs_t xavix2_disassembler::disassemble(std::ostream &stream, offs_t pc, const d
// cc-cf
case 0xd0: util::stream_format(stream, "bvs %s", rel8()); break;
- case 0xd1: util::stream_format(stream, "bleu %s", rel8()); break;
+ case 0xd1: util::stream_format(stream, "bltu %s", rel8()); break;
case 0xd2: util::stream_format(stream, "beq %s", rel8()); break;
- case 0xd3: util::stream_format(stream, "bltu %s", rel8()); break;
+ case 0xd3: util::stream_format(stream, "bleu %s", rel8()); break;
case 0xd4: util::stream_format(stream, "bmi %s", rel8()); break;
case 0xd5: util::stream_format(stream, "bra %s", rel8()); break;
case 0xd6: util::stream_format(stream, "blts %s", rel8()); break;
case 0xd7: util::stream_format(stream, "bles %s", rel8()); break;
case 0xd8: util::stream_format(stream, "bvc %s", rel8()); break;
- case 0xd9: util::stream_format(stream, "bgtu %s", rel8()); break;
+ case 0xd9: util::stream_format(stream, "bgeu %s", rel8()); break;
case 0xda: util::stream_format(stream, "bne %s", rel8()); break;
- case 0xdb: util::stream_format(stream, "bgeu %s", rel8()); break;
+ case 0xdb: util::stream_format(stream, "bgtu %s", rel8()); break;
case 0xdc: util::stream_format(stream, "bpl %s", rel8()); break;
case 0xdd: util::stream_format(stream, "bnv %s", rel8()); break;
case 0xde: util::stream_format(stream, "bges %s", rel8()); break;
@@ -340,7 +340,16 @@ offs_t xavix2_disassembler::disassemble(std::ostream &stream, offs_t pc, const d
case 0xe1: util::stream_format(stream, "rti1"); flags = STEP_OUT; break;
case 0xe2: util::stream_format(stream, "rti2"); flags = STEP_OUT; break;
case 0xe3: util::stream_format(stream, "rti3"); flags = STEP_OUT; break;
- // e4-fb
+ // e4-ef
+
+ case 0xf0: util::stream_format(stream, "clc"); break;
+ case 0xf1: util::stream_format(stream, "stc"); break;
+ case 0xf2: util::stream_format(stream, "clz"); break;
+ case 0xf3: util::stream_format(stream, "stz"); break;
+ case 0xf4: util::stream_format(stream, "cln"); break;
+ case 0xf5: util::stream_format(stream, "stn"); break;
+ case 0xf6: util::stream_format(stream, "clv"); break;
+ case 0xf7: util::stream_format(stream, "stv"); break;
case 0xf8: util::stream_format(stream, "di"); break;
case 0xf9: util::stream_format(stream, "ei"); break;
// fa-fb
diff --git a/src/mame/drivers/xavix2.cpp b/src/mame/drivers/xavix2.cpp
index cc859b478c0..d815abb12b9 100644
--- a/src/mame/drivers/xavix2.cpp
+++ b/src/mame/drivers/xavix2.cpp
@@ -45,7 +45,7 @@ private:
u16 m_dma_count;
emu_timer *m_dma_timer;
- u16 m_gpu_adr;
+ u16 m_gpu_adr, m_gpu_descsize_adr, m_gpu_descdata_adr;
u32 m_int_active;
std::string m_debug_string;
@@ -56,6 +56,8 @@ private:
void irq_clear_w(u16 data);
u8 irq_level_r();
+ void gpu_descsize_w(u16 data);
+ void gpu_descdata_w(u16 data);
void gpu_adr_w(u16 data);
void gpu_count_w(u16 data);
@@ -127,7 +129,7 @@ void xavix2_state::gpu_count_w(u16 data)
{
for(u32 i=0; i != data; i++) {
u64 command = m_maincpu->space(AS_PROGRAM).read_qword(m_gpu_adr + 8*i);
- logerror("gpu %02d: %016x x=%03x y=%03x ?=%02x ?=%x ?=%02x ?=%02x ?=%02x c=%04x %s\n",
+ logerror("gpu %02d: %016x x=%03x y=%03x ?=%02x ?=%x ?=%02x w=%02x h=%02x c=%04x %s\n",
i, command,
(command >> 0) & 0x7ff,
(command >> 11) & 0x3ff,
@@ -138,9 +140,25 @@ void xavix2_state::gpu_count_w(u16 data)
(command >> 42) & 0x3f,
(command >> 48) & 0xffff,
machine().describe_context());
+ u32 idx = (command >> 58) & 0x3f;
+ u32 descsize = m_maincpu->space(AS_PROGRAM).read_dword(m_gpu_descsize_adr + 4*idx);
+ u16 descdata = m_maincpu->space(AS_PROGRAM).read_word(m_gpu_descdata_adr + 2*idx);
+ logerror("gpu - data %06x size %08x w=%x ?=%x h=%x ?=%x bpp=%x ?=%x\n", (descdata << 14) | ((command >> 43) & 0x3fe0), descsize, 1+(descsize & 0x3f), (descsize >> 6) & 3, 1 + ((descsize >> 8) & 0x3f), (descsize >> 10) & 0x3ff, 1 + ((descsize >> 24) & 7), descsize >> 27);
}
}
+void xavix2_state::gpu_descsize_w(u16 data)
+{
+ m_gpu_descsize_adr = data;
+ logerror("gpu descsize_w %04x\n", data);
+}
+
+void xavix2_state::gpu_descdata_w(u16 data)
+{
+ m_gpu_descdata_adr = data;
+ logerror("gpu descdata_w %04x\n", data);
+}
+
void xavix2_state::dma_src_w(offs_t, u32 data, u32 mem_mask)
{
COMBINE_DATA(&m_dma_src);
@@ -272,6 +290,8 @@ void xavix2_state::mem(address_map &map)
map(0xffffe604, 0xffffe605).w(FUNC(xavix2_state::gpu_adr_w));
map(0xffffe606, 0xffffe607).w(FUNC(xavix2_state::gpu_count_w));
+ map(0xffffe608, 0xffffe609).w(FUNC(xavix2_state::gpu_descsize_w));
+ map(0xffffe622, 0xffffe623).w(FUNC(xavix2_state::gpu_descdata_w));
map(0xffffe60a, 0xffffe60a).lr8(NAME([]() { return 0x40; })); // pal/ntsc
map(0xffffe630, 0xffffe631).lr16(NAME([]() { return 0x210; }));