summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/bbc/fdc/opus.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/bbc/fdc/opus.cpp')
-rw-r--r--src/devices/bus/bbc/fdc/opus.cpp147
1 files changed, 124 insertions, 23 deletions
diff --git a/src/devices/bus/bbc/fdc/opus.cpp b/src/devices/bus/bbc/fdc/opus.cpp
index 8efb4f63a06..e090485df87 100644
--- a/src/devices/bus/bbc/fdc/opus.cpp
+++ b/src/devices/bus/bbc/fdc/opus.cpp
@@ -4,6 +4,7 @@
Opus Floppy Disc Controllers
+ 8272: https://www.youtube.com/watch?v=09alLIz16ck
EDOS: http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Opus_DiscController.html
2791: http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Opus_DDoss.html
2793:
@@ -20,6 +21,7 @@
// DEVICE DEFINITIONS
//**************************************************************************
+DEFINE_DEVICE_TYPE(BBC_OPUS8272, bbc_opus8272_device, "bbc_opus8272", "Opus 8272 FDC")
DEFINE_DEVICE_TYPE(BBC_OPUS2791, bbc_opus2791_device, "bbc_opus2791", "Opus 2791 FDC")
DEFINE_DEVICE_TYPE(BBC_OPUS2793, bbc_opus2793_device, "bbc_opus2793", "Opus 2793 FDC")
DEFINE_DEVICE_TYPE(BBC_OPUS1770, bbc_opus1770_device, "bbc_opus1770", "Opus D-DOS(B) 1770 FDC")
@@ -33,7 +35,8 @@ FLOPPY_FORMATS_MEMBER( bbc_opusfdc_device::floppy_formats )
FLOPPY_ACORN_SSD_FORMAT,
FLOPPY_ACORN_DSD_FORMAT,
FLOPPY_FSD_FORMAT,
- FLOPPY_OPUS_DDOS_FORMAT
+ FLOPPY_OPUS_DDOS_FORMAT,
+ FLOPPY_OPUS_DDCPM_FORMAT
FLOPPY_FORMATS_END0
static SLOT_INTERFACE_START( bbc_floppies_525 )
@@ -44,6 +47,13 @@ static SLOT_INTERFACE_START( bbc_floppies_525 )
SLOT_INTERFACE("525qd", FLOPPY_525_QD)
SLOT_INTERFACE_END
+ROM_START( opus8272 )
+ ROM_REGION(0x4000, "dfs_rom", 0)
+ ROM_DEFAULT_BIOS("ddos300")
+ ROM_SYSTEM_BIOS(0, "ddos300", "Opus DDOS 3.00")
+ ROMX_LOAD("opus-ddos300.rom", 0x0000, 0x4000, CRC(1b5fa131) SHA1(6b4e0363a9d39807973a2ef0871a78b287cea27e), ROM_BIOS(1))
+ROM_END
+
ROM_START( opus2791 )
ROM_REGION(0x4000, "dfs_rom", 0)
ROM_DEFAULT_BIOS("ddos315")
@@ -74,13 +84,23 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
+MACHINE_CONFIG_MEMBER( bbc_opus8272_device::device_add_mconfig )
+ MCFG_I8272A_ADD("i8272", true)
+ MCFG_UPD765_INTRQ_CALLBACK(WRITELINE(bbc_opus8272_device, fdc_intrq_w))
+ MCFG_UPD765_HDL_CALLBACK(WRITELINE(bbc_opus8272_device, motor_w))
+ MCFG_FLOPPY_DRIVE_ADD("i8272:0", bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+ MCFG_FLOPPY_DRIVE_ADD("i8272:1", bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+MACHINE_CONFIG_END
+
MACHINE_CONFIG_MEMBER( bbc_opus2791_device::device_add_mconfig )
MCFG_WD2791_ADD("fdc", XTAL_16MHz / 16)
MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_opusfdc_device, fdc_drq_w))
MCFG_WD_FDC_HLD_CALLBACK(WRITELINE(bbc_opusfdc_device, motor_w))
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:0", bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats)
MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:1", bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats)
MCFG_FLOPPY_DRIVE_SOUND(true)
MACHINE_CONFIG_END
@@ -88,21 +108,26 @@ MACHINE_CONFIG_MEMBER( bbc_opus2793_device::device_add_mconfig )
MCFG_WD2793_ADD("fdc", XTAL_16MHz / 16)
MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_opusfdc_device, fdc_drq_w))
MCFG_WD_FDC_HLD_CALLBACK(WRITELINE(bbc_opusfdc_device, motor_w))
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:0", bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats)
MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:1", bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats)
MCFG_FLOPPY_DRIVE_SOUND(true)
MACHINE_CONFIG_END
MACHINE_CONFIG_MEMBER( bbc_opus1770_device::device_add_mconfig )
MCFG_WD1770_ADD("fdc", XTAL_16MHz / 2)
MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_opusfdc_device, fdc_drq_w))
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:0", bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats)
MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:1", bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats)
MCFG_FLOPPY_DRIVE_SOUND(true)
MACHINE_CONFIG_END
+const tiny_rom_entry *bbc_opus8272_device::device_rom_region() const
+{
+ return ROM_NAME( opus8272 );
+}
+
const tiny_rom_entry *bbc_opus2791_device::device_rom_region() const
{
return ROM_NAME( opus2791 );
@@ -127,6 +152,16 @@ const tiny_rom_entry *bbc_opus1770_device::device_rom_region() const
// bbc_opusfdc_device - constructor
//-------------------------------------------------
+bbc_opus8272_device::bbc_opus8272_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, BBC_OPUS8272, tag, owner, clock),
+ device_bbc_fdc_interface(mconfig, *this),
+ m_dfs_rom(*this, "dfs_rom"),
+ m_fdc(*this, "i8272"),
+ m_floppy0(*this, "i8272:0"),
+ m_floppy1(*this, "i8272:1")
+{
+}
+
bbc_opusfdc_device::bbc_opusfdc_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_bbc_fdc_interface(mconfig, *this),
@@ -156,6 +191,15 @@ bbc_opus1770_device::bbc_opus1770_device(const machine_config &mconfig, const ch
// device_start - device-specific startup
//-------------------------------------------------
+void bbc_opus8272_device::device_start()
+{
+ device_t* cpu = machine().device("maincpu");
+ address_space& space = cpu->memory().space(AS_PROGRAM);
+ m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner());
+
+ space.install_readwrite_handler(0xfe80, 0xfe86, READ8_DELEGATE(bbc_opus8272_device, fdc_r), WRITE8_DELEGATE(bbc_opus8272_device, fdc_w));
+}
+
void bbc_opusfdc_device::device_start()
{
device_t* cpu = machine().device("maincpu");
@@ -170,6 +214,13 @@ void bbc_opusfdc_device::device_start()
// device_reset - device-specific reset
//-------------------------------------------------
+void bbc_opus8272_device::device_reset()
+{
+ machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base());
+
+ m_fdc->soft_reset();
+}
+
void bbc_opusfdc_device::device_reset()
{
machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base());
@@ -182,6 +233,65 @@ void bbc_opusfdc_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
+READ8_MEMBER(bbc_opus8272_device::fdc_r)
+{
+ uint8_t data = 0xff;
+
+ switch (offset)
+ {
+ case 0x02:
+ data = 0x01;
+ break;
+ case 0x04:
+ case 0x06:
+ data = m_fdc->msr_r(space, 0);
+ break;
+ case 0x05:
+ case 0x07:
+ data = m_fdc->fifo_r(space, 0);
+ break;
+ }
+ logerror("Read %04x -> %02x\n", offset | 0xfe80, data);
+ return data;
+}
+
+WRITE8_MEMBER(bbc_opus8272_device::fdc_w)
+{
+ logerror("Write %04x <- %02x\n", offset | 0xfe80, data);
+ floppy_image_device *floppy = nullptr;
+
+ switch (offset)
+ {
+ case 0x01:
+ switch (data & 0x01)
+ {
+ case 0: floppy = m_floppy1->get_device(); break;
+ case 1: floppy = m_floppy0->get_device(); break;
+ }
+ m_fdc->set_floppy(floppy);
+
+ if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(0);
+ if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(0);
+ break;
+ case 0x05:
+ case 0x07:
+ m_fdc->fifo_w(space, 0, data);
+ break;
+ }
+}
+
+WRITE_LINE_MEMBER(bbc_opus8272_device::motor_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);
+}
+
+WRITE_LINE_MEMBER(bbc_opus8272_device::fdc_intrq_w)
+{
+ m_slot->intrq_w(state);
+}
+
+
READ8_MEMBER(bbc_opusfdc_device::ctrl_r)
{
return m_drive_control;
@@ -194,9 +304,11 @@ WRITE8_MEMBER(bbc_opusfdc_device::ctrl_w)
m_drive_control = data;
// bit 0: drive select
- floppy_image_device *floppy0 = m_fdc->subdevice<floppy_connector>("0")->get_device();
- floppy_image_device *floppy1 = m_fdc->subdevice<floppy_connector>("1")->get_device();
- floppy = (BIT(data, 0) ? floppy1 : floppy0);
+ switch (BIT(data, 0))
+ {
+ case 0: floppy = m_floppy0->get_device(); break;
+ case 1: floppy = m_floppy1->get_device(); break;
+ }
m_fdc->set_floppy(floppy);
// bit 1: side select
@@ -207,11 +319,6 @@ WRITE8_MEMBER(bbc_opusfdc_device::ctrl_w)
m_fdc->dden_w(!BIT(data, 6));
}
-WRITE_LINE_MEMBER(bbc_opusfdc_device::fdc_intrq_w)
-{
- m_slot->intrq_w(state);
-}
-
WRITE_LINE_MEMBER(bbc_opusfdc_device::fdc_drq_w)
{
m_slot->drq_w(state);
@@ -219,12 +326,6 @@ WRITE_LINE_MEMBER(bbc_opusfdc_device::fdc_drq_w)
WRITE_LINE_MEMBER(bbc_opusfdc_device::motor_w)
{
- for (int i = 0; i != 2; i++) {
- char devname[8];
- sprintf(devname, "%d", i);
- floppy_connector *con = m_fdc->subdevice<floppy_connector>(devname);
- if (con) {
- con->get_device()->mon_w(!state);
- }
- }
+ if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(!state);
+ if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(!state);
}