From 15604c6fc1858da5c2c5280a06fc126d95920854 Mon Sep 17 00:00:00 2001 From: Curt Coder Date: Mon, 7 Jan 2013 18:23:45 +0000 Subject: Added FM encoding support to flopimg and wd17xx_dsk. [Curt Coder] --- src/lib/formats/adam_dsk.c | 10 ++-- src/lib/formats/comx35_dsk.c | 124 ++++++++++-------------------------------- src/lib/formats/d81_dsk.c | 2 +- src/lib/formats/flopimg.c | 47 +++++++++++++++- src/lib/formats/flopimg.h | 17 +++++- src/lib/formats/smx_dsk.c | 4 +- src/lib/formats/tiki100_dsk.c | 10 ++-- src/lib/formats/tvc_dsk.c | 4 +- src/lib/formats/wd177x_dsk.c | 97 +++++++++++++++++++++++++++++---- src/lib/formats/wd177x_dsk.h | 5 +- 10 files changed, 198 insertions(+), 122 deletions(-) diff --git a/src/lib/formats/adam_dsk.c b/src/lib/formats/adam_dsk.c index c763cea3d48..c041890dc53 100644 --- a/src/lib/formats/adam_dsk.c +++ b/src/lib/formats/adam_dsk.c @@ -64,23 +64,23 @@ const char *adam_format::extensions() const // Unverified gap sizes const adam_format::format adam_format::formats[] = { { /* 160K 5 1/4 inch double density single sided */ - floppy_image::FF_525, floppy_image::SSDD, + floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM, 2000, 8, 40, 1, 512, {}, 1, {}, 100, 22, 84 }, { /* 320K 5 1/4 inch double density */ - floppy_image::FF_525, floppy_image::DSDD, + floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM, 2000, 8, 40, 2, 512, {}, 1, {}, 100, 22, 84 }, { /* 640K 5 1/4 inch quad density */ - floppy_image::FF_525, floppy_image::DSQD, + floppy_image::FF_525, floppy_image::DSQD, floppy_image::MFM, 2000, 8, 80, 2, 512, {}, 1, {}, 100, 22, 84 }, { /* 720K 3 1/2 inch double density */ - floppy_image::FF_35, floppy_image::DSDD, + floppy_image::FF_35, floppy_image::DSDD, floppy_image::MFM, 2000, 9, 80, 2, 512, {}, 1, {}, 100, 22, 84 }, { /* 1440K 3 1/2 inch high density */ - floppy_image::FF_35, floppy_image::DSHD, + floppy_image::FF_35, floppy_image::DSHD, floppy_image::MFM, 1000, 18, 80, 2, 512, {}, 1, {}, 100, 22, 84 }, {} diff --git a/src/lib/formats/comx35_dsk.c b/src/lib/formats/comx35_dsk.c index 182c99d83bf..41f1732e55a 100644 --- a/src/lib/formats/comx35_dsk.c +++ b/src/lib/formats/comx35_dsk.c @@ -43,7 +43,27 @@ TODO: - - implement 70 track image detection + - implement 70 track image detection (first byte of file = 0x01 -> single sided) + - format double sided, single track density + + :exp:fd:wd1770: track description + 40xff 6x00 + fe 4x00 f7 17x00 fb 128x00 f7 17x00 + fe 2x00 07 00 f7 17x00 fb 128x00 f7 17x00 + fe 2x00 0e 00 f7 17x00 fb 128x00 f7 16x00 + fe 2x00 05 00 f7 17x00 fb 128x00 f7 17x00 + fe 2x00 0c 00 f7 17x00 fb 128x00 f7 16x00 + fe 2x00 03 00 f7 17x00 fb 128x00 f7 17x00 + fe 2x00 0a 00 f7 17x00 fb 128x00 f7 16x00 + fe 2x00 01 00 f7 17x00 fb 128x00 f7 17x00 + fe 2x00 08 00 f7 17x00 fb 128x00 f7 17x00 + fe 2x00 0f 00 f7 17x00 fb 128x00 f7 16x00 + fe 2x00 06 00 f7 17x00 fb 128x00 f7 17x00 + fe 2x00 0d 00 f7 17x00 fb 128x00 f7 16x00 + fe 2x00 04 00 f7 17x00 fb 128x00 f7 17x00 + fe 2x00 0b 00 f7 17x00 fb 128x00 f7 16x00 + fe 2x00 02 00 f7 17x00 fb 128x00 f7 17x00 + fe 2x00 09 00 f7 17x00 fb 128x00 f7 3476x00 */ @@ -71,103 +91,19 @@ const char *comx35_format::extensions() const // Unverified gap sizes const comx35_format::format comx35_format::formats[] = { - { // 70K 5 1/4 inch single density single sided 35 tracks - floppy_image::FF_525, floppy_image::SSSD, - 2000, 16, 35, 1, 128, {}, 0, {}, 100, 22, 84 + { // 70K 5 1/4 inch single density, single sided, 35 tracks + floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM, + 4000, 16, 35, 1, 128, {}, -1, { 0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9 }, 40, 11, 10 }, - { // 140K 5 1/4 inch single density double sided 35 tracks - floppy_image::FF_525, floppy_image::DSSD, - 2000, 16, 35, 2, 128, {}, 0, {}, 100, 22, 84 + { // 140K 5 1/4 inch single density, double sided, 35 tracks + floppy_image::FF_525, floppy_image::DSSD, floppy_image::FM, + 4000, 16, 35, 2, 128, {}, -1, { 0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9 }, 40, 11, 10 }, - /*{ // 140K 5 1/4 inch quad density single sided 70 tracks - floppy_image::FF_525, floppy_image::SSQD, - 2000, 16, 70, 1, 128, {}, 0, {}, 100, 22, 84 + /*{ // 140K 5 1/4 inch single density, double track density, single sided, 70 tracks + floppy_image::FF_525, floppy_image::SSQD, floppy_image::FM, + 4000, 16, 70, 1, 128, {}, -1, { 0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9 }, 40, 11, 10 },*/ {} }; const floppy_format_type FLOPPY_COMX35_FORMAT = &floppy_image_format_creator; - - -#ifdef UNUSED_CODE - -/********************************************************************* - - formats/comx35_dsk.c - - COMX35 disk images - -*********************************************************************/ - -#include "formats/comx35_dsk.h" -#include "formats/basicdsk.h" - -/*************************************************************************** - IMPLEMENTATION -***************************************************************************/ - -/*------------------------------------------------- - FLOPPY_IDENTIFY( comx35_dsk_identify ) --------------------------------------------------*/ - -static FLOPPY_IDENTIFY( comx35_dsk_identify ) -{ - *vote = ((floppy_image_size(floppy) == (35*1*16*128)) || (floppy_image_size(floppy) == (35*2*16*128))) ? 100 : 0; - - return FLOPPY_ERROR_SUCCESS; -} - -/*------------------------------------------------- - FLOPPY_CONSTRUCT( comx35_dsk_construct ) --------------------------------------------------*/ - -static FLOPPY_CONSTRUCT( comx35_dsk_construct ) -{ - UINT8 header[1]; - int heads = 1; - int cylinders = 35; - - switch (floppy_image_size(floppy)) - { - case 35*1*16*128: - heads = 1; - cylinders = 35; - break; - - case 35*2*16*128: - floppy_image_read(floppy, header, 0x12, 1); - - if (header[0] == 0x01) - { - heads = 1; - cylinders = 70; - } - else - { - heads = 2; - cylinders = 35; - } - break; - } - - struct basicdsk_geometry geometry; - memset(&geometry, 0, sizeof(geometry)); - - geometry.heads = heads; - geometry.first_sector_id = 0; - geometry.sector_length = 128; - geometry.tracks = cylinders; - geometry.sectors = 16; - - return basicdsk_construct(floppy, &geometry); -} - -/*------------------------------------------------- - FLOPPY_OPTIONS( comx35 ) --------------------------------------------------*/ - -LEGACY_FLOPPY_OPTIONS_START( comx35 ) - LEGACY_FLOPPY_OPTION( comx35, "img", "COMX35 floppy disk image", comx35_dsk_identify, comx35_dsk_construct, NULL, NULL ) -LEGACY_FLOPPY_OPTIONS_END - -#endif diff --git a/src/lib/formats/d81_dsk.c b/src/lib/formats/d81_dsk.c index 5f33e7fc0c5..95afc2d58fd 100644 --- a/src/lib/formats/d81_dsk.c +++ b/src/lib/formats/d81_dsk.c @@ -129,7 +129,7 @@ const char *d81_format::extensions() const // Unverified gap sizes const d81_format::format d81_format::formats[] = { { - floppy_image::FF_35, floppy_image::DSDD, + floppy_image::FF_35, floppy_image::DSDD, floppy_image::MFM, 2000, 10, 80, 2, 512, {}, 1, {}, 32, 22, 35 }, {} diff --git a/src/lib/formats/flopimg.c b/src/lib/formats/flopimg.c index 7da5973d012..591ad67c749 100644 --- a/src/lib/formats/flopimg.c +++ b/src/lib/formats/flopimg.c @@ -1102,6 +1102,7 @@ bool floppy_image_format_t::extension_matches(const char *file_name) const bool floppy_image_format_t::type_no_data(int type) const { return type == CRC_CCITT_START || + type == CRC_CCITT_FM_START || type == CRC_AMIGA_START || type == CRC_MACHEAD_START || type == CRC_END || @@ -1115,7 +1116,7 @@ bool floppy_image_format_t::type_data_mfm(int type, int p1, const gen_crc_info * return !type_no_data(type) && type != RAW && type != RAWBITS && - (type != CRC || (crcs[p1].type != CRC_CCITT && crcs[p1].type != CRC_AMIGA)); + (type != CRC || (crcs[p1].type != CRC_CCITT && crcs[p1].type != CRC_CCITT_FM && crcs[p1].type != CRC_AMIGA)); } void floppy_image_format_t::collect_crcs(const desc_e *desc, gen_crc_info *crcs) @@ -1129,6 +1130,9 @@ void floppy_image_format_t::collect_crcs(const desc_e *desc, gen_crc_info *crcs) case CRC_CCITT_START: crcs[desc[i].p1].type = CRC_CCITT; break; + case CRC_CCITT_FM_START: + crcs[desc[i].p1].type = CRC_CCITT_FM; + break; case CRC_AMIGA_START: crcs[desc[i].p1].type = CRC_AMIGA; break; @@ -1149,6 +1153,7 @@ int floppy_image_format_t::crc_cells_size(int type) const { switch(type) { case CRC_CCITT: return 32; + case CRC_CCITT_FM: return 32; case CRC_AMIGA: return 64; case CRC_MACHEAD: return 8; default: return 0; @@ -1242,6 +1247,12 @@ void floppy_image_format_t::fixup_crc_ccitt(UINT32 *buffer, const gen_crc_info * mfm_w(buffer, offset, 16, calc_crc_ccitt(buffer, crc->start, crc->end)); } +void floppy_image_format_t::fixup_crc_ccitt_fm(UINT32 *buffer, const gen_crc_info *crc) +{ + int offset = crc->write; + fm_w(buffer, offset, 16, calc_crc_ccitt(buffer, crc->start, crc->end)); +} + void floppy_image_format_t::fixup_crc_machead(UINT32 *buffer, const gen_crc_info *crc) { UINT8 v = 0; @@ -1258,6 +1269,7 @@ void floppy_image_format_t::fixup_crcs(UINT32 *buffer, gen_crc_info *crcs) switch(crcs[i].type) { case CRC_AMIGA: fixup_crc_amiga(buffer, crcs+i); break; case CRC_CCITT: fixup_crc_ccitt(buffer, crcs+i); break; + case CRC_CCITT_FM: fixup_crc_ccitt_fm(buffer, crcs+i); break; case CRC_MACHEAD: fixup_crc_machead(buffer, crcs+i); break; } if(crcs[i].fixup_mfm_clock) { @@ -1339,6 +1351,11 @@ void floppy_image_format_t::generate_track(const desc_e *desc, int track, int he while(desc[index].type != END) { // printf("%d.%d.%d (%d) - %d %d\n", desc[index].type, desc[index].p1, desc[index].p2, index, offset, offset/8); switch(desc[index].type) { + case FM: + for(int i=0; i 128; size >>=1, id++); + fm_w(buffer, offset, 8, id); + break; + } + case SECTOR_INFO_GCR6: raw_w(buffer, offset, 8, gcr6fw_tb[sect[sector_idx].sector_info]); break; @@ -1446,6 +1483,7 @@ void floppy_image_format_t::generate_track(const desc_e *desc, int track, int he case CRC_AMIGA_START: case CRC_CCITT_START: + case CRC_CCITT_FM_START: case CRC_MACHEAD_START: crcs[desc[index].p1].start = offset; break; @@ -1466,6 +1504,13 @@ void floppy_image_format_t::generate_track(const desc_e *desc, int track, int he break; } + case SECTOR_DATA_FM: { + const desc_s *csect = sect + (desc[index].p1 >= 0 ? desc[index].p1 : sector_idx); + for(int i=0; i != csect->size; i++) + fm_w(buffer, offset, 8, csect->data[i]); + break; + } + case SECTOR_DATA_O: { const desc_s *csect = sect + (desc[index].p1 >= 0 ? desc[index].p1 : sector_idx); for(int i=0; i != csect->size; i++) diff --git a/src/lib/formats/flopimg.h b/src/lib/formats/flopimg.h index c9a39dddbfe..d2097db49a8 100644 --- a/src/lib/formats/flopimg.h +++ b/src/lib/formats/flopimg.h @@ -301,18 +301,23 @@ protected: //! Opcodes of the format description language used by generate_track() enum { END, //!< End of description + FM, //!< One byte in p1 to be fm-encoded, msb first, repeated p2 times MFM, //!< One byte in p1 to be mfm-encoded, msb first, repeated p2 times MFMBITS, //!< A value of p2 bits in p1 to be mfm-encoded, msb first RAW, //!< One 16 bits word in p1 to be written raw, msb first, repeated p2 times RAWBITS, //!< A value of p2 bits in p1 to be copied as-is, msb first TRACK_ID, //!< Track id byte, mfm-encoded + TRACK_ID_FM, //!< Track id byte, fm-encoded TRACK_ID_GCR6, //!< Track id low 6 bits, gcr6-encoded HEAD_ID, //!< Head id byte, mfm-encoded + HEAD_ID_FM, //!< Head id byte, fm-encoded HEAD_ID_SWAP, //!< Head id byte swapped (0->1, 1->0), mfm-encoded TRACK_HEAD_ID_GCR6, //!< Track id 7th bit + head, gc6-encoded SECTOR_ID, //!< Sector id byte, mfm-encoded + SECTOR_ID_FM, //!< Sector id byte, fm-encoded SECTOR_ID_GCR6, //!< Sector id byte, gcr6-encoded SIZE_ID, //!< Sector size code on one byte [log2(size/128)], mfm-encoded + SIZE_ID_FM, //!< Sector size code on one byte [log2(size/128)], fm-encoded SECTOR_INFO_GCR6, //!< Sector info byte, gcr6-encoded OFFSET_ID_O, //!< Offset (track*2+head) byte, odd bits, mfm-encoded OFFSET_ID_E, //!< Offset (track*2+head) byte, even bits, mfm-encoded @@ -322,11 +327,13 @@ protected: REMAIN_E, //!< Remaining sector count, even bits, mfm-encoded, total sector count in p1 SECTOR_DATA, //!< Sector data to mfm-encode, which in p1, -1 for the current one per the sector id + SECTOR_DATA_FM, //!< Sector data to fm-encode, which in p1, -1 for the current one per the sector id SECTOR_DATA_O, //!< Sector data to mfm-encode, odd bits only, which in p1, -1 for the current one per the sector id SECTOR_DATA_E, //!< Sector data to mfm-encode, even bits only, which in p1, -1 for the current one per the sector id SECTOR_DATA_MAC, //!< Transformed sector data + checksum, mac style, id in p1, -1 for the current one per the sector id CRC_CCITT_START, //!< Start a CCITT CRC calculation, with the usual x^16 + x^12 + x^5 + 1 (11021) polynomial, p1 = crc id + CRC_CCITT_FM_START, //!< Start a CCITT CRC calculation, with the usual x^16 + x^12 + x^5 + 1 (11021) polynomial, p1 = crc id CRC_AMIGA_START, //!< Start an amiga checksum calculation, p1 = crc id CRC_MACHEAD_START, //!< Start of the mac gcr6 sector header checksum calculation (xor of pre-encode 6-bits values, gcr6-encoded) CRC_END, //!< End the checksum, p1 = crc id @@ -542,7 +549,7 @@ protected: void gcr6_decode(UINT8 e0, UINT8 e1, UINT8 e2, UINT8 e3, UINT8 &va, UINT8 &vb, UINT8 &vc); private: - enum { CRC_NONE, CRC_AMIGA, CRC_CCITT, CRC_MACHEAD }; + enum { CRC_NONE, CRC_AMIGA, CRC_CCITT, CRC_CCITT_FM, CRC_MACHEAD }; enum { MAX_CRC_COUNT = 64 }; //! Holds data used internally for generating CRCs. @@ -560,6 +567,7 @@ private: int crc_cells_size(int type) const; void fixup_crc_amiga(UINT32 *buffer, const gen_crc_info *crc); void fixup_crc_ccitt(UINT32 *buffer, const gen_crc_info *crc); + void fixup_crc_ccitt_fm(UINT32 *buffer, const gen_crc_info *crc); void fixup_crc_machead(UINT32 *buffer, const gen_crc_info *crc); void fixup_crcs(UINT32 *buffer, gen_crc_info *crcs); void collect_crcs(const desc_e *desc, gen_crc_info *crcs); @@ -651,6 +659,13 @@ public: DSED = 0x44455344, //!< "DSED", Double-sided extra-density (2880K) }; + //! Encodings + enum { + FM = 0x2020464D, //!< " FM", frequency modulation + MFM = 0x204D464D, //!< " MFM", modified frequency modulation + M2FM = 0x4D32464D, //!< "M2FM", modified modified frequency modulation + }; + // construction/destruction diff --git a/src/lib/formats/smx_dsk.c b/src/lib/formats/smx_dsk.c index ecb1370b506..bb189169c93 100644 --- a/src/lib/formats/smx_dsk.c +++ b/src/lib/formats/smx_dsk.c @@ -65,11 +65,11 @@ const char *smx_format::extensions() const const smx_format::format smx_format::formats[] = { { // Specialist MX/Orion/B2M disk image - floppy_image::FF_525, floppy_image::DSQD, + floppy_image::FF_525, floppy_image::DSQD, floppy_image::MFM, 2000, 5, 80, 2, 1024, {}, 1, {}, 100, 22, 20 }, { // Lucksian Key Orion disk image - floppy_image::FF_525, floppy_image::DSQD, + floppy_image::FF_525, floppy_image::DSQD, floppy_image::MFM, 2000, 9, 80, 2, 512, {}, 1, {}, 100, 22, 20 }, {} diff --git a/src/lib/formats/tiki100_dsk.c b/src/lib/formats/tiki100_dsk.c index 236198ddc33..714cf1328da 100644 --- a/src/lib/formats/tiki100_dsk.c +++ b/src/lib/formats/tiki100_dsk.c @@ -65,19 +65,19 @@ const char *tiki100_format::extensions() const // double sided disks have t0s0,t0s1,t1s0,t1s1... format const tiki100_format::format tiki100_format::formats[] = { { // 90K 5 1/4 inch single density single sided - floppy_image::FF_525, floppy_image::SSSD, - 2000, 18, 40, 1, 128, {}, 1, {}, 80, 22, 20 + floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM, + 4000, 18, 40, 1, 128, {}, 1, {}, 80, 22, 20 }, { // 200K 5 1/4 inch double density single sided - floppy_image::FF_525, floppy_image::SSDD, + floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM, 2000, 10, 40, 1, 512, {}, -1, { 1,6,2,7,3,8,4,9,5,10 }, 80, 22, 20 }, { // 400K 5 1/4 inch double density - floppy_image::FF_525, floppy_image::DSDD, + floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM, 2000, 10, 40, 2, 512, {}, -1, { 1,6,2,7,3,8,4,9,5,10 }, 80, 22, 20 }, { // 800K 5 1/4 inch quad density - floppy_image::FF_525, floppy_image::DSQD, + floppy_image::FF_525, floppy_image::DSQD, floppy_image::MFM, 2000, 10, 80, 2, 512, {}, -1, { 1,6,2,7,3,8,4,9,5,10 }, 80, 22, 20 }, {} diff --git a/src/lib/formats/tvc_dsk.c b/src/lib/formats/tvc_dsk.c index b820a706c5b..a9af116c038 100644 --- a/src/lib/formats/tvc_dsk.c +++ b/src/lib/formats/tvc_dsk.c @@ -65,11 +65,11 @@ const char *tvc_format::extensions() const const tvc_format::format tvc_format::formats[] = { { // 720K 5.25 inch - floppy_image::FF_525, floppy_image::DSQD, + floppy_image::FF_525, floppy_image::DSQD, floppy_image::MFM, 2000, 9, 80, 2, 512, {}, 1, {}, 100, 22, 20 }, { // 360K 5.25 inch - floppy_image::FF_525, floppy_image::SSQD, + floppy_image::FF_525, floppy_image::SSQD, floppy_image::MFM, 2000, 9, 80, 1, 512, {}, 1, {}, 100, 22, 20 }, {} diff --git a/src/lib/formats/wd177x_dsk.c b/src/lib/formats/wd177x_dsk.c index 459c72230d0..6a7d4d101c1 100644 --- a/src/lib/formats/wd177x_dsk.c +++ b/src/lib/formats/wd177x_dsk.c @@ -106,15 +106,51 @@ void wd177x_format::build_sector_description(const format &f, UINT8 *sectdata, d } } -bool wd177x_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) +floppy_image_format_t::desc_e* wd177x_format::get_desc_fm(const format &f, int ¤t_size) { - int type = find_size(io, form_factor); - if(type == -1) - return false; + static floppy_image_format_t::desc_e desc[25] = { + /* 00 */ { FM, 0xff, f.gap_1 }, + /* 01 */ { SECTOR_LOOP_START, 0, f.sector_count-1 }, + /* 02 */ { FM, 0x00, 6 }, + /* 03 */ { CRC_CCITT_FM_START, 1 }, + /* 04 */ { RAW, 0x4489, 0 }, // TODO remove + /* 05 */ { FM, 0xfe, 1 }, + /* 06 */ { TRACK_ID_FM }, + /* 07 */ { HEAD_ID_FM }, + /* 08 */ { SECTOR_ID_FM }, + /* 09 */ { SIZE_ID_FM }, + /* 10 */ { CRC_END, 1 }, + /* 11 */ { CRC, 1 }, + /* 12 */ { FM, 0xff, f.gap_2 }, + /* 13 */ { FM, 0x00, 6 }, + /* 14 */ { CRC_CCITT_FM_START, 2 }, + /* 15 */ { RAW, 0x4489, 0 }, // TODO remove + /* 16 */ { FM, 0xfb, 1 }, + /* 17 */ { SECTOR_DATA_FM, -1 }, + /* 18 */ { CRC_END, 2 }, + /* 19 */ { CRC, 2 }, + /* 20 */ { FM, 0xff, f.gap_3 }, + /* 21 */ { SECTOR_LOOP_END }, + /* 22 */ { FM, 0x00, 0 }, + /* 23 */ { RAWBITS, 0x9254, 0 }, + /* 24 */ { END } + }; - const format &f = formats[type]; + current_size = f.gap_1*16; + if(f.sector_base_size) + current_size += f.sector_base_size * f.sector_count * 16; + else { + for(int j=0; j != f.sector_count; j++) + current_size += f.per_sector_size[j] * 16; + } + current_size += (6+1+4+2+f.gap_2+6+1+2+f.gap_3) * f.sector_count * 16; - floppy_image_format_t::desc_e desc[] = { + return desc; +} + +floppy_image_format_t::desc_e* wd177x_format::get_desc_mfm(const format &f, int ¤t_size) +{ + static floppy_image_format_t::desc_e desc[25] = { /* 00 */ { MFM, 0x4e, f.gap_1 }, /* 01 */ { SECTOR_LOOP_START, 0, f.sector_count-1 }, /* 02 */ { MFM, 0x00, 12 }, @@ -142,7 +178,7 @@ bool wd177x_format::load(io_generic *io, UINT32 form_factor, floppy_image *image /* 24 */ { END } }; - int current_size = f.gap_1*16; + current_size = f.gap_1*16; if(f.sector_base_size) current_size += f.sector_base_size * f.sector_count * 16; else { @@ -151,6 +187,30 @@ bool wd177x_format::load(io_generic *io, UINT32 form_factor, floppy_image *image } current_size += (12+3+1+4+2+f.gap_2+12+3+1+2+f.gap_3) * f.sector_count * 16; + return desc; +} + +bool wd177x_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) +{ + int type = find_size(io, form_factor); + if(type == -1) + return false; + + const format &f = formats[type]; + floppy_image_format_t::desc_e *desc; + int current_size; + + switch (f.encoding) + { + case floppy_image::FM: + desc = get_desc_fm(f, current_size); + break; + case floppy_image::MFM: + default: + desc = get_desc_mfm(f, current_size); + break; + } + int total_size = 200000000/f.cell_size; int remaining_size = total_size - current_size; if(remaining_size < 0) @@ -308,7 +368,16 @@ void wd177x_format::check_compatibility(floppy_image *image, int *candidates, in // Extract the sectors generate_bitstream_from_track(0, 0, formats[candidates[0]].cell_size, bitstream, track_size, image); - extract_sectors_from_bitstream_mfm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata)); + + switch (formats[candidates[0]].encoding) + { + case floppy_image::FM: + extract_sectors_from_bitstream_fm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata)); + break; + case floppy_image::MFM: + extract_sectors_from_bitstream_mfm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata)); + break; + } // Check compatibility with every candidate, copy in-place int *ok_cands = candidates; @@ -343,7 +412,6 @@ void wd177x_format::check_compatibility(floppy_image *image, int *candidates, in candidates_count = ok_cands - candidates; } - void wd177x_format::extract_sectors(floppy_image *image, const format &f, desc_s *sdesc, int track, int head) { UINT8 bitstream[500000/8]; @@ -353,7 +421,16 @@ void wd177x_format::extract_sectors(floppy_image *image, const format &f, desc_s // Extract the sectors generate_bitstream_from_track(track, head, f.cell_size, bitstream, track_size, image); - extract_sectors_from_bitstream_mfm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata)); + + switch (f.encoding) + { + case floppy_image::FM: + extract_sectors_from_bitstream_fm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata)); + break; + case floppy_image::MFM: + extract_sectors_from_bitstream_mfm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata)); + break; + } for(int i=0; i