Added support for the D86F floppy image format I invented that allows things not possible with IMG images;
Applied all mainline PCem commits; Settings dialog now says 86Box instead of PCem; Manifest renamed from PCem to 86Box.
This commit is contained in:
160
src/disc_img.c
160
src/disc_img.c
@@ -22,11 +22,6 @@ static struct
|
||||
uint32_t base;
|
||||
} img[2];
|
||||
|
||||
#if 0
|
||||
static uint8_t xdf_track0[5][3];
|
||||
static uint8_t xdf_spt[5];
|
||||
static uint8_t xdf_map[5][24][3];
|
||||
#endif
|
||||
static uint8_t xdf_track0[3][3];
|
||||
static uint8_t xdf_spt[3];
|
||||
static uint8_t xdf_map[3][24][3];
|
||||
@@ -107,11 +102,7 @@ static int gap3_sizes[5][8][256] = { [0][1][16] = 0x54,
|
||||
/* Needed for formatting! */
|
||||
int img_realtrack(int drive, int track)
|
||||
{
|
||||
#ifdef MAINLINE
|
||||
if ((img[drive].tracks <= 41) && fdd_doublestep_40(drive))
|
||||
#else
|
||||
if ((img[drive].tracks <= 43) && fdd_doublestep_40(drive))
|
||||
#endif
|
||||
track /= 2;
|
||||
|
||||
return track;
|
||||
@@ -119,30 +110,6 @@ int img_realtrack(int drive, int track)
|
||||
|
||||
void img_writeback(int drive, int track);
|
||||
|
||||
static int img_sector_size_code(int drive)
|
||||
{
|
||||
switch(img[drive].sector_size)
|
||||
{
|
||||
case 128:
|
||||
return 0;
|
||||
case 256:
|
||||
return 1;
|
||||
default:
|
||||
case 512:
|
||||
return 2;
|
||||
case 1024:
|
||||
return 3;
|
||||
case 2048:
|
||||
return 4;
|
||||
case 4096:
|
||||
return 5;
|
||||
case 8192:
|
||||
return 6;
|
||||
case 16384:
|
||||
return 7;
|
||||
}
|
||||
}
|
||||
|
||||
static int sector_size_code(int sector_size)
|
||||
{
|
||||
switch(sector_size)
|
||||
@@ -167,6 +134,11 @@ static int sector_size_code(int sector_size)
|
||||
}
|
||||
}
|
||||
|
||||
static int img_sector_size_code(int drive)
|
||||
{
|
||||
return sector_size_code(img[drive].sector_size);
|
||||
}
|
||||
|
||||
void img_init()
|
||||
{
|
||||
memset(img, 0, sizeof(img));
|
||||
@@ -220,24 +192,6 @@ static void initialize_xdf_maps()
|
||||
add_to_map(xdf_map[2][6], 1, 2, 5);
|
||||
add_to_map(xdf_map[2][7], 1, 3, 7);
|
||||
|
||||
#if 0
|
||||
// XXDF 3.5" 2HD
|
||||
add_to_map(xdf_track0[3], 12, 20, 4);
|
||||
xdf_spt[3] = 2;
|
||||
add_to_map(xdf_map[3][0], 0, 0, 5);
|
||||
add_to_map(xdf_map[3][1], 1, 1, 6);
|
||||
add_to_map(xdf_map[3][2], 0, 1, 6);
|
||||
add_to_map(xdf_map[3][3], 1, 0, 5);
|
||||
|
||||
// XXDF 3.5" 2ED
|
||||
add_to_map(xdf_track0[4], 21, 39, 9);
|
||||
xdf_spt[4] = 2;
|
||||
add_to_map(xdf_map[4][0], 0, 0, 6);
|
||||
add_to_map(xdf_map[4][1], 1, 1, 7);
|
||||
add_to_map(xdf_map[4][2], 0, 1, 7);
|
||||
add_to_map(xdf_map[4][3], 1, 0, 6);
|
||||
#endif
|
||||
|
||||
xdf_maps_initialized = 1;
|
||||
}
|
||||
|
||||
@@ -485,19 +439,9 @@ void img_load(int drive, char *fn)
|
||||
img[drive].xdf_type = 2;
|
||||
pclog("XDF type is 2 @ %i kbps\n", bit_rate_300);
|
||||
break;
|
||||
#if 0
|
||||
case 24: /* High density XXDF @ 300 rpm */
|
||||
img[drive].xdf_type = 4;
|
||||
break;
|
||||
#endif
|
||||
case 46: /* Extended density XDF */
|
||||
img[drive].xdf_type = 3;
|
||||
break;
|
||||
#if 0
|
||||
case 48: /* Extended density XXDF */
|
||||
img[drive].xdf_type = 5;
|
||||
break;
|
||||
#endif
|
||||
default: /* Unknown, as we're beyond maximum sectors, get out */
|
||||
fclose(img[drive].f);
|
||||
return;
|
||||
@@ -516,24 +460,13 @@ void img_load(int drive, char *fn)
|
||||
}
|
||||
|
||||
gap2_size[drive] = (temp_rate == 3) ? 41 : 22;
|
||||
pclog("GAP2 size: %i bytes\n", gap2_size[drive]);
|
||||
// pclog("GAP2 size: %i bytes\n", gap2_size[drive]);
|
||||
gap3_size[drive] = gap3_sizes[temp_rate][sector_size_code(img[drive].sector_size)][img[drive].sectors];
|
||||
if (gap3_size)
|
||||
if (!gap3_size[drive])
|
||||
{
|
||||
pclog("GAP3 size: %i bytes\n", gap3_size[drive]);
|
||||
}
|
||||
else
|
||||
{
|
||||
// fclose(img[drive].f);
|
||||
gap3_size[drive] = 40;
|
||||
pclog("WARNING: Floppy image of unknown format was inserted into drive %c:!\n", drive + 0x41);
|
||||
}
|
||||
gap4_size[drive] = raw_tsize[drive] - (((pre_gap + gap2_size[drive] + pre_data + img[drive].sector_size + post_gap + gap3_size[drive]) * img[drive].sectors) + pre_track);
|
||||
pclog("GAP4 size: %i bytes\n", gap4_size[drive]);
|
||||
if (img[drive].xdf_type)
|
||||
{
|
||||
gap4_size[drive] = 1;
|
||||
}
|
||||
|
||||
if (bit_rate_300 == 250)
|
||||
{
|
||||
@@ -592,13 +525,13 @@ int img_hole(int drive)
|
||||
return img[drive].hole;
|
||||
}
|
||||
|
||||
int img_byteperiod(int drive)
|
||||
double img_byteperiod(int drive)
|
||||
{
|
||||
if (img[drive].byte_period == 29)
|
||||
{
|
||||
return (fdd_get_type(drive) & 1) ? 32 : 26;
|
||||
return (fdd_get_type(drive) & 1) ? 32.0 : (160.0 / 6.0);
|
||||
}
|
||||
return img[drive].byte_period;
|
||||
return (double) img[drive].byte_period;
|
||||
}
|
||||
|
||||
void img_close(int drive)
|
||||
@@ -621,11 +554,7 @@ void img_seek(int drive, int track)
|
||||
return;
|
||||
// pclog("Seek drive=%i track=%i sectors=%i sector_size=%i sides=%i\n", drive, track, img[drive].sectors,img[drive].sector_size, img[drive].sides);
|
||||
// pclog(" %i %i\n", drive_type[drive], img[drive].tracks);
|
||||
#ifdef MAINLINE
|
||||
if ((img[drive].tracks <= 41) && fdd_doublestep_40(drive))
|
||||
#else
|
||||
if ((img[drive].tracks <= 43) && fdd_doublestep_40(drive))
|
||||
#endif
|
||||
track /= 2;
|
||||
|
||||
// pclog("Disk seeked to track %i\n", track);
|
||||
@@ -666,7 +595,7 @@ void img_seek(int drive, int track)
|
||||
sr = xdf_track0_layout[current_xdft][sector] >> 8;
|
||||
spos = current_pos;
|
||||
sside = 0;
|
||||
if (spos > (img[drive].sectors * img[drive].sector_size))
|
||||
if (spos >= (img[drive].sectors * img[drive].sector_size))
|
||||
{
|
||||
spos -= (img[drive].sectors * img[drive].sector_size);
|
||||
sside = 1;
|
||||
@@ -677,67 +606,6 @@ void img_seek(int drive, int track)
|
||||
}
|
||||
current_pos += 512;
|
||||
}
|
||||
#if 0
|
||||
/* Track 0, register sectors according to track 0 map. */
|
||||
/* First, the "Side 0" buffer, will also contain one sector from side 1. */
|
||||
current_pos = 0;
|
||||
for (sector = 0; sector < sectors_fat; sector++)
|
||||
{
|
||||
if ((sector+0x81) >= 0x91)
|
||||
{
|
||||
disc_sector_add(drive, 0, track, 0, sector+0x85, 2,
|
||||
img[drive].bitcell_period_300rpm,
|
||||
&img[drive].track_data[0][current_pos]);
|
||||
}
|
||||
else
|
||||
{
|
||||
disc_sector_add(drive, 0, track, 0, sector+0x81, 2,
|
||||
img[drive].bitcell_period_300rpm,
|
||||
&img[drive].track_data[0][current_pos]);
|
||||
}
|
||||
current_pos += 512;
|
||||
}
|
||||
disc_sector_add(drive, 1, track, 1, 0x81, 2,
|
||||
img[drive].bitcell_period_300rpm,
|
||||
&img[drive].track_data[0][current_pos]);
|
||||
current_pos += 512;
|
||||
for (sector = 0; sector < 7; sector++)
|
||||
{
|
||||
disc_sector_add(drive, 0, track, 0, sector+1, 2,
|
||||
img[drive].bitcell_period_300rpm,
|
||||
&img[drive].track_data[0][current_pos]);
|
||||
current_pos += 512;
|
||||
}
|
||||
disc_sector_add(drive, 0, track, 0, 0x9B, 2,
|
||||
img[drive].bitcell_period_300rpm,
|
||||
&img[drive].track_data[0][current_pos]);
|
||||
current_pos += 512;
|
||||
disc_sector_add(drive, 0, track, 0, 0x9C, 2,
|
||||
img[drive].bitcell_period_300rpm,
|
||||
&img[drive].track_data[0][current_pos]);
|
||||
current_pos += 512;
|
||||
disc_sector_add(drive, 0, track, 0, 0x9D, 2,
|
||||
img[drive].bitcell_period_300rpm,
|
||||
&img[drive].track_data[0][current_pos]);
|
||||
current_pos += 512;
|
||||
disc_sector_add(drive, 0, track, 0, 0x9E, 2,
|
||||
img[drive].bitcell_period_300rpm,
|
||||
&img[drive].track_data[0][current_pos]);
|
||||
current_pos += 512;
|
||||
/* Now the "Side 1" buffer, will also contain one sector from side 0. */
|
||||
current_pos = 0;
|
||||
for (sector = 0; (sector < effective_sectors - 1); sector++)
|
||||
{
|
||||
disc_sector_add(drive, 1, track, 1, sector+0x82, 2,
|
||||
img[drive].bitcell_period_300rpm,
|
||||
&img[drive].track_data[1][current_pos]);
|
||||
current_pos += 512;
|
||||
}
|
||||
disc_sector_add(drive, 0, track, 0, 8, 2,
|
||||
img[drive].bitcell_period_300rpm,
|
||||
&img[drive].track_data[1][current_pos]);
|
||||
current_pos += 512;
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -776,7 +644,7 @@ void img_seek(int drive, int track)
|
||||
}
|
||||
for (side = img[drive].sides - 1; side >= 0; side--)
|
||||
{
|
||||
disc_sector_prepare_track_layout(drive, side);
|
||||
disc_sector_prepare_track_layout(drive, side, track);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -801,3 +669,7 @@ void img_writeback(int drive, int track)
|
||||
}
|
||||
}
|
||||
|
||||
int img_xdf_type(int drive)
|
||||
{
|
||||
return img[drive].xdf_type;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user