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.
This commit is contained in:
Nigel Barnes 2017-08-24 15:23:18 +01:00
parent f8a902c9ec
commit 70b91571ce
10 changed files with 358 additions and 190 deletions

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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);
}

View File

@ -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)

View File

@ -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)
bool opus_ddcpm_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
{
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);
// 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>;

View File

@ -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

View File

@ -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;

View File

@ -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