summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/bbc/tube/tube_6502.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/bbc/tube/tube_6502.cpp')
-rw-r--r--src/devices/bus/bbc/tube/tube_6502.cpp227
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")