diff options
author | Olivier Galibert <galibert@pobox.com> | 2014-04-12 15:15:20 +0000 |
---|---|---|
committer | Olivier Galibert <galibert@pobox.com> | 2014-04-12 15:15:20 +0000 |
commit | 5e378738aafb738373edf6014996482aa7ee6a3c (patch) | |
tree | 47f67bf33eaa8221c0befc8e9fab359ed56fda3d /src/lib | |
parent | 49d95127f1aba390cf725dd7fe267da9366e04a8 (diff) |
Oric 1: Spring cleaning [O. Galibert]
Putting back the apple2 disk2 in the Pravetz 8D will wait until the
next generation one is finalized.
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/formats/mfi_dsk.c | 2 | ||||
-rw-r--r-- | src/lib/formats/oric_dsk.c | 348 | ||||
-rw-r--r-- | src/lib/formats/oric_dsk.h | 18 |
3 files changed, 89 insertions, 279 deletions
diff --git a/src/lib/formats/mfi_dsk.c b/src/lib/formats/mfi_dsk.c index e7ca391ad88..ccb441c7a25 100644 --- a/src/lib/formats/mfi_dsk.c +++ b/src/lib/formats/mfi_dsk.c @@ -99,7 +99,7 @@ int mfi_format::identify(io_generic *io, UINT32 form_factor) if(memcmp( h.sign, sign, 16 ) == 0 && h.cyl_count <= 160 && h.head_count <= 2 && - (!form_factor || h.form_factor == form_factor)) + (!form_factor || !h.form_factor || h.form_factor == form_factor)) return 100; return 0; } diff --git a/src/lib/formats/oric_dsk.c b/src/lib/formats/oric_dsk.c index eb3bd159f89..95a2c34d427 100644 --- a/src/lib/formats/oric_dsk.c +++ b/src/lib/formats/oric_dsk.c @@ -1,3 +1,5 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert /********************************************************************* formats/oric_dsk.c @@ -6,311 +8,107 @@ *********************************************************************/ -#include <string.h> +#include "emu.h" +#include "formats/oric_dsk.h" -#include "imageutl.h" -#include "flopimg.h" -#include "oric_dsk.h" -#include "basicdsk.h" - - -#define mfm_disk_header_size 0x0100 -#define MFM_ID "MFM_DISK" - -#define TRACK_SIZE_MFM 0x1900 - -struct mfm_disk_sector_info -{ - int id_ptr; - int data_ptr; - int sector_size; - UINT8 ddam; -}; - -struct oricdsk_tag -{ - int tracks; - int heads; - int geometry; - int tracksize; - int num_sectors; - struct mfm_disk_sector_info sector_data[32]; -}; - - -static struct oricdsk_tag *get_tag(floppy_image_legacy *floppy) +oric_dsk_format::oric_dsk_format() { - struct oricdsk_tag *tag; - tag = (oricdsk_tag *)floppy_tag(floppy); - return tag; } - -static FLOPPY_IDENTIFY(oric_dsk_identify) +const char *oric_dsk_format::name() const { - UINT8 header[mfm_disk_header_size]; - - floppy_image_read(floppy, header, 0, mfm_disk_header_size); - if ( memcmp( header, MFM_ID, 8 ) ==0) { - UINT32 heads = pick_integer_le(header, 8, 4); - UINT32 tracks = pick_integer_le(header, 12, 4); - - if (floppy_image_size(floppy)==((tracks*heads*TRACK_SIZE_MFM)+mfm_disk_header_size)) { - *vote = 100; - } else { - *vote = 0; - } - } else { - *vote = 0; - } - return FLOPPY_ERROR_SUCCESS; + return "oric_dsk"; } -static int oric_get_track_offset(floppy_image_legacy *floppy,int track, int head) + +const char *oric_dsk_format::description() const { - if (get_tag(floppy)->geometry==1) { - return mfm_disk_header_size + (get_tag(floppy)->tracksize * track) + (head * get_tag(floppy)->tracksize * get_tag(floppy)->tracks); - } else { - return mfm_disk_header_size + (get_tag(floppy)->tracksize*((track * get_tag(floppy)->heads)+head)); - } + return "Oric disk image"; } -static int oric_get_heads_per_disk(floppy_image_legacy *floppy) +const char *oric_dsk_format::extensions() const { - return get_tag(floppy)->heads; + return "dsk"; } -static int oric_get_tracks_per_disk(floppy_image_legacy *floppy) +bool oric_dsk_format::supports_save() const { - return get_tag(floppy)->tracks; + return true; } -static void mfm_info_cache_sector_info(floppy_image_legacy *floppy,int track,int head) +int oric_dsk_format::identify(io_generic *io, UINT32 form_factor) { - UINT8 track_data[TRACK_SIZE_MFM]; + UINT8 h[256]; + io_generic_read(io, h, 0, 256); - /* initialise these with single density values if single density */ - UINT8 IdMark = 0x0fe; - UINT8 DataMark = 0x0fb; - UINT8 DeletedDataMark = 0x0f8; + if(memcmp(h, "MFM_DISK", 8)) + return 0; - UINT8 SectorCount; - UINT8 SearchCode = 0; - UINT8 sector_number = 0; - int ptr = 0; - int track_offset = oric_get_track_offset(floppy,track,head); - floppy_image_read(floppy, track_data, track_offset, TRACK_SIZE_MFM); - SectorCount = 0; + int sides = (h[11] << 24) | (h[10] << 16) | (h[ 9] << 8) | h[ 8]; + int tracks = (h[15] << 24) | (h[14] << 16) | (h[13] << 8) | h[12]; + int geom = (h[19] << 24) | (h[18] << 16) | (h[17] << 8) | h[16]; - do - { - switch (SearchCode) - { - /* searching for id's */ - case 0: - { - /* found id mark? */ - if (track_data[ptr] == IdMark) - { - sector_number = track_data[ptr+3]-1; - /* store pointer to id mark */ - get_tag(floppy)->sector_data[sector_number].id_ptr = ptr + track_offset; - SectorCount++; + int size = io_generic_size(io); + if(sides < 0 || sides > 2 || geom != 1 || size != 256+6400*sides*tracks) + return 0; - /* grab N value - used to skip data in data field */ - get_tag(floppy)->sector_data[sector_number].sector_size = (1<< (track_data[ptr+4]+7)); - - /* skip past id field and crc */ - ptr+=7; + return 100; +} - /* now looking for data field */ - SearchCode = 1; - } - else - { - /* update position */ - ptr++; - } - } - break; +bool oric_dsk_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) +{ + UINT8 h[256]; + UINT8 t[6250+3]; + UINT32 stream[100000]; - /* searching for data id's */ - case 1: - { - /* found data or deleted data? */ - if ((track_data[ptr] == DataMark) || (track_data[ptr] == DeletedDataMark)) - { - /* yes */ - get_tag(floppy)->sector_data[sector_number].data_ptr = ptr + track_offset + 1; - get_tag(floppy)->sector_data[sector_number].ddam = (track_data[ptr] == DeletedDataMark) ? ID_FLAG_DELETED_DATA : 0; + t[6250] = t[6251] = t[6252] = 0; + io_generic_read(io, h, 0, 256); - /* skip data field and id */ - ptr += get_tag(floppy)->sector_data[sector_number].sector_size + 3; + int sides = (h[11] << 24) | (h[10] << 16) | (h[ 9] << 8) | h[ 8]; + int tracks = (h[15] << 24) | (h[14] << 16) | (h[13] << 8) | h[12]; - /* now looking for id field */ - SearchCode = 0; + for(int side=0; side<sides; side++) + for(int track=0; track<tracks; track++) { + io_generic_read(io, t, 256+6400*(tracks*side + track), 6250); + int pos = 0; + int sector_size = 128; + for(int i=0; i<6250; i++) { + if(t[i] == 0xc2 && t[i+1] == 0xc2 && t[i+2] == 0xc2) { + raw_w(stream, pos, 16, 0x5224); + raw_w(stream, pos, 16, 0x5224); + raw_w(stream, pos, 16, 0x5224); + i += 2; + continue; } - else - { - ptr++; + if(t[i] == 0xa1 && t[i+1] == 0xa1 && t[i+2] == 0xa1) { + raw_w(stream, pos, 16, 0x4489); + raw_w(stream, pos, 16, 0x4489); + raw_w(stream, pos, 16, 0x4489); + int copy; + if(t[i+3] == 0xfe) { + copy = 7; + sector_size = 128 << (t[i+7] & 3); + logerror("%02x %x - %02x %02x %02x %02x\n", + track, side, t[i+4], t[i+5], t[i+6], t[i+7]); + } else if(t[i+3] == 0xfb) + copy = sector_size+3; + else + copy = 0; + for(int j=0; j<copy; j++) + mfm_w(stream, pos, 8, t[i+3+j]); + i += 2+copy; + continue; } + mfm_w(stream, pos, 8, t[i]); } - break; - - default: - break; + generate_track_from_levels(track, side, stream, 100000, 0, image); } - } - while (ptr < TRACK_SIZE_MFM); - get_tag(floppy)->num_sectors = SectorCount; - -} - -static floperr_t get_offset(floppy_image_legacy *floppy, int head, int track, int sector, int sector_is_index, UINT64 *offset) -{ - UINT64 offs; - - /* translate the sector to a raw sector */ - if (!sector_is_index) - { - sector -= 1; - } - mfm_info_cache_sector_info(floppy,track,head); - - /* check to see if we are out of range */ - if ((head < 0) || (head >= get_tag(floppy)->heads) || (track < 0) || (track >= get_tag(floppy)->tracks) - || (sector < 0) || (sector >=get_tag(floppy)->num_sectors)) - return FLOPPY_ERROR_SEEKERROR; - - offs = get_tag(floppy)->sector_data[sector].data_ptr; - if (offset) - *offset = offs; - return FLOPPY_ERROR_SUCCESS; -} - - - -static floperr_t internal_oric_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; -} - - - -static floperr_t internal_oric_write_sector(floppy_image_legacy *floppy, int head, int track, int sector, int sector_is_index, const void *buffer, size_t buflen, int ddam) -{ - 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; -} - - - -static floperr_t oric_read_sector(floppy_image_legacy *floppy, int head, int track, int sector, void *buffer, size_t buflen) -{ - return internal_oric_read_sector(floppy, head, track, sector, FALSE, buffer, buflen); + + return true; } -static floperr_t oric_write_sector(floppy_image_legacy *floppy, int head, int track, int sector, const void *buffer, size_t buflen, int ddam) +bool oric_dsk_format::save(io_generic *io, floppy_image *image) { - return internal_oric_write_sector(floppy, head, track, sector, FALSE, buffer, buflen, ddam); -} - -static floperr_t oric_read_indexed_sector(floppy_image_legacy *floppy, int head, int track, int sector, void *buffer, size_t buflen) -{ - return internal_oric_read_sector(floppy, head, track, sector, TRUE, buffer, buflen); -} - -static floperr_t oric_write_indexed_sector(floppy_image_legacy *floppy, int head, int track, int sector, const void *buffer, size_t buflen, int ddam) -{ - return internal_oric_write_sector(floppy, head, track, sector, TRUE, buffer, buflen, ddam); -} - -static floperr_t oric_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; - - if (sector_length) { - *sector_length = get_tag(floppy)->sector_data[sector].sector_size; - } - return FLOPPY_ERROR_SUCCESS; -} - - - -static floperr_t oric_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) -{ - floperr_t retVal; - - sector_index += 1; - - retVal = oric_get_sector_length(floppy, head, track, sector_index, sector_length); - if (sector_length!=NULL) { - *sector_length = get_tag(floppy)->sector_data[sector_index-1].sector_size; - } - if (cylinder) - *cylinder = track; - if (side) - *side = head; - if (sector) - *sector = sector_index; - if (flags) - *flags = get_tag(floppy)->sector_data[sector_index].ddam; - return retVal; -} - - -static FLOPPY_CONSTRUCT(oric_dsk_construct) -{ - struct FloppyCallbacks *callbacks; - struct oricdsk_tag *tag; - UINT8 header[mfm_disk_header_size]; - - floppy_image_read(floppy, header, 0, mfm_disk_header_size); - - tag = (struct oricdsk_tag *) floppy_create_tag(floppy, sizeof(struct oricdsk_tag)); - if (!tag) - return FLOPPY_ERROR_OUTOFMEMORY; - - tag->heads = pick_integer_le(header, 8, 4); - tag->tracks = pick_integer_le(header, 12, 4); - tag->geometry = pick_integer_le(header, 16, 4); - tag->tracksize = TRACK_SIZE_MFM; - memset(tag->sector_data,0,sizeof(tag->sector_data)); - - callbacks = floppy_callbacks(floppy); - callbacks->read_sector = oric_read_sector; - callbacks->write_sector = oric_write_sector; - callbacks->read_indexed_sector = oric_read_indexed_sector; - callbacks->write_indexed_sector = oric_write_indexed_sector; - callbacks->get_sector_length = oric_get_sector_length; - callbacks->get_heads_per_disk = oric_get_heads_per_disk; - callbacks->get_tracks_per_disk = oric_get_tracks_per_disk; - callbacks->get_indexed_sector_info = oric_get_indexed_sector_info; - return FLOPPY_ERROR_SUCCESS; + return true; } -/* ----------------------------------------------------------------------- */ -LEGACY_FLOPPY_OPTIONS_START( oric ) - LEGACY_FLOPPY_OPTION( oricmfm, "dsk", "Oric MFM floppy disk image", oric_dsk_identify, oric_dsk_construct, NULL, NULL) - LEGACY_FLOPPY_OPTION( oric, "dsk", "Oric disk image", basicdsk_identify_default, basicdsk_construct_default, NULL, - HEADS([2]) - TRACKS([80]) - SECTORS([9]) - SECTOR_LENGTH([512]) - FIRST_SECTOR_ID([1])) -LEGACY_FLOPPY_OPTIONS_END +const floppy_format_type FLOPPY_ORIC_DSK_FORMAT = &floppy_image_format_creator<oric_dsk_format>; diff --git a/src/lib/formats/oric_dsk.h b/src/lib/formats/oric_dsk.h index 851544da3d2..98d5458f082 100644 --- a/src/lib/formats/oric_dsk.h +++ b/src/lib/formats/oric_dsk.h @@ -11,8 +11,20 @@ #include "flopimg.h" -/**************************************************************************/ - -LEGACY_FLOPPY_OPTIONS_EXTERN(oric); +class oric_dsk_format : public floppy_image_format_t +{ +public: + oric_dsk_format(); + virtual int identify(io_generic *io, UINT32 form_factor); + virtual bool load(io_generic *io, UINT32 form_factor, floppy_image *image); + virtual bool save(io_generic *io, floppy_image *image); + + virtual const char *name() const; + virtual const char *description() const; + virtual const char *extensions() const; + virtual bool supports_save() const; +}; + +extern const floppy_format_type FLOPPY_ORIC_DSK_FORMAT; #endif /* ORIC_DSK_H */ |