diff options
Diffstat (limited to 'src/devices/bus/centronics/printer.cpp')
-rw-r--r-- | src/devices/bus/centronics/printer.cpp | 105 |
1 files changed, 57 insertions, 48 deletions
diff --git a/src/devices/bus/centronics/printer.cpp b/src/devices/bus/centronics/printer.cpp index 484e718d074..25deb42cdd1 100644 --- a/src/devices/bus/centronics/printer.cpp +++ b/src/devices/bus/centronics/printer.cpp @@ -27,79 +27,88 @@ centronics_printer_device::centronics_printer_device(const machine_config &mconf m_printer(*this, "printer") { } + //------------------------------------------------- // device_add_mconfig - add device configuration //------------------------------------------------- - void centronics_printer_device::device_add_mconfig(machine_config &config) { PRINTER(config, m_printer, 0); m_printer->online_callback().set(FUNC(centronics_printer_device::printer_online)); } +void centronics_printer_device::device_start() +{ + m_ack_timer = timer_alloc(FUNC(centronics_printer_device::ack_timer_tick), this); + m_busy_timer = timer_alloc(FUNC(centronics_printer_device::busy_timer_tick), this); + + /* register for state saving */ + save_item(NAME(m_strobe)); + save_item(NAME(m_data)); + save_item(NAME(m_busy)); +} + +void centronics_printer_device::device_reset() +{ + m_busy = false; + output_busy(m_busy); + output_fault(1); + output_ack(1); + output_select(1); +} + + + /*------------------------------------------------- printer_online - callback that sets us busy when the printer goes offline -------------------------------------------------*/ -WRITE_LINE_MEMBER(centronics_printer_device::printer_online) +void centronics_printer_device::printer_online(int state) { output_perror(!state); } -void centronics_printer_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +/*------------------------------------------------- + ack_timer_tick - update the printer + acknowledge line after an appropriate delay +-------------------------------------------------*/ + +TIMER_CALLBACK_MEMBER(centronics_printer_device::ack_timer_tick) { - switch (id) + output_ack(param); + + if (!param) { - case TIMER_ACK: - output_ack(param); - - if (param == false) - { - /* data is now ready, output it */ - m_printer->output(m_data); - - /* ready to receive more data, return BUSY to low */ - m_busy_timer->adjust(attotime::from_usec(7), false); - } - break; - - case TIMER_BUSY: - m_busy = param; - output_busy(m_busy); - - if (param == true) - { - /* timer to turn ACK low to receive data */ - m_ack_timer->adjust(attotime::from_usec(10), false); - } - else - { - /* timer to return ACK to high state */ - m_ack_timer->adjust(attotime::from_usec(5), true); - } + /* data is now ready, output it */ + m_printer->output(m_data); + + /* ready to receive more data, return BUSY to low */ + m_busy_timer->adjust(attotime::from_usec(7), 0); } } -void centronics_printer_device::device_start() -{ - m_ack_timer = timer_alloc(TIMER_ACK); - m_busy_timer = timer_alloc(TIMER_BUSY); - - /* register for state saving */ - save_item(NAME(m_strobe)); - save_item(NAME(m_data)); - save_item(NAME(m_busy)); -} +/*------------------------------------------------- + busy_timer_tick - update the printer's + busy state +-------------------------------------------------*/ -void centronics_printer_device::device_reset() +TIMER_CALLBACK_MEMBER(centronics_printer_device::busy_timer_tick) { - m_busy = false; + m_busy = param; output_busy(m_busy); - output_fault(1); - output_ack(1); - output_select(1); + + if (param) + { + /* timer to turn ACK low to receive data */ + m_ack_timer->adjust(attotime::from_usec(10), 0); + } + else + { + /* timer to return ACK to high state */ + m_ack_timer->adjust(attotime::from_usec(5), 1); + } } /*------------------------------------------------- @@ -107,7 +116,7 @@ void centronics_printer_device::device_reset() ready -------------------------------------------------*/ -WRITE_LINE_MEMBER( centronics_printer_device::input_strobe ) +void centronics_printer_device::input_strobe(int state) { /* look for a high -> low transition */ if (m_strobe == true && state == false && m_busy == false) @@ -125,7 +134,7 @@ WRITE_LINE_MEMBER( centronics_printer_device::input_strobe ) printer (centronics mode) -------------------------------------------------*/ -WRITE_LINE_MEMBER(centronics_printer_device::input_init) +void centronics_printer_device::input_init(int state) { /* reset printer if line is low */ if (state == false) |