summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author David Haywood <28625134+DavidHaywood@users.noreply.github.com>2019-12-17 16:34:16 +0000
committer R. Belmont <rb6502@users.noreply.github.com>2019-12-17 11:34:16 -0500
commit3b5f232c0e5777bfce2619b48f8f82ebf355635e (patch)
tree0d2bea204665a4cf12b3e14656f1db265ca3f34c
parentbdc90e3a8f1f9a68eb72d8e0a22dfdd206855d77 (diff)
continued work on Jakks NAND based stuff / extended SP ops (nw) (#6064)
* lost comma (nw) * fix etended pushpop (nw) * basic ops (nw) * (nw) * NAND is here (nw)
-rw-r--r--src/devices/cpu/unsp/unsp.h5
-rw-r--r--src/devices/cpu/unsp/unsp_extended.cpp170
-rw-r--r--src/devices/cpu/unsp/unspdasm.cpp2
-rw-r--r--src/devices/cpu/unsp/unspdasm_extended.cpp16
-rw-r--r--src/devices/machine/sunplus_gcm394.cpp24
-rw-r--r--src/devices/machine/sunplus_gcm394.h4
-rw-r--r--src/mame/drivers/sunplus_gcm394.cpp2
7 files changed, 170 insertions, 53 deletions
diff --git a/src/devices/cpu/unsp/unsp.h b/src/devices/cpu/unsp/unsp.h
index 17db56d5437..507d731ffff 100644
--- a/src/devices/cpu/unsp/unsp.h
+++ b/src/devices/cpu/unsp/unsp.h
@@ -230,6 +230,9 @@ protected:
void push(uint32_t value, uint32_t *reg);
uint16_t pop(uint32_t *reg);
+ void update_nz(uint32_t value);
+ void update_nzsc(uint32_t value, uint16_t r0, uint16_t r1);
+
private:
// compilation boundaries -- how far back/forward does the analysis extend?
enum : uint32_t
@@ -266,8 +269,6 @@ private:
uint32_t m_log_ops;
#endif
- void update_nz(uint32_t value);
- void update_nzsc(uint32_t value, uint16_t r0, uint16_t r1);
inline void trigger_fiq();
inline void trigger_irq(int line);
void check_irqs();
diff --git a/src/devices/cpu/unsp/unsp_extended.cpp b/src/devices/cpu/unsp/unsp_extended.cpp
index f381344fc53..a3986d124b8 100644
--- a/src/devices/cpu/unsp/unsp_extended.cpp
+++ b/src/devices/cpu/unsp/unsp_extended.cpp
@@ -152,42 +152,64 @@ void unsp_20_device::execute_extended_group(uint16_t op)
if (ximm & 0x8000)
{
// just skip for now, as nothing really even uses the extended registers yet
- /*
- uint8_t rb = (ximm & 0x000f) >> 0;
+
+ uint8_t rb = (ximm & 0x000f) >> 0;
uint8_t size = (ximm & 0x7000) >> 12;
- uint8_t rx = (ximm & 0x0e00) >> 9;
+ uint8_t rx = (ximm & 0x0e00) >> 9;
if (size == 0) size = 8;
- size -= 1;
- if ((rx-size) >= 0)
- logerror("(Ext) push %s, %s to [%s]\n",
- extregs[rx-size], extregs[rx], (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ if ((rx - (size - 1)) >= 0)
+ {
+ //logerror("(Ext) push %s, %s to [%s]\n",
+ // extregs[rx - size], extregs[rx], (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+
+ while (size--)
+ {
+ if (rb & 0x8)
+ push(m_secondary_r[rx--], &m_secondary_r[rb & 0x7]);
+ else
+ push(m_secondary_r[rx--], &m_core->m_r[rb & 0x7]);
+ }
+ }
else
- logerror("(Ext) push <BAD>\n");
- */
- //unimplemented_opcode(op, ximm);
+ {
+ logerror("(Ext) push <BAD>\n");
+ unimplemented_opcode(op, ximm);
+ }
+
return;
}
else
{
- // just skip for now, as nothing really even uses the extended registers yet
- /*
- uint8_t rb = (ximm & 0x000f) >> 0;
+ uint8_t rb = (ximm & 0x000f) >> 0;
uint8_t size = (ximm & 0x7000) >> 12;
- uint8_t rx = (ximm & 0x0e00) >> 9;
+ uint8_t rx = (ximm & 0x0e00) >> 9;
- if (size == 0) size = 8;
- size -= 1;
+ if (size == 0) size = 8;
- if ((rx-size) >= 0)
- logerror("(Ext) pop %s, %s from [%s]\n",
- extregs[rx-size], extregs[rx], (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ if ((rx - (size - 1)) >= 0)
+ {
+ //logerror("(Ext) pop %s, %s from [%s]\n",
+ // extregs[rx - size], extregs[rx], (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ int realrx = 7 - rx;
+
+ while (size--)
+ {
+ if (rb & 0x8)
+ m_secondary_r[realrx++] = pop(&m_secondary_r[rb & 0x07]);
+ else
+ m_secondary_r[realrx++] = pop(&m_core->m_r[rb & 0x07]);
+ }
+ }
else
- logerror("(Ext) pop <BAD>\n");
- */
- //unimplemented_opcode(op, ximm);
+ {
+ logerror("(Ext) pop <BAD>\n");
+ unimplemented_opcode(op, ximm);
+ }
+
+
return;
}
return;
@@ -268,13 +290,26 @@ void unsp_20_device::execute_extended_group(uint16_t op)
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);
+ //logerror("(Extended group 1) %s = %04x\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ // , imm16_2);
+ m_core->m_icount -= 1; // TODO
+
+ uint16_t lres = imm16_2;
+ update_nz(lres);
+ if (ra & 0x8)
+ {
+ m_secondary_r[ra & 0x7] = (uint16_t)lres;
+ }
+ else
+ {
+ m_core->m_r[ra & 0x7] = (uint16_t)lres;
+ }
+
return;
break;
-
+ }
case 0x0a: // or
// A = B | C
logerror( "(Extended group 1) %s = %s | %04x\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
@@ -392,12 +427,30 @@ void unsp_20_device::execute_extended_group(uint16_t op)
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);
+ //logerror("(Extended group 2) %s = [%04x]\n", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
+ // , imm16_2);
+ //unimplemented_opcode(op, ximm, imm16_2);
+
+ m_core->m_icount -= 1; // TODO
+
+ //uin32_t lreg = UNSP_LREG_I(imm16_2);
+
+ uint16_t lres = read16(imm16_2);
+ update_nz(lres);
+ if (ra & 0x8)
+ {
+ m_secondary_r[ra & 0x7] = (uint16_t)lres;
+ }
+ else
+ {
+ m_core->m_r[ra & 0x7] = (uint16_t)lres;
+ }
+
return;
break;
+ }
case 0x0a: // or
// A = B | C
@@ -556,13 +609,31 @@ void unsp_20_device::execute_extended_group(uint16_t op)
return;
break;
- case 0x0d: // store (is this even a valid form? [A16] not even used)
+ case 0x0d: // store (is this even a valid form? [A16] not even used if C = B form below is used, code needs to write to A)
+ {
// 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);
+ //logerror( "(Extended group 3) [%04x] = %s\n", imm16_2
+ // , (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ m_core->m_icount -= 1; // TODO
+
+ if (ra != rb)
+ {
+ logerror("(Extended group 3) store ra != rb");
+ unimplemented_opcode(op, ximm, imm16_2);
+ }
+
+ if (rb & 0x8)
+ {
+ write16(imm16_2, m_secondary_r[rb & 0x07]);
+ }
+ else
+ {
+ write16(imm16_2, m_core->m_r[rb & 0x07]);
+ }
+
return;
break;
+ }
case 0x05: // invalid
case 0x07: // invalid
@@ -856,39 +927,46 @@ void unsp_20_device::execute_extended_group(uint16_t op)
{
case 0x00: // add
// A += B
- logerror( "(Extended group 6) %s += %02x\n", extregs[rx], imm6 );
+ 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 );
+ 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 );
+ 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 );
+ 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);
+ //logerror("(Extended group 6) cmp %s, %02x\n", extregs[rx], imm6);
+
+ m_core->m_icount -= 1; // TODO
+
+ uint16_t lres = m_secondary_r[rx] + (uint16_t)(~imm6) + uint32_t(1);
+ update_nzsc(lres, m_secondary_r[rx] , ~imm6);
+
+ //unimplemented_opcode(op, ximm);
return;
break;
-
+ }
case 0x06: // neg
// A = -B
logerror( "(Extended group 6) %s = -%02x\n", extregs[rx], imm6 );
@@ -904,11 +982,19 @@ void unsp_20_device::execute_extended_group(uint16_t op)
break;
case 0x09: // load
+ {
// A = B
- logerror( "(Extended group 6) %s = %02x\n", extregs[rx], imm6 );
- unimplemented_opcode(op, ximm);
+ //logerror( "(Extended group 6) %s = %02x\n", extregs[rx], imm6 );
+
+ m_core->m_icount -= 1; // TODO
+
+ uint16_t lres = imm6;
+ update_nz(lres);
+ m_secondary_r[rx] = (uint16_t)lres;
+
return;
break;
+ }
case 0x0a: // or
// A |= B
diff --git a/src/devices/cpu/unsp/unspdasm.cpp b/src/devices/cpu/unsp/unspdasm.cpp
index 845a6982305..142731db9f1 100644
--- a/src/devices/cpu/unsp/unspdasm.cpp
+++ b/src/devices/cpu/unsp/unspdasm.cpp
@@ -71,7 +71,7 @@ void unsp_disassembler::print_alu_op_start(std::ostream &stream, uint8_t op0, ui
"%s = ", // load
"%s |= ",
"%s &= ",
- "test %s, "
+ "test %s, ",
"store", // syntax changes
"<BAD>", // bad
"<BAD>", // bad
diff --git a/src/devices/cpu/unsp/unspdasm_extended.cpp b/src/devices/cpu/unsp/unspdasm_extended.cpp
index 8ba7e8b801b..6ec49ec0d13 100644
--- a/src/devices/cpu/unsp/unspdasm_extended.cpp
+++ b/src/devices/cpu/unsp/unspdasm_extended.cpp
@@ -136,10 +136,12 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
size -= 1;
if ((rx-size) >= 0)
- util::stream_format(stream, "(Extended group ) push %s, %s to [%s]",
- extregs[rx-size], extregs[rx], (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ 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, "(Extended group ) push <BAD>");
+ util::stream_format(stream, "(Extended group) push <BAD>");
}
else
{
@@ -151,10 +153,12 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
size -= 1;
if ((rx-size) >= 0)
- util::stream_format(stream, "(Extended group ) pop %s, %s from [%s]",
- extregs[rx-size], extregs[rx], (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
+ util::stream_format(stream, "(Extended group) pop %s, %s from [%s]",
+ extregs[7-rx],
+ extregs[7-(rx-size)],
+ (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
else
- util::stream_format(stream, "(Extended group ) pop <BAD>");
+ util::stream_format(stream, "(Extended group) pop <BAD>");
}
return UNSP_DASM_OK;
}
diff --git a/src/devices/machine/sunplus_gcm394.cpp b/src/devices/machine/sunplus_gcm394.cpp
index f05b551af88..01c8104568e 100644
--- a/src/devices/machine/sunplus_gcm394.cpp
+++ b/src/devices/machine/sunplus_gcm394.cpp
@@ -509,11 +509,33 @@ READ16_MEMBER(generalplus_gpac800_device::unkarea_7850_r)
return machine().rand();
}
+READ16_MEMBER(generalplus_gpac800_device::unkarea_7854_r)
+{
+ m_testval ^= 1;
+
+ logerror("%s:sunplus_gcm394_base_device::unkarea_7854_r\n", machine().describe_context());
+
+ // jak_tsm code looks for various 'magic values'
+
+ if (m_testval == 1)
+ return 0xc2;
+ else
+ return 0x58;
+}
+
+// all tilemap registers etc. appear to be in the same place as the above system, including the 'extra' ones not on the earlier models
+// so it's likely this is built on top of that just with NAND support
void generalplus_gpac800_device::gpac800_internal_map(address_map& map)
{
sunplus_gcm394_base_device::gcm394_internal_map(map);
- map(0x007850, 0x007850).r(FUNC(generalplus_gpac800_device::unkarea_7850_r));
+ // there is an extra command-based device at 785x, what it returns is important to code flow
+ // code is littered with NOPs so clearly the device can't accept commands too quickly and doesn't return data immediately
+ //
+ // this should be the NAND device, as the games attempt to do a DMA operation with '7854' as the source, and the target
+ // as the RAM location where code needs to end up before jumping to it
+ map(0x007850, 0x007850).r(FUNC(generalplus_gpac800_device::unkarea_7850_r)); // 'device ready' status flag?
+ map(0x007854, 0x007854).r(FUNC(generalplus_gpac800_device::unkarea_7854_r)); // data read port (timing appears to be important)
}
void sunplus_gcm394_base_device::device_start()
diff --git a/src/devices/machine/sunplus_gcm394.h b/src/devices/machine/sunplus_gcm394.h
index bebd0df4b15..77c57ba3602 100644
--- a/src/devices/machine/sunplus_gcm394.h
+++ b/src/devices/machine/sunplus_gcm394.h
@@ -283,6 +283,7 @@ public:
generalplus_gpac800_device(mconfig, tag, owner, clock)
{
m_screen.set_tag(std::forward<T>(screen_tag));
+ m_testval = 0;
}
generalplus_gpac800_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
@@ -292,6 +293,9 @@ protected:
private:
DECLARE_READ16_MEMBER(unkarea_7850_r);
+ DECLARE_READ16_MEMBER(unkarea_7854_r);
+
+ int m_testval;
};
diff --git a/src/mame/drivers/sunplus_gcm394.cpp b/src/mame/drivers/sunplus_gcm394.cpp
index 88431cd0162..7663c87ab96 100644
--- a/src/mame/drivers/sunplus_gcm394.cpp
+++ b/src/mame/drivers/sunplus_gcm394.cpp
@@ -631,7 +631,7 @@ void generalplus_gpac800_game_state::nand_init(int blocksize, int blocksize_stri
}
// debug to allow for easy use of unidasm.exe
- if (0)
+ if (1)
{
FILE *fp;
char filename[256];