summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/centronics/printer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/centronics/printer.cpp')
-rw-r--r--src/devices/bus/centronics/printer.cpp105
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)