summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Brian Johnson <brijohn@gmail.com>2021-06-25 22:18:02 -0400
committer GitHub <noreply@github.com>2021-06-25 22:18:02 -0400
commit2430ef0bc78c16bff960c384fffab13fc757cd11 (patch)
treef4200f7df66354d88d7cbf941ec1e4149ff6d82f
parenta7713cc7ea6df58e7a85a34f92a3fdfe43c62f5f (diff)
qx10: Add centronics printer port (#8034)
-rw-r--r--src/devices/bus/centronics/ctronics.cpp10
-rw-r--r--src/devices/bus/centronics/ctronics.h5
-rw-r--r--src/devices/bus/centronics/epson_ex800.h2
-rw-r--r--src/devices/bus/centronics/epson_lx800.h2
-rw-r--r--src/devices/bus/centronics/epson_lx810l.h2
-rw-r--r--src/devices/bus/centronics/printer.h1
-rw-r--r--src/mame/drivers/qx10.cpp81
7 files changed, 103 insertions, 0 deletions
diff --git a/src/devices/bus/centronics/ctronics.cpp b/src/devices/bus/centronics/ctronics.cpp
index 876e2cfcce4..81812bc37f6 100644
--- a/src/devices/bus/centronics/ctronics.cpp
+++ b/src/devices/bus/centronics/ctronics.cpp
@@ -32,6 +32,7 @@ centronics_device::centronics_device(const machine_config &mconfig, const char *
m_autofd_handler(*this),
m_fault_handler(*this),
m_init_handler(*this),
+ m_sense_handler(*this),
m_select_in_handler(*this),
m_dev(nullptr)
{
@@ -42,6 +43,12 @@ void centronics_device::device_config_complete()
m_dev = dynamic_cast<device_centronics_peripheral_interface *>(get_card_device());
}
+void centronics_device::device_reset()
+{
+ if (m_dev && m_dev->supports_pin35_5v())
+ m_sense_handler(1);
+}
+
void centronics_device::device_start()
{
m_strobe_handler.resolve_safe();
@@ -60,8 +67,11 @@ void centronics_device::device_start()
m_autofd_handler.resolve_safe();
m_fault_handler.resolve_safe();
m_init_handler.resolve_safe();
+ m_sense_handler.resolve_safe();
m_select_in_handler.resolve_safe();
+ m_sense_handler(0);
+
// pull up
m_strobe_handler(1);
m_data0_handler(1);
diff --git a/src/devices/bus/centronics/ctronics.h b/src/devices/bus/centronics/ctronics.h
index aba15b34a4b..44de7930cc8 100644
--- a/src/devices/bus/centronics/ctronics.h
+++ b/src/devices/bus/centronics/ctronics.h
@@ -43,6 +43,7 @@ public:
auto autofd_handler() { return m_autofd_handler.bind(); }
auto fault_handler() { return m_fault_handler.bind(); }
auto init_handler() { return m_init_handler.bind(); }
+ auto sense_handler() { return m_sense_handler.bind(); }
auto select_in_handler() { return m_select_in_handler.bind(); }
template <typename T> void set_data_input_buffer(T &&tag)
@@ -80,6 +81,7 @@ public:
protected:
// device-level overrides
virtual void device_config_complete() override;
+ virtual void device_reset() override;
virtual void device_start() override;
devcb_write_line m_strobe_handler;
@@ -98,6 +100,7 @@ protected:
devcb_write_line m_autofd_handler;
devcb_write_line m_fault_handler;
devcb_write_line m_init_handler;
+ devcb_write_line m_sense_handler;
devcb_write_line m_select_in_handler;
private:
@@ -151,6 +154,8 @@ protected:
virtual DECLARE_WRITE_LINE_MEMBER( input_init ) { }
virtual DECLARE_WRITE_LINE_MEMBER( input_select_in ) { }
+ virtual bool supports_pin35_5v() { return false; }
+
centronics_device *m_slot;
};
diff --git a/src/devices/bus/centronics/epson_ex800.h b/src/devices/bus/centronics/epson_ex800.h
index d51b822f23f..4c60b8cc847 100644
--- a/src/devices/bus/centronics/epson_ex800.h
+++ b/src/devices/bus/centronics/epson_ex800.h
@@ -41,6 +41,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual ioport_constructor device_input_ports() const override;
+ virtual bool supports_pin35_5v() override { return true; }
+
private:
uint8_t porta_r();
uint8_t portb_r();
diff --git a/src/devices/bus/centronics/epson_lx800.h b/src/devices/bus/centronics/epson_lx800.h
index d7e092e31a5..c6534f3d62f 100644
--- a/src/devices/bus/centronics/epson_lx800.h
+++ b/src/devices/bus/centronics/epson_lx800.h
@@ -42,6 +42,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual ioport_constructor device_input_ports() const override;
+ virtual bool supports_pin35_5v() override { return true; }
+
private:
uint8_t porta_r(offs_t offset);
void porta_w(offs_t offset, uint8_t data);
diff --git a/src/devices/bus/centronics/epson_lx810l.h b/src/devices/bus/centronics/epson_lx810l.h
index c399325024b..ba70b96352d 100644
--- a/src/devices/bus/centronics/epson_lx810l.h
+++ b/src/devices/bus/centronics/epson_lx810l.h
@@ -59,6 +59,8 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual ioport_constructor device_input_ports() const override;
+ virtual bool supports_pin35_5v() override { return true; }
+
private:
uint8_t porta_r(offs_t offset);
void porta_w(offs_t offset, uint8_t data);
diff --git a/src/devices/bus/centronics/printer.h b/src/devices/bus/centronics/printer.h
index 8e564ff5df9..eccfcb99d62 100644
--- a/src/devices/bus/centronics/printer.h
+++ b/src/devices/bus/centronics/printer.h
@@ -35,6 +35,7 @@ protected:
virtual void device_reset() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+ virtual bool supports_pin35_5v() override { return true; }
private:
DECLARE_WRITE_LINE_MEMBER( printer_online );
diff --git a/src/mame/drivers/qx10.cpp b/src/mame/drivers/qx10.cpp
index 46ffbc91272..5a8c548b3b4 100644
--- a/src/mame/drivers/qx10.cpp
+++ b/src/mame/drivers/qx10.cpp
@@ -34,12 +34,14 @@
#include "emu.h"
+#include "bus/centronics/ctronics.h"
#include "bus/rs232/rs232.h"
#include "cpu/z80/z80.h"
#include "imagedev/floppy.h"
#include "machine/am9517a.h"
#include "machine/i8255.h"
#include "machine/mc146818.h"
+#include "machine/output_latch.h"
#include "machine/pic8259.h"
#include "machine/pit8253.h"
#include "machine/qx10kbd.h"
@@ -82,6 +84,7 @@ public:
m_hgdc(*this, "upd7220"),
m_rtc(*this, "rtc"),
m_kbd(*this, "kbd"),
+ m_centronics(*this, "centronics"),
m_speaker(*this, "speaker"),
m_vram_bank(0),
m_char_rom(*this, "chargen"),
@@ -124,6 +127,16 @@ private:
void vram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
uint8_t memory_read_byte(offs_t offset);
void memory_write_byte(offs_t offset, uint8_t data);
+
+ uint8_t portb_r();
+ void portc_w(uint8_t data);
+
+ void centronics_busy_handler(uint8_t state);
+ void centronics_fault_handler(uint8_t state);
+ void centronics_perror_handler(uint8_t state);
+ void centronics_select_handler(uint8_t state);
+ void centronics_sense_handler(uint8_t state);
+
DECLARE_WRITE_LINE_MEMBER(keyboard_clk);
DECLARE_WRITE_LINE_MEMBER(keyboard_irq);
DECLARE_WRITE_LINE_MEMBER(speaker_freq);
@@ -154,6 +167,7 @@ private:
required_device<upd7220_device> m_hgdc;
required_device<mc146818_device> m_rtc;
required_device<rs232_port_device> m_kbd;
+ required_device<centronics_device> m_centronics;
required_device<speaker_sound_device> m_speaker;
uint8_t m_vram_bank;
//required_shared_ptr<uint8_t> m_video_ram;
@@ -174,6 +188,14 @@ private:
int m_spkr_freq;
int m_pit1_out0;
+ /* centronics */
+ int m_centronics_error;
+ int m_centronics_busy;
+ int m_centronics_paper;
+ int m_centronics_select;
+ int m_centronics_sense;
+
+
/* memory */
int m_membank;
int m_memprom;
@@ -451,6 +473,52 @@ uint8_t qx10_state::qx10_30_r()
m_membank << 4;
}
+void qx10_state::centronics_busy_handler(uint8_t state)
+{
+ m_centronics_busy = state;
+}
+
+void qx10_state::centronics_perror_handler(uint8_t state)
+{
+ m_centronics_paper = state;
+}
+
+void qx10_state::centronics_fault_handler(uint8_t state)
+{
+ m_centronics_error = state;
+}
+
+void qx10_state::centronics_select_handler(uint8_t state)
+{
+ m_centronics_select = state;
+}
+
+void qx10_state::centronics_sense_handler(uint8_t state)
+{
+ m_centronics_sense = state;
+}
+
+uint8_t qx10_state::portb_r()
+{
+ uint8_t status = 0;
+
+ status |= m_centronics_error << 3;
+ status |= m_centronics_paper << 4;
+ status |= m_centronics_busy << 5;
+ status |= m_centronics_sense << 6;
+ status |= m_centronics_select << 7;
+
+ return status;
+}
+
+void qx10_state::portc_w(uint8_t data)
+{
+ m_centronics->write_strobe(BIT(data, 0));
+ m_centronics->write_autofd(BIT(data, 4));
+ m_centronics->write_init(!BIT(data, 5));
+ m_pic_s->ir0_w(BIT(data, 3));
+}
+
/*
DMA8237
*/
@@ -849,6 +917,9 @@ void qx10_state::qx10(machine_config &config)
AM9517A(config, m_dma_2, MAIN_CLK/4);
I8255(config, m_ppi, 0);
+ m_ppi->out_pa_callback().set("prndata", FUNC(output_latch_device::write));
+ m_ppi->in_pb_callback().set(FUNC(qx10_state::portb_r));
+ m_ppi->out_pc_callback().set(FUNC(qx10_state::portc_w));
UPD7220(config, m_hgdc, 16.67_MHz_XTAL/4/2);
m_hgdc->set_addrmap(0, &qx10_state::upd7220_map);
@@ -872,6 +943,16 @@ void qx10_state::qx10(machine_config &config)
RS232_PORT(config, m_kbd, keyboard, "qx10");
m_kbd->rxd_handler().set(m_scc, FUNC(upd7201_device::rxa_w));
+ output_latch_device &prndata(OUTPUT_LATCH(config, "prndata"));
+ CENTRONICS(config, m_centronics, centronics_devices, nullptr);
+ m_centronics->set_output_latch(prndata);
+ m_centronics->ack_handler().set(m_ppi, FUNC(i8255_device::pc6_w));
+ m_centronics->busy_handler().set(FUNC(qx10_state::centronics_busy_handler));
+ m_centronics->perror_handler().set(FUNC(qx10_state::centronics_perror_handler));
+ m_centronics->fault_handler().set(FUNC(qx10_state::centronics_fault_handler));
+ m_centronics->select_handler().set(FUNC(qx10_state::centronics_select_handler));
+ m_centronics->sense_handler().set(FUNC(qx10_state::centronics_sense_handler));
+
/* sound hardware */
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00);