summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author David Haywood <28625134+DavidHaywood@users.noreply.github.com>2019-12-16 17:04:25 +0000
committer Ivan Vangelista <mesgnet@yahoo.it>2019-12-16 18:04:25 +0100
commit4b732835eef90a1f71b05561ed507d85bbeb8067 (patch)
treed26145c69d21ea1d1dc9e1d293f023ee8c5d6e5d
parent041368786de1bbc7ee77844aaf809f2005d73143 (diff)
Plug and Play work + New Working clone (#6060)
* sunplus extended work (nw) * prepare for extended stuff (nw) * (nw) * start adding some more unsp20 functionaliy + srcclean (nw) * new WORKING clone ----- 200 in 1 Retro Arcade [eanbowman] * (nw) * (nw) * minor rename (nw)
-rw-r--r--hash/tvgogo.xml1
-rw-r--r--src/devices/cpu/unsp/unsp.cpp33
-rw-r--r--src/devices/cpu/unsp/unsp.h17
-rw-r--r--src/devices/cpu/unsp/unsp_extended.cpp1005
-rw-r--r--src/devices/cpu/unsp/unsp_exxx.cpp4
-rw-r--r--src/devices/cpu/unsp/unsp_fxxx.cpp8
-rw-r--r--src/devices/cpu/unsp/unspdasm.cpp38
-rw-r--r--src/devices/cpu/unsp/unspdasm_extended.cpp791
-rw-r--r--src/devices/cpu/unsp/unspdasm_other.cpp4
-rw-r--r--src/mame/drivers/generalplus_gpl32612.cpp51
-rw-r--r--src/mame/drivers/nes_vt.cpp11
-rw-r--r--src/mame/drivers/sunplus_gcm394.cpp53
-rw-r--r--src/mame/drivers/vii.cpp18
-rw-r--r--src/mame/mame.lst1
14 files changed, 1929 insertions, 106 deletions
diff --git a/hash/tvgogo.xml b/hash/tvgogo.xml
index 6c4933027bc..00337431b86 100644
--- a/hash/tvgogo.xml
+++ b/hash/tvgogo.xml
@@ -13,6 +13,7 @@ ______|___________|______
|Skateboard |Skateboard-shaped motion controller
|Basketball |Ball-shaped motion controller
|Dodgeball |Motion controller
+ |Baseball |Baseball Bat shaped motion controller
-->
<softwarelist name="tvgogo" description="Toyquest TV Go Go cartridges">
diff --git a/src/devices/cpu/unsp/unsp.cpp b/src/devices/cpu/unsp/unsp.cpp
index 13dce335aae..87a95bd900f 100644
--- a/src/devices/cpu/unsp/unsp.cpp
+++ b/src/devices/cpu/unsp/unsp.cpp
@@ -120,6 +120,7 @@ char const* const unsp_device::bitops[] =
"tstb", "setb", "clrb", "invb"
};
+// log/barrel shift
char const* const unsp_device::lsft[] =
{
"asr", "asror", "lsl", "lslor", "lsr", "lsror", "rol", "ror"
@@ -264,6 +265,28 @@ void unsp_device::device_start()
set_icountptr(m_core->m_icount);
}
+void unsp_20_device::device_start()
+{
+ unsp_12_device::device_start();
+
+#if UNSP_LOG_OPCODES || UNSP_LOG_REGS
+ int baseindex = UNSP_LOG_OPS + 1;
+#else
+ int baseindex = UNSP_SB + 1;
+#endif
+
+ state_add(baseindex + UNSP20_R8, "R8", m_secondary_r[UNSP20_R8]).formatstr("%04X");
+ state_add(baseindex + UNSP20_R9, "R9", m_secondary_r[UNSP20_R9]).formatstr("%04X");
+ state_add(baseindex + UNSP20_R10, "R10", m_secondary_r[UNSP20_R10]).formatstr("%04X");
+ state_add(baseindex + UNSP20_R11, "R11", m_secondary_r[UNSP20_R11]).formatstr("%04X");
+ state_add(baseindex + UNSP20_R12, "R12", m_secondary_r[UNSP20_R12]).formatstr("%04X");
+ state_add(baseindex + UNSP20_R13, "R13", m_secondary_r[UNSP20_R13]).formatstr("%04X");
+ state_add(baseindex + UNSP20_R14, "R14", m_secondary_r[UNSP20_R14]).formatstr("%04X");
+ state_add(baseindex + UNSP20_R15, "R15", m_secondary_r[UNSP20_R15]).formatstr("%04X");
+
+ save_item(NAME(m_secondary_r));
+}
+
void unsp_device::device_reset()
{
memset(m_core->m_r, 0, sizeof(uint32_t) * 8);
@@ -275,6 +298,16 @@ void unsp_device::device_reset()
m_core->m_fiq = 0;
}
+void unsp_20_device::device_reset()
+{
+ unsp_12_device::device_reset();
+
+ for (int i = 0; i < 8; i++)
+ {
+ m_secondary_r[i] = 0;
+ }
+}
+
void unsp_device::device_stop()
{
if (m_drcfe != nullptr)
diff --git a/src/devices/cpu/unsp/unsp.h b/src/devices/cpu/unsp/unsp.h
index a7307545c8f..17db56d5437 100644
--- a/src/devices/cpu/unsp/unsp.h
+++ b/src/devices/cpu/unsp/unsp.h
@@ -346,6 +346,7 @@ protected:
virtual void execute_fxxx_101_group(uint16_t op) override;
virtual void execute_exxx_group(uint16_t op) override;
+
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
};
@@ -361,7 +362,23 @@ protected:
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
virtual void execute_extended_group(uint16_t op) override;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
private:
+ uint32_t m_secondary_r[8];
+
+ enum
+ {
+ UNSP20_R8 = 0,
+ UNSP20_R9,
+ UNSP20_R10,
+ UNSP20_R11,
+ UNSP20_R12,
+ UNSP20_R13,
+ UNSP20_R14,
+ UNSP20_R15
+ };
};
diff --git a/src/devices/cpu/unsp/unsp_extended.cpp b/src/devices/cpu/unsp/unsp_extended.cpp
index caa66763a00..f381344fc53 100644
--- a/src/devices/cpu/unsp/unsp_extended.cpp
+++ b/src/devices/cpu/unsp/unsp_extended.cpp
@@ -32,10 +32,114 @@ void unsp_20_device::execute_extended_group(uint16_t op)
uint8_t ra = (ximm & 0x0e00) >> 9;
ra |= (ximm & 0x0100) >> 5;
- logerror("(Ext) %s = %s %s %s\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
- , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
- , aluops[aluop]
- , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ switch (aluop)
+ {
+ case 0x00: // add
+ // A += B
+ logerror( "(Extended group 0) %s += %s\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x01: // adc
+ // A += B, Carry
+ logerror( "(Extended group 0) %s += %s, carry\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x02: // sub
+ // A -= B
+ logerror( "(Extended group 0) %s -= %s\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x03: // sbc
+ // A -= B, Carry
+ logerror( "(Extended group 0) %s -= %s, carry\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x04: // cmp
+ // CMP A,B
+ logerror( "(Extended group 0) cmp %s, %s\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x06: // neg
+ // A = -B
+ logerror( "(Extended group 0) %s = -%s\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x08: // xor
+ // A ^= B
+ logerror( "(Extended group 0) %s ^= %s\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x09: // load
+ // A = B
+ logerror( "(Extended group 0) %s = %s\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0a: // or
+ // A |= B
+ logerror( "(Extended group 0) %s |= %s\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0b: // and
+ // A &= B
+ logerror( "(Extended group 0) %s &= %s\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0c: // test
+ // TEST A,B
+ logerror( "(Extended group 0) test %s, %s\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0d: // store
+ // B = A
+ logerror( "(Extended group 0) %s = %s\n", (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x05: // invalid
+ case 0x07: // invalid
+ case 0x0e: // invalid
+ case 0x0f: // invalid
+ logerror( "(Extended group 0) <INVALID Ra = Ra op Rb form>\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+ }
+
unimplemented_opcode(op, ximm);
return;
@@ -90,7 +194,7 @@ void unsp_20_device::execute_extended_group(uint16_t op)
}
case 0x04: case 0x14:
{
- uint16_t ximm_2 = read16(UNSP_LPC);
+ uint16_t imm16_2 = read16(UNSP_LPC);
add_lpc(1);
// Ra=Rb op IMM16
@@ -99,19 +203,123 @@ void unsp_20_device::execute_extended_group(uint16_t op)
uint8_t ra = (ximm & 0x0e00) >> 9;
ra |= (ximm & 0x0100) >> 5;
- logerror("(Ext) %s = %s %s %04x\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+
+ switch (aluop)
+ {
+ case 0x00: // add
+ // A = B + C
+ logerror( "(Extended group 1) %s = %s + %04x\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
- , aluops[aluop]
- , ximm_2);
+ , imm16_2);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x01: // adc
+ // A = B + C, Carry
+ logerror( "(Extended group 1) %s = %s + %04x, carry\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
- unimplemented_opcode(op, ximm, ximm_2);
+ case 0x02: // sub
+ // A = B - C
+ logerror( "(Extended group 1) %s = %s - %04x\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x03: // sbc
+ // A = B - C, Carry
+ logerror( "(Extended group 1) %s = %s - %04x, carry\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x04: // cmp
+ // CMP B,C
+ logerror( "(Extended group 1) cmp %s, %04x\n", (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x06: // neg
+ // A = -C
+ logerror( "(Extended group 1) %s = -%04x\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , imm16_2);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x08: // xor
+ // A = B ^ C
+ logerror( "(Extended group 1) %s = %s ^ %04x\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x09: // load
+ // A = C
+ logerror( "(Extended group 1) %s = %04x\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , imm16_2);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x0a: // or
+ // A = B | C
+ logerror( "(Extended group 1) %s = %s | %04x\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x0b: // and
+ // A = B & C
+ logerror( "(Extended group 1) %s = %s & %04x\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x0c: // test
+ // TEST B,C
+ logerror( "(Extended group 1) test %s, %04x\n", (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x0d: // store, C = B, invalid for this mode (would store to immediate)
+ case 0x05: // invalid
+ case 0x07: // invalid
+ case 0x0e: // invalid
+ case 0x0f: // invalid
+ logerror( "(Extended group 1) <INVALID Ra=Rb op IMM16 form>\n");
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+ }
+
+ unimplemented_opcode(op, ximm, imm16_2);
return;
}
case 0x06:
case 0x16:
{
- uint16_t ximm_2 = read16(UNSP_LPC);
+ uint16_t imm16_2 = read16(UNSP_LPC);
add_lpc(1);
// Ra=Rb op [A16]
@@ -120,19 +328,129 @@ void unsp_20_device::execute_extended_group(uint16_t op)
uint8_t ra = (ximm & 0x0e00) >> 9;
ra |= (ximm & 0x0100) >> 5;
- logerror("(Ext) %s = %s %s [%04x]\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ switch (aluop)
+ {
+ case 0x00: // add
+ // A = B + C
+ logerror( "(Extended group 2) %s = %s + [%04x]\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x01: // adc
+ // A = B + C, Carry
+ logerror( "(Extended group 2) %s = %s + [%04x], carry\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x02: // sub
+ // A = B - C
+ logerror( "(Extended group 2) %s = %s - [%04x]\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x03: // sbc
+ // A = B - C, Carry
+ logerror( "(Extended group 2) %s = %s - [%04x], carry\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x04: // cmp
+ // CMP B,C
+ logerror( "(Extended group 2) cmp %s, [%04x]\n", (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x06: // neg
+ // A = -C
+ logerror( "(Extended group 2) %s = -[%04x]\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , imm16_2);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x08: // xor
+ // A = B ^ C
+ logerror( "(Extended group 2) %s = %s ^ [%04x]\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
- , aluops[aluop]
- , ximm_2);
+ , imm16_2);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x09: // load
+ // A = C
+ logerror( "(Extended group 2) %s = [%04x]\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , imm16_2);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x0a: // or
+ // A = B | C
+ logerror( "(Extended group 2) %s = %s | [%04x]\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x0b: // and
+ // A = B & C
+ logerror( "(Extended group 2) %s = %s & [%04x]\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
- unimplemented_opcode(op, ximm, ximm_2);
+ case 0x0c: // test
+ // TEST B,C
+ logerror( "(Extended group 2) test %s, [%04x]\n", (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x0d: // store
+ // C = B
+ logerror( "(Extended group 2) [%04x] = %s\n", imm16_2
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x05: // invalid
+ case 0x07: // invalid
+ case 0x0e: // invalid
+ case 0x0f: // invalid
+ logerror( "(Extended group 2) <INVALID Ra = Rb op [A16] form>\n");
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+ }
+
+ unimplemented_opcode(op, ximm, imm16_2);
return;
}
case 0x07:
case 0x17:
{
- uint16_t ximm_2 = read16(UNSP_LPC);
+ uint16_t imm16_2 = read16(UNSP_LPC);
add_lpc(1);
//[A16] = Ra op Rb
@@ -141,12 +459,122 @@ void unsp_20_device::execute_extended_group(uint16_t op)
uint8_t ra = (ximm & 0x0e00) >> 9;
ra |= (ximm & 0x0100) >> 5;
- logerror("(Ext) [0x4x] = %s %s %s\n", ximm_2
- , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
- , aluops[aluop]
- , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ switch (aluop)
+ {
+ case 0x00: // add
+ // A = B + C
+ logerror( "(Extended group 3) [%04x] = %s + %s\n", imm16_2
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x01: // adc
+ // A = B + C, Carry
+ logerror( "(Extended group 3) [%04x] = %s + %s, carry\n", imm16_2
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x02: // sub
+ // A = B - C
+ logerror( "(Extended group 3) [%04x] = %s - %s\n", imm16_2
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
- unimplemented_opcode(op, ximm, ximm_2);
+ case 0x03: // sbc
+ // A = B - C, Carry
+ logerror( "(Extended group 3) [%04x] = %s - %s, carry\n", imm16_2
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x04: // cmp (is this even a valid form? [A16] not even used)
+ // CMP B,C
+ logerror( "(Extended group 3) cmp %s, %s\n", (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x06: // neg
+ // A = -C
+ logerror( "(Extended group 3) [%04x] = -%s\n", imm16_2
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x08: // xor
+ // A = B ^ C
+ logerror( "(Extended group 3) [%04x] = %s ^ %s\n", imm16_2
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x09: // load
+ // A = C
+ logerror( "(Extended group 3) [%04x] = %s\n", imm16_2
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x0a: // or
+ // A = B | C
+ logerror( "(Extended group 3) [%04x] = %s | %s\n", imm16_2
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x0b: // and
+ // A = B & C
+ logerror( "(Extended group 3) [%04x] = %s & %s\n", imm16_2
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x0c: // test (is this even a valid form? [A16] not even used)
+ // TEST B,C
+ logerror( "(Extended group 3) test %s, %s\n", (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x0d: // store (is this even a valid form? [A16] not even used)
+ // C = B
+ logerror( "(Extended group 3) [%04x] = %s\n", imm16_2
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+
+ case 0x05: // invalid
+ case 0x07: // invalid
+ case 0x0e: // invalid
+ case 0x0f: // invalid
+ logerror( "(Extended group 3) <INVALID [A16] = Ra op Rb form>\n");
+ unimplemented_opcode(op, ximm, imm16_2);
+ return;
+ break;
+ }
+
+ unimplemented_opcode(op, ximm, imm16_2);
return;
}
@@ -158,9 +586,128 @@ void unsp_20_device::execute_extended_group(uint16_t op)
uint8_t form = (ximm & 0x0018) >> 3;
uint8_t rx = (ximm & 0x0e00) >> 9;
- logerror("(Ext) %s=%s %s", extregs[rx], extregs[rx], aluops[aluop]);
- logerror(forms[form], extregs[ry]);
- logerror("\n");
+ switch (aluop)
+ {
+ case 0x00: // add
+ // A += B
+ logerror( "(Extended group 4) %s += ", extregs[rx]);
+ logerror( forms[form], extregs[ry]);
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x01: // adc
+ // A += B, Carry
+ logerror( "(Extended group 4) %s += ", extregs[rx]);
+ logerror( forms[form], extregs[ry]);
+ logerror( ", carry");
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x02: // sub
+ // A -= B
+ logerror( "(Extended group 4) %s -= ", extregs[rx]);
+ logerror( forms[form], extregs[ry]);
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x03: // sbc
+ // A -= B, Carry
+ logerror( "(Extended group 4) %s -= ", extregs[rx]);
+ logerror( forms[form], extregs[ry]);
+ logerror( ", carry");
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x04: // cmp
+ // CMP A,B
+ logerror( "(Extended group 4) cmp %s, ", extregs[rx]);
+ logerror( forms[form], extregs[ry]);
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x06: // neg
+ // A = -B
+ logerror( "(Extended group 4) %s = -", extregs[rx]);
+ logerror( forms[form], extregs[ry]);
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x08: // xor
+ // A ^= B
+ logerror( "(Extended group 4) %s ^= ", extregs[rx]);
+ logerror( forms[form], extregs[ry]);
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x09: // load
+ // A = B
+ logerror( "(Extended group 4) %s = ", extregs[rx]);
+ logerror( forms[form], extregs[ry]);
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0a: // or
+ // A |= B
+ logerror( "(Extended group 4) %s |= ", extregs[rx]);
+ logerror( forms[form], extregs[ry]);
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0b: // and
+ // A &= B
+ logerror( "(Extended group 4) %s &= ", extregs[rx]);
+ logerror( forms[form], extregs[ry]);
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0c: // test
+ // TEST A,B
+ logerror( "(Extended group 4) test %s, ", extregs[rx]);
+ logerror( forms[form], extregs[ry]);
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0d: // store
+ // B = A
+ logerror( "(Extended group 4) ");
+ logerror( forms[form], extregs[ry]);
+ logerror( " = %s", extregs[rx]);
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x05: // invalid
+ case 0x07: // invalid
+ case 0x0e: // invalid
+ case 0x0f: // invalid
+ logerror( "(Extended group 4) <INVALID Indirect Rx=Rx op [Ry@] form>\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+ }
+
unimplemented_opcode(op, ximm);
return;
}
@@ -172,9 +719,129 @@ void unsp_20_device::execute_extended_group(uint16_t op)
uint8_t form = (ximm & 0x0018) >> 3;
uint8_t rx = (ximm & 0x0e00) >> 9;
- logerror("(Ext) %s=%s %s ds:", extregs[rx], extregs[rx], aluops[aluop]);
- logerror(forms[form], extregs[ry]);
- logerror("\n");
+ switch (aluop)
+ {
+ case 0x00: // add
+ // A += B
+ logerror( "(Extended group 5) %s += ds:", extregs[rx]);
+ logerror( forms[form], extregs[ry]);
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x01: // adc
+ // A += B, Carry
+ logerror( "(Extended group 5) %s += ds:", extregs[rx]);
+ logerror( forms[form], extregs[ry]);
+ logerror( ", carry");
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x02: // sub
+ // A -= B
+ logerror( "(Extended group 5) %s -= ds:", extregs[rx]);
+ logerror( forms[form], extregs[ry]);
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x03: // sbc
+ // A -= B, Carry
+ logerror( "(Extended group 5) %s -= ds:", extregs[rx]);
+ logerror( forms[form], extregs[ry]);
+ logerror( ", carry");
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x04: // cmp
+ // CMP A,B
+ logerror( "(Extended group 5) cmp %s, ds:", extregs[rx]);
+ logerror( forms[form], extregs[ry]);
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x06: // neg
+ // A = -B
+ logerror( "(Extended group 5) %s = -ds:", extregs[rx]);
+ logerror( forms[form], extregs[ry]);
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x08: // xor
+ // A ^= B
+ logerror( "(Extended group 5) %s ^= ds:", extregs[rx]);
+ logerror( forms[form], extregs[ry]);
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x09: // load
+ // A = B
+ logerror( "(Extended group 5) %s = ds:", extregs[rx]);
+ logerror( forms[form], extregs[ry]);
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0a: // or
+ // A |= B
+ logerror( "(Extended group 5) %s |= ds:", extregs[rx]);
+ logerror( forms[form], extregs[ry]);
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0b: // and
+ // A &= B
+ logerror( "(Extended group 5) %s &= ds:", extregs[rx]);
+ logerror( forms[form], extregs[ry]);
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0c: // test
+ // TEST A,B
+ logerror( "(Extended group 5) test %s, ds:", extregs[rx]);
+ logerror( forms[form], extregs[ry]);
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0d: // store
+ // B = A
+ logerror( "(Extended group 5) ds:");
+ logerror( forms[form], extregs[ry]);
+ logerror( " = %s", extregs[rx]);
+ logerror("\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x05: // invalid
+ case 0x07: // invalid
+ case 0x0e: // invalid
+ case 0x0f: // invalid
+ logerror( "(Extended group 5) <INVALID DS_Indirect Rx=Rx op ds:[Ry@] form>\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+ }
+
unimplemented_opcode(op, ximm);
return;
}
@@ -185,7 +852,96 @@ void unsp_20_device::execute_extended_group(uint16_t op)
uint8_t rx = (ximm & 0x0e00) >> 9;
uint8_t imm6 = (ximm & 0x003f) >> 0;
- logerror("(Ext) %s=%s %s %02x\n", extregs[rx], extregs[rx], aluops[aluop], imm6 );
+ switch (aluop)
+ {
+ case 0x00: // add
+ // A += B
+ logerror( "(Extended group 6) %s += %02x\n", extregs[rx], imm6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x01: // adc
+ // A += B, Carry
+ logerror( "(Extended group 6) %s += %02x, carry\n", extregs[rx], imm6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x02: // sub
+ // A -= B
+ logerror( "(Extended group 6) %s -= %02x\n", extregs[rx], imm6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x03: // sbc
+ // A -= B, Carry
+ logerror( "(Extended group 6) %s -= %02x, carry\n", extregs[rx], imm6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x04: // cmp
+ // CMP A,B
+ logerror( "(Extended group 6) cmp %s, %02x\n", extregs[rx], imm6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x06: // neg
+ // A = -B
+ logerror( "(Extended group 6) %s = -%02x\n", extregs[rx], imm6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x08: // xor
+ // A ^= B
+ logerror( "(Extended group 6) %s ^= %02x\n", extregs[rx], imm6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x09: // load
+ // A = B
+ logerror( "(Extended group 6) %s = %02x\n", extregs[rx], imm6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0a: // or
+ // A |= B
+ logerror( "(Extended group 6) %s |= %02x\n", extregs[rx], imm6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0b: // and
+ // A &= B
+ logerror( "(Extended group 6) %s &= %02x\n", extregs[rx], imm6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0c: // test
+ // TEST A,B
+ logerror( "(Extended group 6) test %s, %02x\n", extregs[rx], imm6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0d: // store, B = A (invalid for this type)
+ case 0x05: // invalid
+ case 0x07: // invalid
+ case 0x0e: // invalid
+ case 0x0f: // invalid
+ logerror( "(Extended group 6) <INVALID IM6 Rx=Rx op IM6 form>\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+ }
+
unimplemented_opcode(op, ximm);
return;
}
@@ -197,7 +953,102 @@ void unsp_20_device::execute_extended_group(uint16_t op)
uint8_t rx = (ximm & 0x0e00) >> 9;
uint8_t imm6 = (ximm & 0x003f) >> 0;
- logerror("(Ext) %s=%s %s [BP+%02x]\n", extregs[rx], extregs[rx], aluops[aluop], imm6 );
+ switch (aluop)
+ {
+ case 0x00: // add
+ // A += B
+ logerror( "(Extended group 7) %s += [BP+%02x]\n", extregs[rx], imm6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x01: // adc
+ // A += B, Carry
+ logerror( "(Extended group 7) %s += [BP+%02x], carry\n", extregs[rx], imm6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x02: // sub
+ // A -= B
+ logerror( "(Extended group 7) %s -= [BP+%02x]\n", extregs[rx], imm6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x03: // sbc
+ // A -= B, Carry
+ logerror( "(Extended group 7) %s -= [BP+%02x], carry\n", extregs[rx], imm6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x04: // cmp
+ // CMP A,B
+ logerror( "(Extended group 7) cmp %s, [BP+%02x]\n", extregs[rx], imm6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x06: // neg
+ // A = -B
+ logerror( "(Extended group 7) %s = -[BP+%02x]\n", extregs[rx], imm6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x08: // xor
+ // A ^= B
+ logerror( "(Extended group 7) %s ^= [BP+%02x]\n", extregs[rx], imm6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x09: // load
+ // A = B
+ logerror( "(Extended group 7) %s = [BP+%02x]\n", extregs[rx], imm6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0a: // or
+ // A |= B
+ logerror( "(Extended group 7) %s |= [BP+%02x]\n", extregs[rx], imm6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0b: // and
+ // A &= B
+ logerror( "(Extended group 7) %s &= [BP+%02x]\n", extregs[rx], imm6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0c: // test
+ // TEST A,B
+ logerror( "(Extended group 7) test %s, [BP+%02x]\n", extregs[rx], imm6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0d: // store
+ // B = A
+ logerror( "(Extended group 7) [BP+%02x] = %s\n", imm6, extregs[rx] );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x05: // invalid
+ case 0x07: // invalid
+ case 0x0e: // invalid
+ case 0x0f: // invalid
+ logerror( "(Extended group 7) <INVALID Base+Disp6 Rx=Rx op [BP+IM6] form>\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+ }
+
unimplemented_opcode(op, ximm);
return;
}
@@ -209,7 +1060,103 @@ void unsp_20_device::execute_extended_group(uint16_t op)
uint8_t rx = (ximm & 0x0e00) >> 9;
uint8_t a6 = (ximm & 0x003f) >> 0;
- logerror("(Ext) %s=%s %s [%02x]\n", extregs[rx], extregs[rx], aluops[aluop], a6 );
+ switch (aluop)
+ {
+ case 0x00: // add
+ // A += B
+ logerror( "(Extended group 8) %s += [%02x]\n", extregs[rx], a6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x01: // adc
+ // A += B, Carry
+ logerror( "(Extended group 8) %s += [%02x], carry\n", extregs[rx], a6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x02: // sub
+ // A -= B
+ logerror( "(Extended group 8) %s -= [%02x]\n", extregs[rx], a6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x03: // sbc
+ // A -= B, Carry
+ logerror( "(Extended group 8) %s -= [%02x], carry\n", extregs[rx], a6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x04: // cmp
+ // CMP A,B
+ logerror( "(Extended group 8) cmp %s, [%02x]\n", extregs[rx], a6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x06: // neg
+ // A = -B
+ logerror( "(Extended group 8) %s = -[%02x]\n", extregs[rx], a6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x08: // xor
+ // A ^= B
+ logerror( "(Extended group 8) %s ^= [%02x]\n", extregs[rx], a6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x09: // load
+ // A = B
+ logerror( "(Extended group 8) %s = [%02x]\n", extregs[rx], a6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0a: // or
+ // A |= B
+ logerror( "(Extended group 8) %s |= [%02x]\n", extregs[rx], a6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0b: // and
+ // A &= B
+ logerror( "(Extended group 8) %s &= [%02x]\n", extregs[rx], a6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0c: // test
+ // TEST A,B
+ logerror( "(Extended group 8) test %s, [%02x]\n", extregs[rx], a6 );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x0d: // store
+ // B = A
+ logerror( "(Extended group 8) [%02x] = %s\n", a6, extregs[rx] );
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+
+ case 0x05: // invalid
+ case 0x07: // invalid
+ case 0x0e: // invalid
+ case 0x0f: // invalid
+ logerror( "(Extended group 8) <INVALID A6 Rx=Rx op [A6] form>\n");
+ unimplemented_opcode(op, ximm);
+ return;
+ break;
+ }
+
+
unimplemented_opcode(op, ximm);
return;
}
diff --git a/src/devices/cpu/unsp/unsp_exxx.cpp b/src/devices/cpu/unsp/unsp_exxx.cpp
index e7864d1c910..5e8f108ed52 100644
--- a/src/devices/cpu/unsp/unsp_exxx.cpp
+++ b/src/devices/cpu/unsp/unsp_exxx.cpp
@@ -120,7 +120,7 @@ void unsp_12_device::execute_exxx_group(uint16_t op)
const uint16_t opb = op & 7;
m_core->m_icount -= 12;
- logerror("%s: MUL su with %04x (signed) * %04x (unsigned) : ", machine().describe_context(), m_core->m_r[opa], m_core->m_r[opb]);
+ logerror("%s: MUL su with %04x (signed) * %04x (unsigned) : ", machine().describe_context(), m_core->m_r[opa], m_core->m_r[opb]);
uint32_t lres = m_core->m_r[opa] * m_core->m_r[opb];
if (m_core->m_r[opa] & 0x8000)
@@ -130,7 +130,7 @@ void unsp_12_device::execute_exxx_group(uint16_t op)
m_core->m_r[REG_R4] = lres >> 16;
m_core->m_r[REG_R3] = (uint16_t)lres;
- logerror("result was : %08x\n", lres);
+ logerror("result was : %08x\n", lres);
return;
}
diff --git a/src/devices/cpu/unsp/unsp_fxxx.cpp b/src/devices/cpu/unsp/unsp_fxxx.cpp
index 766e18fc25a..c563ac1d88c 100644
--- a/src/devices/cpu/unsp/unsp_fxxx.cpp
+++ b/src/devices/cpu/unsp/unsp_fxxx.cpp
@@ -247,13 +247,13 @@ void unsp_12_device::execute_fxxx_101_group(uint16_t op)
case 0xf144: case 0xf344: case 0xf544: case 0xf744: case 0xf944: case 0xfb44: case 0xfd44: case 0xff44:
logerror("unimplemented: fir_mov on\n");
- m_core->m_icount -= 1;
+ m_core->m_icount -= 1;
//unimplemented_opcode(op); // generalplus_gpac800 games do this on startup
return;
case 0xf145: case 0xf345: case 0xf545: case 0xf745: case 0xf945: case 0xfb45: case 0xfd45: case 0xff45:
- logerror("unimplemented: fir_mov off\n");
- m_core->m_icount -= 1;
+ logerror("unimplemented: fir_mov off\n");
+ m_core->m_icount -= 1;
//unimplemented_opcode(op); // generalplus_gpac800 games do this on startup
return;
@@ -303,7 +303,7 @@ void unsp_12_device::execute_fxxx_101_group(uint16_t op)
{
m_core->m_r[REG_R2] = count_leading_zeros(r4) - 17; // -17 because count_leading_zeros works with 32-bit values
}
-
+
return;
}
diff --git a/src/devices/cpu/unsp/unspdasm.cpp b/src/devices/cpu/unsp/unspdasm.cpp
index 3b52b519af3..845a6982305 100644
--- a/src/devices/cpu/unsp/unspdasm.cpp
+++ b/src/devices/cpu/unsp/unspdasm.cpp
@@ -59,10 +59,22 @@ void unsp_disassembler::print_alu_op_start(std::ostream &stream, uint8_t op0, ui
{
static const char* const alu_op_start[] =
{
- "%s += ", "%s += ", "%s -= ", "%s -= ",
- "cmp %s, ", "<BAD>", "%s =- ", "<BAD>",
- "%s ^= ", "%s = ", "%s |= ", "%s &= ",
+ "%s += ",
+ "%s += ", // with carry
+ "%s -= ",
+ "%s -= ", // with carry
+ "cmp %s, ",
+ "<BAD>",
+ "%s =- ", // neg
+ "<BAD>",
+ "%s ^= ",
+ "%s = ", // load
+ "%s |= ",
+ "%s &= ",
"test %s, "
+ "store", // syntax changes
+ "<BAD>", // bad
+ "<BAD>", // bad
};
util::stream_format(stream, alu_op_start[op0], regs[opA]);
@@ -72,10 +84,22 @@ void unsp_disassembler::print_alu_op3(std::ostream &stream, uint8_t op0, uint8_t
{
static const char* const alu_op3[] =
{
- "%s + ", "%s + ", "%s - ", "%s - ",
- "cmp %s, ", "<BAD>", "-", "<BAD>",
- "%s ^ ", "", "%s | ", "%s & ",
- "test %s, "
+ "%s + ",
+ "%s + ", // with carry
+ "%s - ",
+ "%s - ", // with carry
+ "cmp %s, ",
+ "<BAD>",
+ "-", // neg
+ "<BAD>",
+ "%s ^ ",
+ "", // load
+ "%s | ",
+ "%s & ",
+ "test %s, ",
+ "store", // syntax changes
+ "<BAD>",
+ "<BAD>",
};
util::stream_format(stream, alu_op3[op0], regs[opB]);
diff --git a/src/devices/cpu/unsp/unspdasm_extended.cpp b/src/devices/cpu/unsp/unspdasm_extended.cpp
index 85c252e06bf..8ba7e8b801b 100644
--- a/src/devices/cpu/unsp/unspdasm_extended.cpp
+++ b/src/devices/cpu/unsp/unspdasm_extended.cpp
@@ -29,16 +29,96 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
{
case 0x00: case 0x10:
{
+ // 2 param form
+
// Ext Register Ra = Ra op Rb
uint8_t aluop = (ximm & 0xf000) >> 12;
uint8_t rb = (ximm & 0x000f) >> 0;
uint8_t ra = (ximm & 0x0e00) >> 9;
ra |= (ximm & 0x0100) >> 5;
- util::stream_format(stream, "(Ext) %s = %s %s %s", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
- , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
- , aluops[aluop]
- , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ switch (aluop)
+ {
+ case 0x00: // add
+ // A += B
+ util::stream_format(stream, "(Extended group 0) %s += %s", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ break;
+
+ case 0x01: // adc
+ // A += B, Carry
+ util::stream_format(stream, "(Extended group 0) %s += %s, carry", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ break;
+
+ case 0x02: // sub
+ // A -= B
+ util::stream_format(stream, "(Extended group 0) %s -= %s", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ break;
+
+ case 0x03: // sbc
+ // A -= B, Carry
+ util::stream_format(stream, "(Extended group 0) %s -= %s, carry", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ break;
+
+ case 0x04: // cmp
+ // CMP A,B
+ util::stream_format(stream, "(Extended group 0) cmp %s, %s", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ break;
+
+ case 0x06: // neg
+ // A = -B
+ util::stream_format(stream, "(Extended group 0) %s = -%s", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ break;
+
+ case 0x08: // xor
+ // A ^= B
+ util::stream_format(stream, "(Extended group 0) %s ^= %s", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ break;
+
+ case 0x09: // load
+ // A = B
+ util::stream_format(stream, "(Extended group 0) %s = %s", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ break;
+
+ case 0x0a: // or
+ // A |= B
+ util::stream_format(stream, "(Extended group 0) %s |= %s", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ break;
+
+ case 0x0b: // and
+ // A &= B
+ util::stream_format(stream, "(Extended group 0) %s &= %s", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ break;
+
+ case 0x0c: // test
+ // TEST A,B
+ util::stream_format(stream, "(Extended group 0) test %s, %s", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ break;
+
+ case 0x0d: // store
+ // B = A
+ util::stream_format(stream, "(Extended group 0) %s = %s", (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ break;
+
+ case 0x05: // invalid
+ case 0x07: // invalid
+ case 0x0e: // invalid
+ case 0x0f: // invalid
+ util::stream_format(stream, "(Extended group 0) <INVALID Ra = Ra op Rb form>");
+ break;
+ }
+
return UNSP_DASM_OK;
}
case 0x02:
@@ -56,10 +136,10 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
size -= 1;
if ((rx-size) >= 0)
- util::stream_format(stream, "(Ext) push %s, %s to [%s]",
+ util::stream_format(stream, "(Extended group ) push %s, %s to [%s]",
extregs[rx-size], extregs[rx], (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
else
- util::stream_format(stream, "(Ext) push <BAD>");
+ util::stream_format(stream, "(Extended group ) push <BAD>");
}
else
{
@@ -71,16 +151,23 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
size -= 1;
if ((rx-size) >= 0)
- util::stream_format(stream, "(Ext) pop %s, %s from [%s]",
+ util::stream_format(stream, "(Extended group ) pop %s, %s from [%s]",
extregs[rx-size], extregs[rx], (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
else
- util::stream_format(stream, "(Ext) pop <BAD>");
+ util::stream_format(stream, "(Extended group ) pop <BAD>");
}
return UNSP_DASM_OK;
}
case 0x04: case 0x14:
{
+ // 3 param form
+
// Ra=Rb op IMM16
+
+ // A = Ra
+ // B = Rb
+ // C = IMM16
+
len = 3;
uint16_t imm16_2 = opcodes.r16(pc + 2);
uint8_t aluop = (ximm & 0xf000) >> 12;
@@ -88,17 +175,104 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
uint8_t ra = (ximm & 0x0e00) >> 9;
ra |= (ximm & 0x0100) >> 5;
- util::stream_format(stream, "(Ext) %s = %s %s %04x", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
- , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
- , aluops[aluop]
- , imm16_2);
+ switch (aluop)
+ {
+ case 0x00: // add
+ // A = B + C
+ util::stream_format(stream, "(Extended group 1) %s = %s + %04x", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ break;
+
+ case 0x01: // adc
+ // A = B + C, Carry
+ util::stream_format(stream, "(Extended group 1) %s = %s + %04x, carry", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ break;
+
+ case 0x02: // sub
+ // A = B - C
+ util::stream_format(stream, "(Extended group 1) %s = %s - %04x", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ break;
+
+ case 0x03: // sbc
+ // A = B - C, Carry
+ util::stream_format(stream, "(Extended group 1) %s = %s - %04x, carry", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ break;
+
+ case 0x04: // cmp
+ // CMP B,C
+ util::stream_format(stream, "(Extended group 1) cmp %s, %04x", (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ break;
+
+ case 0x06: // neg
+ // A = -C
+ util::stream_format(stream, "(Extended group 1) %s = -%04x", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , imm16_2);
+ break;
+
+ case 0x08: // xor
+ // A = B ^ C
+ util::stream_format(stream, "(Extended group 1) %s = %s ^ %04x", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ break;
+
+ case 0x09: // load
+ // A = C
+ util::stream_format(stream, "(Extended group 1) %s = %04x", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , imm16_2);
+ break;
+
+ case 0x0a: // or
+ // A = B | C
+ util::stream_format(stream, "(Extended group 1) %s = %s | %04x", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ break;
+
+ case 0x0b: // and
+ // A = B & C
+ util::stream_format(stream, "(Extended group 1) %s = %s & %04x", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ break;
+
+ case 0x0c: // test
+ // TEST B,C
+ util::stream_format(stream, "(Extended group 1) test %s, %04x", (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ break;
+
+ case 0x0d: // store, C = B, invalid for this mode (would store to immediate)
+ case 0x05: // invalid
+ case 0x07: // invalid
+ case 0x0e: // invalid
+ case 0x0f: // invalid
+ util::stream_format(stream, "(Extended group 1) <INVALID Ra=Rb op IMM16 form>");
+ break;
+ }
+
return UNSP_DASM_OK;
}
case 0x06:
case 0x16:
{
- // Ra=Rb op [A16]
+ // 3 param form
+
+ // Ra = Rb op [A16]
+
+ // A = Ra
+ // B = Rb
+ // C = [A16]
+
len = 3;
uint16_t imm16_2 = opcodes.r16(pc + 2);
uint8_t aluop = (ximm & 0xf000) >> 12;
@@ -106,17 +280,111 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
uint8_t ra = (ximm & 0x0e00) >> 9;
ra |= (ximm & 0x0100) >> 5;
- util::stream_format(stream, "(Ext) %s = %s %s [%04x]", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
- , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
- , aluops[aluop]
- , imm16_2);
+
+ switch (aluop)
+ {
+ case 0x00: // add
+ // A = B + C
+ util::stream_format(stream, "(Extended group 2) %s = %s + [%04x]", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ break;
+
+ case 0x01: // adc
+ // A = B + C, Carry
+ util::stream_format(stream, "(Extended group 2) %s = %s + [%04x], carry", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ break;
+
+ case 0x02: // sub
+ // A = B - C
+ util::stream_format(stream, "(Extended group 2) %s = %s - [%04x]", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ break;
+
+ case 0x03: // sbc
+ // A = B - C, Carry
+ util::stream_format(stream, "(Extended group 2) %s = %s - [%04x], carry", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ break;
+
+ case 0x04: // cmp
+ // CMP B,C
+ util::stream_format(stream, "(Extended group 2) cmp %s, [%04x]", (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ break;
+
+ case 0x06: // neg
+ // A = -C
+ util::stream_format(stream, "(Extended group 2) %s = -[%04x]", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , imm16_2);
+ break;
+
+ case 0x08: // xor
+ // A = B ^ C
+ util::stream_format(stream, "(Extended group 2) %s = %s ^ [%04x]", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ break;
+
+ case 0x09: // load
+ // A = C
+ util::stream_format(stream, "(Extended group 2) %s = [%04x]", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , imm16_2);
+ break;
+
+ case 0x0a: // or
+ // A = B | C
+ util::stream_format(stream, "(Extended group 2) %s = %s | [%04x]", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ break;
+
+ case 0x0b: // and
+ // A = B & C
+ util::stream_format(stream, "(Extended group 2) %s = %s & [%04x]", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ break;
+
+ case 0x0c: // test
+ // TEST B,C
+ util::stream_format(stream, "(Extended group 2) test %s, [%04x]", (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , imm16_2);
+ break;
+
+ case 0x0d: // store
+ // C = B
+ util::stream_format(stream, "(Extended group 2) [%04x] = %s", imm16_2
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ break;
+
+ case 0x05: // invalid
+ case 0x07: // invalid
+ case 0x0e: // invalid
+ case 0x0f: // invalid
+ util::stream_format(stream, "(Extended group 2) <INVALID Ra = Rb op [A16] form>");
+ break;
+ }
+
+
return UNSP_DASM_OK;
}
case 0x07:
case 0x17:
{
+ // 3 param form
+
//[A16] = Ra op Rb
+
+ // A = [A16]
+ // B = Rb
+ // C = Ra
+
len = 3;
uint16_t imm16_2 = opcodes.r16(pc + 2);
uint8_t aluop = (ximm & 0xf000) >> 12;
@@ -124,10 +392,95 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
uint8_t ra = (ximm & 0x0e00) >> 9;
ra |= (ximm & 0x0100) >> 5;
- util::stream_format(stream, "(Ext) [0x4x] = %s %s %s", imm16_2
- , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
- , aluops[aluop]
- , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ switch (aluop)
+ {
+ case 0x00: // add
+ // A = B + C
+ util::stream_format(stream, "(Extended group 3) [%04x] = %s + %s", imm16_2
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ break;
+
+ case 0x01: // adc
+ // A = B + C, Carry
+ util::stream_format(stream, "(Extended group 3) [%04x] = %s + %s, carry", imm16_2
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ break;
+
+ case 0x02: // sub
+ // A = B - C
+ util::stream_format(stream, "(Extended group 3) [%04x] = %s - %s", imm16_2
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ break;
+
+ case 0x03: // sbc
+ // A = B - C, Carry
+ util::stream_format(stream, "(Extended group 3) [%04x] = %s - %s, carry", imm16_2
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ break;
+
+ case 0x04: // cmp (is this even a valid form? [A16] not even used)
+ // CMP B,C
+ util::stream_format(stream, "(Extended group 3) cmp %s, %s", (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ break;
+
+ case 0x06: // neg
+ // A = -C
+ util::stream_format(stream, "(Extended group 3) [%04x] = -%s", imm16_2
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ break;
+
+ case 0x08: // xor
+ // A = B ^ C
+ util::stream_format(stream, "(Extended group 3) [%04x] = %s ^ %s", imm16_2
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ break;
+
+ case 0x09: // load
+ // A = C
+ util::stream_format(stream, "(Extended group 3) [%04x] = %s", imm16_2
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ break;
+
+ case 0x0a: // or
+ // A = B | C
+ util::stream_format(stream, "(Extended group 3) [%04x] = %s | %s", imm16_2
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ break;
+
+ case 0x0b: // and
+ // A = B & C
+ util::stream_format(stream, "(Extended group 3) [%04x] = %s & %s", imm16_2
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ break;
+
+ case 0x0c: // test (is this even a valid form? [A16] not even used)
+ // TEST B,C
+ util::stream_format(stream, "(Extended group 3) test %s, %s", (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
+ , (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
+ break;
+
+ case 0x0d: // store (is this even a valid form? [A16] not even used)
+ // C = B
+ util::stream_format(stream, "(Extended group 3) [%04x] = %s", imm16_2
+ , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ break;
+
+ case 0x05: // invalid
+ case 0x07: // invalid
+ case 0x0e: // invalid
+ case 0x0f: // invalid
+ util::stream_format(stream, "(Extended group 3) <INVALID [A16] = Ra op Rb form>");
+ break;
+ }
+
return UNSP_DASM_OK;
}
@@ -135,13 +488,98 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
{
// Ext Indirect Rx=Rx op [Ry@]
+ // A = Rx
+ // B = [Ry@]
+
uint8_t aluop = (ximm & 0xf000) >> 12;
uint8_t ry = (ximm & 0x0007) >> 0;
uint8_t form = (ximm & 0x0018) >> 3;
uint8_t rx = (ximm & 0x0e00) >> 9;
- util::stream_format(stream, "(Ext) %s=%s %s", extregs[rx], extregs[rx], aluops[aluop]);
- util::stream_format(stream, forms[form], extregs[ry]);
+ switch (aluop)
+ {
+ case 0x00: // add
+ // A += B
+ util::stream_format(stream, "(Extended group 4) %s += ", extregs[rx]);
+ util::stream_format(stream, forms[form], extregs[ry]);
+ break;
+
+ case 0x01: // adc
+ // A += B, Carry
+ util::stream_format(stream, "(Extended group 4) %s += ", extregs[rx]);
+ util::stream_format(stream, forms[form], extregs[ry]);
+ util::stream_format(stream, ", carry");
+ break;
+
+ case 0x02: // sub
+ // A -= B
+ util::stream_format(stream, "(Extended group 4) %s -= ", extregs[rx]);
+ util::stream_format(stream, forms[form], extregs[ry]);
+ break;
+
+ case 0x03: // sbc
+ // A -= B, Carry
+ util::stream_format(stream, "(Extended group 4) %s -= ", extregs[rx]);
+ util::stream_format(stream, forms[form], extregs[ry]);
+ util::stream_format(stream, ", carry");
+ break;
+
+ case 0x04: // cmp
+ // CMP A,B
+ util::stream_format(stream, "(Extended group 4) cmp %s, ", extregs[rx]);
+ util::stream_format(stream, forms[form], extregs[ry]);
+ break;
+
+ case 0x06: // neg
+ // A = -B
+ util::stream_format(stream, "(Extended group 4) %s = -", extregs[rx]);
+ util::stream_format(stream, forms[form], extregs[ry]);
+ break;
+
+ case 0x08: // xor
+ // A ^= B
+ util::stream_format(stream, "(Extended group 4) %s ^= ", extregs[rx]);
+ util::stream_format(stream, forms[form], extregs[ry]);
+ break;
+
+ case 0x09: // load
+ // A = B
+ util::stream_format(stream, "(Extended group 4) %s = ", extregs[rx]);
+ util::stream_format(stream, forms[form], extregs[ry]);
+ break;
+
+ case 0x0a: // or
+ // A |= B
+ util::stream_format(stream, "(Extended group 4) %s |= ", extregs[rx]);
+ util::stream_format(stream, forms[form], extregs[ry]);
+ break;
+
+ case 0x0b: // and
+ // A &= B
+ util::stream_format(stream, "(Extended group 4) %s &= ", extregs[rx]);
+ util::stream_format(stream, forms[form], extregs[ry]);
+ break;
+
+ case 0x0c: // test
+ // TEST A,B
+ util::stream_format(stream, "(Extended group 4) test %s, ", extregs[rx]);
+ util::stream_format(stream, forms[form], extregs[ry]);
+ break;
+
+ case 0x0d: // store
+ // B = A
+ util::stream_format(stream, "(Extended group 4) ");
+ util::stream_format(stream, forms[form], extregs[ry]);
+ util::stream_format(stream, " = %s", extregs[rx]);
+ break;
+
+ case 0x05: // invalid
+ case 0x07: // invalid
+ case 0x0e: // invalid
+ case 0x0f: // invalid
+ util::stream_format(stream, "(Extended group 4) <INVALID Indirect Rx=Rx op [Ry@] form>");
+ break;
+ }
return UNSP_DASM_OK;
}
@@ -149,13 +587,98 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
{
// Ext DS_Indirect Rx=Rx op ds:[Ry@]
+ // A = Rx
+ // B = ds[Ry@]
+
uint8_t aluop = (ximm & 0xf000) >> 12;
uint8_t ry = (ximm & 0x0007) >> 0;
uint8_t form = (ximm & 0x0018) >> 3;
uint8_t rx = (ximm & 0x0e00) >> 9;
- util::stream_format(stream, "(Ext) %s=%s %s ds:", extregs[rx], extregs[rx], aluops[aluop]);
- util::stream_format(stream, forms[form], extregs[ry]);
+ switch (aluop)
+ {
+ case 0x00: // add
+ // A += B
+ util::stream_format(stream, "(Extended group 5) %s += ds:", extregs[rx]);
+ util::stream_format(stream, forms[form], extregs[ry]);
+ break;
+
+ case 0x01: // adc
+ // A += B, Carry
+ util::stream_format(stream, "(Extended group 5) %s += ds:", extregs[rx]);
+ util::stream_format(stream, forms[form], extregs[ry]);
+ util::stream_format(stream, ", carry");
+ break;
+
+ case 0x02: // sub
+ // A -= B
+ util::stream_format(stream, "(Extended group 5) %s -= ds:", extregs[rx]);
+ util::stream_format(stream, forms[form], extregs[ry]);
+ break;
+
+ case 0x03: // sbc
+ // A -= B, Carry
+ util::stream_format(stream, "(Extended group 5) %s -= ds:", extregs[rx]);
+ util::stream_format(stream, forms[form], extregs[ry]);
+ util::stream_format(stream, ", carry");
+ break;
+
+ case 0x04: // cmp
+ // CMP A,B
+ util::stream_format(stream, "(Extended group 5) cmp %s, ds:", extregs[rx]);
+ util::stream_format(stream, forms[form], extregs[ry]);
+ break;
+
+ case 0x06: // neg
+ // A = -B
+ util::stream_format(stream, "(Extended group 5) %s = -ds:", extregs[rx]);
+ util::stream_format(stream, forms[form], extregs[ry]);
+ break;
+
+ case 0x08: // xor
+ // A ^= B
+ util::stream_format(stream, "(Extended group 5) %s ^= ds:", extregs[rx]);
+ util::stream_format(stream, forms[form], extregs[ry]);
+ break;
+
+ case 0x09: // load
+ // A = B
+ util::stream_format(stream, "(Extended group 5) %s = ds:", extregs[rx]);
+ util::stream_format(stream, forms[form], extregs[ry]);
+ break;
+
+ case 0x0a: // or
+ // A |= B
+ util::stream_format(stream, "(Extended group 5) %s |= ds:", extregs[rx]);
+ util::stream_format(stream, forms[form], extregs[ry]);
+ break;
+
+ case 0x0b: // and
+ // A &= B
+ util::stream_format(stream, "(Extended group 5) %s &= ds:", extregs[rx]);
+ util::stream_format(stream, forms[form], extregs[ry]);
+ break;
+
+ case 0x0c: // test
+ // TEST A,B
+ util::stream_format(stream, "(Extended group 5) test %s, ds:", extregs[rx]);
+ util::stream_format(stream, forms[form], extregs[ry]);
+ break;
+
+ case 0x0d: // store
+ // B = A
+ util::stream_format(stream, "(Extended group 5) ds:");
+ util::stream_format(stream, forms[form], extregs[ry]);
+ util::stream_format(stream, " = %s", extregs[rx]);
+ break;
+
+ case 0x05: // invalid
+ case 0x07: // invalid
+ case 0x0e: // invalid
+ case 0x0f: // invalid
+ util::stream_format(stream, "(Extended group 5) <INVALID DS_Indirect Rx=Rx op ds:[Ry@] form>");
+ break;
+ }
return UNSP_DASM_OK;
}
@@ -167,7 +690,75 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
uint8_t rx = (ximm & 0x0e00) >> 9;
uint8_t imm6 = (ximm & 0x003f) >> 0;
- util::stream_format(stream, "(Ext) %s=%s %s %02x", extregs[rx], extregs[rx], aluops[aluop], imm6 );
+ // A = Rx
+ // B = IM6
+
+ switch (aluop)
+ {
+ case 0x00: // add
+ // A += B
+ util::stream_format(stream, "(Extended group 6) %s += %02x", extregs[rx], imm6 );
+ break;
+
+ case 0x01: // adc
+ // A += B, Carry
+ util::stream_format(stream, "(Extended group 6) %s += %02x, carry", extregs[rx], imm6 );
+ break;
+
+ case 0x02: // sub
+ // A -= B
+ util::stream_format(stream, "(Extended group 6) %s -= %02x", extregs[rx], imm6 );
+ break;
+
+ case 0x03: // sbc
+ // A -= B, Carry
+ util::stream_format(stream, "(Extended group 6) %s -= %02x, carry", extregs[rx], imm6 );
+ break;
+
+ case 0x04: // cmp
+ // CMP A,B
+ util::stream_format(stream, "(Extended group 6) cmp %s, %02x", extregs[rx], imm6 );
+ break;
+
+ case 0x06: // neg
+ // A = -B
+ util::stream_format(stream, "(Extended group 6) %s = -%02x", extregs[rx], imm6 );
+ break;
+
+ case 0x08: // xor
+ // A ^= B
+ util::stream_format(stream, "(Extended group 6) %s ^= %02x", extregs[rx], imm6 );
+ break;
+
+ case 0x09: // load
+ // A = B
+ util::stream_format(stream, "(Extended group 6) %s = %02x", extregs[rx], imm6 );
+ break;
+
+ case 0x0a: // or
+ // A |= B
+ util::stream_format(stream, "(Extended group 6) %s |= %02x", extregs[rx], imm6 );
+ break;
+
+ case 0x0b: // and
+ // A &= B
+ util::stream_format(stream, "(Extended group 6) %s &= %02x", extregs[rx], imm6 );
+ break;
+
+ case 0x0c: // test
+ // TEST A,B
+ util::stream_format(stream, "(Extended group 6) test %s, %02x", extregs[rx], imm6 );
+ break;
+
+ case 0x0d: // store, B = A (invalid for this type)
+ case 0x05: // invalid
+ case 0x07: // invalid
+ case 0x0e: // invalid
+ case 0x0f: // invalid
+ util::stream_format(stream, "(Extended group 6) <INVALID IM6 Rx=Rx op IM6 form>");
+ break;
+ }
+
return UNSP_DASM_OK;
}
@@ -175,11 +766,83 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
{
// Ext Base+Disp6 Rx=Rx op [BP+IM6]
+ // A = Rx
+ // B = [BP+IM6]
+
uint8_t aluop = (ximm & 0xf000) >> 12;
uint8_t rx = (ximm & 0x0e00) >> 9;
uint8_t imm6 = (ximm & 0x003f) >> 0;
- util::stream_format(stream, "(Ext) %s=%s %s [BP+%02x]", extregs[rx], extregs[rx], aluops[aluop], imm6 );
+ switch (aluop)
+ {
+ case 0x00: // add
+ // A += B
+ util::stream_format(stream, "(Extended group 7) %s += [BP+%02x]", extregs[rx], imm6 );
+ break;
+
+ case 0x01: // adc
+ // A += B, Carry
+ util::stream_format(stream, "(Extended group 7) %s += [BP+%02x], carry", extregs[rx], imm6 );
+ break;
+
+ case 0x02: // sub
+ // A -= B
+ util::stream_format(stream, "(Extended group 7) %s -= [BP+%02x]", extregs[rx], imm6 );
+ break;
+
+ case 0x03: // sbc
+ // A -= B, Carry
+ util::stream_format(stream, "(Extended group 7) %s -= [BP+%02x], carry", extregs[rx], imm6 );
+ break;
+
+ case 0x04: // cmp
+ // CMP A,B
+ util::stream_format(stream, "(Extended group 7) cmp %s, [BP+%02x]", extregs[rx], imm6 );
+ break;
+
+ case 0x06: // neg
+ // A = -B
+ util::stream_format(stream, "(Extended group 7) %s = -[BP+%02x]", extregs[rx], imm6 );
+ break;
+
+ case 0x08: // xor
+ // A ^= B
+ util::stream_format(stream, "(Extended group 7) %s ^= [BP+%02x]", extregs[rx], imm6 );
+ break;
+
+ case 0x09: // load
+ // A = B
+ util::stream_format(stream, "(Extended group 7) %s = [BP+%02x]", extregs[rx], imm6 );
+ break;
+
+ case 0x0a: // or
+ // A |= B
+ util::stream_format(stream, "(Extended group 7) %s |= [BP+%02x]", extregs[rx], imm6 );
+ break;
+
+ case 0x0b: // and
+ // A &= B
+ util::stream_format(stream, "(Extended group 7) %s &= [BP+%02x]", extregs[rx], imm6 );
+ break;
+
+ case 0x0c: // test
+ // TEST A,B
+ util::stream_format(stream, "(Extended group 7) test %s, [BP+%02x]", extregs[rx], imm6 );
+ break;
+
+ case 0x0d: // store
+ // B = A
+ util::stream_format(stream, "(Extended group 7) [BP+%02x] = %s", imm6, extregs[rx] );
+ break;
+
+ case 0x05: // invalid
+ case 0x07: // invalid
+ case 0x0e: // invalid
+ case 0x0f: // invalid
+ util::stream_format(stream, "(Extended group 7) <INVALID Base+Disp6 Rx=Rx op [BP+IM6] form>");
+ break;
+ }
+
return UNSP_DASM_OK;
}
@@ -187,11 +850,83 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
{
// Ext A6 Rx=Rx op [A6]
+ // A = Rx
+ // B = [A6]
+
uint8_t aluop = (ximm & 0xf000) >> 12;
uint8_t rx = (ximm & 0x0e00) >> 9;
uint8_t a6 = (ximm & 0x003f) >> 0;
- util::stream_format(stream, "(Ext) %s=%s %s [%02x]", extregs[rx], extregs[rx], aluops[aluop], a6 );
+ switch (aluop)
+ {
+ case 0x00: // add
+ // A += B
+ util::stream_format(stream, "(Extended group 8) %s += [%02x]", extregs[rx], a6 );
+ break;
+
+ case 0x01: // adc
+ // A += B, Carry
+ util::stream_format(stream, "(Extended group 8) %s += [%02x], carry", extregs[rx], a6 );
+ break;
+
+ case 0x02: // sub
+ // A -= B
+ util::stream_format(stream, "(Extended group 8) %s -= [%02x]", extregs[rx], a6 );
+ break;
+
+ case 0x03: // sbc
+ // A -= B, Carry
+ util::stream_format(stream, "(Extended group 8) %s -= [%02x], carry", extregs[rx], a6 );
+ break;
+
+ case 0x04: // cmp
+ // CMP A,B
+ util::stream_format(stream, "(Extended group 8) cmp %s, [%02x]", extregs[rx], a6 );
+ break;
+
+ case 0x06: // neg
+ // A = -B
+ util::stream_format(stream, "(Extended group 8) %s = -[%02x]", extregs[rx], a6 );
+ break;
+
+ case 0x08: // xor
+ // A ^= B
+ util::stream_format(stream, "(Extended group 8) %s ^= [%02x]", extregs[rx], a6 );
+ break;
+
+ case 0x09: // load
+ // A = B
+ util::stream_format(stream, "(Extended group 8) %s = [%02x]", extregs[rx], a6 );
+ break;
+
+ case 0x0a: // or
+ // A |= B
+ util::stream_format(stream, "(Extended group 8) %s |= [%02x]", extregs[rx], a6 );
+ break;
+
+ case 0x0b: // and
+ // A &= B
+ util::stream_format(stream, "(Extended group 8) %s &= [%02x]", extregs[rx], a6 );
+ break;
+
+ case 0x0c: // test
+ // TEST A,B
+ util::stream_format(stream, "(Extended group 8) test %s, [%02x]", extregs[rx], a6 );
+ break;
+
+ case 0x0d: // store
+ // B = A
+ util::stream_format(stream, "(Extended group 8) [%02x] = %s", a6, extregs[rx] );
+ break;
+
+ case 0x05: // invalid
+ case 0x07: // invalid
+ case 0x0e: // invalid
+ case 0x0f: // invalid
+ util::stream_format(stream, "(Extended group 8) <INVALID A6 Rx=Rx op [A6] form>");
+ break;
+ }
+
return UNSP_DASM_OK;
}
}
diff --git a/src/devices/cpu/unsp/unspdasm_other.cpp b/src/devices/cpu/unsp/unspdasm_other.cpp
index a34120cfcdc..ce76eaeb778 100644
--- a/src/devices/cpu/unsp/unspdasm_other.cpp
+++ b/src/devices/cpu/unsp/unspdasm_other.cpp
@@ -133,12 +133,14 @@ offs_t unsp_disassembler::disassemble_remaining(std::ostream& stream, offs_t pc,
// alu, direct memory
case 2:
// TaiKee Guitar has this with op0 == 9
+
+ // 4 is cmp, 12 is tst, 6 is neg, 9 is load (all ops that only use one param)
if ((op0 == 4 || op0 == 12 || op0 == 6 /*|| op0 == 9*/) && opA != opB)
{
util::stream_format(stream, "<BAD>");
return UNSP_DASM_OK;
}
- if (op0 != 4 && op0 != 12)
+ if (op0 != 4 && op0 != 12) // 4 is cmp, 12 is tst
util::stream_format(stream, "%s = ", regs[opA]);
print_alu_op3(stream, op0, opB);
len = 2;
diff --git a/src/mame/drivers/generalplus_gpl32612.cpp b/src/mame/drivers/generalplus_gpl32612.cpp
index 6506043139f..07c322b4341 100644
--- a/src/mame/drivers/generalplus_gpl32612.cpp
+++ b/src/mame/drivers/generalplus_gpl32612.cpp
@@ -29,6 +29,8 @@ public:
void gpl32612(machine_config &config);
+ void nand_init840();
+
private:
virtual void machine_start() override;
virtual void machine_reset() override;
@@ -38,6 +40,10 @@ private:
required_device<screen_device> m_screen;
uint32_t screen_update_gpl32612(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ void nand_init(int blocksize, int blocksize_stripped);
+
+ std::vector<uint8_t> m_strippedrom;
};
uint32_t generalplus_gpl32612_game_state::screen_update_gpl32612(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
@@ -83,9 +89,50 @@ ROM_START( jak_swbstrik )
ROM_LOAD( "starwarsblaster.bin", 0x000000, 0x8400000, CRC(02c3c4d6) SHA1(a6ae05a7d7b2015023113f6baad25458f3c01102) )
ROM_END
+void generalplus_gpl32612_game_state::nand_init(int blocksize, int blocksize_stripped)
+{
+ uint8_t* rom = memregion("maincpu")->base();
+ int size = memregion("maincpu")->bytes();
+
+ int numblocks = size / blocksize;
+
+ m_strippedrom.resize(numblocks * blocksize_stripped);
+
+ for (int i = 0; i < numblocks; i++)
+ {
+ const int base = i * blocksize;
+ const int basestripped = i * blocksize_stripped;
+
+ for (int j = 0; j < blocksize_stripped; j++)
+ {
+ m_strippedrom[basestripped + j] = rom[base + j];
+ }
+ }
+
+ // debug to allow for easy use of unidasm.exe
+ if (0)
+ {
+ FILE *fp;
+ char filename[256];
+ sprintf(filename,"stripped_%s", machine().system().name);
+ fp=fopen(filename, "w+b");
+ if (fp)
+ {
+ fwrite(&m_strippedrom[0], blocksize_stripped * numblocks, 1, fp);
+ fclose(fp);
+ }
+ }
+}
+
+void generalplus_gpl32612_game_state::nand_init840()
+{
+ nand_init(0x840, 0x800);
+}
+
+
// year, name, parent, compat, machine, input, class, init, company, fullname, flags
-CONS( 200?, jak_tmnthp, 0, 0, gpl32612, gpl32612, generalplus_gpl32612_game_state, empty_init, "JAKKS Pacific Inc", "Teenage Mutanat Ninja Turtles Hero Portal", MACHINE_IS_SKELETON )
-CONS( 200?, jak_swbstrik, 0, 0, gpl32612, gpl32612, generalplus_gpl32612_game_state, empty_init, "JAKKS Pacific Inc", "Star Wars Blaster Strike", MACHINE_IS_SKELETON )
+CONS( 200?, jak_tmnthp, 0, 0, gpl32612, gpl32612, generalplus_gpl32612_game_state, nand_init840, "JAKKS Pacific Inc", "Teenage Mutanat Ninja Turtles Hero Portal", MACHINE_IS_SKELETON )
+CONS( 200?, jak_swbstrik, 0, 0, gpl32612, gpl32612, generalplus_gpl32612_game_state, nand_init840, "JAKKS Pacific Inc", "Star Wars Blaster Strike", MACHINE_IS_SKELETON )
// Hero Portal Dreamworks Dragons
// Hero Portal Power Rangers
// Hero Portal DC Super Heroes
diff --git a/src/mame/drivers/nes_vt.cpp b/src/mame/drivers/nes_vt.cpp
index 4831938091f..07e3e2d7228 100644
--- a/src/mame/drivers/nes_vt.cpp
+++ b/src/mame/drivers/nes_vt.cpp
@@ -215,7 +215,7 @@ private:
int calculate_real_video_address(int addr, int extended, int readtype);
-
+
required_memory_bank m_prgbank0;
required_memory_bank m_prgbank1;
required_memory_bank m_prgbank2;
@@ -246,7 +246,7 @@ class nes_vt_ts_state : public nes_vt_state
public:
nes_vt_ts_state(const machine_config& mconfig, device_type type, const char* tag) :
nes_vt_state(mconfig, type, tag)
- {
+ {
m_initial_e000_bank = 0x03; // or the banking is just different / ROM is scrambled
}
@@ -2266,6 +2266,11 @@ ROM_START( mc_tv200 )
ROM_LOAD( "s29gl064n90.bin", 0x00000, 0x800000, CRC(ae1905d2) SHA1(11582055713ba937c1ad32c4ada8683eebc1c83c) )
ROM_END
+ROM_START( unkra200 ) // "Winbond 25Q64FVSIG 1324" SPI ROM
+ ROM_REGION( 0x800000, "mainrom", 0 )
+ ROM_LOAD( "retro_machine_rom", 0x00000, 0x800000, CRC(0e824aa7) SHA1(957e98868559ecc22b3fa42c76692417b76bf132) )
+ROM_END
+
ROM_START( fcpocket )
ROM_REGION( 0x8000000, "mainrom", 0 )
ROM_LOAD( "s29gl01gp.bin", 0x00000, 0x8000000, CRC(8703b18a) SHA1(07943443294e80ca93f83181c8bdbf950b87c52f) )
@@ -2434,6 +2439,8 @@ CONS( 201?, mc_hh210, 0, 0, nes_vt_xx, nes_vt, nes_vt_state, empty_ini
CONS( 201?, dvnimbus, 0, 0, nes_vt_vg, nes_vt, nes_vt_hh_state, empty_init, "<unknown>", "DVTech Nimbus 176 in 1", MACHINE_NOT_WORKING )
// Works fine, VT02 based
CONS( 201?, mc_tv200, 0, 0, nes_vt, nes_vt, nes_vt_state, empty_init, "Thumbs Up", "200 in 1 Retro TV Game", MACHINE_IMPERFECT_GRAPHICS )
+ // probably another Thumbs Up product? cursor doesn't work unless nes_vt_hh machine is used? possibly newer than VT02 as it runs from an SPI ROM, might just not use enhanced features. Some minor game name changes to above (eg Smackdown just becomes Wrestling)
+CONS( 201?, unkra200, mc_tv200, 0, nes_vt_hh, nes_vt, nes_vt_hh_state, empty_init, "<unknown>", "200 in 1 Retro Arcade", MACHINE_IMPERFECT_GRAPHICS )
// New platform with scrambled opcodes, same as DGUN-2561. Runs fine with minor GFX and sound issues in menu
// Use DIP switch to select console or cartridge, as cartridge is fake and just toggles a GPIO
CONS( 2016, fcpocket, 0, 0, nes_vt_fp, nes_vt_fp, nes_vt_hh_state, empty_init, "<unknown>", "FC Pocket 600 in 1", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
diff --git a/src/mame/drivers/sunplus_gcm394.cpp b/src/mame/drivers/sunplus_gcm394.cpp
index 137d9d72fb9..88431cd0162 100644
--- a/src/mame/drivers/sunplus_gcm394.cpp
+++ b/src/mame/drivers/sunplus_gcm394.cpp
@@ -2,7 +2,7 @@
// copyright-holders:David Haywood
/*
SunPlus unSP based hardware, SPG-??? (6xx?) (die is GCM394)
-
+
Compared to vii.cpp this is clearly newer, has extra opcodes, different internal map etc. also scaling and higher resolutions based on Spongebob
Smart Fit Park
@@ -34,7 +34,7 @@ public:
m_romregion(*this, "maincpu")
{
}
-
+
void base(machine_config &config);
@@ -89,7 +89,7 @@ protected:
//virtual void machine_reset() override;
void wrlshunt_map(address_map &map);
-
+
private:
DECLARE_READ16_MEMBER(hunt_porta_r);
@@ -116,7 +116,8 @@ public:
void generalplus_gpac800(machine_config &config);
- void nand_init();
+ void nand_init210();
+ void nand_init840();
protected:
virtual void machine_reset() override;
@@ -124,6 +125,8 @@ protected:
void generalplus_gpac800_map(address_map &map);
private:
+ void nand_init(int blocksize, int blocksize_stripped);
+
required_shared_ptr<u16> m_mainram;
std::vector<uint8_t> m_strippedrom;
};
@@ -175,7 +178,7 @@ READ16_MEMBER(wrlshunt_game_state::read_external_space)
WRITE16_MEMBER(wrlshunt_game_state::write_external_space)
{
-// logerror("DMA writing to external space (RAM?) %08x %04x\n", offset, data);
+// logerror("DMA writing to external space (RAM?) %08x %04x\n", offset, data);
if (offset & 0x0800000)
{
@@ -217,7 +220,7 @@ READ16_MEMBER(gcm394_game_state::portb_r)
WRITE16_MEMBER(gcm394_game_state::porta_w)
{
logerror("%s: Port A:WRITE %04x\n", machine().describe_context(), data);
-}
+}
void gcm394_game_state::base(machine_config &config)
@@ -230,7 +233,7 @@ void gcm394_game_state::base(machine_config &config)
m_maincpu->space_read_callback().set(FUNC(gcm394_game_state::read_external_space));
m_maincpu->space_write_callback().set(FUNC(gcm394_game_state::write_external_space));
m_maincpu->set_irq_acknowledge_callback(m_maincpu, FUNC(sunplus_gcm394_base_device::irq_vector_cb));
- m_maincpu->mapping_write_callback().set(FUNC(gcm394_game_state::mapping_w));
+ m_maincpu->mapping_write_callback().set(FUNC(gcm394_game_state::mapping_w));
m_maincpu->add_route(ALL_OUTPUTS, "lspeaker", 0.5);
m_maincpu->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
@@ -286,7 +289,7 @@ void generalplus_gpac800_game_state::generalplus_gpac800(machine_config &config)
m_maincpu->space_read_callback().set(FUNC(generalplus_gpac800_game_state::read_external_space));
m_maincpu->space_write_callback().set(FUNC(generalplus_gpac800_game_state::write_external_space));
m_maincpu->set_irq_acknowledge_callback(m_maincpu, FUNC(sunplus_gcm394_base_device::irq_vector_cb));
- m_maincpu->mapping_write_callback().set(FUNC(generalplus_gpac800_game_state::mapping_w));
+ m_maincpu->mapping_write_callback().set(FUNC(generalplus_gpac800_game_state::mapping_w));
m_maincpu->add_route(ALL_OUTPUTS, "lspeaker", 0.5);
m_maincpu->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
@@ -372,9 +375,9 @@ static INPUT_PORTS_START( gcm394 )
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CODE(KEYCODE_A) PORT_NAME("Circle / Red") // hold button Circle and Star on startup for test menu (other conditions? doesn't always work?)
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(KEYCODE_S) PORT_NAME("Square / Orange")
- PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CODE(KEYCODE_D) PORT_NAME("Triangle / Yellow")
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CODE(KEYCODE_D) PORT_NAME("Triangle / Yellow")
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_CODE(KEYCODE_F) PORT_NAME("Star / Blue")
-
+
PORT_START("P2")
PORT_DIPNAME( 0x0001, 0x0001, "P2" )
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
@@ -595,7 +598,7 @@ void generalplus_gpac800_game_state::machine_reset()
int dest = m_strippedrom[0x15] << 8;
// copy a block of code from the NAND to RAM
- for (int i = 0; i < 0x2000; i++)
+ for (int i = 0; i < 0x7000-dest; i++)
{
uint16_t word = m_strippedrom[(i * 2) + 0] | (m_strippedrom[(i * 2) + 1] << 8);
@@ -607,14 +610,11 @@ void generalplus_gpac800_game_state::machine_reset()
}
-void generalplus_gpac800_game_state::nand_init()
+void generalplus_gpac800_game_state::nand_init(int blocksize, int blocksize_stripped)
{
uint8_t* rom = memregion("maincpu")->base();
int size = memregion("maincpu")->bytes();
- const int blocksize = 0x210;
- const int blocksize_stripped = 0x200;
-
int numblocks = size / blocksize;
m_strippedrom.resize(numblocks * blocksize_stripped);
@@ -625,7 +625,7 @@ void generalplus_gpac800_game_state::nand_init()
const int basestripped = i * blocksize_stripped;
for (int j = 0; j < blocksize_stripped; j++)
- {
+ {
m_strippedrom[basestripped + j] = rom[base + j];
}
}
@@ -645,12 +645,21 @@ void generalplus_gpac800_game_state::nand_init()
}
}
+void generalplus_gpac800_game_state::nand_init210()
+{
+ nand_init(0x210, 0x200);
+}
+
+void generalplus_gpac800_game_state::nand_init840()
+{
+ nand_init(0x840, 0x800);
+}
// NAND dumps w/ internal bootstrap (and u'nSP 2.0 extended opcodes) (have gpnandnand strings)
// the JAKKS ones seem to be known as 'Generalplus GPAC800' hardware
-CONS(2010, wlsair60, 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init, "Jungle Soft / Kids Station Toys Inc", "Wireless Air 60", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
-CONS(200?, jak_gtg, 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init, "JAKKS Pacific Inc", "Golden Tee Golf (JAKKS Pacific TV Game)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
-CONS(200?, jak_car2, 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init, "JAKKS Pacific Inc", "Cars 2 (JAKKS Pacific TV Game)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
-CONS(200?, jak_tsm , 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init, "JAKKS Pacific Inc", "Toy Story Mania (JAKKS Pacific TV Game)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
-CONS(200?, vbaby, 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init, "VTech", "V.Baby", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
-CONS(200?, beambox, 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init, "Hasbro", "Playskool Heroes Transformers Rescue Bots Beam Box (Spain)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
+CONS(2010, wlsair60, 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init840, "Jungle Soft / Kids Station Toys Inc", "Wireless Air 60", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
+CONS(200?, jak_gtg, 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init210, "JAKKS Pacific Inc", "Golden Tee Golf (JAKKS Pacific TV Game)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
+CONS(200?, jak_car2, 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init210, "JAKKS Pacific Inc", "Cars 2 (JAKKS Pacific TV Game)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
+CONS(200?, jak_tsm , 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init210, "JAKKS Pacific Inc", "Toy Story Mania (JAKKS Pacific TV Game)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
+CONS(200?, vbaby, 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init840, "VTech", "V.Baby", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
+CONS(200?, beambox, 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init210, "Hasbro", "Playskool Heroes Transformers Rescue Bots Beam Box (Spain)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
diff --git a/src/mame/drivers/vii.cpp b/src/mame/drivers/vii.cpp
index 56f9331476b..c7fe56a7790 100644
--- a/src/mame/drivers/vii.cpp
+++ b/src/mame/drivers/vii.cpp
@@ -651,12 +651,12 @@ void spg2xx_game_state::switch_bank(uint32_t bank)
WRITE8_MEMBER(spg2xx_game_state::i2c_w)
{
- logerror("%s: i2c_w %05x %04x\n", machine().describe_context(), offset, data);
+ logerror("%s: i2c_w %05x %04x\n", machine().describe_context(), offset, data);
}
READ8_MEMBER(spg2xx_game_state::i2c_r)
{
- logerror("%s: i2c_r %04x\n", machine().describe_context(), offset);
+ logerror("%s: i2c_r %04x\n", machine().describe_context(), offset);
return 0x0000;
}
@@ -686,7 +686,7 @@ WRITE16_MEMBER(wireless60_state::wireless60_porta_w)
WRITE16_MEMBER(zone40_state::zone40_porta_w)
{
wireless60_porta_w(space, offset, data);
-
+
if ((data & 0x00ff) != m_z40_rombase)
{
m_z40_rombase = data & 0x00ff;
@@ -2556,7 +2556,7 @@ void wireless60_state::machine_start()
save_item(NAME(m_w60_controller_input));
save_item(NAME(m_w60_porta_data));
-
+
m_w60_p1_ctrl_mask = 0x0400;
m_w60_p2_ctrl_mask = 0x0800;
}
@@ -2625,7 +2625,7 @@ DEVICE_IMAGE_LOAD_MEMBER(vii_state::cart_load_vii)
image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
return image_init_result::FAIL;
}
-
+
m_cart->rom_alloc(size, GENERIC_ROM16_WIDTH, ENDIANNESS_LITTLE);
m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
@@ -3838,14 +3838,14 @@ void zone40_state::init_zone40()
ROM[i] = ROM[i] ^ 0xbb88;
ROM[i] = bitswap<16>(ROM[i], 11, 10, 3, 2, 4, 12, 5, 13,
- 9, 1, 8, 0, 6, 7, 14, 15);
+ 9, 1, 8, 0, 6, 7, 14, 15);
}
}
void wireless60_state::init_lx_jg7415()
{
uint8_t blocks[32] = {
- // these parts of the ROM contain the code that gets selected
+ // these parts of the ROM contain the code that gets selected
0x00, 0x01, 0x06, 0x07, 0x08, 0x09, 0x0e, 0x0f, 0x10, 0x11, 0x16, 0x17, 0x18, 0x19, 0x1e, 0x1f,
// these parts of the ROM contain code / data but go unused, this seems intentional, some of these areas don't read consistently so likely this double size ROM was used knowing that some areas were bad and could be avoided
0x02, 0x03, 0x04, 0x05, 0x0a, 0x0b, 0x0c, 0x0d, 0x12, 0x13, 0x14, 0x15, 0x1a, 0x1b, 0x1c, 0x1d
@@ -3855,7 +3855,7 @@ void wireless60_state::init_lx_jg7415()
std::vector<u8> buffer(0x10000000);
for (int addr = 0; addr < 0x10000000; addr++)
- {
+ {
int bank = (addr & 0xf800000) >> 23;
int newbank = blocks[bank];
int newaddr = (addr & 0x07fffff) | (newbank << 23);
@@ -3928,7 +3928,7 @@ CONS( 2007, icanguit, 0, 0, icanguit, icanguit, icanguit_state, empty_
CONS( 2006, icanpian, 0, 0, icanpian, icanpian, icanpian_state, empty_init, "Fisher-Price", "I Can Play Piano", MACHINE_IMPERFECT_SOUND ) // 2006 date from Manual
// Toyquest games
-CONS( 2005, tvgogo, 0, 0, tvgogo, tvgogo, tvgogo_state, empty_init, "Toyquest", "TV Go Go", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+CONS( 2005, tvgogo, 0, 0, tvgogo, tvgogo, tvgogo_state, empty_init, "Toyquest", "GoGo TV Video Vision", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // or TV Go Go - the game addons call it the 'Video Vision console'
// Similar, SPG260?, scrambled
CONS( 200?, lexizeus, 0, 0, lexizeus, lexizeus, spg2xx_game_state, init_zeus, "Lexibook", "Zeus IG900 20-in-1 (US?)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // bad sound and some corrupt bg tilemap entries in Tiger Rescue, verify ROM data (same game runs in Zone 60 without issue)
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index c1ef685a87c..e53319998f3 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -31180,6 +31180,7 @@ mc_hh210
dvnimbus
cbrs8
mc_tv200
+unkra200
fcpocket
mog_m320
fapocket