From b77d8ecb0382dab1f381412ec9a06706d5b44cb5 Mon Sep 17 00:00:00 2001 From: David Haywood Date: Wed, 28 Aug 2019 22:15:06 +0100 Subject: [PATCH] Spectrum betadisk stuff (#5564) * spectrum bus : rename beta.cpp to beta128.cpp as the original beta is somewhat different (nw) * (nw) * start making a device for the actual original beta disk interfaces (nw) * flesh out beta stuff a bit (nw) --- scripts/src/bus.lua | 2 + src/devices/bus/spectrum/beta.cpp | 284 ++++++++++++++++++++------- src/devices/bus/spectrum/beta.h | 54 +++-- src/devices/bus/spectrum/beta128.cpp | 284 +++++++++++++++++++++++++++ src/devices/bus/spectrum/beta128.h | 64 ++++++ src/devices/bus/spectrum/exp.cpp | 4 + 6 files changed, 614 insertions(+), 78 deletions(-) create mode 100644 src/devices/bus/spectrum/beta128.cpp create mode 100644 src/devices/bus/spectrum/beta128.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 3ae8df9fb5d..1bb852c7aaa 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -3471,6 +3471,8 @@ if (BUSES["SPECTRUM"]~=null) then MAME_DIR .. "src/devices/bus/spectrum/exp.h", MAME_DIR .. "src/devices/bus/spectrum/beta.cpp", MAME_DIR .. "src/devices/bus/spectrum/beta.h", + MAME_DIR .. "src/devices/bus/spectrum/beta128.cpp", + MAME_DIR .. "src/devices/bus/spectrum/beta128.h", MAME_DIR .. "src/devices/bus/spectrum/intf1.cpp", MAME_DIR .. "src/devices/bus/spectrum/intf1.h", MAME_DIR .. "src/devices/bus/spectrum/intf2.cpp", diff --git a/src/devices/bus/spectrum/beta.cpp b/src/devices/bus/spectrum/beta.cpp index 4fdc6abde3b..4f46db864c2 100644 --- a/src/devices/bus/spectrum/beta.cpp +++ b/src/devices/bus/spectrum/beta.cpp @@ -1,8 +1,67 @@ // license:BSD-3-Clause -// copyright-holders:Nigel Barnes +// copyright-holders:Nigel Barnes, David Haywood /********************************************************************* - Technology Research Beta 128 Disk interface + Technology Research Beta Disk interface & clones + these are designed for the 48k Spectrum models + + There are multiple versions of this + + 'hand made' PCB with V2 ROM: + - possible prototype / low production run + - 4k ROM + - FORMAT, COPY etc. must be loaded from a disk to be used + - disks are password protected + - uses 1771 disk controller + https://www.youtube.com/watch?v=gSJIuZjbFYs + + Original Beta Disk release with V3 ROM: + - same features as above + - uses a 1793 controller + + Re-release dubbed "Beta Disk plus" with V4 ROM: + - many operations moved into a larger capacity (8k) ROM rather + than requiring a utility disk + - uses a 1793 controller + - adds 'magic button' to dump the running state of the machine + to disk + - disk password system removed + + Many clones exist, some specific to the various Spectrum clones. + (not yet added) + + Original Beta Disk (V3) clones + - Sandy FDD2 SP-DOS + - AC DOS P.Z.APINA + + Beta Disk plus (V4) clones + - CAS DOS Cheyenne Advanced System + - CBI-95 + - SYNCHRON IDS91 + - SYNCHRON IDS2001ne + - ARCADE AR-20 + - Vision Desktop Betadisk + + Some units also exist that allow population of both V3 and V4 + ROM types with a switch (unofficial, for compatibility?) + + --- + + NOTE: + + ROMs really need verifying, real dumps appear to be bitswapped + on original boards, so we're using those ones where possible, + however sizes are unconfirmed (some sources state that the data + is duplicated across the 16k in ROM, others state it just mirrors + in memory) and some might be modified or bad. + + beta128.cpp could be modified to expand on this, as it builds + on the features of the betaplus, but for now I've kept them + separate as the enable / disable mechanisms are different and + remaining mappings of devices unconfirmed + + These devices are not currently working as the disable logic is + not understood. *********************************************************************/ @@ -14,32 +73,9 @@ DEVICE DEFINITIONS ***************************************************************************/ -DEFINE_DEVICE_TYPE(SPECTRUM_BETA128, spectrum_beta128_device, "spectrum_beta128", "TR Beta 128 Disk Interface") - - -//------------------------------------------------- -// INPUT_PORTS( beta128 ) -//------------------------------------------------- - -INPUT_PORTS_START(beta128) - PORT_START("BUTTON") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("Magic Button") PORT_CODE(KEYCODE_F12) PORT_CHANGED_MEMBER(DEVICE_SELF, spectrum_beta128_device, magic_button, 0) - - PORT_START("SWITCH") - PORT_CONFNAME(0x03, 0x01, "System Switch") //PORT_CHANGED_MEMBER(DEVICE_SELF, spectrum_beta128_device, switch_changed, 0) - PORT_CONFSETTING(0x00, "Off (128)") - PORT_CONFSETTING(0x01, "Normal (auto-boot)") - //PORT_CONFSETTING(0x02, "Reset") // TODO: implement RESET callback -INPUT_PORTS_END - -//------------------------------------------------- -// input_ports - device-specific input ports -//------------------------------------------------- - -ioport_constructor spectrum_beta128_device::device_input_ports() const -{ - return INPUT_PORTS_NAME(beta128); -} +DEFINE_DEVICE_TYPE(SPECTRUM_BETAV2, spectrum_betav2_device, "spectrum_betav2", "TR Beta Disk Interface (older, FD1771 based)") +DEFINE_DEVICE_TYPE(SPECTRUM_BETAV3, spectrum_betav3_device, "spectrum_betav3", "TR Beta Disk Interface (newer, FD1793 based)") +DEFINE_DEVICE_TYPE(SPECTRUM_BETAPLUS, spectrum_betaplus_device, "spectrum_betaplus", "TR Beta Disk Plus Interface") //------------------------------------------------- // SLOT_INTERFACE( beta_floppies ) @@ -54,7 +90,7 @@ static void beta_floppies(device_slot_interface &device) // floppy_format_type floppy_formats //------------------------------------------------- -FLOPPY_FORMATS_MEMBER(spectrum_beta128_device::floppy_formats) +FLOPPY_FORMATS_MEMBER(spectrum_betav2_device::floppy_formats) FLOPPY_TRD_FORMAT FLOPPY_FORMATS_END @@ -62,28 +98,69 @@ FLOPPY_FORMATS_END // ROM( beta ) //------------------------------------------------- -ROM_START(beta128) +ROM_START(betav2) ROM_REGION(0x4000, "rom", 0) - ROM_DEFAULT_BIOS("trd504") - ROM_SYSTEM_BIOS(0, "trd501", "TR-DOS v5.01") - ROMX_LOAD("trd501.rom", 0x0000, 0x4000, CRC(3e3cdd4c) SHA1(8303ba0cc79daa6c04cd1e6ce27e8b6886a3f0de), ROM_BIOS(0)) - ROM_SYSTEM_BIOS(1, "trd503", "TR-DOS v5.03") - ROMX_LOAD("trd503.rom", 0x0000, 0x4000, CRC(10751aba) SHA1(21695e3f2a8f796386ce66eea8a246b0ac44810c), ROM_BIOS(1)) - ROM_SYSTEM_BIOS(2, "trd504", "TR-DOS v5.04") - ROMX_LOAD("trd504.rom", 0x0000, 0x4000, CRC(ba310874) SHA1(05e55e37df8eee6c68601ba9cf6c92195852ce3f), ROM_BIOS(2)) + ROM_DEFAULT_BIOS("trd20") + ROM_SYSTEM_BIOS(0, "trd20", "TR-DOS v2.0") + ROMX_LOAD("trd20.bin", 0x0000, 0x1000, CRC(dd269fb2) SHA1(ab394a19461f314fffd592645a273b85e76fadec), ROM_BIOS(0)) + ROM_RELOAD(0x1000,0x1000) + ROM_RELOAD(0x2000,0x1000) + ROM_RELOAD(0x3000,0x1000) ROM_END + +// there is an alt set CRC(48f9149f) SHA1(52774757096fdc93ea94c55306481f6f41204e96) with differences at 30e, 3cd, 404, 7bd, it appears to be a bad dump +// 30c : call $2acd call $6acd +// 3cc : ld hl, $5b00 ld hl, $5b01 +// 402 : call $2acd call $6bcd +// 7bd : ld ($5d02), hl inc hl, ld (bc),a, ld e,l + +// the Profisoft version appears to be different code, maybe based on a different revision or even modified hw? + +ROM_START(betav3) + ROM_REGION(0x4000, "rom", 0) + ROM_DEFAULT_BIOS("trd30") + ROM_SYSTEM_BIOS(0, "trd30", "TR-DOS v3.0 (set 1)") + ROMX_LOAD("trd30.bin", 0x0000, 0x1000, CRC(c814179d) SHA1(b617ab59639beaa7b5d8e5b4e4a543a8eb0217c8), ROM_BIOS(0)) + ROM_RELOAD(0x1000,0x1000) + ROM_RELOAD(0x2000,0x1000) + ROM_RELOAD(0x3000,0x1000) +// ROM_SYSTEM_BIOS(1, "trd30a", "TR-DOS v3.0 (set 2)") +// ROMX_LOAD("trd30_alt.bin", 0x0000, 0x1000, CRC(48f9149f) SHA1(52774757096fdc93ea94c55306481f6f41204e96), ROM_BIOS(1)) +// ROM_RELOAD(0x1000,0x1000) +// ROM_RELOAD(0x2000,0x1000) +// ROM_RELOAD(0x3000,0x1000) + ROM_SYSTEM_BIOS(1, "trd30p", "TR-DOS v3.0 (set 2, Profisoft)") // is this a clone device? + ROMX_LOAD("trd30ps.bin", 0x0000, 0x1000, CRC(b0f175a3) SHA1(ac95bb4d89072224deef58a1655e8029f811a7fa), ROM_BIOS(1)) + ROM_RELOAD(0x1000,0x1000) + ROM_RELOAD(0x2000,0x1000) + ROM_RELOAD(0x3000,0x1000) +ROM_END + +// some sources indicate these should be 16kb roms with both halves duplicated, others suggest the same but with the first byte being 0x00 instead (maybe an issue with the dumping) +// there are also some '412' unscrambled dumps with most of the data in the mirror regions as 0xff (maybe official, maybe from clone devices that should be treated separately?) +ROM_START(betaplus) + ROM_REGION(0x4000, "rom", 0) + ROM_DEFAULT_BIOS("trd409") + ROM_SYSTEM_BIOS(0, "trd409", "TR-DOS v4.09") + ROMX_LOAD("trd409.bin", 0x0000, 0x2000, CRC(18365bdc) SHA1(a0e7c80905423c54bd497575026ea8821061175a), ROM_BIOS(0)) + ROM_RELOAD(0x2000,0x2000) + ROM_SYSTEM_BIOS(1, "trd411", "TR-DOS v4.11") + ROMX_LOAD("trd411.bin", 0x0000, 0x2000, CRC(26902902) SHA1(cb90fc31bf62d5968730db23a600344338e31e7e), ROM_BIOS(1)) + ROM_RELOAD(0x2000,0x2000) +ROM_END + + //------------------------------------------------- // device_add_mconfig - add device configuration //------------------------------------------------- -void spectrum_beta128_device::device_add_mconfig(machine_config &config) +void spectrum_betav2_device::device_add_mconfig_base(machine_config& config) { - FD1793(config, m_fdc, 4_MHz_XTAL / 4); - FLOPPY_CONNECTOR(config, "fdc:0", beta_floppies, "525qd", spectrum_beta128_device::floppy_formats).enable_sound(true); - FLOPPY_CONNECTOR(config, "fdc:1", beta_floppies, "525qd", spectrum_beta128_device::floppy_formats).enable_sound(true); - FLOPPY_CONNECTOR(config, "fdc:2", beta_floppies, nullptr, spectrum_beta128_device::floppy_formats).enable_sound(true); - FLOPPY_CONNECTOR(config, "fdc:3", beta_floppies, nullptr, spectrum_beta128_device::floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, "fdc:0", beta_floppies, "525qd", spectrum_betav2_device::floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, "fdc:1", beta_floppies, "525qd", spectrum_betav2_device::floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, "fdc:2", beta_floppies, nullptr, spectrum_betav2_device::floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, "fdc:3", beta_floppies, nullptr, spectrum_betav2_device::floppy_formats).enable_sound(true); // passthru SPECTRUM_EXPANSION_SLOT(config, m_exp, spectrum_expansion_devices, nullptr); @@ -91,9 +168,31 @@ void spectrum_beta128_device::device_add_mconfig(machine_config &config) m_exp->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(spectrum_expansion_slot_device::nmi_w)); } -const tiny_rom_entry *spectrum_beta128_device::device_rom_region() const +void spectrum_betav2_device::device_add_mconfig(machine_config &config) { - return ROM_NAME(beta128); + FD1771(config, m_fdc, 4_MHz_XTAL / 4); + device_add_mconfig_base(config); +} + +void spectrum_betav3_device::device_add_mconfig(machine_config& config) +{ + FD1793(config, m_fdc, 4_MHz_XTAL / 4); + device_add_mconfig_base(config); +} + +const tiny_rom_entry *spectrum_betav2_device::device_rom_region() const +{ + return ROM_NAME(betav2); +} + +const tiny_rom_entry *spectrum_betav3_device::device_rom_region() const +{ + return ROM_NAME(betav3); +} + +const tiny_rom_entry *spectrum_betaplus_device::device_rom_region() const +{ + return ROM_NAME(betaplus); } @@ -102,69 +201,104 @@ const tiny_rom_entry *spectrum_beta128_device::device_rom_region() const //************************************************************************** //------------------------------------------------- -// spectrum_beta128_device - constructor +// spectrum_betav2_device - constructor //------------------------------------------------- -spectrum_beta128_device::spectrum_beta128_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, SPECTRUM_BETA128, tag, owner, clock) +spectrum_betav2_device::spectrum_betav2_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_spectrum_expansion_interface(mconfig, *this) , m_rom(*this, "rom") , m_fdc(*this, "fdc") , m_floppy(*this, "fdc:%u", 0) , m_exp(*this, "exp") - , m_switch(*this, "SWITCH") { } +spectrum_betav2_device::spectrum_betav2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : spectrum_betav2_device(mconfig, SPECTRUM_BETAV2, tag, owner, clock) +{ +} + +spectrum_betav3_device::spectrum_betav3_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : spectrum_betav2_device(mconfig, type, tag, owner, clock) +{ +} + +spectrum_betav3_device::spectrum_betav3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : spectrum_betav3_device(mconfig, SPECTRUM_BETAV3, tag, owner, clock) +{ +} + +spectrum_betaplus_device::spectrum_betaplus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : spectrum_betav3_device(mconfig, type, tag, owner, clock) +{ +} + +spectrum_betaplus_device::spectrum_betaplus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : spectrum_betaplus_device(mconfig, SPECTRUM_BETAPLUS, tag, owner, clock) +{ +} + + //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- -void spectrum_beta128_device::device_start() +void spectrum_betav2_device::device_start() { save_item(NAME(m_romcs)); + +#if 0 // we do this in realtime instead + for (int i = 0; i < m_rom->bytes(); i++) + { + uint8_t* rom = m_rom->base(); + + rom[i] = bitswap<8>(rom[i],0,6,5,4,3,2,1,7); + } +#endif } //------------------------------------------------- // device_reset - device-specific reset //------------------------------------------------- -void spectrum_beta128_device::device_reset() +void spectrum_betav2_device::device_reset() { - // Page in the ROM if auto-boot is selected - if (m_switch->read() == 0x01) - m_romcs = 1; - else - m_romcs = 0; + // always paged in on boot? (no mode switch like beta128) + m_romcs = 1; } //************************************************************************** // IMPLEMENTATION //************************************************************************** -READ_LINE_MEMBER(spectrum_beta128_device::romcs) +READ_LINE_MEMBER(spectrum_betav2_device::romcs) { return m_romcs | m_exp->romcs(); } -void spectrum_beta128_device::opcode_fetch(offs_t offset) +void spectrum_betav2_device::opcode_fetch(offs_t offset) { m_exp->opcode_fetch(offset); if (!machine().side_effects_disabled()) { - if ((offset == 0x0066) || (offset & 0xff00) == 0x3d00) + if ((offset & 0xff00) == 0x3c00) m_romcs = 1; - else if (offset >= 0x4000) - m_romcs = 0; + + // how does the ROM get disabled on these older beta units + // there are no RETs that end up in RAM as with the 128 + // so it looks like jumps to the 0xxx and 1xxx regions, but + // that doesn't work? } } -uint8_t spectrum_beta128_device::iorq_r(offs_t offset) +uint8_t spectrum_betav2_device::iorq_r(offs_t offset) { uint8_t data = m_exp->iorq_r(offset); +#if 0 // this is the Beta 128 logic, it may or may not be the same here if (m_romcs) { switch (offset & 0xff) @@ -180,11 +314,14 @@ uint8_t spectrum_beta128_device::iorq_r(offs_t offset) break; } } +#endif + return data; } -void spectrum_beta128_device::iorq_w(offs_t offset, uint8_t data) +void spectrum_betav2_device::iorq_w(offs_t offset, uint8_t data) { +#if 0 // this is the Beta 128 logic, it may or may not be the same here if (m_romcs) { switch (offset & 0xff) @@ -219,16 +356,18 @@ void spectrum_beta128_device::iorq_w(offs_t offset, uint8_t data) break; } } +#endif m_exp->iorq_w(offset, data); } -uint8_t spectrum_beta128_device::mreq_r(offs_t offset) +uint8_t spectrum_betav2_device::mreq_r(offs_t offset) { uint8_t data = 0xff; if (m_romcs) { data = m_rom->base()[offset & 0x3fff]; + data = bitswap<8>(data,0,6,5,4,3,2,1,7); // proper dumps have bits 0 and 7 swapped? } if (m_exp->romcs()) @@ -237,17 +376,30 @@ uint8_t spectrum_beta128_device::mreq_r(offs_t offset) return data; } -void spectrum_beta128_device::mreq_w(offs_t offset, uint8_t data) +void spectrum_betav2_device::mreq_w(offs_t offset, uint8_t data) { if (m_exp->romcs()) m_exp->mreq_w(offset, data); } -INPUT_CHANGED_MEMBER(spectrum_beta128_device::magic_button) +// Betaplus has a 'magic button' for dumping RAM + +INPUT_PORTS_START(betaplus) + PORT_START("BUTTON") // don't use F12, it clashes with the 'exit from debugger' button + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("Magic Button") PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHANGED_MEMBER(DEVICE_SELF, spectrum_betaplus_device, magic_button, 0) +INPUT_PORTS_END + +ioport_constructor spectrum_betaplus_device::device_input_ports() const +{ + return INPUT_PORTS_NAME(betaplus); +} + +INPUT_CHANGED_MEMBER(spectrum_betaplus_device::magic_button) { if (newval && !oldval) { m_slot->nmi_w(ASSERT_LINE); + m_romcs = 1; } else { diff --git a/src/devices/bus/spectrum/beta.h b/src/devices/bus/spectrum/beta.h index b759201d35d..df2c16a2738 100644 --- a/src/devices/bus/spectrum/beta.h +++ b/src/devices/bus/spectrum/beta.h @@ -1,12 +1,12 @@ // license:BSD-3-Clause -// copyright-holders:Nigel Barnes +// copyright-holders:Nigel Barnes, David Haywood /********************************************************************* - Technology Research Beta 128 Disk interface + Technology Research Beta Disk interface *********************************************************************/ -#ifndef MAME_BUS_SPECTRUM_BETA_H -#define MAME_BUS_SPECTRUM_BETA_H +#ifndef MAME_BUS_SPECTRUM_BETAV2_H +#define MAME_BUS_SPECTRUM_BETAV2_H #include "exp.h" #include "softlist.h" @@ -18,17 +18,17 @@ // TYPE DEFINITIONS //************************************************************************** -class spectrum_beta128_device : +class spectrum_betav2_device : public device_t, public device_spectrum_expansion_interface { public: // construction/destruction - spectrum_beta128_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + spectrum_betav2_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + spectrum_betav2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); DECLARE_FLOPPY_FORMATS(floppy_formats); - DECLARE_INPUT_CHANGED_MEMBER(magic_button); protected: // device-level overrides @@ -36,9 +36,9 @@ protected: virtual void device_reset() override; // optional information overrides + void device_add_mconfig_base(machine_config& config); virtual void device_add_mconfig(machine_config &config) override; virtual const tiny_rom_entry *device_rom_region() const override; - virtual ioport_constructor device_input_ports() const override; virtual void opcode_fetch(offs_t offset) override; virtual uint8_t mreq_r(offs_t offset) override; @@ -48,17 +48,47 @@ protected: virtual DECLARE_READ_LINE_MEMBER(romcs) override; required_memory_region m_rom; - required_device m_fdc; + required_device m_fdc; required_device_array m_floppy; required_device m_exp; - required_ioport m_switch; int m_romcs; }; +class spectrum_betav3_device : + public spectrum_betav2_device +{ +public: + // construction/destruction + spectrum_betav3_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + spectrum_betav3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + virtual void device_add_mconfig(machine_config &config) override; + virtual const tiny_rom_entry *device_rom_region() const override; + +}; + +class spectrum_betaplus_device : + public spectrum_betav3_device +{ +public: + // construction/destruction + spectrum_betaplus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + spectrum_betaplus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + DECLARE_INPUT_CHANGED_MEMBER(magic_button); + +protected: + virtual const tiny_rom_entry *device_rom_region() const override; + virtual ioport_constructor device_input_ports() const override; + +}; // device type definition -DECLARE_DEVICE_TYPE(SPECTRUM_BETA128, spectrum_beta128_device) +DECLARE_DEVICE_TYPE(SPECTRUM_BETAV2, spectrum_betav2_device) +DECLARE_DEVICE_TYPE(SPECTRUM_BETAV3, spectrum_betav3_device) +DECLARE_DEVICE_TYPE(SPECTRUM_BETAPLUS, spectrum_betaplus_device) -#endif // MAME_BUS_SPECTRUM_BETA_H +#endif // MAME_BUS_SPECTRUM_BETAV2_H diff --git a/src/devices/bus/spectrum/beta128.cpp b/src/devices/bus/spectrum/beta128.cpp new file mode 100644 index 00000000000..5b989482560 --- /dev/null +++ b/src/devices/bus/spectrum/beta128.cpp @@ -0,0 +1,284 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************* + + Technology Research Beta 128 Disk interface + + This hardware type runs TR-DOS 5.xx (official) and newer + unofficial updates. It was designed to work properly with + the 128k machines that had issues with the original Beta Disk + due to changes in the 128k ROM structure etc. (enable address + is moved from 3cxx to 3dxx for example) + + Issues: + + Using the FD1793 device a 'CAT' operation in the 'spectrum' driver + will always report 'No Disk' but using the Soviet clone KR1818VG93 + it properly gives the disk catalogue. Despite this files can still + be loaded from disk. + + The 128k Spectrum drivers have a similar issues, although even if + you replace the controller doing a 'CAT' operation seems to have + an adverse effect on the system memory setup as things become + corrupt (LOADing or MERGEing a program afterwards can cause a reset) + + Neither of these issues occur in other Spectrum emulators using + the same ROMs and floppy images. + + TODO: + + there were many unofficial ROMs available for this, make them + available for use. + +*********************************************************************/ + +#include "emu.h" +#include "beta128.h" + + +/*************************************************************************** + DEVICE DEFINITIONS +***************************************************************************/ + +DEFINE_DEVICE_TYPE(SPECTRUM_BETA128, spectrum_beta128_device, "spectrum_beta128", "TR Beta 128 Disk Interface") + + +//------------------------------------------------- +// INPUT_PORTS( beta128 ) +//------------------------------------------------- + +INPUT_PORTS_START(beta128) + PORT_START("BUTTON") // don't use F12, it clashes with the 'exit from debugger' button + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("Magic Button") PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHANGED_MEMBER(DEVICE_SELF, spectrum_beta128_device, magic_button, 0) + + PORT_START("SWITCH") + PORT_CONFNAME(0x03, 0x01, "System Switch") //PORT_CHANGED_MEMBER(DEVICE_SELF, spectrum_beta128_device, switch_changed, 0) + PORT_CONFSETTING(0x00, "Off (128)") + PORT_CONFSETTING(0x01, "Normal (auto-boot)") + //PORT_CONFSETTING(0x02, "Reset") // TODO: implement RESET callback +INPUT_PORTS_END + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor spectrum_beta128_device::device_input_ports() const +{ + return INPUT_PORTS_NAME(beta128); +} + +//------------------------------------------------- +// SLOT_INTERFACE( beta_floppies ) +//------------------------------------------------- + +static void beta_floppies(device_slot_interface &device) +{ + device.option_add("525qd", FLOPPY_525_QD); +} + +//------------------------------------------------- +// floppy_format_type floppy_formats +//------------------------------------------------- + +FLOPPY_FORMATS_MEMBER(spectrum_beta128_device::floppy_formats) + FLOPPY_TRD_FORMAT +FLOPPY_FORMATS_END + +//------------------------------------------------- +// ROM( beta ) +//------------------------------------------------- + +ROM_START(beta128) + ROM_REGION(0x4000, "rom", 0) + ROM_DEFAULT_BIOS("trd504") + ROM_SYSTEM_BIOS(0, "trd501", "TR-DOS v5.01") + ROMX_LOAD("trd501.rom", 0x0000, 0x4000, CRC(3e3cdd4c) SHA1(8303ba0cc79daa6c04cd1e6ce27e8b6886a3f0de), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "trd503", "TR-DOS v5.03") + ROMX_LOAD("trd503.rom", 0x0000, 0x4000, CRC(10751aba) SHA1(21695e3f2a8f796386ce66eea8a246b0ac44810c), ROM_BIOS(1)) + ROM_SYSTEM_BIOS(2, "trd504", "TR-DOS v5.04") + ROMX_LOAD("trd504.rom", 0x0000, 0x4000, CRC(ba310874) SHA1(05e55e37df8eee6c68601ba9cf6c92195852ce3f), ROM_BIOS(2)) +ROM_END + +//------------------------------------------------- +// device_add_mconfig - add device configuration +//------------------------------------------------- + +void spectrum_beta128_device::device_add_mconfig(machine_config &config) +{ + FD1793(config, m_fdc, 4_MHz_XTAL / 4); + //KR1818VG93(config, m_fdc, 4_MHz_XTAL / 4); + + FLOPPY_CONNECTOR(config, "fdc:0", beta_floppies, "525qd", spectrum_beta128_device::floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, "fdc:1", beta_floppies, "525qd", spectrum_beta128_device::floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, "fdc:2", beta_floppies, nullptr, spectrum_beta128_device::floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, "fdc:3", beta_floppies, nullptr, spectrum_beta128_device::floppy_formats).enable_sound(true); + + // passthru + SPECTRUM_EXPANSION_SLOT(config, m_exp, spectrum_expansion_devices, nullptr); + m_exp->irq_handler().set(DEVICE_SELF_OWNER, FUNC(spectrum_expansion_slot_device::irq_w)); + m_exp->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(spectrum_expansion_slot_device::nmi_w)); +} + +const tiny_rom_entry *spectrum_beta128_device::device_rom_region() const +{ + return ROM_NAME(beta128); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// spectrum_beta128_device - constructor +//------------------------------------------------- + +spectrum_beta128_device::spectrum_beta128_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, SPECTRUM_BETA128, tag, owner, clock) + , device_spectrum_expansion_interface(mconfig, *this) + , m_rom(*this, "rom") + , m_fdc(*this, "fdc") + , m_floppy(*this, "fdc:%u", 0) + , m_exp(*this, "exp") + , m_switch(*this, "SWITCH") +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void spectrum_beta128_device::device_start() +{ + save_item(NAME(m_romcs)); +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void spectrum_beta128_device::device_reset() +{ + // Page in the ROM if auto-boot is selected + if (m_switch->read() == 0x01) + m_romcs = 1; + else + m_romcs = 0; +} + +//************************************************************************** +// IMPLEMENTATION +//************************************************************************** + +READ_LINE_MEMBER(spectrum_beta128_device::romcs) +{ + return m_romcs | m_exp->romcs(); +} + + +void spectrum_beta128_device::opcode_fetch(offs_t offset) +{ + m_exp->opcode_fetch(offset); + + if (!machine().side_effects_disabled()) + { + if ((offset == 0x0066) || (offset & 0xff00) == 0x3d00) + m_romcs = 1; + else if (offset >= 0x4000) + m_romcs = 0; + } +} + +uint8_t spectrum_beta128_device::iorq_r(offs_t offset) +{ + uint8_t data = m_exp->iorq_r(offset); + + if (m_romcs) + { + switch (offset & 0xff) + { + case 0x1f: case 0x3f: case 0x5f: case 0x7f: + data = m_fdc->read((offset >> 5) & 0x03); + break; + + case 0xff: + data &= 0x3f; // actually open bus + data |= m_fdc->drq_r() ? 0x40 : 0; + data |= m_fdc->intrq_r() ? 0x80 : 0; + break; + } + } + return data; +} + +void spectrum_beta128_device::iorq_w(offs_t offset, uint8_t data) +{ + if (m_romcs) + { + switch (offset & 0xff) + { + case 0x1f: case 0x3f: case 0x5f: case 0x7f: + m_fdc->write((offset >> 5) & 0x03, data); + break; + + case 0xff: + floppy_image_device* floppy = m_floppy[data & 3]->get_device(); + + m_fdc->set_floppy(floppy); + if (floppy) + floppy->ss_w(BIT(data, 4) ? 0 : 1); + m_fdc->dden_w(BIT(data, 6)); + + // bit 3 connected to pin 23 "HLT" of FDC and via diode to INDEX + //m_fdc->hlt_w(BIT(data, 3)); // not handled in current wd_fdc + + if (BIT(data, 2) == 0) // reset + { + m_fdc->reset(); + if (floppy) + floppy->mon_w(ASSERT_LINE); + } + else + { + // TODO: implement correct motor control, FDD motor and RDY FDC pin controlled by HLD pin of FDC + if (floppy) + floppy->mon_w(CLEAR_LINE); + } + break; + } + } + m_exp->iorq_w(offset, data); +} + +uint8_t spectrum_beta128_device::mreq_r(offs_t offset) +{ + uint8_t data = 0xff; + + if (m_romcs) + { + data = m_rom->base()[offset & 0x3fff]; + } + + if (m_exp->romcs()) + data &= m_exp->mreq_r(offset); + + return data; +} + +void spectrum_beta128_device::mreq_w(offs_t offset, uint8_t data) +{ + if (m_exp->romcs()) + m_exp->mreq_w(offset, data); +} + +INPUT_CHANGED_MEMBER(spectrum_beta128_device::magic_button) +{ + if (newval && !oldval) + { + m_slot->nmi_w(ASSERT_LINE); + } + else + { + m_slot->nmi_w(CLEAR_LINE); + } +} diff --git a/src/devices/bus/spectrum/beta128.h b/src/devices/bus/spectrum/beta128.h new file mode 100644 index 00000000000..c82313c7c89 --- /dev/null +++ b/src/devices/bus/spectrum/beta128.h @@ -0,0 +1,64 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************* + + Technology Research Beta 128 Disk interface + +*********************************************************************/ +#ifndef MAME_BUS_SPECTRUM_BETA128_H +#define MAME_BUS_SPECTRUM_BETA128_H + +#include "exp.h" +#include "softlist.h" +#include "imagedev/floppy.h" +#include "machine/wd_fdc.h" +#include "formats/trd_dsk.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class spectrum_beta128_device : + public device_t, + public device_spectrum_expansion_interface + +{ +public: + // construction/destruction + spectrum_beta128_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + DECLARE_FLOPPY_FORMATS(floppy_formats); + DECLARE_INPUT_CHANGED_MEMBER(magic_button); + +protected: + // device-level overrides + virtual void device_start() override; + 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; + virtual ioport_constructor device_input_ports() const override; + + virtual void opcode_fetch(offs_t offset) override; + virtual uint8_t mreq_r(offs_t offset) override; + virtual void mreq_w(offs_t offset, uint8_t data) override; + virtual uint8_t iorq_r(offs_t offset) override; + virtual void iorq_w(offs_t offset, uint8_t data) override; + virtual DECLARE_READ_LINE_MEMBER(romcs) override; + + required_memory_region m_rom; + required_device m_fdc; + required_device_array m_floppy; + required_device m_exp; + required_ioport m_switch; + + int m_romcs; +}; + + +// device type definition +DECLARE_DEVICE_TYPE(SPECTRUM_BETA128, spectrum_beta128_device) + + +#endif // MAME_BUS_SPECTRUM_BETA128_H diff --git a/src/devices/bus/spectrum/exp.cpp b/src/devices/bus/spectrum/exp.cpp index 92040736c04..a58b2dc7f55 100644 --- a/src/devices/bus/spectrum/exp.cpp +++ b/src/devices/bus/spectrum/exp.cpp @@ -169,6 +169,7 @@ void spectrum_expansion_slot_device::mreq_w(offs_t offset, uint8_t data) // slot devices #include "beta.h" +#include "beta128.h" //#include "disciple.h" #include "intf1.h" #include "intf2.h" @@ -189,6 +190,9 @@ void spectrum_expansion_slot_device::mreq_w(offs_t offset, uint8_t data) void spectrum_expansion_devices(device_slot_interface &device) { + device.option_add("betav2", SPECTRUM_BETAV2); + device.option_add("betav3", SPECTRUM_BETAV3); + device.option_add("betaplus", SPECTRUM_BETAPLUS); device.option_add("beta128", SPECTRUM_BETA128); //device.option_add("disciple", SPECTRUM_DISCIPLE); device.option_add("intf1", SPECTRUM_INTF1);