diff options
Diffstat (limited to 'src/lib/formats/bbc_dsk.c')
-rw-r--r-- | src/lib/formats/bbc_dsk.c | 216 |
1 files changed, 196 insertions, 20 deletions
diff --git a/src/lib/formats/bbc_dsk.c b/src/lib/formats/bbc_dsk.c index dfa78c0bfd8..53c3652ab51 100644 --- a/src/lib/formats/bbc_dsk.c +++ b/src/lib/formats/bbc_dsk.c @@ -1,53 +1,229 @@ // license:GPL-2.0+ -// copyright-holders:Dirk Best +// copyright-holders:Dirk Best, Nigel Barnes /*************************************************************************** BBC Micro - Disk image format + Disk image formats ***************************************************************************/ #include "bbc_dsk.h" +#include "basicdsk.h" -bbc_format::bbc_format() : wd177x_format(formats) +LEGACY_FLOPPY_OPTIONS_START(bbc) + LEGACY_FLOPPY_OPTION( ssd40, "bbc,img,ssd", "BBC 40t SSD disk image", basicdsk_identify_default, basicdsk_construct_default, NULL, + HEADS([1]) + TRACKS([40]) + SECTORS([10]) + SECTOR_LENGTH([256]) + FIRST_SECTOR_ID([0])) + LEGACY_FLOPPY_OPTION( ssd80, "bbc,img,ssd", "BBC 80t SSD disk image", basicdsk_identify_default, basicdsk_construct_default, NULL, + HEADS([1]) + TRACKS([80]) + SECTORS([10]) + SECTOR_LENGTH([256]) + FIRST_SECTOR_ID([0])) + LEGACY_FLOPPY_OPTION( dsd40, "dsd", "BBC 40t DSD disk image", basicdsk_identify_default, basicdsk_construct_default, NULL, + HEADS([2]) + TRACKS([40]) + SECTORS([10]) + SECTOR_LENGTH([256]) + INTERLEAVE([0]) + FIRST_SECTOR_ID([0])) + LEGACY_FLOPPY_OPTION( dsd80, "dsd", "BBC 80t DSD disk image", basicdsk_identify_default, basicdsk_construct_default, NULL, + HEADS([2]) + TRACKS([80]) + SECTORS([10]) + SECTOR_LENGTH([256]) + INTERLEAVE([0]) + FIRST_SECTOR_ID([0])) +LEGACY_FLOPPY_OPTIONS_END + +/********************************************************************/ + +bbc_ssd_525_format::bbc_ssd_525_format() : wd177x_format(formats) +{ +} + +const char *bbc_ssd_525_format::name() const { + return "ssd"; } -const char *bbc_format::name() const +const char *bbc_ssd_525_format::description() const { - return "bbc"; + return "BBC Micro 5.25\" disk image"; } -const char *bbc_format::description() const +const char *bbc_ssd_525_format::extensions() const { - return "BBC Micro disk image"; + return "bbc,img,ssd"; } -const char *bbc_format::extensions() const +int bbc_ssd_525_format::find_size(io_generic *io, UINT32 form_factor) { - return "bbc,img,ssd,dsd"; + char cat[8]; + io_generic_read(io, cat, 256, 8); + UINT64 sectors = ((cat[6] & 3) << 8) + cat[7]; // sector count from catalogue + UINT64 size = io_generic_size(io); + for(int i=0; formats[i].form_factor; i++) { + const format &f = formats[i]; + if(form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor) + continue; + + if((size <= (UINT64)compute_track_size(f) * f.track_count * f.head_count) && (sectors == f.track_count * f.sector_count)) + return i; + } + return -1; } -const bbc_format::format bbc_format::formats[] = +const bbc_ssd_525_format::format bbc_ssd_525_format::formats[] = { - { // 100k single sided single density + { // 100k 40 track single sided single density floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM, - 4000, 10, 40, 1, 256, {}, 0, {}, 16, 11, 19 + 4000, 10, 40, 1, 256, {}, 0, {}, 40, 10, 10 + }, + { // 200k 80 track single sided single density + floppy_image::FF_525, floppy_image::SSQD, floppy_image::FM, + 4000, 10, 80, 1, 256, {}, 0, {}, 40, 10, 10 }, - { // 200k double sided single density + { // 200k 40 track double sided single density floppy_image::FF_525, floppy_image::DSSD, floppy_image::FM, - 4000, 10, 40, 2, 256, {}, 0, {}, 16, 11, 19 + 4000, 10, 40, 2, 256, {}, 0, {}, 40, 10, 10 }, - { // 200k single sided double density - floppy_image::FF_525, floppy_image::SSQD, floppy_image::FM, - 4000, 10, 80, 1, 256, {}, 0, {}, 16, 11, 19 + { // 400k 80 track double sided single density + floppy_image::FF_525, floppy_image::DSQD, floppy_image::FM, + 4000, 10, 80, 2, 256, {}, 0, {}, 40, 10, 10 }, - { // 400k double sided double density + {} +}; + + +bbc_dsd_525_format::bbc_dsd_525_format() : wd177x_format(formats) +{ +} + +const char *bbc_dsd_525_format::name() const +{ + return "dsd"; +} + +const char *bbc_dsd_525_format::description() const +{ + return "BBC Micro 5.25\" disk image"; +} + +const char *bbc_dsd_525_format::extensions() const +{ + return "dsd"; +} + +int bbc_dsd_525_format::find_size(io_generic *io, UINT32 form_factor) +{ + char cat[8]; + io_generic_read(io, cat, 256, 8); + UINT64 sectors = ((cat[6] & 3) << 8) + cat[7]; // sector count from catalogue + UINT64 size = io_generic_size(io); + for(int i=0; formats[i].form_factor; i++) { + const format &f = formats[i]; + if(form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor) + continue; + + if((size <= (UINT64)compute_track_size(f) * f.track_count * f.head_count) && (sectors == f.track_count * f.sector_count)) + return i; + } + return -1; +} + +const bbc_dsd_525_format::format bbc_dsd_525_format::formats[] = +{ + { // 200k 40 track double sided single density + floppy_image::FF_525, floppy_image::DSQD, floppy_image::FM, + 4000, 10, 40, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9 }, 40, 10, 10 + }, + { // 400k 80 track double sided single density floppy_image::FF_525, floppy_image::DSQD, floppy_image::FM, - 4000, 10, 80, 2, 256, {}, 0, {}, 16, 11, 19 + 4000, 10, 80, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9 }, 40, 10, 10 }, {} }; -const floppy_format_type FLOPPY_BBC_FORMAT = &floppy_image_format_creator<bbc_format>; + +bbc_adf_525_format::bbc_adf_525_format() : wd177x_format(formats) +{ +} + +const char *bbc_adf_525_format::name() const +{ + return "adf"; +} + +const char *bbc_adf_525_format::description() const +{ + return "BBC Micro 5.25\" ADFS disk image"; +} + +const char *bbc_adf_525_format::extensions() const +{ + return "adf,ads,adm,adl,img"; +} + +const bbc_adf_525_format::format bbc_adf_525_format::formats[] = +{ + { // 160K 40 track single sided double density + floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM, + 2000, 16, 40, 1, 256, {}, 0, {}, 60, 22, 43 + }, + { // 320K 80 track single sided double density + floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM, + 2000, 16, 80, 1, 256, {}, 0, {}, 60, 22, 43 + }, + { // 640K 80 track double sided double density + floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM, + 2000, 16, 80, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, 60, 22, 43 + }, + {} +}; + + +bbc_adf_35_format::bbc_adf_35_format() : wd177x_format(formats) +{ +} + +const char *bbc_adf_35_format::name() const +{ + return "adf"; +} + +const char *bbc_adf_35_format::description() const +{ + return "BBC Micro 3.5\" ADFS disk image"; +} + +const char *bbc_adf_35_format::extensions() const +{ + return "adf,ads,adm,adl,img"; +} + +const bbc_adf_35_format::format bbc_adf_35_format::formats[] = { + { // 160K 3 1/2 inch 40 track single sided double density + floppy_image::FF_35, floppy_image::SSDD, floppy_image::MFM, + 2000, 16, 40, 1, 256, {}, 0, {}, 60, 22, 43 + }, + { // 320K 3 1/2 inch 80 track single sided double density + floppy_image::FF_35, floppy_image::SSQD, floppy_image::MFM, + 2000, 16, 80, 1, 256, {}, 0, {}, 60, 22, 43 + }, + { // 640K 3 1/2 inch 80 track double sided double density + floppy_image::FF_35, floppy_image::DSQD, floppy_image::MFM, + 2000, 16, 80, 2, 256, {}, -1, { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, 60, 22, 43 + }, + {} +}; + + +const floppy_format_type FLOPPY_BBC_SSD_525_FORMAT = &floppy_image_format_creator<bbc_ssd_525_format>; +const floppy_format_type FLOPPY_BBC_DSD_525_FORMAT = &floppy_image_format_creator<bbc_dsd_525_format>; +const floppy_format_type FLOPPY_BBC_ADF_525_FORMAT = &floppy_image_format_creator<bbc_adf_525_format>; +const floppy_format_type FLOPPY_BBC_ADF_35_FORMAT = &floppy_image_format_creator<bbc_adf_35_format>; |