trunk/src/mame/drivers/snk.c
| r22786 | r22787 | |
| 468 | 468 | } |
| 469 | 469 | |
| 470 | 470 | |
| 471 | | static const ym3526_interface ym3526_config_1 = |
| 472 | | { |
| 473 | | DEVCB_DRIVER_LINE_MEMBER(snk_state,ymirq_callback_1) |
| 474 | | }; |
| 475 | | |
| 476 | | static const ym3526_interface ym3526_config_2 = |
| 477 | | { |
| 478 | | DEVCB_DRIVER_LINE_MEMBER(snk_state,ymirq_callback_2) |
| 479 | | }; |
| 480 | | |
| 481 | 471 | static const ym3812_interface ym3812_config_1 = |
| 482 | 472 | { |
| 483 | 473 | DEVCB_DRIVER_LINE_MEMBER(snk_state,ymirq_callback_1) |
| r22786 | r22787 | |
| 1430 | 1420 | AM_RANGE(0x8000, 0x87ff) AM_RAM |
| 1431 | 1421 | AM_RANGE(0xa000, 0xa000) AM_READ(soundlatch_byte_r) |
| 1432 | 1422 | AM_RANGE(0xc000, 0xc000) AM_READ(tnk3_busy_clear_r) |
| 1433 | | AM_RANGE(0xe000, 0xe001) AM_DEVREADWRITE_LEGACY("ym1", ym3526_r, ym3526_w) |
| 1423 | AM_RANGE(0xe000, 0xe001) AM_DEVREADWRITE("ym1", ym3526_device, read, write) |
| 1434 | 1424 | AM_RANGE(0xe004, 0xe004) AM_READ(tnk3_cmdirq_ack_r) |
| 1435 | 1425 | AM_RANGE(0xe006, 0xe006) AM_READ(tnk3_ymirq_ack_r) |
| 1436 | 1426 | ADDRESS_MAP_END |
| r22786 | r22787 | |
| 1440 | 1430 | AM_RANGE(0xc000, 0xc7ff) AM_RAM |
| 1441 | 1431 | AM_RANGE(0xd000, 0xd000) AM_READ(soundlatch_byte_r) |
| 1442 | 1432 | AM_RANGE(0xe000, 0xe000) AM_READ(tnk3_busy_clear_r) |
| 1443 | | AM_RANGE(0xf000, 0xf001) AM_DEVREADWRITE_LEGACY("ym1", ym3526_r, ym3526_w) |
| 1433 | AM_RANGE(0xf000, 0xf001) AM_DEVREADWRITE("ym1", ym3526_device, read, write) |
| 1444 | 1434 | // AM_RANGE(0xf002, 0xf002) AM_READNOP unknown |
| 1445 | 1435 | AM_RANGE(0xf004, 0xf004) AM_READ(tnk3_cmdirq_ack_r) |
| 1446 | 1436 | AM_RANGE(0xf006, 0xf006) AM_READ(tnk3_ymirq_ack_r) |
| r22786 | r22787 | |
| 1450 | 1440 | AM_RANGE(0x0000, 0xbfff) AM_ROM |
| 1451 | 1441 | AM_RANGE(0xc000, 0xcfff) AM_RAM |
| 1452 | 1442 | AM_RANGE(0xe000, 0xe000) AM_READ(soundlatch_byte_r) |
| 1453 | | AM_RANGE(0xe800, 0xe800) AM_DEVREADWRITE_LEGACY("ym1", ym3526_status_port_r, ym3526_control_port_w) |
| 1454 | | AM_RANGE(0xec00, 0xec00) AM_DEVWRITE_LEGACY("ym1", ym3526_write_port_w) |
| 1455 | | AM_RANGE(0xf000, 0xf000) AM_DEVREADWRITE_LEGACY("ym2", ym3526_status_port_r, ym3526_control_port_w) |
| 1456 | | AM_RANGE(0xf400, 0xf400) AM_DEVWRITE_LEGACY("ym2", ym3526_write_port_w) |
| 1443 | AM_RANGE(0xe800, 0xe800) AM_DEVREADWRITE("ym1", ym3526_device, status_port_r, control_port_w) |
| 1444 | AM_RANGE(0xec00, 0xec00) AM_DEVWRITE("ym1", ym3526_device, write_port_w) |
| 1445 | AM_RANGE(0xf000, 0xf000) AM_DEVREADWRITE("ym2", ym3526_device, status_port_r, control_port_w) |
| 1446 | AM_RANGE(0xf400, 0xf400) AM_DEVWRITE("ym2", ym3526_device, write_port_w) |
| 1457 | 1447 | AM_RANGE(0xf800, 0xf800) AM_READWRITE(snk_sound_status_r, snk_sound_status_w) |
| 1458 | 1448 | ADDRESS_MAP_END |
| 1459 | 1449 | |
| r22786 | r22787 | |
| 1470 | 1460 | AM_RANGE(0x0000, 0xbfff) AM_ROM |
| 1471 | 1461 | AM_RANGE(0xc000, 0xcfff) AM_RAM |
| 1472 | 1462 | AM_RANGE(0xe000, 0xe000) AM_READ(soundlatch_byte_r) |
| 1473 | | AM_RANGE(0xe800, 0xe800) AM_DEVREADWRITE_LEGACY("ym1", ym3526_status_port_r, ym3526_control_port_w) |
| 1474 | | AM_RANGE(0xec00, 0xec00) AM_DEVWRITE_LEGACY("ym1", ym3526_write_port_w) |
| 1463 | AM_RANGE(0xe800, 0xe800) AM_DEVREADWRITE("ym1", ym3526_device, status_port_r, control_port_w) |
| 1464 | AM_RANGE(0xec00, 0xec00) AM_DEVWRITE("ym1", ym3526_device, write_port_w) |
| 1475 | 1465 | AM_RANGE(0xf000, 0xf000) AM_DEVREADWRITE_LEGACY("ym2", y8950_status_port_r, y8950_control_port_w) |
| 1476 | 1466 | AM_RANGE(0xf400, 0xf400) AM_DEVWRITE_LEGACY("ym2", y8950_write_port_w) |
| 1477 | 1467 | AM_RANGE(0xf800, 0xf800) AM_READWRITE(snk_sound_status_r, snk_sound_status_w) |
| r22786 | r22787 | |
| 3808 | 3798 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 3809 | 3799 | |
| 3810 | 3800 | MCFG_SOUND_ADD("ym1", YM3526, XTAL_8MHz/2) /* verified on pcb */ |
| 3811 | | MCFG_SOUND_CONFIG(ym3526_config_1) |
| 3801 | MCFG_YM3526_IRQ_HANDLER(WRITELINE(snk_state, ymirq_callback_1)) |
| 3812 | 3802 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 2.0) |
| 3813 | 3803 | MACHINE_CONFIG_END |
| 3814 | 3804 | |
| r22786 | r22787 | |
| 3838 | 3828 | |
| 3839 | 3829 | /* sound hardware */ |
| 3840 | 3830 | MCFG_SOUND_ADD("ym2", YM3526, XTAL_8MHz/2) /* verified on pcb */ |
| 3841 | | MCFG_SOUND_CONFIG(ym3526_config_2) |
| 3831 | MCFG_YM3526_IRQ_HANDLER(WRITELINE(snk_state, ymirq_callback_2)) |
| 3842 | 3832 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 2.0) |
| 3843 | 3833 | MACHINE_CONFIG_END |
| 3844 | 3834 | |
| r22786 | r22787 | |
| 3892 | 3882 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 3893 | 3883 | |
| 3894 | 3884 | MCFG_SOUND_ADD("ym1", YM3526, XTAL_8MHz/2) /* verified on pcb */ |
| 3895 | | MCFG_SOUND_CONFIG(ym3526_config_1) |
| 3885 | MCFG_YM3526_IRQ_HANDLER(WRITELINE(snk_state, ymirq_callback_1)) |
| 3896 | 3886 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 2.0) |
| 3897 | 3887 | |
| 3898 | 3888 | MCFG_SOUND_ADD("ym2", YM3526, XTAL_8MHz/2) /* verified on pcb */ |
| 3899 | | MCFG_SOUND_CONFIG(ym3526_config_2) |
| 3889 | MCFG_YM3526_IRQ_HANDLER(WRITELINE(snk_state, ymirq_callback_2)) |
| 3900 | 3890 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 2.0) |
| 3901 | 3891 | MACHINE_CONFIG_END |
| 3902 | 3892 | |
| r22786 | r22787 | |
| 3948 | 3938 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 3949 | 3939 | |
| 3950 | 3940 | MCFG_SOUND_ADD("ym1", YM3526, XTAL_8MHz/2) /* verified on pcb */ |
| 3951 | | MCFG_SOUND_CONFIG(ym3526_config_1) |
| 3941 | MCFG_YM3526_IRQ_HANDLER(WRITELINE(snk_state, ymirq_callback_1)) |
| 3952 | 3942 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 2.0) |
| 3953 | 3943 | |
| 3954 | 3944 | MCFG_SOUND_ADD("ym2", Y8950, XTAL_8MHz/2) /* verified on pcb */ |
| r22786 | r22787 | |
| 4052 | 4042 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 4053 | 4043 | |
| 4054 | 4044 | MCFG_SOUND_ADD("ym1", YM3526, 4000000) |
| 4055 | | MCFG_SOUND_CONFIG(ym3526_config_1) |
| 4045 | MCFG_YM3526_IRQ_HANDLER(WRITELINE(snk_state, ymirq_callback_1)) |
| 4056 | 4046 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) |
| 4057 | 4047 | |
| 4058 | 4048 | MCFG_SOUND_ADD("ym2", Y8950, 4000000) |
trunk/src/mame/drivers/dec8.c
| r22786 | r22787 | |
| 855 | 855 | static ADDRESS_MAP_START( oscar_s_map, AS_PROGRAM, 8, dec8_state ) |
| 856 | 856 | AM_RANGE(0x0000, 0x05ff) AM_RAM |
| 857 | 857 | AM_RANGE(0x2000, 0x2001) AM_DEVWRITE("ym1", ym2203_device, write) |
| 858 | | AM_RANGE(0x4000, 0x4001) AM_DEVWRITE_LEGACY("ym2", ym3526_w) |
| 858 | AM_RANGE(0x4000, 0x4001) AM_DEVWRITE("ym2", ym3526_device, write) |
| 859 | 859 | AM_RANGE(0x6000, 0x6000) AM_READ(soundlatch_byte_r) |
| 860 | 860 | AM_RANGE(0x8000, 0xffff) AM_ROM |
| 861 | 861 | ADDRESS_MAP_END |
| r22786 | r22787 | |
| 864 | 864 | static ADDRESS_MAP_START( ym3526_s_map, AS_PROGRAM, 8, dec8_state ) |
| 865 | 865 | AM_RANGE(0x0000, 0x05ff) AM_RAM |
| 866 | 866 | AM_RANGE(0x0800, 0x0801) AM_DEVWRITE("ym1", ym2203_device, write) |
| 867 | | AM_RANGE(0x1000, 0x1001) AM_DEVWRITE_LEGACY("ym2", ym3526_w) |
| 867 | AM_RANGE(0x1000, 0x1001) AM_DEVWRITE("ym2", ym3526_device, write) |
| 868 | 868 | AM_RANGE(0x3000, 0x3000) AM_READ(soundlatch_byte_r) |
| 869 | 869 | AM_RANGE(0x8000, 0xffff) AM_ROM |
| 870 | 870 | ADDRESS_MAP_END |
| r22786 | r22787 | |
| 873 | 873 | static ADDRESS_MAP_START( csilver_s_map, AS_PROGRAM, 8, dec8_state ) |
| 874 | 874 | AM_RANGE(0x0000, 0x07ff) AM_RAM |
| 875 | 875 | AM_RANGE(0x0800, 0x0801) AM_DEVWRITE("ym1", ym2203_device, write) |
| 876 | | AM_RANGE(0x1000, 0x1001) AM_DEVWRITE_LEGACY("ym2", ym3526_w) |
| 876 | AM_RANGE(0x1000, 0x1001) AM_DEVWRITE("ym2", ym3526_device, write) |
| 877 | 877 | AM_RANGE(0x1800, 0x1800) AM_WRITE(csilver_adpcm_data_w) /* ADPCM data for the MSM5205 chip */ |
| 878 | 878 | AM_RANGE(0x2000, 0x2000) AM_WRITE(csilver_sound_bank_w) |
| 879 | 879 | AM_RANGE(0x3000, 0x3000) AM_READ(soundlatch_byte_r) |
| r22786 | r22787 | |
| 1908 | 1908 | m_audiocpu->set_input_line(0, state); /* M6502_IRQ_LINE */ |
| 1909 | 1909 | } |
| 1910 | 1910 | |
| 1911 | | static const ym3526_interface ym3526_config = |
| 1912 | | { |
| 1913 | | DEVCB_CPU_INPUT_LINE("audiocpu", M6502_IRQ_LINE) |
| 1914 | | }; |
| 1915 | | |
| 1916 | 1911 | static const ym3812_interface ym3812_config = |
| 1917 | 1912 | { |
| 1918 | 1913 | DEVCB_DRIVER_LINE_MEMBER(dec8_state,irqhandler) |
| r22786 | r22787 | |
| 2045 | 2040 | MCFG_SOUND_ROUTE(3, "mono", 0.20) |
| 2046 | 2041 | |
| 2047 | 2042 | MCFG_SOUND_ADD("ym2", YM3526, 3000000) |
| 2048 | | MCFG_SOUND_CONFIG(ym3526_config) |
| 2043 | MCFG_YM3526_IRQ_HANDLER(DEVWRITELINE("audiocpu", m6502_device, irq_line)) |
| 2049 | 2044 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.70) |
| 2050 | 2045 | MACHINE_CONFIG_END |
| 2051 | 2046 | |
| r22786 | r22787 | |
| 2094 | 2089 | MCFG_SOUND_ROUTE(3, "mono", 0.20) |
| 2095 | 2090 | |
| 2096 | 2091 | MCFG_SOUND_ADD("ym2", YM3526, 3000000) |
| 2097 | | MCFG_SOUND_CONFIG(ym3526_config) |
| 2092 | MCFG_YM3526_IRQ_HANDLER(DEVWRITELINE("audiocpu", m6502_device, irq_line)) |
| 2098 | 2093 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.70) |
| 2099 | 2094 | MACHINE_CONFIG_END |
| 2100 | 2095 | |
| r22786 | r22787 | |
| 2143 | 2138 | MCFG_SOUND_ROUTE(3, "mono", 0.20) |
| 2144 | 2139 | |
| 2145 | 2140 | MCFG_SOUND_ADD("ym2", YM3526, 3000000) |
| 2146 | | MCFG_SOUND_CONFIG(ym3526_config) |
| 2141 | MCFG_YM3526_IRQ_HANDLER(DEVWRITELINE("audiocpu", m6502_device, irq_line)) |
| 2147 | 2142 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.70) |
| 2148 | 2143 | MACHINE_CONFIG_END |
| 2149 | 2144 | |
| r22786 | r22787 | |
| 2192 | 2187 | MCFG_SOUND_ROUTE(3, "mono", 0.20) |
| 2193 | 2188 | |
| 2194 | 2189 | MCFG_SOUND_ADD("ym2", YM3526, 3000000) |
| 2195 | | MCFG_SOUND_CONFIG(ym3526_config) |
| 2190 | MCFG_YM3526_IRQ_HANDLER(DEVWRITELINE("audiocpu", m6502_device, irq_line)) |
| 2196 | 2191 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.70) |
| 2197 | 2192 | MACHINE_CONFIG_END |
| 2198 | 2193 | |
| r22786 | r22787 | |
| 2294 | 2289 | MCFG_SOUND_ROUTE(3, "mono", 0.20) |
| 2295 | 2290 | |
| 2296 | 2291 | MCFG_SOUND_ADD("ym2", YM3526, XTAL_12MHz/4) /* verified on pcb */ |
| 2297 | | MCFG_SOUND_CONFIG(ym3526_config) |
| 2292 | MCFG_YM3526_IRQ_HANDLER(DEVWRITELINE("audiocpu", m6502_device, irq_line)) |
| 2298 | 2293 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.70) |
| 2299 | 2294 | |
| 2300 | 2295 | MCFG_SOUND_ADD("msm", MSM5205, XTAL_384kHz) /* verified on pcb */ |
| r22786 | r22787 | |
| 2350 | 2345 | MCFG_SOUND_ROUTE(3, "mono", 0.20) |
| 2351 | 2346 | |
| 2352 | 2347 | MCFG_SOUND_ADD("ym2", YM3526, XTAL_12MHz/4) /* verified on pcb */ |
| 2353 | | MCFG_SOUND_CONFIG(ym3526_config) |
| 2348 | MCFG_YM3526_IRQ_HANDLER(DEVWRITELINE("audiocpu", m6502_device, irq_line)) |
| 2354 | 2349 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.70) |
| 2355 | 2350 | MACHINE_CONFIG_END |
| 2356 | 2351 | |
trunk/src/emu/sound/3526intf.c
| r22786 | r22787 | |
| 22 | 22 | #include "sound/fmopl.h" |
| 23 | 23 | |
| 24 | 24 | |
| 25 | | struct ym3526_state |
| 25 | /* IRQ Handler */ |
| 26 | static void IRQHandler(void *param,int irq) |
| 26 | 27 | { |
| 27 | | sound_stream * stream; |
| 28 | | emu_timer * timer[2]; |
| 29 | | void * chip; |
| 30 | | const ym3526_interface *intf; |
| 31 | | device_t *device; |
| 32 | | |
| 33 | | devcb_resolved_write_line out_int_func; |
| 34 | | }; |
| 35 | | |
| 36 | | |
| 37 | | INLINE ym3526_state *get_safe_token(device_t *device) |
| 38 | | { |
| 39 | | assert(device != NULL); |
| 40 | | assert(device->type() == YM3526); |
| 41 | | return (ym3526_state *)downcast<ym3526_device *>(device)->token(); |
| 28 | ym3526_device *ym3526 = (ym3526_device *) param; |
| 29 | ym3526->_IRQHandler(irq); |
| 42 | 30 | } |
| 43 | 31 | |
| 44 | | |
| 45 | | /* IRQ Handler */ |
| 46 | | static void IRQHandler(void *param,int irq) |
| 32 | void ym3526_device::_IRQHandler(int irq) |
| 47 | 33 | { |
| 48 | | ym3526_state *info = (ym3526_state *)param; |
| 49 | | info->out_int_func(irq ? ASSERT_LINE : CLEAR_LINE); |
| 34 | if (!m_irq_handler.isnull()) |
| 35 | m_irq_handler(irq); |
| 50 | 36 | } |
| 37 | |
| 51 | 38 | /* Timer overflow callback from timer.c */ |
| 52 | | static TIMER_CALLBACK( timer_callback_0 ) |
| 39 | void ym3526_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) |
| 53 | 40 | { |
| 54 | | ym3526_state *info = (ym3526_state *)ptr; |
| 55 | | ym3526_timer_over(info->chip,0); |
| 41 | switch(id) |
| 42 | { |
| 43 | case 0: |
| 44 | ym3526_timer_over(m_chip,0); |
| 45 | break; |
| 46 | |
| 47 | case 1: |
| 48 | ym3526_timer_over(m_chip,1); |
| 49 | break; |
| 50 | } |
| 56 | 51 | } |
| 57 | | static TIMER_CALLBACK( timer_callback_1 ) |
| 52 | |
| 53 | static void timer_handler(void *param,int c,attotime period) |
| 58 | 54 | { |
| 59 | | ym3526_state *info = (ym3526_state *)ptr; |
| 60 | | ym3526_timer_over(info->chip,1); |
| 55 | ym3526_device *ym3526 = (ym3526_device *) param; |
| 56 | ym3526->_timer_handler(c, period); |
| 61 | 57 | } |
| 62 | | /* TimerHandler from fm.c */ |
| 63 | | static void TimerHandler(void *param,int c,attotime period) |
| 58 | |
| 59 | void ym3526_device::_timer_handler(int c,attotime period) |
| 64 | 60 | { |
| 65 | | ym3526_state *info = (ym3526_state *)param; |
| 66 | 61 | if( period == attotime::zero ) |
| 67 | 62 | { /* Reset FM Timer */ |
| 68 | | info->timer[c]->enable(false); |
| 63 | m_timer[c]->enable(false); |
| 69 | 64 | } |
| 70 | 65 | else |
| 71 | 66 | { /* Start FM Timer */ |
| 72 | | info->timer[c]->adjust(period); |
| 67 | m_timer[c]->adjust(period); |
| 73 | 68 | } |
| 74 | 69 | } |
| 75 | 70 | |
| 76 | | |
| 77 | | static STREAM_UPDATE( ym3526_stream_update ) |
| 71 | /* update request from fm.c */ |
| 72 | void ym3526_update_request(void *param, int interval) |
| 78 | 73 | { |
| 79 | | ym3526_state *info = (ym3526_state *)param; |
| 80 | | ym3526_update_one(info->chip, outputs[0], samples); |
| 74 | ym3526_device *ym3526 = (ym3526_device *) param; |
| 75 | ym3526->_ym3526_update_request(); |
| 81 | 76 | } |
| 82 | 77 | |
| 83 | | static void _stream_update(void *param, int interval) |
| 78 | void ym3526_device::_ym3526_update_request() |
| 84 | 79 | { |
| 85 | | ym3526_state *info = (ym3526_state *)param; |
| 86 | | info->stream->update(); |
| 80 | m_stream->update(); |
| 87 | 81 | } |
| 88 | 82 | |
| 89 | 83 | |
| 90 | | static DEVICE_START( ym3526 ) |
| 84 | |
| 85 | //------------------------------------------------- |
| 86 | // sound_stream_update - handle a stream update |
| 87 | //------------------------------------------------- |
| 88 | |
| 89 | void ym3526_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) |
| 91 | 90 | { |
| 92 | | static const ym3526_interface dummy = { DEVCB_NULL }; |
| 93 | | ym3526_state *info = get_safe_token(device); |
| 94 | | int rate = device->clock()/72; |
| 91 | ym3526_update_one(m_chip, outputs[0], samples); |
| 92 | } |
| 95 | 93 | |
| 96 | | info->intf = device->static_config() ? (const ym3526_interface *)device->static_config() : &dummy; |
| 97 | | info->device = device; |
| 98 | 94 | |
| 95 | //------------------------------------------------- |
| 96 | // device_start - device-specific startup |
| 97 | //------------------------------------------------- |
| 98 | |
| 99 | void ym3526_device::device_start() |
| 100 | { |
| 101 | int rate = clock()/72; |
| 102 | |
| 99 | 103 | // resolve callbacks |
| 100 | | info->out_int_func.resolve(info->intf->out_int_func, *device); |
| 104 | m_irq_handler.resolve(); |
| 101 | 105 | |
| 102 | 106 | /* stream system initialize */ |
| 103 | | info->chip = ym3526_init(device,device->clock(),rate); |
| 104 | | assert_always(info->chip != NULL, "Error creating YM3526 chip"); |
| 107 | m_chip = ym3526_init(this,clock(),rate); |
| 108 | assert_always(m_chip != NULL, "Error creating YM3526 chip"); |
| 105 | 109 | |
| 106 | | info->stream = device->machine().sound().stream_alloc(*device,0,1,rate,info,ym3526_stream_update); |
| 110 | m_stream = machine().sound().stream_alloc(*this,0,1,rate); |
| 107 | 111 | /* YM3526 setup */ |
| 108 | | ym3526_set_timer_handler (info->chip, TimerHandler, info); |
| 109 | | ym3526_set_irq_handler (info->chip, IRQHandler, info); |
| 110 | | ym3526_set_update_handler(info->chip, _stream_update, info); |
| 112 | ym3526_set_timer_handler (m_chip, timer_handler, this); |
| 113 | ym3526_set_irq_handler (m_chip, IRQHandler, this); |
| 114 | ym3526_set_update_handler(m_chip, ym3526_update_request, this); |
| 111 | 115 | |
| 112 | | info->timer[0] = device->machine().scheduler().timer_alloc(FUNC(timer_callback_0), info); |
| 113 | | info->timer[1] = device->machine().scheduler().timer_alloc(FUNC(timer_callback_1), info); |
| 116 | m_timer[0] = timer_alloc(0); |
| 117 | m_timer[1] = timer_alloc(1); |
| 114 | 118 | } |
| 115 | 119 | |
| 116 | | static DEVICE_STOP( ym3526 ) |
| 120 | //------------------------------------------------- |
| 121 | // device_stop - device-specific stop |
| 122 | //------------------------------------------------- |
| 123 | |
| 124 | void ym3526_device::device_stop() |
| 117 | 125 | { |
| 118 | | ym3526_state *info = get_safe_token(device); |
| 119 | | ym3526_shutdown(info->chip); |
| 126 | ym3526_shutdown(m_chip); |
| 120 | 127 | } |
| 121 | 128 | |
| 122 | | static DEVICE_RESET( ym3526 ) |
| 129 | //------------------------------------------------- |
| 130 | // device_reset - device-specific reset |
| 131 | //------------------------------------------------- |
| 132 | |
| 133 | void ym3526_device::device_reset() |
| 123 | 134 | { |
| 124 | | ym3526_state *info = get_safe_token(device); |
| 125 | | ym3526_reset_chip(info->chip); |
| 135 | ym3526_reset_chip(m_chip); |
| 126 | 136 | } |
| 127 | 137 | |
| 128 | 138 | |
| 129 | | READ8_DEVICE_HANDLER( ym3526_r ) |
| 139 | READ8_MEMBER( ym3526_device::read ) |
| 130 | 140 | { |
| 131 | | ym3526_state *info = get_safe_token(device); |
| 132 | | return ym3526_read(info->chip, offset & 1); |
| 141 | return ym3526_read(m_chip, offset & 1); |
| 133 | 142 | } |
| 134 | 143 | |
| 135 | | WRITE8_DEVICE_HANDLER( ym3526_w ) |
| 144 | WRITE8_MEMBER( ym3526_device::write ) |
| 136 | 145 | { |
| 137 | | ym3526_state *info = get_safe_token(device); |
| 138 | | ym3526_write(info->chip, offset & 1, data); |
| 146 | ym3526_write(m_chip, offset & 1, data); |
| 139 | 147 | } |
| 140 | 148 | |
| 141 | | READ8_DEVICE_HANDLER( ym3526_status_port_r ) { return ym3526_r(device, space, 0); } |
| 142 | | READ8_DEVICE_HANDLER( ym3526_read_port_r ) { return ym3526_r(device, space, 1); } |
| 143 | | WRITE8_DEVICE_HANDLER( ym3526_control_port_w ) { ym3526_w(device, space, 0, data); } |
| 144 | | WRITE8_DEVICE_HANDLER( ym3526_write_port_w ) { ym3526_w(device, space, 1, data); } |
| 149 | READ8_MEMBER( ym3526_device::status_port_r ) { return read(space, 0); } |
| 150 | READ8_MEMBER( ym3526_device::read_port_r ) { return read(space, 1); } |
| 151 | WRITE8_MEMBER( ym3526_device::control_port_w ) { write(space, 0, data); } |
| 152 | WRITE8_MEMBER( ym3526_device::write_port_w ) { write(space, 1, data); } |
| 145 | 153 | |
| 146 | 154 | |
| 147 | 155 | const device_type YM3526 = &device_creator<ym3526_device>; |
| 148 | 156 | |
| 149 | 157 | ym3526_device::ym3526_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 150 | 158 | : device_t(mconfig, YM3526, "YM3526", tag, owner, clock), |
| 151 | | device_sound_interface(mconfig, *this) |
| 159 | device_sound_interface(mconfig, *this), |
| 160 | m_irq_handler(*this) |
| 152 | 161 | { |
| 153 | | m_token = global_alloc_clear(ym3526_state); |
| 154 | 162 | } |
| 155 | 163 | |
| 156 | 164 | //------------------------------------------------- |
| r22786 | r22787 | |
| 162 | 170 | void ym3526_device::device_config_complete() |
| 163 | 171 | { |
| 164 | 172 | } |
| 165 | | |
| 166 | | //------------------------------------------------- |
| 167 | | // device_start - device-specific startup |
| 168 | | //------------------------------------------------- |
| 169 | | |
| 170 | | void ym3526_device::device_start() |
| 171 | | { |
| 172 | | DEVICE_START_NAME( ym3526 )(this); |
| 173 | | } |
| 174 | | |
| 175 | | //------------------------------------------------- |
| 176 | | // device_reset - device-specific reset |
| 177 | | //------------------------------------------------- |
| 178 | | |
| 179 | | void ym3526_device::device_reset() |
| 180 | | { |
| 181 | | DEVICE_RESET_NAME( ym3526 )(this); |
| 182 | | } |
| 183 | | |
| 184 | | //------------------------------------------------- |
| 185 | | // device_stop - device-specific stop |
| 186 | | //------------------------------------------------- |
| 187 | | |
| 188 | | void ym3526_device::device_stop() |
| 189 | | { |
| 190 | | DEVICE_STOP_NAME( ym3526 )(this); |
| 191 | | } |
| 192 | | |
| 193 | | //------------------------------------------------- |
| 194 | | // sound_stream_update - handle a stream update |
| 195 | | //------------------------------------------------- |
| 196 | | |
| 197 | | void ym3526_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) |
| 198 | | { |
| 199 | | // should never get here |
| 200 | | fatalerror("sound_stream_update called; not applicable to legacy sound devices\n"); |
| 201 | | } |
trunk/src/emu/sound/3526intf.h
| r22786 | r22787 | |
| 3 | 3 | #ifndef __3526INTF_H__ |
| 4 | 4 | #define __3526INTF_H__ |
| 5 | 5 | |
| 6 | | #include "devlegcy.h" |
| 6 | #include "emu.h" |
| 7 | 7 | |
| 8 | | struct ym3526_interface |
| 9 | | { |
| 10 | | devcb_write_line out_int_func; |
| 11 | | }; |
| 8 | #define MCFG_YM3526_IRQ_HANDLER(_devcb) \ |
| 9 | devcb = &ym3526_device::set_irq_handler(*device, DEVCB2_##_devcb); |
| 12 | 10 | |
| 13 | | DECLARE_READ8_DEVICE_HANDLER( ym3526_r ); |
| 14 | | DECLARE_WRITE8_DEVICE_HANDLER( ym3526_w ); |
| 15 | | |
| 16 | | DECLARE_READ8_DEVICE_HANDLER( ym3526_status_port_r ); |
| 17 | | DECLARE_READ8_DEVICE_HANDLER( ym3526_read_port_r ); |
| 18 | | DECLARE_WRITE8_DEVICE_HANDLER( ym3526_control_port_w ); |
| 19 | | DECLARE_WRITE8_DEVICE_HANDLER( ym3526_write_port_w ); |
| 20 | | |
| 21 | 11 | class ym3526_device : public device_t, |
| 22 | 12 | public device_sound_interface |
| 23 | 13 | { |
| 24 | 14 | public: |
| 25 | 15 | ym3526_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 26 | | ~ym3526_device() { global_free(m_token); } |
| 27 | 16 | |
| 28 | | // access to legacy token |
| 29 | | void *token() const { assert(m_token != NULL); return m_token; } |
| 17 | // static configuration helpers |
| 18 | template<class _Object> static devcb2_base &set_irq_handler(device_t &device, _Object object) { return downcast<ym3526_device &>(device).m_irq_handler.set_callback(object); } |
| 19 | |
| 20 | DECLARE_READ8_MEMBER( read ); |
| 21 | DECLARE_WRITE8_MEMBER( write ); |
| 22 | |
| 23 | DECLARE_READ8_MEMBER( status_port_r ); |
| 24 | DECLARE_READ8_MEMBER( read_port_r ); |
| 25 | DECLARE_WRITE8_MEMBER( control_port_w ); |
| 26 | DECLARE_WRITE8_MEMBER( write_port_w ); |
| 27 | |
| 28 | void _IRQHandler(int irq); |
| 29 | void _timer_handler(int c,attotime period); |
| 30 | void _ym3526_update_request(); |
| 31 | |
| 30 | 32 | protected: |
| 31 | 33 | // device-level overrides |
| 32 | 34 | virtual void device_config_complete(); |
| r22786 | r22787 | |
| 34 | 36 | virtual void device_stop(); |
| 35 | 37 | virtual void device_reset(); |
| 36 | 38 | |
| 39 | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
| 40 | |
| 37 | 41 | // sound stream update overrides |
| 38 | 42 | virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples); |
| 43 | |
| 39 | 44 | private: |
| 40 | 45 | // internal state |
| 41 | | void *m_token; |
| 46 | sound_stream * m_stream; |
| 47 | emu_timer * m_timer[2]; |
| 48 | void * m_chip; |
| 49 | devcb2_write_line m_irq_handler; |
| 42 | 50 | }; |
| 43 | 51 | |
| 44 | 52 | extern const device_type YM3526; |