Plug and Play work + New Working clone (#6060)

* sunplus extended work (nw)

* prepare for extended stuff (nw)

* (nw)

* start adding some more unsp20 functionaliy + srcclean (nw)

* new WORKING clone
-----
200 in 1 Retro Arcade [eanbowman]

* (nw)

* (nw)

* minor rename (nw)
This commit is contained in:
David Haywood 2019-12-16 17:04:25 +00:00 committed by Ivan Vangelista
parent 041368786d
commit 4b732835ee
14 changed files with 1930 additions and 107 deletions

View File

@ -13,6 +13,7 @@ ______|___________|______
|Skateboard |Skateboard-shaped motion controller
|Basketball |Ball-shaped motion controller
|Dodgeball |Motion controller
|Baseball |Baseball Bat shaped motion controller
-->
<softwarelist name="tvgogo" description="Toyquest TV Go Go cartridges">

View File

@ -120,6 +120,7 @@ char const* const unsp_device::bitops[] =
"tstb", "setb", "clrb", "invb"
};
// log/barrel shift
char const* const unsp_device::lsft[] =
{
"asr", "asror", "lsl", "lslor", "lsr", "lsror", "rol", "ror"
@ -264,6 +265,28 @@ void unsp_device::device_start()
set_icountptr(m_core->m_icount);
}
void unsp_20_device::device_start()
{
unsp_12_device::device_start();
#if UNSP_LOG_OPCODES || UNSP_LOG_REGS
int baseindex = UNSP_LOG_OPS + 1;
#else
int baseindex = UNSP_SB + 1;
#endif
state_add(baseindex + UNSP20_R8, "R8", m_secondary_r[UNSP20_R8]).formatstr("%04X");
state_add(baseindex + UNSP20_R9, "R9", m_secondary_r[UNSP20_R9]).formatstr("%04X");
state_add(baseindex + UNSP20_R10, "R10", m_secondary_r[UNSP20_R10]).formatstr("%04X");
state_add(baseindex + UNSP20_R11, "R11", m_secondary_r[UNSP20_R11]).formatstr("%04X");
state_add(baseindex + UNSP20_R12, "R12", m_secondary_r[UNSP20_R12]).formatstr("%04X");
state_add(baseindex + UNSP20_R13, "R13", m_secondary_r[UNSP20_R13]).formatstr("%04X");
state_add(baseindex + UNSP20_R14, "R14", m_secondary_r[UNSP20_R14]).formatstr("%04X");
state_add(baseindex + UNSP20_R15, "R15", m_secondary_r[UNSP20_R15]).formatstr("%04X");
save_item(NAME(m_secondary_r));
}
void unsp_device::device_reset()
{
memset(m_core->m_r, 0, sizeof(uint32_t) * 8);
@ -275,6 +298,16 @@ void unsp_device::device_reset()
m_core->m_fiq = 0;
}
void unsp_20_device::device_reset()
{
unsp_12_device::device_reset();
for (int i = 0; i < 8; i++)
{
m_secondary_r[i] = 0;
}
}
void unsp_device::device_stop()
{
if (m_drcfe != nullptr)

View File

@ -346,6 +346,7 @@ protected:
virtual void execute_fxxx_101_group(uint16_t op) override;
virtual void execute_exxx_group(uint16_t op) override;
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
};
@ -361,7 +362,23 @@ protected:
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
virtual void execute_extended_group(uint16_t op) override;
virtual void device_start() override;
virtual void device_reset() override;
private:
uint32_t m_secondary_r[8];
enum
{
UNSP20_R8 = 0,
UNSP20_R9,
UNSP20_R10,
UNSP20_R11,
UNSP20_R12,
UNSP20_R13,
UNSP20_R14,
UNSP20_R15
};
};

File diff suppressed because it is too large Load Diff

View File

@ -120,7 +120,7 @@ void unsp_12_device::execute_exxx_group(uint16_t op)
const uint16_t opb = op & 7;
m_core->m_icount -= 12;
logerror("%s: MUL su with %04x (signed) * %04x (unsigned) : ", machine().describe_context(), m_core->m_r[opa], m_core->m_r[opb]);
logerror("%s: MUL su with %04x (signed) * %04x (unsigned) : ", machine().describe_context(), m_core->m_r[opa], m_core->m_r[opb]);
uint32_t lres = m_core->m_r[opa] * m_core->m_r[opb];
if (m_core->m_r[opa] & 0x8000)
@ -130,7 +130,7 @@ void unsp_12_device::execute_exxx_group(uint16_t op)
m_core->m_r[REG_R4] = lres >> 16;
m_core->m_r[REG_R3] = (uint16_t)lres;
logerror("result was : %08x\n", lres);
logerror("result was : %08x\n", lres);
return;
}

View File

@ -247,13 +247,13 @@ void unsp_12_device::execute_fxxx_101_group(uint16_t op)
case 0xf144: case 0xf344: case 0xf544: case 0xf744: case 0xf944: case 0xfb44: case 0xfd44: case 0xff44:
logerror("unimplemented: fir_mov on\n");
m_core->m_icount -= 1;
m_core->m_icount -= 1;
//unimplemented_opcode(op); // generalplus_gpac800 games do this on startup
return;
case 0xf145: case 0xf345: case 0xf545: case 0xf745: case 0xf945: case 0xfb45: case 0xfd45: case 0xff45:
logerror("unimplemented: fir_mov off\n");
m_core->m_icount -= 1;
logerror("unimplemented: fir_mov off\n");
m_core->m_icount -= 1;
//unimplemented_opcode(op); // generalplus_gpac800 games do this on startup
return;
@ -303,7 +303,7 @@ void unsp_12_device::execute_fxxx_101_group(uint16_t op)
{
m_core->m_r[REG_R2] = count_leading_zeros(r4) - 17; // -17 because count_leading_zeros works with 32-bit values
}
return;
}

View File

