mirror of
https://github.com/holub/mame
synced 2025-04-19 23:12:11 +03:00
Add skeleton CPU device and disassembler for NEC 78K/IV (uPD784XXX) architecture
This commit is contained in:
parent
51e0c3a216
commit
12a1291f5a
@ -5,7 +5,7 @@
|
||||
#include "upd78k3d.h"
|
||||
|
||||
upd78k3_disassembler::upd78k3_disassembler(const char *const sfr_names[], const char *const sfrp_names[], const char *const psw_bits[], bool has_macw, bool has_macsw)
|
||||
: upd78k_family_disassembler(sfr_names, sfrp_names)
|
||||
: upd78k_family_disassembler(sfr_names, sfrp_names, 0xfe00)
|
||||
, m_ix_bases(s_ix_bases)
|
||||
, m_psw_bits(psw_bits)
|
||||
, m_has_macw(has_macw)
|
||||
@ -13,8 +13,8 @@ upd78k3_disassembler::upd78k3_disassembler(const char *const sfr_names[], const
|
||||
{
|
||||
}
|
||||
|
||||
upd78k3_disassembler::upd78k3_disassembler(const char *const sfr_names[], const char *const sfrp_names[], const char *const ix_bases[])
|
||||
: upd78k_family_disassembler(sfr_names, sfrp_names)
|
||||
upd78k3_disassembler::upd78k3_disassembler(const char *const sfr_names[], const char *const sfrp_names[], const char *const ix_bases[], u16 saddr_ram_base)
|
||||
: upd78k_family_disassembler(sfr_names, sfrp_names, saddr_ram_base)
|
||||
, m_ix_bases(ix_bases)
|
||||
, m_psw_bits(s_psw_bits)
|
||||
, m_has_macw(true)
|
||||
@ -552,9 +552,9 @@ offs_t upd78k3_disassembler::dasm_16xx(std::ostream &stream, u8 op1, u8 op2)
|
||||
stream << "A,";
|
||||
|
||||
stream << "[";
|
||||
if (BIT(op1, 0) && BIT(op2, 6))
|
||||
util::stream_format(stream, "%s+", m_ix_bases[4]);
|
||||
if ((op2 & 0x60) == 0x60)
|
||||
if (BIT(op1, 0) && (op2 & 0x60) == 0x40)
|
||||
util::stream_format(stream, "%s+%s", m_ix_bases[4], BIT(op2, 4) ? "HL" : "DE");
|
||||
else if ((op2 & 0x60) == 0x60)
|
||||
stream << m_ix_bases[BIT(op2, 4) ? 3 : 4];
|
||||
else
|
||||
{
|
||||
|
@ -12,7 +12,7 @@ class upd78k3_disassembler : public upd78k_family_disassembler
|
||||
{
|
||||
protected:
|
||||
upd78k3_disassembler(const char *const sfr_names[], const char *const sfrp_names[], const char *const psw_bits[], bool has_macw, bool has_macsw);
|
||||
upd78k3_disassembler(const char *const sfr_names[], const char *const sfrp_names[], const char *const ix_bases[]);
|
||||
upd78k3_disassembler(const char *const sfr_names[], const char *const sfrp_names[], const char *const ix_bases[], u16 saddr_ram_base);
|
||||
|
||||
// register and mnemonic tables
|
||||
static const char *const s_r_names[16];
|
||||
|
275
src/devices/cpu/upd78k/upd78k4.cpp
Normal file
275
src/devices/cpu/upd78k/upd78k4.cpp
Normal file
@ -0,0 +1,275 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:AJR
|
||||
/****************************************************************************
|
||||
|
||||
NEC 78K/IV series 16/8-bit single-chip microcontrollers
|
||||
|
||||
Currently these devices are just stubs with no actual execution core.
|
||||
|
||||
****************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "upd78k4.h"
|
||||
#include "upd78k4d.h"
|
||||
|
||||
// device type definition
|
||||
DEFINE_DEVICE_TYPE(UPD784031, upd784031_device, "upd784031", "NEC uPD784031")
|
||||
|
||||
//**************************************************************************
|
||||
// 78K/IV CORE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// upd78k4_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
upd78k4_device::upd78k4_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, address_map_constructor mem_map, address_map_constructor sfr_map)
|
||||
: cpu_device(mconfig, type, tag, owner, clock)
|
||||
, m_program_config("program", ENDIANNESS_LITTLE, 8, 20, 0, mem_map)
|
||||
, m_iram_config("iram", ENDIANNESS_LITTLE, 16, 9, 0, address_map_constructor(FUNC(upd78k4_device::iram_map), this))
|
||||
, m_sfr_config("sfr", ENDIANNESS_LITTLE, 16, 8, 0, sfr_map)
|
||||
, m_iram(*this, "iram")
|
||||
, m_pc(0)
|
||||
, m_ppc(0)
|
||||
, m_psw(0)
|
||||
, m_sp(0)
|
||||
, m_exp_reg{0, 0, 0, 0}
|
||||
, m_icount(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// iram_map - type-universal IRAM map
|
||||
//-------------------------------------------------
|
||||
|
||||
void upd78k4_device::iram_map(address_map &map)
|
||||
{
|
||||
map(0x000, 0x1ff).ram().share("iram");
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// memory_space_config - return a vector of
|
||||
// address space configurations for this device
|
||||
//-------------------------------------------------
|
||||
|
||||
device_memory_interface::space_config_vector upd78k4_device::memory_space_config() const
|
||||
{
|
||||
return space_config_vector {
|
||||
std::make_pair(AS_PROGRAM, &m_program_config),
|
||||
std::make_pair(AS_DATA, &m_iram_config),
|
||||
std::make_pair(AS_IO, &m_sfr_config)
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// register_base - determine current base of
|
||||
// register file in IRAM
|
||||
//-------------------------------------------------
|
||||
|
||||
inline u16 upd78k4_device::register_base() const noexcept
|
||||
{
|
||||
return 0x180 | (~m_psw & 0x7000) >> 8;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void upd78k4_device::device_start()
|
||||
{
|
||||
// get address spaces and access caches
|
||||
space(AS_PROGRAM).specific(m_program_space);
|
||||
space(AS_PROGRAM).cache(m_program_cache);
|
||||
space(AS_DATA).cache(m_iram_cache);
|
||||
space(AS_IO).specific(m_sfr_space);
|
||||
|
||||
set_icountptr(m_icount);
|
||||
|
||||
// debug state
|
||||
state_add(UPD78K4_PC, "PC", m_pc).mask(0xfffff);
|
||||
state_add(STATE_GENPC, "GENPC", m_pc).mask(0xfffff).noshow();
|
||||
state_add(STATE_GENPCBASE, "GENPCBASE", m_ppc).mask(0xfffff).noshow();
|
||||
state_add(UPD78K4_PSW, "PSW", m_psw).mask(0xf0fd);
|
||||
state_add(STATE_GENFLAGS, "FLAGS", m_psw).mask(0xf0fd).formatstr("%12s").noshow();
|
||||
state_add<u8>(UPD78K4_PSWL, "PSWL",
|
||||
[this]() { return m_psw & 0x00ff; },
|
||||
[this](u8 data) { m_psw = (m_psw & 0xff00) | data; }
|
||||
).mask(0xfd).noshow();
|
||||
state_add<u8>(UPD78K4_PSWH, "PSWH",
|
||||
[this]() { return (m_psw & 0xff00) >> 8; },
|
||||
[this](u8 data) { m_psw = (m_psw & 0x00ff) | u16(data) << 8; }
|
||||
).mask(0xf0).noshow();
|
||||
state_add<u8>(UPD78K4_RBS, "RBS",
|
||||
[this]() { return BIT(m_psw, 12, 3); },
|
||||
[this](u8 data) { m_psw = (m_psw & 0x8fff) | u16(data) << 12; }
|
||||
).mask(7).noshow();
|
||||
state_add(UPD78K4_SP, "SP", m_sp).mask(0xffffff);
|
||||
for (int n = 0; n < 4; n++)
|
||||
state_add<u16>(UPD78K4_RP0 + n, string_format("RP%d", n).c_str(),
|
||||
[this, n]() { return m_iram[register_base() >> 1 | n]; },
|
||||
[this, n](u16 data) { m_iram[register_base() >> 1 | n] = data; }
|
||||
).formatstr("%9s");
|
||||
for (int n = 0; n < 2; n++)
|
||||
state_add<u16>(UPD78K4_AX + n, std::array<const char *, 2>{{"AX", "BC"}}[n],
|
||||
[this, n]() { return m_iram[register_base() >> 1 | (m_psw & 0x0020) >> 4 | n]; },
|
||||
[this, n](u16 data) { m_iram[register_base() >> 1 | (m_psw & 0x0020) >> 4 | n] = data; }
|
||||
).noshow();
|
||||
for (int n = 0; n < 4; n++)
|
||||
{
|
||||
const char *rgname = std::array<const char *, 4>{{"VVP", "UUP", "TDE", "WHL"}}[n];
|
||||
state_add<u32>(UPD78K4_VVP + n, rgname,
|
||||
[this, n]() { return u32(m_exp_reg[n]) << 16 | m_iram[register_base() >> 1 | 0x04 | n]; },
|
||||
[this, n](u32 data) { m_exp_reg[n] = data >> 16; m_iram[register_base() >> 1 | 0x04 | n] = data & 0xffff; }
|
||||
).mask(0xffffff);
|
||||
state_add<u16>(UPD78K4_VP + n, rgname + 1,
|
||||
[this, n]() { return m_iram[register_base() >> 1 | 0x04 | n]; },
|
||||
[this, n](u16 data) { m_iram[register_base() >> 1 | 0x04 | n] = data; }
|
||||
).noshow();
|
||||
state_add<u16>(UPD78K4_RP4 + n, string_format("RP%d", 4 + n).c_str(),
|
||||
[this, n]() { return m_iram[register_base() >> 1 | 0x04 | n]; },
|
||||
[this, n](u16 data) { m_iram[register_base() >> 1 | 0x04 | n] = data; }
|
||||
).noshow();
|
||||
state_add(UPD78K4_V + n, std::array<const char *, 4>{{"V", "U", "T", "W"}}[n], m_exp_reg[n]).noshow();
|
||||
}
|
||||
for (int n = 0; n < 16; n++)
|
||||
state_add<u8>(UPD78K4_R0 + n, string_format("R%d", n).c_str(),
|
||||
[this, n]() { return reinterpret_cast<u8 *>(&m_iram[0])[BYTE_XOR_LE(register_base() | n)]; },
|
||||
[this, n](u8 data) { reinterpret_cast<u8 *>(&m_iram[0])[BYTE_XOR_LE(register_base() | n)] = data; }
|
||||
).noshow();
|
||||
for (int n = 0; n < 4; n++)
|
||||
state_add<u8>(UPD78K4_X + n, std::array<const char *, 4>{{"X", "A", "C", "B"}}[n],
|
||||
[this, n]() { return reinterpret_cast<u8 *>(&m_iram[0])[BYTE_XOR_LE(register_base() | (m_psw & 0x0020) >> 3 | n)]; },
|
||||
[this, n](u8 data) { reinterpret_cast<u8 *>(&m_iram[0])[BYTE_XOR_LE(register_base() | (m_psw & 0x0020) >> 3 | n)] = data; }
|
||||
).noshow();
|
||||
for (int n = 0; n < 8; n++)
|
||||
state_add<u8>(UPD78K4_VPL + n, std::array<const char *, 8>{{"VPL", "VPH", "UPL", "UPH", "E", "D", "L", "H"}}[n],
|
||||
[this, n]() { return reinterpret_cast<u8 *>(&m_iram[0])[BYTE_XOR_LE(register_base() | 0x08 | n)]; },
|
||||
[this, n](u8 data) { reinterpret_cast<u8 *>(&m_iram[0])[BYTE_XOR_LE(register_base() | 0x08 | n)] = data; }
|
||||
).noshow();
|
||||
|
||||
// save state
|
||||
save_item(NAME(m_pc));
|
||||
save_item(NAME(m_ppc));
|
||||
save_item(NAME(m_sp));
|
||||
save_item(NAME(m_exp_reg));
|
||||
save_item(NAME(m_psw));
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_reset - device-specific reset
|
||||
//-------------------------------------------------
|
||||
|
||||
void upd78k4_device::device_reset()
|
||||
{
|
||||
// PC will be initialized from vector following reset
|
||||
m_psw = 0x0000;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// execute_run -
|
||||
//-------------------------------------------------
|
||||
|
||||
void upd78k4_device::execute_run()
|
||||
{
|
||||
m_pc = m_program_cache.read_word(0);
|
||||
m_ppc = m_pc;
|
||||
debugger_instruction_hook(m_pc);
|
||||
|
||||
// TODO
|
||||
m_icount = 0;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// state_string_export -
|
||||
//-------------------------------------------------
|
||||
|
||||
void upd78k4_device::state_string_export(const device_state_entry &entry, std::string &str) const
|
||||
{
|
||||
switch (entry.index())
|
||||
{
|
||||
case STATE_GENFLAGS:
|
||||
str = string_format("%c RB%d:%c%c%c%c%c%c0%c",
|
||||
BIT(m_psw, 15) ? 'U' : '.',
|
||||
(m_psw & 0x7000) >> 12,
|
||||
BIT(m_psw, 7) ? 'S' : '.',
|
||||
BIT(m_psw, 6) ? 'Z' : '.',
|
||||
BIT(m_psw, 5) ? 'R' : '.',
|
||||
BIT(m_psw, 4) ? 'A' : '.',
|
||||
BIT(m_psw, 3) ? 'I' : '.',
|
||||
BIT(m_psw, 2) ? 'V' : '.',
|
||||
BIT(m_psw, 0) ? 'C' : '.');
|
||||
break;
|
||||
|
||||
case UPD78K4_RP0:
|
||||
str = string_format("%04X %s", m_iram[register_base() >> 1], BIT(m_psw, 5) ? " " : "(AX)");
|
||||
break;
|
||||
|
||||
case UPD78K4_RP1:
|
||||
str = string_format("%04X %s", m_iram[register_base() >> 1 | 1], BIT(m_psw, 5) ? " " : "(BC)");
|
||||
break;
|
||||
|
||||
case UPD78K4_RP2:
|
||||
str = string_format("%04X %s", m_iram[register_base() >> 1 | 2], BIT(m_psw, 5) ? "(AX)" : " ");
|
||||
break;
|
||||
|
||||
case UPD78K4_RP3:
|
||||
str = string_format("%04X %s", m_iram[register_base() >> 1 | 3], BIT(m_psw, 5) ? "(BC)" : " ");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// 78K/IV SUBSERIES DEVICES
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// upd784031_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
upd784031_device::upd784031_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
|
||||
: upd78k4_device(mconfig, UPD784031, tag, owner, clock,
|
||||
address_map_constructor(FUNC(upd784031_device::sfr_map), this),
|
||||
address_map_constructor(FUNC(upd784031_device::sfr_map), this))
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// create_disassembler -
|
||||
//-------------------------------------------------
|
||||
|
||||
std::unique_ptr<util::disasm_interface> upd784031_device::create_disassembler()
|
||||
{
|
||||
return std::make_unique<upd784038_disassembler>();
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// mem_map - type-specific internal memory map
|
||||
// (excluding IRAM and SFRs)
|
||||
//-------------------------------------------------
|
||||
|
||||
void upd784031_device::mem_map(address_map &map)
|
||||
{
|
||||
// no ROM
|
||||
//map(0x0f700, 0x0fcff).ram(); // PRAM (TODO: LOCATION 0H)
|
||||
map(0xff700, 0xffcff).ram(); // PRAM (LOCATION 0FH)
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// sfr_map - type-specific SFR map
|
||||
//-------------------------------------------------
|
||||
|
||||
void upd784031_device::sfr_map(address_map &map)
|
||||
{
|
||||
// TODO
|
||||
}
|
110
src/devices/cpu/upd78k/upd78k4.h
Normal file
110
src/devices/cpu/upd78k/upd78k4.h
Normal file
@ -0,0 +1,110 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:AJR
|
||||
/**********************************************************************
|
||||
|
||||
NEC 78K/IV series 16/8-bit single-chip microcontrollers
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef MAME_CPU_UPD78K_UPD78K4_H
|
||||
#define MAME_CPU_UPD78K_UPD78K4_H
|
||||
|
||||
#pragma once
|
||||
|
||||
//**************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
// ======================> upd78k4_device
|
||||
|
||||
class upd78k4_device : public cpu_device
|
||||
{
|
||||
public:
|
||||
enum {
|
||||
UPD78K4_PC,
|
||||
UPD78K4_PSW, UPD78K4_PSWL, UPD78K4_PSWH, UPD78K4_RBS, UPD78K4_SP,
|
||||
UPD78K4_VVP, UPD78K4_UUP, UPD78K4_TDE, UPD78K4_WHL,
|
||||
UPD78K4_RP0, UPD78K4_RP1, UPD78K4_RP2, UPD78K4_RP3,
|
||||
UPD78K4_RP4, UPD78K4_RP5, UPD78K4_RP6, UPD78K4_RP7,
|
||||
UPD78K4_AX, UPD78K4_BC,
|
||||
UPD78K4_VP, UPD78K4_UP, UPD78K4_DE, UPD78K4_HL,
|
||||
UPD78K4_R0, UPD78K4_R1, UPD78K4_R2, UPD78K4_R3,
|
||||
UPD78K4_R4, UPD78K4_R5, UPD78K4_R6, UPD78K4_R7,
|
||||
UPD78K4_R8, UPD78K4_R9, UPD78K4_R10, UPD78K4_R11,
|
||||
UPD78K4_R12, UPD78K4_R13, UPD78K4_R14, UPD78K4_R15,
|
||||
UPD78K4_X, UPD78K4_A, UPD78K4_C, UPD78K4_B,
|
||||
UPD78K4_VPL, UPD78K4_VPH, UPD78K4_UPL, UPD78K4_UPH,
|
||||
UPD78K4_E, UPD78K4_D, UPD78K4_L, UPD78K4_H,
|
||||
UPD78K4_V, UPD78K4_U, UPD78K4_T, UPD78K4_W
|
||||
};
|
||||
|
||||
// TODO: callbacks and configuration thereof
|
||||
|
||||
protected:
|
||||
upd78k4_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, address_map_constructor mem_map, address_map_constructor sfr_map);
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
|
||||
// device_execute_interface overrides
|
||||
virtual void execute_run() override;
|
||||
virtual u64 execute_clocks_to_cycles(u64 clocks) const noexcept override { return (clocks + 2 - 1) / 2; }
|
||||
virtual u64 execute_cycles_to_clocks(u64 cycles) const noexcept override { return (cycles * 2); }
|
||||
|
||||
// device_memory_interface overrides
|
||||
virtual space_config_vector memory_space_config() const override;
|
||||
|
||||
// device_state_interface overrides
|
||||
virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
|
||||
|
||||
private:
|
||||
// internal memory map
|
||||
void iram_map(address_map &map);
|
||||
|
||||
// internal helpers
|
||||
inline u16 register_base() const noexcept;
|
||||
|
||||
private:
|
||||
// address spaces, caches & configuration
|
||||
address_space_config m_program_config;
|
||||
address_space_config m_iram_config;
|
||||
address_space_config m_sfr_config;
|
||||
required_shared_ptr<u16> m_iram;
|
||||
|
||||
memory_access<20, 0, 0, ENDIANNESS_LITTLE>::cache m_program_cache;
|
||||
memory_access< 9, 1, 0, ENDIANNESS_LITTLE>::cache m_iram_cache;
|
||||
memory_access<20, 0, 0, ENDIANNESS_LITTLE>::specific m_program_space;
|
||||
memory_access< 8, 1, 0, ENDIANNESS_LITTLE>::specific m_sfr_space;
|
||||
|
||||
// core registers and execution state
|
||||
u32 m_pc;
|
||||
u32 m_ppc;
|
||||
u16 m_psw;
|
||||
u32 m_sp;
|
||||
u8 m_exp_reg[4];
|
||||
s32 m_icount;
|
||||
};
|
||||
|
||||
// ======================> upd784031_device
|
||||
|
||||
class upd784031_device : public upd78k4_device
|
||||
{
|
||||
public:
|
||||
// device type constructor
|
||||
upd784031_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
|
||||
|
||||
protected:
|
||||
// device_disasm_interface overrides
|
||||
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
|
||||
|
||||
private:
|
||||
// type-specific internal memory maps
|
||||
void mem_map(address_map &map);
|
||||
void sfr_map(address_map &map);
|
||||
};
|
||||
|
||||
// device type declaration
|
||||
DECLARE_DEVICE_TYPE(UPD784031, upd784031_device)
|
||||
|
||||
#endif // MAME_CPU_UPD78K_UPD78K4_H
|
1408
src/devices/cpu/upd78k/upd78k4d.cpp
Normal file
1408
src/devices/cpu/upd78k/upd78k4d.cpp
Normal file
File diff suppressed because it is too large
Load Diff
128
src/devices/cpu/upd78k/upd78k4d.h
Normal file
128
src/devices/cpu/upd78k/upd78k4d.h
Normal file
@ -0,0 +1,128 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:AJR
|
||||
|
||||
#ifndef MAME_CPU_UPD78K_UPD78K4D_H
|
||||
#define MAME_CPU_UPD78K_UPD78K4D_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "upd78k3d.h"
|
||||
|
||||
class upd78k4_disassembler : public upd78k3_disassembler
|
||||
{
|
||||
protected:
|
||||
upd78k4_disassembler(const char *const sfr_names[], const char *const sfrp_names[]);
|
||||
|
||||
// register and mnemonic tables
|
||||
static const char *const s_ix_bases[5];
|
||||
static const char *const s_imm24_offsets[4];
|
||||
static const char *const s_rg_names[4];
|
||||
|
||||
// upd78k_family_disassembler overrides
|
||||
virtual void format_jdisp8(std::ostream &stream, offs_t pc, u8 disp) override;
|
||||
|
||||
// upd78k3_disassembler overrides
|
||||
virtual offs_t dasm_05xx(std::ostream &stream, u8 op2) override;
|
||||
virtual offs_t dasm_06xx(std::ostream &stream, u8 op2, offs_t pc, const data_buffer &opcodes) override;
|
||||
virtual offs_t dasm_07xx(std::ostream &stream, u8 op2, offs_t pc, const data_buffer &opcodes) override;
|
||||
virtual offs_t dasm_09xx(std::ostream &stream, u8 op2, offs_t pc, const data_buffer &opcodes) override;
|
||||
virtual offs_t dasm_0axx(std::ostream &stream, u8 op2, offs_t pc, const data_buffer &opcodes) override;
|
||||
virtual offs_t dasm_16xx(std::ostream &stream, u8 op1, u8 op2) override;
|
||||
virtual offs_t dasm_24xx(std::ostream &stream, u8 op, u8 rr) override;
|
||||
virtual offs_t dasm_2a(std::ostream &stream, offs_t pc, const data_buffer &opcodes) override;
|
||||
virtual offs_t dasm_38(std::ostream &stream, u8 op, offs_t pc, const data_buffer &opcodes) override;
|
||||
virtual offs_t dasm_3c(std::ostream &stream, u8 op, offs_t pc, const data_buffer &opcodes) override;
|
||||
virtual offs_t dasm_43(std::ostream &stream, offs_t pc, const data_buffer &opcodes) override;
|
||||
virtual offs_t dasm_78(std::ostream &stream, u8 op, offs_t pc, const data_buffer &opcodes) override;
|
||||
virtual offs_t dasm_88xx(std::ostream &stream, u8 op, u8 rr) override;
|
||||
|
||||
private:
|
||||
// formatting helpers
|
||||
void format_imm24(std::ostream &stream, u32 d);
|
||||
void format_abs20(std::ostream &stream, u32 addr);
|
||||
void format_abs24(std::ostream &stream, u32 addr);
|
||||
void format_saddr1(std::ostream &stream, u8 addr);
|
||||
void format_saddrp1(std::ostream &stream, u8 addr);
|
||||
void format_saddrg1(std::ostream &stream, u8 addr);
|
||||
void format_saddrg2(std::ostream &stream, u8 addr);
|
||||
void format_jdisp16(std::ostream &stream, offs_t pc, u16 disp);
|
||||
};
|
||||
|
||||
class upd784026_disassembler : public upd78k4_disassembler
|
||||
{
|
||||
public:
|
||||
upd784026_disassembler();
|
||||
|
||||
private:
|
||||
// SFR tables
|
||||
static const char *const s_sfr_names[256];
|
||||
static const char *const s_sfrp_names[128];
|
||||
};
|
||||
|
||||
class upd784038_disassembler : public upd78k4_disassembler
|
||||
{
|
||||
public:
|
||||
upd784038_disassembler();
|
||||
|
||||
private:
|
||||
// SFR tables
|
||||
static const char *const s_sfr_names[256];
|
||||
static const char *const s_sfrp_names[128];
|
||||
};
|
||||
|
||||
class upd784046_disassembler : public upd78k4_disassembler
|
||||
{
|
||||
public:
|
||||
upd784046_disassembler();
|
||||
|
||||
private:
|
||||
// SFR tables
|
||||
static const char *const s_sfr_names[256];
|
||||
static const char *const s_sfrp_names[128];
|
||||
};
|
||||
|
||||
class upd784054_disassembler : public upd78k4_disassembler
|
||||
{
|
||||
public:
|
||||
upd784054_disassembler();
|
||||
|
||||
private:
|
||||
// SFR tables
|
||||
static const char *const s_sfr_names[256];
|
||||
static const char *const s_sfrp_names[128];
|
||||
};
|
||||
|
||||
class upd784216_disassembler : public upd78k4_disassembler
|
||||
{
|
||||
public:
|
||||
upd784216_disassembler();
|
||||
|
||||
private:
|
||||
// SFR tables
|
||||
static const char *const s_sfr_names[256];
|
||||
static const char *const s_sfrp_names[128];
|
||||
};
|
||||
|
||||
class upd784218_disassembler : public upd78k4_disassembler
|
||||
{
|
||||
public:
|
||||
upd784218_disassembler();
|
||||
|
||||
private:
|
||||
// SFR tables
|
||||
static const char *const s_sfr_names[256];
|
||||
static const char *const s_sfrp_names[128];
|
||||
};
|
||||
|
||||
class upd784225_disassembler : public upd78k4_disassembler
|
||||
{
|
||||
public:
|
||||
upd784225_disassembler();
|
||||
|
||||
private:
|
||||
// SFR tables
|
||||
static const char *const s_sfr_names[256];
|
||||
static const char *const s_sfrp_names[128];
|
||||
};
|
||||
|
||||
#endif // MAME_CPU_UPD78K_UPD78K3D_H
|
@ -11,10 +11,11 @@
|
||||
#include "emu.h"
|
||||
#include "upd78kd.h"
|
||||
|
||||
upd78k_family_disassembler::upd78k_family_disassembler(const char *const sfr_names[], const char *const sfrp_names[])
|
||||
upd78k_family_disassembler::upd78k_family_disassembler(const char *const sfr_names[], const char *const sfrp_names[], u16 saddr_ram_base)
|
||||
: util::disasm_interface()
|
||||
, m_sfr_names(sfr_names)
|
||||
, m_sfrp_names(sfrp_names)
|
||||
, m_saddr_ram_base(saddr_ram_base)
|
||||
{
|
||||
}
|
||||
|
||||
@ -101,7 +102,7 @@ void upd78k_family_disassembler::format_saddr(std::ostream &stream, u8 addr)
|
||||
if (addr < 0x20)
|
||||
format_sfr(stream, addr);
|
||||
else
|
||||
util::stream_format(stream, "0%04XH", 0xfe00 + addr);
|
||||
util::stream_format(stream, "0%04XH", m_saddr_ram_base + addr);
|
||||
}
|
||||
|
||||
void upd78k_family_disassembler::format_sfrp(std::ostream &stream, u8 addr)
|
||||
@ -161,7 +162,7 @@ offs_t upd78k_family_disassembler::dasm_illegal3(std::ostream &stream, u8 op1, u
|
||||
|
||||
// For families with 4 banks of 8 registers and only one PSW byte
|
||||
upd78k_8reg_disassembler::upd78k_8reg_disassembler(const char *const sfr_names[], const char *const sfrp_names[])
|
||||
: upd78k_family_disassembler(sfr_names, sfrp_names)
|
||||
: upd78k_family_disassembler(sfr_names, sfrp_names, 0xfe00)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
class upd78k_family_disassembler : public util::disasm_interface
|
||||
{
|
||||
protected:
|
||||
upd78k_family_disassembler(const char *const sfr_names[], const char *const sfrp_names[]);
|
||||
upd78k_family_disassembler(const char *const sfr_names[], const char *const sfrp_names[], u16 saddr_ram_base);
|
||||
|
||||
// disasm_interface overrides
|
||||
virtual u32 opcode_alignment() const override;
|
||||
@ -21,7 +21,7 @@ protected:
|
||||
void format_ix_disp16(std::ostream &stream, const char *r, u16 d);
|
||||
void format_ix_base16(std::ostream &stream, const char *r, u16 d);
|
||||
void format_abs16(std::ostream &stream, u16 addr);
|
||||
void format_jdisp8(std::ostream &stream, offs_t pc, u8 disp);
|
||||
virtual void format_jdisp8(std::ostream &stream, offs_t pc, u8 disp);
|
||||
void format_sfr(std::ostream &stream, u8 addr);
|
||||
void format_saddr(std::ostream &stream, u8 addr);
|
||||
void format_sfrp(std::ostream &stream, u8 addr);
|
||||
@ -36,6 +36,7 @@ protected:
|
||||
private:
|
||||
const char *const *const m_sfr_names;
|
||||
const char *const *const m_sfrp_names;
|
||||
const u16 m_saddr_ram_base;
|
||||
};
|
||||
|
||||
class upd78k_8reg_disassembler : public upd78k_family_disassembler
|
||||
|
@ -404,6 +404,7 @@ The golf club acts like a LED gun. PCB power input is 12V.
|
||||
|
||||
#include "emu.h"
|
||||
#include "cpu/powerpc/ppc.h"
|
||||
#include "cpu/upd78k/upd78k4.h"
|
||||
#include "bus/ata/ataintf.h"
|
||||
#include "bus/ata/idehd.h"
|
||||
#include "machine/lpci.h"
|
||||
@ -447,6 +448,7 @@ public:
|
||||
|
||||
void viper(machine_config &config);
|
||||
void viper_ppp(machine_config &config);
|
||||
void viper_omz(machine_config &config);
|
||||
|
||||
void init_viper();
|
||||
void init_vipercf();
|
||||
@ -502,6 +504,7 @@ private:
|
||||
|
||||
void viper_map(address_map &map);
|
||||
void viper_ppp_map(address_map &map);
|
||||
void omz3d_map(address_map &map);
|
||||
|
||||
TIMER_CALLBACK_MEMBER(epic_global_timer_callback);
|
||||
TIMER_CALLBACK_MEMBER(ds2430_timer_callback);
|
||||
@ -2725,6 +2728,19 @@ void viper_state::viper_ppp(machine_config &config)
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &viper_state::viper_ppp_map);
|
||||
}
|
||||
|
||||
void viper_state::omz3d_map(address_map &map)
|
||||
{
|
||||
map(0x00000, 0x0ffff).rom().region("ioboard", 0);
|
||||
}
|
||||
|
||||
void viper_state::viper_omz(machine_config &config)
|
||||
{
|
||||
viper(config);
|
||||
|
||||
upd784031_device &omz3dcpu(UPD784031(config, "omz3dcpu", 12000000));
|
||||
omz3dcpu.set_addrmap(AS_PROGRAM, &viper_state::omz3d_map);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
void viper_state::init_viper()
|
||||
@ -3405,7 +3421,7 @@ GAME(2001, gticlub2, kviper, viper, gticlub2, viper_state, init_viperc
|
||||
GAME(2001, gticlub2ea,gticlub2, viper, gticlub2ea, viper_state, init_vipercf, ROT0, "Konami", "GTI Club: Corso Italiano (ver EAA)", MACHINE_NOT_WORKING)
|
||||
GAME(2001, jpark3, kviper, viper, jpark3, viper_state, init_vipercf, ROT0, "Konami", "Jurassic Park 3 (ver EBC)", MACHINE_NOT_WORKING)
|
||||
GAME(2001, jpark3u, jpark3, viper, jpark3, viper_state, init_vipercf, ROT0, "Konami", "Jurassic Park 3 (ver UBC)", MACHINE_NOT_WORKING)
|
||||
GAME(2001, mocapglf, kviper, viper, mocapglf, viper_state, init_vipercf, ROT90, "Konami", "Mocap Golf (ver UAA)", MACHINE_NOT_WORKING)
|
||||
GAME(2001, mocapglf, kviper, viper_omz, mocapglf, viper_state, init_vipercf, ROT90, "Konami", "Mocap Golf (ver UAA)", MACHINE_NOT_WORKING)
|
||||
GAME(2001, mocapb, kviper, viper, mocapb, viper_state, init_vipercf, ROT90, "Konami", "Mocap Boxing (ver AAB)", MACHINE_NOT_WORKING)
|
||||
GAME(2001, mocapbj, mocapb, viper, mocapb, viper_state, init_vipercf, ROT90, "Konami", "Mocap Boxing (ver JAA)", MACHINE_NOT_WORKING)
|
||||
GAME(2001, p911, kviper, viper, p911, viper_state, init_vipercf, ROT90, "Konami", "Police 911 (ver AAE)", MACHINE_NOT_WORKING)
|
||||
|
@ -183,6 +183,7 @@ using util::BIT;
|
||||
#include "cpu/upd78k/upd78k1d.h"
|
||||
#include "cpu/upd78k/upd78k2d.h"
|
||||
#include "cpu/upd78k/upd78k3d.h"
|
||||
#include "cpu/upd78k/upd78k4d.h"
|
||||
#include "cpu/v60/v60d.h"
|
||||
#include "cpu/v810/v810dasm.h"
|
||||
#include "cpu/v850/v850dasm.h"
|
||||
@ -634,6 +635,13 @@ static const dasm_table_entry dasm_table[] =
|
||||
{ "upd78356", le, 0, []() -> util::disasm_interface * { return new upd78356_disassembler; } },
|
||||
{ "upd78366a", le, 0, []() -> util::disasm_interface * { return new upd78366a_disassembler; } },
|
||||
{ "upd78372", le, 0, []() -> util::disasm_interface * { return new upd78372_disassembler; } },
|
||||
{ "upd784026", le, 0, []() -> util::disasm_interface * { return new upd784026_disassembler; } },
|
||||
{ "upd784038", le, 0, []() -> util::disasm_interface * { return new upd784038_disassembler; } },
|
||||
{ "upd784046", le, 0, []() -> util::disasm_interface * { return new upd784046_disassembler; } },
|
||||
{ "upd784054", le, 0, []() -> util::disasm_interface * { return new upd784054_disassembler; } },
|
||||
{ "upd784216", le, 0, []() -> util::disasm_interface * { return new upd784216_disassembler; } },
|
||||
{ "upd784218", le, 0, []() -> util::disasm_interface * { return new upd784218_disassembler; } },
|
||||
{ "upd784225", le, 0, []() -> util::disasm_interface * { return new upd784225_disassembler; } },
|
||||
{ "upd780065", le, 0, []() -> util::disasm_interface * { return new upd780065_disassembler; } },
|
||||
{ "upd780988", le, 0, []() -> util::disasm_interface * { return new upd78083_disassembler; } },
|
||||
{ "upd78k0kx1", le, 0, []() -> util::disasm_interface * { return new upd78k0kx1_disassembler; } },
|
||||
|
Loading…
Reference in New Issue
Block a user