diff options
Diffstat (limited to 'src/emu/sound/ay8910.h')
-rw-r--r-- | src/emu/sound/ay8910.h | 54 |
1 files changed, 32 insertions, 22 deletions
diff --git a/src/emu/sound/ay8910.h b/src/emu/sound/ay8910.h index ebacaf2955d..b42b205e4b4 100644 --- a/src/emu/sound/ay8910.h +++ b/src/emu/sound/ay8910.h @@ -26,13 +26,6 @@ YMZ294: 0 I/O port #define YM2149_INTERNAL_RESISTANCE (353) /* - * Default values for resistor loads. - * The macro should be used in AY8910interface if - * the real values are unknown. - */ -#define AY8910_DEFAULT_LOADS {1000, 1000, 1000} - -/* * The following is used by all drivers not reviewed yet. * This will like the old behaviour, output between * 0 and 7FFF @@ -75,15 +68,24 @@ YMZ294: 0 I/O port #define AY8910_NUM_CHANNELS 3 -struct ay8910_interface -{ - int flags; /* Flags */ - int res_load[3]; /* Load on channel in ohms */ - devcb_read8 portAread; - devcb_read8 portBread; - devcb_write8 portAwrite; - devcb_write8 portBwrite; -}; +#define MCFG_AY8910_OUTPUT_TYPE(_flag) \ + ay8910_device::set_flags(*device, _flag); + +#define MCFG_AY8910_RES_LOADS(_res0, _res1, _res2) \ + ay8910_device::set_resistors_load(*device, _res0, _res1, _res2); + +#define MCFG_AY8910_PORT_A_READ_CB(_devcb) \ + devcb = &ay8910_device::set_port_a_read_callback(*device, DEVCB2_##_devcb); + +#define MCFG_AY8910_PORT_B_READ_CB(_devcb) \ + devcb = &ay8910_device::set_port_b_read_callback(*device, DEVCB2_##_devcb); + +#define MCFG_AY8910_PORT_A_WRITE_CB(_devcb) \ + devcb = &ay8910_device::set_port_a_write_callback(*device, DEVCB2_##_devcb); + +#define MCFG_AY8910_PORT_B_WRITE_CB(_devcb) \ + devcb = &ay8910_device::set_port_b_write_callback(*device, DEVCB2_##_devcb); + class ay8910_device : public device_t, public device_sound_interface @@ -92,6 +94,13 @@ public: ay8910_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); ay8910_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); + static void set_flags(device_t &device, int flags) { downcast<ay8910_device &>(device).m_flags = flags; } + static void set_resistors_load(device_t &device, int res_load0, int res_load1, int res_load2) { downcast<ay8910_device &>(device).m_res_load[0] = res_load0; downcast<ay8910_device &>(device).m_res_load[1] = res_load1; downcast<ay8910_device &>(device).m_res_load[2] = res_load2; } + template<class _Object> static devcb2_base &set_port_a_read_callback(device_t &device, _Object object) { return downcast<ay8910_device &>(device).m_port_a_read_cb.set_callback(object); } + template<class _Object> static devcb2_base &set_port_b_read_callback(device_t &device, _Object object) { return downcast<ay8910_device &>(device).m_port_b_read_cb.set_callback(object); } + template<class _Object> static devcb2_base &set_port_a_write_callback(device_t &device, _Object object) { return downcast<ay8910_device &>(device).m_port_a_write_cb.set_callback(object); } + template<class _Object> static devcb2_base &set_port_b_write_callback(device_t &device, _Object object) { return downcast<ay8910_device &>(device).m_port_b_write_cb.set_callback(object); } + DECLARE_READ8_MEMBER( data_r ); DECLARE_WRITE8_MEMBER( address_w ); DECLARE_WRITE8_MEMBER( data_w ); @@ -119,9 +128,9 @@ public: void ay8910_write_ym(int addr, int data); int ay8910_read_ym(); void ay8910_reset_ym(); + protected: // device-level overrides - virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); @@ -138,7 +147,6 @@ protected: int m_streams; int m_ready; sound_stream *m_channel; - const ay8910_interface *m_intf; INT32 m_register_latch; UINT8 m_regs[16]; INT32 m_last_enable; @@ -161,10 +169,12 @@ protected: INT32 m_vol_table[AY8910_NUM_CHANNELS][16]; INT32 m_env_table[AY8910_NUM_CHANNELS][32]; INT32 m_vol3d_table[8*32*32*32]; - devcb_resolved_read8 m_portAread; - devcb_resolved_read8 m_portBread; - devcb_resolved_write8 m_portAwrite; - devcb_resolved_write8 m_portBwrite; + int m_flags; /* Flags */ + int m_res_load[3]; /* Load on channel in ohms */ + devcb2_read8 m_port_a_read_cb; + devcb2_read8 m_port_b_read_cb; + devcb2_write8 m_port_a_write_cb; + devcb2_write8 m_port_b_write_cb; }; extern const device_type AY8910; |