summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu
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 /src/devices/cpu
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)
Diffstat (limited to 'src/devices/cpu')
-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
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;
}