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)
This commit is contained in:
David Haywood 2019-12-17 16:34:16 +00:00 committed by R. Belmont
parent bdc90e3a8f
commit 3b5f232c0e
7 changed files with 169 additions and 52 deletions

View File

@ -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();

View File

@ -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 ((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;
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]);
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

View File

@ -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

View File

@ -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;
}

View File

@ -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()

View File

@ -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;
};

View File

@ -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];