From ad9966f27fad5763f5f21aefe79a96d32549e9e2 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 6 Sep 2016 02:17:05 +0200 Subject: [PATCH] 86F handler now only expected one side parameter byte per track for single-sided images; FDC FORMAT command now sets drive head. --- src/disc_86f.c | 26 +++++++++++++++++++------- src/fdc.c | 14 ++++++++------ 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/disc_86f.c b/src/disc_86f.c index e4d4c69b8..7e05b0e2a 100644 --- a/src/disc_86f.c +++ b/src/disc_86f.c @@ -284,7 +284,10 @@ void d86f_load(int drive, char *fn) { 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[1]), 1, 1, d86f[drive].f); + if (d86f_get_sides(drive) == 2) + { + fread(&(d86f[drive].side_flags[1]), 1, 1, d86f[drive].f); + } } else { @@ -436,7 +439,7 @@ void d86f_seek(int drive, int track) { full_size = d86f_get_array_size(drive); 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)) @@ -457,7 +460,10 @@ void d86f_seek(int drive, int track) if (d86f[drive].version == 0x010A) { d86f[drive].side_flags[0] = 0x0A; /* 300 rpm, MFM, 250 kbps */ - d86f[drive].side_flags[1] = 0x0A; /* 300 rpm, MFM, 250 kbps */ + if (d86f_get_sides(drive) == 2) + { + d86f[drive].side_flags[1] = 0x0A; /* 300 rpm, MFM, 250 kbps */ + } } else { @@ -473,7 +479,10 @@ void d86f_seek(int drive, int track) if (d86f[drive].version == 0x010A) { fread(&(d86f[drive].side_flags[0]), 1, 1, d86f[drive].f); - fread(&(d86f[drive].side_flags[1]), 1, 1, d86f[drive].f); + if (d86f_get_sides(drive) == 2) + { + fread(&(d86f[drive].side_flags[1]), 1, 1, d86f[drive].f); + } } else { @@ -500,7 +509,7 @@ void d86f_writeback(int drive) { full_size = d86f_get_array_size(drive); store_size = full_size << 1; - flag_bytes++; + if (d86f_get_sides(drive) == 2) flag_bytes++; } if (!d86f[drive].f) @@ -516,7 +525,10 @@ void d86f_writeback(int drive) if (d86f[drive].version == 0x010A) { fwrite(&(d86f[drive].side_flags[0]), 1, 1, d86f[drive].f); - fwrite(&(d86f[drive].side_flags[1]), 1, 1, d86f[drive].f); + if (d86f_get_sides(drive) == 2) + { + fwrite(&(d86f[drive].side_flags[1]), 1, 1, d86f[drive].f); + } } else { @@ -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); 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; diff --git a/src/fdc.c b/src/fdc.c index d8d7e71ae..8d903f1c8 100644 --- a/src/fdc.c +++ b/src/fdc.c @@ -773,6 +773,7 @@ bad_command: case 0x0d: /*Format*/ fdc_rate(fdc.drive); 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.dtl = 4000000; fdc.format_sectors = fdc.params[2]; @@ -785,6 +786,7 @@ bad_command: case 0xf: /*Seek*/ fdc.stat = 1 << fdc.drive; fdc.head = (fdc.params[0] & 4) ? 1 : 0; + fdd_set_head(fdc.drive, (fdc.params[0] & 4) ? 1 : 0); disctime = 0; if (fdc.seek_params & 0x80) { @@ -1103,9 +1105,9 @@ void fdc_callback() fdc.track[fdc.drive]=0; // if (!driveempty[fdc.dor & 1]) discchanged[fdc.dor & 1] = 0; 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 - 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; timer_process(); disctime = 2048 * (1 << TIMER_SHIFT); @@ -1119,7 +1121,7 @@ void fdc_callback() fdc.stat = (fdc.stat & 0xf) | 0xd0; 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 fdc.res[9] = fdc.st0; 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[5] = fdc.res[6] = 0; 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[10] = fdc.params[4]; paramstogo=7; @@ -1171,9 +1173,9 @@ void fdc_callback() // if (!driveempty[fdc.dor & 1]) discchanged[fdc.dor & 1] = 0; // printf("Seeked to track %i %i\n",fdc.track[fdc.drive], fdc.drive); 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 - 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; timer_process(); disctime = 2048 * (1 << TIMER_SHIFT);