From 90fcbc42ad138e152324084dcd9a6fd26496b9fc Mon Sep 17 00:00:00 2001 From: Dirk Best Date: Sun, 24 Dec 2023 12:04:00 +0100 Subject: brother/pn8800fxb: Hook up centronics port --- src/mame/brother/pn8800fxb.cpp | 49 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/src/mame/brother/pn8800fxb.cpp b/src/mame/brother/pn8800fxb.cpp index f7e69e37bc9..ecdc914aa44 100644 --- a/src/mame/brother/pn8800fxb.cpp +++ b/src/mame/brother/pn8800fxb.cpp @@ -22,7 +22,6 @@ to 1 and doesn't work correctly. - Improve video emulation (offset, modes, etc.) - Floppy self-test fails (but works otherwise) - - Centronics - Modem - Soft power off/on - RAM contents should be retained when turning off @@ -39,6 +38,7 @@ #include "emu.h" +#include "bus/centronics/ctronics.h" #include "cpu/z180/z180.h" #include "imagedev/floppy.h" #include "machine/rp5c01.h" @@ -71,6 +71,7 @@ public: m_buzzer(*this, "buzzer"), m_fdc(*this, "fdc"), m_floppy(*this, "fdc:0"), + m_centronics(*this, "centronics"), m_lomem_view(*this, "lomem") { } @@ -91,6 +92,7 @@ private: required_device m_buzzer; required_device m_fdc; required_device m_floppy; + required_device m_centronics; memory_view m_lomem_view; uint8_t m_key_select; @@ -104,6 +106,9 @@ private: bool m_fdc_drq; + bool m_centronics_busy; + bool m_centronics_select; + uint8_t m_mem_change; void mem_map(address_map &map); @@ -134,6 +139,9 @@ private: void fdc_data_w(uint8_t data); int floppy_dskchg_r(); + uint8_t cdcc_ctrl_r(); + void cdcc_ctrl_w(uint8_t); + void mem_change_w(uint8_t data); void bank_select_w(uint8_t data); void int_ack_w(uint8_t data); @@ -186,8 +194,8 @@ void pn8800fxb_state::io_map(address_map &map) map(0xa8, 0xa8).mirror(0x07).nopr(); // "not used" - but read often map(0xb0, 0xb0).mirror(0x07).portr("power"); map(0xb8, 0xb8).rw(FUNC(pn8800fxb_state::keyboard_r), FUNC(pn8800fxb_state::keyboard_w)); - // c0-c7 cdcc data - // c8-cf cdcc control + map(0xc0, 0xc0).mirror(0x07).w("centronics_latch", FUNC(output_latch_device::write)); + map(0xc8, 0xc8).mirror(0x07).rw(FUNC(pn8800fxb_state::cdcc_ctrl_r), FUNC(pn8800fxb_state::cdcc_ctrl_w)); map(0xd0, 0xdf).rw("rtc", FUNC(tc8521_device::read), FUNC(tc8521_device::write)); map(0xe0, 0xe0).mirror(0x07).w(FUNC(pn8800fxb_state::bank_select_w)); // e8-ef ga test @@ -613,6 +621,31 @@ int pn8800fxb_state::floppy_dskchg_r() } +//************************************************************************** +// CDCC / CENTRONICS +//************************************************************************** + +uint8_t pn8800fxb_state::cdcc_ctrl_r() +{ + // 7------- centronics busy + // -6------ centronics select + // --54321- not used + // -------0 centronics strobe (write) + + uint8_t data = 0x3f; + + data |= (!m_centronics_select) << 6; + data |= (!m_centronics_busy) << 7; + + return data; +} + +void pn8800fxb_state::cdcc_ctrl_w(uint8_t data) +{ + m_centronics->write_strobe(BIT(data, 0)); +} + + //************************************************************************** // MACHINE EMULATION //************************************************************************** @@ -674,6 +707,8 @@ void pn8800fxb_state::machine_start() save_item(NAME(m_video_offset)); save_item(NAME(m_cursor_ctrl)); save_item(NAME(m_fdc_drq)); + save_item(NAME(m_centronics_busy)); + save_item(NAME(m_centronics_select)); save_item(NAME(m_mem_change)); } @@ -719,6 +754,14 @@ void pn8800fxb_state::pn8800fxb(machine_config &config) m_fdc->inp_rd_callback().set(FUNC(pn8800fxb_state::floppy_dskchg_r)); FLOPPY_CONNECTOR(config, "fdc:0", hd_floppy, "35hd", floppy_image_device::default_pc_floppy_formats); + // centronics + output_latch_device ¢ronics_latch(OUTPUT_LATCH(config, "centronics_latch")); + + CENTRONICS(config, m_centronics, centronics_devices, "printer"); + m_centronics->set_output_latch(centronics_latch); + m_centronics->busy_handler().set([this](int state) { m_centronics_busy = bool(state); }); + m_centronics->select_handler().set([this](int state) { m_centronics_select = bool(state); }); + TC8521(config, "rtc", XTAL(32'768)); // alarm output connected to auto power-on -- cgit v1.2.3