Skip to content

Commit

Permalink
Floppy fixes and refinements
Browse files Browse the repository at this point in the history
- 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
  • Loading branch information
ajrhacker committed Sep 12, 2024
1 parent be4fdb9 commit 000cf3b
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 6 deletions.
4 changes: 2 additions & 2 deletions src/devices/bus/bbc/fdc/ams.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}


Expand Down
3 changes: 2 additions & 1 deletion src/devices/bus/oricext/microdisc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down
28 changes: 28 additions & 0 deletions src/devices/imagedev/floppy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -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
//-------------------------------------------------
Expand Down
1 change: 1 addition & 0 deletions src/devices/imagedev/floppy.h
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
12 changes: 12 additions & 0 deletions src/lib/formats/oric_dsk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

#include "ioprocs.h"
#include "multibyte.h"
#include "osdcore.h"

#include <cstring>

Expand Down Expand Up @@ -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; side<sides; side++)
for(int track=0; track<tracks; track++) {
read_at(io, 256+6400*(tracks*side + track), t, 6250); // FIXME: check for errors and premature EOF
Expand Down
6 changes: 3 additions & 3 deletions src/mame/amstrad/pcw.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1236,7 +1236,7 @@ static void pcw_ssfloppies(device_slot_interface &device)

static void pcw_dsfloppies(device_slot_interface &device)
{
device.option_add("3dsdd", FLOPPY_3_DSDD);
device.option_add("3dsqd", FLOPPY_3_DSQD);
}

static void pcw_35floppies(device_slot_interface &device)
Expand Down Expand Up @@ -1321,7 +1321,7 @@ void pcw_state::pcw8512(machine_config &config)
m_palette->set_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);
Expand All @@ -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);
Expand Down

0 comments on commit 000cf3b

Please sign in to comment.