summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Nigel Barnes <Pernod70@users.noreply.github.com>2017-08-24 15:23:18 +0100
committer Nigel Barnes <Pernod70@users.noreply.github.com>2017-08-25 20:03:44 +0100
commit70b91571ce1b77abb593c341419076859e7a9323 (patch)
tree9dcf6fe519ad86a8ba405b82de6fb08b688491c0
parentf8a902c9ec378eddda5c17d708f0a3c8ca1d747a (diff)
acorn_dsk: Added OPUS_DDCPM_FORMAT
- Removed ACORN_CPM_FORMAT, same geometry as ACORN_SSD_FORMAT/ACORN_DSD_FORMAT - Improved find_size/identify for SSD/DSD formats - ACORN_DOS_FORMAT 640K now handled as ACORN_ADFS_OLD_FORMAT - Fixed geometry for ACORN_DOS_FORMAT 800K bbc_acorn8271: Added Amcom DFS A7874 bbc_opus8272: New Opus 8272 FDC device with DDOS 3.00, not yet working. wd177x_dsk: Apply sector_count and gaps to track description.
-rw-r--r--src/devices/bus/bbc/1mhzbus/opus3.cpp4
-rw-r--r--src/devices/bus/bbc/fdc/acorn.cpp70
-rw-r--r--src/devices/bus/bbc/fdc/acorn.h17
-rw-r--r--src/devices/bus/bbc/fdc/fdc.cpp11
-rw-r--r--src/devices/bus/bbc/fdc/opus.cpp147
-rw-r--r--src/devices/bus/bbc/fdc/opus.h37
-rw-r--r--src/lib/formats/acorn_dsk.cpp209
-rw-r--r--src/lib/formats/acorn_dsk.h25
-rw-r--r--src/lib/formats/wd177x_dsk.cpp26
-rw-r--r--src/mame/drivers/bbc.cpp4
10 files changed, 359 insertions, 191 deletions
diff --git a/src/devices/bus/bbc/1mhzbus/opus3.cpp b/src/devices/bus/bbc/1mhzbus/opus3.cpp
index 273bfeda293..6d4e77be59c 100644
--- a/src/devices/bus/bbc/1mhzbus/opus3.cpp
+++ b/src/devices/bus/bbc/1mhzbus/opus3.cpp
@@ -55,9 +55,9 @@ DEFINE_DEVICE_TYPE(BBC_OPUS3, bbc_opus3_device, "bbc_opus3", "Opus Challenger 3-
FLOPPY_FORMATS_MEMBER(bbc_opus3_device::floppy_formats)
FLOPPY_ACORN_SSD_FORMAT,
FLOPPY_ACORN_DSD_FORMAT,
- FLOPPY_ACORN_CPM_FORMAT,
FLOPPY_FSD_FORMAT,
- FLOPPY_OPUS_DDOS_FORMAT
+ FLOPPY_OPUS_DDOS_FORMAT,
+ FLOPPY_OPUS_DDCPM_FORMAT
FLOPPY_FORMATS_END0
SLOT_INTERFACE_START(bbc_floppies)
diff --git a/src/devices/bus/bbc/fdc/acorn.cpp b/src/devices/bus/bbc/fdc/acorn.cpp
index ac6b478e560..ebc5d2a40aa 100644
--- a/src/devices/bus/bbc/fdc/acorn.cpp
+++ b/src/devices/bus/bbc/fdc/acorn.cpp
@@ -26,15 +26,6 @@ DEFINE_DEVICE_TYPE(BBC_ACORN1770, bbc_acorn1770_device, "bbc_acorn1770", "Acorn
FLOPPY_FORMATS_MEMBER( bbc_acorn8271_device::floppy_formats )
FLOPPY_ACORN_SSD_FORMAT,
FLOPPY_ACORN_DSD_FORMAT,
- FLOPPY_ACORN_CPM_FORMAT,
- FLOPPY_TORCH_CPN_FORMAT,
- FLOPPY_FSD_FORMAT
-FLOPPY_FORMATS_END0
-
-FLOPPY_FORMATS_MEMBER( bbc_acorn1770_device::floppy_formats )
- FLOPPY_ACORN_SSD_FORMAT,
- FLOPPY_ACORN_DSD_FORMAT,
- FLOPPY_ACORN_CPM_FORMAT,
FLOPPY_TORCH_CPN_FORMAT,
FLOPPY_FSD_FORMAT
FLOPPY_FORMATS_END0
@@ -61,43 +52,46 @@ ROM_START( acorn8271 )
ROMX_LOAD("dnfs100.rom", 0x0000, 0x4000, CRC(7e367e8c) SHA1(161f585dc45665ea77433c84afd2f95049f7f5a0), ROM_BIOS(3))
ROM_SYSTEM_BIOS(3, "dnfs120", "Acorn DFS 1.20")
ROMX_LOAD("dnfs120.rom", 0x0000, 0x4000, CRC(8ccd2157) SHA1(7e3c536baeae84d6498a14e8405319e01ee78232), ROM_BIOS(4))
- // Pace/Amcom
+ // Amcom
ROM_SYSTEM_BIOS(4, "amdfs0000", "Amcom DFS 00000")
ROMX_LOAD("amcomdfs_00000.rom", 0x0000, 0x2000, CRC(28947e95) SHA1(43eb9bfc70bb710e01c0c9d48703ea812f9266e4), ROM_BIOS(5))
ROM_RELOAD( 0x2000, 0x2000)
ROM_SYSTEM_BIOS(5, "amdfs7259", "Amcom DFS A7259")
ROMX_LOAD("amcomdfs_a7259.rom", 0x0000, 0x2000, CRC(a3366a98) SHA1(7b8b08edf5ebf17fcbcfbb2af0c189ac903285c2), ROM_BIOS(6))
ROM_RELOAD( 0x2000, 0x2000)
- ROM_SYSTEM_BIOS(6, "amdfs4084", "Amcom DFS B4084")
- ROMX_LOAD("amcomdfs_b4084.rom", 0x0000, 0x2000, CRC(487b049b) SHA1(559e056fe77ede2c87a314fcd8d3e2cab2b49b09), ROM_BIOS(7))
+ ROM_SYSTEM_BIOS(6, "amdfs7874", "Amcom DFS A7874")
+ ROMX_LOAD("amcomdfs_a7874.rom", 0x0000, 0x2000, CRC(a7efeee8) SHA1(b6b06c7435d570d25a10fff1c703d16942deb8fb), ROM_BIOS(7))
+ ROM_RELOAD(0x2000, 0x2000)
+ ROM_SYSTEM_BIOS(7, "amdfs4084", "Amcom DFS B4084")
+ ROMX_LOAD("amcomdfs_b4084.rom", 0x0000, 0x2000, CRC(487b049b) SHA1(559e056fe77ede2c87a314fcd8d3e2cab2b49b09), ROM_BIOS(8))
ROM_RELOAD( 0x2000, 0x2000)
- ROM_SYSTEM_BIOS(7, "amdfs4088", "Amcom DFS B4088")
- ROMX_LOAD("amcomdfs_b4088.rom", 0x0000, 0x2000, CRC(3b6e2f82) SHA1(3f5e5039a926c980957f169de2112793eb1a9890), ROM_BIOS(8))
+ ROM_SYSTEM_BIOS(8, "amdfs4088", "Amcom DFS B4088")
+ ROMX_LOAD("amcomdfs_b4088.rom", 0x0000, 0x2000, CRC(3b6e2f82) SHA1(3f5e5039a926c980957f169de2112793eb1a9890), ROM_BIOS(9))
ROM_RELOAD( 0x2000, 0x2000)
- ROM_SYSTEM_BIOS(8, "amdfs4218", "Amcom DFS B4218")
- ROMX_LOAD("amcomdfs_b4218.rom", 0x0000, 0x2000, CRC(98248af5) SHA1(17986b029d641047555eedc538d6790f0cf911a9), ROM_BIOS(9))
+ ROM_SYSTEM_BIOS(9, "amdfs4218", "Amcom DFS B4218")
+ ROMX_LOAD("amcomdfs_b4218.rom", 0x0000, 0x2000, CRC(98248af5) SHA1(17986b029d641047555eedc538d6790f0cf911a9), ROM_BIOS(10))
ROM_RELOAD( 0x2000, 0x2000)
// Watford Electronics
- ROM_SYSTEM_BIOS(9, "wdfs110", "Watford Electronics DFS 1.10")
- ROMX_LOAD("wedfs110.rom", 0x0000, 0x4000, CRC(73c47a91) SHA1(658eb78b104806e76a0e51de9eb238a51daf646d), ROM_BIOS(10))
- ROM_SYSTEM_BIOS(10, "wdfs130", "Watford Electronics DFS 1.30")
- ROMX_LOAD("wedfs130.rom", 0x0000, 0x4000, CRC(153edf1f) SHA1(01455e8762fe21a5fbb0c383793bcc6e9c34904c), ROM_BIOS(11))
- ROM_SYSTEM_BIOS(11, "wdfs141", "Watford Electronics DFS 1.41")
- ROMX_LOAD("wedfs141.rom", 0x0000, 0x4000, CRC(fda3f58d) SHA1(4f3984ebb35709b39369cb516440dd0589920337), ROM_BIOS(12))
- ROM_SYSTEM_BIOS(12, "wdfs142", "Watford Electronics DFS 1.42")
- ROMX_LOAD("wedfs142.rom", 0x0000, 0x4000, CRC(aef838de) SHA1(0caee270eddd8feb3fa75f721775e9b80f853358), ROM_BIOS(13))
- ROM_SYSTEM_BIOS(13, "wdfs143", "Watford Electronics DFS 1.43")
- ROMX_LOAD("wedfs143.rom", 0x0000, 0x4000, CRC(3755ee18) SHA1(69bc258880b8e163ff85a293a25e5f00931d030b), ROM_BIOS(14))
- ROM_SYSTEM_BIOS(14, "wdfs144", "Watford Electronics DFS 1.44")
- ROMX_LOAD("wedfs144.rom", 0x0000, 0x4000, CRC(9fb8d13f) SHA1(387d2468c6e1360f5b531784ce95d5f71a50c2b5), ROM_BIOS(15))
+ ROM_SYSTEM_BIOS(10, "wdfs110", "Watford Electronics DFS 1.10")
+ ROMX_LOAD("wedfs110.rom", 0x0000, 0x4000, CRC(73c47a91) SHA1(658eb78b104806e76a0e51de9eb238a51daf646d), ROM_BIOS(11))
+ ROM_SYSTEM_BIOS(11, "wdfs130", "Watford Electronics DFS 1.30")
+ ROMX_LOAD("wedfs130.rom", 0x0000, 0x4000, CRC(153edf1f) SHA1(01455e8762fe21a5fbb0c383793bcc6e9c34904c), ROM_BIOS(12))
+ ROM_SYSTEM_BIOS(12, "wdfs141", "Watford Electronics DFS 1.41")
+ ROMX_LOAD("wedfs141.rom", 0x0000, 0x4000, CRC(fda3f58d) SHA1(4f3984ebb35709b39369cb516440dd0589920337), ROM_BIOS(13))
+ ROM_SYSTEM_BIOS(13, "wdfs142", "Watford Electronics DFS 1.42")
+ ROMX_LOAD("wedfs142.rom", 0x0000, 0x4000, CRC(aef838de) SHA1(0caee270eddd8feb3fa75f721775e9b80f853358), ROM_BIOS(14))
+ ROM_SYSTEM_BIOS(14, "wdfs143", "Watford Electronics DFS 1.43")
+ ROMX_LOAD("wedfs143.rom", 0x0000, 0x4000, CRC(3755ee18) SHA1(69bc258880b8e163ff85a293a25e5f00931d030b), ROM_BIOS(15))
+ ROM_SYSTEM_BIOS(15, "wdfs144", "Watford Electronics DFS 1.44")
+ ROMX_LOAD("wedfs144.rom", 0x0000, 0x4000, CRC(9fb8d13f) SHA1(387d2468c6e1360f5b531784ce95d5f71a50c2b5), ROM_BIOS(16))
// Computer Users Club
- ROM_SYSTEM_BIOS(15, "bsdos219", "BS-DOS 2.19")
- ROMX_LOAD("bs-dos219.rom", 0x0000, 0x4000, CRC(299b17b2) SHA1(175fdcc802a7d94d7c36d6f3fd52a192a7cfbc98), ROM_BIOS(16))
- ROM_SYSTEM_BIOS(16, "bsdos222", "BS-DOS 2.22")
- ROMX_LOAD("bs-dos222.rom", 0x0000, 0x4000, CRC(63cf49d1) SHA1(92948e5843b9d9715354e21f14de2453bc250bf4), ROM_BIOS(17))
+ ROM_SYSTEM_BIOS(16, "bsdos219", "BS-DOS 2.19")
+ ROMX_LOAD("bs-dos219.rom", 0x0000, 0x4000, CRC(299b17b2) SHA1(175fdcc802a7d94d7c36d6f3fd52a192a7cfbc98), ROM_BIOS(17))
+ ROM_SYSTEM_BIOS(17, "bsdos222", "BS-DOS 2.22")
+ ROMX_LOAD("bs-dos222.rom", 0x0000, 0x4000, CRC(63cf49d1) SHA1(92948e5843b9d9715354e21f14de2453bc250bf4), ROM_BIOS(18))
// Others
- ROM_SYSTEM_BIOS(17, "cucdos", "C.U.C DOS 1.00")
- ROMX_LOAD("cucdos.rom", 0x0000, 0x2000, CRC(4adf8ecb) SHA1(ca3c1f9e89799459b6fd5197304129441443ca54), ROM_BIOS(18))
+ ROM_SYSTEM_BIOS(18, "cucdos", "C.U.C DOS 1.00")
+ ROMX_LOAD("cucdos.rom", 0x0000, 0x2000, CRC(4adf8ecb) SHA1(ca3c1f9e89799459b6fd5197304129441443ca54), ROM_BIOS(19))
ROM_RELOAD( 0x2000, 0x2000)
ROM_END
@@ -132,9 +126,9 @@ MACHINE_CONFIG_MEMBER( bbc_acorn8271_device::device_add_mconfig )
MCFG_I8271_IRQ_CALLBACK(WRITELINE(bbc_acorn8271_device, fdc_intrq_w))
MCFG_I8271_HDL_CALLBACK(WRITELINE(bbc_acorn8271_device, motor_w))
MCFG_I8271_OPT_CALLBACK(WRITELINE(bbc_acorn8271_device, side_w))
- MCFG_FLOPPY_DRIVE_ADD("i8271:0", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("i8271:0", bbc_floppies_525, "525qd", bbc_acorn8271_device::floppy_formats)
MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("i8271:1", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("i8271:1", bbc_floppies_525, "525qd", bbc_acorn8271_device::floppy_formats)
MCFG_FLOPPY_DRIVE_SOUND(true)
MACHINE_CONFIG_END
@@ -142,9 +136,9 @@ MACHINE_CONFIG_MEMBER( bbc_acorn1770_device::device_add_mconfig )
MCFG_WD1770_ADD("wd1770", XTAL_16MHz / 2)
MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_acorn1770_device, fdc_intrq_w))
MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_acorn1770_device, fdc_drq_w))
- MCFG_FLOPPY_DRIVE_ADD("wd1770:0", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("wd1770:0", bbc_floppies_525, "525qd", bbc_acorn8271_device::floppy_formats)
MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("wd1770:1", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("wd1770:1", bbc_floppies_525, "525qd", bbc_acorn8271_device::floppy_formats)
MCFG_FLOPPY_DRIVE_SOUND(true)
MACHINE_CONFIG_END
diff --git a/src/devices/bus/bbc/fdc/acorn.h b/src/devices/bus/bbc/fdc/acorn.h
index dc313027380..85323e1fb6a 100644
--- a/src/devices/bus/bbc/fdc/acorn.h
+++ b/src/devices/bus/bbc/fdc/acorn.h
@@ -7,8 +7,8 @@
**********************************************************************/
-#ifndef MAME_BUS__BBC_FDC_ACORN_H
-#define MAME_BUS__BBC_FDC_ACORN_H
+#ifndef MAME_BUS_BBC_FDC_ACORN_H
+#define MAME_BUS_BBC_FDC_ACORN_H
#pragma once
@@ -31,6 +31,8 @@ public:
// construction/destruction
bbc_acorn8271_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
+
protected:
// device-level overrides
virtual void device_start() override;
@@ -41,8 +43,6 @@ protected:
virtual const tiny_rom_entry *device_rom_region() const override;
private:
- DECLARE_FLOPPY_FORMATS(floppy_formats);
-
DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
DECLARE_WRITE_LINE_MEMBER(motor_w);
DECLARE_WRITE_LINE_MEMBER(side_w);
@@ -62,9 +62,6 @@ public:
// construction/destruction
bbc_acorn1770_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ8_MEMBER(wd1770l_read);
- DECLARE_WRITE8_MEMBER(wd1770l_write);
-
protected:
// device-level overrides
virtual void device_start() override;
@@ -75,8 +72,8 @@ protected:
virtual const tiny_rom_entry *device_rom_region() const override;
private:
- DECLARE_FLOPPY_FORMATS(floppy_formats);
-
+ DECLARE_READ8_MEMBER(wd1770l_read);
+ DECLARE_WRITE8_MEMBER(wd1770l_write);
DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
@@ -94,4 +91,4 @@ DECLARE_DEVICE_TYPE(BBC_ACORN8271, bbc_acorn8271_device)
DECLARE_DEVICE_TYPE(BBC_ACORN1770, bbc_acorn1770_device)
-#endif // MAME_BUS__BBC_FDC_ACORN_H
+#endif // MAME_BUS_BBC_FDC_ACORN_H
diff --git a/src/devices/bus/bbc/fdc/fdc.cpp b/src/devices/bus/bbc/fdc/fdc.cpp
index bd824459c2d..89158ac6cea 100644
--- a/src/devices/bus/bbc/fdc/fdc.cpp
+++ b/src/devices/bus/bbc/fdc/fdc.cpp
@@ -102,8 +102,12 @@ void bbc_fdc_slot_device::device_reset()
// slot devices
#include "acorn.h"
#include "cumana.h"
+//#include "cv1797.h"
+//#include "microware.h"
#include "opus.h"
+//#include "solidisk.h"
#include "watford.h"
+//#include "zdfs.h"
SLOT_INTERFACE_START( bbc_fdc_devices )
@@ -111,9 +115,16 @@ SLOT_INTERFACE_START( bbc_fdc_devices )
SLOT_INTERFACE("acorn1770", BBC_ACORN1770)
SLOT_INTERFACE("cumana1", BBC_CUMANA1)
SLOT_INTERFACE("cumana2", BBC_CUMANA2)
+ //SLOT_INTERFACE("cv1797", BBC_CV1797)
+ //SLOT_INTERFACE("microware", BBC_MICROWARE)
+ SLOT_INTERFACE("opus8272", BBC_OPUS8272)
SLOT_INTERFACE("opus2791", BBC_OPUS2791)
SLOT_INTERFACE("opus2793", BBC_OPUS2793)
SLOT_INTERFACE("opus1770", BBC_OPUS1770)
+ //SLOT_INTERFACE("stl8271", BBC_STL8271)
+ //SLOT_INTERFACE("stl1770_1", BBC_STL1770_1)
+ //SLOT_INTERFACE("stl1770_2", BBC_STL1770_2)
SLOT_INTERFACE("weddb2", BBC_WEDDB2)
SLOT_INTERFACE("weddb3", BBC_WEDDB3)
+ //SLOT_INTERFACE("zdfs", BBC_ZDFS)
SLOT_INTERFACE_END
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);
}
diff --git a/src/devices/bus/bbc/fdc/opus.h b/src/devices/bus/bbc/fdc/opus.h
index cc718aadba0..5ca54b36be5 100644
--- a/src/devices/bus/bbc/fdc/opus.h
+++ b/src/devices/bus/bbc/fdc/opus.h
@@ -10,6 +10,7 @@
#define MAME_BUS_BBC_FDC_OPUS_H
#include "fdc.h"
+#include "machine/upd765.h"
#include "machine/wd_fdc.h"
#include "formats/acorn_dsk.h"
#include "formats/fsd_dsk.h"
@@ -18,6 +19,41 @@
// TYPE DEFINITIONS
//**************************************************************************
+class bbc_opus8272_device :
+ public device_t,
+ public device_bbc_fdc_interface
+
+{
+public:
+ static constexpr feature_type imperfect_features() { return feature::DISK; }
+
+ // construction/destruction
+ bbc_opus8272_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+private:
+ DECLARE_READ8_MEMBER(fdc_r);
+ DECLARE_WRITE8_MEMBER(fdc_w);
+ DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
+ DECLARE_WRITE_LINE_MEMBER(motor_w);
+
+ required_memory_region m_dfs_rom;
+ required_device<i8272a_device> m_fdc;
+ required_device<floppy_connector> m_floppy0;
+ optional_device<floppy_connector> m_floppy1;
+
+ int m_drive_control;
+};
+
+
class bbc_opusfdc_device:
public device_t,
public device_bbc_fdc_interface
@@ -80,6 +116,7 @@ protected:
};
// device type definition
+DECLARE_DEVICE_TYPE(BBC_OPUS8272, bbc_opus8272_device)
DECLARE_DEVICE_TYPE(BBC_OPUS2791, bbc_opus2791_device)
DECLARE_DEVICE_TYPE(BBC_OPUS2793, bbc_opus2793_device)
DECLARE_DEVICE_TYPE(BBC_OPUS1770, bbc_opus1770_device)
diff --git a/src/lib/formats/acorn_dsk.cpp b/src/lib/formats/acorn_dsk.cpp
index 0c62a907864..1fd1764a1e1 100644
--- a/src/lib/formats/acorn_dsk.cpp
+++ b/src/lib/formats/acorn_dsk.cpp
@@ -49,8 +49,13 @@ int acorn_ssd_format::find_size(io_generic *io, uint32_t form_factor)
if (f.head_count == 2)
{
// read sector count from side 2 catalogue
- io_generic_read(io, cat, compute_track_size(f) * f.track_count + 0x100, 8); // sequential
+ io_generic_read(io, cat, compute_track_size(f) * f.track_count + 0x100, 8); // sequential
sectors2 = ((cat[6] & 3) << 8) + cat[7];
+
+ // exception case for Acorn CP/M System Disc 1
+ io_generic_read(io, cat, 0x367ec, 8);
+ if (memcmp(cat, "/M ", 4) == 0) sectors2 = ((cat[6] & 3) << 8) + cat[7];
+
LOG_FORMATS("ssd: sector count 2: %d %s\n", sectors2, sectors2 % 10 != 0 ? "invalid" : "");
}
else
@@ -58,7 +63,7 @@ int acorn_ssd_format::find_size(io_generic *io, uint32_t form_factor)
sectors2 = sectors0;
}
- if (sectors0 % 10 == 0 && sectors2 % 10 == 0)
+ if (sectors0 > 0 && sectors0 % 10 == 0 && sectors2 > 0 && sectors2 % 10 == 0)
return i;
}
}
@@ -144,9 +149,14 @@ int acorn_dsd_format::find_size(io_generic *io, uint32_t form_factor)
// read sector count from side 2 catalogue
io_generic_read(io, cat, 0xb00, 8); // interleaved
sectors2 = ((cat[6] & 3) << 8) + cat[7];
+
+ // exception case for Acorn CP/M System Disc 1
+ io_generic_read(io, cat, 0x97ec, 8);
+ if (memcmp(cat, "/M ", 4) == 0) sectors2 = ((cat[6] & 3) << 8) + cat[7];
+
LOG_FORMATS("dsd: sector count 2: %d %s\n", sectors2, sectors2 % 10 != 0 ? "invalid" : "");
- if (sectors0 % 10 == 0 && sectors2 % 10 == 0)
+ if (sectors0 > 0 && sectors0 % 10 == 0 && sectors2 > 0 && sectors2 % 10 == 0)
return i;
}
}
@@ -262,19 +272,19 @@ const opus_ddos_format::format opus_ddos_format::formats[] =
{
{ // 180k 40 track single sided double density - gaps unverified
floppy_image::FF_525, floppy_image::SSSD, floppy_image::MFM,
- 4000, 18, 40, 1, 256, {}, 0, {}, 40, 10, 10
+ 4000, 18, 40, 1, 256, {}, 0, {}, 36, 22, 27
},
{ // 360k 80 track single sided double density - gaps unverified
floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
- 4000, 18, 80, 1, 256, {}, 0, {}, 40, 10, 10
+ 4000, 18, 80, 1, 256, {}, 0, {}, 36, 22, 27
},
{ // 360k 40 track double sided double density - gaps unverified
floppy_image::FF_525, floppy_image::DSSD, floppy_image::MFM,
- 4000, 18, 40, 2, 256, {}, 0, {}, 40, 10, 10
+ 4000, 18, 40, 2, 256, {}, 0, {}, 36, 22, 27
},
{ // 720k 80 track double sided double density - gaps unverified
floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
- 4000, 18, 80, 2, 256, {}, 0, {}, 40, 10, 10
+ 4000, 18, 80, 2, 256, {}, 0, {}, 36, 22, 27
},
{}
};
@@ -320,8 +330,8 @@ int acorn_adfs_old_format::find_size(io_generic *io, uint32_t form_factor)
if(form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
continue;
- // valid images will have map identifier 'Hugo' and sector counts adfs-s = 0x280; adfs-m = 0x500; adfs-l = 0xa00; though many adfs-s images are incorrect
- if ((size <= (uint64_t)compute_track_size(f) * f.track_count * f.head_count) && memcmp(oldmap, "Hugo", 4) == 0 && (sectors == 0x280 || sectors == 0x500 || sectors == 0xa00 || size == 819200)) {
+ // valid images will have map identifier 'Hugo' and sector counts adfs-s = 0x280; adfs-m = 0x500; adfs-l = 0xa00; adfs-dos = 0xaa0; though many adfs-s images are incorrect
+ if ((size <= (uint64_t)compute_track_size(f) * f.track_count * f.head_count) && memcmp(oldmap, "Hugo", 4) == 0 && (sectors == 0x280 || sectors == 0x500 || sectors == 0xa00 || sectors == 0xaa0 || size == 819200)) {
return i;
}
}
@@ -358,10 +368,10 @@ const acorn_adfs_old_format::format acorn_adfs_old_format::formats[] =
},
{ // L - 640K 5 1/4 inch 80 track double sided double density (interleaved)
floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
- 2000, 16, 80, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, 60, 22, 43
+ 2000, 16, 80, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, 42, 22, 57
},
{ // M - 320K 3 1/2 inch 80 track single sided double density
- floppy_image::FF_35, floppy_image::SSQD, floppy_image::MFM,
+ floppy_image::FF_35, floppy_image::SSDD, floppy_image::MFM,
2000, 16, 80, 1, 256, {}, 0, {}, 60, 22, 43
},
{ // S - 160K 3 1/2 inch 40 track single sided double density
@@ -369,8 +379,8 @@ const acorn_adfs_old_format::format acorn_adfs_old_format::formats[] =
2000, 16, 40, 1, 256, {}, 0, {}, 60, 22, 43
},
{ // L - 640K 3 1/2 inch 80 track double sided double density (interleaved)
- floppy_image::FF_35, floppy_image::DSQD, floppy_image::MFM,
- 2000, 16, 80, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, 60, 22, 43
+ floppy_image::FF_35, floppy_image::DSDD, floppy_image::MFM,
+ 2000, 16, 80, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, 42, 22, 57
},
{}
};
@@ -402,7 +412,7 @@ int acorn_adfs_new_format::find_size(io_generic *io, uint32_t form_factor)
// read map identifiers for D and E formats
io_generic_read(io, dform, 0x401, 4);
- LOG_FORMATS("adfs_n: map identifier (D format) %s %s\n", dform, memcmp(dform, "Nick", 4) != 0 ? "invalid" : "");
+ LOG_FORMATS("adfs_n: map identifier (D format) %s %s\n", dform, (memcmp(dform, "Hugo", 4) != 0 && memcmp(dform, "Nick", 4) != 0) ? "invalid" : "");
io_generic_read(io, eform, 0x801, 4);
LOG_FORMATS("adfs_n: map identifier (E format) %s %s\n", eform, memcmp(eform, "Nick", 4) != 0 ? "invalid" : "");
@@ -412,8 +422,13 @@ int acorn_adfs_new_format::find_size(io_generic *io, uint32_t form_factor)
if (form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
continue;
- // valid images will have map identifier Nick, Arthur D format still use Hugo
- if ((size <= (uint64_t)compute_track_size(f) * f.track_count * f.head_count) && (memcmp(dform, "Nick", 4) == 0 || memcmp(eform, "Nick", 4) == 0 || memcmp(dform, "Hugo", 4) == 0)) {
+ // no further checks for 1600K images
+ if ((size == (uint64_t)compute_track_size(f) * f.track_count * f.head_count) && size == 0x190000) {
+ return i;
+ }
+
+ // valid 800K images will have map identifier Nick, Arthur D format still use Hugo
+ if ((size <= (uint64_t)compute_track_size(f) * f.track_count * f.head_count) && (memcmp(dform, "Hugo", 4) == 0 || memcmp(dform, "Nick", 4) == 0 || memcmp(eform, "Nick", 4) == 0)) {
return i;
}
}
@@ -442,11 +457,11 @@ const acorn_adfs_new_format::format acorn_adfs_new_format::formats[] =
{
{ // D,E - 800K 3 1/2 inch 80 track double sided double density - gaps unverified
floppy_image::FF_35, floppy_image::DSDD, floppy_image::MFM,
- 2000, 5, 80, 2, 1024, {}, -1, { 0,1,2,3,4 }, 60, 22, 43
+ 2000, 5, 80, 2, 1024, {}, -1, { 0,1,2,3,4 }, 32, 22, 90
},
- { // F - 1600K 3 1/2 inch 80 track double sided quad density - gaps unverified
- floppy_image::FF_35, floppy_image::DSQD, floppy_image::MFM,
- 2000, 10, 80, 2, 1024, {}, -1, { 0,1,2,3,4,5,6,7,8,9 }, 60, 22, 43
+ { // F - 1600K 3 1/2 inch 80 track double sided quad density
+ floppy_image::FF_35, floppy_image::DSHD, floppy_image::MFM,
+ 2000, 10, 80, 2, 1024, {}, -1, { 0,1,2,3,4,5,6,7,8,9 }, 50, 22, 90
},
{}
};
@@ -468,13 +483,12 @@ const char *acorn_dos_format::description() const
const char *acorn_dos_format::extensions() const
{
- return "img,adl";
+ return "img";
}
int acorn_dos_format::find_size(io_generic *io, uint32_t form_factor)
{
- uint8_t cat[3];
- uint32_t sectors;
+ uint8_t type;
uint64_t size = io_generic_size(io);
for(int i=0; formats[i].form_factor; i++) {
@@ -483,30 +497,10 @@ int acorn_dos_format::find_size(io_generic *io, uint32_t form_factor)
continue;
if (size == (uint64_t)compute_track_size(f) * f.track_count * f.head_count) {
- switch (size)
- {
- case 640 * 1024: // 640K Acorn (Bootable) DOS Format
- // read sector count from free space map - Acorn DOS = 0xaa0
- io_generic_read(io, cat, 0xfc, 3);
- sectors = cat[0] + (cat[1] << 8) + (cat[2] << 16);
- if (sectors == 0xaa0) {
- // read media type ID from FAT - Acorn DOS = 0xff
- if (f.sector_base_id == -1)
- io_generic_read(io, cat, 0x2000, 1); // interleaved
- else
- io_generic_read(io, cat, 0x1000, 1); // sequential
- LOG_FORMATS("dos: 640k media type id %02X %s\n", cat[0], cat[0] != 0xff ? "invalid" : "");
- if (cat[0] == 0xff) return i;
- }
- break;
- case 800 * 1024: // 800K Acorn DOS Format
- // read media type ID from FAT - Acorn DOS = 0xfd
- io_generic_read(io, cat, 0, 1);
- LOG_FORMATS("dos: 800k media type id %02X %s\n", cat[0], cat[0] != 0xfd ? "invalid" : "");
- if (cat[0] == 0xfd) return i;
- break;
- }
-
+ // read media type ID from FAT - Acorn DOS = 0xfd
+ io_generic_read(io, &type, 0, 1);
+ LOG_FORMATS("dos: 800k media type id %02X %s\n", type, type != 0xfd ? "invalid" : "");
+ if (type == 0xfd) return i;
}
}
LOG_FORMATS("dos: no match\n");
@@ -518,7 +512,7 @@ int acorn_dos_format::identify(io_generic *io, uint32_t form_factor)
int type = find_size(io, form_factor);
if(type != -1)
- return 100;
+ return 90;
return 0;
}
@@ -532,80 +526,103 @@ int acorn_dos_format::get_image_offset(const format &f, int head, int track)
const acorn_dos_format::format acorn_dos_format::formats[] =
{
- { // 640K 5 1/4 inch 80 track double sided double density - gaps unverified
- floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
- 2000, 16, 80, 2, 256, {}, 0, {}, 60, 22, 43
- },
- { // 640K 5 1/4 inch 80 track double sided double density (interleaved) - gaps unverified
- floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
- 2000, 16, 80, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, 60, 22, 43
- },
{ // 800K 5 1/4 inch 80 track double sided double density - gaps unverified
- floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
- 2000, 5, 80, 2, 1024, {}, 0, {}, 60, 22, 43
+ floppy_image::FF_525, floppy_image::DSQD, floppy_image::MFM,
+ 2000, 5, 80, 2, 1024, {}, -1, { 1,2,3,4,5 }, 32, 22, 90
},
{}
};
-acorn_cpm_format::acorn_cpm_format() : wd177x_format(formats)
+opus_ddcpm_format::opus_ddcpm_format()
{
}
-const char *acorn_cpm_format::name() const
+const char *opus_ddcpm_format::name() const
{
- return "cpm";
+ return "ddcpm";
}
-const char *acorn_cpm_format::description() const
+const char *opus_ddcpm_format::description() const
{
- return "Acorn CP/M disk image";
+ return "Opus DD CP/M disk image";
}
-const char *acorn_cpm_format::extensions() const
+const char *opus_ddcpm_format::extensions() const
{
- return "img,ssd,dsd";
+ return "ssd";
}
-int acorn_cpm_format::identify(io_generic *io, uint32_t form_factor)
+bool opus_ddcpm_format::supports_save() const
+{
+ return false;
+}
+
+int opus_ddcpm_format::identify(io_generic *io, uint32_t form_factor)
{
uint8_t h[8];
io_generic_read(io, h, 0, 8);
- int type = find_size(io, form_factor);
-
- if(type != -1 && (memcmp(h, "Acorn CP", 8) == 0 || memcmp(h, "Slogger ", 8) == 0)) {
+ if (io_generic_size(io) == 811520 && memcmp(h, "Slogger ", 8) == 0)
return 100;
- }
- LOG_FORMATS("cpm: no match\n");
return 0;
}
-int acorn_cpm_format::get_image_offset(const format &f, int head, int track)
-{
- if (f.sector_base_id == -1)
- return (track * f.head_count + head) * compute_track_size(f);
- else
- return (f.track_count * head + track) * compute_track_size(f);
+bool opus_ddcpm_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
+{
+// Double density discs formatted with DDCPM :
+//
+// Tracks 0 - 2 formatted Single Density
+// Tracks 3 - 159 formatted Double Density
+//
+// Single density tracks are 10 x 256 byte sectors per track
+// Sector skew of 2
+//
+// Double Density tracks are 10 x 512 byte sectors per track
+// Sector skew of 1
+// Sector interleave of 2
+//
+ int spt, bps;
+ uint64_t file_offset = 0;
+
+ for (int head = 0; head < 2; head++) {
+ for (int track = 0; track < 80; track++) {
+ bool mfm = track > 2 || head;
+ bps = mfm ? 512 : 256;
+ spt = 10;
+ desc_pc_sector sects[10];
+ uint8_t sectdata[10*512];
+
+ io_generic_read(io, sectdata, file_offset, spt * bps);
+
+ for (int i = 0; i < spt; i++) {
+ sects[i].track = track;
+ sects[i].head = head;
+ sects[i].sector = i;
+ sects[i].size = mfm ? 2 : 1;
+ sects[i].actual_size = bps;
+ sects[i].data = sectdata + bps * i;
+ sects[i].deleted = false;
+ sects[i].bad_crc = false;
+ }
+
+ if (mfm)
+ build_wd_track_mfm(track, head, image, 100000, 10, sects, 60, 43, 22);
+ else
+ build_wd_track_fm(track, head, image, 50000, 10, sects, 40, 10, 10);
+
+ file_offset += spt * bps;
+ }
+ }
+
+ return true;
}
-const acorn_cpm_format::format acorn_cpm_format::formats[] =
+bool opus_ddcpm_format::save(io_generic *io, floppy_image *image)
{
- { // 400K 5 1/4 inch 80 track double sided single density - gaps unverified
- floppy_image::FF_525, floppy_image::DSQD, floppy_image::FM,
- 4000, 5, 80, 2, 512, {}, 0, {}, 40, 10, 10
- },
- { // 400k 5 1/4 inch 80 track double sided single density (interleaved) - gaps unverified
- floppy_image::FF_525, floppy_image::DSQD, floppy_image::FM,
- 4000, 5, 80, 2, 512, {}, -1, { 0,1,2,3,4 }, 40, 10, 10
- },
- { // 800K 5 1/4 inch 80 track double sided double density - gaps unverified
- floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
- 2000, 10, 80, 2, 512, {}, 0, {}, 60, 22, 43
- },
- {}
-};
+ return false;
+}
torch_cpn_format::torch_cpn_format() : wd177x_format(formats)
@@ -631,7 +648,7 @@ int torch_cpn_format::identify(io_generic *io, uint32_t form_factor)
{
int type = find_size(io, form_factor);
- if(type != -1)
+ if (type != -1)
return 50;
LOG_FORMATS("cpn: no match\n");
return 0;
@@ -657,9 +674,9 @@ const torch_cpn_format::format torch_cpn_format::formats[] =
const floppy_format_type FLOPPY_ACORN_SSD_FORMAT = &floppy_image_format_creator<acorn_ssd_format>;
const floppy_format_type FLOPPY_ACORN_DSD_FORMAT = &floppy_image_format_creator<acorn_dsd_format>;
-const floppy_format_type FLOPPY_OPUS_DDOS_FORMAT = &floppy_image_format_creator<opus_ddos_format>;
+const floppy_format_type FLOPPY_ACORN_DOS_FORMAT = &floppy_image_format_creator<acorn_dos_format>;
const floppy_format_type FLOPPY_ACORN_ADFS_OLD_FORMAT = &floppy_image_format_creator<acorn_adfs_old_format>;
const floppy_format_type FLOPPY_ACORN_ADFS_NEW_FORMAT = &floppy_image_format_creator<acorn_adfs_new_format>;
-const floppy_format_type FLOPPY_ACORN_DOS_FORMAT = &floppy_image_format_creator<acorn_dos_format>;
-const floppy_format_type FLOPPY_ACORN_CPM_FORMAT = &floppy_image_format_creator<acorn_cpm_format>;
+const floppy_format_type FLOPPY_OPUS_DDOS_FORMAT = &floppy_image_format_creator<opus_ddos_format>;
+const floppy_format_type FLOPPY_OPUS_DDCPM_FORMAT = &floppy_image_format_creator<opus_ddcpm_format>;
const floppy_format_type FLOPPY_TORCH_CPN_FORMAT = &floppy_image_format_creator<torch_cpn_format>;
diff --git a/src/lib/formats/acorn_dsk.h b/src/lib/formats/acorn_dsk.h
index 76d4462b01d..ad4c67b79ee 100644
--- a/src/lib/formats/acorn_dsk.h
+++ b/src/lib/formats/acorn_dsk.h
@@ -10,9 +10,10 @@
#pragma once
-#ifndef __ACORN_DSK_H__
-#define __ACORN_DSK_H__
+#ifndef ACORN_DSK_H
+#define ACORN_DSK_H
+#include "flopimg.h"
#include "wd177x_dsk.h"
class acorn_ssd_format : public wd177x_format
@@ -111,19 +112,19 @@ private:
static const format formats[];
};
-class acorn_cpm_format : public wd177x_format
+class opus_ddcpm_format : public floppy_image_format_t
{
public:
- acorn_cpm_format();
+ opus_ddcpm_format();
virtual int identify(io_generic *io, uint32_t form_factor) override;
- virtual int get_image_offset(const format &f, int head, int track) override;
+ virtual bool load(io_generic *io, uint32_t form_factor, floppy_image *image) override;
+ virtual bool save(io_generic *io, floppy_image *image) override;
+
virtual const char *name() const override;
virtual const char *description() const override;
virtual const char *extensions() const override;
-
-private:
- static const format formats[];
+ virtual bool supports_save() const override;
};
class torch_cpn_format : public wd177x_format
@@ -144,11 +145,11 @@ private:
extern const floppy_format_type FLOPPY_ACORN_SSD_FORMAT;
extern const floppy_format_type FLOPPY_ACORN_DSD_FORMAT;
-extern const floppy_format_type FLOPPY_OPUS_DDOS_FORMAT;
+extern const floppy_format_type FLOPPY_ACORN_DOS_FORMAT;
extern const floppy_format_type FLOPPY_ACORN_ADFS_OLD_FORMAT;
extern const floppy_format_type FLOPPY_ACORN_ADFS_NEW_FORMAT;
-extern const floppy_format_type FLOPPY_ACORN_DOS_FORMAT;
-extern const floppy_format_type FLOPPY_ACORN_CPM_FORMAT;
+extern const floppy_format_type FLOPPY_OPUS_DDOS_FORMAT;
+extern const floppy_format_type FLOPPY_OPUS_DDCPM_FORMAT;
extern const floppy_format_type FLOPPY_TORCH_CPN_FORMAT;
-#endif // __ACORN_DSK_H__
+#endif // ACORN_DSK_H
diff --git a/src/lib/formats/wd177x_dsk.cpp b/src/lib/formats/wd177x_dsk.cpp
index fe6c9db2535..69915f0f396 100644
--- a/src/lib/formats/wd177x_dsk.cpp
+++ b/src/lib/formats/wd177x_dsk.cpp
@@ -81,8 +81,8 @@ void wd177x_format::build_sector_description(const format &f, uint8_t *sectdata,
floppy_image_format_t::desc_e* wd177x_format::get_desc_fm(const format &f, int &current_size, int &end_gap_index)
{
static floppy_image_format_t::desc_e desc[23] = {
- /* 00 */ { FM, 0xff, f.gap_1 },
- /* 01 */ { SECTOR_LOOP_START, 0, f.sector_count-1 },
+ /* 00 */ { FM, 0xff, 0 },
+ /* 01 */ { SECTOR_LOOP_START, 0, 0 },
/* 02 */ { FM, 0x00, 6 },
/* 03 */ { CRC_CCITT_FM_START, 1 },
/* 04 */ { RAW, 0xf57e, 1 },
@@ -92,20 +92,25 @@ floppy_image_format_t::desc_e* wd177x_format::get_desc_fm(const format &f, int &
/* 08 */ { SIZE_ID_FM },
/* 09 */ { CRC_END, 1 },
/* 10 */ { CRC, 1 },
- /* 11 */ { FM, 0xff, f.gap_2 },
+ /* 11 */ { FM, 0xff, 0 },
/* 12 */ { FM, 0x00, 6 },
/* 13 */ { CRC_CCITT_FM_START, 2 },
/* 14 */ { RAW, 0xf56f, 1 },
/* 15 */ { SECTOR_DATA_FM, -1 },
/* 16 */ { CRC_END, 2 },
/* 17 */ { CRC, 2 },
- /* 18 */ { FM, 0xff, f.gap_3 },
+ /* 18 */ { FM, 0xff, 0 },
/* 19 */ { SECTOR_LOOP_END },
/* 20 */ { FM, 0xff, 0 },
/* 21 */ { RAWBITS, 0xffff, 0 },
/* 22 */ { END }
};
+ desc[0].p2 = f.gap_1;
+ desc[1].p2 = f.sector_count - 1;
+ desc[11].p2 = f.gap_2;
+ desc[18].p2 = f.gap_3;
+
current_size = f.gap_1*16;
if(f.sector_base_size)
current_size += f.sector_base_size * f.sector_count * 16;
@@ -123,8 +128,8 @@ floppy_image_format_t::desc_e* wd177x_format::get_desc_fm(const format &f, int &
floppy_image_format_t::desc_e* wd177x_format::get_desc_mfm(const format &f, int &current_size, int &end_gap_index)
{
static floppy_image_format_t::desc_e desc[25] = {
- /* 00 */ { MFM, 0x4e, f.gap_1 },
- /* 01 */ { SECTOR_LOOP_START, 0, f.sector_count-1 },
+ /* 00 */ { MFM, 0x4e, 0 },
+ /* 01 */ { SECTOR_LOOP_START, 0, 0 },
/* 02 */ { MFM, 0x00, 12 },
/* 03 */ { CRC_CCITT_START, 1 },
/* 04 */ { RAW, 0x4489, 3 },
@@ -135,7 +140,7 @@ floppy_image_format_t::desc_e* wd177x_format::get_desc_mfm(const format &f, int
/* 09 */ { SIZE_ID },
/* 10 */ { CRC_END, 1 },
/* 11 */ { CRC, 1 },
- /* 12 */ { MFM, 0x4e, f.gap_2 },
+ /* 12 */ { MFM, 0x4e, 0 },
/* 13 */ { MFM, 0x00, 12 },
/* 14 */ { CRC_CCITT_START, 2 },
/* 15 */ { RAW, 0x4489, 3 },
@@ -143,13 +148,18 @@ floppy_image_format_t::desc_e* wd177x_format::get_desc_mfm(const format &f, int
/* 17 */ { SECTOR_DATA, -1 },
/* 18 */ { CRC_END, 2 },
/* 19 */ { CRC, 2 },
- /* 20 */ { MFM, 0x4e, f.gap_3 },
+ /* 20 */ { MFM, 0x4e, 0 },
/* 21 */ { SECTOR_LOOP_END },
/* 22 */ { MFM, 0x4e, 0 },
/* 23 */ { RAWBITS, 0x9254, 0 },
/* 24 */ { END }
};
+ desc[0].p2 = f.gap_1;
+ desc[1].p2 = f.sector_count - 1;
+ desc[12].p2 = f.gap_2;
+ desc[20].p2 = f.gap_3;
+
current_size = f.gap_1*16;
if(f.sector_base_size)
current_size += f.sector_base_size * f.sector_count * 16;
diff --git a/src/mame/drivers/bbc.cpp b/src/mame/drivers/bbc.cpp
index 0c6f89a481c..7a0afa973bc 100644
--- a/src/mame/drivers/bbc.cpp
+++ b/src/mame/drivers/bbc.cpp
@@ -768,7 +768,7 @@ FLOPPY_FORMATS_MEMBER( bbc_state::floppy_formats_bbc )
FLOPPY_ACORN_SSD_FORMAT,
FLOPPY_ACORN_DSD_FORMAT,
FLOPPY_OPUS_DDOS_FORMAT,
- FLOPPY_ACORN_CPM_FORMAT,
+ FLOPPY_OPUS_DDCPM_FORMAT,
FLOPPY_TORCH_CPN_FORMAT,
FLOPPY_FSD_FORMAT
FLOPPY_FORMATS_END0
@@ -777,7 +777,7 @@ FLOPPY_FORMATS_MEMBER( bbc_state::floppy_formats_bbcm )
FLOPPY_ACORN_SSD_FORMAT,
FLOPPY_ACORN_DSD_FORMAT,
FLOPPY_ACORN_ADFS_OLD_FORMAT,
- FLOPPY_ACORN_CPM_FORMAT,
+ FLOPPY_OPUS_DDCPM_FORMAT,
FLOPPY_TORCH_CPN_FORMAT,
FLOPPY_ACORN_DOS_FORMAT,
FLOPPY_FSD_FORMAT