diff --git a/src/disc_86f.c b/src/disc_86f.c index dd8c2d10f..341f3b106 100644 --- a/src/disc_86f.c +++ b/src/disc_86f.c @@ -563,7 +563,7 @@ static int d86f_get_bitcell_period(int drive) if (!mfm) rate /= 2.0; size = (size * 250.0) / rate; size = (size * 300.0) / rpm; - size = (size * fdd_getrpm(drive)) / 300.0; + size = (size * fdd_getrpm(drive ^ fdd_swap)) / 300.0; return (int) size; } diff --git a/src/disc_sector_86box.c b/src/disc_sector_86box.c index 773a2f2ef..6239c280e 100644 --- a/src/disc_sector_86box.c +++ b/src/disc_sector_86box.c @@ -95,9 +95,7 @@ void disc_sector_add(int drive, int side, uint8_t c, uint8_t h, uint8_t r, uint8 static int get_bitcell_period(int drive) { - // return (disc_sector_data[drive][disc_sector_side[drive]][cur_sector[drive]].rate * 300) / fdd_getrpm(drive); - return ((&disc_sector_data[drive][0][0])->rate * 300) / fdd_getrpm(drive); - return (cur_rate[drive] * 300) / fdd_getrpm(drive); + return ((&disc_sector_data[drive][0][0])->rate * 300) / fdd_getrpm(drive ^ fdd_swap); } void disc_sector_readsector(int drive, int sector, int track, int side, int rate, int sector_size) diff --git a/src/fdc.c b/src/fdc.c index ed65d4266..212de678b 100644 --- a/src/fdc.c +++ b/src/fdc.c @@ -253,13 +253,15 @@ void fdc_update_is_nsc(int is_nsc) fdc.is_nsc = is_nsc; } +static void fdc_rate(int drive); + void fdc_update_enh_mode(int enh_mode) { fdc.enh_mode = enh_mode; + fdc_rate(0); + fdc_rate(1); } -static void fdc_rate(int drive); - int fdc_get_rwc(int drive) { return fdc.rwc[drive]; @@ -309,11 +311,11 @@ void fdc_update_drv2en(int drv2en) void fdc_update_rate(int drive) { - if ((fdc.rwc[drive] == 1) || (fdc.rwc[drive] == 2)) + if (((fdc.rwc[drive] == 1) || (fdc.rwc[drive] == 2)) && fdc.enh_mode) { bit_rate = 500; } - else if (fdc.rwc[drive] == 3) + else if ((fdc.rwc[drive] == 3) && fdc.enh_mode) { bit_rate = 250; } @@ -375,13 +377,16 @@ int fdc_get_bitcell_period() static int fdc_get_densel(int drive) { - switch (fdc.rwc[drive]) + if (fdc.enh_mode) { - case 1: - case 3: - return 0; - case 2: - return 1; + switch (fdc.rwc[drive]) + { + case 1: + case 3: + return 0; + case 2: + return 1; + } } if (!fdc.is_nsc) @@ -492,7 +497,7 @@ void fdc_write(uint16_t addr, uint8_t val, void *priv) if (fdc.enh_mode) { drive = (fdc.dor & 1) ^ fdd_swap; - fdc.rwc[drive] = (val & 0x30) >> 4; + fdc_update_rwc(drive, (val & 0x30) >> 4); } return; case 4: diff --git a/src/fdd.c b/src/fdd.c index c6a2100d2..56eb9f3b4 100644 --- a/src/fdd.c +++ b/src/fdd.c @@ -39,6 +39,11 @@ static struct #define FLAG_HOLE2 32 #define FLAG_DOUBLE_STEP 64 +#define FLAGS_RPM_NONE 0 +#define FLAGS_RPM_300_ONLY 1 +#define FLAGS_RPM_360_ONLY 2 +#define FLAGS_RPM_BOTH 3 + static struct { int max_track; @@ -76,6 +81,10 @@ static struct { /*3.5" ED*/ .max_track = 86, .flags = FLAG_RPM_300 | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_HOLE2 + }, + { /*3.5" ED 3-Mode*/ + .max_track = 86, + .flags = FLAG_RPM_300| FLAG_RPM_360 | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_HOLE2 } }; @@ -118,23 +127,36 @@ void fdd_set_densel(int densel) fdd[1].densel = densel; } +int fdd_get_flags(int drive) +{ + return drive_types[fdd[drive].type].flags; +} + int fdd_getrpm(int drive) { int hole = disc_hole(drive); + int flags = 0; drive ^= fdd_swap; + flags = fdd_get_flags(drive); - if (!(drive_types[fdd[drive].type].flags & FLAG_RPM_360)) return 300; - if (!(drive_types[fdd[drive].type].flags & FLAG_RPM_300)) return 360; + if ((flags & 3) == FLAGS_RPM_300_ONLY) + { + return 300; + } + else if ((flags & 3) == FLAGS_RPM_360_ONLY) + { + return 360; + } - if (drive_types[fdd[drive].type].flags & FLAG_525) + if (flags & FLAG_525) { return fdd[drive].densel ? 360 : 300; } else { /* disc_hole(drive) returns 0 for double density media, 1 for high density, and 2 for extended density. */ - if (hole == 1) + if (hole >= 1) { return fdd[drive].densel ? 300 : 360; } @@ -177,11 +199,6 @@ int fdd_get_type(int drive) return fdd[drive].type; } -int fdd_get_flags(int drive) -{ - return drive_types[fdd[drive].type].flags; -} - int fdd_is_525(int drive) { return drive_types[fdd[drive].type].flags & FLAG_525;