181
/* Recognize floppy formats */
182
typedef struct FDFormat {
191
static const FDFormat fd_formats[] = {
192
/* First entry is default format */
193
/* 1.44 MB 3"1/2 floppy disks */
194
{ FDRIVE_DRV_144, FDRIVE_DISK_144, 18, 80, 1, "1.44 MB 3\"1/2", },
195
{ FDRIVE_DRV_144, FDRIVE_DISK_144, 20, 80, 1, "1.6 MB 3\"1/2", },
196
{ FDRIVE_DRV_144, FDRIVE_DISK_144, 21, 80, 1, "1.68 MB 3\"1/2", },
197
{ FDRIVE_DRV_144, FDRIVE_DISK_144, 21, 82, 1, "1.72 MB 3\"1/2", },
198
{ FDRIVE_DRV_144, FDRIVE_DISK_144, 21, 83, 1, "1.74 MB 3\"1/2", },
199
{ FDRIVE_DRV_144, FDRIVE_DISK_144, 22, 80, 1, "1.76 MB 3\"1/2", },
200
{ FDRIVE_DRV_144, FDRIVE_DISK_144, 23, 80, 1, "1.84 MB 3\"1/2", },
201
{ FDRIVE_DRV_144, FDRIVE_DISK_144, 24, 80, 1, "1.92 MB 3\"1/2", },
202
/* 2.88 MB 3"1/2 floppy disks */
203
{ FDRIVE_DRV_288, FDRIVE_DISK_288, 36, 80, 1, "2.88 MB 3\"1/2", },
204
{ FDRIVE_DRV_288, FDRIVE_DISK_288, 39, 80, 1, "3.12 MB 3\"1/2", },
205
{ FDRIVE_DRV_288, FDRIVE_DISK_288, 40, 80, 1, "3.2 MB 3\"1/2", },
206
{ FDRIVE_DRV_288, FDRIVE_DISK_288, 44, 80, 1, "3.52 MB 3\"1/2", },
207
{ FDRIVE_DRV_288, FDRIVE_DISK_288, 48, 80, 1, "3.84 MB 3\"1/2", },
208
/* 720 kB 3"1/2 floppy disks */
209
{ FDRIVE_DRV_144, FDRIVE_DISK_720, 9, 80, 1, "720 kB 3\"1/2", },
210
{ FDRIVE_DRV_144, FDRIVE_DISK_720, 10, 80, 1, "800 kB 3\"1/2", },
211
{ FDRIVE_DRV_144, FDRIVE_DISK_720, 10, 82, 1, "820 kB 3\"1/2", },
212
{ FDRIVE_DRV_144, FDRIVE_DISK_720, 10, 83, 1, "830 kB 3\"1/2", },
213
{ FDRIVE_DRV_144, FDRIVE_DISK_720, 13, 80, 1, "1.04 MB 3\"1/2", },
214
{ FDRIVE_DRV_144, FDRIVE_DISK_720, 14, 80, 1, "1.12 MB 3\"1/2", },
215
/* 1.2 MB 5"1/4 floppy disks */
216
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 15, 80, 1, "1.2 kB 5\"1/4", },
217
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 18, 80, 1, "1.44 MB 5\"1/4", },
218
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 18, 82, 1, "1.48 MB 5\"1/4", },
219
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 18, 83, 1, "1.49 MB 5\"1/4", },
220
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 20, 80, 1, "1.6 MB 5\"1/4", },
221
/* 720 kB 5"1/4 floppy disks */
222
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 9, 80, 1, "720 kB 5\"1/4", },
223
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 11, 80, 1, "880 kB 5\"1/4", },
224
/* 360 kB 5"1/4 floppy disks */
225
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 9, 40, 1, "360 kB 5\"1/4", },
226
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 9, 40, 0, "180 kB 5\"1/4", },
227
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 10, 41, 1, "410 kB 5\"1/4", },
228
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 10, 42, 1, "420 kB 5\"1/4", },
229
/* 320 kB 5"1/4 floppy disks */
230
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 8, 40, 1, "320 kB 5\"1/4", },
231
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 8, 40, 0, "160 kB 5\"1/4", },
232
/* 360 kB must match 5"1/4 better than 3"1/2... */
233
{ FDRIVE_DRV_144, FDRIVE_DISK_720, 9, 80, 0, "360 kB 3\"1/2", },
235
{ FDRIVE_DRV_NONE, FDRIVE_DISK_NONE, -1, -1, 0, NULL, },
238
166
/* Revalidate a disk drive after a disk change */
239
167
static void fd_revalidate(FDrive *drv)
241
const FDFormat *parse;
242
uint64_t nb_sectors, size;
243
int i, first_match, match;
244
169
int nb_heads, max_track, last_sect, ro;
246
172
FLOPPY_DPRINTF("revalidate\n");
247
173
if (drv->bs != NULL && bdrv_is_inserted(drv->bs)) {
248
174
ro = bdrv_is_read_only(drv->bs);
249
bdrv_get_geometry_hint(drv->bs, &nb_heads, &max_track, &last_sect);
175
bdrv_get_floppy_geometry_hint(drv->bs, &nb_heads, &max_track,
176
&last_sect, drv->drive, &drive);
250
177
if (nb_heads != 0 && max_track != 0 && last_sect != 0) {
251
178
FLOPPY_DPRINTF("User defined disk (%d %d %d)",
252
179
nb_heads - 1, max_track, last_sect);
254
bdrv_get_geometry(drv->bs, &nb_sectors);
258
parse = &fd_formats[i];
259
if (parse->drive == FDRIVE_DRV_NONE)
261
if (drv->drive == parse->drive ||
262
drv->drive == FDRIVE_DRV_NONE) {
263
size = (parse->max_head + 1) * parse->max_track *
265
if (nb_sectors == size) {
269
if (first_match == -1)
274
if (first_match == -1)
278
parse = &fd_formats[match];
280
nb_heads = parse->max_head + 1;
281
max_track = parse->max_track;
282
last_sect = parse->last_sect;
283
drv->drive = parse->drive;
284
FLOPPY_DPRINTF("%s floppy disk (%d h %d t %d s) %s\n", parse->str,
285
nb_heads, max_track, last_sect, ro ? "ro" : "rw");
181
FLOPPY_DPRINTF("Floppy disk (%d h %d t %d s) %s\n", nb_heads,
182
max_track, last_sect, ro ? "ro" : "rw");
287
184
if (nb_heads == 1) {
288
185
drv->flags &= ~FDISK_DBL_SIDES;