summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2019-03-05 12:45:11 -0500
committer AJR <ajrhacker@users.noreply.github.com>2019-03-05 12:48:01 -0500
commitc63cd721ffff3fa110cdc8579cbc1dbafd444603 (patch)
tree8c2824b8e044a31cae201195575ad95d662f12a7
parent6695e0d24769fffab1210ca7a8fb3074a2623917 (diff)
hpc: Add HPC46003 type for future use (nw)
- Further bit instruction disassembly adjustments (nw)
-rw-r--r--src/devices/cpu/hpc/hpc.cpp20
-rw-r--r--src/devices/cpu/hpc/hpc.h15
-rw-r--r--src/devices/cpu/hpc/hpcdasm.cpp32
-rw-r--r--src/devices/cpu/hpc/hpcdasm.h9
-rw-r--r--src/tools/unidasm.cpp1
5 files changed, 73 insertions, 4 deletions
diff --git a/src/devices/cpu/hpc/hpc.cpp b/src/devices/cpu/hpc/hpc.cpp
index cdfbe43dc1a..9d10ffbbbf9 100644
--- a/src/devices/cpu/hpc/hpc.cpp
+++ b/src/devices/cpu/hpc/hpc.cpp
@@ -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))
{
diff --git a/src/devices/cpu/hpc/hpc.h b/src/devices/cpu/hpc/hpc.h
index 3f1dad6be3e..5f73a0ee2e6 100644
--- a/src/devices/cpu/hpc/hpc.h
+++ b/src/devices/cpu/hpc/hpc.h
@@ -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
diff --git a/src/devices/cpu/hpc/hpcdasm.cpp b/src/devices/cpu/hpc/hpcdasm.cpp
index 263cdadb6f1..54cec15e627 100644
--- a/src/devices/cpu/hpc/hpcdasm.cpp
+++ b/src/devices/cpu/hpc/hpcdasm.cpp
@@ -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:
diff --git a/src/devices/cpu/hpc/hpcdasm.h b/src/devices/cpu/hpc/hpcdasm.h
index 85aa4f550f1..ed57c6b1a35 100644
--- a/src/devices/cpu/hpc/hpcdasm.h
+++ b/src/devices/cpu/hpc/hpcdasm.h
@@ -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:
diff --git a/src/tools/unidasm.cpp b/src/tools/unidasm.cpp
index e8bb305bfa1..81b9f448140 100644
--- a/src/tools/unidasm.cpp
+++ b/src/tools/unidasm.cpp
@@ -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; } },