summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/emu/imagedev/cassette.h
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/emu/imagedev/cassette.h')
-rw-r--r--trunk/src/emu/imagedev/cassette.h132
1 files changed, 132 insertions, 0 deletions
diff --git a/trunk/src/emu/imagedev/cassette.h b/trunk/src/emu/imagedev/cassette.h
new file mode 100644
index 00000000000..c7476e169a0
--- /dev/null
+++ b/trunk/src/emu/imagedev/cassette.h
@@ -0,0 +1,132 @@
+/*********************************************************************
+
+ cassette.h
+
+ Interface to the cassette image abstraction code
+
+*********************************************************************/
+
+#ifndef CASSETTE_H
+#define CASSETTE_H
+
+#include "image.h"
+#include "formats/cassimg.h"
+
+
+enum _cassette_state
+{
+ /* this part of the state is controlled by the UI */
+ CASSETTE_STOPPED = 0,
+ CASSETTE_PLAY = 1,
+ CASSETTE_RECORD = 2,
+
+ /* this part of the state is controlled by drivers */
+ CASSETTE_MOTOR_ENABLED = 0,
+ CASSETTE_MOTOR_DISABLED = 4,
+ CASSETTE_SPEAKER_ENABLED = 0,
+ CASSETTE_SPEAKER_MUTED = 8,
+
+ /* masks */
+ CASSETTE_MASK_UISTATE = 3,
+ CASSETTE_MASK_MOTOR = 4,
+ CASSETTE_MASK_SPEAKER = 8,
+ CASSETTE_MASK_DRVSTATE = 12
+};
+
+typedef enum _cassette_state cassette_state;
+
+
+/***************************************************************************
+ TYPE DEFINITIONS
+***************************************************************************/
+
+// ======================> cassette_interface
+
+struct cassette_interface
+{
+ const struct CassetteFormat* const *m_formats;
+ const struct CassetteOptions *m_create_opts;
+ cassette_state m_default_state;
+ const char * m_interface;
+ device_image_display_info_func m_device_displayinfo;
+};
+
+// ======================> cassette_image_device
+
+class cassette_image_device : public device_t,
+ public cassette_interface,
+ public device_image_interface
+{
+public:
+ // construction/destruction
+ cassette_image_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ virtual ~cassette_image_device();
+
+ // image-level overrides
+ virtual bool call_load();
+ virtual bool call_create(int format_type, option_resolution *format_options);
+ virtual void call_unload();
+ virtual void call_display();
+ 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_CASSETTE; }
+
+ virtual bool is_readable() const { return 1; }
+ virtual bool is_writeable() const { return 1; }
+ virtual bool is_creatable() const { return 1; }
+ 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; }
+
+ // specific implementation
+ cassette_state get_state() { return m_state; }
+ void set_state(cassette_state state) { change_state(m_state, (cassette_state)(~0)); }
+ void change_state(cassette_state state, cassette_state mask);
+
+ double input();
+ void output(double value);
+
+ cassette_image *get_image() { return m_cassette; }
+ double get_position();
+ double get_length();
+ void seek(double time, int origin);
+
+protected:
+ bool is_motor_on();
+ void update();
+
+ // device-level overrides
+ virtual void device_config_complete();
+ virtual void device_start();
+private:
+ cassette_image *m_cassette;
+ cassette_state m_state;
+ double m_position;
+ double m_position_time;
+ INT32 m_value;
+ char m_extension_list[256];
+};
+
+// device type definition
+extern const device_type CASSETTE;
+
+/***************************************************************************
+ DEVICE CONFIGURATION MACROS
+***************************************************************************/
+#define CASSETTE_TAG "cassette"
+#define CASSETTE2_TAG "cassette2"
+
+#define MCFG_CASSETTE_ADD(_tag, _config) \
+ MCFG_DEVICE_ADD(_tag, CASSETTE, 0) \
+ MCFG_DEVICE_CONFIG(_config)
+
+#define MCFG_CASSETTE_MODIFY(_tag, _config) \
+ MCFG_DEVICE_MODIFY(_tag) \
+ MCFG_DEVICE_CONFIG(_config)
+
+extern const cassette_interface default_cassette_interface;
+
+#endif /* CASSETTE_H */