@ -59,10 +59,22 @@ void unsp_disassembler::print_alu_op_start(std::ostream &stream, uint8_t op0, ui
{
static const char* const alu_op_start[] =
{
"%s += ", "%s += ", "%s -= ", "%s -= ",
"cmp %s, ", "<BAD>", "%s =- ", "<BAD>",
"%s ^= ", "%s = ", "%s |= ", "%s &= ",
"%s += ",
"%s += ", // with carry
"%s -= ",
"%s -= ", // with carry
"cmp %s, ",
"<BAD>",
"%s =- ", // neg
"<BAD>",
"%s ^= ",
"%s = ", // load
"%s |= ",
"%s &= ",
"test %s, "
"store", // syntax changes
"<BAD>", // bad
"<BAD>", // bad
};
util::stream_format(stream, alu_op_start[op0], regs[opA]);
@ -72,10 +84,22 @@ void unsp_disassembler::print_alu_op3(std::ostream &stream, uint8_t op0, uint8_t
{
static const char* const alu_op3[] =
{
"%s + ", "%s + ", "%s - ", "%s - ",
"cmp %s, ", "<BAD>", "-", "<BAD>",
"%s ^ ", "", "%s | ", "%s & ",
"test %s, "
"%s + ",
"%s + ", // with carry
"%s - ",
"%s - ", // with carry
"cmp %s, ",
"<BAD>",
"-", // neg
"<BAD>",
"%s ^ ",
"", // load
"%s | ",
"%s & ",
"test %s, ",
"store", // syntax changes
"<BAD>",
"<BAD>",
};
util::stream_format(stream, alu_op3[op0], regs[opB]);

View File

@ -29,16 +29,96 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
{
case 0x00: case 0x10:
{
// 2 param form
// Ext Register Ra = Ra op Rb
uint8_t aluop = (ximm & 0xf000) >> 12;
uint8_t rb = (ximm & 0x000f) >> 0;
uint8_t ra = (ximm & 0x0e00) >> 9;
ra |= (ximm & 0x0100) >> 5;
util::stream_format(stream, "(Ext) %s = %s %s %s", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, aluops[aluop]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
switch (aluop)
{
case 0x00: // add
// A += B
util::stream_format(stream, "(Extended group 0) %s += %s", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
break;
case 0x01: // adc
// A += B, Carry
util::stream_format(stream, "(Extended group 0) %s += %s, carry", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
break;
case 0x02: // sub
// A -= B
util::stream_format(stream, "(Extended group 0) %s -= %s", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
break;
case 0x03: // sbc
// A -= B, Carry
util::stream_format(stream, "(Extended group 0) %s -= %s, carry", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
break;
case 0x04: // cmp
// CMP A,B
util::stream_format(stream, "(Extended group 0) cmp %s, %s", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
break;
case 0x06: // neg
// A = -B
util::stream_format(stream, "(Extended group 0) %s = -%s", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
break;
case 0x08: // xor
// A ^= B
util::stream_format(stream, "(Extended group 0) %s ^= %s", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
break;
case 0x09: // load
// A = B
util::stream_format(stream, "(Extended group 0) %s = %s", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
break;
case 0x0a: // or
// A |= B
util::stream_format(stream, "(Extended group 0) %s |= %s", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
break;
case 0x0b: // and
// A &= B
util::stream_format(stream, "(Extended group 0) %s &= %s", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
break;
case 0x0c: // test
// TEST A,B
util::stream_format(stream, "(Extended group 0) test %s, %s", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
break;
case 0x0d: // store
// B = A
util::stream_format(stream, "(Extended group 0) %s = %s", (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
break;
case 0x05: // invalid
case 0x07: // invalid
case 0x0e: // invalid
case 0x0f: // invalid
util::stream_format(stream, "(Extended group 0) <INVALID Ra = Ra op Rb form>");
break;
}
return UNSP_DASM_OK;
}
case 0x02:
@ -56,10 +136,10 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
size -= 1;
if ((rx-size) >= 0)
util::stream_format(stream, "(Ext) push %s, %s to [%s]",
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, "(Ext) push <BAD>");
util::stream_format(stream, "(Extended group ) push <BAD>");
}
else
{
@ -71,16 +151,23 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
size -= 1;
if ((rx-size) >= 0)
util::stream_format(stream, "(Ext) pop %s, %s from [%s]",
util::stream_format(stream, "(Extended group ) pop %s, %s from [%s]",
extregs[rx-size], extregs[rx], (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
else
util::stream_format(stream, "(Ext) pop <BAD>");
util::stream_format(stream, "(Extended group ) pop <BAD>");
}
return UNSP_DASM_OK;
}
case 0x04: case 0x14:
{
// 3 param form
// Ra=Rb op IMM16
// A = Ra
// B = Rb
// C = IMM16
len = 3;
uint16_t imm16_2 = opcodes.r16(pc + 2);
uint8_t aluop = (ximm & 0xf000) >> 12;
@ -88,17 +175,104 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
uint8_t ra = (ximm & 0x0e00) >> 9;
ra |= (ximm & 0x0100) >> 5;
util::stream_format(stream, "(Ext) %s = %s %s %04x", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, aluops[aluop]
, imm16_2);
switch (aluop)
{
case 0x00: // add
// A = B + C
util::stream_format(stream, "(Extended group 1) %s = %s + %04x", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, imm16_2);
break;
case 0x01: // adc
// A = B + C, Carry
util::stream_format(stream, "(Extended group 1) %s = %s + %04x, carry", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, imm16_2);
break;
case 0x02: // sub
// A = B - C
util::stream_format(stream, "(Extended group 1) %s = %s - %04x", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, imm16_2);
break;
case 0x03: // sbc
// A = B - C, Carry
util::stream_format(stream, "(Extended group 1) %s = %s - %04x, carry", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, imm16_2);
break;
case 0x04: // cmp
// CMP B,C
util::stream_format(stream, "(Extended group 1) cmp %s, %04x", (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, imm16_2);
break;
case 0x06: // neg
// A = -C
util::stream_format(stream, "(Extended group 1) %s = -%04x", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, imm16_2);
break;
case 0x08: // xor
// A = B ^ C
util::stream_format(stream, "(Extended group 1) %s = %s ^ %04x", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, imm16_2);
break;
case 0x09: // load
// A = C
util::stream_format(stream, "(Extended group 1) %s = %04x", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, imm16_2);
break;
case 0x0a: // or
// A = B | C
util::stream_format(stream, "(Extended group 1) %s = %s | %04x", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, imm16_2);
break;
case 0x0b: // and
// A = B & C
util::stream_format(stream, "(Extended group 1) %s = %s & %04x", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, imm16_2);
break;
case 0x0c: // test
// TEST B,C
util::stream_format(stream, "(Extended group 1) test %s, %04x", (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, imm16_2);
break;
case 0x0d: // store, C = B, invalid for this mode (would store to immediate)
case 0x05: // invalid
case 0x07: // invalid
case 0x0e: // invalid
case 0x0f: // invalid
util::stream_format(stream, "(Extended group 1) <INVALID Ra=Rb op IMM16 form>");
break;
}
return UNSP_DASM_OK;
}
case 0x06:
case 0x16:
{
// Ra=Rb op [A16]
// 3 param form
// Ra = Rb op [A16]
// A = Ra
// B = Rb
// C = [A16]
len = 3;
uint16_t imm16_2 = opcodes.r16(pc + 2);
uint8_t aluop = (ximm & 0xf000) >> 12;
@ -106,17 +280,111 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
uint8_t ra = (ximm & 0x0e00) >> 9;
ra |= (ximm & 0x0100) >> 5;
util::stream_format(stream, "(Ext) %s = %s %s [%04x]", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, aluops[aluop]
, imm16_2);
switch (aluop)
{
case 0x00: // add
// A = B + C
util::stream_format(stream, "(Extended group 2) %s = %s + [%04x]", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, imm16_2);
break;
case 0x01: // adc
// A = B + C, Carry
util::stream_format(stream, "(Extended group 2) %s = %s + [%04x], carry", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, imm16_2);
break;
case 0x02: // sub
// A = B - C
util::stream_format(stream, "(Extended group 2) %s = %s - [%04x]", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, imm16_2);
break;
case 0x03: // sbc
// A = B - C, Carry
util::stream_format(stream, "(Extended group 2) %s = %s - [%04x], carry", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, imm16_2);
break;
case 0x04: // cmp
// CMP B,C
util::stream_format(stream, "(Extended group 2) cmp %s, [%04x]", (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, imm16_2);
break;
case 0x06: // neg
// A = -C
util::stream_format(stream, "(Extended group 2) %s = -[%04x]", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, imm16_2);
break;
case 0x08: // xor
// A = B ^ C
util::stream_format(stream, "(Extended group 2) %s = %s ^ [%04x]", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, imm16_2);
break;
case 0x09: // load
// A = C
util::stream_format(stream, "(Extended group 2) %s = [%04x]", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, imm16_2);
break;
case 0x0a: // or
// A = B | C
util::stream_format(stream, "(Extended group 2) %s = %s | [%04x]", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, imm16_2);
break;
case 0x0b: // and
// A = B & C
util::stream_format(stream, "(Extended group 2) %s = %s & [%04x]", (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, imm16_2);
break;
case 0x0c: // test
// TEST B,C
util::stream_format(stream, "(Extended group 2) test %s, [%04x]", (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, imm16_2);
break;
case 0x0d: // store
// C = B
util::stream_format(stream, "(Extended group 2) [%04x] = %s", imm16_2
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
break;
case 0x05: // invalid
case 0x07: // invalid
case 0x0e: // invalid
case 0x0f: // invalid
util::stream_format(stream, "(Extended group 2) <INVALID Ra = Rb op [A16] form>");
break;
}
return UNSP_DASM_OK;
}
case 0x07:
case 0x17:
{
// 3 param form
//[A16] = Ra op Rb
// A = [A16]
// B = Rb
// C = Ra
len = 3;
uint16_t imm16_2 = opcodes.r16(pc + 2);
uint8_t aluop = (ximm & 0xf000) >> 12;
@ -124,10 +392,95 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
uint8_t ra = (ximm & 0x0e00) >> 9;
ra |= (ximm & 0x0100) >> 5;
util::stream_format(stream, "(Ext) [0x4x] = %s %s %s", imm16_2
, (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]
, aluops[aluop]
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
switch (aluop)
{
case 0x00: // add
// A = B + C
util::stream_format(stream, "(Extended group 3) [%04x] = %s + %s", imm16_2
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
break;
case 0x01: // adc
// A = B + C, Carry
util::stream_format(stream, "(Extended group 3) [%04x] = %s + %s, carry", imm16_2
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
break;
case 0x02: // sub
// A = B - C
util::stream_format(stream, "(Extended group 3) [%04x] = %s - %s", imm16_2
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
break;
case 0x03: // sbc
// A = B - C, Carry
util::stream_format(stream, "(Extended group 3) [%04x] = %s - %s, carry", imm16_2
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
break;
case 0x04: // cmp (is this even a valid form? [A16] not even used)
// CMP B,C
util::stream_format(stream, "(Extended group 3) cmp %s, %s", (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
break;
case 0x06: // neg
// A = -C
util::stream_format(stream, "(Extended group 3) [%04x] = -%s", imm16_2
, (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
break;
case 0x08: // xor
// A = B ^ C
util::stream_format(stream, "(Extended group 3) [%04x] = %s ^ %s", imm16_2
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
break;
case 0x09: // load
// A = C
util::stream_format(stream, "(Extended group 3) [%04x] = %s", imm16_2
, (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
break;
case 0x0a: // or
// A = B | C
util::stream_format(stream, "(Extended group 3) [%04x] = %s | %s", imm16_2
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
break;
case 0x0b: // and
// A = B & C
util::stream_format(stream, "(Extended group 3) [%04x] = %s & %s", imm16_2
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
break;
case 0x0c: // test (is this even a valid form? [A16] not even used)
// TEST B,C
util::stream_format(stream, "(Extended group 3) test %s, %s", (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]
, (ra & 0x8) ? extregs[ra & 0x7] : regs[ra & 0x7]);
break;
case 0x0d: // store (is this even a valid form? [A16] not even used)
// C = B
util::stream_format(stream, "(Extended group 3) [%04x] = %s", imm16_2
, (rb & 0x8) ? extregs[rb & 0x7] : regs[rb & 0x7]);
break;
case 0x05: // invalid
case 0x07: // invalid
case 0x0e: // invalid
case 0x0f: // invalid
util::stream_format(stream, "(Extended group 3) <INVALID [A16] = Ra op Rb form>");
break;
}
return UNSP_DASM_OK;
}
@ -135,13 +488,98 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
{
// Ext Indirect Rx=Rx op [Ry@]
// A = Rx
// B = [Ry@]
uint8_t aluop = (ximm & 0xf000) >> 12;
uint8_t ry = (ximm & 0x0007) >> 0;
uint8_t form = (ximm & 0x0018) >> 3;
uint8_t rx = (ximm & 0x0e00) >> 9;
util::stream_format(stream, "(Ext) %s=%s %s", extregs[rx], extregs[rx], aluops[aluop]);
util::stream_format(stream, forms[form], extregs[ry]);
switch (aluop)
{
case 0x00: // add
// A += B
util::stream_format(stream, "(Extended group 4) %s += ", extregs[rx]);
util::stream_format(stream, forms[form], extregs[ry]);
break;
case 0x01: // adc
// A += B, Carry
util::stream_format(stream, "(Extended group 4) %s += ", extregs[rx]);
util::stream_format(stream, forms[form], extregs[ry]);
util::stream_format(stream, ", carry");
break;
case 0x02: // sub
// A -= B
util::stream_format(stream, "(Extended group 4) %s -= ", extregs[rx]);
util::stream_format(stream, forms[form], extregs[ry]);
break;
case 0x03: // sbc
// A -= B, Carry
util::stream_format(stream, "(Extended group 4) %s -= ", extregs[rx]);
util::stream_format(stream, forms[form], extregs[ry]);
util::stream_format(stream, ", carry");
break;
case 0x04: // cmp
// CMP A,B
util::stream_format(stream, "(Extended group 4) cmp %s, ", extregs[rx]);
util::stream_format(stream, forms[form], extregs[ry]);
break;
case 0x06: // neg
// A = -B
util::stream_format(stream, "(Extended group 4) %s = -", extregs[rx]);
util::stream_format(stream, forms[form], extregs[ry]);
break;
case 0x08: // xor
// A ^= B
util::stream_format(stream, "(Extended group 4) %s ^= ", extregs[rx]);
util::stream_format(stream, forms[form], extregs[ry]);
break;
case 0x09: // load
// A = B
util::stream_format(stream, "(Extended group 4) %s = ", extregs[rx]);
util::stream_format(stream, forms[form], extregs[ry]);
break;
case 0x0a: // or
// A |= B
util::stream_format(stream, "(Extended group 4) %s |= ", extregs[rx]);
util::stream_format(stream, forms[form], extregs[ry]);
break;
case 0x0b: // and
// A &= B
util::stream_format(stream, "(Extended group 4) %s &= ", extregs[rx]);
util::stream_format(stream, forms[form], extregs[ry]);
break;
case 0x0c: // test
// TEST A,B
util::stream_format(stream, "(Extended group 4) test %s, ", extregs[rx]);
util::stream_format(stream, forms[form], extregs[ry]);
break;
case 0x0d: // store
// B = A
util::stream_format(stream, "(Extended group 4) ");
util::stream_format(stream, forms[form], extregs[ry]);
util::stream_format(stream, " = %s", extregs[rx]);
break;
case 0x05: // invalid
case 0x07: // invalid
case 0x0e: // invalid
case 0x0f: // invalid
util::stream_format(stream, "(Extended group 4) <INVALID Indirect Rx=Rx op [Ry@] form>");
break;
}
return UNSP_DASM_OK;
}
@ -149,13 +587,98 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
{
// Ext DS_Indirect Rx=Rx op ds:[Ry@]
// A = Rx
// B = ds[Ry@]
uint8_t aluop = (ximm & 0xf000) >> 12;
uint8_t ry = (ximm & 0x0007) >> 0;
uint8_t form = (ximm & 0x0018) >> 3;
uint8_t rx = (ximm & 0x0e00) >> 9;
util::stream_format(stream, "(Ext) %s=%s %s ds:", extregs[rx], extregs[rx], aluops[aluop]);
util::stream_format(stream, forms[form], extregs[ry]);
switch (aluop)
{
case 0x00: // add
// A += B
util::stream_format(stream, "(Extended group 5) %s += ds:", extregs[rx]);
util::stream_format(stream, forms[form], extregs[ry]);
break;
case 0x01: // adc
// A += B, Carry
util::stream_format(stream, "(Extended group 5) %s += ds:", extregs[rx]);
util::stream_format(stream, forms[form], extregs[ry]);
util::stream_format(stream, ", carry");
break;
case 0x02: // sub
// A -= B
util::stream_format(stream, "(Extended group 5) %s -= ds:", extregs[rx]);
util::stream_format(stream, forms[form], extregs[ry]);
break;
case 0x03: // sbc
// A -= B, Carry
util::stream_format(stream, "(Extended group 5) %s -= ds:", extregs[rx]);
util::stream_format(stream, forms[form], extregs[ry]);
util::stream_format(stream, ", carry");
break;
case 0x04: // cmp
// CMP A,B
util::stream_format(stream, "(Extended group 5) cmp %s, ds:", extregs[rx]);
util::stream_format(stream, forms[form], extregs[ry]);
break;
case 0x06: // neg
// A = -B
util::stream_format(stream, "(Extended group 5) %s = -ds:", extregs[rx]);
util::stream_format(stream, forms[form], extregs[ry]);
break;
case 0x08: // xor
// A ^= B
util::stream_format(stream, "(Extended group 5) %s ^= ds:", extregs[rx]);
util::stream_format(stream, forms[form], extregs[ry]);
break;
case 0x09: // load
// A = B
util::stream_format(stream, "(Extended group 5) %s = ds:", extregs[rx]);
util::stream_format(stream, forms[form], extregs[ry]);
break;
case 0x0a: // or
// A |= B
util::stream_format(stream, "(Extended group 5) %s |= ds:", extregs[rx]);
util::stream_format(stream, forms[form], extregs[ry]);
break;
case 0x0b: // and
// A &= B
util::stream_format(stream, "(Extended group 5) %s &= ds:", extregs[rx]);
util::stream_format(stream, forms[form], extregs[ry]);
break;
case 0x0c: // test
// TEST A,B
util::stream_format(stream, "(Extended group 5) test %s, ds:", extregs[rx]);
util::stream_format(stream, forms[form], extregs[ry]);
break;
case 0x0d: // store
// B = A
util::stream_format(stream, "(Extended group 5) ds:");
util::stream_format(stream, forms[form], extregs[ry]);
util::stream_format(stream, " = %s", extregs[rx]);
break;
case 0x05: // invalid
case 0x07: // invalid
case 0x0e: // invalid
case 0x0f: // invalid
util::stream_format(stream, "(Extended group 5) <INVALID DS_Indirect Rx=Rx op ds:[Ry@] form>");
break;
}
return UNSP_DASM_OK;
}
@ -167,7 +690,75 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
uint8_t rx = (ximm & 0x0e00) >> 9;
uint8_t imm6 = (ximm & 0x003f) >> 0;
util::stream_format(stream, "(Ext) %s=%s %s %02x", extregs[rx], extregs[rx], aluops[aluop], imm6 );
// A = Rx
// B = IM6
switch (aluop)
{
case 0x00: // add
// A += B
util::stream_format(stream, "(Extended group 6) %s += %02x", extregs[rx], imm6 );
break;
case 0x01: // adc
// A += B, Carry
util::stream_format(stream, "(Extended group 6) %s += %02x, carry", extregs[rx], imm6 );
break;
case 0x02: // sub
// A -= B
util::stream_format(stream, "(Extended group 6) %s -= %02x", extregs[rx], imm6 );
break;
case 0x03: // sbc
// A -= B, Carry
util::stream_format(stream, "(Extended group 6) %s -= %02x, carry", extregs[rx], imm6 );
break;
case 0x04: // cmp
// CMP A,B
util::stream_format(stream, "(Extended group 6) cmp %s, %02x", extregs[rx], imm6 );
break;
case 0x06: // neg
// A = -B
util::stream_format(stream, "(Extended group 6) %s = -%02x", extregs[rx], imm6 );
break;
case 0x08: // xor
// A ^= B
util::stream_format(stream, "(Extended group 6) %s ^= %02x", extregs[rx], imm6 );
break;
case 0x09: // load
// A = B
util::stream_format(stream, "(Extended group 6) %s = %02x", extregs[rx], imm6 );
break;
case 0x0a: // or
// A |= B
util::stream_format(stream, "(Extended group 6) %s |= %02x", extregs[rx], imm6 );
break;
case 0x0b: // and
// A &= B
util::stream_format(stream, "(Extended group 6) %s &= %02x", extregs[rx], imm6 );
break;
case 0x0c: // test
// TEST A,B
util::stream_format(stream, "(Extended group 6) test %s, %02x", extregs[rx], imm6 );
break;
case 0x0d: // store, B = A (invalid for this type)
case 0x05: // invalid
case 0x07: // invalid
case 0x0e: // invalid
case 0x0f: // invalid
util::stream_format(stream, "(Extended group 6) <INVALID IM6 Rx=Rx op IM6 form>");
break;
}
return UNSP_DASM_OK;
}
@ -175,11 +766,83 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
{
// Ext Base+Disp6 Rx=Rx op [BP+IM6]
// A = Rx
// B = [BP+IM6]
uint8_t aluop = (ximm & 0xf000) >> 12;
uint8_t rx = (ximm & 0x0e00) >> 9;
uint8_t imm6 = (ximm & 0x003f) >> 0;
util::stream_format(stream, "(Ext) %s=%s %s [BP+%02x]", extregs[rx], extregs[rx], aluops[aluop], imm6 );
switch (aluop)
{
case 0x00: // add
// A += B
util::stream_format(stream, "(Extended group 7) %s += [BP+%02x]", extregs[rx], imm6 );
break;
case 0x01: // adc
// A += B, Carry
util::stream_format(stream, "(Extended group 7) %s += [BP+%02x], carry", extregs[rx], imm6 );
break;
case 0x02: // sub
// A -= B
util::stream_format(stream, "(Extended group 7) %s -= [BP+%02x]", extregs[rx], imm6 );
break;
case 0x03: // sbc
// A -= B, Carry
util::stream_format(stream, "(Extended group 7) %s -= [BP+%02x], carry", extregs[rx], imm6 );
break;
case 0x04: // cmp
// CMP A,B
util::stream_format(stream, "(Extended group 7) cmp %s, [BP+%02x]", extregs[rx], imm6 );
break;
case 0x06: // neg
// A = -B
util::stream_format(stream, "(Extended group 7) %s = -[BP+%02x]", extregs[rx], imm6 );
break;
case 0x08: // xor
// A ^= B
util::stream_format(stream, "(Extended group 7) %s ^= [BP+%02x]", extregs[rx], imm6 );
break;
case 0x09: // load
// A = B
util::stream_format(stream, "(Extended group 7) %s = [BP+%02x]", extregs[rx], imm6 );
break;
case 0x0a: // or
// A |= B
util::stream_format(stream, "(Extended group 7) %s |= [BP+%02x]", extregs[rx], imm6 );
break;
case 0x0b: // and
// A &= B
util::stream_format(stream, "(Extended group 7) %s &= [BP+%02x]", extregs[rx], imm6 );
break;
case 0x0c: // test
// TEST A,B
util::stream_format(stream, "(Extended group 7) test %s, [BP+%02x]", extregs[rx], imm6 );
break;
case 0x0d: // store
// B = A
util::stream_format(stream, "(Extended group 7) [BP+%02x] = %s", imm6, extregs[rx] );
break;
case 0x05: // invalid
case 0x07: // invalid
case 0x0e: // invalid
case 0x0f: // invalid
util::stream_format(stream, "(Extended group 7) <INVALID Base+Disp6 Rx=Rx op [BP+IM6] form>");
break;
}
return UNSP_DASM_OK;
}
@ -187,11 +850,83 @@ offs_t unsp_20_disassembler::disassemble_extended_group(std::ostream& stream, of
{
// Ext A6 Rx=Rx op [A6]
// A = Rx
// B = [A6]
uint8_t aluop = (ximm & 0xf000) >> 12;
uint8_t rx = (ximm & 0x0e00) >> 9;
uint8_t a6 = (ximm & 0x003f) >> 0;
util::stream_format(stream, "(Ext) %s=%s %s [%02x]", extregs[rx], extregs[rx], aluops[aluop], a6 );
switch (aluop)
{
case 0x00: // add
// A += B
util::stream_format(stream, "(Extended group 8) %s += [%02x]", extregs[rx], a6 );
break;
case 0x01: // adc
// A += B, Carry
util::stream_format(stream, "(Extended group 8) %s += [%02x], carry", extregs[rx], a6 );
break;
case 0x02: // sub
// A -= B
util::stream_format(stream, "(Extended group 8) %s -= [%02x]", extregs[rx], a6 );
break;
case 0x03: // sbc
// A -= B, Carry
util::stream_format(stream, "(Extended group 8) %s -= [%02x], carry", extregs[rx], a6 );
break;
case 0x04: // cmp
// CMP A,B
util::stream_format(stream, "(Extended group 8) cmp %s, [%02x]", extregs[rx], a6 );
break;
case 0x06: // neg
// A = -B
util::stream_format(stream, "(Extended group 8) %s = -[%02x]", extregs[rx], a6 );
break;
case 0x08: // xor
// A ^= B
util::stream_format(stream, "(Extended group 8) %s ^= [%02x]", extregs[rx], a6 );
break;
case 0x09: // load
// A = B
util::stream_format(stream, "(Extended group 8) %s = [%02x]", extregs[rx], a6 );
break;
case 0x0a: // or
// A |= B
util::stream_format(stream, "(Extended group 8) %s |= [%02x]", extregs[rx], a6 );
break;
case 0x0b: // and
// A &= B
util::stream_format(stream, "(Extended group 8) %s &= [%02x]", extregs[rx], a6 );
break;
case 0x0c: // test
// TEST A,B
util::stream_format(stream, "(Extended group 8) test %s, [%02x]", extregs[rx], a6 );
break;
case 0x0d: // store
// B = A
util::stream_format(stream, "(Extended group 8) [%02x] = %s", a6, extregs[rx] );
break;
case 0x05: // invalid
case 0x07: // invalid
case 0x0e: // invalid
case 0x0f: // invalid
util::stream_format(stream, "(Extended group 8) <INVALID A6 Rx=Rx op [A6] form>");
break;
}
return UNSP_DASM_OK;
}
}

View File

@ -133,12 +133,14 @@ offs_t unsp_disassembler::disassemble_remaining(std::ostream& stream, offs_t pc,
// alu, direct memory
case 2:
// TaiKee Guitar has this with op0 == 9
// 4 is cmp, 12 is tst, 6 is neg, 9 is load (all ops that only use one param)
if ((op0 == 4 || op0 == 12 || op0 == 6 /*|| op0 == 9*/) && opA != opB)
{
util::stream_format(stream, "<BAD>");
return UNSP_DASM_OK;
}
if (op0 != 4 && op0 != 12)
if (op0 != 4 && op0 != 12) // 4 is cmp, 12 is tst
util::stream_format(stream, "%s = ", regs[opA]);
print_alu_op3(stream, op0, opB);
len = 2;

View File

@ -29,6 +29,8 @@ public:
void gpl32612(machine_config &config);
void nand_init840();
private:
virtual void machine_start() override;
virtual void machine_reset() override;
@ -38,6 +40,10 @@ private:
required_device<screen_device> m_screen;
uint32_t screen_update_gpl32612(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void nand_init(int blocksize, int blocksize_stripped);
std::vector<uint8_t> m_strippedrom;
};
uint32_t generalplus_gpl32612_game_state::screen_update_gpl32612(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
@ -83,9 +89,50 @@ ROM_START( jak_swbstrik )
ROM_LOAD( "starwarsblaster.bin", 0x000000, 0x8400000, CRC(02c3c4d6) SHA1(a6ae05a7d7b2015023113f6baad25458f3c01102) )
ROM_END
void generalplus_gpl32612_game_state::nand_init(int blocksize, int blocksize_stripped)
{
uint8_t* rom = memregion("maincpu")->base();
int size = memregion("maincpu")->bytes();
int numblocks = size / blocksize;
m_strippedrom.resize(numblocks * blocksize_stripped);
for (int i = 0; i < numblocks; i++)
{
const int base = i * blocksize;
const int basestripped = i * blocksize_stripped;
for (int j = 0; j < blocksize_stripped; j++)
{
m_strippedrom[basestripped + j] = rom[base + j];
}
}
// debug to allow for easy use of unidasm.exe
if (0)
{
FILE *fp;
char filename[256];
sprintf(filename,"stripped_%s", machine().system().name);
fp=fopen(filename, "w+b");
if (fp)
{
fwrite(&m_strippedrom[0], blocksize_stripped * numblocks, 1, fp);
fclose(fp);
}
}
}
void generalplus_gpl32612_game_state::nand_init840()
{
nand_init(0x840, 0x800);
}
// year, name, parent, compat, machine, input, class, init, company, fullname, flags
CONS( 200?, jak_tmnthp, 0, 0, gpl32612, gpl32612, generalplus_gpl32612_game_state, empty_init, "JAKKS Pacific Inc", "Teenage Mutanat Ninja Turtles Hero Portal", MACHINE_IS_SKELETON )
CONS( 200?, jak_swbstrik, 0, 0, gpl32612, gpl32612, generalplus_gpl32612_game_state, empty_init, "JAKKS Pacific Inc", "Star Wars Blaster Strike", MACHINE_IS_SKELETON )
CONS( 200?, jak_tmnthp, 0, 0, gpl32612, gpl32612, generalplus_gpl32612_game_state, nand_init840, "JAKKS Pacific Inc", "Teenage Mutanat Ninja Turtles Hero Portal", MACHINE_IS_SKELETON )
CONS( 200?, jak_swbstrik, 0, 0, gpl32612, gpl32612, generalplus_gpl32612_game_state, nand_init840, "JAKKS Pacific Inc", "Star Wars Blaster Strike", MACHINE_IS_SKELETON )
// Hero Portal Dreamworks Dragons
// Hero Portal Power Rangers
// Hero Portal DC Super Heroes

View File

@ -215,7 +215,7 @@ private:
int calculate_real_video_address(int addr, int extended, int readtype);
required_memory_bank m_prgbank0;
required_memory_bank m_prgbank1;
required_memory_bank m_prgbank2;
@ -246,7 +246,7 @@ class nes_vt_ts_state : public nes_vt_state
public:
nes_vt_ts_state(const machine_config& mconfig, device_type type, const char* tag) :
nes_vt_state(mconfig, type, tag)
{
{
m_initial_e000_bank = 0x03; // or the banking is just different / ROM is scrambled
}
@ -2266,6 +2266,11 @@ ROM_START( mc_tv200 )
ROM_LOAD( "s29gl064n90.bin", 0x00000, 0x800000, CRC(ae1905d2) SHA1(11582055713ba937c1ad32c4ada8683eebc1c83c) )
ROM_END
ROM_START( unkra200 ) // "Winbond 25Q64FVSIG 1324" SPI ROM
ROM_REGION( 0x800000, "mainrom", 0 )
ROM_LOAD( "retro_machine_rom", 0x00000, 0x800000, CRC(0e824aa7) SHA1(957e98868559ecc22b3fa42c76692417b76bf132) )
ROM_END
ROM_START( fcpocket )
ROM_REGION( 0x8000000, "mainrom", 0 )
ROM_LOAD( "s29gl01gp.bin", 0x00000, 0x8000000, CRC(8703b18a) SHA1(07943443294e80ca93f83181c8bdbf950b87c52f) )
@ -2434,6 +2439,8 @@ CONS( 201?, mc_hh210, 0, 0, nes_vt_xx, nes_vt, nes_vt_state, empty_ini
CONS( 201?, dvnimbus, 0, 0, nes_vt_vg, nes_vt, nes_vt_hh_state, empty_init, "<unknown>", "DVTech Nimbus 176 in 1", MACHINE_NOT_WORKING )
// Works fine, VT02 based
CONS( 201?, mc_tv200, 0, 0, nes_vt, nes_vt, nes_vt_state, empty_init, "Thumbs Up", "200 in 1 Retro TV Game", MACHINE_IMPERFECT_GRAPHICS )
// probably another Thumbs Up product? cursor doesn't work unless nes_vt_hh machine is used? possibly newer than VT02 as it runs from an SPI ROM, might just not use enhanced features. Some minor game name changes to above (eg Smackdown just becomes Wrestling)
CONS( 201?, unkra200, mc_tv200, 0, nes_vt_hh, nes_vt, nes_vt_hh_state, empty_init, "<unknown>", "200 in 1 Retro Arcade", MACHINE_IMPERFECT_GRAPHICS )
// New platform with scrambled opcodes, same as DGUN-2561. Runs fine with minor GFX and sound issues in menu
// Use DIP switch to select console or cartridge, as cartridge is fake and just toggles a GPIO
CONS( 2016, fcpocket, 0, 0, nes_vt_fp, nes_vt_fp, nes_vt_hh_state, empty_init, "<unknown>", "FC Pocket 600 in 1", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )

View File

@ -2,7 +2,7 @@
// copyright-holders:David Haywood
/*
SunPlus unSP based hardware, SPG-??? (6xx?) (die is GCM394)
Compared to vii.cpp this is clearly newer, has extra opcodes, different internal map etc. also scaling and higher resolutions based on Spongebob
Smart Fit Park
@ -34,7 +34,7 @@ public:
m_romregion(*this, "maincpu")
{
}
void base(machine_config &config);
@ -89,7 +89,7 @@ protected:
//virtual void machine_reset() override;
void wrlshunt_map(address_map &map);
private:
DECLARE_READ16_MEMBER(hunt_porta_r);
@ -116,7 +116,8 @@ public:
void generalplus_gpac800(machine_config &config);
void nand_init();
void nand_init210();
void nand_init840();
protected:
virtual void machine_reset() override;
@ -124,6 +125,8 @@ protected:
void generalplus_gpac800_map(address_map &map);
private:
void nand_init(int blocksize, int blocksize_stripped);
required_shared_ptr<u16> m_mainram;
std::vector<uint8_t> m_strippedrom;
};
@ -175,7 +178,7 @@ READ16_MEMBER(wrlshunt_game_state::read_external_space)
WRITE16_MEMBER(wrlshunt_game_state::write_external_space)
{
// logerror("DMA writing to external space (RAM?) %08x %04x\n", offset, data);
// logerror("DMA writing to external space (RAM?) %08x %04x\n", offset, data);
if (offset & 0x0800000)
{
@ -217,7 +220,7 @@ READ16_MEMBER(gcm394_game_state::portb_r)
WRITE16_MEMBER(gcm394_game_state::porta_w)
{
logerror("%s: Port A:WRITE %04x\n", machine().describe_context(), data);
}
}
void gcm394_game_state::base(machine_config &config)
@ -230,7 +233,7 @@ void gcm394_game_state::base(machine_config &config)
m_maincpu->space_read_callback().set(FUNC(gcm394_game_state::read_external_space));
m_maincpu->space_write_callback().set(FUNC(gcm394_game_state::write_external_space));
m_maincpu->set_irq_acknowledge_callback(m_maincpu, FUNC(sunplus_gcm394_base_device::irq_vector_cb));
m_maincpu->mapping_write_callback().set(FUNC(gcm394_game_state::mapping_w));
m_maincpu->mapping_write_callback().set(FUNC(gcm394_game_state::mapping_w));
m_maincpu->add_route(ALL_OUTPUTS, "lspeaker", 0.5);
m_maincpu->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
@ -286,7 +289,7 @@ void generalplus_gpac800_game_state::generalplus_gpac800(machine_config &config)
m_maincpu->space_read_callback().set(FUNC(generalplus_gpac800_game_state::read_external_space));
m_maincpu->space_write_callback().set(FUNC(generalplus_gpac800_game_state::write_external_space));
m_maincpu->set_irq_acknowledge_callback(m_maincpu, FUNC(sunplus_gcm394_base_device::irq_vector_cb));
m_maincpu->mapping_write_callback().set(FUNC(generalplus_gpac800_game_state::mapping_w));
m_maincpu->mapping_write_callback().set(FUNC(generalplus_gpac800_game_state::mapping_w));
m_maincpu->add_route(ALL_OUTPUTS, "lspeaker", 0.5);
m_maincpu->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
@ -372,9 +375,9 @@ static INPUT_PORTS_START( gcm394 )
PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CODE(KEYCODE_A) PORT_NAME("Circle / Red") // hold button Circle and Star on startup for test menu (other conditions? doesn't always work?)
PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(KEYCODE_S) PORT_NAME("Square / Orange")
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CODE(KEYCODE_D) PORT_NAME("Triangle / Yellow")
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CODE(KEYCODE_D) PORT_NAME("Triangle / Yellow")
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_CODE(KEYCODE_F) PORT_NAME("Star / Blue")
PORT_START("P2")
PORT_DIPNAME( 0x0001, 0x0001, "P2" )
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
@ -595,7 +598,7 @@ void generalplus_gpac800_game_state::machine_reset()
int dest = m_strippedrom[0x15] << 8;
// copy a block of code from the NAND to RAM
for (int i = 0; i < 0x2000; i++)
for (int i = 0; i < 0x7000-dest; i++)
{
uint16_t word = m_strippedrom[(i * 2) + 0] | (m_strippedrom[(i * 2) + 1] << 8);
@ -607,14 +610,11 @@ void generalplus_gpac800_game_state::machine_reset()
}
void generalplus_gpac800_game_state::nand_init()
void generalplus_gpac800_game_state::nand_init(int blocksize, int blocksize_stripped)
{
uint8_t* rom = memregion("maincpu")->base();
int size = memregion("maincpu")->bytes();
const int blocksize = 0x210;
const int blocksize_stripped = 0x200;
int numblocks = size / blocksize;
m_strippedrom.resize(numblocks * blocksize_stripped);
@ -625,7 +625,7 @@ void generalplus_gpac800_game_state::nand_init()
const int basestripped = i * blocksize_stripped;
for (int j = 0; j < blocksize_stripped; j++)
{
{
m_strippedrom[basestripped + j] = rom[base + j];
}
}
@ -645,12 +645,21 @@ void generalplus_gpac800_game_state::nand_init()
}
}
void generalplus_gpac800_game_state::nand_init210()
{
nand_init(0x210, 0x200);
}
void generalplus_gpac800_game_state::nand_init840()
{
nand_init(0x840, 0x800);
}
// NAND dumps w/ internal bootstrap (and u'nSP 2.0 extended opcodes) (have gpnandnand strings)
// the JAKKS ones seem to be known as 'Generalplus GPAC800' hardware
CONS(2010, wlsair60, 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init, "Jungle Soft / Kids Station Toys Inc", "Wireless Air 60", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
CONS(200?, jak_gtg, 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init, "JAKKS Pacific Inc", "Golden Tee Golf (JAKKS Pacific TV Game)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
CONS(200?, jak_car2, 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init, "JAKKS Pacific Inc", "Cars 2 (JAKKS Pacific TV Game)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
CONS(200?, jak_tsm , 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init, "JAKKS Pacific Inc", "Toy Story Mania (JAKKS Pacific TV Game)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
CONS(200?, vbaby, 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init, "VTech", "V.Baby", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
CONS(200?, beambox, 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init, "Hasbro", "Playskool Heroes Transformers Rescue Bots Beam Box (Spain)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
CONS(2010, wlsair60, 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init840, "Jungle Soft / Kids Station Toys Inc", "Wireless Air 60", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
CONS(200?, jak_gtg, 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init210, "JAKKS Pacific Inc", "Golden Tee Golf (JAKKS Pacific TV Game)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
CONS(200?, jak_car2, 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init210, "JAKKS Pacific Inc", "Cars 2 (JAKKS Pacific TV Game)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
CONS(200?, jak_tsm , 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init210, "JAKKS Pacific Inc", "Toy Story Mania (JAKKS Pacific TV Game)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
CONS(200?, vbaby, 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init840, "VTech", "V.Baby", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
CONS(200?, beambox, 0, 0, generalplus_gpac800, gcm394, generalplus_gpac800_game_state, nand_init210, "Hasbro", "Playskool Heroes Transformers Rescue Bots Beam Box (Spain)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)

View File

@ -651,12 +651,12 @@ void spg2xx_game_state::switch_bank(uint32_t bank)
WRITE8_MEMBER(spg2xx_game_state::i2c_w)
{
logerror("%s: i2c_w %05x %04x\n", machine().describe_context(), offset, data);
logerror("%s: i2c_w %05x %04x\n", machine().describe_context(), offset, data);
}
READ8_MEMBER(spg2xx_game_state::i2c_r)
{
logerror("%s: i2c_r %04x\n", machine().describe_context(), offset);
logerror("%s: i2c_r %04x\n", machine().describe_context(), offset);
return 0x0000;
}
@ -686,7 +686,7 @@ WRITE16_MEMBER(wireless60_state::wireless60_porta_w)
WRITE16_MEMBER(zone40_state::zone40_porta_w)
{
wireless60_porta_w(space, offset, data);
if ((data & 0x00ff) != m_z40_rombase)
{
m_z40_rombase = data & 0x00ff;
@ -2556,7 +2556,7 @@ void wireless60_state::machine_start()
save_item(NAME(m_w60_controller_input));
save_item(NAME(m_w60_porta_data));
m_w60_p1_ctrl_mask = 0x0400;
m_w60_p2_ctrl_mask = 0x0800;
}
@ -2625,7 +2625,7 @@ DEVICE_IMAGE_LOAD_MEMBER(vii_state::cart_load_vii)
image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
return image_init_result::FAIL;
}
m_cart->rom_alloc(size, GENERIC_ROM16_WIDTH, ENDIANNESS_LITTLE);
m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
@ -3838,14 +3838,14 @@ void zone40_state::init_zone40()
ROM[i] = ROM[i] ^ 0xbb88;
ROM[i] = bitswap<16>(ROM[i], 11, 10, 3, 2, 4, 12, 5, 13,
9, 1, 8, 0, 6, 7, 14, 15);
9, 1, 8, 0, 6, 7, 14, 15);
}
}
void wireless60_state::init_lx_jg7415()
{
uint8_t blocks[32] = {
// these parts of the ROM contain the code that gets selected
// these parts of the ROM contain the code that gets selected
0x00, 0x01, 0x06, 0x07, 0x08, 0x09, 0x0e, 0x0f, 0x10, 0x11, 0x16, 0x17, 0x18, 0x19, 0x1e, 0x1f,
// these parts of the ROM contain code / data but go unused, this seems intentional, some of these areas don't read consistently so likely this double size ROM was used knowing that some areas were bad and could be avoided
0x02, 0x03, 0x04, 0x05, 0x0a, 0x0b, 0x0c, 0x0d, 0x12, 0x13, 0x14, 0x15, 0x1a, 0x1b, 0x1c, 0x1d
@ -3855,7 +3855,7 @@ void wireless60_state::init_lx_jg7415()
std::vector<u8> buffer(0x10000000);
for (int addr = 0; addr < 0x10000000; addr++)
{
{
int bank = (addr & 0xf800000) >> 23;
int newbank = blocks[bank];
int newaddr = (addr & 0x07fffff) | (newbank << 23);
@ -3928,7 +3928,7 @@ CONS( 2007, icanguit, 0, 0, icanguit, icanguit, icanguit_state, empty_
CONS( 2006, icanpian, 0, 0, icanpian, icanpian, icanpian_state, empty_init, "Fisher-Price", "I Can Play Piano", MACHINE_IMPERFECT_SOUND ) // 2006 date from Manual
// Toyquest games
CONS( 2005, tvgogo, 0, 0, tvgogo, tvgogo, tvgogo_state, empty_init, "Toyquest", "TV Go Go", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
CONS( 2005, tvgogo, 0, 0, tvgogo, tvgogo, tvgogo_state, empty_init, "Toyquest", "GoGo TV Video Vision", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // or TV Go Go - the game addons call it the 'Video Vision console'
// Similar, SPG260?, scrambled
CONS( 200?, lexizeus, 0, 0, lexizeus, lexizeus, spg2xx_game_state, init_zeus, "Lexibook", "Zeus IG900 20-in-1 (US?)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // bad sound and some corrupt bg tilemap entries in Tiger Rescue, verify ROM data (same game runs in Zone 60 without issue)

View File

@ -31180,6 +31180,7 @@ mc_hh210
dvnimbus
cbrs8
mc_tv200
unkra200
fcpocket
mog_m320
fapocket