mirror of
https://github.com/holub/mame
synced 2025-04-22 08:22:15 +03:00
hpc: Add HPC46003 type for future use (nw)
- Further bit instruction disassembly adjustments (nw)
This commit is contained in:
parent
6695e0d247
commit
c63cd721ff
@ -13,9 +13,19 @@
|
||||
#include "hpcdasm.h"
|
||||
|
||||
// device type definitions
|
||||
DEFINE_DEVICE_TYPE(HPC46003, hpc46003_device, "hpc46003", "HPC46003")
|
||||
DEFINE_DEVICE_TYPE(HPC46104, hpc46104_device, "hpc46104", "HPC46104")
|
||||
|
||||
|
||||
void hpc46003_device::internal_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x00bf).ram();
|
||||
map(0x00c0, 0x00c0).rw(FUNC(hpc46003_device::psw_r), FUNC(hpc46003_device::psw_w));
|
||||
map(0x00c4, 0x00cf).ram().share("core_regs");
|
||||
// TODO: many other internal registers
|
||||
map(0x01c0, 0x01ff).ram();
|
||||
}
|
||||
|
||||
void hpc46104_device::internal_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x00bf).ram();
|
||||
@ -25,6 +35,11 @@ void hpc46104_device::internal_map(address_map &map)
|
||||
map(0x01c0, 0x02ff).ram();
|
||||
}
|
||||
|
||||
std::unique_ptr<util::disasm_interface> hpc46003_device::create_disassembler()
|
||||
{
|
||||
return std::make_unique<hpc16083_disassembler>();
|
||||
}
|
||||
|
||||
std::unique_ptr<util::disasm_interface> hpc46104_device::create_disassembler()
|
||||
{
|
||||
return std::make_unique<hpc16164_disassembler>();
|
||||
@ -41,6 +56,11 @@ hpc_device::hpc_device(const machine_config &mconfig, device_type type, const ch
|
||||
{
|
||||
}
|
||||
|
||||
hpc46003_device::hpc46003_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
|
||||
: hpc_device(mconfig, HPC46003, tag, owner, clock, address_map_constructor(FUNC(hpc46003_device::internal_map), this))
|
||||
{
|
||||
}
|
||||
|
||||
hpc46104_device::hpc46104_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
|
||||
: hpc_device(mconfig, HPC46104, tag, owner, clock, address_map_constructor(FUNC(hpc46104_device::internal_map), this))
|
||||
{
|
||||
|
@ -52,6 +52,20 @@ private:
|
||||
s32 m_icount;
|
||||
};
|
||||
|
||||
class hpc46003_device : public hpc_device
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
hpc46003_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:
|
||||
void internal_map(address_map &map);
|
||||
};
|
||||
|
||||
class hpc46104_device : public hpc_device
|
||||
{
|
||||
public:
|
||||
@ -68,6 +82,7 @@ private:
|
||||
|
||||
|
||||
// device type declarations
|
||||
DECLARE_DEVICE_TYPE(HPC46003, hpc46003_device)
|
||||
DECLARE_DEVICE_TYPE(HPC46104, hpc46104_device)
|
||||
|
||||
#endif // MAME_CPU_HPC_HPC_H
|
||||
|
@ -16,6 +16,26 @@
|
||||
#include "util/strformat.h"
|
||||
#include <ctype.h>
|
||||
|
||||
const char *const hpc16083_disassembler::s_regs[128] =
|
||||
{
|
||||
"psw", nullptr, "SP", "PC", "A", "K", "B", "X",
|
||||
"enir", "irpd", "ircd", "sio", "porti", nullptr, "halten", nullptr,
|
||||
"porta", "portb", nullptr, "upic", nullptr, nullptr, nullptr, nullptr,
|
||||
"dira", "dirb", "bfun", nullptr, nullptr, nullptr, nullptr, nullptr,
|
||||
nullptr, nullptr, "portd", nullptr, nullptr, nullptr, nullptr, nullptr,
|
||||
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
|
||||
"enu", "enui", "rbuf", "tbuf", "enur", nullptr, nullptr, nullptr,
|
||||
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
|
||||
"t4", "r4", "t5", "r5", "t6", "r6", "t7", "r7",
|
||||
"pwmode", "portp", nullptr, nullptr, nullptr, nullptr, "eicon", "eicr",
|
||||
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
|
||||
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
|
||||
"i4cr", "i3cr", "i2cr", "r2", "t2", "r3", "t3", "divby",
|
||||
"tmmode", "t0con", "watchdog", nullptr, nullptr, nullptr, nullptr, nullptr,
|
||||
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
|
||||
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr
|
||||
};
|
||||
|
||||
const char *const hpc16164_disassembler::s_regs[128] =
|
||||
{
|
||||
"psw", nullptr, "SP", "PC", "A", "K", "B", "X",
|
||||
@ -151,7 +171,7 @@ void hpc_disassembler::disassemble_bit_op(std::ostream &stream, const char *op,
|
||||
stream << "[";
|
||||
format_register(stream, src);
|
||||
if (indir)
|
||||
stream << "]";
|
||||
stream << "].b";
|
||||
}
|
||||
|
||||
offs_t hpc_disassembler::disassemble(std::ostream &stream, offs_t pc, const hpc_disassembler::data_buffer &opcodes, const hpc_disassembler::data_buffer ¶ms)
|
||||
@ -189,6 +209,10 @@ offs_t hpc_disassembler::disassemble(std::ostream &stream, offs_t pc, const hpc_
|
||||
bytes = 2;
|
||||
break;
|
||||
|
||||
case 0x38: case 0x39: case 0x3a:
|
||||
reg = REGISTER_X;
|
||||
break;
|
||||
|
||||
case 0x3f:
|
||||
case 0x89: case 0x8a:
|
||||
case 0xa9: case 0xaa: case 0xaf:
|
||||
@ -483,15 +507,15 @@ offs_t hpc_disassembler::disassemble(std::ostream &stream, offs_t pc, const hpc_
|
||||
break;
|
||||
|
||||
case 0x38:
|
||||
util::stream_format(stream, "%-8sX,[B]", "rbit");
|
||||
disassemble_op(stream, "rbit", reg, src, imm, indir, idx, false);
|
||||
break;
|
||||
|
||||
case 0x39:
|
||||
util::stream_format(stream, "%-8sX,[B]", "sbit");
|
||||
disassemble_op(stream, "sbit", reg, src, imm, indir, idx, false);
|
||||
break;
|
||||
|
||||
case 0x3a:
|
||||
util::stream_format(stream, "%-8sX,[B]", "ifbit");
|
||||
disassemble_op(stream, "ifbit", reg, src, imm, indir, idx, false);
|
||||
break;
|
||||
|
||||
case 0x3b:
|
||||
|
@ -37,6 +37,15 @@ private:
|
||||
const char *const *m_regs;
|
||||
};
|
||||
|
||||
class hpc16083_disassembler : public hpc_disassembler
|
||||
{
|
||||
public:
|
||||
hpc16083_disassembler() : hpc_disassembler(s_regs) { }
|
||||
|
||||
private:
|
||||
static const char *const s_regs[128];
|
||||
};
|
||||
|
||||
class hpc16164_disassembler : public hpc_disassembler
|
||||
{
|
||||
public:
|
||||
|
@ -361,6 +361,7 @@ static const dasm_table_entry dasm_table[] =
|
||||
{ "hp_5061_3001", be, -1, []() -> util::disasm_interface * { return new hp_5061_3001_disassembler; } },
|
||||
{ "hp_5061_3011", be, -1, []() -> util::disasm_interface * { return new hp_5061_3011_disassembler; } },
|
||||
{ "hp_09825_67907", be, -1, []() -> util::disasm_interface * { return new hp_09825_67907_disassembler; } },
|
||||
{ "hpc16083", le, 0, []() -> util::disasm_interface * { return new hpc16083_disassembler; } },
|
||||
{ "hpc16164", le, 0, []() -> util::disasm_interface * { return new hpc16164_disassembler; } },
|
||||
{ "hyperstone", be, 0, []() -> util::disasm_interface * { return new hyperstone_disassembler(&hyperstone_unidasm); } },
|
||||
{ "i4004", le, 0, []() -> util::disasm_interface * { return new i4004_disassembler; } },
|
||||
|
Loading…
Reference in New Issue
Block a user