diff options
author | 2012-01-23 21:49:30 +0000 | |
---|---|---|
committer | 2012-01-23 21:49:30 +0000 | |
commit | afb7d8fb6a595531c75d898cbdba6f3cffffcab5 (patch) | |
tree | af1fdf2d2acd27b4eae9eb2ad45102039db7688a /src/lib | |
parent | 2cad56dabbceaa7c7bb1cbe68e22b381a277beb4 (diff) |
floppy: Do specific UI handling [O. Galibert]
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/formats/dfi_dsk.c | 2 | ||||
-rw-r--r-- | src/lib/formats/flopimg.c | 40 | ||||
-rw-r--r-- | src/lib/formats/flopimg.h | 6 | ||||
-rw-r--r-- | src/lib/formats/mfi_dsk.c | 6 |
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; } |