diff options
Diffstat (limited to 'src/devices/bus/bbc/tube/tube_80186.cpp')
| -rw-r--r-- | src/devices/bus/bbc/tube/tube_80186.cpp | 144 |
1 files changed, 89 insertions, 55 deletions
diff --git a/src/devices/bus/bbc/tube/tube_80186.cpp b/src/devices/bus/bbc/tube/tube_80186.cpp index 245cd3ff0e1..c8fb4facbde 100644 --- a/src/devices/bus/bbc/tube/tube_80186.cpp +++ b/src/devices/bus/bbc/tube/tube_80186.cpp @@ -8,18 +8,80 @@ **********************************************************************/ - #include "emu.h" #include "tube_80186.h" + +#include "cpu/i86/i186.h" +#include "machine/ram.h" +#include "machine/tube.h" + #include "softlist_dev.h" -//************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** +namespace { + +// ======================> bbc_tube_80186_device + +class bbc_tube_80186_device : public device_t, public device_bbc_tube_interface +{ +public: + bbc_tube_80186_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : bbc_tube_80186_device(mconfig, BBC_TUBE_80186, tag, owner, clock) + { + } + +protected: + bbc_tube_80186_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_i80186(*this, "i80186") + , m_ula(*this, "ula") + , m_ram(*this, "ram") + , m_bootstrap(*this, "bootstrap") + { + } -DEFINE_DEVICE_TYPE(BBC_TUBE_80186, bbc_tube_80186_device, "bbc_tube_80186", "Acorn 80186 Co-Processor") -DEFINE_DEVICE_TYPE(BBC_TUBE_PCPLUS, bbc_tube_pcplus_device, "bbc_tube_pcplus", "Solidisk PC-Plus Co-Processor") + // 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; + + virtual uint8_t host_r(offs_t offset) override; + virtual void host_w(offs_t offset, uint8_t data) override; + + required_device<i80186_cpu_device> m_i80186; + required_device<tube_device> m_ula; + required_device<ram_device> m_ram; + required_memory_region m_bootstrap; + + void tube_80186_io(address_map &map) ATTR_COLD; + void tube_80186_mem(address_map &map) ATTR_COLD; + + void prst_w(int state); +}; + + +// ======================> bbc_tube_pcplus_device + +class bbc_tube_pcplus_device : public bbc_tube_80186_device +{ +public: + bbc_tube_pcplus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : bbc_tube_80186_device(mconfig, BBC_TUBE_PCPLUS, tag, owner, clock) + { + } + +protected: + // device_t overrides + 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; +}; //------------------------------------------------- @@ -40,8 +102,9 @@ void bbc_tube_80186_device::tube_80186_io(address_map &map) map(0x80, 0x8f).rw("ula", FUNC(tube_device::parasite_r), FUNC(tube_device::parasite_w)).umask16(0x00ff); } + //------------------------------------------------- -// ROM( tube_80186 ) +// rom_region - device-specific ROM region //------------------------------------------------- ROM_START( tube_80186 ) @@ -50,16 +113,24 @@ ROM_START( tube_80186 ) ROM_LOAD16_BYTE("m512_hi_ic32.rom", 0x0001, 0x2000, CRC(e47f10b2) SHA1(45dc8d7e7936afbec6de423569d9005a1c350316)) // 2201,288-02 ROM_END -//------------------------------------------------- -// ROM( tube_pcplus ) -//------------------------------------------------- - ROM_START( tube_pcplus ) ROM_REGION(0x4000, "bootstrap", 0) ROM_LOAD16_BYTE("pcplus_ic31.rom", 0x0000, 0x2000, CRC(5149417b) SHA1(a905c8570d70597bb2b2fca47a1a47783956af9c)) ROM_LOAD16_BYTE("pcplus_ic32.rom", 0x0001, 0x2000, CRC(e47f10b2) SHA1(45dc8d7e7936afbec6de423569d9005a1c350316)) ROM_END + +const tiny_rom_entry *bbc_tube_80186_device::device_rom_region() const +{ + return ROM_NAME( tube_80186 ); +} + +const tiny_rom_entry *bbc_tube_pcplus_device::device_rom_region() const +{ + return ROM_NAME( tube_pcplus ); +} + + //------------------------------------------------- // device_add_mconfig - add device configuration //------------------------------------------------- @@ -77,10 +148,8 @@ void bbc_tube_80186_device::device_add_mconfig(machine_config &config) m_ula->drq_handler().set(m_i80186, FUNC(i80186_cpu_device::drq0_w)); m_ula->prst_handler().set(FUNC(bbc_tube_80186_device::prst_w)); - /* internal ram */ RAM(config, m_ram).set_default_size("512K"); - /* software lists */ SOFTWARE_LIST(config, "flop_ls_80186").set_original("bbc_flop_80186"); SOFTWARE_LIST(config, "pc_disk_list").set_compatible("ibm5150"); } @@ -89,51 +158,9 @@ void bbc_tube_pcplus_device::device_add_mconfig(machine_config &config) { bbc_tube_80186_device::device_add_mconfig(config); - /* internal ram */ m_ram->set_default_size("1M"); } -//------------------------------------------------- -// rom_region - device-specific ROM region -//------------------------------------------------- - -const tiny_rom_entry *bbc_tube_80186_device::device_rom_region() const -{ - return ROM_NAME( tube_80186 ); -} - -const tiny_rom_entry *bbc_tube_pcplus_device::device_rom_region() const -{ - return ROM_NAME( tube_pcplus ); -} - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// bbc_tube_80186_device - constructor -//------------------------------------------------- - -bbc_tube_80186_device::bbc_tube_80186_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_i80186(*this, "i80186") - , m_ula(*this, "ula") - , m_ram(*this, "ram") - , m_bootstrap(*this, "bootstrap") -{ -} - -bbc_tube_80186_device::bbc_tube_80186_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : bbc_tube_80186_device(mconfig, BBC_TUBE_80186, tag, owner, clock) -{ -} - -bbc_tube_pcplus_device::bbc_tube_pcplus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : bbc_tube_80186_device(mconfig, BBC_TUBE_PCPLUS, tag, owner, clock) -{ -} //------------------------------------------------- // device_start - device-specific startup @@ -165,6 +192,7 @@ void bbc_tube_pcplus_device::device_reset() program.install_rom(0xf0000, 0xf3fff, 0x0c000, m_bootstrap->base()); } + //************************************************************************** // IMPLEMENTATION //************************************************************************** @@ -185,3 +213,9 @@ void bbc_tube_80186_device::host_w(offs_t offset, uint8_t data) { m_ula->host_w(offset, data); } + +} // anonymous namespace + + +DEFINE_DEVICE_TYPE_PRIVATE(BBC_TUBE_80186, device_bbc_tube_interface, bbc_tube_80186_device, "bbc_tube_80186", "Acorn 80186 Co-Processor") +DEFINE_DEVICE_TYPE_PRIVATE(BBC_TUBE_PCPLUS, device_bbc_tube_interface, bbc_tube_pcplus_device, "bbc_tube_pcplus", "Solidisk PC-Plus Co-Processor") |
