From 000cf3b50e9e4639dbc40276eba515fe3d152516 Mon Sep 17 00:00:00 2001 From: AJR Date: Thu, 12 Sep 2024 09:18:11 -0400 Subject: Floppy fixes and refinements - imagedev/floppy.cpp: Add 3-inch double-sided quad-density format - oric_microdsk: Add DSQD drives to configuration and enable one by default - amstrad/pcw.cpp: Upgrade all configurations using double-sided drives to quad density - bbc_ams3: Make drives single-density since 8271 controller doesn't support MFM - oric_dsk: Don't blindly trust the number of tracks and sides to be valid --- src/devices/bus/bbc/fdc/ams.cpp | 4 ++-- src/devices/bus/oricext/microdisc.cpp | 3 ++- src/devices/imagedev/floppy.cpp | 28 ++++++++++++++++++++++++++++ src/devices/imagedev/floppy.h | 1 + src/lib/formats/oric_dsk.cpp | 12 ++++++++++++ src/mame/amstrad/pcw.cpp | 6 +++--- 6 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/devices/bus/bbc/fdc/ams.cpp b/src/devices/bus/bbc/fdc/ams.cpp index 41f4c5a771c..cd3499c418d 100644 --- a/src/devices/bus/bbc/fdc/ams.cpp +++ b/src/devices/bus/bbc/fdc/ams.cpp @@ -56,8 +56,8 @@ void bbc_ams3_device::device_add_mconfig(machine_config &config) m_fdc->hdl_wr_callback().set(FUNC(bbc_ams3_device::motor_w)); m_fdc->opt_wr_callback().set(FUNC(bbc_ams3_device::side_w)); // Hitachi HFD 305S - FLOPPY_CONNECTOR(config, m_floppy[0], "3dsdd", FLOPPY_3_DSDD, true, bbc_ams3_device::floppy_formats).enable_sound(true); - FLOPPY_CONNECTOR(config, m_floppy[1], "3dsdd", FLOPPY_3_DSDD, false, bbc_ams3_device::floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, m_floppy[0], "3dssd", FLOPPY_3_DSSD, true, bbc_ams3_device::floppy_formats).enable_sound(true); + FLOPPY_CONNECTOR(config, m_floppy[1], "3dssd", FLOPPY_3_DSSD, false, bbc_ams3_device::floppy_formats).enable_sound(true); } diff --git a/src/devices/bus/oricext/microdisc.cpp b/src/devices/bus/oricext/microdisc.cpp index b85d56182f9..9abe2debd27 100644 --- a/src/devices/bus/oricext/microdisc.cpp +++ b/src/devices/bus/oricext/microdisc.cpp @@ -20,6 +20,7 @@ void oric_microdisc_device::floppy_formats(format_registration &fr) static void microdisc_floppies(device_slot_interface &device) { device.option_add("3dsdd", FLOPPY_3_DSDD); + device.option_add("3dsqd", FLOPPY_3_DSQD); } void oric_microdisc_device::map_io(address_space_installer &space) @@ -79,7 +80,7 @@ void oric_microdisc_device::device_add_mconfig(machine_config &config) fdc->hld_wr_callback().set(FUNC(oric_microdisc_device::fdc_hld_w)); fdc->set_force_ready(true); - FLOPPY_CONNECTOR(config, "fdc:0", microdisc_floppies, "3dsdd", oric_microdisc_device::floppy_formats); + FLOPPY_CONNECTOR(config, "fdc:0", microdisc_floppies, "3dsqd", oric_microdisc_device::floppy_formats); FLOPPY_CONNECTOR(config, "fdc:1", microdisc_floppies, nullptr, oric_microdisc_device::floppy_formats); FLOPPY_CONNECTOR(config, "fdc:2", microdisc_floppies, nullptr, oric_microdisc_device::floppy_formats); FLOPPY_CONNECTOR(config, "fdc:3", microdisc_floppies, nullptr, oric_microdisc_device::floppy_formats); diff --git a/src/devices/imagedev/floppy.cpp b/src/devices/imagedev/floppy.cpp index 73c0ae7a936..441f2952565 100644 --- a/src/devices/imagedev/floppy.cpp +++ b/src/devices/imagedev/floppy.cpp @@ -55,6 +55,7 @@ DEFINE_DEVICE_TYPE(FLOPPY_3_SSSD, floppy_3_sssd, "floppy_3_sssd", "3\" single-si DEFINE_DEVICE_TYPE(FLOPPY_3_DSSD, floppy_3_dssd, "floppy_3_dssd", "3\" double-sided single density floppy drive") DEFINE_DEVICE_TYPE(FLOPPY_3_SSDD, floppy_3_ssdd, "floppy_3_ssdd", "3\" single-sided double density floppy drive") DEFINE_DEVICE_TYPE(FLOPPY_3_DSDD, floppy_3_dsdd, "floppy_3_dsdd", "3\" double-sided double density floppy drive") +DEFINE_DEVICE_TYPE(FLOPPY_3_DSQD, floppy_3_dsqd, "floppy_3_dsqd", "3\" double-sided quad density floppy drive") // generic 3.5" drives DEFINE_DEVICE_TYPE(FLOPPY_35_SSDD, floppy_35_ssdd, "floppy_35_ssdd", "3.5\" single-sided double density floppy drive") @@ -1811,6 +1812,33 @@ void floppy_3_dsdd::setup_characteristics() add_variant(floppy_image::DSDD); } +//------------------------------------------------- +// 3" double-sided quad density +//------------------------------------------------- + +floppy_3_dsqd::floppy_3_dsqd(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + floppy_image_device(mconfig, FLOPPY_3_DSQD, tag, owner, clock) +{ +} + +floppy_3_dsqd::~floppy_3_dsqd() +{ +} + +void floppy_3_dsqd::setup_characteristics() +{ + m_form_factor = floppy_image::FF_3; + m_tracks = 84; + m_sides = 2; + set_rpm(300); + + add_variant(floppy_image::SSSD); + add_variant(floppy_image::DSSD); + add_variant(floppy_image::SSDD); + add_variant(floppy_image::DSDD); + add_variant(floppy_image::DSQD); +} + //------------------------------------------------- // 3.5" single-sided double density //------------------------------------------------- diff --git a/src/devices/imagedev/floppy.h b/src/devices/imagedev/floppy.h index 6d47a5846fe..3b60b45b59e 100644 --- a/src/devices/imagedev/floppy.h +++ b/src/devices/imagedev/floppy.h @@ -293,6 +293,7 @@ DECLARE_FLOPPY_IMAGE_DEVICE(FLOPPY_3_SSSD, floppy_3_sssd, "floppy_3" DECLARE_FLOPPY_IMAGE_DEVICE(FLOPPY_3_DSSD, floppy_3_dssd, "floppy_3") DECLARE_FLOPPY_IMAGE_DEVICE(FLOPPY_3_SSDD, floppy_3_ssdd, "floppy_3") DECLARE_FLOPPY_IMAGE_DEVICE(FLOPPY_3_DSDD, floppy_3_dsdd, "floppy_3") +DECLARE_FLOPPY_IMAGE_DEVICE(FLOPPY_3_DSQD, floppy_3_dsqd, "floppy_3") DECLARE_FLOPPY_IMAGE_DEVICE(FLOPPY_35_SSDD, floppy_35_ssdd, "floppy_3_5") DECLARE_FLOPPY_IMAGE_DEVICE(FLOPPY_35_DD, floppy_35_dd, "floppy_3_5") DECLARE_FLOPPY_IMAGE_DEVICE(FLOPPY_35_HD, floppy_35_hd, "floppy_3_5") diff --git a/src/lib/formats/oric_dsk.cpp b/src/lib/formats/oric_dsk.cpp index 23433f1c3aa..15bb5ce1455 100644 --- a/src/lib/formats/oric_dsk.cpp +++ b/src/lib/formats/oric_dsk.cpp @@ -12,6 +12,7 @@ #include "ioprocs.h" #include "multibyte.h" +#include "osdcore.h" #include @@ -68,6 +69,17 @@ bool oric_dsk_format::load(util::random_read &io, uint32_t form_factor, const st int sides = get_u32le(&h[ 8]); int tracks = get_u32le(&h[12]); + int max_tracks, max_sides; + image.get_maximal_geometry(max_tracks, max_sides); + if (tracks > max_tracks) { + osd_printf_error("oric_dsk: Floppy disk has too many tracks for this drive (floppy tracks=%d, drive tracks=%d).\n", tracks, max_tracks); + return false; + } + if (sides > max_sides) { + osd_printf_warning("oric_dsk: Floppy disk has excess of heads for this drive that will be discarded (floppy heads=%d, drive heads=%d).\n", sides, max_sides); + sides = max_sides; + } + for(int side=0; sideset_init(FUNC(pcw_state::set_8xxx_palette)); FLOPPY_CONNECTOR(config, "upd765:0", pcw_ssfloppies, "3ssdd", floppy_image_device::default_mfm_floppy_formats); - FLOPPY_CONNECTOR(config, "upd765:1", pcw_dsfloppies, "3dsdd", floppy_image_device::default_mfm_floppy_formats); + FLOPPY_CONNECTOR(config, "upd765:1", pcw_dsfloppies, "3dsqd", floppy_image_device::default_mfm_floppy_formats); screen_device &printer(SCREEN(config, "printer", SCREEN_TYPE_RASTER)); printer.set_refresh_hz(50); @@ -1342,7 +1342,7 @@ void pcw_state::pcw9512(machine_config &config) pcw(config); m_palette->set_init(FUNC(pcw_state::set_9xxx_palette)); - FLOPPY_CONNECTOR(config, "upd765:0", pcw_dsfloppies, "3dsdd", floppy_image_device::default_mfm_floppy_formats); + FLOPPY_CONNECTOR(config, "upd765:0", pcw_dsfloppies, "3dsqd", floppy_image_device::default_mfm_floppy_formats); FLOPPY_CONNECTOR(config, "upd765:1", pcw_dsfloppies, nullptr, floppy_image_device::default_mfm_floppy_formats); m_maincpu->set_addrmap(AS_IO, &pcw_state::pcw9512_io); -- cgit v1.2.3