diff options
Diffstat (limited to 'src/devices/bus/bbc/tube/tube_6502.cpp')
| -rw-r--r-- | src/devices/bus/bbc/tube/tube_6502.cpp | 227 |
1 files changed, 153 insertions, 74 deletions
diff --git a/src/devices/bus/bbc/tube/tube_6502.cpp b/src/devices/bus/bbc/tube/tube_6502.cpp index 360362634f7..02c87cf060b 100644 --- a/src/devices/bus/bbc/tube/tube_6502.cpp +++ b/src/devices/bus/bbc/tube/tube_6502.cpp @@ -24,20 +24,135 @@ **********************************************************************/ - #include "emu.h" #include "tube_6502.h" + +#include "cpu/m6502/g65sc02.h" +#include "cpu/m6502/r65c02.h" +#include "machine/ram.h" +#include "machine/tube.h" + #include "softlist_dev.h" -//************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** +namespace { + +// ======================> bbc_tube_6502_device + +class bbc_tube_6502_device : public device_t, public device_bbc_tube_interface +{ +public: + bbc_tube_6502_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : bbc_tube_6502_device(mconfig, BBC_TUBE_6502, tag, owner, clock) + { + } + +protected: + bbc_tube_6502_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, type, tag, owner, clock) + , device_bbc_tube_interface(mconfig, *this) + , m_maincpu(*this, "maincpu") + , m_view(*this, "view") + , m_ula(*this, "ula") + , m_ram(*this, "ram") + , m_rom(*this, "rom") + { + } + + // device_t overrides + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + + // optional information overrides + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; -DEFINE_DEVICE_TYPE(BBC_TUBE_6502, bbc_tube_6502_device, "bbc_tube_6502", "Acorn 6502 2nd Processor") -DEFINE_DEVICE_TYPE(BBC_TUBE_6502P, bbc_tube_6502p_device, "bbc_tube_6502p", "Acorn 6502 2nd Processor (pre-production)") -DEFINE_DEVICE_TYPE(BBC_TUBE_6502E, bbc_tube_6502e_device, "bbc_tube_6502e", "Acorn Extended 6502 2nd Processor") -DEFINE_DEVICE_TYPE(BBC_TUBE_65C102, bbc_tube_65c102_device, "bbc_tube_65c102", "Acorn 65C102 Co-Processor") + void tube_6502_mem(address_map &map) ATTR_COLD; + + virtual uint8_t host_r(offs_t offset) override; + virtual void host_w(offs_t offset, uint8_t data) override; + + virtual uint8_t tube_r(offs_t offset); + virtual void tube_w(offs_t offset, uint8_t data); + + required_device<m6502_device> m_maincpu; + memory_view m_view; + required_device<tube_device> m_ula; + required_device<ram_device> m_ram; + required_memory_region m_rom; + + void prst_w(int state); +}; + + +// ======================> bbc_tube_6502p_device + +class bbc_tube_6502p_device : public bbc_tube_6502_device +{ +public: + bbc_tube_6502p_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : bbc_tube_6502_device(mconfig, BBC_TUBE_6502P, tag, owner, clock) + { + } + +protected: + // optional information overrides + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + +private: + void tube_6502p_mem(address_map &map) ATTR_COLD; +}; + + +// ======================> bbc_tube_6502e_device + +class bbc_tube_6502e_device : public bbc_tube_6502_device +{ +public: + bbc_tube_6502e_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : bbc_tube_6502_device(mconfig, BBC_TUBE_6502E, tag, owner, clock) + , m_opcode_ind_y(false) + , m_page(0) + , m_cycles(0) + { + } + +protected: + // device_t overrides + virtual void device_start() override ATTR_COLD; + + // optional information overrides + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + +private: + void tube_6502e_mem(address_map &map) ATTR_COLD; + + uint8_t ram_r(offs_t offset); + void ram_w(offs_t offset, uint8_t data); + + bool m_opcode_ind_y; + uint8_t m_page; + uint64_t m_cycles; +}; + + +// ======================> bbc_tube_65c102_device + +class bbc_tube_65c102_device : public bbc_tube_6502_device +{ +public: + bbc_tube_65c102_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : bbc_tube_6502_device(mconfig, BBC_TUBE_65C102, tag, owner, clock) + { + } + +protected: + // optional information overrides + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; +}; //------------------------------------------------- @@ -79,7 +194,7 @@ void bbc_tube_6502e_device::tube_6502e_mem(address_map &map) //------------------------------------------------- -// ROM( tube_6502 ) +// rom_region - device-specific ROM region //------------------------------------------------- ROM_START( tube_6502 ) @@ -124,6 +239,27 @@ ROM_START( tube_65c102 ) ROM_END +const tiny_rom_entry *bbc_tube_6502_device::device_rom_region() const +{ + return ROM_NAME( tube_6502 ); +} + +const tiny_rom_entry *bbc_tube_6502p_device::device_rom_region() const +{ + return ROM_NAME( tube_6502p ); +} + +const tiny_rom_entry *bbc_tube_6502e_device::device_rom_region() const +{ + return ROM_NAME( tube_6502e ); +} + +const tiny_rom_entry *bbc_tube_65c102_device::device_rom_region() const +{ + return ROM_NAME( tube_65c102 ); +} + + //------------------------------------------------- // device_add_mconfig - add device configuration //------------------------------------------------- @@ -169,71 +305,6 @@ void bbc_tube_65c102_device::device_add_mconfig(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &bbc_tube_65c102_device::tube_6502_mem); } -//------------------------------------------------- -// rom_region - device-specific ROM region -//------------------------------------------------- - -const tiny_rom_entry *bbc_tube_6502_device::device_rom_region() const -{ - return ROM_NAME( tube_6502 ); -} - -const tiny_rom_entry *bbc_tube_6502p_device::device_rom_region() const -{ - return ROM_NAME( tube_6502p ); -} - -const tiny_rom_entry *bbc_tube_6502e_device::device_rom_region() const -{ - return ROM_NAME( tube_6502e ); -} - -const tiny_rom_entry *bbc_tube_65c102_device::device_rom_region() const -{ - return ROM_NAME( tube_65c102 ); -} - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// bbc_tube_6502_device - constructor -//------------------------------------------------- - -bbc_tube_6502_device::bbc_tube_6502_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, type, tag, owner, clock) - , device_bbc_tube_interface(mconfig, *this) - , m_maincpu(*this, "maincpu") - , m_view(*this, "view") - , m_ula(*this, "ula") - , m_ram(*this, "ram") - , m_rom(*this, "rom") -{ -} - -bbc_tube_6502_device::bbc_tube_6502_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : bbc_tube_6502_device(mconfig, BBC_TUBE_6502, tag, owner, clock) -{ -} - -bbc_tube_6502p_device::bbc_tube_6502p_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : bbc_tube_6502_device(mconfig, BBC_TUBE_6502P, tag, owner, clock) -{ -} - -bbc_tube_6502e_device::bbc_tube_6502e_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : bbc_tube_6502_device(mconfig, BBC_TUBE_6502E, tag, owner, clock) - , m_opcode_ind_y(false) - , m_page(0) - , m_cycles(0) -{ -} - -bbc_tube_65c102_device::bbc_tube_65c102_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : bbc_tube_6502_device(mconfig, BBC_TUBE_65C102, tag, owner, clock) -{ -} //------------------------------------------------- // device_start - device-specific startup @@ -342,3 +413,11 @@ void bbc_tube_6502e_device::ram_w(offs_t offset, uint8_t data) m_ram->pointer()[offset] = data; } } + +} // anonymous namespace + + +DEFINE_DEVICE_TYPE_PRIVATE(BBC_TUBE_6502, device_bbc_tube_interface, bbc_tube_6502_device, "bbc_tube_6502", "Acorn 6502 2nd Processor") +DEFINE_DEVICE_TYPE_PRIVATE(BBC_TUBE_6502P, device_bbc_tube_interface, bbc_tube_6502p_device, "bbc_tube_6502p", "Acorn 6502 2nd Processor (pre-production)") +DEFINE_DEVICE_TYPE_PRIVATE(BBC_TUBE_6502E, device_bbc_tube_interface, bbc_tube_6502e_device, "bbc_tube_6502e", "Acorn Extended 6502 2nd Processor") +DEFINE_DEVICE_TYPE_PRIVATE(BBC_TUBE_65C102, device_bbc_tube_interface, bbc_tube_65c102_device, "bbc_tube_65c102", "Acorn 65C102 Co-Processor") |
