diff options
author | 2017-07-11 02:31:42 +1000 | |
---|---|---|
committer | 2017-07-11 02:31:42 +1000 | |
commit | c5c3012634f76a15b30637cc687519cb5989667d (patch) | |
tree | ca0b98d7a40cbe4c93eb2c8f6f082ad7c242d42f /src/devices/bus | |
parent | 7d980227979c30aac9eb527f15c5b893aebea5c6 (diff) |
Cleaned up serial, matrix keyboard and TI-8x link protocol interfaces:
* Switched to delegate timers
- Frees implementations from having to call timer method
- Eliminates risk of ID conflicts with implementations/other interfaces
* Moved save state registration to interface post start
- Plays nicely with device_missing_dependencies exceptions
- Frees implementation from having to call save state registration method
- Improves save state support in devices that neglected to call method
Diffstat (limited to 'src/devices/bus')
26 files changed, 228 insertions, 234 deletions
diff --git a/src/devices/bus/apricot/keyboard/hle.cpp b/src/devices/bus/apricot/keyboard/hle.cpp index bb95d2bbc9d..742917b5c9d 100644 --- a/src/devices/bus/apricot/keyboard/hle.cpp +++ b/src/devices/bus/apricot/keyboard/hle.cpp @@ -224,7 +224,6 @@ apricot_keyboard_hle_device::apricot_keyboard_hle_device(const machine_config &m void apricot_keyboard_hle_device::device_start() { - device_buffered_serial_interface::register_save_state(machine().save(), this); } //------------------------------------------------- @@ -348,13 +347,3 @@ void apricot_keyboard_hle_device::out_w(int state) { device_buffered_serial_interface::rx_w(state); } - -//------------------------------------------------- -// device_timer - device-specific timer -//------------------------------------------------- - -void apricot_keyboard_hle_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) -{ - device_matrix_keyboard_interface::device_timer(timer, id, param, ptr); - device_buffered_serial_interface::device_timer(timer, id, param, ptr); -} diff --git a/src/devices/bus/apricot/keyboard/hle.h b/src/devices/bus/apricot/keyboard/hle.h index 921218a967f..6335a71ca73 100644 --- a/src/devices/bus/apricot/keyboard/hle.h +++ b/src/devices/bus/apricot/keyboard/hle.h @@ -49,8 +49,6 @@ protected: virtual void key_make(uint8_t row, uint8_t column) override; virtual void key_break(uint8_t row, uint8_t column) override; - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; - private: enum { CMD_REQ_TIME_AND_DATE = 0xe1, diff --git a/src/devices/bus/hp_hil/hlekbd.cpp b/src/devices/bus/hp_hil/hlekbd.cpp index e068e9a0ec5..48289063ee7 100644 --- a/src/devices/bus/hp_hil/hlekbd.cpp +++ b/src/devices/bus/hp_hil/hlekbd.cpp @@ -277,16 +277,6 @@ void hle_device_base::device_reset() } -/*-------------------------------------------------- - hle_device_base::device_timer - handle timed events ---------------------------------------------------*/ - -void hle_device_base::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) -{ - device_matrix_keyboard_interface::device_timer(timer, id, param, ptr); -} - void hle_device_base::hil_write(uint16_t data) { int frames = 0; diff --git a/src/devices/bus/hp_hil/hlekbd.h b/src/devices/bus/hp_hil/hlekbd.h index 3c7f3fdda8c..534ba441c5e 100644 --- a/src/devices/bus/hp_hil/hlekbd.h +++ b/src/devices/bus/hp_hil/hlekbd.h @@ -26,7 +26,6 @@ protected: // device overrides virtual void device_start() override; virtual void device_reset() override; - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; // device_matrix_keyboard_interface overrides virtual void key_make(uint8_t row, uint8_t column) override; @@ -36,9 +35,6 @@ protected: virtual void hil_write(uint16_t data) override; private: - // device_serial_interface uses 10'000 range - // device_matrix_keyboard_interface uses 20'000 range - void transmit_byte(uint8_t byte); util::fifo<uint8_t, 8> m_fifo; diff --git a/src/devices/bus/intellec4/intellec4.cpp b/src/devices/bus/intellec4/intellec4.cpp index 249e18ca501..83c2f7702c4 100644 --- a/src/devices/bus/intellec4/intellec4.cpp +++ b/src/devices/bus/intellec4/intellec4.cpp @@ -20,17 +20,40 @@ namespace bus { namespace intellec4 { univ_slot_device::univ_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock) : device_t(mconfig, INTELLEC4_UNIV_SLOT, tag, owner, clock) , device_slot_interface(mconfig, *this) + , m_bus(*this, finder_base::DUMMY_TAG) { } +/*---------------------------------- + configuration helpers +----------------------------------*/ + void univ_slot_device::set_bus_tag(device_t &device, char const *tag) { + downcast<univ_slot_device &>(device).m_bus.set_tag(tag); } +/*---------------------------------- + device_t implementation +----------------------------------*/ + +void univ_slot_device::device_validity_check(validity_checker &valid) const +{ + device_t *const card(get_card_device()); + if (card && !dynamic_cast<device_univ_card_interface *>(card)) + osd_printf_error("Card device %s (%s) does not implement device_univ_card_interface\n", card->tag(), card->name()); +} + void univ_slot_device::device_start() { + device_t *const card_device(get_card_device()); + device_univ_card_interface *const univ_card(dynamic_cast<device_univ_card_interface *>(card_device)); + if (card_device && !univ_card) + throw emu_fatalerror("univ_slot_device: card device %s (%s) does not implement device_univ_card_interface\n", card_device->tag(), card_device->name()); + if (univ_card) + univ_card->set_bus(*m_bus); } @@ -39,6 +62,31 @@ void univ_slot_device::device_start() BUS DEVICE ***********************************************************************/ +univ_bus_device::univ_bus_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, INTELLEC4_UNIV_BUS, tag, owner, clock) + , m_rom_device(*this, finder_base::DUMMY_TAG) + , m_rom_ports_device(*this, finder_base::DUMMY_TAG) + , m_memory_device(*this, finder_base::DUMMY_TAG) + , m_status_device(*this, finder_base::DUMMY_TAG) + , m_ram_ports_device(*this, finder_base::DUMMY_TAG) + , m_rom_space(-1) + , m_rom_ports_space(-1) + , m_memory_space(-1) + , m_status_space(-1) + , m_ram_ports_space(-1) + , m_stop_out_cb(*this) + , m_test_out_cb(*this) + , m_reset_4002_out_cb(*this) + , m_user_reset_out_cb(*this) + , m_stop(0U) + , m_test(0U) + , m_reset_4002(0U) + , m_user_reset(0U) +{ + std::fill(std::begin(m_cards), std::end(m_cards), nullptr); +} + + /*---------------------------------- address space configuration ----------------------------------*/ @@ -79,31 +127,6 @@ void univ_bus_device::set_ram_ports_space(device_t &device, char const *tag, int } -univ_bus_device::univ_bus_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, INTELLEC4_UNIV_BUS, tag, owner, clock) - , m_rom_device(*this, finder_base::DUMMY_TAG) - , m_rom_ports_device(*this, finder_base::DUMMY_TAG) - , m_memory_device(*this, finder_base::DUMMY_TAG) - , m_status_device(*this, finder_base::DUMMY_TAG) - , m_ram_ports_device(*this, finder_base::DUMMY_TAG) - , m_rom_space(-1) - , m_rom_ports_space(-1) - , m_memory_space(-1) - , m_status_space(-1) - , m_ram_ports_space(-1) - , m_stop_out_cb(*this) - , m_test_out_cb(*this) - , m_reset_4002_out_cb(*this) - , m_user_reset_out_cb(*this) - , m_stop(0U) - , m_test(0U) - , m_reset_4002(0U) - , m_user_reset(0U) -{ - std::fill(std::begin(m_cards), std::end(m_cards), nullptr); -} - - /*---------------------------------- input lines ----------------------------------*/ @@ -177,6 +200,50 @@ void univ_bus_device::device_start() m_user_reset_out_cb.resolve_safe(); } + +/*---------------------------------- + helpers for cards +----------------------------------*/ + +unsigned univ_bus_device::add_card(device_univ_card_interface &card) +{ + for (unsigned i = 0; ARRAY_LENGTH(m_cards) > i; ++i) + { + if (!m_cards[i]) + { + m_cards[i] = &card; + return i; + } + } + throw emu_fatalerror("univ_bus_device: maximum number of cards (%u) exceeded\n", unsigned(ARRAY_LENGTH(m_cards))); +} + + + +/*********************************************************************** + CARD INTERFACE +***********************************************************************/ + +device_univ_card_interface::device_univ_card_interface(const machine_config &mconfig, device_t &device) + : device_slot_card_interface(mconfig, device) + , m_bus(nullptr) + , m_index(~unsigned(0)) +{ +} + + +void device_univ_card_interface::interface_pre_start() +{ + if (!m_bus) + throw device_missing_dependencies(); +} + + +void device_univ_card_interface::set_bus(univ_bus_device &bus) +{ + m_index = (m_bus = &bus)->add_card(*this); +} + } } // namespace bus::intellec4 diff --git a/src/devices/bus/intellec4/intellec4.h b/src/devices/bus/intellec4/intellec4.h index 2f5c418ec8d..58900760300 100644 --- a/src/devices/bus/intellec4/intellec4.h +++ b/src/devices/bus/intellec4/intellec4.h @@ -117,7 +117,7 @@ to implement the card in both systems. #define MCFG_INTELLEC4_UNIV_SLOT_ADD(bus_tag, slot_tag, clock, slot_intf, def_slot) \ MCFG_DEVICE_ADD(slot_tag, INTELLEC4_UNIV_SLOT, clock) \ MCFG_DEVICE_SLOT_INTERFACE(slot_intf, def_slot, false) \ - bus::intellec4::univ_slot_device::set_bus_tag(*device, bus_tag); + bus::intellec4::univ_slot_device::set_bus_tag(*device, "^" bus_tag); #define MCFG_INTELLEC4_UNIV_SLOT_REMOVE(slot_tag) \ MCFG_DEVICE_REMOVE(slot_tag) @@ -168,13 +168,19 @@ public: protected: // device_t implementation + virtual void device_validity_check(validity_checker &valid) const override ATTR_COLD; virtual void device_start() override; + +private: + required_device<univ_bus_device> m_bus; }; class univ_bus_device : public device_t { public: + friend class device_univ_card_interface; + // address space configuration static void set_rom_space(device_t &device, char const *tag, int space); static void set_rom_ports_space(device_t &device, char const *tag, int space); @@ -214,6 +220,9 @@ protected: virtual void device_start() override; private: + // helpers for cards + unsigned add_card(device_univ_card_interface &card); + // finding address spaces required_device<device_memory_interface> m_rom_device, m_rom_ports_device; required_device<device_memory_interface> m_memory_device, m_status_device, m_ram_ports_device; @@ -236,6 +245,20 @@ private: class device_univ_card_interface : public device_slot_card_interface { +protected: + friend class univ_slot_device; + friend class univ_bus_device; + + device_univ_card_interface(const machine_config &mconfig, device_t &device); + + // device_interface implementation + void interface_pre_start() override; + +private: + void set_bus(univ_bus_device &bus); + + univ_bus_device *m_bus; + unsigned m_index; }; } } // namespace bus::intellec4 diff --git a/src/devices/bus/isa/sblaster.cpp b/src/devices/bus/isa/sblaster.cpp index 69e10819602..a6c0bcfa438 100644 --- a/src/devices/bus/isa/sblaster.cpp +++ b/src/devices/bus/isa/sblaster.cpp @@ -1568,13 +1568,10 @@ void sb_device::dack_w(int line, uint8_t data) void sb_device::device_timer(emu_timer &timer, device_timer_id tid, int param, void *ptr) { -// printf("DMA timer expire\n"); if (tid) - { - device_serial_interface::device_timer(timer, tid, param, ptr); return; - } +// printf("DMA timer expire\n"); uint16_t lsample, rsample; switch (m_dsp.flags) { case 0: // 8-bit unsigned mono diff --git a/src/devices/bus/nes_ctrl/miracle.cpp b/src/devices/bus/nes_ctrl/miracle.cpp index 14ea0c2572f..350286db17a 100644 --- a/src/devices/bus/nes_ctrl/miracle.cpp +++ b/src/devices/bus/nes_ctrl/miracle.cpp @@ -40,10 +40,6 @@ void nes_miracle_device::device_timer(emu_timer &timer, device_timer_id id, int { m_strobe_clock++; } - else - { - device_serial_interface::device_timer(timer, id, param, ptr); - } } //************************************************************************** diff --git a/src/devices/bus/rs232/keyboard.cpp b/src/devices/bus/rs232/keyboard.cpp index 17c6d4fa066..6e73ee30fc7 100644 --- a/src/devices/bus/rs232/keyboard.cpp +++ b/src/devices/bus/rs232/keyboard.cpp @@ -47,12 +47,6 @@ WRITE_LINE_MEMBER( serial_keyboard_device::update_serial ) reset(); } -void serial_keyboard_device::device_start() -{ - generic_keyboard_device::device_start(); - device_buffered_serial_interface::register_save_state(machine().save(), this); -} - void serial_keyboard_device::device_reset() { generic_keyboard_device::device_reset(); @@ -79,13 +73,6 @@ void serial_keyboard_device::device_reset() transmit_register_reset(); } -void serial_keyboard_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) -{ - // give both bases a chance to handle it - device_buffered_serial_interface::device_timer(timer, id, param, ptr); - generic_keyboard_device::device_timer(timer, id, param, ptr); -} - void serial_keyboard_device::tra_callback() { output_rxd(transmit_register_get_data_bit()); diff --git a/src/devices/bus/rs232/keyboard.h b/src/devices/bus/rs232/keyboard.h index 33b848dc126..a10f9a78385 100644 --- a/src/devices/bus/rs232/keyboard.h +++ b/src/devices/bus/rs232/keyboard.h @@ -27,9 +27,7 @@ public: protected: serial_keyboard_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); - virtual void device_start() override; virtual void device_reset() override; - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; virtual void tra_callback() override; virtual void send_key(uint8_t code) override; diff --git a/src/devices/bus/rs232/null_modem.cpp b/src/devices/bus/rs232/null_modem.cpp index 27579f3d8b8..1f4ba8d5ae9 100644 --- a/src/devices/bus/rs232/null_modem.cpp +++ b/src/devices/bus/rs232/null_modem.cpp @@ -89,7 +89,7 @@ void null_modem_device::device_timer(emu_timer &timer, device_timer_id id, int p break; default: - device_serial_interface::device_timer(timer, id, param, ptr); + break; } } diff --git a/src/devices/bus/rs232/printer.cpp b/src/devices/bus/rs232/printer.cpp index 14df26f2203..82dc2530f5b 100644 --- a/src/devices/bus/rs232/printer.cpp +++ b/src/devices/bus/rs232/printer.cpp @@ -67,11 +67,6 @@ WRITE_LINE_MEMBER(serial_printer_device::printer_online) /// TODO: ? } -void serial_printer_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) -{ - device_serial_interface::device_timer(timer, id, param, ptr); -} - void serial_printer_device::rcv_complete() { receive_register_extract(); diff --git a/src/devices/bus/rs232/printer.h b/src/devices/bus/rs232/printer.h index dba1c9401e2..099e3a33138 100644 --- a/src/devices/bus/rs232/printer.h +++ b/src/devices/bus/rs232/printer.h @@ -24,7 +24,6 @@ protected: virtual ioport_constructor device_input_ports() const override; virtual void device_start() override; virtual void device_reset() override; - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; virtual void rcv_complete() override; diff --git a/src/devices/bus/rs232/pty.cpp b/src/devices/bus/rs232/pty.cpp index a324e532fb6..919b85b777b 100644 --- a/src/devices/bus/rs232/pty.cpp +++ b/src/devices/bus/rs232/pty.cpp @@ -90,7 +90,7 @@ void pseudo_terminal_device::device_timer(emu_timer &timer, device_timer_id id, break; default: - device_serial_interface::device_timer(timer, id, param, ptr); + break; } } diff --git a/src/devices/bus/rs232/rs232.h b/src/devices/bus/rs232/rs232.h index 395bf2b72cc..b062d35ff5b 100644 --- a/src/devices/bus/rs232/rs232.h +++ b/src/devices/bus/rs232/rs232.h @@ -276,15 +276,12 @@ protected: virtual void device_start() override { - device_buffered_serial_interface<FIFO_LENGTH>::register_save_state(machine().save(), this); } virtual void tra_callback() override { output_rxd(this->transmit_register_get_data_bit()); } - - using device_buffered_serial_interface<FIFO_LENGTH>::device_timer; }; DECLARE_DEVICE_TYPE(RS232_PORT, rs232_port_device) diff --git a/src/devices/bus/rs232/ser_mouse.cpp b/src/devices/bus/rs232/ser_mouse.cpp index d84f9a4d5f3..2c80fc43ef5 100644 --- a/src/devices/bus/rs232/ser_mouse.cpp +++ b/src/devices/bus/rs232/ser_mouse.cpp @@ -86,46 +86,42 @@ void serial_mouse_device::tra_callback() **************************************************************************/ void serial_mouse_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { - if (id) + if (!id) { - device_serial_interface::device_timer(timer, id, param, ptr); - return; + static int ox = 0, oy = 0; + int nx,ny; + int dx, dy, nb; + int mbc; + + /* Do not get deltas or send packets if queue is not empty (Prevents drifting) */ + if (m_head==m_tail) + { + nx = m_x->read(); + + dx = nx - ox; + if (dx<=-0x800) dx = nx + 0x1000 - ox; /* Prevent jumping */ + if (dx>=0x800) dx = nx - 0x1000 - ox; + ox = nx; + + ny = m_y->read(); + + dy = ny - oy; + if (dy<=-0x800) dy = ny + 0x1000 - oy; + if (dy>=0x800) dy = ny - 0x1000 - oy; + oy = ny; + + nb = m_btn->read(); + mbc = nb^m_mb; + m_mb = nb; + + /* check if there is any delta or mouse buttons changed */ + if ( (dx!=0) || (dy!=0) || (mbc!=0) ) + mouse_trans(dx, dy, nb, mbc); + } + + if(m_tail != m_head && is_transmit_register_empty()) + transmit_register_setup(unqueue_data()); } - - static int ox = 0, oy = 0; - int nx,ny; - int dx, dy, nb; - int mbc; - - /* Do not get deltas or send packets if queue is not empty (Prevents drifting) */ - if (m_head==m_tail) - { - nx = m_x->read(); - - dx = nx - ox; - if (dx<=-0x800) dx = nx + 0x1000 - ox; /* Prevent jumping */ - if (dx>=0x800) dx = nx - 0x1000 - ox; - ox = nx; - - ny = m_y->read(); - - dy = ny - oy; - if (dy<=-0x800) dy = ny + 0x1000 - oy; - if (dy>=0x800) dy = ny - 0x1000 - oy; - oy = ny; - - nb = m_btn->read(); - mbc = nb^m_mb; - m_mb = nb; - - /* check if there is any delta or mouse buttons changed */ - if ( (dx!=0) || (dy!=0) || (mbc!=0) ) - mouse_trans(dx, dy, nb, mbc); - } - - - if(m_tail != m_head && is_transmit_register_empty()) - transmit_register_setup(unqueue_data()); } void microsoft_mouse_device::mouse_trans(int dx, int dy, int nb, int mbc) diff --git a/src/devices/bus/rs232/terminal.cpp b/src/devices/bus/rs232/terminal.cpp index 6d28eee7a0b..5a638a6c8db 100644 --- a/src/devices/bus/rs232/terminal.cpp +++ b/src/devices/bus/rs232/terminal.cpp @@ -32,12 +32,6 @@ ioport_constructor serial_terminal_device::device_input_ports() const return INPUT_PORTS_NAME(serial_terminal); } -void serial_terminal_device::device_start() -{ - generic_terminal_device::device_start(); - device_buffered_serial_interface::register_save_state(machine().save(), this); -} - WRITE_LINE_MEMBER(serial_terminal_device::update_serial) { clear_fifo(); @@ -72,12 +66,6 @@ void serial_terminal_device::device_reset() update_serial(0); } -void serial_terminal_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) -{ - generic_terminal_device::device_timer(timer, id, param, ptr); - device_buffered_serial_interface::device_timer(timer, id, param, ptr); -} - void serial_terminal_device::send_key(uint8_t code) { transmit_byte(code); diff --git a/src/devices/bus/rs232/terminal.h b/src/devices/bus/rs232/terminal.h index e58b882a96d..727b3122583 100644 --- a/src/devices/bus/rs232/terminal.h +++ b/src/devices/bus/rs232/terminal.h @@ -20,9 +20,7 @@ public: protected: virtual ioport_constructor device_input_ports() const override; - virtual void device_start() override; virtual void device_reset() override; - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; virtual void tra_callback() override; virtual void send_key(uint8_t code) override; diff --git a/src/devices/bus/rs232/xvd701.cpp b/src/devices/bus/rs232/xvd701.cpp index 96c5ad4b01d..f9c7e0f7cbe 100644 --- a/src/devices/bus/rs232/xvd701.cpp +++ b/src/devices/bus/rs232/xvd701.cpp @@ -65,7 +65,7 @@ void jvc_xvd701_device::device_timer(emu_timer &timer, device_timer_id id, int p break; default: - device_serial_interface::device_timer(timer, id, param, ptr); + break; } } diff --git a/src/devices/bus/snes_ctrl/miracle.cpp b/src/devices/bus/snes_ctrl/miracle.cpp index f31eee7d848..1a4c7dc1423 100644 --- a/src/devices/bus/snes_ctrl/miracle.cpp +++ b/src/devices/bus/snes_ctrl/miracle.cpp @@ -41,10 +41,6 @@ void snes_miracle_device::device_timer(emu_timer &timer, device_timer_id id, int { m_strobe_clock++; } - else - { - device_serial_interface::device_timer(timer, id, param, ptr); - } } //************************************************************************** diff --git a/src/devices/bus/sunkbd/hlekbd.cpp b/src/devices/bus/sunkbd/hlekbd.cpp index 1820e3aa626..60abf1e0c4b 100644 --- a/src/devices/bus/sunkbd/hlekbd.cpp +++ b/src/devices/bus/sunkbd/hlekbd.cpp @@ -802,8 +802,6 @@ MACHINE_CONFIG_END void hle_device_base::device_start() { - device_buffered_serial_interface::register_save_state(machine().save(), this); - m_click_timer = timer_alloc(CLICK_TIMER_ID); save_item(NAME(m_make_count)); @@ -874,8 +872,7 @@ void hle_device_base::device_timer(emu_timer &timer, device_timer_id id, int par break; default: - device_matrix_keyboard_interface::device_timer(timer, id, param, ptr); - device_buffered_serial_interface::device_timer(timer, id, param, ptr); + break; } } diff --git a/src/devices/bus/sunkbd/hlekbd.h b/src/devices/bus/sunkbd/hlekbd.h index 7cb931b0fda..c2dbf17f67e 100644 --- a/src/devices/bus/sunkbd/hlekbd.h +++ b/src/devices/bus/sunkbd/hlekbd.h @@ -52,8 +52,6 @@ protected: required_ioport m_dips; private: - // device_serial_interface uses 10'000 range - // device_matrix_keyboard_interface uses 20'000 range enum { CLICK_TIMER_ID = 30'000 }; diff --git a/src/devices/bus/ti8x/graphlinkhle.cpp b/src/devices/bus/ti8x/graphlinkhle.cpp index 8a77ff826ff..40fff88b681 100644 --- a/src/devices/bus/ti8x/graphlinkhle.cpp +++ b/src/devices/bus/ti8x/graphlinkhle.cpp @@ -30,8 +30,6 @@ graph_link_hle_device::graph_link_hle_device( void graph_link_hle_device::device_start() { - device_serial_interface::register_save_state(machine().save(), this); - m_buffer = std::make_unique<u8 []>(BUFLEN); save_pointer(NAME(m_buffer.get()), BUFLEN); @@ -51,13 +49,6 @@ void graph_link_hle_device::device_reset() } -void graph_link_hle_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) -{ - device_ti8x_link_port_byte_interface::device_timer(timer, id, param, ptr); - device_serial_interface::device_timer(timer, id, param, ptr); -} - - MACHINE_CONFIG_MEMBER(graph_link_hle_device::device_add_mconfig) MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, nullptr) MCFG_RS232_RXD_HANDLER(WRITELINE(graph_link_hle_device, rx_w)) diff --git a/src/devices/bus/ti8x/graphlinkhle.h b/src/devices/bus/ti8x/graphlinkhle.h index 5e574374cab..55f8a838cfe 100644 --- a/src/devices/bus/ti8x/graphlinkhle.h +++ b/src/devices/bus/ti8x/graphlinkhle.h @@ -37,7 +37,6 @@ protected: virtual void device_add_mconfig(machine_config &config) override; virtual void device_start() override; virtual void device_reset() override; - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; virtual void byte_collision() override; virtual void byte_send_timeout() override; diff --git a/src/devices/bus/ti8x/ti8x.cpp b/src/devices/bus/ti8x/ti8x.cpp index 528b1dc6c39..e998ded593c 100644 --- a/src/devices/bus/ti8x/ti8x.cpp +++ b/src/devices/bus/ti8x/ti8x.cpp @@ -120,16 +120,23 @@ void device_ti8x_link_port_bit_interface::interface_pre_start() { device_ti8x_link_port_interface::interface_pre_start(); - m_error_timer = device().timer_alloc(TIMER_ID_BIT_TIMEOUT); + if (!m_error_timer) + m_error_timer = device().machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(device_ti8x_link_port_bit_interface::bit_timeout), this)); + + m_bit_phase = IDLE; + m_tx_bit_buffer = EMPTY; + m_tip_in = m_ring_in = true; +} + + +void device_ti8x_link_port_bit_interface::interface_post_start() +{ + device_ti8x_link_port_interface::interface_post_start(); device().save_item(NAME(m_bit_phase)); device().save_item(NAME(m_tx_bit_buffer)); device().save_item(NAME(m_tip_in)); device().save_item(NAME(m_ring_in)); - - m_bit_phase = IDLE; - m_tx_bit_buffer = EMPTY; - m_tip_in = m_ring_in = true; } @@ -146,66 +153,6 @@ void device_ti8x_link_port_bit_interface::interface_pre_reset() } -void device_ti8x_link_port_bit_interface::device_timer( - emu_timer &timer, - device_timer_id id, - int param, void *ptr) -{ - switch (id) - { - case TIMER_ID_BIT_TIMEOUT: - switch (m_bit_phase) - { - // something very bad happened (heap smash?) - case IDLE: - case HOLD_0: - case HOLD_1: - default: - throw false; - - // receive timeout - case ACK_0: - case ACK_1: - LOGBITPROTO("timeout acknowledging %d bit\n", (ACK_0 == m_bit_phase) ? 0 : 1); - output_tip(1); - output_ring(1); - if (m_tip_in && m_ring_in) - { - check_tx_bit_buffer(); - } - else - { - LOGBITPROTO("waiting for bus idle\n"); - m_error_timer->reset((EMPTY == m_tx_bit_buffer) ? attotime::never : attotime(1, 0)); // TODO: configurable timeout - m_bit_phase = WAIT_IDLE; - } - bit_receive_timeout(); - break; - - // send timeout: - case WAIT_IDLE: - assert(EMPTY != m_tx_bit_buffer); - case WAIT_ACK_0: - case WAIT_ACK_1: - case WAIT_REL_0: - case WAIT_REL_1: - LOGBITPROTO("timeout sending bit\n"); - m_error_timer->reset(); - m_bit_phase = (m_tip_in && m_ring_in) ? IDLE : WAIT_IDLE; - m_tx_bit_buffer = EMPTY; - output_tip(1); - output_ring(1); - bit_send_timeout(); - break; - } - break; - - default: - break; - } -} - - void device_ti8x_link_port_bit_interface::send_bit(bool data) { LOGBITPROTO("queue %d bit\n", data ? 1 : 0); @@ -452,6 +399,55 @@ WRITE_LINE_MEMBER(device_ti8x_link_port_bit_interface::input_ring) } +TIMER_CALLBACK_MEMBER(device_ti8x_link_port_bit_interface::bit_timeout) +{ + switch (m_bit_phase) + { + // something very bad happened (heap smash?) + case IDLE: + case HOLD_0: + case HOLD_1: + default: + throw false; + + // receive timeout + case ACK_0: + case ACK_1: + LOGBITPROTO("timeout acknowledging %d bit\n", (ACK_0 == m_bit_phase) ? 0 : 1); + output_tip(1); + output_ring(1); + if (m_tip_in && m_ring_in) + { + check_tx_bit_buffer(); + } + else + { + LOGBITPROTO("waiting for bus idle\n"); + m_error_timer->reset((EMPTY == m_tx_bit_buffer) ? attotime::never : attotime(1, 0)); // TODO: configurable timeout + m_bit_phase = WAIT_IDLE; + } + bit_receive_timeout(); + break; + + // send timeout: + case WAIT_IDLE: + assert(EMPTY != m_tx_bit_buffer); + case WAIT_ACK_0: + case WAIT_ACK_1: + case WAIT_REL_0: + case WAIT_REL_1: + LOGBITPROTO("timeout sending bit\n"); + m_error_timer->reset(); + m_bit_phase = (m_tip_in && m_ring_in) ? IDLE : WAIT_IDLE; + m_tx_bit_buffer = EMPTY; + output_tip(1); + output_ring(1); + bit_send_timeout(); + break; + } +} + + void device_ti8x_link_port_bit_interface::check_tx_bit_buffer() { assert(m_tip_in); @@ -506,10 +502,16 @@ void device_ti8x_link_port_byte_interface::interface_pre_start() { device_ti8x_link_port_bit_interface::interface_pre_start(); + m_tx_byte_buffer = m_rx_byte_buffer = 0U; +} + + +void device_ti8x_link_port_byte_interface::interface_post_start() +{ + device_ti8x_link_port_bit_interface::interface_post_start(); + device().save_item(NAME(m_tx_byte_buffer)); device().save_item(NAME(m_rx_byte_buffer)); - - m_tx_byte_buffer = m_rx_byte_buffer = 0U; } diff --git a/src/devices/bus/ti8x/ti8x.h b/src/devices/bus/ti8x/ti8x.h index 5a21a4abc17..67ddad75747 100644 --- a/src/devices/bus/ti8x/ti8x.h +++ b/src/devices/bus/ti8x/ti8x.h @@ -125,19 +125,13 @@ protected: device_ti8x_link_port_bit_interface(machine_config const &mconfig, device_t &device); virtual void interface_pre_start() override; + virtual void interface_post_start() override; virtual void interface_pre_reset() override; - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); - void send_bit(bool data); void accept_bit(); private: - enum - { - TIMER_ID_BIT_TIMEOUT = 20000 // ensure this doesn't clash with device_serial_interface - }; - enum bit_phase { IDLE, @@ -168,6 +162,8 @@ private: virtual void bit_sent() = 0; virtual void bit_received(bool data) = 0; + TIMER_CALLBACK_MEMBER(bit_timeout); + void check_tx_bit_buffer(); emu_timer * m_error_timer; @@ -183,6 +179,7 @@ protected: device_ti8x_link_port_byte_interface(machine_config const &mconfig, device_t &device); virtual void interface_pre_start() override; + virtual void interface_post_start() override; virtual void interface_pre_reset() override; void send_byte(u8 data); |