summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus
diff options
context:
space:
mode:
author MetalliC <0vetal0@gmail.com>2020-08-05 02:27:10 +0300
committer MetalliC <0vetal0@gmail.com>2020-08-05 02:27:10 +0300
commit365d94a31b154cb7e3f10f6c6f01a71dfa5e3016 (patch)
tree6958d4531f4ede0e559b6af560f0cc0d707a7d88 /src/devices/bus
parent7e1b46d2bbfba52fea907e89f6d32df322981511 (diff)
bus/spectrum/kempdisc.cpp: replace K-DOS v2.1 bad dump with good one, add KDOS 2.1 Italian translation, add "Watford SP-DOS Interface" (technically not working without boot disk) [Luzie, James McKey, MetalliC]
Diffstat (limited to 'src/devices/bus')
-rw-r--r--src/devices/bus/spectrum/exp.cpp1
-rw-r--r--src/devices/bus/spectrum/kempdisc.cpp90
-rw-r--r--src/devices/bus/spectrum/kempdisc.h17
3 files changed, 104 insertions, 4 deletions
diff --git a/src/devices/bus/spectrum/exp.cpp b/src/devices/bus/spectrum/exp.cpp
index 51f7ca1cc70..51950eb7bb7 100644
--- a/src/devices/bus/spectrum/exp.cpp
+++ b/src/devices/bus/spectrum/exp.cpp
@@ -216,6 +216,7 @@ void spectrum_expansion_devices(device_slot_interface &device)
device.option_add("protek", SPECTRUM_PROTEK);
device.option_add("sdi", SPECTRUM_SDI);
device.option_add("speccydos", SPECTRUM_SPECCYDOS);
+ device.option_add("spdos", SPECTRUM_SPDOS);
device.option_add("specdrum", SPECTRUM_SPECDRUM);
device.option_add("swiftdisc", SPECTRUM_SWIFTDISC);
device.option_add("swiftdisc2", SPECTRUM_SWIFTDISC2);
diff --git a/src/devices/bus/spectrum/kempdisc.cpp b/src/devices/bus/spectrum/kempdisc.cpp
index 64a466fc903..aabb847ef2a 100644
--- a/src/devices/bus/spectrum/kempdisc.cpp
+++ b/src/devices/bus/spectrum/kempdisc.cpp
@@ -22,6 +22,14 @@
- implement onboard Kempston Centronics E interace and joystick port
- add more docs/information
+*********************************************************************
+
+ Watford SP-DOS Interface
+ (c) Abbeydale Designers ltd 1984
+
+ Earlier version of Kempston Disc, uses 2Kbyte ROM with small boot loader, same FDC ports but slightly different paging.
+ Require "System disk" with DOS to function, which is not dumped / missing at the moment.
+
*********************************************************************/
#include "emu.h"
@@ -33,6 +41,7 @@
***************************************************************************/
DEFINE_DEVICE_TYPE(SPECTRUM_KEMPDISC, spectrum_kempdisc_device, "spectrum_kempdisc", "Kempston Disc Interface")
+DEFINE_DEVICE_TYPE(SPECTRUM_SPDOS, spectrum_spdos_device, "spectrum_spdos", "Watford SP-DOS Interface")
//-------------------------------------------------
@@ -67,8 +76,15 @@ ROM_START(kempdisc)
ROM_SYSTEM_BIOS(0, "kd20", "K-DOS v2.0")
ROMX_LOAD("kd20.rom", 0x0000, 0x2000, CRC(244816a7) SHA1(b08e0e30f1db4f57d38b112be0115256528c6621), ROM_BIOS(0))
ROM_SYSTEM_BIOS(1, "kd21", "K-DOS v2.1")
- ROMX_LOAD("kd21.rom", 0x0000, 0x2000, CRC(d18fb812) SHA1(b3e00bc4111ef6311789159024fb4cd25c32a72f), ROM_BIOS(1))
- // TODO add Italian clone
+ ROMX_LOAD("kd21.rom", 0x0000, 0x2000, CRC(3a0705eb) SHA1(adebc46c1b6718eaed7e2844506011787117cb05), ROM_BIOS(1))
+ //ROMX_LOAD("kd21.rom", 0x0000, 0x2000, CRC(d18fb812) SHA1(b3e00bc4111ef6311789159024fb4cd25c32a72f), ROM_BIOS(1)) // bad dump
+ ROM_SYSTEM_BIOS(2, "kd21it", "K-DOS v2.1 Italian") // copyrights and texts changed and translated
+ ROMX_LOAD("kd21it.rom", 0x0000, 0x2000, CRC(f8ccdf8a) SHA1(4a75fb4951d74e254c230d56b5566c924b3c38f6), ROM_BIOS(2))
+ROM_END
+
+ROM_START(spdos)
+ ROM_REGION(0x0800, "rom", 0)
+ ROM_LOAD("spdos.rom", 0x0000, 0x0800, CRC(87b954a3) SHA1(bb0706cf1538da8acd12b8c9cd2cd75ca689ec44))
ROM_END
//-------------------------------------------------
@@ -95,6 +111,11 @@ const tiny_rom_entry *spectrum_kempdisc_device::device_rom_region() const
return ROM_NAME(kempdisc);
}
+const tiny_rom_entry *spectrum_spdos_device::device_rom_region() const
+{
+ return ROM_NAME(spdos);
+}
+
//**************************************************************************
// LIVE DEVICE
@@ -104,8 +125,8 @@ const tiny_rom_entry *spectrum_kempdisc_device::device_rom_region() const
// spectrum_kempdisc_device - constructor
//-------------------------------------------------
-spectrum_kempdisc_device::spectrum_kempdisc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, SPECTRUM_KEMPDISC, tag, owner, clock)
+spectrum_kempdisc_device::spectrum_kempdisc_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")
@@ -115,6 +136,16 @@ spectrum_kempdisc_device::spectrum_kempdisc_device(const machine_config &mconfig
{
}
+spectrum_kempdisc_device::spectrum_kempdisc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : spectrum_kempdisc_device(mconfig, SPECTRUM_KEMPDISC, tag, owner, clock)
+{
+}
+
+spectrum_spdos_device::spectrum_spdos_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : spectrum_kempdisc_device(mconfig, SPECTRUM_SPDOS, tag, owner, clock)
+{
+}
+
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
@@ -205,3 +236,54 @@ uint8_t spectrum_kempdisc_device::mreq_r(offs_t offset)
return data;
}
+
+
+void spectrum_spdos_device::iorq_w(offs_t offset, uint8_t data)
+{
+ switch (offset & 0xff)
+ {
+ case 0xe5: case 0xe7: case 0xed: case 0xef:
+ m_fdc->write(BIT(offset, 1) | (BIT(offset, 3) << 1), data);
+ break;
+ case 0xdf:
+ {
+ floppy_image_device* floppy = nullptr;
+ for (int i = 1; i < 5; i++)
+ if (BIT(data, i))
+ {
+ floppy = m_floppy[i - 1]->get_device();
+ break;
+ }
+
+// m_control = data;
+ m_fdc->set_floppy(floppy);
+ if (floppy) floppy->ss_w(BIT(data, 0));
+ if (data & 0xe0)
+ logerror("port DF unhandled %02X\n", data);
+ m_romcs = 0;
+ }
+ break;
+ // below probably is wrong/different for this device
+ case 0xfd:
+ m_romcs = 1;
+ break;
+ case 0xd7:
+ m_romcs = 0;
+ break;
+ }
+
+ m_exp->iorq_w(offset, data);
+}
+
+uint8_t spectrum_spdos_device::mreq_r(offs_t offset)
+{
+ uint8_t data = 0xff;
+
+ if (m_romcs)
+ data = m_rom->base()[offset & 0x7ff];
+
+ if (m_exp->romcs())
+ data &= m_exp->mreq_r(offset);
+
+ return data;
+}
diff --git a/src/devices/bus/spectrum/kempdisc.h b/src/devices/bus/spectrum/kempdisc.h
index 78009a05197..271d781d182 100644
--- a/src/devices/bus/spectrum/kempdisc.h
+++ b/src/devices/bus/spectrum/kempdisc.h
@@ -30,6 +30,7 @@ public:
DECLARE_FLOPPY_FORMATS(floppy_formats);
protected:
+ spectrum_kempdisc_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;
@@ -59,9 +60,25 @@ protected:
// u8 m_control;
};
+class spectrum_spdos_device :
+ public spectrum_kempdisc_device
+{
+public:
+ // construction/destruction
+ spectrum_spdos_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // optional information overrides
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ virtual void iorq_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t mreq_r(offs_t offset) override;
+};
+
// device type definition
DECLARE_DEVICE_TYPE(SPECTRUM_KEMPDISC, spectrum_kempdisc_device)
+DECLARE_DEVICE_TYPE(SPECTRUM_SPDOS, spectrum_spdos_device)
#endif // MAME_BUS_SPECTRUM_KEMPDISC_H