diff options
Diffstat (limited to 'src/lib/formats/pc_dsk.cpp')
-rw-r--r-- | src/lib/formats/pc_dsk.cpp | 156 |
1 files changed, 7 insertions, 149 deletions
diff --git a/src/lib/formats/pc_dsk.cpp b/src/lib/formats/pc_dsk.cpp index e4d7e02f47d..96d7662e5fb 100644 --- a/src/lib/formats/pc_dsk.cpp +++ b/src/lib/formats/pc_dsk.cpp @@ -2,180 +2,38 @@ // copyright-holders:Nathan Woods /********************************************************************* - formats/pc_dsk.c + formats/pc_dsk.cpp PC disk images *********************************************************************/ -#include <string.h> -#include <assert.h> - #include "formats/pc_dsk.h" -#include "formats/basicdsk.h" - -struct pc_disk_sizes -{ - uint32_t image_size; - int sectors; - int heads; -}; - - - -static const struct pc_disk_sizes disk_sizes[] = -{ - { 8*1*40*512, 8, 1}, /* 5 1/4 inch double density single sided */ - { 8*2*40*512, 8, 2}, /* 5 1/4 inch double density */ - { 9*1*40*512, 9, 1}, /* 5 1/4 inch double density single sided */ - { 9*2*40*512, 9, 2}, /* 5 1/4 inch double density */ - {10*2*40*512, 10, 2}, /* 5 1/4 inch double density single sided */ - { 9*2*80*512, 9, 2}, /* 80 tracks 5 1/4 inch drives rare in PCs */ - { 9*2*80*512, 9, 2}, /* 3 1/2 inch double density */ - {15*2*80*512, 15, 2}, /* 5 1/4 inch high density (or japanese 3 1/2 inch high density) */ - {18*2*80*512, 18, 2}, /* 3 1/2 inch high density */ - {21*2*80*512, 21, 2}, /* 3 1/2 inch high density DMF */ - {36*2*80*512, 36, 2} /* 3 1/2 inch enhanced density */ -}; - - - -static floperr_t pc_dsk_compute_geometry(floppy_image_legacy *floppy, struct basicdsk_geometry *geometry) -{ - int i; - uint64_t size; - - memset(geometry, 0, sizeof(*geometry)); - size = floppy_image_size(floppy); - - for (i = 0; i < ARRAY_LENGTH(disk_sizes); i++) - { - if (disk_sizes[i].image_size == size) - { - geometry->sectors = disk_sizes[i].sectors; - geometry->heads = disk_sizes[i].heads; - geometry->sector_length = 512; - geometry->first_sector_id = 1; - geometry->tracks = (int) (size / disk_sizes[i].sectors / disk_sizes[i].heads / geometry->sector_length); - return FLOPPY_ERROR_SUCCESS; - } - } - - if (size >= 0x1a) - { - /* - * get info from boot sector. - * not correct on all disks - */ - uint8_t scl, spt, heads; - floppy_image_read(floppy, &scl, 0x0c, 1); - floppy_image_read(floppy, &spt, 0x18, 1); - floppy_image_read(floppy, &heads, 0x1A, 1); - - if (size == ((uint64_t) scl) * spt * heads * 0x200) - { - geometry->sectors = spt; - geometry->heads = heads; - geometry->sector_length = 512; - geometry->first_sector_id = 1; - geometry->tracks = scl; - return FLOPPY_ERROR_SUCCESS; - } - } - - return FLOPPY_ERROR_SUCCESS; -} - - - -static FLOPPY_IDENTIFY(pc_dsk_identify) -{ - floperr_t err; - struct basicdsk_geometry geometry; - - err = pc_dsk_compute_geometry(floppy, &geometry); - if (err) - return err; - - *vote = geometry.heads ? 100 : 0; - return FLOPPY_ERROR_SUCCESS; -} - - - -static FLOPPY_CONSTRUCT(pc_dsk_construct) -{ - floperr_t err; - struct basicdsk_geometry geometry; - - if (params) - { - /* create */ - memset(&geometry, 0, sizeof(geometry)); - geometry.heads = params->lookup_int(PARAM_HEADS); - geometry.tracks = params->lookup_int(PARAM_TRACKS); - geometry.sectors = params->lookup_int(PARAM_SECTORS); - geometry.first_sector_id = 1; - geometry.sector_length = 512; - } - else - { - /* open */ - err = pc_dsk_compute_geometry(floppy, &geometry); - if (err) - return err; - } - - return basicdsk_construct(floppy, &geometry); -} +#include "ioprocs.h" +#include <cstring> -/* ----------------------------------------------------------------------- */ - -LEGACY_FLOPPY_OPTIONS_START( pc ) - LEGACY_FLOPPY_OPTION( pc_dsk, "dsk,ima,img,ufi,360", "PC floppy disk image", pc_dsk_identify, pc_dsk_construct, nullptr, - HEADS([1]-2) - TRACKS(40/[80]) - SECTORS(8/[9]/10/15/18/36)) -LEGACY_FLOPPY_OPTIONS_END pc_format::pc_format() : upd765_format(formats) { } -const char *pc_format::name() const +const char *pc_format::name() const noexcept { return "pc"; } -const char *pc_format::description() const +const char *pc_format::description() const noexcept { return "PC floppy disk image"; } -const char *pc_format::extensions() const +const char *pc_format::extensions() const noexcept { return "dsk,ima,img,ufi,360"; } -int pc_format::identify(io_generic *io, uint32_t form_factor) -{ - uint64_t size = io_generic_size(io); - - /* some 360K images have a 512-byte header */ - if (size == 368640 + 0x200) { - file_header_skip_bytes = 0x200; - } - - /* some 1.44MB images have a 1024-byte footer */ - if (size == 1474560 + 0x400) { - file_footer_skip_bytes = 0x400; - } - - return upd765_format::identify(io, form_factor); -} - const pc_format::format pc_format::formats[] = { { /* 160K 5 1/4 inch double density single sided */ floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM, @@ -236,4 +94,4 @@ const pc_format::format pc_format::formats[] = { {} }; -const floppy_format_type FLOPPY_PC_FORMAT = &floppy_image_format_creator<pc_format>; +const pc_format FLOPPY_PC_FORMAT; |