bus/bbc/fdc: Added the Kenda Professional DMFS and Microware/UDM DDFS boards.

This commit is contained in:
Nigel Barnes 2020-08-16 16:06:05 +01:00
parent d64262230b
commit ea75086da7
9 changed files with 306 additions and 79 deletions

View File

@ -331,12 +331,14 @@ if (BUSES["BBC_FDC"]~=null) then
MAME_DIR .. "src/devices/bus/bbc/fdc/cumana.h",
MAME_DIR .. "src/devices/bus/bbc/fdc/cv1797.cpp",
MAME_DIR .. "src/devices/bus/bbc/fdc/cv1797.h",
MAME_DIR .. "src/devices/bus/bbc/fdc/microware.cpp",
MAME_DIR .. "src/devices/bus/bbc/fdc/microware.h",
MAME_DIR .. "src/devices/bus/bbc/fdc/kenda.cpp",
MAME_DIR .. "src/devices/bus/bbc/fdc/kenda.h",
MAME_DIR .. "src/devices/bus/bbc/fdc/opus.cpp",
MAME_DIR .. "src/devices/bus/bbc/fdc/opus.h",
MAME_DIR .. "src/devices/bus/bbc/fdc/solidisk.cpp",
MAME_DIR .. "src/devices/bus/bbc/fdc/solidisk.h",
MAME_DIR .. "src/devices/bus/bbc/fdc/udm.cpp",
MAME_DIR .. "src/devices/bus/bbc/fdc/udm.h",
MAME_DIR .. "src/devices/bus/bbc/fdc/watford.cpp",
MAME_DIR .. "src/devices/bus/bbc/fdc/watford.h",
}

View File

@ -96,9 +96,10 @@ void bbc_fdc_slot_device::write(offs_t offset, uint8_t data)
#include "ams.h"
#include "cumana.h"
#include "cv1797.h"
#include "microware.h"
#include "kenda.h"
#include "opus.h"
#include "solidisk.h"
#include "udm.h"
#include "watford.h"
@ -110,7 +111,7 @@ void bbc_fdc_devices(device_slot_interface &device)
device.option_add("cumana1", BBC_CUMANA1);
device.option_add("cumana2", BBC_CUMANA2);
device.option_add("cv1797", BBC_CV1797);
device.option_add("microware", BBC_MICROWARE);
device.option_add("kenda", BBC_KENDA);
device.option_add("opus8272", BBC_OPUS8272);
device.option_add("opus2791", BBC_OPUS2791);
device.option_add("opus2793", BBC_OPUS2793);
@ -118,6 +119,7 @@ void bbc_fdc_devices(device_slot_interface &device)
device.option_add("stl1770_1", BBC_STL1770_1);
device.option_add("stl1770_2", BBC_STL1770_2);
device.option_add("stldfdc_1", BBC_STLDFDC_1);
device.option_add("udm", BBC_UDM);
device.option_add("weddb2", BBC_WEDDB2);
device.option_add("weddb3", BBC_WEDDB3);
}

View File

