mirror of
https://github.com/holub/mame
synced 2025-06-06 12:53:46 +03:00
pull SunPlus GCM394 titles out of vii.cpp
- it's a newer SoC (with a lot more capabilities, eg rotate, zoom, twice the sound channels) - it uses an updated unSP core (with some extra opcodes) also made the modifications needed to allow for extension of the unSP + disassembler once we've worked out what the extra opcodes are.
This commit is contained in:
parent
858d84c4bc
commit
a816cffe18
@ -2616,6 +2616,8 @@ end
|
|||||||
---------------------------------------------------
|
---------------------------------------------------
|
||||||
--
|
--
|
||||||
--@src/devices/machine/spg2xx.h,MACHINES["SPG2XX"] = true
|
--@src/devices/machine/spg2xx.h,MACHINES["SPG2XX"] = true
|
||||||
|
--@src/devices/machine/spg110.h,MACHINES["SPG2XX"] = true
|
||||||
|
--@src/devices/machine/sunplus_gcm394.h,MACHINES["SPG2XX"] = true
|
||||||
---------------------------------------------------
|
---------------------------------------------------
|
||||||
|
|
||||||
if (MACHINES["SPG2XX"]~=null) then
|
if (MACHINES["SPG2XX"]~=null) then
|
||||||
@ -2634,6 +2636,8 @@ if (MACHINES["SPG2XX"]~=null) then
|
|||||||
MAME_DIR .. "src/devices/machine/spg110.h",
|
MAME_DIR .. "src/devices/machine/spg110.h",
|
||||||
MAME_DIR .. "src/devices/machine/spg110_video.cpp",
|
MAME_DIR .. "src/devices/machine/spg110_video.cpp",
|
||||||
MAME_DIR .. "src/devices/machine/spg110_video.h",
|
MAME_DIR .. "src/devices/machine/spg110_video.h",
|
||||||
|
MAME_DIR .. "src/devices/machine/sunplus_gcm394.cpp",
|
||||||
|
MAME_DIR .. "src/devices/machine/sunplus_gcm394.h",
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -3538,6 +3538,7 @@ files {
|
|||||||
MAME_DIR .. "src/mame/drivers/tvgame.cpp",
|
MAME_DIR .. "src/mame/drivers/tvgame.cpp",
|
||||||
MAME_DIR .. "src/mame/drivers/spg110.cpp",
|
MAME_DIR .. "src/mame/drivers/spg110.cpp",
|
||||||
MAME_DIR .. "src/mame/drivers/vii.cpp",
|
MAME_DIR .. "src/mame/drivers/vii.cpp",
|
||||||
|
MAME_DIR .. "src/mame/drivers/sunplus_gcm394.cpp",
|
||||||
MAME_DIR .. "src/mame/drivers/xavix.cpp",
|
MAME_DIR .. "src/mame/drivers/xavix.cpp",
|
||||||
MAME_DIR .. "src/mame/video/xavix.cpp",
|
MAME_DIR .. "src/mame/video/xavix.cpp",
|
||||||
MAME_DIR .. "src/mame/machine/xavix.cpp",
|
MAME_DIR .. "src/mame/machine/xavix.cpp",
|
||||||
|
@ -22,15 +22,16 @@
|
|||||||
#include "unspdasm.h"
|
#include "unspdasm.h"
|
||||||
|
|
||||||
DEFINE_DEVICE_TYPE(UNSP, unsp_device, "unsp", "SunPlus u'nSP")
|
DEFINE_DEVICE_TYPE(UNSP, unsp_device, "unsp", "SunPlus u'nSP")
|
||||||
|
DEFINE_DEVICE_TYPE(UNSP_NEWER, unsp_newer_device, "unsp_newer", "SunPlus u'nSP (newer)") // found on GCM394 die, has extra instructions
|
||||||
|
|
||||||
/* size of the execution code cache */
|
/* size of the execution code cache */
|
||||||
#define CACHE_SIZE (64 * 1024 * 1024)
|
#define CACHE_SIZE (64 * 1024 * 1024)
|
||||||
|
|
||||||
unsp_device::unsp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
unsp_device::unsp_device(const machine_config& mconfig, device_type type, const char* tag, device_t* owner, uint32_t clock)
|
||||||
: cpu_device(mconfig, UNSP, tag, owner, clock)
|
: cpu_device(mconfig, type, tag, owner, clock)
|
||||||
|
, m_core(nullptr)
|
||||||
, m_program_config("program", ENDIANNESS_BIG, 16, 23, -1)
|
, m_program_config("program", ENDIANNESS_BIG, 16, 23, -1)
|
||||||
, m_program(nullptr)
|
, m_program(nullptr)
|
||||||
, m_core(nullptr)
|
|
||||||
, m_debugger_temp(0)
|
, m_debugger_temp(0)
|
||||||
#if UNSP_LOG_OPCODES || UNSP_LOG_REGS
|
#if UNSP_LOG_OPCODES || UNSP_LOG_REGS
|
||||||
, m_log_ops(0)
|
, m_log_ops(0)
|
||||||
@ -52,6 +53,17 @@ unsp_device::unsp_device(const machine_config &mconfig, const char *tag, device_
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsp_device::unsp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||||
|
: unsp_device(mconfig, UNSP, tag, owner, clock)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
unsp_newer_device::unsp_newer_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||||
|
: unsp_device(mconfig, UNSP_NEWER, tag, owner, clock)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
device_memory_interface::space_config_vector unsp_device::memory_space_config() const
|
device_memory_interface::space_config_vector unsp_device::memory_space_config() const
|
||||||
{
|
{
|
||||||
return space_config_vector {
|
return space_config_vector {
|
||||||
@ -64,6 +76,11 @@ std::unique_ptr<util::disasm_interface> unsp_device::create_disassembler()
|
|||||||
return std::make_unique<unsp_disassembler>();
|
return std::make_unique<unsp_disassembler>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<util::disasm_interface> unsp_newer_device::create_disassembler()
|
||||||
|
{
|
||||||
|
return std::make_unique<unsp_newer_disassembler>();
|
||||||
|
}
|
||||||
|
|
||||||
void unsp_device::unimplemented_opcode(uint16_t op)
|
void unsp_device::unimplemented_opcode(uint16_t op)
|
||||||
{
|
{
|
||||||
fatalerror("UNSP: unknown opcode %04x at %04x\n", op, UNSP_LPC);
|
fatalerror("UNSP: unknown opcode %04x at %04x\n", op, UNSP_LPC);
|
||||||
@ -350,6 +367,17 @@ void unsp_device::add_lpc(const int32_t offset)
|
|||||||
m_core->m_r[REG_SR] |= (new_lpc >> 16) & 0x3f;
|
m_core->m_r[REG_SR] |= (new_lpc >> 16) & 0x3f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void unsp_device::execute_f_group(const uint16_t op)
|
||||||
|
{
|
||||||
|
unimplemented_opcode(op);
|
||||||
|
}
|
||||||
|
|
||||||
|
void unsp_newer_device::execute_f_group(const uint16_t op)
|
||||||
|
{
|
||||||
|
logerror("UNSP: unknown extended opcode %04x at %04x\n", op, UNSP_LPC);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
inline void unsp_device::execute_one(const uint16_t op)
|
inline void unsp_device::execute_one(const uint16_t op)
|
||||||
{
|
{
|
||||||
uint32_t lres = 0;
|
uint32_t lres = 0;
|
||||||
@ -942,6 +970,11 @@ inline void unsp_device::execute_one(const uint16_t op)
|
|||||||
case 0x0d: // Store
|
case 0x0d: // Store
|
||||||
write16(r2, r0);
|
write16(r2, r0);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
case 0x0f: // extended opcodes
|
||||||
|
execute_f_group(op);
|
||||||
|
return;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
unimplemented_opcode(op);
|
unimplemented_opcode(op);
|
||||||
return;
|
return;
|
||||||
|
@ -92,6 +92,7 @@ class unsp_device : public cpu_device
|
|||||||
public:
|
public:
|
||||||
// construction/destruction
|
// construction/destruction
|
||||||
unsp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
unsp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||||
|
unsp_device(const machine_config& mconfig, device_type type, const char* tag, device_t* owner, uint32_t clock);
|
||||||
|
|
||||||
// HACK: IRQ line state can only be modified directly by hardware on-board the SPG SoC itself.
|
// HACK: IRQ line state can only be modified directly by hardware on-board the SPG SoC itself.
|
||||||
// Therefore, to avoid an unnecessary scheduler sync when the external spg2xx_device sets or
|
// Therefore, to avoid an unnecessary scheduler sync when the external spg2xx_device sets or
|
||||||
@ -138,25 +139,6 @@ protected:
|
|||||||
// device_disasm_interface overrides
|
// device_disasm_interface overrides
|
||||||
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
|
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
|
||||||
|
|
||||||
private:
|
|
||||||
// compilation boundaries -- how far back/forward does the analysis extend?
|
|
||||||
enum : uint32_t
|
|
||||||
{
|
|
||||||
COMPILE_BACKWARDS_BYTES = 128,
|
|
||||||
COMPILE_FORWARDS_BYTES = 512,
|
|
||||||
COMPILE_MAX_INSTRUCTIONS = (COMPILE_BACKWARDS_BYTES / 4) + (COMPILE_FORWARDS_BYTES / 4),
|
|
||||||
COMPILE_MAX_SEQUENCE = 64
|
|
||||||
};
|
|
||||||
|
|
||||||
// exit codes
|
|
||||||
enum : int
|
|
||||||
{
|
|
||||||
EXECUTE_OUT_OF_CYCLES = 0,
|
|
||||||
EXECUTE_MISSING_CODE = 1,
|
|
||||||
EXECUTE_UNMAPPED_CODE = 2,
|
|
||||||
EXECUTE_RESET_CACHE = 3
|
|
||||||
};
|
|
||||||
|
|
||||||
enum : uint32_t
|
enum : uint32_t
|
||||||
{
|
{
|
||||||
REG_SP = 0,
|
REG_SP = 0,
|
||||||
@ -169,9 +151,15 @@ private:
|
|||||||
REG_PC
|
REG_PC
|
||||||
};
|
};
|
||||||
|
|
||||||
void add_lpc(const int32_t offset);
|
/* internal compiler state */
|
||||||
|
struct compiler_state
|
||||||
|
{
|
||||||
|
compiler_state(compiler_state const &) = delete;
|
||||||
|
compiler_state &operator=(compiler_state const &) = delete;
|
||||||
|
|
||||||
inline void execute_one(const uint16_t op);
|
uint32_t m_cycles; /* accumulated cycles */
|
||||||
|
uml::code_label m_labelnum; /* index for local labels */
|
||||||
|
};
|
||||||
|
|
||||||
struct internal_unsp_state
|
struct internal_unsp_state
|
||||||
{
|
{
|
||||||
@ -192,14 +180,38 @@ private:
|
|||||||
int m_icount;
|
int m_icount;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* core state */
|
||||||
|
internal_unsp_state *m_core;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// compilation boundaries -- how far back/forward does the analysis extend?
|
||||||
|
enum : uint32_t
|
||||||
|
{
|
||||||
|
COMPILE_BACKWARDS_BYTES = 128,
|
||||||
|
COMPILE_FORWARDS_BYTES = 512,
|
||||||
|
COMPILE_MAX_INSTRUCTIONS = (COMPILE_BACKWARDS_BYTES / 4) + (COMPILE_FORWARDS_BYTES / 4),
|
||||||
|
COMPILE_MAX_SEQUENCE = 64
|
||||||
|
};
|
||||||
|
|
||||||
|
// exit codes
|
||||||
|
enum : int
|
||||||
|
{
|
||||||
|
EXECUTE_OUT_OF_CYCLES = 0,
|
||||||
|
EXECUTE_MISSING_CODE = 1,
|
||||||
|
EXECUTE_UNMAPPED_CODE = 2,
|
||||||
|
EXECUTE_RESET_CACHE = 3
|
||||||
|
};
|
||||||
|
|
||||||
|
void add_lpc(const int32_t offset);
|
||||||
|
|
||||||
|
virtual void execute_f_group(const uint16_t op);
|
||||||
|
inline void execute_one(const uint16_t op);
|
||||||
|
|
||||||
address_space_config m_program_config;
|
address_space_config m_program_config;
|
||||||
address_space *m_program;
|
address_space *m_program;
|
||||||
std::function<u16 (offs_t)> m_pr16;
|
std::function<u16 (offs_t)> m_pr16;
|
||||||
std::function<const void * (offs_t)> m_prptr;
|
std::function<const void * (offs_t)> m_prptr;
|
||||||
|
|
||||||
/* core state */
|
|
||||||
internal_unsp_state *m_core;
|
|
||||||
|
|
||||||
uint32_t m_debugger_temp;
|
uint32_t m_debugger_temp;
|
||||||
#if UNSP_LOG_OPCODES || UNSP_LOG_REGS
|
#if UNSP_LOG_OPCODES || UNSP_LOG_REGS
|
||||||
uint32_t m_log_ops;
|
uint32_t m_log_ops;
|
||||||
@ -235,15 +247,7 @@ private:
|
|||||||
|
|
||||||
bool m_enable_drc;
|
bool m_enable_drc;
|
||||||
|
|
||||||
/* internal compiler state */
|
|
||||||
struct compiler_state
|
|
||||||
{
|
|
||||||
compiler_state(compiler_state const &) = delete;
|
|
||||||
compiler_state &operator=(compiler_state const &) = delete;
|
|
||||||
|
|
||||||
uint32_t m_cycles; /* accumulated cycles */
|
|
||||||
uml::code_label m_labelnum; /* index for local labels */
|
|
||||||
};
|
|
||||||
|
|
||||||
void execute_run_drc();
|
void execute_run_drc();
|
||||||
void flush_drc_cache();
|
void flush_drc_cache();
|
||||||
@ -268,6 +272,7 @@ private:
|
|||||||
void generate_update_nzsc(drcuml_block &block);
|
void generate_update_nzsc(drcuml_block &block);
|
||||||
void generate_update_nz(drcuml_block &block);
|
void generate_update_nz(drcuml_block &block);
|
||||||
void log_add_disasm_comment(drcuml_block &block, uint32_t pc, uint32_t op);
|
void log_add_disasm_comment(drcuml_block &block, uint32_t pc, uint32_t op);
|
||||||
|
virtual bool generate_f_group_opcode(drcuml_block& block, compiler_state& compiler, const opcode_desc* desc);
|
||||||
bool generate_opcode(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc);
|
bool generate_opcode(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc);
|
||||||
|
|
||||||
#if UNSP_LOG_REGS
|
#if UNSP_LOG_REGS
|
||||||
@ -275,7 +280,20 @@ private:
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class unsp_newer_device : public unsp_device
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// construction/destruction
|
||||||
|
unsp_newer_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
|
||||||
|
virtual void execute_f_group(const uint16_t op) override;
|
||||||
|
virtual bool generate_f_group_opcode(drcuml_block& block, compiler_state& compiler, const opcode_desc* desc) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
DECLARE_DEVICE_TYPE(UNSP, unsp_device)
|
DECLARE_DEVICE_TYPE(UNSP, unsp_device)
|
||||||
|
DECLARE_DEVICE_TYPE(UNSP_NEWER, unsp_newer_device)
|
||||||
|
|
||||||
#endif // MAME_CPU_UNSP_UNSP_H
|
#endif // MAME_CPU_UNSP_UNSP_H
|
||||||
|
@ -72,6 +72,46 @@ void unsp_disassembler::print_indirect_op(std::ostream &stream, uint8_t opN, uin
|
|||||||
util::stream_format(stream, forms[opN & 3], regs[opB]);
|
util::stream_format(stream, forms[opN & 3], regs[opB]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
offs_t unsp_disassembler::disassemble_f_group(std::ostream& stream, offs_t pc, uint16_t op, uint16_t ximm, uint8_t opN, uint8_t opA, uint8_t opB, uint32_t len)
|
||||||
|
{
|
||||||
|
switch (opN)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
if (opA == 7)
|
||||||
|
{
|
||||||
|
util::stream_format(stream, "<DUNNO f group>");
|
||||||
|
return UNSP_DASM_OK;
|
||||||
|
}
|
||||||
|
util::stream_format(stream, "mr = %s*%s, us", regs[opA], regs[opB]);
|
||||||
|
return UNSP_DASM_OK;
|
||||||
|
default:
|
||||||
|
util::stream_format(stream, "<DUNNO f group>");
|
||||||
|
return UNSP_DASM_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
offs_t unsp_newer_disassembler::disassemble_f_group(std::ostream& stream, offs_t pc, uint16_t op, uint16_t ximm, uint8_t opN, uint8_t opA, uint8_t opB, uint32_t len)
|
||||||
|
{
|
||||||
|
// these are new opcodes on the later core
|
||||||
|
|
||||||
|
switch (opN)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
if (opA == 7)
|
||||||
|
{
|
||||||
|
util::stream_format(stream, "<EXTENDED f group>");
|
||||||
|
return UNSP_DASM_OK;
|
||||||
|
}
|
||||||
|
util::stream_format(stream, "mr = %s*%s, us", regs[opA], regs[opB]);
|
||||||
|
return UNSP_DASM_OK;
|
||||||
|
default:
|
||||||
|
util::stream_format(stream, "<EXTENDED f group>");
|
||||||
|
return UNSP_DASM_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
offs_t unsp_disassembler::disassemble(std::ostream &stream, offs_t pc, uint16_t op, uint16_t ximm)
|
offs_t unsp_disassembler::disassemble(std::ostream &stream, offs_t pc, uint16_t op, uint16_t ximm)
|
||||||
{
|
{
|
||||||
// the top four bits are the alu op or the branch condition, or E or F
|
// the top four bits are the alu op or the branch condition, or E or F
|
||||||
@ -344,20 +384,7 @@ offs_t unsp_disassembler::disassemble(std::ostream &stream, offs_t pc, uint16_t
|
|||||||
|
|
||||||
|
|
||||||
case 0x0f:
|
case 0x0f:
|
||||||
switch (opN)
|
return disassemble_f_group(stream, pc, op, ximm, opN, opA, opB, len);
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
if (opA == 7)
|
|
||||||
{
|
|
||||||
util::stream_format(stream, "<DUNNO>");
|
|
||||||
return UNSP_DASM_OK;
|
|
||||||
}
|
|
||||||
util::stream_format(stream, "mr = %s*%s, us", regs[opA], regs[opB]);
|
|
||||||
return UNSP_DASM_OK;
|
|
||||||
default:
|
|
||||||
util::stream_format(stream, "<DUNNO>");
|
|
||||||
return UNSP_DASM_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 0x4f:
|
case 0x4f:
|
||||||
switch (opN)
|
switch (opN)
|
||||||
|
@ -23,16 +23,33 @@ public:
|
|||||||
|
|
||||||
virtual u32 opcode_alignment() const override;
|
virtual u32 opcode_alignment() const override;
|
||||||
virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override;
|
virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override;
|
||||||
|
|
||||||
offs_t disassemble(std::ostream &stream, offs_t pc, uint16_t op, uint16_t imm16);
|
offs_t disassemble(std::ostream &stream, offs_t pc, uint16_t op, uint16_t imm16);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual offs_t disassemble_f_group(std::ostream& stream, offs_t pc, uint16_t op, uint16_t ximm, uint8_t opN, uint8_t opA, uint8_t opB, uint32_t len);
|
||||||
|
|
||||||
|
static char const *const regs[];
|
||||||
|
static char const *const jumps[];
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void print_alu_op_start(std::ostream &stream, uint8_t op0, uint8_t opA);
|
void print_alu_op_start(std::ostream &stream, uint8_t op0, uint8_t opA);
|
||||||
void print_alu_op3(std::ostream &stream, uint8_t op0, uint8_t opB);
|
void print_alu_op3(std::ostream &stream, uint8_t op0, uint8_t opB);
|
||||||
void print_alu_op_end(std::ostream &stream, uint8_t op0);
|
void print_alu_op_end(std::ostream &stream, uint8_t op0);
|
||||||
void print_indirect_op(std::ostream &stream, uint8_t opN, uint8_t opB);
|
void print_indirect_op(std::ostream &stream, uint8_t opN, uint8_t opB);
|
||||||
|
|
||||||
static char const *const regs[];
|
|
||||||
static char const *const jumps[];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class unsp_newer_disassembler : public unsp_disassembler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
unsp_newer_disassembler() = default;
|
||||||
|
virtual ~unsp_newer_disassembler() = default;
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual offs_t disassemble_f_group(std::ostream& stream, offs_t pc, uint16_t op, uint16_t ximm, uint8_t opN, uint8_t opA, uint8_t opB, uint32_t len) override;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -677,6 +677,18 @@ void unsp_device::generate_update_nz(drcuml_block &block)
|
|||||||
single opcode
|
single opcode
|
||||||
------------------------------------------------------------------*/
|
------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
bool unsp_device::generate_f_group_opcode(drcuml_block& block, compiler_state& compiler, const opcode_desc* desc)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool unsp_newer_device::generate_f_group_opcode(drcuml_block& block, compiler_state& compiler, const opcode_desc* desc)
|
||||||
|
{
|
||||||
|
// TODO: handle the extended opcodes
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool unsp_device::generate_opcode(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc)
|
bool unsp_device::generate_opcode(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc)
|
||||||
{
|
{
|
||||||
uint32_t op = (uint32_t)desc->opptr.w[0];
|
uint32_t op = (uint32_t)desc->opptr.w[0];
|
||||||
@ -1298,6 +1310,9 @@ bool unsp_device::generate_opcode(drcuml_block &block, compiler_state &compiler,
|
|||||||
UML_CALLH(block, *m_mem_write);
|
UML_CALLH(block, *m_mem_write);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
case 0x0f: // Extended
|
||||||
|
return generate_f_group_opcode(block, compiler, desc);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
49
src/devices/machine/sunplus_gcm394.cpp
Normal file
49
src/devices/machine/sunplus_gcm394.cpp
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
// license:BSD-3-Clause
|
||||||
|
// copyright-holders:David Haywood
|
||||||
|
/*****************************************************************************
|
||||||
|
|
||||||
|
SunPlus "GCM394" (based on die pictures)
|
||||||
|
|
||||||
|
**********************************************************************/
|
||||||
|
|
||||||
|
#include "emu.h"
|
||||||
|
#include "sunplus_gcm394.h"
|
||||||
|
|
||||||
|
DEFINE_DEVICE_TYPE(GCM394, sunplus_gcm394_device, "gcm394", "SunPlus GCM394 System-on-a-Chip")
|
||||||
|
|
||||||
|
sunplus_gcm394_device::sunplus_gcm394_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||||
|
: sunplus_gcm394_base_device(mconfig, GCM394, tag, owner, clock)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
READ16_MEMBER(sunplus_gcm394_base_device::unk_r)
|
||||||
|
{
|
||||||
|
logerror("%s:sunplus_gcm394_base_device::unk_r @ 0x%04x\n", machine().describe_context(), offset + 0x7000);
|
||||||
|
return 0x00;
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE16_MEMBER(sunplus_gcm394_base_device::unk_w)
|
||||||
|
{
|
||||||
|
logerror("%s:sunplus_gcm394_base_device::unk_w @ 0x%04x (data 0x%04x)\n", machine().describe_context(), offset + 0x7000, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void sunplus_gcm394_base_device::map(address_map &map)
|
||||||
|
{
|
||||||
|
map(0x000000, 0x006fff).ram();
|
||||||
|
map(0x007000, 0x007fff).rw(FUNC(sunplus_gcm394_base_device::unk_r), FUNC(sunplus_gcm394_base_device::unk_w));
|
||||||
|
}
|
||||||
|
|
||||||
|
void sunplus_gcm394_base_device::device_start()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void sunplus_gcm394_base_device::device_reset()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void sunplus_gcm394_device::device_add_mconfig(machine_config &config)
|
||||||
|
{
|
||||||
|
//SUNPLUS_GCM394_AUDIO(config, m_spg_audio, DERIVED_CLOCK(1, 1));
|
||||||
|
//m_spg_audio->add_route(0, *this, 1.0, AUTO_ALLOC_INPUT, 0);
|
||||||
|
//m_spg_audio->add_route(1, *this, 1.0, AUTO_ALLOC_INPUT, 1);
|
||||||
|
}
|
66
src/devices/machine/sunplus_gcm394.h
Normal file
66
src/devices/machine/sunplus_gcm394.h
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
// license:BSD-3-Clause
|
||||||
|
// copyright-holders:David Haywood
|
||||||
|
/*****************************************************************************
|
||||||
|
|
||||||
|
SunPlus "GCM394" (based on die pictures)
|
||||||
|
|
||||||
|
**********************************************************************/
|
||||||
|
|
||||||
|
#ifndef MAME_MACHINE_SUNPLUS_GCM394_H
|
||||||
|
#define MAME_MACHINE_SUNPLUS_GCM394_H
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "cpu/unsp/unsp.h"
|
||||||
|
#include "screen.h"
|
||||||
|
|
||||||
|
class sunplus_gcm394_base_device : public device_t, public device_mixer_interface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
sunplus_gcm394_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
|
||||||
|
: device_t(mconfig, type, tag, owner, clock)
|
||||||
|
, device_mixer_interface(mconfig, *this, 2)
|
||||||
|
, m_cpu(*this, finder_base::DUMMY_TAG)
|
||||||
|
, m_screen(*this, finder_base::DUMMY_TAG)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void map(address_map &map);
|
||||||
|
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(vblank) { /*m_spg_video->vblank(state);*/ }
|
||||||
|
uint32_t screen_update(screen_device& screen, bitmap_rgb32& bitmap, const rectangle& cliprect) { return 0; /* m_spg_video->screen_update(screen, bitmap, cliprect);*/ }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
virtual void device_start() override;
|
||||||
|
virtual void device_reset() override;
|
||||||
|
|
||||||
|
required_device<unsp_device> m_cpu;
|
||||||
|
required_device<screen_device> m_screen;
|
||||||
|
|
||||||
|
private:
|
||||||
|
DECLARE_READ16_MEMBER(unk_r);
|
||||||
|
DECLARE_WRITE16_MEMBER(unk_w);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class sunplus_gcm394_device : public sunplus_gcm394_base_device
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
template <typename T, typename U>
|
||||||
|
sunplus_gcm394_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock, T&& cpu_tag, U&& screen_tag)
|
||||||
|
: sunplus_gcm394_device(mconfig, tag, owner, clock)
|
||||||
|
{
|
||||||
|
m_cpu.set_tag(std::forward<T>(cpu_tag));
|
||||||
|
m_screen.set_tag(std::forward<U>(screen_tag));
|
||||||
|
}
|
||||||
|
|
||||||
|
sunplus_gcm394_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock);
|
||||||
|
|
||||||
|
virtual void device_add_mconfig(machine_config& config) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
DECLARE_DEVICE_TYPE(GCM394, sunplus_gcm394_device)
|
||||||
|
|
||||||
|
#endif // MAME_MACHINE_SUNPLUS_GCM394_H
|
@ -2330,5 +2330,8 @@ GAME( 1999, play2000, 0, play2000, play2000, gaelco2_state, i
|
|||||||
GAME( 1999, play2000_50i,play2000, play2000, play2000, gaelco2_state, empty_init, ROT0, "Nova Desitec", "Play 2000 (Super Slot & Gran Tesoro) (v5.0i) (Italy)", MACHINE_NOT_WORKING ) // bad dump
|
GAME( 1999, play2000_50i,play2000, play2000, play2000, gaelco2_state, empty_init, ROT0, "Nova Desitec", "Play 2000 (Super Slot & Gran Tesoro) (v5.0i) (Italy)", MACHINE_NOT_WORKING ) // bad dump
|
||||||
GAME( 1999, play2000_40i,play2000, play2000, play2000, gaelco2_state, init_play2000, ROT0, "Nova Desitec", "Play 2000 (Super Slot & Gran Tesoro) (v4.0i) (Italy)", 0 )
|
GAME( 1999, play2000_40i,play2000, play2000, play2000, gaelco2_state, init_play2000, ROT0, "Nova Desitec", "Play 2000 (Super Slot & Gran Tesoro) (v4.0i) (Italy)", 0 )
|
||||||
|
|
||||||
// Gym exercise bike
|
// Gym equipment
|
||||||
GAME( 1997, saltcrdi, 0, saltcrdi, saltcrdi, gaelco2_state, empty_init, ROT0, "Salter Fitness / Gaelco", "Pro Tele Cardioline (Salter Fitness Bike V.1.0, Checksum 02AB)", MACHINE_NOT_WORKING ) // there are other machines in the Cardioline series, without TV displays
|
GAME( 1997, saltcrdi, 0, saltcrdi, saltcrdi, gaelco2_state, empty_init, ROT0, "Salter Fitness / Gaelco", "Pro Cycle Tele Cardioline (Salter Fitness Bike V.1.0, Checksum 02AB)", MACHINE_NOT_WORKING )
|
||||||
|
// Pro Reclimber Tele
|
||||||
|
// Pro Stepper Tele
|
||||||
|
// there are other devices in Cardioline series that don't use displays
|
||||||
|
200
src/mame/drivers/sunplus_gcm394.cpp
Normal file
200
src/mame/drivers/sunplus_gcm394.cpp
Normal file
@ -0,0 +1,200 @@
|
|||||||
|
// license:BSD-3-Clause
|
||||||
|
// 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
|
||||||
|
SpongeBob SquarePants Bikini Bottom 500
|
||||||
|
Spiderman - The Masked Menace 'Spider Sense' (pad type with Spiderman model)
|
||||||
|
(Wireless Hunting? - maybe, register map looks the same even if it sets stack to 2fff not 6fff)
|
||||||
|
|
||||||
|
as these use newer opcodes in the FExx range they probably need a derived unSP type too
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "emu.h"
|
||||||
|
|
||||||
|
#include "machine/sunplus_gcm394.h"
|
||||||
|
#include "machine/spg2xx.h"
|
||||||
|
|
||||||
|
#include "screen.h"
|
||||||
|
#include "speaker.h"
|
||||||
|
|
||||||
|
|
||||||
|
class gcm394_game_state : public driver_device
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
gcm394_game_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||||
|
: driver_device(mconfig, type, tag)
|
||||||
|
, m_maincpu(*this, "maincpu")
|
||||||
|
, m_screen(*this, "screen")
|
||||||
|
, m_spg(*this, "spg")
|
||||||
|
, m_bank(*this, "cartbank")
|
||||||
|
{ }
|
||||||
|
|
||||||
|
void base(machine_config &config);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void machine_start() override;
|
||||||
|
virtual void machine_reset() override;
|
||||||
|
|
||||||
|
void switch_bank(uint32_t bank);
|
||||||
|
|
||||||
|
required_device<unsp_device> m_maincpu;
|
||||||
|
required_device<screen_device> m_screen;
|
||||||
|
required_device<sunplus_gcm394_device> m_spg;
|
||||||
|
|
||||||
|
optional_memory_bank m_bank;
|
||||||
|
|
||||||
|
virtual void mem_map_4m(address_map &map);
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint32_t m_current_bank;
|
||||||
|
};
|
||||||
|
|
||||||
|
void gcm394_game_state::base(machine_config &config)
|
||||||
|
{
|
||||||
|
GCM394(config, m_spg, XTAL(27'000'000), m_maincpu, m_screen);
|
||||||
|
|
||||||
|
UNSP_NEWER(config, m_maincpu, XTAL(27'000'000));
|
||||||
|
m_maincpu->set_addrmap(AS_PROGRAM, &gcm394_game_state::mem_map_4m);
|
||||||
|
|
||||||
|
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||||
|
m_screen->set_refresh_hz(60);
|
||||||
|
m_screen->set_size(320, 262);
|
||||||
|
m_screen->set_visarea(0, 320-1, 0, 240-1);
|
||||||
|
m_screen->set_screen_update("spg", FUNC(sunplus_gcm394_device::screen_update));
|
||||||
|
m_screen->screen_vblank().set(m_spg, FUNC(sunplus_gcm394_device::vblank));
|
||||||
|
|
||||||
|
SPEAKER(config, "lspeaker").front_left();
|
||||||
|
SPEAKER(config, "rspeaker").front_right();
|
||||||
|
m_spg->add_route(ALL_OUTPUTS, "lspeaker", 0.5);
|
||||||
|
m_spg->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void gcm394_game_state::switch_bank(uint32_t bank)
|
||||||
|
{
|
||||||
|
if (bank != m_current_bank)
|
||||||
|
{
|
||||||
|
m_current_bank = bank;
|
||||||
|
m_bank->set_entry(bank);
|
||||||
|
m_maincpu->invalidate_cache();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void gcm394_game_state::machine_start()
|
||||||
|
{
|
||||||
|
m_bank->configure_entries(0, (memregion("maincpu")->bytes() + 0x7fffff) / 0x800000, memregion("maincpu")->base(), 0x800000);
|
||||||
|
m_bank->set_entry(0);
|
||||||
|
|
||||||
|
save_item(NAME(m_current_bank));
|
||||||
|
}
|
||||||
|
|
||||||
|
void gcm394_game_state::machine_reset()
|
||||||
|
{
|
||||||
|
m_current_bank = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void gcm394_game_state::mem_map_4m(address_map &map)
|
||||||
|
{
|
||||||
|
map(0x000000, 0x3fffff).bankr("cartbank");
|
||||||
|
map(0x000000, 0x007fff).m(m_spg, FUNC(sunplus_gcm394_device::map));
|
||||||
|
}
|
||||||
|
|
||||||
|
static INPUT_PORTS_START( gcm394 )
|
||||||
|
INPUT_PORTS_END
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Wireless Hunting Video Game System
|
||||||
|
(info provided with dump)
|
||||||
|
|
||||||
|
System: Wireless Hunting Video Game System
|
||||||
|
Publisher: Hamy / Kids Station Toys Inc
|
||||||
|
Year: 2011
|
||||||
|
ROM: FDI MSP55LV100G
|
||||||
|
RAM: Micron Technology 48LC8M16A2
|
||||||
|
|
||||||
|
Games:
|
||||||
|
|
||||||
|
Secret Mission
|
||||||
|
Predator
|
||||||
|
Delta Force
|
||||||
|
Toy Land
|
||||||
|
Dream Forest
|
||||||
|
Trophy Season
|
||||||
|
Freedom Force
|
||||||
|
Be Careful
|
||||||
|
Net Power
|
||||||
|
Open Training
|
||||||
|
Super Archer
|
||||||
|
Ultimate Frisbee
|
||||||
|
UFO Shooting
|
||||||
|
Happy Darts
|
||||||
|
Balloon Shoot
|
||||||
|
Avatair
|
||||||
|
Angry Pirate
|
||||||
|
Penguin War
|
||||||
|
Ghost Shooter
|
||||||
|
Duck Hunt
|
||||||
|
|
||||||
|
|
||||||
|
ROM Board:
|
||||||
|
|
||||||
|
Package: SO44
|
||||||
|
Spacing: 1.27 mm
|
||||||
|
Width: 16.14 mm
|
||||||
|
Length: 27.78 mm
|
||||||
|
Voltage: 3V
|
||||||
|
Pinout:
|
||||||
|
|
||||||
|
A25 A24
|
||||||
|
| |
|
||||||
|
+--------------------------+
|
||||||
|
A21 --|== # # `.__.' ==|-- A20
|
||||||
|
A18 --|== ==|-- A19
|
||||||
|
A17 --|== ==|-- A8
|
||||||
|
A7 --|== ==|-- A9
|
||||||
|
A6 --|== o ==|-- A10
|
||||||
|
A5 --|== +----------------+ ==|-- A11
|
||||||
|
A4 --|== | | ==|-- A12
|
||||||
|
A3 --|== | MSP55LV100G | ==|-- A13
|
||||||
|
A2 --|== | 0834 M02H | ==|-- A14
|
||||||
|
A1 --|== | JAPAN | ==|-- A15
|
||||||
|
A0 --|== | | ==|-- A16
|
||||||
|
#CE --|== | | ==|-- A23
|
||||||
|
GND --|== | | ==|-- A22
|
||||||
|
#OE --|== | | ==|-- Q15
|
||||||
|
Q0 --|== | | ==|-- Q7
|
||||||
|
Q8 --|== | | ==|-- Q14
|
||||||
|
Q1 --|== +----------------+ ==|-- Q6
|
||||||
|
Q9 --|== ==|-- Q13
|
||||||
|
Q2 --|== M55L100G ==|-- Q5
|
||||||
|
Q10 --|== ==|-- Q12
|
||||||
|
Q3 --|== ==|-- Q4
|
||||||
|
Q11 --|== ==|-- VCC
|
||||||
|
+--------------------------+
|
||||||
|
|
||||||
|
|
||||||
|
The only interesting string in this ROM is SPF2ALP,
|
||||||
|
which is also found in the Wireless Air 60 ROM.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
ROM_START(wrlshunt)
|
||||||
|
ROM_REGION(0x8000000, "maincpu", ROMREGION_ERASE00)
|
||||||
|
ROM_LOAD16_WORD_SWAP("wireless.bin", 0x0000, 0x8000000, CRC(a6ecc20e) SHA1(3645f23ba2bb218e92d4560a8ae29dddbaabf796))
|
||||||
|
ROM_END
|
||||||
|
|
||||||
|
ROM_START(smartfp) // this has data in the area that would usually be covered by the SPG, is it accessible somehow this time?
|
||||||
|
ROM_REGION(0x800000, "maincpu", ROMREGION_ERASE00)
|
||||||
|
ROM_LOAD16_WORD_SWAP("smartfitpark.bin", 0x000000, 0x800000, CRC(ada84507) SHA1(a3a80bf71fae62ebcbf939166a51d29c24504428))
|
||||||
|
ROM_END
|
||||||
|
|
||||||
|
|
||||||
|
CONS(2011, wrlshunt, 0, 0, base, gcm394, gcm394_game_state, empty_init, "Hamy / Kids Station Toys Inc", "Wireless Hunting Video Game System", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
|
||||||
|
|
||||||
|
CONS(2009, smartfp, 0, 0, base, gcm394, gcm394_game_state, empty_init, "Fisher-Price", "Fun 2 Learn Smart Fit Park", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
|
||||||
|
// Fun 2 Learn 3-in-1 SMART SPORTS ?
|
@ -76,20 +76,13 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
These are definitely different
|
These are definitely different but still unSP based
|
||||||
|
|
||||||
"SunPlus PA7801" ( known as Sunplus SPG110? ) see spg110.cpp instead
|
"SunPlus PA7801" ( known as Sunplus SPG110? )
|
||||||
|
- see spg110.cpp instead
|
||||||
|
|
||||||
Classic Arcade Pinball
|
"GCM394" (this is clearly newer, has extra opcodes, different internal map etc. also scaling and higher resolutions based on Spongebob)
|
||||||
EA Sports (NHL95 + Madden 95)
|
- see sunplus_gcm394.cpp instead
|
||||||
Spiderman 5-in-1 (original release)
|
|
||||||
|
|
||||||
"GCM394" (this is clearly newer, has extra opcodes, different internal map etc. also scaling and higher resolutions based on Spongebob)
|
|
||||||
|
|
||||||
Smart Fit Park
|
|
||||||
SpongeBob SquarePants Bikini Bottom 500
|
|
||||||
Spiderman - The Masked Menace 'Spider Sense' (pad type with Spiderman model)
|
|
||||||
(Wireless Hunting? - maybe)
|
|
||||||
|
|
||||||
Status:
|
Status:
|
||||||
|
|
||||||
@ -1439,14 +1432,14 @@ INPUT_PORTS_END
|
|||||||
|
|
||||||
READ16_MEMBER(dreamlif_state::portb_r)
|
READ16_MEMBER(dreamlif_state::portb_r)
|
||||||
{
|
{
|
||||||
// some kind of EEPROM device?
|
// some kind of EEPROM device? has a HT93LC66A
|
||||||
logerror("%s: portb_r\n", machine().describe_context());
|
logerror("%s: portb_r\n", machine().describe_context());
|
||||||
return 0x0000;
|
return 0x0000;
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(dreamlif_state::portb_w)
|
WRITE16_MEMBER(dreamlif_state::portb_w)
|
||||||
{
|
{
|
||||||
// some kind of EEPROM device?
|
// some kind of EEPROM device? see above
|
||||||
logerror("%s: portb_w (%04x)\n", machine().describe_context(), data);
|
logerror("%s: portb_w (%04x)\n", machine().describe_context(), data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2190,10 +2183,6 @@ ROM_START( dreamlif )
|
|||||||
ROM_LOAD16_WORD_SWAP( "dreamlife.bin", 0x000000, 0x800000, CRC(632e0237) SHA1(a8586e8a626d75cf7782f13cfd9f1b938af23d56) )
|
ROM_LOAD16_WORD_SWAP( "dreamlife.bin", 0x000000, 0x800000, CRC(632e0237) SHA1(a8586e8a626d75cf7782f13cfd9f1b938af23d56) )
|
||||||
ROM_END
|
ROM_END
|
||||||
|
|
||||||
ROM_START( smartfp )
|
|
||||||
ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
|
|
||||||
ROM_LOAD16_WORD_SWAP( "smartfitpark.bin", 0x000000, 0x800000, CRC(ada84507) SHA1(a3a80bf71fae62ebcbf939166a51d29c24504428) )
|
|
||||||
ROM_END
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -2235,88 +2224,6 @@ ROM_START( wlsair60 )
|
|||||||
ROM_LOAD16_WORD_SWAP( "wlsair60.nand", 0x0000, 0x8400000, CRC(eec23b97) SHA1(1bb88290cf54579a5bb51c08a02d793cd4d79f7a) )
|
ROM_LOAD16_WORD_SWAP( "wlsair60.nand", 0x0000, 0x8400000, CRC(eec23b97) SHA1(1bb88290cf54579a5bb51c08a02d793cd4d79f7a) )
|
||||||
ROM_END
|
ROM_END
|
||||||
|
|
||||||
/*
|
|
||||||
Wireless Hunting Video Game System
|
|
||||||
(info provided with dump)
|
|
||||||
|
|
||||||
System: Wireless Hunting Video Game System
|
|
||||||
Publisher: Hamy / Kids Station Toys Inc
|
|
||||||
Year: 2011
|
|
||||||
ROM: FDI MSP55LV100G
|
|
||||||
RAM: Micron Technology 48LC8M16A2
|
|
||||||
|
|
||||||
Games:
|
|
||||||
|
|
||||||
Secret Mission
|
|
||||||
Predator
|
|
||||||
Delta Force
|
|
||||||
Toy Land
|
|
||||||
Dream Forest
|
|
||||||
Trophy Season
|
|
||||||
Freedom Force
|
|
||||||
Be Careful
|
|
||||||
Net Power
|
|
||||||
Open Training
|
|
||||||
Super Archer
|
|
||||||
Ultimate Frisbee
|
|
||||||
UFO Shooting
|
|
||||||
Happy Darts
|
|
||||||
Balloon Shoot
|
|
||||||
Avatair
|
|
||||||
Angry Pirate
|
|
||||||
Penguin War
|
|
||||||
Ghost Shooter
|
|
||||||
Duck Hunt
|
|
||||||
|
|
||||||
|
|
||||||
ROM Board:
|
|
||||||
|
|
||||||
Package: SO44
|
|
||||||
Spacing: 1.27 mm
|
|
||||||
Width: 16.14 mm
|
|
||||||
Length: 27.78 mm
|
|
||||||
Voltage: 3V
|
|
||||||
Pinout:
|
|
||||||
|
|
||||||
A25 A24
|
|
||||||
| |
|
|
||||||
+--------------------------+
|
|
||||||
A21 --|== # # `.__.' ==|-- A20
|
|
||||||
A18 --|== ==|-- A19
|
|
||||||
A17 --|== ==|-- A8
|
|
||||||
A7 --|== ==|-- A9
|
|
||||||
A6 --|== o ==|-- A10
|
|
||||||
A5 --|== +----------------+ ==|-- A11
|
|
||||||
A4 --|== | | ==|-- A12
|
|
||||||
A3 --|== | MSP55LV100G | ==|-- A13
|
|
||||||
A2 --|== | 0834 M02H | ==|-- A14
|
|
||||||
A1 --|== | JAPAN | ==|-- A15
|
|
||||||
A0 --|== | | ==|-- A16
|
|
||||||
#CE --|== | | ==|-- A23
|
|
||||||
GND --|== | | ==|-- A22
|
|
||||||
#OE --|== | | ==|-- Q15
|
|
||||||
Q0 --|== | | ==|-- Q7
|
|
||||||
Q8 --|== | | ==|-- Q14
|
|
||||||
Q1 --|== +----------------+ ==|-- Q6
|
|
||||||
Q9 --|== ==|-- Q13
|
|
||||||
Q2 --|== M55L100G ==|-- Q5
|
|
||||||
Q10 --|== ==|-- Q12
|
|
||||||
Q3 --|== ==|-- Q4
|
|
||||||
Q11 --|== ==|-- VCC
|
|
||||||
+--------------------------+
|
|
||||||
|
|
||||||
|
|
||||||
The only interesting string in this ROM is SPF2ALP,
|
|
||||||
which is also found in the Wireless Air 60 ROM.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
ROM_START( wrlshunt )
|
|
||||||
ROM_REGION( 0x8000000, "maincpu", ROMREGION_ERASE00 )
|
|
||||||
ROM_LOAD16_WORD_SWAP( "wireless.bin", 0x0000, 0x8000000, CRC(a6ecc20e) SHA1(3645f23ba2bb218e92d4560a8ae29dddbaabf796) )
|
|
||||||
ROM_END
|
|
||||||
|
|
||||||
|
|
||||||
void spg2xx_game_state::init_crc()
|
void spg2xx_game_state::init_crc()
|
||||||
{
|
{
|
||||||
// several games have a byte sum checksum listed at the start of ROM, this little helper function logs what it should match.
|
// several games have a byte sum checksum listed at the start of ROM, this little helper function logs what it should match.
|
||||||
@ -2438,12 +2345,5 @@ CONS( 2009, zone40, 0, 0, non_spg_base, wirels60, spg2xx_game_st
|
|||||||
// Similar, SPG260?, scrambled
|
// Similar, SPG260?, scrambled
|
||||||
CONS( 200?, lexizeus, 0, 0, lexizeus, lexizeus, spg2xx_game_state, init_zeus, "Lexibook", "Zeus IG900 20-in-1 (US?)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
|
CONS( 200?, lexizeus, 0, 0, lexizeus, lexizeus, spg2xx_game_state, init_zeus, "Lexibook", "Zeus IG900 20-in-1 (US?)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
|
||||||
|
|
||||||
|
|
||||||
// valid looking code, but extended periperhal area (twice the size?) makes use of unemulated opcode 0xfe00 ?
|
|
||||||
CONS( 2011, wrlshunt, 0, 0, non_spg_base, wirels60, spg2xx_game_state, empty_init, "Hamy / Kids Station Toys Inc", "Wireless Hunting Video Game System", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
|
|
||||||
// extended opcodes different internal map?
|
|
||||||
CONS( 2009, smartfp, 0, 0, non_spg_base, wirels60, spg2xx_game_state, empty_init, "Fisher-Price", "Fun 2 Learn Smart Fit Park", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
|
|
||||||
// Fun 2 Learn 3-in-1 SMART SPORTS ?
|
|
||||||
|
|
||||||
// NAND dumps w/ internal bootstrap. Almost certainly do not fit in this driver, as the SPG2xx can only address up to 4Mwords. These are 'GeneralPlus' instead?
|
// NAND dumps w/ internal bootstrap. Almost certainly do not fit in this driver, as the SPG2xx can only address up to 4Mwords. These are 'GeneralPlus' instead?
|
||||||
CONS( 2010, wlsair60, 0, 0, non_spg_base, wirels60, spg2xx_game_state, empty_init, "Jungle Soft / Kids Station Toys Inc", "Wireless Air 60", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
|
CONS( 2010, wlsair60, 0, 0, non_spg_base, wirels60, spg2xx_game_state, empty_init, "Jungle Soft / Kids Station Toys Inc", "Wireless Air 60", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
|
||||||
|
@ -36515,6 +36515,10 @@ srangero // (c) 1988
|
|||||||
srangerw // (c) 1988 SunA (WDK License)
|
srangerw // (c) 1988 SunA (WDK License)
|
||||||
starfigh // (c) 1990 SunA
|
starfigh // (c) 1990 SunA
|
||||||
|
|
||||||
|
@source:sunplus_gcm394.cpp
|
||||||
|
smartfp // Smart Fit Park
|
||||||
|
wrlshunt // Wireless: Hunting Video Game System
|
||||||
|
|
||||||
@source:supbtime.cpp
|
@source:supbtime.cpp
|
||||||
chinatwn // MAK (c) 1991 Data East Corporation (Japan)
|
chinatwn // MAK (c) 1991 Data East Corporation (Japan)
|
||||||
supbtime // MAE (c) 1990 Data East Corporation (World)
|
supbtime // MAE (c) 1990 Data East Corporation (World)
|
||||||
@ -38810,7 +38814,6 @@ jak_nick //
|
|||||||
jak_sbfc //
|
jak_sbfc //
|
||||||
lexizeus // Lexibook
|
lexizeus // Lexibook
|
||||||
vii // KenSingTon / Jungle Soft / Siatronics Vii
|
vii // KenSingTon / Jungle Soft / Siatronics Vii
|
||||||
wrlshunt // Wireless: Hunting Video Game System
|
|
||||||
wirels60 // Wireless 60
|
wirels60 // Wireless 60
|
||||||
wlsair60 // Wireless Air 60
|
wlsair60 // Wireless Air 60
|
||||||
zone40 // Zone 40
|
zone40 // Zone 40
|
||||||
@ -38822,7 +38825,6 @@ rad_crik //
|
|||||||
rad_fb2 //
|
rad_fb2 //
|
||||||
mattelcs //
|
mattelcs //
|
||||||
dreamlif //
|
dreamlif //
|
||||||
smartfp //
|
|
||||||
icanguit //
|
icanguit //
|
||||||
icanpian //
|
icanpian //
|
||||||
|
|
||||||
|
@ -739,6 +739,7 @@ sun2.cpp
|
|||||||
sun3.cpp
|
sun3.cpp
|
||||||
sun3x.cpp
|
sun3x.cpp
|
||||||
sun4.cpp
|
sun4.cpp
|
||||||
|
sunplus_gcm394.cpp
|
||||||
super6.cpp
|
super6.cpp
|
||||||
super80.cpp
|
super80.cpp
|
||||||
superslave.cpp
|
superslave.cpp
|
||||||
|
Loading…
Reference in New Issue
Block a user