summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/sound/ay8910.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/sound/ay8910.h')
-rw-r--r--src/emu/sound/ay8910.h54
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;