trunk/src/emu/machine/ay31015.c
| r29637 | r29638 | |
| 96 | 96 | const device_type AY51013 = &device_creator<ay51013_device>; |
| 97 | 97 | |
| 98 | 98 | ay31015_device::ay31015_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) |
| 99 | | : device_t(mconfig, type, name, tag, owner, clock, shortname, source) |
| 99 | : device_t(mconfig, type, name, tag, owner, clock, shortname, source), |
| 100 | m_rx_clock(0), |
| 101 | m_tx_clock(0), |
| 102 | m_read_si_cb(*this), |
| 103 | m_write_so_cb(*this), |
| 104 | m_status_changed_cb(*this) |
| 100 | 105 | { |
| 101 | 106 | } |
| 102 | 107 | |
| 103 | 108 | ay31015_device::ay31015_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 104 | | : device_t(mconfig, AY31015, "AY-3-1015", tag, owner, clock, "ay31015", __FILE__) |
| 109 | : device_t(mconfig, AY31015, "AY-3-1015", tag, owner, clock, "ay31015", __FILE__), |
| 110 | m_read_si_cb(*this), |
| 111 | m_write_so_cb(*this), |
| 112 | m_status_changed_cb(*this) |
| 105 | 113 | { |
| 106 | 114 | } |
| 107 | 115 | |
| r29637 | r29638 | |
| 111 | 119 | } |
| 112 | 120 | |
| 113 | 121 | //------------------------------------------------- |
| 114 | | // device_config_complete - perform any |
| 115 | | // operations now that the configuration is |
| 116 | | // complete |
| 117 | | //------------------------------------------------- |
| 118 | | |
| 119 | | void ay31015_device::device_config_complete() |
| 120 | | { |
| 121 | | // inherit a copy of the static data |
| 122 | | const ay31015_config *intf = reinterpret_cast<const ay31015_config *>(static_config()); |
| 123 | | if (intf != NULL) |
| 124 | | *static_cast<ay31015_config *>(this) = *intf; |
| 125 | | |
| 126 | | // or initialize to defaults if none provided |
| 127 | | else |
| 128 | | { |
| 129 | | memset(&read_si_cb, 0, sizeof(read_si_cb)); |
| 130 | | memset(&write_so_cb, 0, sizeof(write_so_cb)); |
| 131 | | memset(&status_changed_cb, 0, sizeof(status_changed_cb)); |
| 132 | | transmitter_clock = 0; |
| 133 | | receiver_clock = 0; |
| 134 | | } |
| 135 | | } |
| 136 | | |
| 137 | | //------------------------------------------------- |
| 138 | 122 | // device_start - device-specific startup |
| 139 | 123 | //------------------------------------------------- |
| 140 | 124 | |
| 141 | 125 | void ay31015_device::device_start() |
| 142 | 126 | { |
| 143 | | m_read_si.resolve(read_si_cb, *this); |
| 144 | | m_write_so.resolve(write_so_cb, *this); |
| 145 | | m_status_changed.resolve(status_changed_cb, *this); |
| 127 | m_read_si_cb.resolve(); |
| 128 | m_write_so_cb.resolve(); |
| 129 | m_status_changed_cb.resolve(); |
| 146 | 130 | |
| 147 | | m_tx_clock = transmitter_clock; |
| 148 | | m_rx_clock = receiver_clock; |
| 149 | | |
| 150 | 131 | m_rx_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(ay31015_device::rx_process),this)); |
| 151 | 132 | m_tx_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(ay31015_device::tx_process),this)); |
| 152 | 133 | |
| r29637 | r29638 | |
| 191 | 172 | |
| 192 | 173 | inline UINT8 ay31015_device::get_si() |
| 193 | 174 | { |
| 194 | | if (!m_read_si.isnull()) |
| 195 | | m_pins[AY31015_SI] = m_read_si(0) ? 1 : 0; |
| 175 | if (!m_read_si_cb.isnull()) |
| 176 | m_pins[AY31015_SI] = m_read_si_cb(0) ? 1 : 0; |
| 196 | 177 | |
| 197 | 178 | return m_pins[AY31015_SI]; |
| 198 | 179 | } |
| r29637 | r29638 | |
| 202 | 183 | { |
| 203 | 184 | m_pins[AY31015_SO] = data ? 1 : 0; |
| 204 | 185 | |
| 205 | | if (!m_write_so.isnull()) |
| 206 | | m_write_so(0, m_pins[AY31015_SO]); |
| 186 | if (!m_write_so_cb.isnull()) |
| 187 | m_write_so_cb((offs_t)0, m_pins[AY31015_SO]); |
| 207 | 188 | } |
| 208 | 189 | |
| 209 | 190 | |
| r29637 | r29638 | |
| 238 | 219 | } |
| 239 | 220 | status_pins_changed += update_status_pin(STATUS_EOC, AY31015_EOC); |
| 240 | 221 | |
| 241 | | if (status_pins_changed && !m_status_changed.isnull()) |
| 222 | if (status_pins_changed && !m_status_changed_cb.isnull()) |
| 242 | 223 | { |
| 243 | | m_status_changed(0, status_pins_changed); |
| 224 | m_status_changed_cb((offs_t)0, status_pins_changed); |
| 244 | 225 | } |
| 245 | 226 | } |
| 246 | 227 | |
trunk/src/emu/machine/ay31015.h
| r29637 | r29638 | |
| 39 | 39 | }; |
| 40 | 40 | |
| 41 | 41 | |
| 42 | | struct ay31015_config |
| 43 | | { |
| 44 | | double transmitter_clock; /* TCP - pin 40 */ |
| 45 | | double receiver_clock; /* RCP - pin 17 */ |
| 46 | | devcb_read8 read_si_cb; /* SI - pin 20 - This will be called whenever the SI pin is sampled. Optional */ |
| 47 | | devcb_write8 write_so_cb; /* SO - pin 25 - This will be called whenever data is put on the SO pin. Optional */ |
| 48 | | devcb_write8 status_changed_cb; /* This will be called whenever one of the status pins may have changed. Optional */ |
| 49 | | }; |
| 50 | | |
| 51 | | |
| 52 | 42 | /*************************************************************************** |
| 53 | 43 | DEVICE INTERFACE |
| 54 | 44 | ***************************************************************************/ |
| r29637 | r29638 | |
| 66 | 56 | |
| 67 | 57 | ALLOW_SAVE_TYPE(state_t); |
| 68 | 58 | |
| 69 | | class ay31015_device : public device_t, |
| 70 | | public ay31015_config |
| 59 | class ay31015_device : public device_t |
| 71 | 60 | { |
| 72 | 61 | public: |
| 73 | 62 | ay31015_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 74 | 63 | ay31015_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); |
| 75 | 64 | ~ay31015_device() {} |
| 76 | 65 | |
| 77 | | |
| 66 | static void set_tx_clock(device_t &device, double tx_clock) { downcast<ay31015_device &>(device).m_tx_clock = tx_clock; } |
| 67 | static void set_rx_clock(device_t &device, double rx_clock) { downcast<ay31015_device &>(device).m_rx_clock = rx_clock; } |
| 68 | template<class _Object> static devcb2_base &set_read_si_callback(device_t &device, _Object object) { return downcast<ay31015_device &>(device).m_read_si_cb.set_callback(object); } |
| 69 | template<class _Object> static devcb2_base &set_write_so_callback(device_t &device, _Object object) { return downcast<ay31015_device &>(device).m_write_so_cb.set_callback(object); } |
| 70 | template<class _Object> static devcb2_base &set_status_changed_callback(device_t &device, _Object object) { return downcast<ay31015_device &>(device).m_status_changed_cb.set_callback(object); } |
| 71 | |
| 78 | 72 | /* Set an input pin */ |
| 79 | 73 | void set_input_pin( ay31015_input_pin_t pin, int data ); |
| 80 | 74 | |
| r29637 | r29638 | |
| 102 | 96 | |
| 103 | 97 | protected: |
| 104 | 98 | // device-level overrides |
| 105 | | virtual void device_config_complete(); |
| 106 | 99 | virtual void device_start(); |
| 107 | 100 | virtual void device_reset(); |
| 108 | 101 | |
| r29637 | r29638 | |
| 133 | 126 | UINT8 m_rx_bit_count; |
| 134 | 127 | UINT8 m_rx_parity; |
| 135 | 128 | UINT16 m_rx_pulses; // total pulses left |
| 136 | | double m_rx_clock; |
| 129 | double m_rx_clock; /* RCP - pin 17 */ |
| 137 | 130 | emu_timer *m_rx_timer; |
| 138 | 131 | |
| 139 | 132 | state_t m_tx_state; |
| r29637 | r29638 | |
| 141 | 134 | UINT8 m_tx_buffer; // next byte to send |
| 142 | 135 | UINT8 m_tx_parity; |
| 143 | 136 | UINT16 m_tx_pulses; // total pulses left |
| 144 | | double m_tx_clock; |
| 137 | double m_tx_clock; /* TCP - pin 40 */ |
| 145 | 138 | emu_timer *m_tx_timer; |
| 146 | 139 | |
| 147 | | devcb_resolved_read8 m_read_si; /* SI - pin 20 - This will be called whenever the SI pin is sampled. Optional */ |
| 148 | | devcb_resolved_write8 m_write_so; /* SO - pin 25 - This will be called whenever data is put on the SO pin. Optional */ |
| 149 | | devcb_resolved_write8 m_status_changed; /* This will be called whenever one of the status pins may have changed. Optional */ |
| 140 | devcb2_read8 m_read_si_cb; /* SI - pin 20 - This will be called whenever the SI pin is sampled. Optional */ |
| 141 | devcb2_write8 m_write_so_cb; /* SO - pin 25 - This will be called whenever data is put on the SO pin. Optional */ |
| 142 | devcb2_write8 m_status_changed_cb; /* This will be called whenever one of the status pins may have changed. Optional */ |
| 150 | 143 | }; |
| 151 | 144 | |
| 152 | 145 | class ay51013_device : public ay31015_device |
| r29637 | r29638 | |
| 168 | 161 | DEVICE CONFIGURATION MACROS |
| 169 | 162 | ***************************************************************************/ |
| 170 | 163 | |
| 171 | | #define MCFG_AY31015_ADD(_tag, _config) \ |
| 172 | | MCFG_DEVICE_ADD(_tag, AY31015, 0) \ |
| 173 | | MCFG_DEVICE_CONFIG(_config) |
| 174 | 164 | |
| 165 | #define MCFG_AY31015_TX_CLOCK(_txclk) \ |
| 166 | ay31015_device::set_tx_clock(*device, _txclk); |
| 167 | |
| 168 | #define MCFG_AY31015_RX_CLOCK(_rxclk) \ |
| 169 | ay31015_device::set_rx_clock(*device, _rxclk); |
| 175 | 170 | |
| 171 | #define MCFG_AY31015_READ_SI_CB(_devcb) \ |
| 172 | devcb = &ay31015_device::set_read_si_callback(*device, DEVCB2_##_devcb); |
| 176 | 173 | |
| 174 | #define MCFG_AY31015_WRITE_SO_CB(_devcb) \ |
| 175 | devcb = &ay31015_device::set_write_so_callback(*device, DEVCB2_##_devcb); |
| 176 | |
| 177 | #define MCFG_AY31015_STATUS_CHANGED_CB(_devcb) \ |
| 178 | devcb = &ay31015_device::set_status_changed_callback(*device, DEVCB2_##_devcb); |
| 179 | |
| 180 | |
| 181 | #define MCFG_AY51013_TX_CLOCK(_txclk) \ |
| 182 | ay51013_device::set_tx_clock(*device, _txclk); |
| 183 | |
| 184 | #define MCFG_AY51013_RX_CLOCK(_rxclk) \ |
| 185 | ay51013_device::set_rx_clock(*device, _rxclk); |
| 186 | |
| 187 | #define MCFG_AY51013_READ_SI_CB(_devcb) \ |
| 188 | devcb = &ay51013_device::set_read_si_callback(*device, DEVCB2_##_devcb); |
| 189 | |
| 190 | #define MCFG_AY51013_WRITE_SO_CB(_devcb) \ |
| 191 | devcb = &ay51013_device::set_write_so_callback(*device, DEVCB2_##_devcb); |
| 192 | |
| 193 | #define MCFG_AY51013_STATUS_CHANGED_CB(_devcb) \ |
| 194 | devcb = &ay51013_device::set_status_changed_callback(*device, DEVCB2_##_devcb); |
| 195 | |
| 177 | 196 | #endif |
trunk/src/mess/drivers/sorcerer.c
| r29637 | r29638 | |
| 386 | 386 | |
| 387 | 387 | /**********************************************************************************************************/ |
| 388 | 388 | |
| 389 | | static const ay31015_config sorcerer_ay31015_config = |
| 390 | | { |
| 391 | | 4800.0, |
| 392 | | 4800.0, |
| 393 | | DEVCB_NULL, |
| 394 | | DEVCB_NULL, |
| 395 | | DEVCB_NULL |
| 396 | | }; |
| 397 | | |
| 398 | | |
| 399 | 389 | static const cassette_interface sorcerer_cassette_interface = |
| 400 | 390 | { |
| 401 | 391 | sorcerer_cassette_formats, |
| r29637 | r29638 | |
| 445 | 435 | MCFG_SOUND_WAVE_ADD(WAVE2_TAG, "cassette2") |
| 446 | 436 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) // cass2 speaker |
| 447 | 437 | |
| 448 | | MCFG_AY31015_ADD( "uart", sorcerer_ay31015_config ) |
| 449 | | |
| 438 | MCFG_DEVICE_ADD( "uart", AY31015, 0 ) |
| 439 | MCFG_AY31015_TX_CLOCK(4800.0) |
| 440 | MCFG_AY31015_RX_CLOCK(4800.0) |
| 441 | |
| 450 | 442 | /* printer */ |
| 451 | 443 | MCFG_CENTRONICS_ADD("centronics", centronics_printers, "covox") |
| 452 | 444 | MCFG_SLOT_OPTION_ADD( "covox", CENTRONICS_COVOX ) |
trunk/src/mess/drivers/z80ne.c
| r29637 | r29638 | |
| 400 | 400 | rgb_t(0xff, 0xc4, 0x18) /* ALPHANUMERIC BRIGHT ORANGE */ |
| 401 | 401 | }; |
| 402 | 402 | |
| 403 | | static const ay31015_config z80ne_ay31015_config = |
| 404 | | { |
| 405 | | 4800.0, |
| 406 | | 4800.0, |
| 407 | | DEVCB_NULL, |
| 408 | | DEVCB_NULL, |
| 409 | | DEVCB_NULL |
| 410 | | }; |
| 411 | | |
| 412 | 403 | static const cassette_interface z80ne_cassettea_config = |
| 413 | 404 | { |
| 414 | 405 | cassette_default_formats, |
| r29637 | r29638 | |
| 464 | 455 | MCFG_MACHINE_START_OVERRIDE(z80ne_state,z80ne) |
| 465 | 456 | MCFG_MACHINE_RESET_OVERRIDE(z80ne_state,z80ne) |
| 466 | 457 | |
| 467 | | MCFG_AY31015_ADD( "ay_3_1015", z80ne_ay31015_config ) |
| 458 | MCFG_DEVICE_ADD( "ay_3_1015", AY31015, 0 ) |
| 459 | MCFG_AY31015_TX_CLOCK(4800.0) |
| 460 | MCFG_AY31015_RX_CLOCK(4800.0) |
| 468 | 461 | |
| 469 | 462 | MCFG_CASSETTE_ADD( "cassette", z80ne_cassettea_config ) |
| 470 | 463 | MCFG_CASSETTE_ADD( "cassette2", z80ne_cassetteb_config ) |
| r29637 | r29638 | |
| 508 | 501 | MCFG_MACHINE_START_OVERRIDE(z80ne_state,z80netb) |
| 509 | 502 | MCFG_MACHINE_RESET_OVERRIDE(z80ne_state,z80netb) |
| 510 | 503 | |
| 511 | | MCFG_AY31015_ADD( "ay_3_1015", z80ne_ay31015_config ) |
| 504 | MCFG_DEVICE_ADD( "ay_3_1015", AY31015, 0 ) |
| 505 | MCFG_AY31015_TX_CLOCK(4800.0) |
| 506 | MCFG_AY31015_RX_CLOCK(4800.0) |
| 512 | 507 | |
| 513 | 508 | MCFG_CASSETTE_ADD( "cassette", z80ne_cassettea_config ) |
| 514 | 509 | MCFG_CASSETTE_ADD( "cassette2", z80ne_cassetteb_config ) |
| r29637 | r29638 | |
| 536 | 531 | MCFG_MACHINE_START_OVERRIDE(z80ne_state,z80netf) |
| 537 | 532 | MCFG_MACHINE_RESET_OVERRIDE(z80ne_state,z80netf) |
| 538 | 533 | |
| 539 | | MCFG_AY31015_ADD( "ay_3_1015", z80ne_ay31015_config ) |
| 534 | MCFG_DEVICE_ADD( "ay_3_1015", AY31015, 0 ) |
| 535 | MCFG_AY31015_TX_CLOCK(4800.0) |
| 536 | MCFG_AY31015_RX_CLOCK(4800.0) |
| 540 | 537 | |
| 541 | 538 | MCFG_CASSETTE_ADD( "cassette", z80ne_cassettea_config ) |
| 542 | 539 | MCFG_CASSETTE_ADD( "cassette2", z80ne_cassetteb_config ) |
trunk/src/mess/drivers/nascom1.c
| r29637 | r29638 | |
| 258 | 258 | * |
| 259 | 259 | *************************************/ |
| 260 | 260 | |
| 261 | | static const ay31015_config nascom1_ay31015_config = |
| 262 | | { |
| 263 | | ( XTAL_16MHz / 16 ) / 256, |
| 264 | | ( XTAL_16MHz / 16 ) / 256, |
| 265 | | DEVCB_DRIVER_MEMBER(nascom1_state, nascom1_hd6402_si), |
| 266 | | DEVCB_DRIVER_MEMBER(nascom1_state, nascom1_hd6402_so), |
| 267 | | DEVCB_NULL |
| 268 | | }; |
| 269 | | |
| 270 | | |
| 271 | 261 | static Z80PIO_INTERFACE( nascom1_z80pio_intf ) |
| 272 | 262 | { |
| 273 | 263 | DEVCB_NULL, |
| r29637 | r29638 | |
| 299 | 289 | MCFG_GFXDECODE_ADD("gfxdecode", "palette", nascom1) |
| 300 | 290 | MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette") |
| 301 | 291 | |
| 302 | | MCFG_AY31015_ADD( "hd6402", nascom1_ay31015_config ) |
| 292 | MCFG_DEVICE_ADD( "hd6402", AY31015, 0 ) |
| 293 | MCFG_AY31015_TX_CLOCK(( XTAL_16MHz / 16 ) / 256) |
| 294 | MCFG_AY31015_RX_CLOCK(( XTAL_16MHz / 16 ) / 256) |
| 295 | MCFG_AY51013_READ_SI_CB(READ8(nascom1_state, nascom1_hd6402_si)) |
| 296 | MCFG_AY51013_WRITE_SO_CB(WRITE8(nascom1_state, nascom1_hd6402_so)) |
| 297 | |
| 303 | 298 | |
| 304 | 299 | MCFG_Z80PIO_ADD( "z80pio", XTAL_16MHz/8, nascom1_z80pio_intf ) |
| 305 | 300 | |
trunk/src/mess/drivers/ptcsol.c
| r29637 | r29638 | |
| 547 | 547 | PORT_CONFSETTING( 0x02, "6575") |
| 548 | 548 | INPUT_PORTS_END |
| 549 | 549 | |
| 550 | | static const ay31015_config sol20_ay31015_config = |
| 551 | | { |
| 552 | | 4800.0, |
| 553 | | 4800.0, |
| 554 | | DEVCB_NULL, |
| 555 | | DEVCB_NULL, |
| 556 | | DEVCB_NULL |
| 557 | | }; |
| 558 | 550 | |
| 559 | | |
| 560 | 551 | static const cassette_interface sol20_cassette_interface = |
| 561 | 552 | { |
| 562 | 553 | sol20_cassette_formats,//cassette_default_formats, |
| r29637 | r29638 | |
| 767 | 758 | // devices |
| 768 | 759 | MCFG_CASSETTE_ADD( "cassette", sol20_cassette_interface ) |
| 769 | 760 | MCFG_CASSETTE_ADD( "cassette2", sol20_cassette_interface ) |
| 770 | | MCFG_AY31015_ADD( "uart", sol20_ay31015_config ) |
| 771 | | MCFG_AY31015_ADD( "uart_s", sol20_ay31015_config ) |
| 761 | MCFG_DEVICE_ADD( "uart", AY31015, 0 ) |
| 762 | MCFG_AY31015_TX_CLOCK(4800.0) |
| 763 | MCFG_AY31015_RX_CLOCK(4800.0) |
| 764 | MCFG_DEVICE_ADD( "uart_s", AY31015, 0 ) |
| 765 | MCFG_AY31015_TX_CLOCK(4800.0) |
| 766 | MCFG_AY31015_RX_CLOCK(4800.0) |
| 772 | 767 | MCFG_DEVICE_ADD(KEYBOARD_TAG, GENERIC_KEYBOARD, 0) |
| 773 | 768 | MCFG_GENERIC_KEYBOARD_CB(WRITE8(sol20_state, kbd_put)) |
| 774 | 769 | MACHINE_CONFIG_END |