summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author MetalliC <0vetal0@gmail.com>2020-06-12 01:45:55 +0300
committer MetalliC <0vetal0@gmail.com>2020-06-12 01:45:55 +0300
commit6fb51a0ce70c937b1d9198b6ad3d98c4a50ae265 (patch)
treeb0b8c61fb9ab84bf5dc40327fb12b280e3c57a15
parent991c193d890db2085085ebd6785eadfbfafd166d (diff)
spectrum/beta.cpp add most of known clone ROMs
-rw-r--r--src/devices/bus/spectrum/beta.cpp167
-rw-r--r--src/devices/bus/spectrum/beta.h21
-rw-r--r--src/devices/bus/spectrum/exp.cpp1
3 files changed, 148 insertions, 41 deletions
diff --git a/src/devices/bus/spectrum/beta.cpp b/src/devices/bus/spectrum/beta.cpp
index 2825a36ddc9..0a21ba741b6 100644
--- a/src/devices/bus/spectrum/beta.cpp
+++ b/src/devices/bus/spectrum/beta.cpp
@@ -9,43 +9,47 @@
'hand made' PCB with V2 ROM:
- possible prototype / low production run
- - 4k ROM
+ - 4Kbyte ROM
+ - D0 and D7 ROM lines swapped
- FORMAT, COPY etc. must be loaded from a disk to be used
- disks are password protected
- uses FD1771 disk controller
- - disk format: FM, 7 or 10 256-byte sectors per track, 2 system sectors
+ - disk format: FM, 7 or 10 256-byte sectors per track, 2 system sectors (max 30 files)
- supports up to 3 drives
https://www.youtube.com/watch?v=gSJIuZjbFYs
Original Beta Disk release with V3 ROM:
- - same features as above
- - uses a 1793 controller
- - disk format: MFM, 16 256-byte sectors per track, 9 system sectors
+ similar to above but:
+ - uses a FD1793 controller
+ - disk format: MFM, 16 256-byte sectors per track, 9 system sectors (max 128 files)
+ - port FF bits was changed
- supports up to 4 drives
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
+ similar to above but:
+ - 8Kbyte ROM
+ - FORMAT and COPY commands moved into ROM
+ - adds 'magic button' to dump the running state of the machine to disk
- disk password system removed
+ - adds auto boot feature
Many clones exist, some specific to the various Spectrum clones.
- (not yet added)
Original Beta Disk (V2) clones
- - Sandy FDD2 SP-DOS (match 2.0 ROM, only name text and checksum was changed)
+ - Sandy FDD2 SP-DOS (straight clone?)
Original Beta Disk (V3) clones
- - AC DOS P.Z.APINA
+ - AC DOS P.Z.APINA (straight clone?)
Beta Disk plus (V4) clones
- - CAS DOS Cheyenne Advanced System
- - CBI-95
- - SYNCHRON IDS91
- - SYNCHRON IDS2001ne
- - ARCADE AR-20
+ - CAS DOS Cheyenne Advanced System (supposedly straight clone)
+ - common Brazilian clones: usually use FD1797 instead of FD1793, no ROM bits D0/D7 swap, DOS ROM area 3CXX might be disabled, equiped with printer port.
+ - CBI-95
+ - SYNCHRON IDS91
+ - SYNCHRON IDS2001ne
+ - ARCADE AR-20
+ (not yet added)
+ - MIDAS Gammadisk (adds i8255 for joystick and printer, use 32KByte ROM with modified BASIC48 ROM in one half and TR-DOS 4.12 in another)
- Vision Desktop Betadisk
Some units also exist that allow population of both V3 and V4
@@ -55,12 +59,6 @@
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
@@ -68,19 +66,21 @@
---
- Based on older BDI schematics, it seems the logic is like:
+ Based on older BDI schematics, the logic is:
memory access 0x3CXX (any type of access: code or data, read or write) -> temporary use BDI ROM (NOT permanent latch/switch like in beta128)
memory access <0x4000 area and BDI ROM_latch==true -> use BDI ROM
- IO write to port 0bxxxxxx00 -> D7 master_latch, 0=enable, 1=disable
+ IO write to port 0bxxxxxx00 -> D7 - master_latch, 0=enable, 1=disable
+ CBI clones: D6 - 1=disable permanent BDI ROM mapping at 3c00-3cff, 0=enable (like original BDI)
- while master_latch is enabled access to regular Spectrum IO is blocked (output /IORQ forced to 1) but enabled BDI ports:
+ while master_latch is enabled IO access to other expansions is blocked (output /IORQ forced to 1) but enabled BDI ports:
IO write to port 0b1xxxx111 ->
V2: D7 BDI ROM_latch (0=enable, 1=disble), D4 - FDC HLT, D3 - SIDE, D0-2 - floppy drive select (bitmask, active low).
V3-V4: D7 BDI ROM_latch (0=enable, 1=disble), D6 - FDC DDEN, D4 - SIDE, D3 - FDC HLT, D2 - FDC /MR (reset), D0-1 - floppy drive select (binary value).
- IO read port 0b1xxxx111 <- D7 - FDC INTRQ, D6 - FDC DRQ
+ CBI clones: D5 - printer port /STROBE
+ IO read port 0b1xxxx111 <- D7 - FDC INTRQ, D6 - FDC DRQ
IO read/write ports 0b0YYxx111 - access FDC ports YY
So mostly the same as beta128, except for new BDI ROM_latch bit
@@ -96,9 +96,10 @@
DEVICE DEFINITIONS
***************************************************************************/
-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_BETAV2, spectrum_betav2_device, "spectrum_betav2", "TR Beta Disk Interface V2 (FD1771 based)")
+DEFINE_DEVICE_TYPE(SPECTRUM_BETAV3, spectrum_betav3_device, "spectrum_betav3", "TR Beta Disk Interface V3 (FD1793 based)")
DEFINE_DEVICE_TYPE(SPECTRUM_BETAPLUS, spectrum_betaplus_device, "spectrum_betaplus", "TR Beta Disk Plus Interface")
+DEFINE_DEVICE_TYPE(SPECTRUM_BETACBI, spectrum_betacbi_device, "spectrum_betacbi", "CBI-95 Disk Interface")
//-------------------------------------------------
// SLOT_INTERFACE( beta_floppies )
@@ -129,6 +130,11 @@ ROM_START(betav2)
ROM_RELOAD(0x1000,0x1000)
ROM_RELOAD(0x2000,0x1000)
ROM_RELOAD(0x3000,0x1000)
+ ROM_SYSTEM_BIOS(1, "sandy", "SP-DOS v1.0 (Sandy)") // match 2.0 ROM, only name text and checksum was changed
+ ROMX_LOAD("sandy.bin", 0x0000, 0x1000, CRC(a51b820f) SHA1(1c5ec9f56651ae527cdc092af1c602803104d5c3), ROM_BIOS(1))
+ ROM_RELOAD(0x1000,0x1000)
+ ROM_RELOAD(0x2000,0x1000)
+ ROM_RELOAD(0x3000,0x1000)
ROM_END
@@ -143,7 +149,7 @@ ROM_END
ROM_START(betav3)
ROM_REGION(0x4000, "rom", 0)
ROM_DEFAULT_BIOS("trd30")
- ROM_SYSTEM_BIOS(0, "trd30", "TR-DOS v3.0 (set 1)")
+ ROM_SYSTEM_BIOS(0, "trd30", "TR-DOS v3.0")
ROMX_LOAD("trd30.bin", 0x0000, 0x1000, CRC(c814179d) SHA1(b617ab59639beaa7b5d8e5b4e4a543a8eb0217c8), ROM_BIOS(0))
ROM_RELOAD(0x1000,0x1000)
ROM_RELOAD(0x2000,0x1000)
@@ -153,11 +159,16 @@ ROM_START(betav3)
// 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?
+ ROM_SYSTEM_BIOS(1, "trd30p", "TR-DOS v3.0 (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_SYSTEM_BIOS(2, "acdos", "AC DOS v1.0") // match 3.0 ROM, only name text and checksum was changed
+ ROMX_LOAD("acdos.bin", 0x0000, 0x1000, CRC(c6d90a1e) SHA1(9480e5402bb8611b88657107a8aad889f353071b), ROM_BIOS(2))
+ ROM_RELOAD(0x1000,0x1000)
+ ROM_RELOAD(0x2000,0x1000)
+ ROM_RELOAD(0x3000,0x1000)
ROM_END
ROM_START(betaplus)
@@ -171,9 +182,33 @@ ROM_START(betaplus)
ROM_RELOAD(0x2000,0x2000)
ROM_SYSTEM_BIOS(2, "trd412", "TR-DOS v4.12")
ROMX_LOAD("trd412.bin", 0x0000, 0x2000, CRC(f72efdf4) SHA1(b53ea4020be846ffc02ce586f7b52938c2c76f98), ROM_BIOS(2))
+ ROM_RELOAD(0x2000, 0x2000)
+ ROM_SYSTEM_BIOS(3, "trd4127", "TR-DOS v4.12 (FD1797)") // 6 bytes was changed for FD1797 compatibility (type II commands sector size bit), more probable from clone board.
+ ROMX_LOAD("trd4127.bin", 0x0000, 0x2000, CRC(4313234c) SHA1(214a10c9d2edf386c4685c0379efa2e87ff0e20c), ROM_BIOS(3))
+ ROM_RELOAD(0x2000,0x2000)
+ ROM_SYSTEM_BIOS(4, "cas86", "CAS DOS 1986") // v4.12 with name text changed
+ ROMX_LOAD("cas1986.bin", 0x0000, 0x2000, CRC(da0cfdcc) SHA1(a2dbcf2f899250b9e7c5c7b31969667024457a72), ROM_BIOS(4))
+ ROM_RELOAD(0x2000,0x2000)
+ ROM_SYSTEM_BIOS(5, "cas87", "CAS DOS 1987") // 4.12 with texts translated
+ ROMX_LOAD("cas1987.bin", 0x0000, 0x2000, CRC(a6a9450c) SHA1(b54b173a9f11ed730804d94584a1679193993e3c), ROM_BIOS(5))
ROM_RELOAD(0x2000,0x2000)
ROM_END
+ROM_START(betacbi)
+ ROM_REGION(0x4000, "rom", 0)
+ ROM_DEFAULT_BIOS("cbi24")
+ ROM_SYSTEM_BIOS(0, "cbi23", "CBI-95 v2.3")
+ ROMX_LOAD("cbi95-23.bin", 0x0000, 0x4000, CRC(7fbefca6) SHA1(aa0c10162d440bc569648c524bbfc0b6d7c0b0dd), ROM_BIOS(0))
+ ROM_SYSTEM_BIOS(1, "cbi24", "CBI-95 v2.4")
+ ROMX_LOAD("cbi95-24.bin", 0x0000, 0x4000, CRC(afe4cec3) SHA1(6a30ab6997ac91798830f5f5d9645ba150050760), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(2, "ids91", "SYNCHRON IDS91")
+ ROMX_LOAD("ids91.bin", 0x0000, 0x4000, CRC(d569c67a) SHA1(50de5dbd49d8e03c97e416d4e0586870b90a4b87), ROM_BIOS(2))
+ ROM_SYSTEM_BIOS(3, "ids2001", "SYNCHRON IDS2001ne")
+ ROMX_LOAD("ids2001.bin", 0x0000, 0x4000, CRC(a1701f84) SHA1(32bd5f980bec168677513c568c8381a9a59aada3), ROM_BIOS(3))
+ ROM_SYSTEM_BIOS(4, "ar20", "ARCADE AR-20")
+ ROMX_LOAD("ar-20.bin", 0x0000, 0x4000, CRC(0ceeaa4d) SHA1(3e5f7d43218b5bd2a6e2aa28220c77cb651f5daa), ROM_BIOS(4))
+ROM_END
+
//-------------------------------------------------
// device_add_mconfig - add device configuration
@@ -208,6 +243,14 @@ void spectrum_betav3_device::device_add_mconfig(machine_config& config)
device_add_mconfig_base(config);
}
+void spectrum_betacbi_device::device_add_mconfig(machine_config& config)
+{
+ FD1797(config, m_fdc, 4_MHz_XTAL / 4);
+ m_fdc->hld_wr_callback().set(FUNC(spectrum_betacbi_device::fdc_hld_w));
+
+ device_add_mconfig_base(config);
+}
+
const tiny_rom_entry *spectrum_betav2_device::device_rom_region() const
{
return ROM_NAME(betav2);
@@ -223,6 +266,11 @@ const tiny_rom_entry *spectrum_betaplus_device::device_rom_region() const
return ROM_NAME(betaplus);
}
+const tiny_rom_entry *spectrum_betacbi_device::device_rom_region() const
+{
+ return ROM_NAME(betacbi);
+}
+
//**************************************************************************
// LIVE DEVICE
@@ -268,6 +316,16 @@ spectrum_betaplus_device::spectrum_betaplus_device(const machine_config &mconfig
{
}
+spectrum_betacbi_device::spectrum_betacbi_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : spectrum_betaplus_device(mconfig, type, tag, owner, clock)
+{
+}
+
+spectrum_betacbi_device::spectrum_betacbi_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : spectrum_betacbi_device(mconfig, SPECTRUM_BETACBI, tag, owner, clock)
+{
+}
+
//-------------------------------------------------
// device_start - device-specific startup
@@ -276,6 +334,7 @@ spectrum_betaplus_device::spectrum_betaplus_device(const machine_config &mconfig
void spectrum_betav2_device::device_start()
{
save_item(NAME(m_romcs));
+ save_item(NAME(m_masterdisable));
save_item(NAME(m_control));
save_item(NAME(m_motor_active));
@@ -295,10 +354,10 @@ void spectrum_betav2_device::device_start()
void spectrum_betav2_device::device_reset()
{
- // always paged in on boot? (no mode switch like beta128)
+ // always paged in on boot, no mode switch like beta128.
m_romcs = 1;
m_control = 0;
- m_masterportdisable = 1;
+ m_masterdisable = 0;
}
//**************************************************************************
@@ -327,6 +386,23 @@ void spectrum_betav2_device::fetch(offs_t offset)
}
}
+void spectrum_betacbi_device::fetch(offs_t offset)
+{
+ if (!machine().side_effects_disabled())
+ {
+ if ((offset & 0xff00) == 0x3c00 && !(m_masterdisable & 0x40))
+ m_romcs = 1;
+ else
+ m_romcs = 0;
+
+ if (!(m_control & 0x80))
+ {
+ if (offset < 0x4000)
+ m_romcs = 1;
+ }
+ }
+}
+
void spectrum_betav2_device::pre_opcode_fetch(offs_t offset)
{
m_exp->pre_opcode_fetch(offset);
@@ -343,7 +419,7 @@ uint8_t spectrum_betav2_device::iorq_r(offs_t offset)
{
uint8_t data = 0xff;
- if (!m_masterportdisable)
+ if (!(m_masterdisable & 0x80))
{
switch (offset & 0x87)
{
@@ -367,9 +443,9 @@ uint8_t spectrum_betav2_device::iorq_r(offs_t offset)
void spectrum_betav2_device::iorq_w(offs_t offset, uint8_t data)
{
if ((offset & 3) == 0)
- m_masterportdisable = data & 0x80;
+ m_masterdisable = data;
- if (!m_masterportdisable)
+ if (!(m_masterdisable & 0x80))
{
switch (offset & 0x87)
{
@@ -405,9 +481,9 @@ void spectrum_betav2_device::iorq_w(offs_t offset, uint8_t data)
void spectrum_betav3_device::iorq_w(offs_t offset, uint8_t data)
{
if ((offset & 3) == 0)
- m_masterportdisable = data & 0x80;
+ m_masterdisable = data;
- if (!m_masterportdisable)
+ if (!(m_masterdisable & 0x80))
{
switch (offset & 0x87)
{
@@ -452,6 +528,19 @@ uint8_t spectrum_betav2_device::mreq_r(offs_t offset)
return data;
}
+uint8_t spectrum_betacbi_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_betav2_device::mreq_w(offs_t offset, uint8_t data)
{
if (m_exp->romcs())
diff --git a/src/devices/bus/spectrum/beta.h b/src/devices/bus/spectrum/beta.h
index 6781bb1902f..5d080f93deb 100644
--- a/src/devices/bus/spectrum/beta.h
+++ b/src/devices/bus/spectrum/beta.h
@@ -54,13 +54,13 @@ protected:
required_device<spectrum_expansion_slot_device> m_exp;
int m_romcs;
- int m_masterportdisable;
+ u8 m_masterdisable;
u8 m_control;
bool m_motor_active;
void fdc_hld_w(int state);
virtual void motors_control();
- void fetch(offs_t offset);
+ virtual void fetch(offs_t offset);
};
class spectrum_betav3_device :
@@ -95,9 +95,26 @@ protected:
};
+class spectrum_betacbi_device :
+ public spectrum_betaplus_device
+{
+public:
+ // construction/destruction
+ spectrum_betacbi_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+ spectrum_betacbi_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 uint8_t mreq_r(offs_t offset) override;
+ virtual void fetch(offs_t offset) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+};
+
// device type definition
DECLARE_DEVICE_TYPE(SPECTRUM_BETAV2, spectrum_betav2_device)
DECLARE_DEVICE_TYPE(SPECTRUM_BETAV3, spectrum_betav3_device)
DECLARE_DEVICE_TYPE(SPECTRUM_BETAPLUS, spectrum_betaplus_device)
+DECLARE_DEVICE_TYPE(SPECTRUM_BETACBI, spectrum_betacbi_device)
#endif // MAME_BUS_SPECTRUM_BETA_H
diff --git a/src/devices/bus/spectrum/exp.cpp b/src/devices/bus/spectrum/exp.cpp
index 160b4500eaf..642dcd1d8e0 100644
--- a/src/devices/bus/spectrum/exp.cpp
+++ b/src/devices/bus/spectrum/exp.cpp
@@ -178,6 +178,7 @@ 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("betacbi", SPECTRUM_BETACBI);
device.option_add("beta128", SPECTRUM_BETA128);
device.option_add("disciple", SPECTRUM_DISCIPLE);
device.option_add("intf1", SPECTRUM_INTF1);