86F handler now only expected one side parameter byte per track for single-sided images;
FDC FORMAT command now sets drive head.
This commit is contained in:
@@ -284,8 +284,11 @@ void d86f_load(int drive, char *fn)
|
|||||||
{
|
{
|
||||||
fseek(d86f[drive].f, d86f[drive].track_offset[0], SEEK_SET);
|
fseek(d86f[drive].f, d86f[drive].track_offset[0], SEEK_SET);
|
||||||
fread(&(d86f[drive].side_flags[0]), 1, 1, d86f[drive].f);
|
fread(&(d86f[drive].side_flags[0]), 1, 1, d86f[drive].f);
|
||||||
|
if (d86f_get_sides(drive) == 2)
|
||||||
|
{
|
||||||
fread(&(d86f[drive].side_flags[1]), 1, 1, d86f[drive].f);
|
fread(&(d86f[drive].side_flags[1]), 1, 1, d86f[drive].f);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fseek(d86f[drive].f, d86f[drive].track_offset[0], SEEK_SET);
|
fseek(d86f[drive].f, d86f[drive].track_offset[0], SEEK_SET);
|
||||||
@@ -436,7 +439,7 @@ void d86f_seek(int drive, int track)
|
|||||||
{
|
{
|
||||||
full_size = d86f_get_array_size(drive);
|
full_size = d86f_get_array_size(drive);
|
||||||
store_size = full_size << 1;
|
store_size = full_size << 1;
|
||||||
flag_bytes++;
|
if (d86f_get_sides(drive) == 2) flag_bytes++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (d86f_is_40_track(drive) && fdd_doublestep_40(drive))
|
if (d86f_is_40_track(drive) && fdd_doublestep_40(drive))
|
||||||
@@ -457,8 +460,11 @@ void d86f_seek(int drive, int track)
|
|||||||
if (d86f[drive].version == 0x010A)
|
if (d86f[drive].version == 0x010A)
|
||||||
{
|
{
|
||||||
d86f[drive].side_flags[0] = 0x0A; /* 300 rpm, MFM, 250 kbps */
|
d86f[drive].side_flags[0] = 0x0A; /* 300 rpm, MFM, 250 kbps */
|
||||||
|
if (d86f_get_sides(drive) == 2)
|
||||||
|
{
|
||||||
d86f[drive].side_flags[1] = 0x0A; /* 300 rpm, MFM, 250 kbps */
|
d86f[drive].side_flags[1] = 0x0A; /* 300 rpm, MFM, 250 kbps */
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
d86f[drive].track_flags = 0x0A; /* 300 rpm, MFM, 250 kbps */
|
d86f[drive].track_flags = 0x0A; /* 300 rpm, MFM, 250 kbps */
|
||||||
@@ -473,8 +479,11 @@ void d86f_seek(int drive, int track)
|
|||||||
if (d86f[drive].version == 0x010A)
|
if (d86f[drive].version == 0x010A)
|
||||||
{
|
{
|
||||||
fread(&(d86f[drive].side_flags[0]), 1, 1, d86f[drive].f);
|
fread(&(d86f[drive].side_flags[0]), 1, 1, d86f[drive].f);
|
||||||
|
if (d86f_get_sides(drive) == 2)
|
||||||
|
{
|
||||||
fread(&(d86f[drive].side_flags[1]), 1, 1, d86f[drive].f);
|
fread(&(d86f[drive].side_flags[1]), 1, 1, d86f[drive].f);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fread(&(d86f[drive].track_flags), 1, 1, d86f[drive].f);
|
fread(&(d86f[drive].track_flags), 1, 1, d86f[drive].f);
|
||||||
@@ -500,7 +509,7 @@ void d86f_writeback(int drive)
|
|||||||
{
|
{
|
||||||
full_size = d86f_get_array_size(drive);
|
full_size = d86f_get_array_size(drive);
|
||||||
store_size = full_size << 1;
|
store_size = full_size << 1;
|
||||||
flag_bytes++;
|
if (d86f_get_sides(drive) == 2) flag_bytes++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!d86f[drive].f)
|
if (!d86f[drive].f)
|
||||||
@@ -516,8 +525,11 @@ void d86f_writeback(int drive)
|
|||||||
if (d86f[drive].version == 0x010A)
|
if (d86f[drive].version == 0x010A)
|
||||||
{
|
{
|
||||||
fwrite(&(d86f[drive].side_flags[0]), 1, 1, d86f[drive].f);
|
fwrite(&(d86f[drive].side_flags[0]), 1, 1, d86f[drive].f);
|
||||||
|
if (d86f_get_sides(drive) == 2)
|
||||||
|
{
|
||||||
fwrite(&(d86f[drive].side_flags[1]), 1, 1, d86f[drive].f);
|
fwrite(&(d86f[drive].side_flags[1]), 1, 1, d86f[drive].f);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fwrite(&(d86f[drive].track_flags), 1, 1, d86f[drive].f);
|
fwrite(&(d86f[drive].track_flags), 1, 1, d86f[drive].f);
|
||||||
@@ -717,7 +729,7 @@ void d86f_format(int drive, int track, int side, int rate, uint8_t fill)
|
|||||||
{
|
{
|
||||||
full_size = d86f_get_array_size(drive);
|
full_size = d86f_get_array_size(drive);
|
||||||
store_size = full_size << 1;
|
store_size = full_size << 1;
|
||||||
flag_bytes++;
|
if (d86f_get_sides(drive) == 2) flag_bytes++;
|
||||||
}
|
}
|
||||||
|
|
||||||
d86f[drive].req_sector.id.c = d86f[drive].cur_track;
|
d86f[drive].req_sector.id.c = d86f[drive].cur_track;
|
||||||
|
|||||||
14
src/fdc.c
14
src/fdc.c
@@ -773,6 +773,7 @@ bad_command:
|
|||||||
case 0x0d: /*Format*/
|
case 0x0d: /*Format*/
|
||||||
fdc_rate(fdc.drive);
|
fdc_rate(fdc.drive);
|
||||||
fdc.head = (fdc.params[0] & 4) ? 1 : 0;
|
fdc.head = (fdc.params[0] & 4) ? 1 : 0;
|
||||||
|
fdd_set_head(fdc.drive, (fdc.params[0] & 4) ? 1 : 0);
|
||||||
fdc.gap = fdc.params[3];
|
fdc.gap = fdc.params[3];
|
||||||
fdc.dtl = 4000000;
|
fdc.dtl = 4000000;
|
||||||
fdc.format_sectors = fdc.params[2];
|
fdc.format_sectors = fdc.params[2];
|
||||||
@@ -785,6 +786,7 @@ bad_command:
|
|||||||
case 0xf: /*Seek*/
|
case 0xf: /*Seek*/
|
||||||
fdc.stat = 1 << fdc.drive;
|
fdc.stat = 1 << fdc.drive;
|
||||||
fdc.head = (fdc.params[0] & 4) ? 1 : 0;
|
fdc.head = (fdc.params[0] & 4) ? 1 : 0;
|
||||||
|
fdd_set_head(fdc.drive, (fdc.params[0] & 4) ? 1 : 0);
|
||||||
disctime = 0;
|
disctime = 0;
|
||||||
if (fdc.seek_params & 0x80)
|
if (fdc.seek_params & 0x80)
|
||||||
{
|
{
|
||||||
@@ -1103,9 +1105,9 @@ void fdc_callback()
|
|||||||
fdc.track[fdc.drive]=0;
|
fdc.track[fdc.drive]=0;
|
||||||
// if (!driveempty[fdc.dor & 1]) discchanged[fdc.dor & 1] = 0;
|
// if (!driveempty[fdc.dor & 1]) discchanged[fdc.dor & 1] = 0;
|
||||||
if (fdc.drive <= 1)
|
if (fdc.drive <= 1)
|
||||||
fdc.st0 = 0x20 | (fdc.params[0] & 3) | (fdc.head?4:0);
|
fdc.st0 = 0x20 | (fdc.params[0] & 3) | (fdd_get_head(fdc.drive ^ fdd_swap)?4:0);
|
||||||
else
|
else
|
||||||
fdc.st0 = 0x68 | (fdc.params[0] & 3) | (fdc.head?4:0);
|
fdc.st0 = 0x68 | (fdc.params[0] & 3) | (fdd_get_head(fdc.drive ^ fdd_swap)?4:0);
|
||||||
discint=-3;
|
discint=-3;
|
||||||
timer_process();
|
timer_process();
|
||||||
disctime = 2048 * (1 << TIMER_SHIFT);
|
disctime = 2048 * (1 << TIMER_SHIFT);
|
||||||
@@ -1119,7 +1121,7 @@ void fdc_callback()
|
|||||||
|
|
||||||
fdc.stat = (fdc.stat & 0xf) | 0xd0;
|
fdc.stat = (fdc.stat & 0xf) | 0xd0;
|
||||||
if (fdc_reset_stat)
|
if (fdc_reset_stat)
|
||||||
fdc.res[9] = 0xc0 | (4 - fdc_reset_stat) | (fdc.head ? 4 : 0);
|
fdc.res[9] = 0xc0 | (4 - fdc_reset_stat) | (fdd_get_head(fdc.drive ^ fdd_swap) ? 4 : 0);
|
||||||
else
|
else
|
||||||
fdc.res[9] = fdc.st0;
|
fdc.res[9] = fdc.st0;
|
||||||
fdc.res[10] = fdc.track[fdc.drive];
|
fdc.res[10] = fdc.track[fdc.drive];
|
||||||
@@ -1157,7 +1159,7 @@ void fdc_callback()
|
|||||||
fdc.res[4] = (fdd_get_head(fdc.drive ^ fdd_swap)?4:0)|fdc.drive;
|
fdc.res[4] = (fdd_get_head(fdc.drive ^ fdd_swap)?4:0)|fdc.drive;
|
||||||
fdc.res[5] = fdc.res[6] = 0;
|
fdc.res[5] = fdc.res[6] = 0;
|
||||||
fdc.res[7] = fdc.track[fdc.drive];
|
fdc.res[7] = fdc.track[fdc.drive];
|
||||||
fdc.res[8] = fdc.head;
|
fdc.res[8] = fdd_get_head(fdc.drive ^ fdd_swap);
|
||||||
fdc.res[9] = fdc.format_dat[fdc.pos - 2] + 1;
|
fdc.res[9] = fdc.format_dat[fdc.pos - 2] + 1;
|
||||||
fdc.res[10] = fdc.params[4];
|
fdc.res[10] = fdc.params[4];
|
||||||
paramstogo=7;
|
paramstogo=7;
|
||||||
@@ -1171,9 +1173,9 @@ void fdc_callback()
|
|||||||
// if (!driveempty[fdc.dor & 1]) discchanged[fdc.dor & 1] = 0;
|
// if (!driveempty[fdc.dor & 1]) discchanged[fdc.dor & 1] = 0;
|
||||||
// printf("Seeked to track %i %i\n",fdc.track[fdc.drive], fdc.drive);
|
// printf("Seeked to track %i %i\n",fdc.track[fdc.drive], fdc.drive);
|
||||||
if (fdc.drive <= 1)
|
if (fdc.drive <= 1)
|
||||||
fdc.st0 = 0x20 | (fdc.params[0] & 3) | (fdc.head?4:0);
|
fdc.st0 = 0x20 | (fdc.params[0] & 3) | (fdd_get_head(fdc.drive ^ fdd_swap)?4:0);
|
||||||
else
|
else
|
||||||
fdc.st0 = 0x68 | (fdc.params[0] & 3) | (fdc.head?4:0);
|
fdc.st0 = 0x68 | (fdc.params[0] & 3) | (fdd_get_head(fdc.drive ^ fdd_swap)?4:0);
|
||||||
discint=-3;
|
discint=-3;
|
||||||
timer_process();
|
timer_process();
|
||||||
disctime = 2048 * (1 << TIMER_SHIFT);
|
disctime = 2048 * (1 << TIMER_SHIFT);
|
||||||
|
|||||||
Reference in New Issue
Block a user