From d5ac7c11cfda69fb48cb30daa841992ce8f97d47 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sat, 28 Oct 2017 13:58:03 +1100 Subject: Move object finder resolution before device_start - should solve github #2759 --- src/devices/machine/z80sio.cpp | 34 ++++++++++++++++++++++++++-------- src/devices/machine/z80sio.h | 10 ++++++---- src/emu/device.cpp | 31 +++++++++++++++++++++++++++++-- src/emu/device.h | 2 ++ src/emu/machine.cpp | 4 ++++ src/mame/drivers/kaypro.cpp | 37 +++++++++++++++++-------------------- 6 files changed, 84 insertions(+), 34 deletions(-) diff --git a/src/devices/machine/z80sio.cpp b/src/devices/machine/z80sio.cpp index a18be27d9c0..8cf9169c6b2 100644 --- a/src/devices/machine/z80sio.cpp +++ b/src/devices/machine/z80sio.cpp @@ -164,11 +164,12 @@ i8274_new_device::i8274_new_device(const machine_config &mconfig, const char *ta } //------------------------------------------------- -// device_start - device-specific startup +// device_resolve_objects - device-specific setup //------------------------------------------------- -void z80sio_device::device_start() +void z80sio_device::device_resolve_objects() { LOG("%s\n", FUNCNAME); + // resolve callbacks m_out_txda_cb.resolve_safe(); m_out_dtra_cb.resolve_safe(); @@ -185,6 +186,14 @@ void z80sio_device::device_start() m_out_txdrqa_cb.resolve_safe(); m_out_rxdrqb_cb.resolve_safe(); m_out_txdrqb_cb.resolve_safe(); +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- +void z80sio_device::device_start() +{ + LOG("%s\n", FUNCNAME); // configure channel A m_chanA->m_rxc = m_rxca; @@ -530,21 +539,30 @@ z80sio_channel::z80sio_channel(const machine_config &mconfig, const char *tag, d , m_sync(0) { LOG("%s\n",FUNCNAME); - // Reset all registers - m_rr0 = m_rr1 = m_rr2 = 0; - m_wr0 = m_wr1 = m_wr2 = m_wr3 = m_wr4 = m_wr5 = m_wr6 = m_wr7 = 0; + + // Reset all registers + m_rr0 = m_rr1 = m_rr2 = 0; + m_wr0 = m_wr1 = m_wr2 = m_wr3 = m_wr4 = m_wr5 = m_wr6 = m_wr7 = 0; } //------------------------------------------------- -// start - channel startup +// resove_objects - channel setup //------------------------------------------------- -void z80sio_channel::device_start() +void z80sio_channel::device_resolve_objects() { LOG("%s\n",FUNCNAME); m_uart = downcast(owner()); m_index = m_uart->get_channel_index(this); - m_variant = ((z80sio_device *)owner())->m_variant; + m_variant = m_uart->m_variant; +} + +//------------------------------------------------- +// start - channel startup +//------------------------------------------------- +void z80sio_channel::device_start() +{ + LOG("%s\n",FUNCNAME); // state saving save_item(NAME(m_rr0)); diff --git a/src/devices/machine/z80sio.h b/src/devices/machine/z80sio.h index 4e18b377872..55803b7e427 100644 --- a/src/devices/machine/z80sio.h +++ b/src/devices/machine/z80sio.h @@ -137,10 +137,6 @@ class z80sio_channel : public device_t, public: z80sio_channel(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - // device-level overrides - virtual void device_start() override; - virtual void device_reset() override; - // device_serial_interface overrides virtual void tra_callback() override; virtual void tra_complete() override; @@ -366,6 +362,11 @@ protected: WR5_DTR = 0x80 }; + // device-level overrides + virtual void device_resolve_objects() override; + virtual void device_start() override; + virtual void device_reset() override; + void update_serial(); void update_rts(); void set_dtr(int state); @@ -484,6 +485,7 @@ protected: z80sio_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant); // device-level overrides + virtual void device_resolve_objects() override; virtual void device_start() override; virtual void device_reset() override; virtual void device_add_mconfig(machine_config &config) override; diff --git a/src/emu/device.cpp b/src/emu/device.cpp index 5325e506568..e03e09e8dac 100644 --- a/src/emu/device.cpp +++ b/src/emu/device.cpp @@ -450,10 +450,11 @@ bool device_t::findit(bool isvalidation) const } //------------------------------------------------- -// start - start a device +// resolve_objects - find objects referenced in +// configuration //------------------------------------------------- -void device_t::start() +void device_t::resolve_objects() { // prepare the logerror buffer if (m_machine->allow_logging()) @@ -463,6 +464,20 @@ void device_t::start() if (!findit(false)) throw emu_fatalerror("Missing some required objects, unable to proceed"); + // allow implementation to do additional setup + device_resolve_objects(); +} + +//------------------------------------------------- +// start - start a device +//------------------------------------------------- + +void device_t::start() +{ + // prepare the logerror buffer + if (m_machine->allow_logging()) + m_string_buffer.reserve(1024); + // let the interfaces do their pre-work for (device_interface &intf : interfaces()) intf.interface_pre_start(); @@ -680,6 +695,18 @@ void device_t::device_reset_after_children() } +//------------------------------------------------- +// device_resolve_objects - resolve objects that +// may be needed for other devices to set +// initial conditions at start time +//------------------------------------------------- + +void device_t::device_resolve_objects() +{ + // do nothing by default +} + + //------------------------------------------------- // device_stop - clean up anything that needs to // happen before the running_machine goes away diff --git a/src/emu/device.h b/src/emu/device.h index 0a894d20e09..211da59cb38 100644 --- a/src/emu/device.h +++ b/src/emu/device.h @@ -541,6 +541,7 @@ public: protected: // miscellaneous helpers void set_machine(running_machine &machine); + void resolve_objects(); void start(); void stop(); void debug_setup(); @@ -557,6 +558,7 @@ protected: virtual ioport_constructor device_input_ports() const; virtual void device_config_complete(); virtual void device_validity_check(validity_checker &valid) const ATTR_COLD; + virtual void device_resolve_objects() ATTR_COLD; virtual void device_start() ATTR_COLD = 0; virtual void device_stop() ATTR_COLD; virtual void device_reset() ATTR_COLD; diff --git a/src/emu/machine.cpp b/src/emu/machine.cpp index 4af765831d6..fa6375ef937 100644 --- a/src/emu/machine.cpp +++ b/src/emu/machine.cpp @@ -974,6 +974,10 @@ void running_machine::logfile_callback(const char *buffer) void running_machine::start_all_devices() { + // resolve objects first to avoid messy start order dependencies + for (device_t &device : device_iterator(root_device())) + device.resolve_objects(); + m_dummy_space.start(); // iterate through the devices diff --git a/src/mame/drivers/kaypro.cpp b/src/mame/drivers/kaypro.cpp index 26fa25b76e3..af9252c05c9 100644 --- a/src/mame/drivers/kaypro.cpp +++ b/src/mame/drivers/kaypro.cpp @@ -237,6 +237,12 @@ static MACHINE_CONFIG_START( kayproii ) MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics") + MCFG_RS232_PORT_ADD("serial", default_rs232_devices, nullptr) + MCFG_RS232_RXD_HANDLER(DEVWRITELINE("sio", z80sio_device, rxa_w)) + MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("sio", z80sio_device, synca_w)) + MCFG_RS232_CTS_HANDLER(DEVWRITELINE("sio", z80sio_device, ctsa_w)) + MCFG_RS232_DCD_HANDLER(DEVWRITELINE("sio", z80sio_device, dcda_w)) + MCFG_DEVICE_ADD("brg", COM8116, XTAL_5_0688MHz) // WD1943, SMC8116 MCFG_COM8116_FR_HANDLER(DEVWRITELINE("sio", z80sio_device, rxca_w)) MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("sio", z80sio_device, txca_w)) @@ -258,13 +264,6 @@ static MACHINE_CONFIG_START( kayproii ) MCFG_Z80SIO_OUT_DTRA_CB(DEVWRITELINE("serial", rs232_port_device, write_dtr)) MCFG_Z80SIO_OUT_TXDB_CB(DEVWRITELINE("kbd", kaypro_10_keyboard_device, txd_w)) - // only works by chance as it requires z80sio to be started before starting or it will crash - MCFG_RS232_PORT_ADD("serial", default_rs232_devices, nullptr) - MCFG_RS232_RXD_HANDLER(DEVWRITELINE("sio", z80sio_device, rxa_w)) - MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("sio", z80sio_device, synca_w)) - MCFG_RS232_CTS_HANDLER(DEVWRITELINE("sio", z80sio_device, ctsa_w)) - MCFG_RS232_DCD_HANDLER(DEVWRITELINE("sio", z80sio_device, dcda_w)) - MCFG_FD1793_ADD("fdc", XTAL_20MHz / 20) MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(kaypro_state, fdc_intrq_w)) MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(kaypro_state, fdc_drq_w)) @@ -331,30 +330,28 @@ static MACHINE_CONFIG_START( kaypro2x ) MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics") - MCFG_DEVICE_ADD("sio_1", Z80SIO, XTAL_16MHz / 4) - MCFG_Z80SIO_OUT_INT_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0)) // FIXME: use a combiner - MCFG_Z80SIO_OUT_TXDA_CB(DEVWRITELINE("modem", rs232_port_device, write_txd)) - MCFG_Z80SIO_OUT_RTSA_CB(DEVWRITELINE("modem", rs232_port_device, write_rts)) - MCFG_Z80SIO_OUT_DTRA_CB(DEVWRITELINE("modem", rs232_port_device, write_dtr)) - MCFG_Z80SIO_OUT_TXDB_CB(DEVWRITELINE("kbd", kaypro_10_keyboard_device, txd_w)) - - MCFG_DEVICE_ADD("sio_2", Z80SIO, XTAL_16MHz / 4) /* extra sio for modem and printer */ - MCFG_Z80SIO_OUT_INT_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0)) // FIXME: use a combiner - MCFG_Z80SIO_OUT_TXDA_CB(DEVWRITELINE("serprn", rs232_port_device, write_txd)) - - // only works by chance as it requires z80sio to be started before starting or it will crash MCFG_RS232_PORT_ADD("modem", default_rs232_devices, nullptr) MCFG_RS232_RXD_HANDLER(DEVWRITELINE("sio_1", z80sio_device, rxa_w)) MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("sio_1", z80sio_device, synca_w)) MCFG_RS232_CTS_HANDLER(DEVWRITELINE("sio_1", z80sio_device, ctsa_w)) MCFG_RS232_DCD_HANDLER(DEVWRITELINE("sio_1", z80sio_device, dcda_w)) - // only works by chance as it requires z80sio to be started before starting or it will crash MCFG_RS232_PORT_ADD("serprn", default_rs232_devices, nullptr) MCFG_RS232_RXD_HANDLER(DEVWRITELINE("sio_2", z80sio_device, rxa_w)) MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("sio_2", z80sio_device, synca_w)) MCFG_RS232_CTS_HANDLER(DEVWRITELINE("sio_2", z80sio_device, ctsa_w)) + MCFG_DEVICE_ADD("sio_1", Z80SIO, XTAL_16MHz / 4) + MCFG_Z80SIO_OUT_INT_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0)) // FIXME: use a combiner + MCFG_Z80SIO_OUT_TXDA_CB(DEVWRITELINE("modem", rs232_port_device, write_txd)) + MCFG_Z80SIO_OUT_RTSA_CB(DEVWRITELINE("modem", rs232_port_device, write_rts)) + MCFG_Z80SIO_OUT_DTRA_CB(DEVWRITELINE("modem", rs232_port_device, write_dtr)) + MCFG_Z80SIO_OUT_TXDB_CB(DEVWRITELINE("kbd", kaypro_10_keyboard_device, txd_w)) + + MCFG_DEVICE_ADD("sio_2", Z80SIO, XTAL_16MHz / 4) /* extra sio for modem and printer */ + MCFG_Z80SIO_OUT_INT_CB(INPUTLINE("maincpu", INPUT_LINE_IRQ0)) // FIXME: use a combiner + MCFG_Z80SIO_OUT_TXDA_CB(DEVWRITELINE("serprn", rs232_port_device, write_txd)) + MCFG_DEVICE_ADD("brg", COM8116, XTAL_5_0688MHz) // WD1943, SMC8116 MCFG_COM8116_FR_HANDLER(DEVWRITELINE("sio_1", z80sio_device, rxca_w)) MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("sio_1", z80sio_device, txca_w)) -- cgit v1.2.3