diff options
author | 2022-03-29 15:14:55 +0200 | |
---|---|---|
committer | 2022-03-29 15:14:55 +0200 | |
commit | 9d9ec1a2f7571a484ad005129a72a8c96db28d10 (patch) | |
tree | 3dced03810ce3ec695b0ef8f041d409b58092a28 | |
parent | bf7961cd455903a6091c5f59af5ce3dd026d8937 (diff) |
rw5000: add a5500
-rw-r--r-- | scripts/src/cpu.lua | 7 | ||||
-rw-r--r-- | src/devices/cpu/rw5000/a5500.cpp | 79 | ||||
-rw-r--r-- | src/devices/cpu/rw5000/a5500.h | 43 | ||||
-rw-r--r-- | src/devices/cpu/rw5000/rw5000d.cpp | 34 | ||||
-rw-r--r-- | src/devices/cpu/rw5000/rw5000d.h | 12 | ||||
-rw-r--r-- | src/mame/drivers/hh_rw5000.cpp | 4 | ||||
-rw-r--r-- | src/mame/drivers/hh_sm510.cpp | 12 | ||||
-rw-r--r-- | src/tools/unidasm.cpp | 1 |
8 files changed, 181 insertions, 11 deletions
diff --git a/scripts/src/cpu.lua b/scripts/src/cpu.lua index 84f03c085c7..f578e6ac969 100644 --- a/scripts/src/cpu.lua +++ b/scripts/src/cpu.lua @@ -2855,6 +2855,7 @@ end -------------------------------------------------- -- Rockwell A/B5000 family --@src/devices/cpu/rw5000/a5000.h,CPUS["RW5000"] = true +--@src/devices/cpu/rw5000/a5500.h,CPUS["RW5000"] = true --@src/devices/cpu/rw5000/b5000.h,CPUS["RW5000"] = true --@src/devices/cpu/rw5000/b6000.h,CPUS["RW5000"] = true --@src/devices/cpu/rw5000/b6100.h,CPUS["RW5000"] = true @@ -2867,12 +2868,14 @@ if CPUS["RW5000"] then MAME_DIR .. "src/devices/cpu/rw5000/b5000.cpp", MAME_DIR .. "src/devices/cpu/rw5000/b5000.h", MAME_DIR .. "src/devices/cpu/rw5000/b5000op.cpp", - MAME_DIR .. "src/devices/cpu/rw5000/a5000.cpp", - MAME_DIR .. "src/devices/cpu/rw5000/a5000.h", MAME_DIR .. "src/devices/cpu/rw5000/b6000.cpp", MAME_DIR .. "src/devices/cpu/rw5000/b6000.h", MAME_DIR .. "src/devices/cpu/rw5000/b6100.cpp", MAME_DIR .. "src/devices/cpu/rw5000/b6100.h", + MAME_DIR .. "src/devices/cpu/rw5000/a5000.cpp", + MAME_DIR .. "src/devices/cpu/rw5000/a5000.h", + MAME_DIR .. "src/devices/cpu/rw5000/a5500.cpp", + MAME_DIR .. "src/devices/cpu/rw5000/a5500.h", } end diff --git a/src/devices/cpu/rw5000/a5500.cpp b/src/devices/cpu/rw5000/a5500.cpp new file mode 100644 index 00000000000..1e228e2a8fb --- /dev/null +++ b/src/devices/cpu/rw5000/a5500.cpp @@ -0,0 +1,79 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/* + + Rockwell A5500 MCU + +*/ + +#include "emu.h" +#include "a5500.h" + +#include "rw5000d.h" + + +DEFINE_DEVICE_TYPE(A5500, a5500_cpu_device, "a5500", "Rockwell A5500") + + +// constructor +a5500_cpu_device::a5500_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data) : + a5000_cpu_device(mconfig, type, tag, owner, clock, prgwidth, program, datawidth, data) +{ } + +a5500_cpu_device::a5500_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + a5500_cpu_device(mconfig, A5500, tag, owner, clock, 10, address_map_constructor(FUNC(a5500_cpu_device::program_768x8), this), 6, address_map_constructor(FUNC(a5500_cpu_device::data_48x4), this)) +{ } + + +// internal memory maps +void a5500_cpu_device::program_768x8(address_map &map) +{ + map(0x000, 0x27f).rom(); + map(0x380, 0x3ff).rom(); +} + +void a5500_cpu_device::data_48x4(address_map &map) +{ + map(0x00, 0x0b).ram(); + map(0x10, 0x1b).ram(); + map(0x20, 0x2b).ram(); + map(0x30, 0x3b).ram(); +} + + +// disasm +std::unique_ptr<util::disasm_interface> a5500_cpu_device::create_disassembler() +{ + return std::make_unique<a5500_disassembler>(); +} + + +//------------------------------------------------- +// execute +//------------------------------------------------- + +void a5500_cpu_device::execute_one() +{ + switch (m_op) + { + case 0x1c: case 0x1d: case 0x1e: case 0x1f: op_lb(11); break; + case 0x38: case 0x39: case 0x3a: case 0x3b: op_tl(); break; + + case 0x0c: op_sc(); break; + case 0x0d: op_rsc(); break; + case 0x6f: b5000_cpu_device::op_read(); break; + + // rest is same as A5000 + default: a5000_cpu_device::execute_one(); break; + } +} + +bool a5500_cpu_device::op_is_tl(u8 op) +{ + return ((op & 0xf8) == 0x30) || ((op & 0xfc) == 0x38); +} + +bool a5500_cpu_device::op_is_lb(u8 op) +{ + return ((op & 0xfc) == 0x1c) || ((op & 0xf0) == 0x20) || ((op & 0xfc) == 0x3c); +} diff --git a/src/devices/cpu/rw5000/a5500.h b/src/devices/cpu/rw5000/a5500.h new file mode 100644 index 00000000000..138c38df630 --- /dev/null +++ b/src/devices/cpu/rw5000/a5500.h @@ -0,0 +1,43 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/* + + Rockwell A5500 MCU + +*/ + +#ifndef MAME_CPU_RW5000_A5500_H +#define MAME_CPU_RW5000_A5500_H + +#pragma once + +#include "a5000.h" + + +class a5500_cpu_device : public a5000_cpu_device +{ +public: + a5500_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + +protected: + a5500_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data); + + // device_disasm_interface overrides + virtual std::unique_ptr<util::disasm_interface> create_disassembler() override; + + // device_execute_interface overrides + virtual void execute_one() override; + + virtual bool op_is_tl(u8 op) override; + virtual bool op_is_lb(u8 op) override; + virtual void reset_pc() override { set_pc(0, 0); } + virtual u8 sr_page() override { return 15; } + + void program_768x8(address_map &map); + void data_48x4(address_map &map); +}; + + +DECLARE_DEVICE_TYPE(A5500, a5500_cpu_device) + +#endif // MAME_CPU_RW5000_A5500_H diff --git a/src/devices/cpu/rw5000/rw5000d.cpp b/src/devices/cpu/rw5000/rw5000d.cpp index ae9612887fe..7d4fbf294c9 100644 --- a/src/devices/cpu/rw5000/rw5000d.cpp +++ b/src/devices/cpu/rw5000/rw5000d.cpp @@ -170,6 +170,38 @@ offs_t a5000_disassembler::disassemble(std::ostream &stream, offs_t pc, const da } +// A5500 disasm (A5000 + LB x,11, SC/RSC moved to make room for more TL) + +const u8 a5500_disassembler::a5500_opmap[0x100] = +{ +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + em_NOP, em_TC, 0, em_TKB, em_TDIN, em_TDIN, em_TDIN, em_TDIN, em_TM, em_TM, em_TM, em_TM, em_SC, em_RSC, 0, 0, // 0 + em_SM, em_SM, em_SM, em_SM, em_RSM, em_RSM, em_RSM, em_RSM, em_RET, em_RET, em_RET, em_RET, em_LB11, em_LB11, em_LB11, em_LB11, // 1 + em_LB7, em_LB7, em_LB7, em_LB7, em_LB10, em_LB10, em_LB10, em_LB10, em_LB9, em_LB9, em_LB9, em_LB9, em_LB8, em_LB8, em_LB8, em_LB8, // 2 + em_TL, em_TL, em_TL, em_TL, em_TL, em_TL, em_TL, em_TL, em_TL, em_TL, em_TL, em_TL, em_LB0, em_LB0, em_LB0, em_LB0, // 3 + + em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, // 4 + em_LDA, em_LDA, em_LDA, em_LDA, em_EXCP, em_EXCP, em_EXCP, em_EXCP, em_EXC0, em_EXC0, em_EXC0, em_EXC0, em_EXCM, em_EXCM, em_EXCM, em_EXCM, // 5 + em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_READ, // 6 + em_ADD, em_ADD, em_ADD, em_ADD, em_KSEG, 0, em_MTD, em_ATB, em_COMP, em_COMP, em_COMP, em_COMP, em_TAM, em_TAM, em_TAM, em_TAM, // 7 + + em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, // 8 + em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, // 9 + em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, // A + em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, // B + + em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, // C + em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, // D + em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, // E + em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, // F +}; + +offs_t a5500_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) +{ + return common_disasm(a5500_opmap, stream, pc, opcodes, params); +} + + // B5000 disasm (A5000 + TKBS added, MTD removed) const u8 b5000_disassembler::b5000_opmap[0x100] = @@ -234,7 +266,7 @@ offs_t b6000_disassembler::disassemble(std::ostream &stream, offs_t pc, const da } -// B6100 disasm +// B6100 disasm (B5500 + B6000) const u8 b6100_disassembler::b6100_opmap[0x100] = { diff --git a/src/devices/cpu/rw5000/rw5000d.h b/src/devices/cpu/rw5000/rw5000d.h index 24aacb5d032..45b86f8e2df 100644 --- a/src/devices/cpu/rw5000/rw5000d.h +++ b/src/devices/cpu/rw5000/rw5000d.h @@ -61,6 +61,18 @@ private: static const u8 a5000_opmap[0x100]; }; +class a5500_disassembler : public rw5000_common_disassembler +{ +public: + a5500_disassembler() = default; + virtual ~a5500_disassembler() = default; + + virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override; + +private: + static const u8 a5500_opmap[0x100]; +}; + class b5000_disassembler : public rw5000_common_disassembler { public: diff --git a/src/mame/drivers/hh_rw5000.cpp b/src/mame/drivers/hh_rw5000.cpp index 23d9f36cb15..12a56297f33 100644 --- a/src/mame/drivers/hh_rw5000.cpp +++ b/src/mame/drivers/hh_rw5000.cpp @@ -608,7 +608,7 @@ ROM_END Rockwell 8R, Rockwell 18R * B5000 MCU (label B5000CC, die label B5000) - * 8-digit 7seg display + * 8-digit 7seg LEDs This MCU was used in Rockwell 8R, 18R, and 9TR. It was also sold by Tandy (Radio Shack) as EC-220. @@ -718,7 +718,7 @@ ROM_END Rockwell 24K aka "the 24K" (see below for more) * A5900 MCU (label A5901CA/A5903CB, die label A59__) - * 9-digit 7seg display + * 9-digit 7seg VFD This MCU was used in Rockwell 14RD-II, 24RD-II, 24K, 24K II, 24MS, and probably also in 14RD, 24RD, 22K. diff --git a/src/mame/drivers/hh_sm510.cpp b/src/mame/drivers/hh_sm510.cpp index c16ab1c98d2..d73f901b9fd 100644 --- a/src/mame/drivers/hh_sm510.cpp +++ b/src/mame/drivers/hh_sm510.cpp @@ -9518,8 +9518,8 @@ static INPUT_PORTS_START( trshutvoy ) PORT_START("IN.3") // S4 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("+") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHANGED_CB(input_changed) PORT_NAME(UTF8_MULTIPLY) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME(UTF8_DIVIDE) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"×") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"÷") PORT_START("IN.4") // S5 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_CHANGED_CB(input_changed) PORT_NAME("ALM") @@ -9849,8 +9849,8 @@ static INPUT_PORTS_START( nummunch ) PORT_START("IN.3") // S4 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_CHANGED_CB(input_changed) PORT_NAME("Choose +") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_CHANGED_CB(input_changed) PORT_NAME("Choose -") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_CHANGED_CB(input_changed) PORT_NAME("Choose " UTF8_MULTIPLY) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_CHANGED_CB(input_changed) PORT_NAME("Choose " UTF8_DIVIDE) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"Choose ×") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"Choose ÷") PORT_START("IN.4") // S5 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("1") @@ -9873,8 +9873,8 @@ static INPUT_PORTS_START( nummunch ) PORT_START("IN.7") // S8 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("+") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHANGED_CB(input_changed) PORT_NAME(UTF8_MULTIPLY) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME(UTF8_DIVIDE) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"×") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"÷") PORT_START("ACL") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_CB(acl_button) diff --git a/src/tools/unidasm.cpp b/src/tools/unidasm.cpp index 678c56bb856..10dc53b06bf 100644 --- a/src/tools/unidasm.cpp +++ b/src/tools/unidasm.cpp @@ -377,6 +377,7 @@ static const dasm_table_entry dasm_table[] = { "alpha_vms", le, 0, []() -> util::disasm_interface * { return new alpha_disassembler(alpha_disassembler::TYPE_VMS); } }, { "alto2", be, -2, []() -> util::disasm_interface * { return new alto2_disassembler; } }, { "a5000", le, 0, []() -> util::disasm_interface * { return new a5000_disassembler; } }, + { "a5500", le, 0, []() -> util::disasm_interface * { return new a5500_disassembler; } }, { "am29000", be, 0, []() -> util::disasm_interface * { return new am29000_disassembler; } }, { "amis2000", le, 0, []() -> util::disasm_interface * { return new amis2000_disassembler; } }, { "apexc", be, 0, []() -> util::disasm_interface * { return new apexc_disassembler; } }, |