diff options
author | 2019-12-17 16:34:16 +0000 | |
---|---|---|
committer | 2019-12-17 11:34:16 -0500 | |
commit | 3b5f232c0e5777bfce2619b48f8f82ebf355635e (patch) | |
tree | 0d2bea204665a4cf12b3e14656f1db265ca3f34c /src/devices/cpu/unsp | |
parent | bdc90e3a8f1f9a68eb72d8e0a22dfdd206855d77 (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)
Diffstat (limited to 'src/devices/cpu/unsp')
-rw-r--r-- | src/devices/cpu/unsp/unsp.h | 5 | ||||
-rw-r--r-- | src/devices/cpu/unsp/unsp_extended.cpp | 170 | ||||
-rw-r--r-- | src/devices/cpu/unsp/unspdasm.cpp | 2 | ||||
-rw-r--r-- | src/devices/cpu/unsp/unspdasm_extended.cpp | 16 |
4 files changed, 142 insertions, 51 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; } |