hpc: Add HPC46003 type for future use (nw)

- Further bit instruction disassembly adjustments (nw)
This commit is contained in:
AJR 2019-03-05 12:45:11 -05:00
parent 6695e0d247
commit c63cd721ff
5 changed files with 73 additions and 4 deletions

View File

@ -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))
{

View File

@ -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

View File

@ -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 &params)
@ -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:

View File

@ -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:

View File

@ -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; } },