rw5000: add a5500

This commit is contained in:
hap 2022-03-29 15:14:55 +02:00
parent bf7961cd45
commit 9d9ec1a2f7
8 changed files with 181 additions and 11 deletions

View File

@ -2855,6 +2855,7 @@ end
-------------------------------------------------- --------------------------------------------------
-- Rockwell A/B5000 family -- Rockwell A/B5000 family
--@src/devices/cpu/rw5000/a5000.h,CPUS["RW5000"] = true --@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/b5000.h,CPUS["RW5000"] = true
--@src/devices/cpu/rw5000/b6000.h,CPUS["RW5000"] = true --@src/devices/cpu/rw5000/b6000.h,CPUS["RW5000"] = true
--@src/devices/cpu/rw5000/b6100.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.cpp",
MAME_DIR .. "src/devices/cpu/rw5000/b5000.h", MAME_DIR .. "src/devices/cpu/rw5000/b5000.h",
MAME_DIR .. "src/devices/cpu/rw5000/b5000op.cpp", 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.cpp",
MAME_DIR .. "src/devices/cpu/rw5000/b6000.h", MAME_DIR .. "src/devices/cpu/rw5000/b6000.h",
MAME_DIR .. "src/devices/cpu/rw5000/b6100.cpp", MAME_DIR .. "src/devices/cpu/rw5000/b6100.cpp",
MAME_DIR .. "src/devices/cpu/rw5000/b6100.h", 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 end

View File

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

View File

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

View File

@ -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 &params)
{
return common_disasm(a5500_opmap, stream, pc, opcodes, params);
}
// B5000 disasm (A5000 + TKBS added, MTD removed) // B5000 disasm (A5000 + TKBS added, MTD removed)
const u8 b5000_disassembler::b5000_opmap[0x100] = 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] = const u8 b6100_disassembler::b6100_opmap[0x100] =
{ {

View File

@ -61,6 +61,18 @@ private:
static const u8 a5000_opmap[0x100]; 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 &params) override;
private:
static const u8 a5500_opmap[0x100];
};
class b5000_disassembler : public rw5000_common_disassembler class b5000_disassembler : public rw5000_common_disassembler
{ {
public: public:

View File

@ -608,7 +608,7 @@ ROM_END
Rockwell 8R, Rockwell 18R Rockwell 8R, Rockwell 18R
* B5000 MCU (label B5000CC, die label B5000) * 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 This MCU was used in Rockwell 8R, 18R, and 9TR. It was also sold by
Tandy (Radio Shack) as EC-220. Tandy (Radio Shack) as EC-220.
@ -718,7 +718,7 @@ ROM_END
Rockwell 24K aka "the 24K" (see below for more) Rockwell 24K aka "the 24K" (see below for more)
* A5900 MCU (label A5901CA/A5903CB, die label A59__) * 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 This MCU was used in Rockwell 14RD-II, 24RD-II, 24K, 24K II, 24MS, and
probably also in 14RD, 24RD, 22K. probably also in 14RD, 24RD, 22K.

View File

@ -9518,8 +9518,8 @@ static INPUT_PORTS_START( trshutvoy )
PORT_START("IN.3") // S4 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( 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( 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( 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(UTF8_DIVIDE) 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_START("IN.4") // S5
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_CHANGED_CB(input_changed) PORT_NAME("ALM") 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_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( 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( 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( 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("Choose " UTF8_DIVIDE) 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_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") 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_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( 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( 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( 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(UTF8_DIVIDE) 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_START("ACL")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_CB(acl_button) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_CB(acl_button)

View File

@ -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); } }, { "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; } }, { "alto2", be, -2, []() -> util::disasm_interface * { return new alto2_disassembler; } },
{ "a5000", le, 0, []() -> util::disasm_interface * { return new a5000_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; } }, { "am29000", be, 0, []() -> util::disasm_interface * { return new am29000_disassembler; } },
{ "amis2000", le, 0, []() -> util::disasm_interface * { return new amis2000_disassembler; } }, { "amis2000", le, 0, []() -> util::disasm_interface * { return new amis2000_disassembler; } },
{ "apexc", be, 0, []() -> util::disasm_interface * { return new apexc_disassembler; } }, { "apexc", be, 0, []() -> util::disasm_interface * { return new apexc_disassembler; } },