summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2012-01-23 21:49:30 +0000
committer Olivier Galibert <galibert@pobox.com>2012-01-23 21:49:30 +0000
commitafb7d8fb6a595531c75d898cbdba6f3cffffcab5 (patch)
treeaf1fdf2d2acd27b4eae9eb2ad45102039db7688a /src/lib
parent2cad56dabbceaa7c7bb1cbe68e22b381a277beb4 (diff)
floppy: Do specific UI handling [O. Galibert]
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/formats/dfi_dsk.c2
-rw-r--r--src/lib/formats/flopimg.c40
-rw-r--r--src/lib/formats/flopimg.h6
-rw-r--r--src/lib/formats/mfi_dsk.c6
4 files changed, 49 insertions, 5 deletions
diff --git a/src/lib/formats/dfi_dsk.c b/src/lib/formats/dfi_dsk.c
index 18ec4785aa6..5b3a17f7c0f 100644
--- a/src/lib/formats/dfi_dsk.c
+++ b/src/lib/formats/dfi_dsk.c
@@ -23,7 +23,7 @@ const char *dfi_format::extensions() const
bool dfi_format::supports_save() const
{
- return true;
+ return false;
}
int dfi_format::identify(io_generic *io, UINT32 form_factor)
diff --git a/src/lib/formats/flopimg.c b/src/lib/formats/flopimg.c
index 24a1aa7f0f9..1f59988601d 100644
--- a/src/lib/formats/flopimg.c
+++ b/src/lib/formats/flopimg.c
@@ -1008,6 +1008,18 @@ void floppy_image::ensure_alloc(int track, int head)
}
}
+const char *floppy_image::get_variant_name(UINT32 form_factor, UINT32 variant)
+{
+ switch(variant) {
+ case SSSD: return "Single side, single density";
+ case SSDD: return "Single side, double density";
+ case DSDD: return "Double side, double density";
+ case DSHD: return "Double side, high density";
+ case DSED: return "Double side, extended density";
+ }
+ return "Unknown";
+}
+
floppy_image_format_t::floppy_image_format_t()
{
next = 0;
@@ -1030,6 +1042,27 @@ bool floppy_image_format_t::save(io_generic *, floppy_image *)
return false;
}
+bool floppy_image_format_t::extension_matches(const char *file_name) const
+{
+ const char *ext = strrchr(file_name, '.');
+ if(!ext)
+ return false;
+ ext++;
+ int elen = strlen(ext);
+ const char *rext = extensions();
+ for(;;) {
+ const char *next = strchr(rext, ',');
+ int rlen = next ? next - rext : strlen(rext);
+ if(rlen == elen && !memcmp(ext, rext, rlen))
+ return true;
+ if(next)
+ rext = next+1;
+ else
+ break;
+ }
+ return false;
+}
+
bool floppy_image_format_t::type_no_data(int type) const
{
return type == CRC_CCITT_START ||
@@ -2178,6 +2211,11 @@ void floppy_image_format_t::get_geometry_mfm_pc(floppy_image *image, int cell_si
{
image->get_actual_geometry(track_count, head_count);
+ if(!track_count) {
+ sector_count = 0;
+ return;
+ }
+
UINT8 bitstream[500000/8];
UINT8 sectdata[50000];
desc_xs sectors[256];
@@ -2190,7 +2228,7 @@ void floppy_image_format_t::get_geometry_mfm_pc(floppy_image *image, int cell_si
// 0-10, not near the end like 70+, no special effects on sync
// like 33
- generate_bitstream_from_track(20, 0, cell_size, bitstream, track_size, image);
+ generate_bitstream_from_track(track_count > 20 ? 20 : 0, 0, cell_size, bitstream, track_size, image);
extract_sectors_from_bitstream_mfm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata));
for(sector_count = 44; sector_count > 0 && !sectors[sector_count].data; sector_count--);
diff --git a/src/lib/formats/flopimg.h b/src/lib/formats/flopimg.h
index 40467798539..5b1bffb3a0e 100644
--- a/src/lib/formats/flopimg.h
+++ b/src/lib/formats/flopimg.h
@@ -237,6 +237,8 @@ public:
floppy_image_format_t *next;
void append(floppy_image_format_t *_next);
+ bool extension_matches(const char *file_name) const;
+
protected:
// Input for convert_to_edge
enum {
@@ -522,6 +524,8 @@ public:
// Variants
enum {
+ SSSD = 0x44535353, // "SSSD",
+ SSDD = 0x44445353, // "DSSD",
DSDD = 0x44445344, // "DSDD",
DSHD = 0x44485344, // "DSHD",
DSED = 0x44455344, // "DSED",
@@ -543,6 +547,8 @@ public:
void get_maximal_geometry(int &tracks, int &heads);
void get_actual_geometry(int &tracks, int &heads);
+ static const char *get_variant_name(UINT32 form_factor, UINT32 variant);
+
private:
enum {
MAX_FLOPPY_HEADS = 2,
diff --git a/src/lib/formats/mfi_dsk.c b/src/lib/formats/mfi_dsk.c
index e4849587a17..1bfd2135413 100644
--- a/src/lib/formats/mfi_dsk.c
+++ b/src/lib/formats/mfi_dsk.c
@@ -95,9 +95,9 @@ int mfi_format::identify(io_generic *io, UINT32 form_factor)
io_generic_read(io, &h, 0, sizeof(header));
if(memcmp( h.sign, sign, 16 ) == 0 &&
- h.cyl_count > 0 && h.cyl_count <= 84 &&
- h.head_count > 0 && h.head_count <= 2 &&
- h.form_factor == form_factor)
+ h.cyl_count <= 160 &&
+ h.head_count <= 2 &&
+ (!form_factor || h.form_factor == form_factor))
return 100;
return 0;
}