86F and IMG handler now account for possible floppy drive swap when getting the drive's current RPM;
The RWC setting is now ignored when the FDC is not in enhanced mode.
This commit is contained in:
@@ -563,7 +563,7 @@ static int d86f_get_bitcell_period(int drive)
|
|||||||
if (!mfm) rate /= 2.0;
|
if (!mfm) rate /= 2.0;
|
||||||
size = (size * 250.0) / rate;
|
size = (size * 250.0) / rate;
|
||||||
size = (size * 300.0) / rpm;
|
size = (size * 300.0) / rpm;
|
||||||
size = (size * fdd_getrpm(drive)) / 300.0;
|
size = (size * fdd_getrpm(drive ^ fdd_swap)) / 300.0;
|
||||||
return (int) size;
|
return (int) size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
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 ^ fdd_swap);
|
||||||
return ((&disc_sector_data[drive][0][0])->rate * 300) / fdd_getrpm(drive);
|
|
||||||
return (cur_rate[drive] * 300) / fdd_getrpm(drive);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void disc_sector_readsector(int drive, int sector, int track, int side, int rate, int sector_size)
|
void disc_sector_readsector(int drive, int sector, int track, int side, int rate, int sector_size)
|
||||||
|
|||||||
15
src/fdc.c
15
src/fdc.c
@@ -253,13 +253,15 @@ void fdc_update_is_nsc(int is_nsc)
|
|||||||
fdc.is_nsc = is_nsc;
|
fdc.is_nsc = is_nsc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void fdc_rate(int drive);
|
||||||
|
|
||||||
void fdc_update_enh_mode(int enh_mode)
|
void fdc_update_enh_mode(int enh_mode)
|
||||||
{
|
{
|
||||||
fdc.enh_mode = 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)
|
int fdc_get_rwc(int drive)
|
||||||
{
|
{
|
||||||
return fdc.rwc[drive];
|
return fdc.rwc[drive];
|
||||||
@@ -309,11 +311,11 @@ void fdc_update_drv2en(int drv2en)
|
|||||||
|
|
||||||
void fdc_update_rate(int drive)
|
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;
|
bit_rate = 500;
|
||||||
}
|
}
|
||||||
else if (fdc.rwc[drive] == 3)
|
else if ((fdc.rwc[drive] == 3) && fdc.enh_mode)
|
||||||
{
|
{
|
||||||
bit_rate = 250;
|
bit_rate = 250;
|
||||||
}
|
}
|
||||||
@@ -375,6 +377,8 @@ int fdc_get_bitcell_period()
|
|||||||
|
|
||||||
static int fdc_get_densel(int drive)
|
static int fdc_get_densel(int drive)
|
||||||
{
|
{
|
||||||
|
if (fdc.enh_mode)
|
||||||
|
{
|
||||||
switch (fdc.rwc[drive])
|
switch (fdc.rwc[drive])
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
@@ -383,6 +387,7 @@ static int fdc_get_densel(int drive)
|
|||||||
case 2:
|
case 2:
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!fdc.is_nsc)
|
if (!fdc.is_nsc)
|
||||||
{
|
{
|
||||||
@@ -492,7 +497,7 @@ void fdc_write(uint16_t addr, uint8_t val, void *priv)
|
|||||||
if (fdc.enh_mode)
|
if (fdc.enh_mode)
|
||||||
{
|
{
|
||||||
drive = (fdc.dor & 1) ^ fdd_swap;
|
drive = (fdc.dor & 1) ^ fdd_swap;
|
||||||
fdc.rwc[drive] = (val & 0x30) >> 4;
|
fdc_update_rwc(drive, (val & 0x30) >> 4);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
case 4:
|
case 4:
|
||||||
|
|||||||
35
src/fdd.c
35
src/fdd.c
@@ -39,6 +39,11 @@ static struct
|
|||||||
#define FLAG_HOLE2 32
|
#define FLAG_HOLE2 32
|
||||||
#define FLAG_DOUBLE_STEP 64
|
#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
|
static struct
|
||||||
{
|
{
|
||||||
int max_track;
|
int max_track;
|
||||||
@@ -76,6 +81,10 @@ static struct
|
|||||||
{ /*3.5" ED*/
|
{ /*3.5" ED*/
|
||||||
.max_track = 86,
|
.max_track = 86,
|
||||||
.flags = FLAG_RPM_300 | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_HOLE2
|
.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;
|
fdd[1].densel = densel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int fdd_get_flags(int drive)
|
||||||
|
{
|
||||||
|
return drive_types[fdd[drive].type].flags;
|
||||||
|
}
|
||||||
|
|
||||||
int fdd_getrpm(int drive)
|
int fdd_getrpm(int drive)
|
||||||
{
|
{
|
||||||
int hole = disc_hole(drive);
|
int hole = disc_hole(drive);
|
||||||
|
int flags = 0;
|
||||||
|
|
||||||
drive ^= fdd_swap;
|
drive ^= fdd_swap;
|
||||||
|
flags = fdd_get_flags(drive);
|
||||||
|
|
||||||
if (!(drive_types[fdd[drive].type].flags & FLAG_RPM_360)) return 300;
|
if ((flags & 3) == FLAGS_RPM_300_ONLY)
|
||||||
if (!(drive_types[fdd[drive].type].flags & FLAG_RPM_300)) return 360;
|
{
|
||||||
|
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;
|
return fdd[drive].densel ? 360 : 300;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* disc_hole(drive) returns 0 for double density media, 1 for high density, and 2 for extended density. */
|
/* 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;
|
return fdd[drive].densel ? 300 : 360;
|
||||||
}
|
}
|
||||||
@@ -177,11 +199,6 @@ int fdd_get_type(int drive)
|
|||||||
return fdd[drive].type;
|
return fdd[drive].type;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fdd_get_flags(int drive)
|
|
||||||
{
|
|
||||||
return drive_types[fdd[drive].type].flags;
|
|
||||||
}
|
|
||||||
|
|
||||||
int fdd_is_525(int drive)
|
int fdd_is_525(int drive)
|
||||||
{
|
{
|
||||||
return drive_types[fdd[drive].type].flags & FLAG_525;
|
return drive_types[fdd[drive].type].flags & FLAG_525;
|
||||||
|
|||||||
Reference in New Issue
Block a user