summaryrefslogblamecommitdiffstatshomepage
path: root/src/devices/imagedev/cassette.h
blob: 8ca824c61ca262955fd16fe461685ca00601e780 (plain) (tree)
1
2
3
4
5
6
7
8
9
10

                                                    



                                                                      
                                                    


                                                                      

                                        
 
                            
                         

 
                   

                                                            


                                        

                                                             



                                        

                   



                                        

  




                                                                            
                                                
 
                                                



                                                                                             
                                                                                                               

                                         



                                                                                                         
 
                                

                                                                                                                 
                                            
                                                    
                                                                                                                                        


                                                                              




                                                                    

                                                                                         
 

                                                      
                                                                                           







                                                                     



                                      
                                           
 


                           
 
                                 

                                                       
                                                                                                          
 
        



                                        
                                  



                                                                                                                       


                                                         
                                                    
 
                                                        
  
 
                         
                                                    
 
                  
                                                                             
 


                                                                            




                                          

                                         
                                                                         
 
                                                 
                                                                                 
 
                                             
                                                                                                
 
                                             
                                                                             
 
                                          
// license:BSD-3-Clause
// copyright-holders:Nathan Woods, Miodrag Milanovic
/*********************************************************************

    cassette.h

    Interface to the cassette image abstraction code

*********************************************************************/

#ifndef MAME_DEVICES_IMAGEDEV_CASSETTE_H
#define MAME_DEVICES_IMAGEDEV_CASSETTE_H

#include "formats/cassimg.h"
#include "softlist_dev.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
};


/***************************************************************************
    TYPE DEFINITIONS
***************************************************************************/

// ======================> cassette_image_device

class cassette_image_device :   public device_t,
								public device_image_interface
{
public:
	// construction/destruction
	cassette_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
	virtual ~cassette_image_device();

	void set_formats(const struct CassetteFormat*  const *formats) { m_formats = formats; }
	void set_create_opts(const struct CassetteOptions  *create_opts) { m_create_opts = create_opts; }
	void set_default_state(cassette_state default_state) { m_default_state = default_state; }
	void set_interface(const char *interface) { m_interface = interface; }

	// image-level overrides
	virtual image_init_result call_load() override;
	virtual image_init_result call_create(int format_type, util::option_resolution *format_options) override;
	virtual void call_unload() override;
	virtual std::string call_display() override;
	virtual const software_list_loader &get_software_list_loader() const override { return image_software_list_loader::instance(); }

	virtual iodevice_t image_type() const override { return IO_CASSETTE; }

	virtual bool is_readable()  const override { return 1; }
	virtual bool is_writeable() const override { return 1; }
	virtual bool is_creatable() const override { return 1; }
	virtual bool must_be_loaded() const override { return 0; }
	virtual bool is_reset_on_load() const override { return 0; }
	virtual const char *image_interface() const override { return m_interface; }
	virtual const char *file_extensions() const override { return m_extension_list; }

	// specific implementation
	cassette_state get_state() { return m_state; }
	void set_state(cassette_state state) { change_state(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 set_speed(double speed);
	void set_channel(int channel);
	void go_forward();
	void go_reverse();
	void seek(double time, int origin);

protected:
	bool is_motor_on();
	void update();

	// device-level overrides
	virtual void device_config_complete() override;
	virtual void device_start() override;
	virtual const bool use_software_list_file_extension_for_filetype() const override { return true; }

private:
	cassette_image  *m_cassette;
	cassette_state  m_state;
	double          m_position;
	double          m_position_time;
	int32_t           m_value;
	int             m_channel;
	double          m_speed; // speed multiplier for tape speeds other than standard 1.875ips (used in adam driver)
	int             m_direction; // direction select
	char            m_extension_list[256];
	const struct CassetteFormat*    const *m_formats;
	const struct CassetteOptions    *m_create_opts;
	cassette_state                  m_default_state;
	const char *                    m_interface;

	image_init_result internal_load(bool is_create);
};

// device type definition
DECLARE_DEVICE_TYPE(CASSETTE, cassette_image_device)

// device iterator
typedef device_type_iterator<cassette_image_device> cassette_device_iterator;

/***************************************************************************
    DEVICE CONFIGURATION MACROS
***************************************************************************/
#define MCFG_CASSETTE_ADD(_tag)    \
	MCFG_DEVICE_ADD(_tag, CASSETTE, 0)

#define MCFG_CASSETTE_MODIFY(_tag) \
	MCFG_DEVICE_MODIFY(_tag)

#define MCFG_CASSETTE_FORMATS(_formats) \
	downcast<cassette_image_device &>(*device).set_formats(_formats);

#define MCFG_CASSETTE_CREATE_OPTS(_create_opts) \
	downcast<cassette_image_device &>(*device).set_create_opts(_create_opts);

#define MCFG_CASSETTE_DEFAULT_STATE(_state) \
	downcast<cassette_image_device &>(*device).set_default_state((cassette_state) (_state));

#define MCFG_CASSETTE_INTERFACE(_interface) \
	downcast<cassette_image_device &>(*device).set_interface(_interface);

#endif // MAME_DEVICES_IMAGEDEV_CASSETTE_H