summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/emu/diimage.h
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/emu/diimage.h')
-rw-r--r--trunk/src/emu/diimage.h325
1 files changed, 325 insertions, 0 deletions
diff --git a/trunk/src/emu/diimage.h b/trunk/src/emu/diimage.h
new file mode 100644
index 00000000000..f87622638e0
--- /dev/null
+++ b/trunk/src/emu/diimage.h
@@ -0,0 +1,325 @@
+/***************************************************************************
+
+ diimage.h
+
+ Device image interfaces.
+
+****************************************************************************
+
+ Copyright Miodrag Milanovic
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name 'MAME' nor the names of its contributors may be
+ used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __EMU_H__
+#error Dont include this file directly; include emu.h instead.
+#endif
+
+#ifndef __DIIMAGE_H__
+#define __DIIMAGE_H__
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+enum iodevice_t
+{
+ /* List of all supported devices. Refer to the device by these names only */
+ IO_UNKNOWN,
+ IO_CARTSLOT, /* 1 - Cartridge Port, as found on most console and on some computers */
+ IO_FLOPPY, /* 2 - Floppy Disk unit */
+ IO_HARDDISK, /* 3 - Hard Disk unit */
+ IO_CYLINDER, /* 4 - Magnetically-Coated Cylinder */
+ IO_CASSETTE, /* 5 - Cassette Recorder (common on early home computers) */
+ IO_PUNCHCARD, /* 6 - Card Puncher/Reader */
+ IO_PUNCHTAPE, /* 7 - Tape Puncher/Reader (reels instead of punchcards) */
+ IO_PRINTER, /* 8 - Printer device */
+ IO_SERIAL, /* 9 - Generic Serial Port */
+ IO_PARALLEL, /* 10 - Generic Parallel Port */
+ IO_SNAPSHOT, /* 11 - Complete 'snapshot' of the state of the computer */
+ IO_QUICKLOAD, /* 12 - Allow to load program/data into memory, without matching any actual device */
+ IO_MEMCARD, /* 13 - Memory card */
+ IO_CDROM, /* 14 - optical CD-ROM disc */
+ IO_MAGTAPE, /* 15 - Magentic tape */
+ IO_COUNT /* 16 - Total Number of IO_devices for searching */
+};
+
+enum image_error_t
+{
+ IMAGE_ERROR_SUCCESS,
+ IMAGE_ERROR_INTERNAL,
+ IMAGE_ERROR_UNSUPPORTED,
+ IMAGE_ERROR_OUTOFMEMORY,
+ IMAGE_ERROR_FILENOTFOUND,
+ IMAGE_ERROR_INVALIDIMAGE,
+ IMAGE_ERROR_ALREADYOPEN,
+ IMAGE_ERROR_UNSPECIFIED
+};
+
+struct image_device_type_info
+{
+ iodevice_t m_type;
+ const char *m_name;
+ const char *m_shortname;
+};
+
+struct image_device_format
+{
+ image_device_format *m_next;
+ int m_index;
+ astring m_name;
+ astring m_description;
+ astring m_extensions;
+ astring m_optspec;
+};
+
+class device_image_interface;
+struct feature_list;
+struct software_part;
+struct software_info;
+
+// device image interface function types
+typedef int (*device_image_load_func)(device_image_interface &image);
+typedef int (*device_image_create_func)(device_image_interface &image, int format_type, option_resolution *format_options);
+typedef void (*device_image_unload_func)(device_image_interface &image);
+typedef void (*device_image_display_func)(device_image_interface &image);
+typedef void (*device_image_partialhash_func)(hash_collection &, const unsigned char *, unsigned long, const char *);
+typedef void (*device_image_get_devices_func)(device_image_interface &device);
+typedef bool (*device_image_softlist_load_func)(device_image_interface &image, char *swlist, char *swname, rom_entry *start_entry);
+typedef void (*device_image_display_info_func)(device_image_interface &image);
+
+//**************************************************************************
+// MACROS
+//**************************************************************************
+
+#define IMAGE_INIT_PASS FALSE
+#define IMAGE_INIT_FAIL TRUE
+#define IMAGE_VERIFY_PASS FALSE
+#define IMAGE_VERIFY_FAIL TRUE
+
+#define DEVICE_IMAGE_LOAD_NAME(name) device_load_##name
+#define DEVICE_IMAGE_LOAD(name) int DEVICE_IMAGE_LOAD_NAME(name)(device_image_interface &image)
+
+#define DEVICE_IMAGE_CREATE_NAME(name) device_create_##name
+#define DEVICE_IMAGE_CREATE(name) int DEVICE_IMAGE_CREATE_NAME(name)(device_image_interface &image, int create_format, option_resolution *create_args)
+
+#define DEVICE_IMAGE_UNLOAD_NAME(name) device_unload_##name
+#define DEVICE_IMAGE_UNLOAD(name) void DEVICE_IMAGE_UNLOAD_NAME(name)(device_image_interface &image)
+
+#define DEVICE_IMAGE_DISPLAY_NAME(name) device_image_display_func##name
+#define DEVICE_IMAGE_DISPLAY(name) void DEVICE_IMAGE_DISPLAY_NAME(name)(device_image_interface &image)
+
+#define DEVICE_IMAGE_DISPLAY_INFO_NAME(name) device_image_display_info_func##name
+#define DEVICE_IMAGE_DISPLAY_INFO(name) void DEVICE_IMAGE_DISPLAY_INFO_NAME(name)(device_image_interface &image)
+
+#define DEVICE_IMAGE_GET_DEVICES_NAME(name) device_image_get_devices_##name
+#define DEVICE_IMAGE_GET_DEVICES(name) void DEVICE_IMAGE_GET_DEVICES_NAME(name)(device_image_interface &image)
+
+#define DEVICE_IMAGE_SOFTLIST_LOAD_NAME(name) device_softlist_load_##name
+#define DEVICE_IMAGE_SOFTLIST_LOAD(name) bool DEVICE_IMAGE_SOFTLIST_LOAD_NAME(name)(device_image_interface &image, char *swlist, char *swname, rom_entry *start_entry)
+
+
+
+// ======================> device_image_interface
+
+// class representing interface-specific live image
+class device_image_interface : public device_interface
+{
+public:
+ // construction/destruction
+ device_image_interface(const machine_config &mconfig, device_t &device);
+ virtual ~device_image_interface();
+
+ static const char *device_typename(iodevice_t type);
+ static const char *device_brieftypename(iodevice_t type);
+ static iodevice_t device_typeid(const char *name);
+
+ virtual void device_compute_hash(hash_collection &hashes, const void *data, size_t length, const char *types) const;
+
+ virtual bool call_load() { return FALSE; }
+ virtual bool call_softlist_load(char *swlist, char *swname, rom_entry *start_entry) { return FALSE; }
+ virtual bool call_create(int format_type, option_resolution *format_options) { return FALSE; }
+ virtual void call_unload() { }
+ virtual void call_display() { }
+ virtual void call_display_info() { }
+ virtual void call_get_devices() { }
+ virtual void *get_device_specific_call() { return NULL; }
+ virtual device_image_partialhash_func get_partial_hash() const { return NULL; }
+ virtual iodevice_t image_type() const = 0;
+ virtual bool is_readable() const = 0;
+ virtual bool is_writeable() const = 0;
+ virtual bool is_creatable() const = 0;
+ virtual bool must_be_loaded() const = 0;
+ virtual bool is_reset_on_load() const = 0;
+ virtual const char *image_interface() const { return NULL; }
+ virtual const char *file_extensions() const = 0;
+ virtual const option_guide *create_option_guide() const = 0;
+
+ const image_device_format *device_get_indexed_creatable_format(int index);
+ const image_device_format *device_get_named_creatable_format(const char *format_name);
+ const option_guide *device_get_creation_option_guide() { return create_option_guide(); }
+ const image_device_format *device_get_creatable_formats() { return formatlist(); }
+
+ const char *error();
+ void seterror(image_error_t err, const char *message);
+ void message(const char *format, ...);
+
+ bool exists() { return m_image_name; }
+ const char *filename() { if (!m_image_name) return NULL; else return m_image_name; }
+ const char *basename() { if (!m_basename) return NULL; else return m_basename; }
+ const char *basename_noext() { if (!m_basename_noext) return NULL; else return m_basename_noext; }
+ const char *filetype() { if (!m_filetype) return NULL; else return m_filetype; }
+ core_file *image_core_file() { return m_file; }
+ UINT64 length() { check_for_file(); return core_fsize(m_file); }
+ bool is_readonly() { return m_readonly; }
+ bool has_been_created() { return m_created; }
+ void make_readonly() { m_readonly = true; }
+ UINT32 fread(void *buffer, UINT32 length) { check_for_file(); return core_fread(m_file, buffer, length); }
+ UINT32 fwrite(const void *buffer, UINT32 length) { check_for_file(); return core_fwrite(m_file, buffer, length); }
+ int fseek(INT64 offset, int whence) { check_for_file(); return core_fseek(m_file, offset, whence); }
+ UINT64 ftell() { check_for_file(); return core_ftell(m_file); }
+ int fgetc() { char ch; if (fread(&ch, 1) != 1) ch = '\0'; return ch; }
+ char *fgets(char *buffer, UINT32 length) { check_for_file(); return core_fgets(buffer, length, m_file); }
+ int image_feof() { check_for_file(); return core_feof(m_file); }
+ void *ptr() {check_for_file(); return (void *) core_fbuffer(m_file); }
+ // configuration access
+ void set_init_phase() { m_init_phase = TRUE; }
+
+ const char* longname() { return m_longname; }
+ const char* manufacturer() { return m_manufacturer; }
+ const char* year() { return m_year; }
+ UINT32 supported() { return m_supported; }
+
+ const software_info *software_entry() { return m_software_info_ptr; }
+ const software_part *part_entry() { return m_software_part_ptr; }
+
+ void set_working_directory(const char *working_directory) { m_working_directory = working_directory; }
+ const char * working_directory();
+
+ UINT8 *get_software_region(const char *tag);
+ UINT32 get_software_region_length(const char *tag);
+ const char *get_feature(const char *feature_name);
+
+ UINT32 crc();
+ hash_collection& hash() { return m_hash; }
+
+ void battery_load(void *buffer, int length, int fill);
+ void battery_save(const void *buffer, int length);
+
+ const char *image_type_name() const { return device_typename(image_type()); }
+
+
+
+ const char *instance_name() const { return m_instance_name; }
+ const char *brief_instance_name() const { return m_brief_instance_name; }
+ bool uses_file_extension(const char *file_extension) const;
+ image_device_format *formatlist() const { return m_formatlist; }
+
+ bool load(const char *path);
+ bool finish_load();
+ void unload();
+ bool create(const char *path, const image_device_format *create_format, option_resolution *create_args);
+ bool load_software(char *swlist, char *swname, rom_entry *entry);
+protected:
+ bool load_internal(const char *path, bool is_create, int create_format, option_resolution *create_args);
+ void determine_open_plan(int is_create, UINT32 *open_plan);
+ image_error_t load_image_by_path(UINT32 open_flags, const char *path);
+ void clear();
+ bool is_loaded();
+
+ image_error_t set_image_filename(const char *filename);
+
+ void clear_error();
+
+ void check_for_file() { assert_always(m_file != NULL, "Illegal operation on unmounted image"); }
+
+ void setup_working_directory();
+ bool try_change_working_directory(const char *subdir);
+
+ int read_hash_config(const char *sysname);
+ void run_hash(void (*partialhash)(hash_collection &, const unsigned char *, unsigned long, const char *), hash_collection &hashes, const char *types);
+ void image_checkhash();
+ void update_names();
+ // derived class overrides
+
+ // configuration
+ static const image_device_type_info *find_device_type(iodevice_t type);
+ static const image_device_type_info m_device_info_array[];
+
+ /* error related info */
+ image_error_t m_err;
+ astring m_err_message;
+
+ /* variables that are only non-zero when an image is mounted */
+ core_file *m_file;
+ emu_file *m_mame_file;
+ astring m_image_name;
+ astring m_basename;
+ astring m_basename_noext;
+ astring m_filetype;
+
+ /* working directory; persists across mounts */
+ astring m_working_directory;
+
+ /* Software information */
+ char *m_full_software_name;
+ software_info *m_software_info_ptr;
+ software_part *m_software_part_ptr;
+
+ /* info read from the hash file/software list */
+ astring m_longname;
+ astring m_manufacturer;
+ astring m_year;
+ UINT32 m_supported;
+
+ /* flags */
+ bool m_readonly;
+ bool m_created;
+ bool m_init_phase;
+ bool m_from_swlist;
+
+ /* special - used when creating */
+ int m_create_format;
+ option_resolution *m_create_args;
+
+ hash_collection m_hash;
+
+ astring m_brief_instance_name;
+ astring m_instance_name;
+
+ /* creation info */
+ image_device_format *m_formatlist;
+
+ bool m_is_loading;
+};
+
+
+#endif /* __DIIMAGE_H__ */