diff options
Diffstat (limited to 'src/lib/formats/svi_dsk.c')
-rw-r--r-- | src/lib/formats/svi_dsk.c | 232 |
1 files changed, 100 insertions, 132 deletions
diff --git a/src/lib/formats/svi_dsk.c b/src/lib/formats/svi_dsk.c index 491169bec28..aaa6a45e709 100644 --- a/src/lib/formats/svi_dsk.c +++ b/src/lib/formats/svi_dsk.c @@ -1,174 +1,142 @@ -// license:BSD-3-Clause -// copyright-holders:Miodrag Milanovic -/********************************************************************* +// license:GPL-2.0+ +// copyright-holders:Dirk Best +/*************************************************************************** - formats/svi_dsk.c + Spectravideo SVI-318/328 - SVI318 disk images + Disk image format -*********************************************************************/ - -#include <string.h> -#include <assert.h> +***************************************************************************/ #include "svi_dsk.h" -#include "basicdsk.h" -static FLOPPY_IDENTIFY(svi_dsk_identify) +svi_format::svi_format() { - *vote = ((floppy_image_size(floppy) == (172032)) || (floppy_image_size(floppy) == (346112))) ? 100 : 0; - return FLOPPY_ERROR_SUCCESS; } -static int svi_get_heads_per_disk(floppy_image_legacy *floppy) +const char *svi_format::name() const { - return (floppy_image_size(floppy) == (172032)) ? 1 : 2; + return "svi"; } -static int svi_get_tracks_per_disk(floppy_image_legacy *floppy) +const char *svi_format::description() const { - return 40; + return "SVI-318/328 disk image"; } -static UINT64 svi_translate_offset(floppy_image_legacy *floppy, - int track, int head, int sector) +const char *svi_format::extensions() const { - UINT64 o; - if ((track==0) && (head==0)) - o = sector*128; - else - o = ((track*((floppy_image_size(floppy) == (172032)) ? 1 : 2)+head)*17+sector)*256-2048; /* (17*256)-(18*128)=2048 */ - - return o; + return "dsk"; } -static floperr_t get_offset(floppy_image_legacy *floppy, int head, int track, int sector, int sector_is_index, UINT64 *offset) +int svi_format::identify(io_generic *io, UINT32 form_factor) { - UINT64 offs; - /* translate the sector to a raw sector */ - if (!sector_is_index) - { - sector -= 1; - } - /* check to see if we are out of range */ - if ((head < 0) || (head >= ((floppy_image_size(floppy) == (172032)) ? 1 : 2)) || (track < 0) || (track >= 40) - || (sector < 0) || (sector >= ((head==0 && track==0) ? 18 : 17))) - return FLOPPY_ERROR_SEEKERROR; - - offs = svi_translate_offset(floppy, track, head, sector); - if (offset) - *offset = offs; - return FLOPPY_ERROR_SUCCESS; -} + UINT64 size = io_generic_size(io); + if (size == 172032 || size == 346112) + return 50; - -static floperr_t internal_svi_read_sector(floppy_image_legacy *floppy, int head, int track, int sector, int sector_is_index, void *buffer, size_t buflen) -{ - UINT64 offset; - floperr_t err; - err = get_offset(floppy, head, track, sector, sector_is_index, &offset); - if (err) - return err; - - floppy_image_read(floppy, buffer, offset, buflen); - return FLOPPY_ERROR_SUCCESS; + return 0; } - - -static floperr_t internal_svi_write_sector(floppy_image_legacy *floppy, int head, int track, int sector, int sector_is_index, const void *buffer, size_t buflen, int ddam) +bool svi_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) { - UINT64 offset; - floperr_t err; - - err = get_offset(floppy, head, track, sector, sector_is_index, &offset); - if (err) - return err; - - floppy_image_write(floppy, buffer, offset, buflen); - return FLOPPY_ERROR_SUCCESS; -} + UINT64 size = io_generic_size(io); + int head_count; + switch (size) + { + case 172032: head_count = 1; break; + case 346112: head_count = 2; break; + default: return false; + } + int file_offset = 0; -static floperr_t svi_read_sector(floppy_image_legacy *floppy, int head, int track, int sector, void *buffer, size_t buflen) -{ - return internal_svi_read_sector(floppy, head, track, sector, FALSE, buffer, buflen); -} + for (int track = 0; track < 40; track++) + { + for (int head = 0; head < head_count ; head++) + { + int sector_count = (track == 0 && head == 0) ? 18 : 17; + int sector_size = (track == 0 && head == 0) ? 128 : 256; + + desc_pc_sector sectors[20]; + UINT8 sector_data[5000]; + int sector_offset = 0; + + for (int i = 0; i < sector_count; i++) + { + sectors[i].track = track; + sectors[i].head = head; + sectors[i].sector = i + 1; + sectors[i].actual_size = sector_size; + sectors[i].size = sector_size >> 8; + sectors[i].deleted = false; + sectors[i].bad_crc = false; + sectors[i].data = §or_data[sector_offset]; + + io_generic_read(io, sectors[i].data, file_offset, sector_size); + + sector_offset += sector_size; + file_offset += sector_size; + } + + if (track == 0 && head == 0) + build_wd_track_fm(track, head, image, 50000, sector_count, sectors, 10, 26, 11); + else + build_wd_track_mfm(track, head, image, 100000, sector_count, sectors, 32, 50, 22); + } + } -static floperr_t svi_write_sector(floppy_image_legacy *floppy, int head, int track, int sector, const void *buffer, size_t buflen, int ddam) -{ - return internal_svi_write_sector(floppy, head, track, sector, FALSE, buffer, buflen, ddam); + return true; } -static floperr_t svi_read_indexed_sector(floppy_image_legacy *floppy, int head, int track, int sector, void *buffer, size_t buflen) +bool svi_format::save(io_generic *io, floppy_image *image) { - return internal_svi_read_sector(floppy, head, track, sector, TRUE, buffer, buflen); -} + UINT8 bitstream[500000/8]; + UINT8 sector_data[50000]; + desc_xs sectors[256]; + int track_size; + UINT64 file_offset = 0; -static floperr_t svi_write_indexed_sector(floppy_image_legacy *floppy, int head, int track, int sector, const void *buffer, size_t buflen, int ddam) -{ - return internal_svi_write_sector(floppy, head, track, sector, TRUE, buffer, buflen, ddam); -} + int track_count, head_count; + image->get_actual_geometry(track_count, head_count); -static floperr_t svi_get_sector_length(floppy_image_legacy *floppy, int head, int track, int sector, UINT32 *sector_length) -{ - floperr_t err; - err = get_offset(floppy, head, track, sector, FALSE, NULL); - if (err) - return err; + // initial fm track + generate_bitstream_from_track(0, 0, 4000, bitstream, track_size, image); + extract_sectors_from_bitstream_fm_pc(bitstream, track_size, sectors, sector_data, sizeof(sector_data)); - if (sector_length) { - *sector_length = (head==0 && track==0) ? 128 : 256; + for (int i = 0; i < 18; i++) + { + io_generic_write(io, sectors[i + 1].data, file_offset, 128); + file_offset += 128; } - return FLOPPY_ERROR_SUCCESS; -} - + // rest are mfm tracks + for (int track = 0; track < track_count; track++) + { + for (int head = 0; head < head_count; head++) + { + // skip track 0, head 0 + if (track == 0) { if (head_count == 1) break; else head++; } + + generate_bitstream_from_track(track, head, 2000, bitstream, track_size, image); + extract_sectors_from_bitstream_mfm_pc(bitstream, track_size, sectors, sector_data, sizeof(sector_data)); + + for (int i = 0; i < 17; i++) + { + io_generic_write(io, sectors[i + 1].data, file_offset, 256); + file_offset += 256; + } + } + } -static floperr_t svi_get_indexed_sector_info(floppy_image_legacy *floppy, int head, int track, int sector_index, int *cylinder, int *side, int *sector, UINT32 *sector_length, unsigned long *flags) -{ - sector_index += 1; - if (cylinder) - *cylinder = track; - if (side) - *side = head; - if (sector) - *sector = sector_index; - if (flags) - /* TODO: read DAM or DDAM and determine flags */ - *flags = 0; - return svi_get_sector_length(floppy, head, track, sector_index, sector_length); + return true; } - -static FLOPPY_CONSTRUCT(svi_dsk_construct) +bool svi_format::supports_save() const { - struct FloppyCallbacks *callbacks; - callbacks = floppy_callbacks(floppy); - callbacks->read_sector = svi_read_sector; - callbacks->write_sector = svi_write_sector; - callbacks->read_indexed_sector = svi_read_indexed_sector; - callbacks->write_indexed_sector = svi_write_indexed_sector; - callbacks->get_sector_length = svi_get_sector_length; - callbacks->get_heads_per_disk = svi_get_heads_per_disk; - callbacks->get_tracks_per_disk = svi_get_tracks_per_disk; - callbacks->get_indexed_sector_info = svi_get_indexed_sector_info; - - return FLOPPY_ERROR_SUCCESS; + return true; } - - -/* ----------------------------------------------------------------------- */ - -LEGACY_FLOPPY_OPTIONS_START( svi318 ) - LEGACY_FLOPPY_OPTION( svi_dsk, "dsk", "SVI-318 floppy disk image", svi_dsk_identify, svi_dsk_construct, NULL, NULL) - LEGACY_FLOPPY_OPTION( svi_cpm, "dsk", "SVI-728 DSDD CP/M disk image", basicdsk_identify_default, basicdsk_construct_default, NULL, - HEADS([2]) - TRACKS([40]) - SECTORS([17]) - SECTOR_LENGTH([256]) - FIRST_SECTOR_ID([1])) -LEGACY_FLOPPY_OPTIONS_END +const floppy_format_type FLOPPY_SVI_FORMAT = &floppy_image_format_creator<svi_format>; |