trunk/src/emu/sound/votrax.c
| r28710 | r28711 | |
| 98 | 98 | : device_t(mconfig, VOTRAX_SC01, "Votrax SC-01", tag, owner, clock, "votrax", __FILE__), |
| 99 | 99 | device_sound_interface(mconfig, *this), |
| 100 | 100 | m_stream(NULL), |
| 101 | | m_phoneme_timer(NULL) |
| 101 | m_phoneme_timer(NULL), |
| 102 | m_request_cb(*this) |
| 102 | 103 | { |
| 103 | 104 | } |
| 104 | 105 | |
| 105 | | |
| 106 | | //------------------------------------------------- |
| 107 | | // static_set_interface - configuration helper |
| 108 | | // to set the interface |
| 109 | | //------------------------------------------------- |
| 110 | | |
| 111 | | void votrax_sc01_device::static_set_interface(device_t &device, const votrax_sc01_interface &interface) |
| 112 | | { |
| 113 | | votrax_sc01_device &votrax = downcast<votrax_sc01_device &>(device); |
| 114 | | static_cast<votrax_sc01_interface &>(votrax) = interface; |
| 115 | | } |
| 116 | | |
| 117 | | |
| 118 | | |
| 119 | 106 | //************************************************************************** |
| 120 | 107 | // READ/WRITE HANDLERS |
| 121 | 108 | //************************************************************************** |
| r28710 | r28711 | |
| 144 | 131 | m_latch_92 = 0; |
| 145 | 132 | |
| 146 | 133 | // clear the request signal |
| 147 | | m_request_func(m_request_state = m_internal_request = CLEAR_LINE); |
| 134 | m_request_cb(m_request_state = m_internal_request = CLEAR_LINE); |
| 148 | 135 | m_phoneme_timer->adjust(attotime::zero); |
| 149 | 136 | } |
| 150 | 137 | |
| r28710 | r28711 | |
| 1145 | 1132 | m_phoneme = 0x3f; |
| 1146 | 1133 | |
| 1147 | 1134 | // reset outputs |
| 1148 | | m_request_func.resolve(m_request_cb, *this); |
| 1135 | m_request_cb.resolve_safe(); |
| 1149 | 1136 | m_request_state = ASSERT_LINE; |
| 1150 | 1137 | m_internal_request = ASSERT_LINE; |
| 1151 | 1138 | |
| r28710 | r28711 | |
| 1237 | 1224 | |
| 1238 | 1225 | // reset inputs |
| 1239 | 1226 | m_phoneme = 0x3f; |
| 1240 | | m_request_func(m_internal_request = m_request_state = ASSERT_LINE); |
| 1227 | m_request_cb(m_internal_request = m_request_state = ASSERT_LINE); |
| 1241 | 1228 | |
| 1242 | 1229 | // reset timing circuit |
| 1243 | 1230 | m_master_clock = 0; |
| r28710 | r28711 | |
| 1356 | 1343 | if (m_internal_request == ASSERT_LINE) |
| 1357 | 1344 | { |
| 1358 | 1345 | mame_printf_debug("%s: REQUEST\n", timer.machine().time().as_string(3)); |
| 1359 | | m_request_func(m_request_state = ASSERT_LINE); |
| 1346 | m_request_cb(m_request_state = ASSERT_LINE); |
| 1360 | 1347 | return; |
| 1361 | 1348 | } |
| 1362 | 1349 | |
trunk/src/emu/sound/votrax.h
| r28710 | r28711 | |
| 20 | 20 | // INTERFACE CONFIGURATION MACROS |
| 21 | 21 | //************************************************************************** |
| 22 | 22 | |
| 23 | | #define MCFG_VOTRAX_SC01_ADD(_tag, _clock, _interface) \ |
| 24 | | MCFG_DEVICE_ADD(_tag, VOTRAX_SC01, _clock) \ |
| 25 | | votrax_sc01_device::static_set_interface(*device, _interface); |
| 23 | #define MCFG_VOTRAX_SC01_REQUEST_CB(_devcb) \ |
| 24 | devcb = &votrax_sc01_device::set_request_callback(*device, DEVCB2_##_devcb); |
| 26 | 25 | |
| 27 | 26 | |
| 28 | 27 | //************************************************************************** |
| 29 | 28 | // TYPE DEFINITIONS |
| 30 | 29 | //************************************************************************** |
| 31 | 30 | |
| 32 | | // ======================> votrax_sc01_interface |
| 33 | | |
| 34 | | struct votrax_sc01_interface |
| 35 | | { |
| 36 | | devcb_write_line m_request_cb; // callback for request |
| 37 | | }; |
| 38 | | |
| 39 | | |
| 40 | 31 | // ======================> votrax_sc01_device |
| 41 | 32 | |
| 42 | 33 | class votrax_sc01_device : public device_t, |
| 43 | | public device_sound_interface, |
| 44 | | public votrax_sc01_interface |
| 34 | public device_sound_interface |
| 45 | 35 | { |
| 46 | 36 | public: |
| 47 | 37 | // construction/destruction |
| 48 | 38 | votrax_sc01_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 49 | 39 | |
| 50 | | // static configuration helpers |
| 51 | | static void static_set_interface(device_t &device, const votrax_sc01_interface &interface); |
| 52 | | |
| 40 | template<class _Object> static devcb2_base &set_request_callback(device_t &device, _Object object) { return downcast<votrax_sc01_device &>(device).m_request_cb.set_callback(object); } |
| 41 | |
| 53 | 42 | // writers |
| 54 | 43 | DECLARE_WRITE8_MEMBER( write ); |
| 55 | 44 | DECLARE_WRITE8_MEMBER( inflection_w ); |
| r28710 | r28711 | |
| 84 | 73 | UINT8 m_phoneme; // 6-bit phoneme value |
| 85 | 74 | |
| 86 | 75 | // outputs |
| 87 | | devcb_resolved_write_line m_request_func; // request callback |
| 76 | devcb2_write_line m_request_cb; // callback for request |
| 88 | 77 | UINT8 m_request_state; // request as seen to the outside world |
| 89 | 78 | UINT8 m_internal_request; // request managed by stream timing |
| 90 | 79 | |
trunk/src/mess/drivers/votrpss.c
| r28710 | r28711 | |
| 256 | 256 | DEVCB_NULL // port B write |
| 257 | 257 | }; |
| 258 | 258 | |
| 259 | | static struct votrax_sc01_interface votrax_interface = |
| 260 | | { |
| 261 | | }; |
| 262 | | |
| 263 | 259 | WRITE8_MEMBER( votrpss_state::kbd_put ) |
| 264 | 260 | { |
| 265 | 261 | m_term_data = data; |
| r28710 | r28711 | |
| 294 | 290 | MCFG_SOUND_ADD("ay", AY8910, XTAL_8MHz/4) /* 2.000 MHz, verified */ |
| 295 | 291 | MCFG_SOUND_CONFIG(ay8910_intf) |
| 296 | 292 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 297 | | MCFG_VOTRAX_SC01_ADD("votrax", 720000, votrax_interface ) /* 720 kHz? needs verify */ |
| 293 | MCFG_DEVICE_ADD("votrax", VOTRAX_SC01, 720000) /* 720 kHz? needs verify */ |
| 298 | 294 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) |
| 299 | 295 | |
| 300 | 296 | /* Devices */ |
trunk/src/mess/drivers/votrtnt.c
| r28710 | r28711 | |
| 97 | 97 | m_acia->write_rxc(state); |
| 98 | 98 | } |
| 99 | 99 | |
| 100 | | static struct votrax_sc01_interface votrtnt_votrax_interface = |
| 101 | | { |
| 102 | | DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0) |
| 103 | | }; |
| 104 | 100 | |
| 105 | 101 | /****************************************************************************** |
| 106 | 102 | Machine Drivers |
| r28710 | r28711 | |
| 128 | 124 | |
| 129 | 125 | /* sound hardware */ |
| 130 | 126 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 131 | | MCFG_VOTRAX_SC01_ADD("votrax", 720000, votrtnt_votrax_interface ) /* 720kHz? needs verify */ |
| 127 | MCFG_DEVICE_ADD("votrax", VOTRAX_SC01, 720000) /* 720kHz? needs verify */ |
| 128 | MCFG_VOTRAX_SC01_REQUEST_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0)) |
| 132 | 129 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) |
| 133 | 130 | MACHINE_CONFIG_END |
| 134 | 131 | |
trunk/src/mame/audio/gottlieb.c
| r28710 | r28711 | |
| 452 | 452 | |
| 453 | 453 | |
| 454 | 454 | //------------------------------------------------- |
| 455 | | // VOTRAX interface |
| 456 | | //------------------------------------------------- |
| 457 | | |
| 458 | | static const votrax_sc01_interface gottlieb_votrax_interface = |
| 459 | | { |
| 460 | | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, gottlieb_sound_r1_device, votrax_request) |
| 461 | | }; |
| 462 | | |
| 463 | | |
| 464 | | //------------------------------------------------- |
| 465 | 455 | // audio CPU map |
| 466 | 456 | //------------------------------------------------- |
| 467 | 457 | |
| r28710 | r28711 | |
| 498 | 488 | MCFG_FRAGMENT_ADD(gottlieb_sound_r1) |
| 499 | 489 | |
| 500 | 490 | // add the VOTRAX |
| 501 | | MCFG_VOTRAX_SC01_ADD("votrax", 720000, gottlieb_votrax_interface) |
| 491 | MCFG_DEVICE_ADD("votrax", VOTRAX_SC01, 720000) |
| 492 | MCFG_VOTRAX_SC01_REQUEST_CB(DEVWRITELINE(DEVICE_SELF_OWNER, gottlieb_sound_r1_device, votrax_request)) |
| 502 | 493 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, DEVICE_SELF_OWNER, 0.50) |
| 503 | 494 | MACHINE_CONFIG_END |
| 504 | 495 | |