spectrum/beta.cpp add remaining known clone devices

This commit is contained in:
MetalliC 2020-06-20 16:04:27 +03:00
parent 1f9a72cdb3
commit e98b077026
4 changed files with 223 additions and 11 deletions

View File

@ -48,9 +48,11 @@
- 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
- MIDAS Gammadisk - 3 versions known to exists:
- straight clone
- added i8255 PPI for joystick and printer, uses 32KByte ROM with modified BASIC48 ROM in one half and TR-DOS 4.12 in another
- same as above plus 6850 ACIA
- number of straight clones with "Vision Desktop" boot ROM
Some units also exist that allow population of both V3 and V4
ROM types with a switch (unofficial, for compatibility?)
@ -71,10 +73,12 @@
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 - BDI I/O access, 0=enable, 1=disable (when BDI I/O enabled - /IORQ passthrough to next expansions is blocked)
CBI clones: D6 - 1=disable permanent BDI ROM mapping at 3c00-3cff, 0=enable (like original BDI)
Gammadisk : D6 - 0 - enable Gammadisk I/O (/IORQ passthrough blocked), 1=disable all Gammadisk I/O (enable /IORQ passthrough)
D7 - (have effect if D6 is 0) 0=enable FDC I/O, 1=enable PPI and ACIA I/O;
while master_latch is enabled IO access to other expansions is blocked (output /IORQ forced to 1) but enabled BDI ports:
BDI I/O 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).
@ -99,7 +103,9 @@
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_BETACLONE,spectrum_betaclone_device,"spectrum_betaclone","Beta Disk Plus clones")
DEFINE_DEVICE_TYPE(SPECTRUM_BETACBI, spectrum_betacbi_device, "spectrum_betacbi", "CBI-95 Disk Interface")
DEFINE_DEVICE_TYPE(SPECTRUM_GAMMA, spectrum_gamma_device, "spectrum_gamma", "MIDAS Gammadisk Interface")
//-------------------------------------------------
// SLOT_INTERFACE( beta_floppies )
@ -194,6 +200,23 @@ ROM_START(betaplus)
ROM_RELOAD(0x2000,0x2000)
ROM_END
ROM_START(betaclone)
ROM_REGION(0x4000, "rom", 0)
ROM_DEFAULT_BIOS("vision10")
ROM_SYSTEM_BIOS(0, "vision10", "Vision 1.0 TR-DOS v4.12")
ROMX_LOAD("vision10.bin", 0x0000, 0x4000, CRC(20f49ff5) SHA1(d391324cb39e9fc6b93b867a71caec019c353518), ROM_BIOS(0))
ROM_SYSTEM_BIOS(1, "vision14", "Vision 1.4 TR-DOS v4.40")
ROMX_LOAD("vision14.bin", 0x0000, 0x4000, CRC(9903f577) SHA1(579627a2865caf3079cbae360bdaf0309d4a2911), ROM_BIOS(1))
ROM_SYSTEM_BIOS(2, "vision17b", "Vision 1.7 TR-DOS v4.82")
ROMX_LOAD("vision17b.bin", 0x0000, 0x4000, CRC(ecee1ff1) SHA1(ffde2a0f9b13328b6462fbf4eb95cfe8202a2d3f), ROM_BIOS(2))
ROM_SYSTEM_BIOS(3, "vision17c", "Vision 1.7 TR-DOS v4.83")
ROMX_LOAD("vision17c.bin", 0x0000, 0x4000, CRC(c192a6b1) SHA1(d9eb1e06e28b2fb45c704cffd4a8b8a912041d08), ROM_BIOS(3))
ROM_SYSTEM_BIOS(4, "vision18", "Vision 1.8 TR-DOS v4.80")
ROMX_LOAD("vision18.bin", 0x0000, 0x4000, CRC(3ee7a488) SHA1(57167b82a6a3ffa8b25e97fa8cc208da361f1cc7), ROM_BIOS(4))
ROM_SYSTEM_BIOS(5, "vision19", "Vision 1.9 TR-DOS v4.81")
ROMX_LOAD("vision19.bin", 0x0000, 0x4000, CRC(1a793d53) SHA1(cdbd0ac2262ede3852998174f88ae333419a570f), ROM_BIOS(5))
ROM_END
ROM_START(betacbi)
ROM_REGION(0x4000, "rom", 0)
ROM_DEFAULT_BIOS("cbi24")
@ -209,6 +232,13 @@ ROM_START(betacbi)
ROMX_LOAD("ar-20.bin", 0x0000, 0x4000, CRC(0ceeaa4d) SHA1(3e5f7d43218b5bd2a6e2aa28220c77cb651f5daa), ROM_BIOS(4))
ROM_END
ROM_START(gamma)
ROM_REGION(0x8000, "rom", 0)
ROM_DEFAULT_BIOS("gamma")
ROM_SYSTEM_BIOS(0, "gamma", "Gammadisk v4.1")
ROMX_LOAD("gamma.bin", 0x0000, 0x8000, CRC(00e4a835) SHA1(dffeb9f47b3eca94afbb61373eba003efd4675ff), ROM_BIOS(0))
ROM_END
//-------------------------------------------------
// device_add_mconfig - add device configuration
@ -251,6 +281,18 @@ void spectrum_betacbi_device::device_add_mconfig(machine_config& config)
device_add_mconfig_base(config);
}
void spectrum_gamma_device::device_add_mconfig(machine_config& config)
{
FD1793(config, m_fdc, 4_MHz_XTAL / 4);
m_fdc->hld_wr_callback().set(FUNC(spectrum_gamma_device::fdc_hld_w));
device_add_mconfig_base(config);
I8255(config, m_ppi);
// TODO hook joystick and printer ports
ACIA6850(config, m_acia, 0); // schematics missing, wiring unknown
}
const tiny_rom_entry *spectrum_betav2_device::device_rom_region() const
{
return ROM_NAME(betav2);
@ -266,11 +308,21 @@ const tiny_rom_entry *spectrum_betaplus_device::device_rom_region() const
return ROM_NAME(betaplus);
}
const tiny_rom_entry *spectrum_betaclone_device::device_rom_region() const
{
return ROM_NAME(betaclone);
}
const tiny_rom_entry *spectrum_betacbi_device::device_rom_region() const
{
return ROM_NAME(betacbi);
}
const tiny_rom_entry *spectrum_gamma_device::device_rom_region() const
{
return ROM_NAME(gamma);
}
//**************************************************************************
// LIVE DEVICE
@ -316,16 +368,38 @@ 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_betaclone_device::spectrum_betaclone_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_betaclone_device::spectrum_betaclone_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: spectrum_betaclone_device(mconfig, SPECTRUM_BETACLONE, tag, owner, clock)
{
}
spectrum_betacbi_device::spectrum_betacbi_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
: spectrum_betaclone_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)
{
}
spectrum_gamma_device::spectrum_gamma_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)
, m_ppi(*this, "PPI")
, m_acia(*this, "ACIA")
{
}
spectrum_gamma_device::spectrum_gamma_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: spectrum_gamma_device(mconfig, SPECTRUM_GAMMA, tag, owner, clock)
{
}
//-------------------------------------------------
// device_start - device-specific startup
@ -512,6 +586,97 @@ void spectrum_betav3_device::iorq_w(offs_t offset, uint8_t data)
m_exp->iorq_w(offset, data);
}
uint8_t spectrum_gamma_device::iorq_r(offs_t offset)
{
uint8_t data = 0xff;
if (!(m_masterdisable & 0x40))
{
if (!(m_masterdisable & 0x80))
{
switch (offset & 0x9f)
{
case 0x1f:
data = m_fdc->read((offset >> 5) & 0x03);
break;
case 0x9f:
data &= 0x3f; // actually open bus
data |= m_fdc->drq_r() ? 0x40 : 0;
data |= m_fdc->intrq_r() ? 0x80 : 0;
break;
}
}
else
{
switch (offset & 0x9f)
{
case 0x1f:
data = m_ppi->read((offset >> 5) & 0x03);
break;
case 0x9f:
data = m_acia->read((offset >> 6) & 0x01);
break;
}
}
}
else
data = m_exp->iorq_r(offset);
return data;
}
void spectrum_gamma_device::iorq_w(offs_t offset, uint8_t data)
{
if ((offset & 3) == 0)
m_masterdisable = data;
if (!(m_masterdisable & 0x40))
{
if (!(m_masterdisable & 0x80))
{
switch (offset & 0x9f)
{
case 0x1f:
m_fdc->write((offset >> 5) & 0x03, data);
break;
case 0x9f:
m_control = data;
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));
m_fdc->hlt_w(BIT(data, 3));
m_fdc->mr_w(BIT(data, 2));
motors_control();
break;
}
}
else
{
switch (offset & 0x9f)
{
case 0x1f:
m_ppi->write((offset >> 5) & 0x03, data);
break;
case 0x9f:
m_acia->write((offset >> 6) & 0x01, data);
break;
}
}
}
else
m_exp->iorq_w(offset, data);
}
uint8_t spectrum_betav2_device::mreq_r(offs_t offset)
{
uint8_t data = 0xff;
@ -528,7 +693,7 @@ uint8_t spectrum_betav2_device::mreq_r(offs_t offset)
return data;
}
uint8_t spectrum_betacbi_device::mreq_r(offs_t offset)
uint8_t spectrum_betaclone_device::mreq_r(offs_t offset)
{
uint8_t data = 0xff;
@ -541,6 +706,11 @@ uint8_t spectrum_betacbi_device::mreq_r(offs_t offset)
return data;
}
uint8_t spectrum_gamma_device::mreq_r(offs_t offset)
{
return m_rom->base()[(offset & 0x3fff) + (m_romcs ? 0x4000 : 0)];
}
void spectrum_betav2_device::mreq_w(offs_t offset, uint8_t data)
{
if (m_exp->romcs())

View File

@ -12,6 +12,8 @@
#include "softlist.h"
#include "imagedev/floppy.h"
#include "machine/wd_fdc.h"
#include "machine/i8255.h"
#include "machine/6850acia.h"
#include "formats/trd_dsk.h"
//**************************************************************************
@ -95,9 +97,23 @@ protected:
};
class spectrum_betacbi_device :
class spectrum_betaclone_device :
public spectrum_betaplus_device
{
public:
// construction/destruction
spectrum_betaclone_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
spectrum_betaclone_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
virtual uint8_t mreq_r(offs_t offset) override;
virtual const tiny_rom_entry *device_rom_region() const override;
};
class spectrum_betacbi_device :
public spectrum_betaclone_device
{
public:
// construction/destruction
spectrum_betacbi_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@ -105,16 +121,37 @@ public:
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;
};
class spectrum_gamma_device :
public spectrum_betaplus_device
{
public:
// construction/destruction
spectrum_gamma_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
spectrum_gamma_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
required_device<i8255_device> m_ppi;
required_device<acia6850_device> m_acia;
virtual void device_add_mconfig(machine_config &config) override;
virtual uint8_t mreq_r(offs_t offset) override;
virtual const tiny_rom_entry *device_rom_region() const 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 { return 1; };
};
// 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_BETACLONE, spectrum_betaclone_device)
DECLARE_DEVICE_TYPE(SPECTRUM_BETACBI, spectrum_betacbi_device)
DECLARE_DEVICE_TYPE(SPECTRUM_GAMMA, spectrum_gamma_device)
#endif // MAME_BUS_SPECTRUM_BETA_H

View File

@ -178,7 +178,9 @@ 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("betaclone", SPECTRUM_BETACLONE);
device.option_add("betacbi", SPECTRUM_BETACBI);
device.option_add("gamma", SPECTRUM_GAMMA);
device.option_add("beta128", SPECTRUM_BETA128);
device.option_add("disciple", SPECTRUM_DISCIPLE);
device.option_add("intf1", SPECTRUM_INTF1);

View File

@ -440,8 +440,11 @@ void spectrum_plusd_device::iorq_w(offs_t offset, uint8_t data)
break;
case 0xef: // bit 0-1: drive select, 6: printer strobe, 7: side select
{
uint8_t drive = data & 3;
floppy_image_device* floppy = m_floppy[drive > 0 ? drive-1 : drive]->get_device();
floppy_image_device* floppy = nullptr;
if (data & 1)
floppy = m_floppy[0]->get_device();
else if (data & 2)
floppy = m_floppy[1]->get_device();
m_fdc->set_floppy(floppy);
m_centronics->write_strobe(BIT(data, 6));
if (floppy) floppy->ss_w(BIT(data, 7));