From e76e82c9e4cdf4e984fc898ee4f92db3468c38e1 Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Sun, 5 Feb 2023 16:48:15 +0100 Subject: scc68070: Revert to use musashi for now, it's very much not a traditional 68000. --- scripts/src/cpu.lua | 2 ++ src/devices/cpu/m68000/scc68070.cpp | 24 ++++++++++++++++++++++++ src/devices/cpu/m68000/scc68070.h | 26 ++++++++++++++++++++++++++ src/devices/machine/68307.cpp | 2 +- src/devices/machine/68340.cpp | 2 +- src/devices/machine/scc68070.cpp | 22 +++++----------------- src/devices/machine/scc68070.h | 8 ++++---- src/mame/philips/cdi.cpp | 28 +++++++++++++++++++++++++++- src/mame/philips/cdi.h | 3 +++ 9 files changed, 93 insertions(+), 24 deletions(-) create mode 100644 src/devices/cpu/m68000/scc68070.cpp create mode 100644 src/devices/cpu/m68000/scc68070.h diff --git a/scripts/src/cpu.lua b/scripts/src/cpu.lua index d66d9c08153..4fcc94d25c5 100644 --- a/scripts/src/cpu.lua +++ b/scripts/src/cpu.lua @@ -1955,6 +1955,8 @@ if CPUS["M680X0"] then MAME_DIR .. "src/devices/cpu/m68000/m68030.cpp", MAME_DIR .. "src/devices/cpu/m68000/m68040.h", MAME_DIR .. "src/devices/cpu/m68000/m68040.cpp", + MAME_DIR .. "src/devices/cpu/m68000/scc68070.h", + MAME_DIR .. "src/devices/cpu/m68000/scc68070.cpp", MAME_DIR .. "src/devices/cpu/m68000/fscpu32.h", MAME_DIR .. "src/devices/cpu/m68000/fscpu32.cpp", MAME_DIR .. "src/devices/cpu/m68000/mcf5206e.h", diff --git a/src/devices/cpu/m68000/scc68070.cpp b/src/devices/cpu/m68000/scc68070.cpp new file mode 100644 index 00000000000..8d612f46bfa --- /dev/null +++ b/src/devices/cpu/m68000/scc68070.cpp @@ -0,0 +1,24 @@ +// license:BSD-3-Clause +// copyright-holders:Karl Stenerud + +#include "emu.h" +#include "scc68070.h" +#include "m68kdasm.h" + +std::unique_ptr scc68070_base_device::create_disassembler() +{ + return std::make_unique(m68k_disassembler::TYPE_68000); +} + + +scc68070_base_device::scc68070_base_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock, + const device_type type, address_map_constructor internal_map) + : m68000_musashi_device(mconfig, tag, owner, clock, type, 16,32, internal_map) +{ +} + +void scc68070_base_device::device_start() +{ + m68000_musashi_device::device_start(); + init_cpu_scc68070(); +} diff --git a/src/devices/cpu/m68000/scc68070.h b/src/devices/cpu/m68000/scc68070.h new file mode 100644 index 00000000000..031d9542b14 --- /dev/null +++ b/src/devices/cpu/m68000/scc68070.h @@ -0,0 +1,26 @@ +// license:BSD-3-Clause +// copyright-holders:Karl Stenerud +#ifndef MAME_CPU_M68000_SCC68070_H +#define MAME_CPU_M68000_SCC68070_H + +#pragma once + +#include "m68kmusashi.h" + +class scc68070_base_device : public m68000_musashi_device +{ +protected: + virtual std::unique_ptr create_disassembler() override; + + virtual u32 execute_min_cycles() const noexcept override { return 4; } + virtual u32 execute_max_cycles() const noexcept override { return 158; } + + // device-level overrides + virtual void device_start() override; + + scc68070_base_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock, + const device_type type, address_map_constructor internal_map); +}; + +#endif + diff --git a/src/devices/machine/68307.cpp b/src/devices/machine/68307.cpp index c955af42fcf..3543b0c3e7c 100644 --- a/src/devices/machine/68307.cpp +++ b/src/devices/machine/68307.cpp @@ -230,7 +230,7 @@ uint8_t m68307_cpu_device::int_ack(offs_t offset) void m68307_cpu_device::device_start() { - reset_cb().append(FUNC(m68307_cpu_device::reset_peripherals)); + reset_cb().append(*this, FUNC(m68307_cpu_device::reset_peripherals)); m68000_device::device_start(); diff --git a/src/devices/machine/68340.cpp b/src/devices/machine/68340.cpp index 6230683be0f..b01e996f6ba 100644 --- a/src/devices/machine/68340.cpp +++ b/src/devices/machine/68340.cpp @@ -256,7 +256,7 @@ WRITE_LINE_MEMBER( m68340_cpu_device::set_modck ) void m68340_cpu_device::device_start() { - reset_cb().append(FUNC(m68340_cpu_device::reset_peripherals)); + reset_cb().append(*this, FUNC(m68340_cpu_device::reset_peripherals)); fscpu32_device::device_start(); diff --git a/src/devices/machine/scc68070.cpp b/src/devices/machine/scc68070.cpp index 713707575a9..7d5ceb81c1a 100644 --- a/src/devices/machine/scc68070.cpp +++ b/src/devices/machine/scc68070.cpp @@ -239,7 +239,7 @@ void scc68070_device::cpu_space_map(address_map &map) //------------------------------------------------- scc68070_device::scc68070_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : m68000_device(mconfig, SCC68070, tag, owner, clock) + : scc68070_base_device(mconfig, tag, owner, clock, SCC68070, address_map_constructor(FUNC(scc68070_device::internal_map), this)) , m_iack2_callback(*this) , m_iack4_callback(*this) , m_iack5_callback(*this) @@ -258,18 +258,6 @@ scc68070_device::scc68070_device(const machine_config &mconfig, const char *tag, , m_int2_line(CLEAR_LINE) { m_cpu_space_config.m_internal_map = address_map_constructor(FUNC(scc68070_device::cpu_space_map), this); - - m_cpu_space_config.m_addr_width = 32; - m_program_config.m_addr_width = 32; - m_opcodes_config.m_addr_width = 32; - m_uprogram_config.m_addr_width = 32; - m_uopcodes_config.m_addr_width = 32; - - auto imap = address_map_constructor(FUNC(scc68070_device::internal_map), this); - m_program_config.m_internal_map = imap; - m_opcodes_config.m_internal_map = imap; - m_uprogram_config.m_internal_map = imap; - m_uopcodes_config.m_internal_map = imap; } //------------------------------------------------- @@ -280,7 +268,7 @@ scc68070_device::scc68070_device(const machine_config &mconfig, const char *tag, void scc68070_device::device_resolve_objects() { - m68000_device::device_resolve_objects(); + scc68070_base_device::device_resolve_objects(); m_iack2_callback.resolve_safe(autovector(2)); m_iack4_callback.resolve_safe(autovector(4)); @@ -299,9 +287,9 @@ void scc68070_device::device_resolve_objects() void scc68070_device::device_start() { - reset_cb().append(FUNC(scc68070_device::reset_peripherals)); + reset_cb().append(*this, FUNC(scc68070_device::reset_peripherals)); - m68000_device::device_start(); + scc68070_base_device::device_start(); save_item(NAME(m_ipl)); @@ -392,7 +380,7 @@ void scc68070_device::device_start() void scc68070_device::device_reset() { - m68000_device::device_reset(); + scc68070_base_device::device_reset(); m_lir = 0; diff --git a/src/devices/machine/scc68070.h b/src/devices/machine/scc68070.h index b78985f0db2..9fe0662345b 100644 --- a/src/devices/machine/scc68070.h +++ b/src/devices/machine/scc68070.h @@ -26,7 +26,7 @@ TODO: #pragma once -#include "cpu/m68000/m68000.h" +#include "cpu/m68000/scc68070.h" //************************************************************************** // TYPE DEFINITIONS @@ -43,7 +43,7 @@ enum scc68070_ocr_bits // ======================> scc68070_device -class scc68070_device : public m68000_device +class scc68070_device : public scc68070_base_device { public: scc68070_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -199,12 +199,12 @@ protected: virtual u64 execute_clocks_to_cycles(u64 clocks) const noexcept override { return (clocks + 2 - 1) / 2; } virtual u64 execute_cycles_to_clocks(u64 cycles) const noexcept override { return (cycles * 2); } - DECLARE_WRITE_LINE_MEMBER(reset_peripherals); - private: void internal_map(address_map &map); void cpu_space_map(address_map &map); + DECLARE_WRITE_LINE_MEMBER(reset_peripherals); + void update_ipl(); uint8_t iack_r(offs_t offset); diff --git a/src/mame/philips/cdi.cpp b/src/mame/philips/cdi.cpp index 2d500589075..b8dd96dbf3e 100644 --- a/src/mame/philips/cdi.cpp +++ b/src/mame/philips/cdi.cpp @@ -84,7 +84,7 @@ TODO: void cdi_state::cdimono1_mem(address_map &map) { - map(0x000000, 0xffffff).rw(m_maincpu, FUNC(scc68070_device::berr_r), FUNC(scc68070_device::berr_w)); + map(0x000000, 0xffffff).rw(FUNC(cdi_state::bus_error_r), FUNC(cdi_state::bus_error_w)); map(0x000000, 0x07ffff).rw(FUNC(cdi_state::plane_r<0>), FUNC(cdi_state::plane_w<0>)).share("plane0"); map(0x200000, 0x27ffff).rw(FUNC(cdi_state::plane_r<1>), FUNC(cdi_state::plane_w<1>)).share("plane1"); map(0x300000, 0x303bff).rw(m_cdic, FUNC(cdicdic_device::ram_r), FUNC(cdicdic_device::ram_w)); @@ -238,6 +238,32 @@ uint16_t cdi_state::main_rom_r(offs_t offset) } +/********************** +* BERR Handling * +**********************/ + +uint16_t cdi_state::bus_error_r(offs_t offset) +{ + if(!machine().side_effects_disabled()) + { + m_maincpu->set_buserror_details(offset*2, true, m_maincpu->get_fc()); + m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE); + m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE); + } + return 0xff; +} + +void cdi_state::bus_error_w(offs_t offset, uint16_t data) +{ + if(!machine().side_effects_disabled()) + { + m_maincpu->set_buserror_details(offset*2, false, m_maincpu->get_fc()); + m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE); + m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE); + } +} + + /********************** * Quizard Protection * **********************/ diff --git a/src/mame/philips/cdi.h b/src/mame/philips/cdi.h index 5c9371f19eb..83fca558144 100644 --- a/src/mame/philips/cdi.h +++ b/src/mame/philips/cdi.h @@ -69,6 +69,9 @@ private: uint16_t dvc_r(offs_t offset, uint16_t mem_mask = ~0); void dvc_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + uint16_t bus_error_r(offs_t offset); + void bus_error_w(offs_t offset, uint16_t data); + required_shared_ptr_array m_plane_ram; optional_device m_servo; optional_device m_slave; -- cgit v1.2.3