From 3b5f232c0e5777bfce2619b48f8f82ebf355635e Mon Sep 17 00:00:00 2001 From: David Haywood <28625134+DavidHaywood@users.noreply.github.com> Date: Tue, 17 Dec 2019 16:34:16 +0000 Subject: 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) --- src/devices/cpu/unsp/unsp.h | 5 +- src/devices/cpu/unsp/unsp_extended.cpp | 170 ++++++++++++++++++++++------- src/devices/cpu/unsp/unspdasm.cpp | 2 +- src/devices/cpu/unsp/unspdasm_extended.cpp | 16 ++- src/devices/machine/sunplus_gcm394.cpp | 24 +++- src/devices/machine/sunplus_gcm394.h | 4 + src/mame/drivers/sunplus_gcm394.cpp | 2 +- 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 \n"); - */ - //unimplemented_opcode(op, ximm); + { + logerror("(Ext) push \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 \n"); - */ - //unimplemented_opcode(op, ximm); + { + logerror("(Ext) pop \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 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 "); + util::stream_format(stream, "(Extended group) push "); } 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 "); + util::stream_format(stream, "(Extended group) pop "); } 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(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]; -- cgit v1.2.3