summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib
diff options
context:
space:
mode:
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
commit5e378738aafb738373edf6014996482aa7ee6a3c (patch)
tree47f67bf33eaa8221c0befc8e9fab359ed56fda3d /src/lib
parent49d95127f1aba390cf725dd7fe267da9366e04a8 (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.c2
-rw-r--r--src/lib/formats/oric_dsk.c348
-rw-r--r--src/lib/formats/oric_dsk.h18
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 */