diff options
author | 2017-08-24 15:23:18 +0100 | |
---|---|---|
committer | 2017-08-25 20:03:44 +0100 | |
commit | 70b91571ce1b77abb593c341419076859e7a9323 (patch) | |
tree | 9dcf6fe519ad86a8ba405b82de6fb08b688491c0 | |
parent | f8a902c9ec378eddda5c17d708f0a3c8ca1d747a (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.cpp | 4 | ||||
-rw-r--r-- | src/devices/bus/bbc/fdc/acorn.cpp | 70 | ||||
-rw-r--r-- | src/devices/bus/bbc/fdc/acorn.h | 17 | ||||
-rw-r--r-- | src/devices/bus/bbc/fdc/fdc.cpp | 11 | ||||
-rw-r--r-- | src/devices/bus/bbc/fdc/opus.cpp | 147 | ||||
-rw-r--r-- | src/devices/bus/bbc/fdc/opus.h | 37 | ||||
-rw-r--r-- | src/lib/formats/acorn_dsk.cpp | 209 | ||||
-rw-r--r-- | src/lib/formats/acorn_dsk.h | 25 | ||||
-rw-r--r-- | src/lib/formats/wd177x_dsk.cpp | 26 | ||||
-rw-r--r-- | src/mame/drivers/bbc.cpp | 4 |
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 ¤t_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 ¤t_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 |