mirror of
https://github.com/holub/mame
synced 2025-04-24 01:11:11 +03:00
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:
parent
bdc90e3a8f
commit
3b5f232c0e
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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()
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
@ -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];
|
||||
|
Loading…
Reference in New Issue
Block a user