Removed support for all 86F versions other than 1.50 and the emulator-internal 0.99.

This commit is contained in:
OBattler
2016-09-27 03:16:57 +02:00
parent c627cf42ec
commit d695922a77
2 changed files with 98 additions and 228 deletions

View File

@@ -63,7 +63,6 @@ static struct
uint8_t track_data[2][50000]; uint8_t track_data[2][50000];
uint16_t track_encoded_data[2][50000]; uint16_t track_encoded_data[2][50000];
uint8_t track_layout[2][50000]; uint8_t track_layout[2][50000];
uint8_t track_flags;
uint16_t side_flags[2]; uint16_t side_flags[2];
uint16_t index_hole_pos[2]; uint16_t index_hole_pos[2];
uint8_t track_in_file; uint8_t track_in_file;
@@ -314,7 +313,7 @@ int d86f_get_sides(int drive)
int d86f_get_rpm_mode(int drive) int d86f_get_rpm_mode(int drive)
{ {
if ((d86f[drive].version != 0x0115) && (d86f[drive].version != 0x0132)) return 0; if (d86f[drive].version != 0x0132) return 0;
return (d86f_handler[drive].disk_flags(drive) & 0x60) >> 5; return (d86f_handler[drive].disk_flags(drive) & 0x60) >> 5;
} }
@@ -328,7 +327,7 @@ int d86f_get_array_size(int drive)
case 0: case 0:
default: default:
pos = 7500; pos = 7500;
if ((d86f[drive].version != 0x0115) && (d86f[drive].version != 0x0132)) return pos; if (d86f[drive].version != 0x0132) return pos;
switch (rm) switch (rm)
{ {
case 1: case 1:
@@ -347,7 +346,7 @@ int d86f_get_array_size(int drive)
break; break;
case 1: case 1:
pos = 12500; pos = 12500;
if ((d86f[drive].version != 0x0115) && (d86f[drive].version != 0x0132)) return pos; if (d86f[drive].version != 0x0132) return pos;
switch (rm) switch (rm)
{ {
case 1: case 1:
@@ -366,7 +365,7 @@ int d86f_get_array_size(int drive)
break; break;
case 2: case 2:
pos = 50000; pos = 50000;
if ((d86f[drive].version != 0x0115) && (d86f[drive].version != 0x0132)) return pos; if (d86f[drive].version != 0x0132) return pos;
switch (rm) switch (rm)
{ {
case 1: case 1:
@@ -469,10 +468,21 @@ void d86f_load(int drive, char *fn)
fread(&(d86f[drive].version), 2, 1, d86f[drive].f); fread(&(d86f[drive].version), 2, 1, d86f[drive].f);
if ((d86f[drive].version != 0x0100) && (d86f[drive].version != 0x010A) && (d86f[drive].version != 0x0114) && (d86f[drive].version != 0x0115) && (d86f[drive].version != 0x0132)) if (d86f[drive].version != 0x0132)
{ {
/* File is not of a recognized format version abort. */ /* File is not of a recognized format version abort. */
pclog("86F: Unrecognized file version: %i.%02i\n", d86f[drive].version >> 8, d86f[drive].version & 0xFF); if (d86f[drive].version == 0x0063)
{
pclog("86F: File has emulator-internal 86F version 0.99, this version is not valid in a file\n", d86f[drive].version >> 8, d86f[drive].version & 0xFF);
}
else ((d86f[drive].version >= 0x0100) && (d86f[drive].version < 0x0132))
{
pclog("86F: No longer supported development file version: %i.%02i\n", d86f[drive].version >> 8, d86f[drive].version & 0xFF);
}
else
{
pclog("86F: Unrecognized file version: %i.%02i\n", d86f[drive].version >> 8, d86f[drive].version & 0xFF);
}
fclose(d86f[drive].f); fclose(d86f[drive].f);
return; return;
} }
@@ -481,15 +491,7 @@ void d86f_load(int drive, char *fn)
pclog("86F: Recognized file version: %i.%02i\n", d86f[drive].version >> 8, d86f[drive].version & 0xFF); pclog("86F: Recognized file version: %i.%02i\n", d86f[drive].version >> 8, d86f[drive].version & 0xFF);
} }
if (d86f[drive].version < 0x0132) fread(&(d86f[drive].disk_flags), 2, 1, d86f[drive].f);
{
d86f[drive].disk_flags = 0;
fread(&(d86f[drive].disk_flags), 1, 1, d86f[drive].f);
}
else
{
fread(&(d86f[drive].disk_flags), 2, 1, d86f[drive].f);
}
if (((d86f[drive].disk_flags >> 1) & 3) == 3) if (((d86f[drive].disk_flags >> 1) & 3) == 3)
{ {
@@ -525,27 +527,13 @@ void d86f_load(int drive, char *fn)
/* Load track 0 flags as default. */ /* Load track 0 flags as default. */
d86f[drive].side_flag_bytes = d86f_get_sides(drive); d86f[drive].side_flag_bytes = d86f_get_sides(drive);
if ((d86f[drive].version == 0x010A) || (d86f[drive].version == 0x0114) || (d86f[drive].version == 0x0115) || (d86f[drive].version == 0x0132))
fseek(d86f[drive].f, d86f[drive].track_offset[0], SEEK_SET);
d86f[drive].side_flags[0] = d86f[drive].side_flags[1] = 0;
fread(&(d86f[drive].side_flags[0]), 2, 1, d86f[drive].f);
if (d86f_get_sides(drive) == 2)
{ {
if ((d86f[drive].version == 0x010A) && (d86f_get_sides(drive) == 1)) fread(&(d86f[drive].side_flags[1]), 2, 1, d86f[drive].f);
{
/* This is needed to detect the early variant of 86F version 1.10 images and handle it correctly. */
fseek(d86f[drive].f, d86f[drive].track_offset[0] + 3, SEEK_SET);
fread(&temp, 1, 1, d86f[drive].f);
if (temp & 0x80) d86f[drive].side_flag_bytes = 2;
}
fseek(d86f[drive].f, d86f[drive].track_offset[0], SEEK_SET);
d86f[drive].side_flags[0] = d86f[drive].side_flags[1] = 0;
fread(&(d86f[drive].side_flags[0]), (d86f[drive].version == 0x0132) ? 2 : 1, 1, d86f[drive].f);
if (d86f_get_sides(drive) == 2)
{
fread(&(d86f[drive].side_flags[1]), (d86f[drive].version == 0x0132) ? 2 : 1, 1, d86f[drive].f);
}
}
else
{
fseek(d86f[drive].f, d86f[drive].track_offset[0], SEEK_SET);
fread(&(d86f[drive].track_flags), 1, 1, d86f[drive].f);
} }
fseek(d86f[drive].f, 0, SEEK_END); fseek(d86f[drive].f, 0, SEEK_END);
@@ -573,14 +561,7 @@ uint16_t d86f_side_flags(int drive)
{ {
int side = 0; int side = 0;
side = fdd_get_head(drive); side = fdd_get_head(drive);
if ((d86f[drive].version == 0x010A) || (d86f[drive].version == 0x0114) || (d86f[drive].version == 0x0115) || (d86f[drive].version == 0x0132)) return d86f[drive].side_flags[side];
{
return d86f[drive].side_flags[side];
}
else
{
return d86f[drive].track_flags;
}
} }
uint16_t d86f_track_flags(int drive) uint16_t d86f_track_flags(int drive)
@@ -667,7 +648,7 @@ uint32_t d86f_get_raw_size(int drive)
rpm = ((d86f_track_flags(drive) & 0xE0) == 0x20) ? 360.0 : 300.0; rpm = ((d86f_track_flags(drive) & 0xE0) == 0x20) ? 360.0 : 300.0;
rpm_diff = rpm * 0.005; rpm_diff = rpm * 0.005;
if ((d86f[drive].version == 0x0115) || (d86f[drive].version == 0x0132)) if (d86f[drive].version == 0x0132)
{ {
switch (d86f_get_rpm_mode(drive)) switch (d86f_get_rpm_mode(drive))
{ {
@@ -717,34 +698,22 @@ void d86f_seek(int drive, int track)
{ {
int sides; int sides;
int side; int side;
int full_size = 25000; int full_size, store_size;
int store_size = 50000; int flag_bytes = 5;
int flag_bytes = 2;
sides = d86f_get_sides(drive); sides = d86f_get_sides(drive);
if ((d86f[drive].version == 0x010A) || (d86f[drive].version == 0x0114) || (d86f[drive].version == 0x0115) || (d86f[drive].version == 0x0132))
{ full_size = d86f_get_array_size(drive);
full_size = d86f_get_array_size(drive); store_size = full_size << 1;
store_size = full_size << 1; if (d86f_is_encoded(drive)) store_size += full_size;
if (d86f[drive].version == 0x0132) if (d86f_get_sides(drive) == 2) flag_bytes += 4;
{
if (d86f_is_encoded(drive)) store_size += full_size;
flag_bytes++;
if (d86f[drive].side_flag_bytes == 2) flag_bytes += 2;
}
else
{
if (d86f[drive].side_flag_bytes == 2) flag_bytes++;
}
if ((d86f[drive].version == 0x0114) || (d86f[drive].version == 0x0115) || (d86f[drive].version == 0x0132)) flag_bytes += 4;
}
if (d86f_is_40_track(drive) && fdd_doublestep_40(drive)) if (d86f_is_40_track(drive) && fdd_doublestep_40(drive))
track /= 2; track /= 2;
for (side = 0; side < d86f_get_sides(drive); side++) for (side = 0; side < d86f_get_sides(drive); side++)
{ {
memset(d86f[drive].track_layout[side], (d86f[drive].version == 0x0132) ? BYTE_GAP0 : BYTE_GAP4, 50000); memset(d86f[drive].track_layout[side], BYTE_GAP0, 50000);
if ((d86f[drive].version == 0x0132) && d86f_is_encoded(drive)) if (d86f_is_encoded(drive))
{ {
memset(d86f[drive].track_encoded_data[side], 0xFF, 50000); memset(d86f[drive].track_encoded_data[side], 0xFF, 50000);
} }
@@ -760,16 +729,9 @@ void d86f_seek(int drive, int track)
{ {
/* Track does not exist in the image, initialize it as unformatted. */ /* Track does not exist in the image, initialize it as unformatted. */
d86f[drive].track_in_file = 0; d86f[drive].track_in_file = 0;
if ((d86f[drive].version == 0x010A) || (d86f[drive].version == 0x0114) || (d86f[drive].version == 0x0115) || (d86f[drive].version == 0x0132)) for (side = 0; side < d86f_get_sides(drive); side++)
{ {
for (side = 0; side < d86f_get_sides(drive); side++) d86f[drive].side_flags[side] = 0x0A; /* 300 rpm, MFM, 250 kbps */
{
d86f[drive].side_flags[side] = 0x0A; /* 300 rpm, MFM, 250 kbps */
}
}
else
{
d86f[drive].track_flags = 0x0A; /* 300 rpm, MFM, 250 kbps */
} }
return; return;
} }
@@ -778,24 +740,14 @@ void d86f_seek(int drive, int track)
fseek(d86f[drive].f, d86f[drive].track_offset[track], SEEK_SET); fseek(d86f[drive].f, d86f[drive].track_offset[track], SEEK_SET);
if ((d86f[drive].version == 0x010A) || (d86f[drive].version == 0x0114) || (d86f[drive].version == 0x0115) || (d86f[drive].version == 0x0132)) for (side = 0; side < d86f[drive].side_flag_bytes; side++)
{ {
for (side = 0; side < d86f[drive].side_flag_bytes; side++) fread(&(d86f[drive].side_flags[side]), 2, 1, d86f[drive].f);
{
fread(&(d86f[drive].side_flags[side]), (d86f[drive].version == 0x0132) ? 2 : 1, 1, d86f[drive].f);
}
if ((d86f[drive].version == 0x0114) || (d86f[drive].version == 0x0115) || (d86f[drive].version == 0x0132))
{
for (side = 0; side < d86f[drive].side_flag_bytes; side++)
{
fread(&(d86f[drive].index_hole_pos[side]), 2, 1, d86f[drive].f);
}
}
} }
else
for (side = 0; side < d86f[drive].side_flag_bytes; side++)
{ {
fread(&(d86f[drive].track_flags), 1, 1, d86f[drive].f); fread(&(d86f[drive].index_hole_pos[side]), 2, 1, d86f[drive].f);
} }
for (side = 0; side < d86f_get_sides(drive); side++) for (side = 0; side < d86f_get_sides(drive); side++)
@@ -803,7 +755,7 @@ void d86f_seek(int drive, int track)
fseek(d86f[drive].f, d86f[drive].track_offset[track] + (side * store_size) + flag_bytes, SEEK_SET); fseek(d86f[drive].f, d86f[drive].track_offset[track] + (side * store_size) + flag_bytes, SEEK_SET);
fread(d86f[drive].track_layout[side], 1, d86f_get_raw_size(drive), d86f[drive].f); fread(d86f[drive].track_layout[side], 1, d86f_get_raw_size(drive), d86f[drive].f);
fseek(d86f[drive].f, d86f[drive].track_offset[track] + (side * store_size) + full_size + flag_bytes, SEEK_SET); fseek(d86f[drive].f, d86f[drive].track_offset[track] + (side * store_size) + full_size + flag_bytes, SEEK_SET);
if ((d86f[drive].version == 0x0132) && d86f_is_encoded(drive)) if (d86f_is_encoded(drive))
{ {
fread(d86f[drive].track_encoded_data[side], 1, d86f_get_raw_size(drive) << 1, d86f[drive].f); fread(d86f[drive].track_encoded_data[side], 1, d86f_get_raw_size(drive) << 1, d86f[drive].f);
} }
@@ -819,25 +771,13 @@ void d86f_writeback(int drive)
int track = d86f[drive].cur_track; int track = d86f[drive].cur_track;
uint8_t track_id = track; uint8_t track_id = track;
int side; int side;
int full_size = 25000; int full_size, store_size;
int store_size = 50000; int flag_bytes = 5;
int flag_bytes = 2;
if ((d86f[drive].version == 0x010A) || (d86f[drive].version == 0x0114) || (d86f[drive].version == 0x0115) || (d86f[drive].version == 0x0132)) full_size = d86f_get_array_size(drive);
{ store_size = full_size << 1;
full_size = d86f_get_array_size(drive); if (d86f_is_encoded(drive)) store_size += full_size;
store_size = full_size << 1; if (d86f_get_sides(drive) == 2) flag_bytes += 4;
if (d86f[drive].version == 0x0132)
{
if (d86f_is_encoded(drive)) store_size += full_size;
flag_bytes++;
if (d86f[drive].side_flag_bytes == 2) flag_bytes += 2;
}
else
{
if (d86f[drive].side_flag_bytes == 2) flag_bytes++;
}
if ((d86f[drive].version == 0x0114) || (d86f[drive].version == 0x0115) || (d86f[drive].version == 0x0132)) flag_bytes += 4;
}
if (!d86f[drive].f) if (!d86f[drive].f)
{ {
@@ -854,25 +794,16 @@ void d86f_writeback(int drive)
fseek(d86f[drive].f, d86f[drive].track_offset[track], SEEK_SET); fseek(d86f[drive].f, d86f[drive].track_offset[track], SEEK_SET);
if ((d86f[drive].version == 0x010A) || (d86f[drive].version == 0x0114) || (d86f[drive].version == 0x0115) || (d86f[drive].version == 0x0132)) for (side = 0; side < d86f[drive].side_flag_bytes; side++)
{ {
for (side = 0; side < d86f[drive].side_flag_bytes; side++) fwrite(&(d86f[drive].side_flags[side]), 2, 1, d86f[drive].f);
{ }
fwrite(&(d86f[drive].side_flags[side]), (d86f[drive].version == 0x0132) ? 2 : 1, 1, d86f[drive].f);
}
if ((d86f[drive].version == 0x0114) || (d86f[drive].version == 0x0115) || (d86f[drive].version == 0x0132)) for (side = 0; side < d86f[drive].side_flag_bytes; side++)
{
for (side = 0; side < d86f[drive].side_flag_bytes; side++)
{
fwrite(&(d86f[drive].index_hole_pos[side]), 2, 1, d86f[drive].f);
}
}
}
else
{ {
fwrite(&(d86f[drive].track_flags), 1, 1, d86f[drive].f); fwrite(&(d86f[drive].index_hole_pos[side]), 2, 1, d86f[drive].f);
} }
fwrite(&track_id, 1, 1, d86f[drive].f); fwrite(&track_id, 1, 1, d86f[drive].f);
for (side = 0; side < d86f_get_sides(drive); side++) for (side = 0; side < d86f_get_sides(drive); side++)
@@ -880,7 +811,7 @@ void d86f_writeback(int drive)
fseek(d86f[drive].f, d86f[drive].track_offset[track] + (side * store_size) + flag_bytes, SEEK_SET); fseek(d86f[drive].f, d86f[drive].track_offset[track] + (side * store_size) + flag_bytes, SEEK_SET);
fwrite(d86f[drive].track_layout[side], 1, d86f_get_raw_size(drive), d86f[drive].f); fwrite(d86f[drive].track_layout[side], 1, d86f_get_raw_size(drive), d86f[drive].f);
fseek(d86f[drive].f, d86f[drive].track_offset[track] + (side * store_size) + full_size + flag_bytes, SEEK_SET); fseek(d86f[drive].f, d86f[drive].track_offset[track] + (side * store_size) + full_size + flag_bytes, SEEK_SET);
if ((d86f[drive].version == 0x0132) && d86f_is_encoded(drive)) if (d86f_is_encoded(drive))
{ {
fwrite(d86f[drive].track_encoded_data[side], 1, d86f_get_raw_size(drive) << 1, d86f[drive].f); fwrite(d86f[drive].track_encoded_data[side], 1, d86f_get_raw_size(drive) << 1, d86f[drive].f);
} }
@@ -1046,7 +977,7 @@ uint16_t d86f_prepare_pretrack(int drive, int side, int iso, int write_data)
if (d86f_is_encoded(drive)) write_data = 0; if (d86f_is_encoded(drive)) write_data = 0;
memset(d86f[drive].track_layout[side], (d86f[drive].version == 0x0132) ? BYTE_GAP0 : BYTE_GAP4, d86f_get_raw_size(drive)); memset(d86f[drive].track_layout[side], BYTE_GAP0, d86f_get_raw_size(drive));
if (write_data) memset(d86f[drive].track_data[side], mfm ? 0x4E : 0xFF, d86f_get_raw_size(drive)); if (write_data) memset(d86f[drive].track_data[side], mfm ? 0x4E : 0xFF, d86f_get_raw_size(drive));
i = 0; i = 0;
@@ -1138,6 +1069,11 @@ static void *d86f_memcpy(void *str1, const void *str2, size_t n, size_t s, uint1
return temp; return temp;
} }
void d86f_reset_index_hole_pos(int drive, int side)
{
d86f[drive].index_hole_pos[side] = 0;
}
uint16_t d86f_prepare_sector(int drive, int side, int pos, uint8_t *id_buf, uint8_t *data_buf, int data_len, int write_data, int gap2, int gap3, int limit) uint16_t d86f_prepare_sector(int drive, int side, int pos, uint8_t *id_buf, uint8_t *data_buf, int data_len, int write_data, int gap2, int gap3, int limit)
{ {
uint16_t i = pos; uint16_t i = pos;
@@ -1305,40 +1241,19 @@ int d86f_can_format(int drive)
void d86f_format(int drive, int track, int side, int rate, uint8_t fill) void d86f_format(int drive, int track, int side, int rate, uint8_t fill)
{ {
int full_size = 25000; int full_size, store_size;
int store_size = 50000; int flag_bytes = 5;
int flag_bytes = 2;
if ((d86f[drive].version == 0x010A) || (d86f[drive].version == 0x0114) || (d86f[drive].version == 0x0115) || (d86f[drive].version == 0x0132)) full_size = d86f_get_array_size(drive);
{ store_size = full_size << 1;
full_size = d86f_get_array_size(drive); if (d86f_is_encoded(drive)) store_size += full_size;
store_size = full_size << 1; if (d86f_get_sides(drive) == 2) flag_bytes += 4;
if (d86f[drive].version == 0x0132)
{
if (d86f_is_encoded(drive)) store_size += full_size;
flag_bytes++;
if (d86f[drive].side_flag_bytes == 2) flag_bytes += 2;
}
else
{
if (d86f[drive].side_flag_bytes == 2) flag_bytes++;
}
if ((d86f[drive].version == 0x0114) || (d86f[drive].version == 0x0115) || (d86f[drive].version == 0x0132)) flag_bytes += 4;
}
d86f[drive].req_sector.id.c = d86f[drive].cur_track; d86f[drive].req_sector.id.c = d86f[drive].cur_track;
d86f[drive].req_sector.id.h = side; d86f[drive].req_sector.id.h = side;
if ((side && (d86f_get_sides(drive) == 1)) || !(d86f_can_format(drive))) if ((side && (d86f_get_sides(drive) == 1)) || !(d86f_can_format(drive)))
{ {
/* if (side && (d86f_get_sides(drive) == 1)) pclog("Wrong side\n");
if (!(d86f_can_format(drive)))
{
if(writeprot[drive]) pclog("Drive is write-protected\n");
if (swwp) pclog("Software write-protect is enabled\n");
if (!fdd_can_read_medium(drive ^ fdd_swap)) pclog("Drive can't read medium\n");;
pclog("Extra conditions: %i\n", d86f_handler[drive].format_conditions(drive));
pclog("Hole: %i, rate: %i\n", d86f_hole(drive), fdc_get_bit_rate());
} */
fdc_notfound(); fdc_notfound();
d86f[drive].state = STATE_IDLE; d86f[drive].state = STATE_IDLE;
d86f[drive].index_count = 0; d86f[drive].index_count = 0;
@@ -1360,21 +1275,15 @@ void d86f_format(int drive, int track, int side, int rate, uint8_t fill)
/* Let's prepare the track space and layout before filling. */ /* Let's prepare the track space and layout before filling. */
if (d86f[drive].version != 0x0063) if (d86f[drive].version != 0x0063)
{ {
d86f[drive].track_flags &= 0xc0; d86f[drive].side_flags[side] &= 0xc0;
d86f[drive].track_flags |= (fdd_getrpm(drive ^ fdd_swap) == 360) ? 0x20 : 0; d86f[drive].side_flags[side] |= (fdd_getrpm(drive ^ fdd_swap) == 360) ? 0x20 : 0;
d86f[drive].track_flags |= fdc_get_bit_rate(); d86f[drive].side_flags[side] |= fdc_get_bit_rate();
d86f[drive].track_flags |= fdc_is_mfm() ? 8 : 0; d86f[drive].side_flags[side] |= fdc_is_mfm() ? 8 : 0;
if ((d86f[drive].version == 0x010A) || (d86f[drive].version == 0x0114) || (d86f[drive].version == 0x0115) || (d86f[drive].version == 0x0132))
{
d86f[drive].side_flags[side] = d86f[drive].track_flags;
if ((d86f[drive].version == 0x0114) || (d86f[drive].version == 0x0115) || (d86f[drive].version == 0x0132)) d86f[drive].index_hole_pos[side] = 0;
{
d86f[drive].index_hole_pos[side] = 0;
}
}
} }
if ((d86f[drive].version < 0x0132) || !d86f_is_encoded(drive))
if (!d86f_is_encoded(drive))
{ {
memset(d86f[drive].track_data[side], 0xFF, full_size); memset(d86f[drive].track_data[side], 0xFF, full_size);
} }
@@ -1382,6 +1291,7 @@ void d86f_format(int drive, int track, int side, int rate, uint8_t fill)
{ {
memset(d86f[drive].track_encoded_data[side], 0xFF, full_size * 2); memset(d86f[drive].track_encoded_data[side], 0xFF, full_size * 2);
} }
/* For version 0.99 (= another format proxied to the 86F handler), the track layout is fixed. */ /* For version 0.99 (= another format proxied to the 86F handler), the track layout is fixed. */
if (d86f[drive].version != 0x0063) if (d86f[drive].version != 0x0063)
{ {
@@ -1607,12 +1517,12 @@ uint16_t d86f_encode_byte(int drive, int sync, decoded_t b, decoded_t prev_b)
uint8_t d86f_read_byte(int drive, int side) uint8_t d86f_read_byte(int drive, int side)
{ {
if (d86f[drive].track_is_hole && (d86f[drive].version == 0x0132)) if (d86f[drive].track_is_hole)
{ {
return 0; return 0;
} }
if ((d86f[drive].version < 0x0132) || !d86f_is_encoded(drive)) if (!d86f_is_encoded(drive))
{ {
return d86f[drive].track_data[side][d86f[drive].track_pos]; return d86f[drive].track_data[side][d86f[drive].track_pos];
} }
@@ -1630,12 +1540,12 @@ void d86f_write_byte(int drive, int side, uint8_t byte)
dbyte.byte = byte; dbyte.byte = byte;
dpbyte.byte = d86f[drive].old_track_data_byte; dpbyte.byte = d86f[drive].old_track_data_byte;
if (d86f[drive].track_is_hole && (d86f[drive].version == 0x0132)) if (d86f[drive].track_is_hole)
{ {
return; return;
} }
if ((d86f[drive].version < 0x0132) || !d86f_is_encoded(drive)) if (!d86f_is_encoded(drive))
{ {
d86f[drive].track_data[side][d86f[drive].track_pos] = byte; d86f[drive].track_data[side][d86f[drive].track_pos] = byte;
} }
@@ -1671,58 +1581,25 @@ void d86f_poll_advancebyte(int drive, int side)
d86f[drive].old_track_byte = d86f[drive].track_byte; d86f[drive].old_track_byte = d86f[drive].track_byte;
d86f[drive].old_track_index = d86f[drive].track_index; d86f[drive].old_track_index = d86f[drive].track_index;
d86f[drive].old_track_data_byte = d86f[drive].track_data_byte; d86f[drive].old_track_data_byte = d86f[drive].track_data_byte;
d86f[drive].old_track_fuzzy = d86f[drive].track_fuzzy;
if ((d86f[drive].version == 0x0114) || (d86f[drive].version == 0x0115) || (d86f[drive].version == 0x0132)) d86f[drive].old_track_is_hole = d86f[drive].track_is_hole;
{
d86f[drive].old_track_fuzzy = d86f[drive].track_fuzzy;
if (d86f[drive].version == 0x0132)
{
d86f[drive].old_track_is_hole = d86f[drive].track_is_hole;
}
}
d86f[drive].track_pos++; d86f[drive].track_pos++;
d86f[drive].track_pos %= d86f_get_raw_size(drive); d86f[drive].track_pos %= d86f_get_raw_size(drive);
if ((d86f[drive].version == 0x0100) || (d86f[drive].version == 0x010A)) d86f[drive].track_byte = d86f[drive].track_layout[side][d86f[drive].track_pos] & ~BYTE_IS_FUZZY;
{ d86f[drive].track_byte = d86f[drive].track_layout[side][d86f[drive].track_pos] & ~0x20;
d86f[drive].track_byte = d86f[drive].track_layout[side][d86f[drive].track_pos] & ~BYTE_INDEX_HOLE; d86f[drive].track_is_hole = d86f[drive].track_layout[side][d86f[drive].track_pos] & 0x20;
d86f[drive].track_index = d86f[drive].track_layout[side][d86f[drive].track_pos] & BYTE_INDEX_HOLE; d86f[drive].track_index = (d86f[drive].track_pos == d86f[drive].index_hole_pos[side]);
d86f[drive].track_data_byte = d86f[drive].track_data[side][d86f[drive].track_pos]; d86f[drive].track_fuzzy = d86f[drive].track_layout[side][d86f[drive].track_pos] & BYTE_IS_FUZZY;
d86f[drive].track_is_hole = 0;
d86f[drive].track_fuzzy = 0;
}
else if ((d86f[drive].version == 0x0114) || (d86f[drive].version == 0x0115) || (d86f[drive].version == 0x0132))
{
d86f[drive].track_byte = d86f[drive].track_layout[side][d86f[drive].track_pos] & ~BYTE_IS_FUZZY;
if (d86f[drive].version == 0x0132)
{
d86f[drive].track_byte = d86f[drive].track_layout[side][d86f[drive].track_pos] & ~0x20;
d86f[drive].track_is_hole = d86f[drive].track_layout[side][d86f[drive].track_pos] & 0x20;
}
else
{
d86f[drive].track_is_hole = 0;
}
d86f[drive].track_index = (d86f[drive].track_pos == d86f[drive].index_hole_pos[side]);
d86f[drive].track_fuzzy = d86f[drive].track_layout[side][d86f[drive].track_pos] & BYTE_IS_FUZZY;
if (d86f[drive].track_fuzzy) if (d86f[drive].track_fuzzy && !d86f[drive].track_is_hole)
{
d86f[drive].track_data_byte = disc_random_generate();
}
else
{
d86f[drive].track_data_byte = d86f_read_byte(drive, side);
}
}
else if (d86f[drive].version == 0x0063)
{ {
d86f[drive].track_byte = d86f[drive].track_layout[side][d86f[drive].track_pos] & ~BYTE_INDEX_HOLE; d86f[drive].track_data_byte = disc_random_generate();
d86f[drive].track_index = (d86f[drive].track_pos == 0); }
d86f[drive].track_data_byte = d86f[drive].track_data[side][d86f[drive].track_pos]; else
d86f[drive].track_is_hole = 0; {
d86f[drive].track_fuzzy = 0; d86f[drive].track_data_byte = d86f_read_byte(drive, side);
} }
} }
@@ -1753,18 +1630,9 @@ int d86f_poll_check_notfound(int drive)
} }
} }
int d86f_mark_index_hole(int drive)
{
int temp;
temp = (d86f[drive].version == 0x0100);
temp = temp || (d86f[drive].version == 0x010A);
return temp;
}
void d86f_poll_write(int drive, int side, uint8_t data, uint8_t type) void d86f_poll_write(int drive, int side, uint8_t data, uint8_t type)
{ {
d86f[drive].track_layout[side][d86f[drive].track_pos] = type; d86f[drive].track_layout[side][d86f[drive].track_pos] = type;
if (!d86f[drive].track_pos && d86f_mark_index_hole(drive)) d86f[drive].track_layout[side][d86f[drive].track_pos] |= BYTE_INDEX_HOLE;
d86f_write_byte(drive, side, data); d86f_write_byte(drive, side, data);
} }
@@ -2112,7 +1980,6 @@ void d86f_poll_format(int drive, int side)
case BYTE_GAP1: case BYTE_GAP1:
case BYTE_GAP2: case BYTE_GAP2:
case BYTE_GAP3: case BYTE_GAP3:
case BYTE_GAP4:
if (!disable_write) if (!disable_write)
{ {
d86f_write_byte(drive, side, fdc_is_mfm() ? 0x4E : 0xFF); d86f_write_byte(drive, side, fdc_is_mfm() ? 0x4E : 0xFF);

View File

@@ -441,6 +441,9 @@ void img_seek(int drive, int track)
fread(img[drive].track_data[side], img[drive].sectors * ssize, 1, img[drive].f); fread(img[drive].track_data[side], img[drive].sectors * ssize, 1, img[drive].f);
} }
d86f_reset_index_hole_pos(drive, 0);
d86f_reset_index_hole_pos(drive, 1);
if (!img[drive].xdf_type) if (!img[drive].xdf_type)
{ {
for (side = 0; side < img[drive].sides; side++) for (side = 0; side < img[drive].sides; side++)