rw5000: added b5500

This commit is contained in:
hap 2022-04-10 13:24:48 +02:00
parent f768e0565e
commit cd52b38151
7 changed files with 164 additions and 0 deletions

View File

@ -2858,6 +2858,7 @@ end
--@src/devices/cpu/rw5000/a5500.h,CPUS["RW5000"] = true
--@src/devices/cpu/rw5000/a5900.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/b6100.h,CPUS["RW5000"] = true
--------------------------------------------------
@ -2869,6 +2870,8 @@ 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/b5500.cpp",
MAME_DIR .. "src/devices/cpu/rw5000/b5500.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",

View File

@ -0,0 +1,74 @@
// license:BSD-3-Clause
// copyright-holders:hap
/*
Rockwell B5500 MCU
*/
#include "emu.h"
#include "b5500.h"
#include "rw5000d.h"
DEFINE_DEVICE_TYPE(B5500, b5500_cpu_device, "b5500", "Rockwell B5500")
// constructor
b5500_cpu_device::b5500_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
b5000_cpu_device(mconfig, B5500, tag, owner, clock, 10, address_map_constructor(FUNC(b5500_cpu_device::program_768x8), this), 6, address_map_constructor(FUNC(b5500_cpu_device::data_48x4), this))
{ }
// internal memory maps
void b5500_cpu_device::program_768x8(address_map &map)
{
map(0x000, 0x27f).rom();
map(0x380, 0x3ff).rom();
}
void b5500_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> b5500_cpu_device::create_disassembler()
{
return std::make_unique<b5500_disassembler>();
}
//-------------------------------------------------
// execute
//-------------------------------------------------
void b5500_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;
// rest is same as B5000
default: b5000_cpu_device::execute_one(); break;
}
}
bool b5500_cpu_device::op_is_tl(u8 op)
{
return b5000_cpu_device::op_is_tl(op) || ((op & 0xfc) == 0x38);
}
bool b5500_cpu_device::op_is_lb(u8 op)
{
return b5000_cpu_device::op_is_lb(op) || ((op & 0xfc) == 0x1c);
}

View File

@ -0,0 +1,41 @@
// license:BSD-3-Clause
// copyright-holders:hap
/*
Rockwell B5500 MCU
*/
#ifndef MAME_CPU_RW5000_B5500_H
#define MAME_CPU_RW5000_B5500_H
#pragma once
#include "b5000.h"
class b5500_cpu_device : public b5000_cpu_device
{
public:
b5500_cpu_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;
// 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(B5500, b5500_cpu_device)
#endif // MAME_CPU_RW5000_B5500_H

View File

@ -234,6 +234,38 @@ offs_t b5000_disassembler::disassemble(std::ostream &stream, offs_t pc, const da
}
// B5500 disasm (B5000 + LB x,11, SC/RSC moved to make room for more TL)
const u8 b5500_disassembler::b5500_opmap[0x100] =
{
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
em_NOP, em_TC, em_TKB, em_TKBS, 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, 0, 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 b5500_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params)
{
return common_disasm(b5500_opmap, stream, pc, opcodes, params);
}
// B6000 disasm (B5000 + ATBZ added)
const u8 b6000_disassembler::b6000_opmap[0x100] =

View File

@ -85,6 +85,18 @@ private:
static const u8 b5000_opmap[0x100];
};
class b5500_disassembler : public rw5000_common_disassembler
{
public:
b5500_disassembler() = default;
virtual ~b5500_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 b5500_opmap[0x100];
};
class b6000_disassembler : public rw5000_common_disassembler
{
public:

View File

@ -19,6 +19,7 @@ ROM source notes when dumped from another model, but confident it's the same:
#include "cpu/rw5000/a5500.h"
#include "cpu/rw5000/a5900.h"
#include "cpu/rw5000/b5000.h"
#include "cpu/rw5000/b5500.h"
#include "cpu/rw5000/b6000.h"
#include "cpu/rw5000/b6100.h"
#include "video/pwm.h"

View File

@ -394,6 +394,7 @@ static const dasm_table_entry dasm_table[] =
{ "axc51core", le, 0, []() -> util::disasm_interface * { return new axc51core_disassembler; } },
{ "axc208", le, 0, []() -> util::disasm_interface * { return new ax208_disassembler; } },
{ "b5000", le, 0, []() -> util::disasm_interface * { return new b5000_disassembler; } },
{ "b5500", le, 0, []() -> util::disasm_interface * { return new b5500_disassembler; } },
{ "b6000", le, 0, []() -> util::disasm_interface * { return new b6000_disassembler; } },
{ "b6100", le, 0, []() -> util::disasm_interface * { return new b6100_disassembler; } },
{ "capricorn", le, 0, []() -> util::disasm_interface * { return new capricorn_disassembler; } },