summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Miodrag Milanovic <mmicko@gmail.com>2011-07-21 16:07:25 +0000
committer Miodrag Milanovic <mmicko@gmail.com>2011-07-21 16:07:25 +0000
commit4bcdefb7e90e5bc5b9195f60e6167700c4d3c760 (patch)
treeef94e88efaa11ee3e92f4a305ea83d8e9c6aa706
parenta9e30eccc8662bd9e3629766cb8bbe986468beed (diff)
Floppy work WIP (no whatsnew)
-rw-r--r--.gitattributes2
-rw-r--r--src/emu/emu.mak1
-rw-r--r--src/emu/imagedev/floppy.c113
-rw-r--r--src/emu/imagedev/floppy.h86
-rw-r--r--src/lib/formats/flopimg.c41
-rw-r--r--src/lib/formats/flopimg.h24
-rw-r--r--src/lib/formats/hxcmfm_dsk.c50
-rw-r--r--src/lib/formats/hxcmfm_dsk.h1
8 files changed, 298 insertions, 20 deletions
diff --git a/.gitattributes b/.gitattributes
index 72db582259f..e4beddf4ad6 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -705,6 +705,8 @@ src/emu/imagedev/chd_cd.c svneol=native#text/plain
src/emu/imagedev/chd_cd.h svneol=native#text/plain
src/emu/imagedev/flopdrv.c svneol=native#text/plain
src/emu/imagedev/flopdrv.h svneol=native#text/plain
+src/emu/imagedev/floppy.c svneol=native#text/plain
+src/emu/imagedev/floppy.h svneol=native#text/plain
src/emu/imagedev/harddriv.c svneol=native#text/plain
src/emu/imagedev/harddriv.h svneol=native#text/plain
src/emu/imagedev/multcart.c svneol=native#text/plain
diff --git a/src/emu/emu.mak b/src/emu/emu.mak
index 00b521b8471..5ba0584189a 100644
--- a/src/emu/emu.mak
+++ b/src/emu/emu.mak
@@ -287,6 +287,7 @@ EMUIMAGEDEVOBJS = \
$(EMUIMAGEDEV)/cassette.o \
$(EMUIMAGEDEV)/chd_cd.o \
$(EMUIMAGEDEV)/flopdrv.o \
+ $(EMUIMAGEDEV)/floppy.o \
$(EMUIMAGEDEV)/harddriv.o \
$(EMUIMAGEDEV)/multcart.o \
$(EMUIMAGEDEV)/printer.o \
diff --git a/src/emu/imagedev/floppy.c b/src/emu/imagedev/floppy.c
new file mode 100644
index 00000000000..28bab8145a3
--- /dev/null
+++ b/src/emu/imagedev/floppy.c
@@ -0,0 +1,113 @@
+/*********************************************************************
+
+
+
+*********************************************************************/
+
+#include "emu.h"
+#include "floppy.h"
+#include "formats/imageutl.h"
+
+// device type definition
+const device_type FLOPPY = &device_creator<floppy_image_device>;
+
+//-------------------------------------------------
+// floppy_image_device - constructor
+//-------------------------------------------------
+
+floppy_image_device::floppy_image_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, FLOPPY, "Floppy drive", tag, owner, clock),
+ device_image_interface(mconfig, *this),
+ m_image(NULL)
+{
+
+}
+
+//-------------------------------------------------
+// floppy_image_device - destructor
+//-------------------------------------------------
+
+floppy_image_device::~floppy_image_device()
+{
+}
+
+//-------------------------------------------------
+// device_config_complete - perform any
+// operations now that the configuration is
+// complete
+//-------------------------------------------------
+
+void floppy_image_device::device_config_complete()
+{
+ // inherit a copy of the static data
+ const floppy_interface *intf = reinterpret_cast<const floppy_interface *>(static_config());
+ if (intf != NULL)
+ *static_cast<floppy_interface *>(this) = *intf;
+
+ // or initialize to defaults if none provided
+ else
+ {
+ memset(&m_formats, 0, sizeof(m_formats));
+ memset(&m_interface, 0, sizeof(m_interface));
+ memset(&m_device_displayinfo, 0, sizeof(m_device_displayinfo));
+ memset(&m_load_func, 0, sizeof(m_load_func));
+ memset(&m_unload_func, 0, sizeof(m_unload_func));
+ }
+
+ image_device_format **formatptr;
+ image_device_format *format;
+ formatptr = &m_formatlist;
+ int cnt = 0;
+ m_extension_list[0] = '\0';
+ while (m_formats[cnt].name)
+ {
+ // allocate a new format
+ format = global_alloc_clear(image_device_format);
+ format->m_index = cnt;
+ format->m_name = m_formats[cnt].name;
+ format->m_description = m_formats[cnt].description;
+ format->m_extensions = m_formats[cnt].extensions;
+ format->m_optspec = (m_formats[cnt].param_guidelines) ? m_formats[cnt].param_guidelines : "";
+
+ image_specify_extension( m_extension_list, 256, m_formats[cnt].extensions );
+ // and append it to the list
+ *formatptr = format;
+ formatptr = &format->m_next;
+ cnt++;
+ }
+
+ // set brief and instance name
+ update_names();
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void floppy_image_device::device_start()
+{
+}
+
+bool floppy_image_device::call_load()
+{
+ device_image_interface *image = this;
+ int best;
+ m_image = global_alloc(floppy_image((void *) image, &image_ioprocs, m_formats));
+ const struct floppy_format_def *format = m_image->identify(&best);
+ if (format) {
+ m_image->load(best);
+ if (m_load_func)
+ return m_load_func(*this);
+ } else {
+ return IMAGE_INIT_FAIL;
+ }
+ return IMAGE_INIT_PASS;
+}
+
+void floppy_image_device::call_unload()
+{
+ if (m_image)
+ global_free(m_image);
+ if (m_unload_func)
+ m_unload_func(*this);
+}
diff --git a/src/emu/imagedev/floppy.h b/src/emu/imagedev/floppy.h
new file mode 100644
index 00000000000..de967ea16c1
--- /dev/null
+++ b/src/emu/imagedev/floppy.h
@@ -0,0 +1,86 @@
+/*********************************************************************
+
+ floppy.h
+
+*********************************************************************/
+
+#ifndef FLOPPY_H
+#define FLOPPY_H
+
+#include "formats/flopimg.h"
+
+/***************************************************************************
+ TYPE DEFINITIONS
+***************************************************************************/
+// ======================> floppy_interface
+
+struct floppy_interface
+{
+ const struct floppy_format_def *m_formats;
+ const char * m_interface;
+ device_image_display_info_func m_device_displayinfo;
+ device_image_load_func m_load_func;
+ device_image_unload_func m_unload_func;
+};
+
+// ======================> cdrom_image_device
+
+class floppy_image_device : public device_t,
+ public floppy_interface,
+ public device_image_interface
+{
+public:
+ // construction/destruction
+ floppy_image_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ virtual ~floppy_image_device();
+
+ // image-level overrides
+ virtual bool call_load();
+ virtual void call_unload();
+ virtual void call_display_info() { if (m_device_displayinfo) m_device_displayinfo(*this); }
+ virtual bool call_softlist_load(char *swlist, char *swname, rom_entry *start_entry) { return load_software(swlist, swname, start_entry); }
+
+ virtual iodevice_t image_type() const { return IO_FLOPPY; }
+
+ virtual bool is_readable() const { return 1; }
+ virtual bool is_writeable() const { return 1; }
+ virtual bool is_creatable() const { return 0; }
+ virtual bool must_be_loaded() const { return 0; }
+ virtual bool is_reset_on_load() const { return 0; }
+ virtual const char *image_interface() const { return m_interface; }
+ virtual const char *file_extensions() const { return m_extension_list; }
+ virtual const option_guide *create_option_guide() const { return NULL; }
+
+ UINT8* get_buffer(UINT16 track, UINT8 side) { return m_image->get_buffer(track,side); }
+protected:
+ // device-level overrides
+ virtual void device_config_complete();
+ virtual void device_start();
+
+ image_device_format m_format;
+ floppy_image *m_image;
+ char m_extension_list[256];
+};
+
+// device type definition
+extern const device_type FLOPPY;
+
+/***************************************************************************
+ DEVICE CONFIGURATION MACROS
+***************************************************************************/
+#define FLOPPY_0 "floppy0"
+#define FLOPPY_1 "floppy1"
+#define FLOPPY_2 "floppy2"
+#define FLOPPY_3 "floppy3"
+
+#define MCFG_FLOPPY_DRIVE_ADD(_config) \
+ MCFG_DEVICE_ADD(FLOPPY_0, FLOPPY, 0) \
+ MCFG_DEVICE_CONFIG(_config) \
+
+#define MCFG_FLOPPY_2_DRIVES_ADD(_config) \
+ MCFG_DEVICE_ADD(FLOPPY_0, FLOPPY, 0) \
+ MCFG_DEVICE_CONFIG(_config) \
+ MCFG_DEVICE_ADD(FLOPPY_1, FLOPPY, 0) \
+ MCFG_DEVICE_CONFIG(_config)
+
+#endif /* FLOPPY_H */
diff --git a/src/lib/formats/flopimg.c b/src/lib/formats/flopimg.c
index 0aadbb3a274..290d623bc2d 100644
--- a/src/lib/formats/flopimg.c
+++ b/src/lib/formats/flopimg.c
@@ -982,28 +982,19 @@ void floppy_image::close()
close_internal(TRUE);
}
-
-floppy_image_format_t::floppy_image_format_t(const char *name,const char *extensions,const char *description,const char *param_guidelines)
+void floppy_image::set_meta_data(UINT16 tracks, UINT8 sides, UINT16 rpm, UINT16 bitrate)
{
- m_name = name;
- m_extensions = extensions;
- m_description = description;
- m_param_guidelines = param_guidelines;
-}
-floppy_image_format_t::~floppy_image_format_t()
-{
-}
-
-int floppy_image_format_t::identify(floppy_image *image)
-{
- return 0;
+ m_tracks = tracks;
+ m_sides = sides;
+ m_rpm = rpm;
+ m_bitrate= bitrate;
}
-const struct floppy_format_def *floppy_image::identify()
+const struct floppy_format_def *floppy_image::identify(int *best)
{
const struct floppy_format_def *retVal = NULL;
int best_vote = 0;
-
+ *best = -1;
for (int i = 0; m_formats[i].type; i++)
{
floppy_image_format_t *t = (m_formats[i].type)(m_formats[i].name,m_formats[i].extensions,m_formats[i].description,m_formats[i].param_guidelines);
@@ -1012,8 +1003,26 @@ const struct floppy_format_def *floppy_image::identify()
if (vote > best_vote)
{
best_vote = vote;
+ *best = i;
retVal = &m_formats[i];
}
}
return retVal;
}
+
+bool floppy_image::load(int num)
+{
+ floppy_image_format_t *t = (m_formats[num].type)(m_formats[num].name,m_formats[num].extensions,m_formats[num].description,m_formats[num].param_guidelines);
+ return t->load(this);
+}
+
+floppy_image_format_t::floppy_image_format_t(const char *name,const char *extensions,const char *description,const char *param_guidelines)
+{
+ m_name = name;
+ m_extensions = extensions;
+ m_description = description;
+ m_param_guidelines = param_guidelines;
+}
+floppy_image_format_t::~floppy_image_format_t()
+{
+}
diff --git a/src/lib/formats/flopimg.h b/src/lib/formats/flopimg.h
index ecf60fc38ed..06cd989f1da 100644
--- a/src/lib/formats/flopimg.h
+++ b/src/lib/formats/flopimg.h
@@ -225,8 +225,8 @@ public:
floppy_image_format_t(const char *name,const char *extensions,const char *description,const char *param_guidelines);
virtual ~floppy_image_format_t();
- virtual int identify(floppy_image *image);
-
+ virtual int identify(floppy_image *image) = 0;
+ virtual bool load(floppy_image *image) = 0;
protected:
const char *m_name;
const char *m_extensions;
@@ -254,6 +254,8 @@ struct floppy_format_def
const char *param_guidelines;
};
+#define FLOPPY_OPTIONS_NAME(name) floppyoptions_##name
+
#define FLOPPY_OPTIONS_START(name) \
const struct floppy_format_def floppyoptions_##name[] = \
{ \
@@ -273,6 +275,10 @@ struct floppy_format_def
// ======================> floppy_image
+#define MAX_FLOPPY_SIDES 2
+#define MAX_FLOPPY_TRACKS 84
+#define MAX_TRACK_DATA 16384
+
// class representing floppy image
class floppy_image
{
@@ -287,11 +293,23 @@ public:
UINT64 image_size();
void close();
- const struct floppy_format_def *identify();
+ void set_meta_data(UINT16 tracks, UINT8 sides, UINT16 rpm, UINT16 bitrate);
+ void set_track_size(UINT16 track, UINT8 side, UINT16 size) { m_track_size[(track << 1) + side] = size; }
+ const struct floppy_format_def *identify(int *best);
+ UINT8* get_buffer(UINT16 track, UINT8 side) { return m_native_data[(track << 1) + side]; }
+ UINT16 get_track_size(UINT16 track, UINT8 side) { return m_track_size[(track << 1) + side]; }
+ bool load(int num);
private:
void close_internal(bool close_file);
struct io_generic m_io;
const struct floppy_format_def *m_formats;
+ UINT16 m_tracks;
+ UINT8 m_sides;
+ UINT16 m_rpm;
+ UINT16 m_bitrate;
+
+ UINT8 m_native_data[MAX_FLOPPY_SIDES * MAX_FLOPPY_TRACKS][MAX_TRACK_DATA];
+ UINT16 m_track_size[MAX_FLOPPY_SIDES * MAX_FLOPPY_TRACKS];
};
#endif /* FLOPIMG_H */
diff --git a/src/lib/formats/hxcmfm_dsk.c b/src/lib/formats/hxcmfm_dsk.c
index 21f5bd0ed18..8e293940871 100644
--- a/src/lib/formats/hxcmfm_dsk.c
+++ b/src/lib/formats/hxcmfm_dsk.c
@@ -2,6 +2,32 @@
#define MFM_FORMAT_HEADER "HXCMFM"
+#pragma pack(1)
+
+struct MFMIMG
+{
+ UINT8 headername[7];
+
+ UINT16 number_of_track;
+ UINT8 number_of_side;
+
+ UINT16 floppyRPM;
+ UINT16 floppyBitRate;
+ UINT8 floppyiftype;
+
+ UINT32 mfmtracklistoffset;
+};
+
+struct MFMTRACKIMG
+{
+ UINT16 track_number;
+ UINT8 side_number;
+ UINT32 mfmtracksize;
+ UINT32 mfmtrackoffset;
+};
+
+#pragma pack()
+
mfm_format::mfm_format(const char *name,const char *extensions,const char *description,const char *param_guidelines) :
floppy_image_format_t(name,extensions,description,param_guidelines)
{
@@ -11,12 +37,34 @@ int mfm_format::identify(floppy_image *image)
{
UINT8 header[7];
- image->image_read(header, 0, 7);
+ image->image_read(&header, 0, sizeof(header));
if ( memcmp( header, MFM_FORMAT_HEADER, 6 ) ==0) {
return 100;
}
return 0;
}
+bool mfm_format::load(floppy_image *image)
+{
+ MFMIMG header;
+ MFMTRACKIMG trackdesc;
+
+ // read header
+ image->image_read(&header,0, sizeof(header));
+
+ image->set_meta_data(header.number_of_track,header.number_of_side,header.floppyRPM,header.floppyBitRate);
+
+ for(int track=0; track < header.number_of_track; track++) {
+ for(int side=0; side < header.number_of_side; side++) {
+ // read location of
+ image->image_read(&trackdesc,(header.mfmtracklistoffset)+((( track << 1 ) + side)*sizeof(trackdesc)),sizeof(trackdesc));
+
+ image->set_track_size(track, side, trackdesc.mfmtracksize);
+ // actual data read
+ image->image_read(image->get_buffer(track,side), trackdesc.mfmtrackoffset, trackdesc.mfmtracksize);
+ }
+ }
+ return FALSE;
+}
const floppy_format_type FLOPPY_MFM_FORMAT = &floppy_image_format_creator<mfm_format>; \ No newline at end of file
diff --git a/src/lib/formats/hxcmfm_dsk.h b/src/lib/formats/hxcmfm_dsk.h
index e96382d77ce..dd3247e49d0 100644
--- a/src/lib/formats/hxcmfm_dsk.h
+++ b/src/lib/formats/hxcmfm_dsk.h
@@ -17,6 +17,7 @@ public:
mfm_format(const char *name,const char *extensions,const char *description,const char *param_guidelines);
virtual int identify(floppy_image *image);
+ virtual bool load(floppy_image *image);
};
extern const floppy_format_type FLOPPY_MFM_FORMAT;