mame/src/emu/imagedev/cassette.h
2011-06-19 19:29:25 +00:00

132 lines
3.8 KiB
C++

/*********************************************************************
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 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 */