diff options
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 |
commit | 4bcdefb7e90e5bc5b9195f60e6167700c4d3c760 (patch) | |
tree | ef94e88efaa11ee3e92f4a305ea83d8e9c6aa706 | |
parent | a9e30eccc8662bd9e3629766cb8bbe986468beed (diff) |
Floppy work WIP (no whatsnew)
-rw-r--r-- | .gitattributes | 2 | ||||
-rw-r--r-- | src/emu/emu.mak | 1 | ||||
-rw-r--r-- | src/emu/imagedev/floppy.c | 113 | ||||
-rw-r--r-- | src/emu/imagedev/floppy.h | 86 | ||||
-rw-r--r-- | src/lib/formats/flopimg.c | 41 | ||||
-rw-r--r-- | src/lib/formats/flopimg.h | 24 | ||||
-rw-r--r-- | src/lib/formats/hxcmfm_dsk.c | 50 | ||||
-rw-r--r-- | src/lib/formats/hxcmfm_dsk.h | 1 |
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; |