@ -0,0 +1,166 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/**********************************************************************
Kenda Professional DMFS
The Kenda Professional is packaged with the board in an epoxy blob, and is
quite rare. The board contents are not known as no-one has attempted to
remove the epoxy.
What we do know is that it contains:
- 8K ROM
- 2K RAM
- FDC (definitely WD compatible, and likely a WD2793)
The board plugs into the usual 8271 socket and has a ribbon cable with 24 pin
header that plugs into a ROM socket.
The 8K ROM is mirrored to fill the 16K ROM space, and has the 2K RAM overlayed
from offset &3000, and also mirrored upto &4000.
**********************************************************************/
#include "emu.h"
#include "kenda.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
DEFINE_DEVICE_TYPE(BBC_KENDA, bbc_kenda_device, "bbc_kenda", "Kenda Professional DMFS")
//-------------------------------------------------
// FLOPPY_FORMATS( floppy_formats )
//-------------------------------------------------
FLOPPY_FORMATS_MEMBER( bbc_kenda_device::floppy_formats )
FLOPPY_ACORN_SSD_FORMAT,
FLOPPY_ACORN_DSD_FORMAT
FLOPPY_FORMATS_END
//-------------------------------------------------
// SLOT_INTERFACE( bbc_floppies_525 )
//-------------------------------------------------
static void bbc_floppies_525(device_slot_interface &device)
{
device.option_add("525sssd", FLOPPY_525_SSSD);
device.option_add("525sd", FLOPPY_525_SD);
device.option_add("525ssdd", FLOPPY_525_SSDD);
device.option_add("525dd", FLOPPY_525_DD);
device.option_add("525qd", FLOPPY_525_QD);
}
//-------------------------------------------------
// ROM( kenda )
//-------------------------------------------------
ROM_START( kenda )
ROM_REGION(0x4000, "dfs_rom", 0)
ROM_LOAD("kenda102.rom", 0x0000, 0x2000, CRC(430b911c) SHA1(594ae1d1aeaa20a1d5d1c64cd94d43926dda4029))
ROM_RELOAD( 0x2000, 0x2000)
ROM_END
//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
void bbc_kenda_device::device_add_mconfig(machine_config &config)
{
WD2793(config, m_fdc, DERIVED_CLOCK(1, 8)); // TODO: unconfirmed FDC
m_fdc->intrq_wr_callback().set(DEVICE_SELF_OWNER, FUNC(bbc_fdc_slot_device::intrq_w));
m_fdc->drq_wr_callback().set(DEVICE_SELF_OWNER, FUNC(bbc_fdc_slot_device::drq_w));
m_fdc->hld_wr_callback().set(FUNC(bbc_kenda_device::motor_w));
FLOPPY_CONNECTOR(config, m_floppy[0], bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy[1], bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
}
//-------------------------------------------------
// rom_region - device-specific ROM region
//-------------------------------------------------
const tiny_rom_entry *bbc_kenda_device::device_rom_region() const
{
return ROM_NAME( kenda );
}
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// bbc_kenda_device - constructor
//-------------------------------------------------
bbc_kenda_device::bbc_kenda_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_KENDA, tag, owner, clock)
, device_bbc_fdc_interface(mconfig, *this)
, m_fdc(*this, "fdc")
, m_floppy(*this, "fdc:%u", 0)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void bbc_kenda_device::device_start()
{
}
//**************************************************************************
// IMPLEMENTATION
//**************************************************************************
uint8_t bbc_kenda_device::read(offs_t offset)
{
uint8_t data;
if (offset & 0x04)
{
data = 0xfe;
}
else
{
data = m_fdc->read(offset & 0x03);
}
return data;
}
void bbc_kenda_device::write(offs_t offset, uint8_t data)
{
if (offset & 0x04)
{
floppy_image_device *floppy = nullptr;
// bit 0: drive select
floppy = m_floppy[BIT(data, 0)]->get_device();
m_fdc->set_floppy(floppy);
// bit 1: side select
if (floppy)
floppy->ss_w(BIT(data, 1));
// other bits unknown, or unused
// bit 7: density
m_fdc->dden_w(!BIT(data, 7));
}
else
{
m_fdc->write(offset & 0x03, data);
}
}
WRITE_LINE_MEMBER(bbc_kenda_device::motor_w)
{
if (m_floppy[0]->get_device()) m_floppy[0]->get_device()->mon_w(!state);
if (m_floppy[1]->get_device()) m_floppy[1]->get_device()->mon_w(!state);
}

View File

@ -0,0 +1,54 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/**********************************************************************
Kenda Professional DMFS
**********************************************************************/
#ifndef MAME_BUS_BBC_FDC_KENDA_H
#define MAME_BUS_BBC_FDC_KENDA_H
#pragma once
#include "fdc.h"
#include "imagedev/floppy.h"
#include "machine/wd_fdc.h"
#include "formats/acorn_dsk.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
class bbc_kenda_device : public device_t, public device_bbc_fdc_interface
{
public:
// construction/destruction
bbc_kenda_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device-level overrides
virtual void device_start() override;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
virtual uint8_t read(offs_t offset) override;
virtual void write(offs_t offset, uint8_t data) override;
private:
DECLARE_FLOPPY_FORMATS(floppy_formats);
DECLARE_WRITE_LINE_MEMBER(motor_w);
required_device<wd2793_device> m_fdc;
required_device_array<floppy_connector, 2> m_floppy;
};
// device type definition
DECLARE_DEVICE_TYPE(BBC_KENDA, bbc_kenda_device)
#endif /* MAME_BUS_BBC_FDC_KENDA_H */

View File

