From 98997ad1ba9e381ae678a0ee79156fb2e68ccc7c Mon Sep 17 00:00:00 2001 From: Nigel Barnes Date: Thu, 7 Nov 2019 13:40:03 +0000 Subject: bbcm: Added Solidisk PC-Plus co-processor. [Nigel Barnes, Centre for Computing History] --- src/devices/bus/bbc/tube/tube.cpp | 10 +++++-- src/devices/bus/bbc/tube/tube_80186.cpp | 53 +++++++++++++++++++++++++++++---- src/devices/bus/bbc/tube/tube_80186.h | 21 +++++++++++-- 3 files changed, 73 insertions(+), 11 deletions(-) diff --git a/src/devices/bus/bbc/tube/tube.cpp b/src/devices/bus/bbc/tube/tube.cpp index 6fa9dc700f6..2665398959e 100644 --- a/src/devices/bus/bbc/tube/tube.cpp +++ b/src/devices/bus/bbc/tube/tube.cpp @@ -110,17 +110,18 @@ void bbc_tube_devices(device_slot_interface &device) { device.option_add("6502", BBC_TUBE_6502); /* Acorn ANC01 6502 2nd processor */ device.option_add("z80", BBC_TUBE_Z80); /* Acorn ANC04 Z80 2nd processor */ - device.option_add("32016", BBC_TUBE_32016); /* Acorn ANC05 32016 2nd processor */ + device.option_add("32016", BBC_TUBE_32016); /* Acorn ANC05 32016 2nd processor */ device.option_add("arm", BBC_TUBE_ARM); /* Acorn ANC13 ARM Evaluation System */ device.option_add("80286", BBC_TUBE_80286); /* Acorn 80286 2nd Processor */ //device.option_add("a500", BBC_TUBE_A500); /* Acorn A500 2nd Processor */ device.option_add("casper", BBC_TUBE_CASPER); /* Casper 68000 2nd Processor */ //device.option_add("pmsb2p", BBC_TUBE_PMSB2P); /* PMS B2P-6502 */ - //device.option_add("hdp68k", BBC_TUBE_HDP68K); /* Torch Unicorn (HDP68K) */ + device.option_add("pcplus", BBC_TUBE_PCPLUS); /* Solidisk PC-Plus co-processor */ //device.option_add("x25", BBC_TUBE_X25); /* Econet X25 Gateway */ device.option_add("zep100", BBC_TUBE_ZEP100); /* Torch Z80 Communicator (ZEP100) (Torch) */ //device.option_add("zep100l", BBC_TUBE_ZEP100L); /* Torch Z80 Communicator (ZEP100) (Model B) */ //device.option_add("zep100w", BBC_TUBE_ZEP100W); /* Torch Z80 Communicator (ZEP100) (Model B+) */ + /* Acorn ANC21 Universal 2nd Processor Unit */ device.option_add("65c102", BBC_TUBE_65C102); /* Acorn ADC06 65C102 co-processor */ device.option_add("80186", BBC_TUBE_80186); /* Acorn ADC08 80186 co-processor */ @@ -137,12 +138,14 @@ void bbc_extube_devices(device_slot_interface &device) { device.option_add("6502", BBC_TUBE_6502); /* Acorn ANC01 6502 2nd processor */ device.option_add("z80", BBC_TUBE_Z80); /* Acorn ANC04 Z80 2nd processor */ - device.option_add("32016", BBC_TUBE_32016); /* Acorn ANC05 32016 2nd processor */ + device.option_add("32016", BBC_TUBE_32016); /* Acorn ANC05 32016 2nd processor */ device.option_add("arm", BBC_TUBE_ARM); /* Acorn ANC13 ARM Evaluation System */ device.option_add("80286", BBC_TUBE_80286); /* Acorn 80286 2nd Processor */ + device.option_add("pcplus", BBC_TUBE_PCPLUS); /* Solidisk PC-Plus co-processor */ //device.option_add("a500", BBC_TUBE_A500); /* Acorn A500 2nd Processor */ //device.option_add("pmsb2p", BBC_TUBE_PMSB2P); /* PMS B2P-6502 */ //device.option_add("zep100m", BBC_TUBE_ZEP100M); /* Torch Z80 Communicator (ZEP100) (Master) */ + /* Acorn ANC21 Universal 2nd Processor Unit */ device.option_add("65c102", BBC_TUBE_65C102); /* Acorn ADC06 65C102 co-processor */ device.option_add("80186", BBC_TUBE_80186); /* Acorn ADC08 80186 co-processor */ @@ -177,6 +180,7 @@ void electron_tube_devices(device_slot_interface &device) device.option_add("arm", BBC_TUBE_ARM); /* Acorn ANC13 ARM Evaluation System */ device.option_add("65c102", BBC_TUBE_65C102); /* Acorn ADC06 65C102 co-processor */ device.option_add("80186", BBC_TUBE_80186); /* Acorn ADC08 80186 co-processor */ + device.option_add("pcplus", BBC_TUBE_PCPLUS); /* Solidisk PC-Plus co-processor */ device.option_add("rc6502", BBC_TUBE_RC6502); /* ReCo6502 (6502) */ device.option_add("rc65816", BBC_TUBE_RC65816); /* ReCo6502 (65816) */ } diff --git a/src/devices/bus/bbc/tube/tube_80186.cpp b/src/devices/bus/bbc/tube/tube_80186.cpp index 85331ab1b2a..9621110e7ca 100644 --- a/src/devices/bus/bbc/tube/tube_80186.cpp +++ b/src/devices/bus/bbc/tube/tube_80186.cpp @@ -19,6 +19,7 @@ //************************************************************************** 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") //------------------------------------------------- @@ -49,6 +50,16 @@ 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 + //------------------------------------------------- // device_add_mconfig - add device configuration //------------------------------------------------- @@ -72,6 +83,14 @@ void bbc_tube_80186_device::device_add_mconfig(machine_config &config) SOFTWARE_LIST(config, "flop_ls_80186").set_original("bbc_flop_80186"); } +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 //------------------------------------------------- @@ -81,6 +100,11 @@ 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 //************************************************************************** @@ -89,13 +113,23 @@ const tiny_rom_entry *bbc_tube_80186_device::device_rom_region() const // 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) - : device_t(mconfig, BBC_TUBE_80186, 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(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) { } @@ -121,6 +155,13 @@ void bbc_tube_80186_device::device_reset() program.install_rom(0xc0000, 0xc3fff, 0x3c000, m_bootstrap->base()); } +void bbc_tube_pcplus_device::device_reset() +{ + address_space &program = m_i80186->space(AS_PROGRAM); + + program.install_ram(0x00000, 0xfffff, m_ram->pointer()); + program.install_rom(0xf0000, 0xf3fff, 0x0c000, m_bootstrap->base()); +} //************************************************************************** // IMPLEMENTATION diff --git a/src/devices/bus/bbc/tube/tube_80186.h b/src/devices/bus/bbc/tube/tube_80186.h index 42f757e75e4..a3df8d72743 100644 --- a/src/devices/bus/bbc/tube/tube_80186.h +++ b/src/devices/bus/bbc/tube/tube_80186.h @@ -32,6 +32,8 @@ public: bbc_tube_80186_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: + bbc_tube_80186_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + // device-level overrides virtual void device_start() override; virtual void device_reset() override; @@ -43,7 +45,6 @@ protected: virtual uint8_t host_r(offs_t offset) override; virtual void host_w(offs_t offset, uint8_t data) override; -private: required_device m_i80186; required_device m_ula; required_device m_ram; @@ -54,8 +55,24 @@ private: }; +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); + +protected: + // device-level overrides + virtual void device_reset() override; + + // optional information overrides + virtual void device_add_mconfig(machine_config &config) override; + virtual const tiny_rom_entry *device_rom_region() const override; +}; + + // device type definition DECLARE_DEVICE_TYPE(BBC_TUBE_80186, bbc_tube_80186_device) +DECLARE_DEVICE_TYPE(BBC_TUBE_PCPLUS, bbc_tube_pcplus_device) -#endif /* MAME_BUS_BBC_TUBE_80x86_H */ +#endif /* MAME_BUS_BBC_TUBE_80186_H */ -- cgit v1.2.3