mirror of
https://github.com/holub/mame
synced 2025-06-06 21:03:47 +03:00
rw5000: add a5500
This commit is contained in:
parent
bf7961cd45
commit
9d9ec1a2f7
@ -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
|
||||
|
||||
|
79
src/devices/cpu/rw5000/a5500.cpp
Normal file
79
src/devices/cpu/rw5000/a5500.cpp
Normal 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);
|
||||
}
|
43
src/devices/cpu/rw5000/a5500.h
Normal file
43
src/devices/cpu/rw5000/a5500.h
Normal 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
|
@ -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] =
|
||||
{
|
||||
|
@ -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:
|
||||
|
@ -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.
|
||||
|
@ -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)
|
||||
|
@ -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; } },
|
||||
|
Loading…
Reference in New Issue
Block a user