@ -2,29 +2,27 @@
// copyright-holders:Nigel Barnes
/**********************************************************************
United Disk Memories DDFS FDC
Microware DDFS FDC
Microware / United Disk Memories DDFS FDC
**********************************************************************/
#include "emu.h"
#include "microware.h"
#include "udm.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
DEFINE_DEVICE_TYPE(BBC_MICROWARE, bbc_microware_device, "bbc_microware", "Microware DDFS FDC")
DEFINE_DEVICE_TYPE(BBC_UDM, bbc_udm_device, "bbc_udm", "United Disk Memories DDFS FDC")
//-------------------------------------------------
// FLOPPY_FORMATS( microware )
// FLOPPY_FORMATS( udm )
//-------------------------------------------------
FLOPPY_FORMATS_MEMBER( bbc_microware_device::floppy_formats )
FLOPPY_FORMATS_MEMBER( bbc_udm_device::floppy_formats )
FLOPPY_ACORN_SSD_FORMAT,
FLOPPY_ACORN_DSD_FORMAT,
FLOPPY_FSD_FORMAT
@ -41,16 +39,19 @@ static void bbc_floppies_525(device_slot_interface &device)
//-------------------------------------------------
// ROM( microware )
// ROM( udm )
//-------------------------------------------------
ROM_START( microware )
ROM_START( udm )
ROM_REGION(0x4000, "dfs_rom", 0)
ROM_DEFAULT_BIOS("udm200")
ROM_SYSTEM_BIOS(0, "ddfs090", "Microware DDFS 0.90")
ROMX_LOAD("microware_ddfs090.rom", 0x0000, 0x4000, CRC(700d50e5) SHA1(6834e46cb15354003d553e6c2bdb4ed76b47a465), ROM_BIOS(0))
ROM_SYSTEM_BIOS(1, "udm200", "UDM DDFS 2.00")
ROM_SYSTEM_BIOS(0, "ddfs310", "UDM DDFS 3.10")
ROMX_LOAD("udm_ddfs310.rom", 0x0000, 0x4000, CRC(55851c2d) SHA1(c5b6557fa4dbfa651c8ecc5b1da93b615c3aa905), ROM_BIOS(0))
ROM_SYSTEM_BIOS(1, "ddfs200", "UDM DDFS 2.00")
ROMX_LOAD("udm_ddfs200.rom", 0x0000, 0x4000, CRC(1b4708a2) SHA1(0f37bcc73a758657cfe58c19f0cc92be9107e767), ROM_BIOS(1))
ROM_SYSTEM_BIOS(2, "ddfs098", "UDM DDFS 0.98")
ROMX_LOAD("udm_ddfs098.rom", 0x0000, 0x4000, CRC(2119f9ad) SHA1(bfb9404b34de3b489db73d886300f37081db2482), ROM_BIOS(2))
ROM_SYSTEM_BIOS(3, "ddfs090", "Microware DDFS 0.90")
ROMX_LOAD("microware_ddfs090.rom", 0x0000, 0x4000, CRC(700d50e5) SHA1(6834e46cb15354003d553e6c2bdb4ed76b47a465), ROM_BIOS(3))
ROM_END
@ -58,20 +59,20 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
void bbc_microware_device::device_add_mconfig(machine_config &config)
void bbc_udm_device::device_add_mconfig(machine_config &config)
{
WD2793(config, m_fdc, DERIVED_CLOCK(1, 8)); // Replay advert suggests Type R8272 UDM DFS
m_fdc->intrq_wr_callback().set(DEVICE_SELF_OWNER, FUNC(bbc_fdc_slot_device::intrq_w));
m_fdc->drq_wr_callback().set(DEVICE_SELF_OWNER, FUNC(bbc_fdc_slot_device::drq_w));
m_fdc->hld_wr_callback().set(FUNC(bbc_microware_device::motor_w));
WD2793(config, m_fdc, DERIVED_CLOCK(1, 8));
m_fdc->drq_wr_callback().set(FUNC(bbc_udm_device::drq_w));
m_fdc->intrq_wr_callback().set(FUNC(bbc_udm_device::intrq_w));
m_fdc->hld_wr_callback().set(FUNC(bbc_udm_device::motor_w));
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy[0], bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy[1], bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
}
const tiny_rom_entry *bbc_microware_device::device_rom_region() const
const tiny_rom_entry *bbc_udm_device::device_rom_region() const
{
return ROM_NAME( microware );
return ROM_NAME( udm );
}
//**************************************************************************
@ -79,16 +80,15 @@ const tiny_rom_entry *bbc_microware_device::device_rom_region() const
//**************************************************************************
//-------------------------------------------------
// bbc_microware_device - constructor
// bbc_udm_device - constructor
//-------------------------------------------------
bbc_microware_device::bbc_microware_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_MICROWARE, tag, owner, clock)
bbc_udm_device::bbc_udm_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_UDM, tag, owner, clock)
, device_bbc_fdc_interface(mconfig, *this)
, m_fdc(*this, "wd2793")
, m_floppy0(*this, "wd2793:0")
, m_floppy1(*this, "wd2793:1")
, m_drive_control(0)
, m_floppy(*this, "wd2793:%u", 0)
, m_fdc_ie(0)
{
}
@ -96,9 +96,8 @@ bbc_microware_device::bbc_microware_device(const machine_config &mconfig, const
// device_start - device-specific startup
//-------------------------------------------------
void bbc_microware_device::device_start()
void bbc_udm_device::device_start()
{
save_item(NAME(m_drive_control));
}
@ -106,7 +105,7 @@ void bbc_microware_device::device_start()
// IMPLEMENTATION
//**************************************************************************
uint8_t bbc_microware_device::read(offs_t offset)
uint8_t bbc_udm_device::read(offs_t offset)
{
uint8_t data;
@ -116,12 +115,12 @@ uint8_t bbc_microware_device::read(offs_t offset)
}
else
{
data = m_drive_control;
data = 0xfe;
}
return data;
}
void bbc_microware_device::write(offs_t offset, uint8_t data)
void bbc_udm_device::write(offs_t offset, uint8_t data)
{
if (offset & 0x04)
{
@ -131,31 +130,37 @@ void bbc_microware_device::write(offs_t offset, uint8_t data)
{
floppy_image_device *floppy = nullptr;
m_drive_control = data;
logerror("fdc: Drive control %02x \n", data);
// bit 0: drive select
switch (BIT(data, 0))
{
case 0: floppy = m_floppy0->get_device(); break;
case 1: floppy = m_floppy1->get_device(); break;
}
floppy = m_floppy[BIT(data, 0)]->get_device();
m_fdc->set_floppy(floppy);
// bit 1: side select
if (floppy)
floppy->ss_w(BIT(data, 1));
floppy->ss_w(!BIT(data, 1));
// bit 2: density
m_fdc->dden_w(BIT(data, 2));
m_fdc->dden_w(!BIT(data, 2));
// bit 3: always set ???
// bit 3: master reset
m_fdc->mr_w(BIT(data, 3));
// bit 4: ??? interrupt
// bit 4: interrupt enable
m_fdc_ie = BIT(data, 4);
}
}
WRITE_LINE_MEMBER(bbc_microware_device::motor_w)
WRITE_LINE_MEMBER(bbc_udm_device::intrq_w)
{
if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(!state);
if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(!state);
m_slot->intrq_w((state && m_fdc_ie) ? ASSERT_LINE : CLEAR_LINE);
}
WRITE_LINE_MEMBER(bbc_udm_device::drq_w)
{
m_slot->drq_w((state && m_fdc_ie) ? ASSERT_LINE : CLEAR_LINE);
}
WRITE_LINE_MEMBER(bbc_udm_device::motor_w)
{
if (m_floppy[0]->get_device()) m_floppy[0]->get_device()->mon_w(!state);
if (m_floppy[1]->get_device()) m_floppy[1]->get_device()->mon_w(!state);
}

View File

@ -2,15 +2,13 @@
// copyright-holders:Nigel Barnes
/**********************************************************************
United Disk Memories DDFS FDC
Microware DDFS FDC
Microware / United Disk Memories DDFS FDC
**********************************************************************/
#ifndef MAME_BUS_BBC_FDC_MICROWARE_H
#define MAME_BUS_BBC_FDC_MICROWARE_H
#ifndef MAME_BUS_BBC_FDC_UDM_H
#define MAME_BUS_BBC_FDC_UDM_H
#pragma once
@ -24,15 +22,13 @@
// TYPE DEFINITIONS
//**************************************************************************
class bbc_microware_device :
class bbc_udm_device :
public device_t,
public device_bbc_fdc_interface
{
public:
static constexpr feature_type imperfect_features() { return feature::DISK; }
// construction/destruction
bbc_microware_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
bbc_udm_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device-level overrides
@ -48,18 +44,19 @@ protected:
private:
DECLARE_FLOPPY_FORMATS(floppy_formats);
DECLARE_WRITE_LINE_MEMBER(intrq_w);
DECLARE_WRITE_LINE_MEMBER(drq_w);
DECLARE_WRITE_LINE_MEMBER(motor_w);
required_device<wd2793_device> m_fdc;
required_device<floppy_connector> m_floppy0;
optional_device<floppy_connector> m_floppy1;
required_device_array<floppy_connector, 2> m_floppy;
int m_drive_control;
int m_fdc_ie;
};
// device type definition
DECLARE_DEVICE_TYPE(BBC_MICROWARE, bbc_microware_device);
DECLARE_DEVICE_TYPE(BBC_UDM, bbc_udm_device);
#endif /* MAME_BUS_BBC_FDC_MICROWARE_H */
#endif /* MAME_BUS_BBC_FDC_UDM_H */

View File

@ -2,7 +2,7 @@
// copyright-holders:Nigel Barnes
/***************************************************************************
BBC Micro MRM E00 DFS emulation
BBC Micro E00 DFS emulation
Comprises of 8K ROM and 2K/4K? RAM on a carrier board, with flying lead
to RW line to enable writing to RAM.
@ -17,7 +17,7 @@
// DEVICE DEFINITIONS
//**************************************************************************
DEFINE_DEVICE_TYPE(BBC_MRME00, bbc_mrme00_device, "bbc_mrme00", "BBC Micro MRM E00 DFS")
DEFINE_DEVICE_TYPE(BBC_DFSE00, bbc_dfse00_device, "bbc_dfse00", "BBC Micro E00 DFS")
//**************************************************************************
// LIVE DEVICE
@ -27,8 +27,8 @@ DEFINE_DEVICE_TYPE(BBC_MRME00, bbc_mrme00_device, "bbc_mrme00", "BBC Micro MRM E
// bbc_rom_device - constructor
//-------------------------------------------------
bbc_mrme00_device::bbc_mrme00_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_MRME00, tag, owner, clock)
bbc_dfse00_device::bbc_dfse00_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_DFSE00, tag, owner, clock)
, device_bbc_rom_interface(mconfig, *this)
{
}
@ -37,7 +37,7 @@ bbc_mrme00_device::bbc_mrme00_device(const machine_config &mconfig, const char *
// device_start - device-specific startup
//-------------------------------------------------
void bbc_mrme00_device::device_start()
void bbc_dfse00_device::device_start()
{
}
@ -45,7 +45,7 @@ void bbc_mrme00_device::device_start()
// read
//-------------------------------------------------
uint8_t bbc_mrme00_device::read(offs_t offset)
uint8_t bbc_dfse00_device::read(offs_t offset)
{
if (offset < get_rom_size())
return get_rom_base()[offset & (get_rom_size() - 1)];
@ -57,7 +57,7 @@ uint8_t bbc_mrme00_device::read(offs_t offset)
// write
//-------------------------------------------------
void bbc_mrme00_device::write(offs_t offset, uint8_t data)
void bbc_dfse00_device::write(offs_t offset, uint8_t data)
{
get_ram_base()[offset & (get_ram_size() - 1)] = data;
}

View File

@ -2,7 +2,7 @@
// copyright-holders:Nigel Barnes
/***************************************************************************
BBC Micro MRM E00 DFS emulation
BBC Micro E00 DFS emulation
***************************************************************************/
@ -17,14 +17,13 @@
// TYPE DEFINITIONS
//**************************************************************************
// ======================> bbc_mrme00_device
// ======================> bbc_dfse00_device
class bbc_mrme00_device : public device_t,
public device_bbc_rom_interface
class bbc_dfse00_device : public device_t, public device_bbc_rom_interface
{
public:
// construction/destruction
bbc_mrme00_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
bbc_dfse00_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device-level overrides
@ -36,7 +35,7 @@ protected:
};
// device type definition
DECLARE_DEVICE_TYPE(BBC_MRME00, bbc_mrme00_device)
DECLARE_DEVICE_TYPE(BBC_DFSE00, bbc_dfse00_device)
#endif // MAME_BUS_BBC_ROM_DFS_H

View File

@ -211,6 +211,7 @@ void bbc_romslot_device::write(offs_t offset, uint8_t data)
#include "dfs.h"
#include "genie.h"
#include "pal.h"
//#include "ramagic.h"
#include "rtc.h"
@ -229,7 +230,8 @@ void bbc_rom_devices(device_slot_interface &device)
device.option_add_internal("palabe", BBC_PALABE);
device.option_add_internal("palmo2", BBC_PALMO2);
device.option_add_internal("genie", BBC_PMSGENIE);
device.option_add_internal("mrme00", BBC_MRME00);
device.option_add_internal("dfse00", BBC_DFSE00);
//device.option_add_internal("ramagic", BBC_RAMAGIC);
device.option_add_internal("stlrtc", BBC_STLRTC);
device.option_add_internal("pmsrtc", BBC_PMSRTC);
}