From 49ffc90914291058b8af769d6f9cac1833a0de7c Mon Sep 17 00:00:00 2001 From: Nigel Barnes Date: Mon, 14 Oct 2024 21:31:53 +0100 Subject: bus/psion/honda: Added PC Link and Parallel Printer Link cables (not working). bus/psion/honda/ssd.cpp: Added Honda serial port. bus/psion/module: Added Psion RS232/Parallel Module. --- scripts/src/bus.lua | 6 +++ src/devices/bus/psion/honda/parallel.cpp | 67 +++++++++++++++++++++++ src/devices/bus/psion/honda/parallel.h | 13 +++++ src/devices/bus/psion/honda/pclink.cpp | 50 ++++++++++++++++++ src/devices/bus/psion/honda/pclink.h | 13 +++++ src/devices/bus/psion/honda/slot.cpp | 10 ++-- src/devices/bus/psion/honda/ssd.cpp | 85 +++++++++++++++-------------- src/devices/bus/psion/honda/ssd.h | 43 +-------------- src/devices/bus/psion/module/serpar.cpp | 91 ++++++++++++++++++++++++++++++++ src/devices/bus/psion/module/serpar.h | 13 +++++ src/devices/bus/psion/module/slot.cpp | 7 +-- src/devices/bus/psion/module/slot.h | 6 +-- 12 files changed, 312 insertions(+), 92 deletions(-) create mode 100644 src/devices/bus/psion/honda/parallel.cpp create mode 100644 src/devices/bus/psion/honda/parallel.h create mode 100644 src/devices/bus/psion/honda/pclink.cpp create mode 100644 src/devices/bus/psion/honda/pclink.h create mode 100644 src/devices/bus/psion/module/serpar.cpp create mode 100644 src/devices/bus/psion/module/serpar.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 6988e9202db..b20bbf3a135 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -2399,6 +2399,10 @@ if (BUSES["PSION_HONDA"]~=null) then files { MAME_DIR .. "src/devices/bus/psion/honda/slot.cpp", MAME_DIR .. "src/devices/bus/psion/honda/slot.h", + MAME_DIR .. "src/devices/bus/psion/honda/parallel.cpp", + MAME_DIR .. "src/devices/bus/psion/honda/parallel.h", + MAME_DIR .. "src/devices/bus/psion/honda/pclink.cpp", + MAME_DIR .. "src/devices/bus/psion/honda/pclink.h", MAME_DIR .. "src/devices/bus/psion/honda/ssd.cpp", MAME_DIR .. "src/devices/bus/psion/honda/ssd.h", } @@ -2414,6 +2418,8 @@ if (BUSES["PSION_MODULE"]~=null) then files { MAME_DIR .. "src/devices/bus/psion/module/slot.cpp", MAME_DIR .. "src/devices/bus/psion/module/slot.h", + MAME_DIR .. "src/devices/bus/psion/module/serpar.cpp", + MAME_DIR .. "src/devices/bus/psion/module/serpar.h", } end diff --git a/src/devices/bus/psion/honda/parallel.cpp b/src/devices/bus/psion/honda/parallel.cpp new file mode 100644 index 00000000000..417845f92c9 --- /dev/null +++ b/src/devices/bus/psion/honda/parallel.cpp @@ -0,0 +1,67 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************** + + Psion Parallel Printer Link cable + + TODO: + - dump PIC internal ROM and hook up. + +**********************************************************************/ + +#include "emu.h" +#include "parallel.h" + +#include "bus/centronics/ctronics.h" +#include "cpu/pic16c62x/pic16c62x.h" + + +namespace { + +class psion_parallel_device : public device_t, public device_psion_honda_interface +{ +public: + psion_parallel_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, PSION_PARALLEL, tag, owner, clock) + , device_psion_honda_interface(mconfig, *this) + { + } + + static constexpr feature_type unemulated_features() { return feature::PRINTER; } + +protected: + virtual void device_start() override ATTR_COLD { } + + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD + { + PIC16C620(config, "mcu", 9.8304_MHz_XTAL).set_disable(); + + CENTRONICS(config, "centronics", centronics_devices, "printer"); + } + + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; +}; + + +//------------------------------------------------- +// ROM( psion_parallel ) +//------------------------------------------------- + +ROM_START(psion_parallel) + ROM_REGION(0x0400, "mcu", ROMREGION_ERASEFF) + ROM_LOAD("pic16c620.bin", 0x0000, 0x0400, NO_DUMP) +ROM_END + +//------------------------------------------------- +// rom_region - device-specific ROM region +//------------------------------------------------- + +const tiny_rom_entry *psion_parallel_device::device_rom_region() const +{ + return ROM_NAME(psion_parallel); +} + +} // anonymous namespace + + +DEFINE_DEVICE_TYPE_PRIVATE(PSION_PARALLEL, device_psion_honda_interface, psion_parallel_device, "psion_parallel", "Psion Parallel Printer Link cable") diff --git a/src/devices/bus/psion/honda/parallel.h b/src/devices/bus/psion/honda/parallel.h new file mode 100644 index 00000000000..cb2596c3f49 --- /dev/null +++ b/src/devices/bus/psion/honda/parallel.h @@ -0,0 +1,13 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +#ifndef MAME_BUS_PSION_HONDA_PARALLEL_H +#define MAME_BUS_PSION_HONDA_PARALLEL_H + +#pragma once + +#include "slot.h" + + +DECLARE_DEVICE_TYPE(PSION_PARALLEL, device_psion_honda_interface) + +#endif // MAME_BUS_PSION_HONDA_PARALLEL_H diff --git a/src/devices/bus/psion/honda/pclink.cpp b/src/devices/bus/psion/honda/pclink.cpp new file mode 100644 index 00000000000..64943554015 --- /dev/null +++ b/src/devices/bus/psion/honda/pclink.cpp @@ -0,0 +1,50 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************** + + Psion PC Link cable + +**********************************************************************/ + +#include "emu.h" +#include "pclink.h" + +#include "bus/rs232/rs232.h" + + +namespace { + +class psion_pclink_device : public device_t, public device_psion_honda_interface +{ +public: + psion_pclink_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, PSION_PCLINK, tag, owner, clock) + , device_psion_honda_interface(mconfig, *this) + , m_rs232(*this, "rs232") + { + } + +protected: + virtual void device_start() override ATTR_COLD { } + + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD + { + RS232_PORT(config, m_rs232, default_rs232_devices, nullptr); + m_rs232->rxd_handler().set(DEVICE_SELF_OWNER, FUNC(psion_honda_slot_device::write_rxd)); + m_rs232->dcd_handler().set(DEVICE_SELF_OWNER, FUNC(psion_honda_slot_device::write_dcd)); + m_rs232->dsr_handler().set(DEVICE_SELF_OWNER, FUNC(psion_honda_slot_device::write_dsr)); + m_rs232->cts_handler().set(DEVICE_SELF_OWNER, FUNC(psion_honda_slot_device::write_cts)); + } + + virtual void write_txd(int state) override { m_rs232->write_txd(state); } + virtual void write_dtr(int state) override { m_rs232->write_dtr(state); } + virtual void write_rts(int state) override { m_rs232->write_rts(state); } + +private: + required_device m_rs232; +}; + +} // anonymous namespace + + +DEFINE_DEVICE_TYPE_PRIVATE(PSION_PCLINK, device_psion_honda_interface, psion_pclink_device, "psion_pclink", "Psion PC Link cable") diff --git a/src/devices/bus/psion/honda/pclink.h b/src/devices/bus/psion/honda/pclink.h new file mode 100644 index 00000000000..2feb67a7f72 --- /dev/null +++ b/src/devices/bus/psion/honda/pclink.h @@ -0,0 +1,13 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +#ifndef MAME_BUS_PSION_HONDA_PCLINK_H +#define MAME_BUS_PSION_HONDA_PCLINK_H + +#pragma once + +#include "slot.h" + + +DECLARE_DEVICE_TYPE(PSION_PCLINK, device_psion_honda_interface) + +#endif // MAME_BUS_PSION_HONDA_PCLINK_H diff --git a/src/devices/bus/psion/honda/slot.cpp b/src/devices/bus/psion/honda/slot.cpp index 268fa9aadaf..b0f28309215 100644 --- a/src/devices/bus/psion/honda/slot.cpp +++ b/src/devices/bus/psion/honda/slot.cpp @@ -112,13 +112,15 @@ void psion_honda_slot_device::write_rts(int state) //------------------------------------------------- // slot devices -//#include "parallel.h" -//#include "pclink.h" +//#include "cyclone.h" +#include "parallel.h" +#include "pclink.h" #include "ssd.h" void psion_honda_devices(device_slot_interface &device) { - //device.option_add("parallel", PSION_PARALLEL); // Psion Parallel Printer Link cable - //device.option_add("pclink", PSION_PCLINK); // Psion PC Link cable + //device.option_add("cyclone", PSION_HONDA_CYCLONE); // Cyclone Floppy Drive (Honda) + device.option_add("parallel", PSION_PARALLEL); // Psion Parallel Printer Link cable + device.option_add("pclink", PSION_PCLINK); // Psion PC Link cable device.option_add("ssd", PSION_SIENA_SSD); // Psion Siena SSD Drive } diff --git a/src/devices/bus/psion/honda/ssd.cpp b/src/devices/bus/psion/honda/ssd.cpp index 4fe09fa8843..07571663d7d 100644 --- a/src/devices/bus/psion/honda/ssd.cpp +++ b/src/devices/bus/psion/honda/ssd.cpp @@ -8,49 +8,52 @@ #include "emu.h" #include "ssd.h" -#include "bus/rs232/rs232.h" +#include "bus/psion/honda/slot.h" +#include "machine/psion_ssd.h" -//************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** -DEFINE_DEVICE_TYPE(PSION_SIENA_SSD, psion_siena_ssd_device, "psion_siena_ssd", "Psion Siena SSD Drive") +namespace { - -//------------------------------------------------- -// device_add_mconfig - add device configuration -//------------------------------------------------- - -void psion_siena_ssd_device::device_add_mconfig(machine_config &config) -{ - PSION_SSD(config, m_ssd); - m_ssd->door_cb().set(DEVICE_SELF_OWNER, FUNC(psion_honda_slot_device::write_sdoe)); - - RS232_PORT(config, "rs232", default_rs232_devices, nullptr); -} - - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// psion_siena_ssd_device - constructor -//------------------------------------------------- - -psion_siena_ssd_device::psion_siena_ssd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, PSION_SIENA_SSD, tag, owner, clock) - , device_psion_honda_interface(mconfig, *this) - , m_ssd(*this, "ssd") -{ -} - - -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- - -void psion_siena_ssd_device::device_start() +class psion_siena_ssd_device : public device_t, public device_psion_honda_interface { -} +public: + psion_siena_ssd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, PSION_SIENA_SSD, tag, owner, clock) + , device_psion_honda_interface(mconfig, *this) + , m_ssd(*this, "ssd") + , m_honda(*this, "honda") + { + } + +protected: + virtual void device_start() override ATTR_COLD { } + + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD + { + PSION_SSD(config, m_ssd); + m_ssd->door_cb().set(DEVICE_SELF_OWNER, FUNC(psion_honda_slot_device::write_sdoe)); + + PSION_HONDA_SLOT(config, m_honda, psion_honda_devices, nullptr); + m_honda->rxd_handler().set(DEVICE_SELF_OWNER, FUNC(psion_honda_slot_device::write_rxd)); + m_honda->dcd_handler().set(DEVICE_SELF_OWNER, FUNC(psion_honda_slot_device::write_dcd)); + m_honda->dsr_handler().set(DEVICE_SELF_OWNER, FUNC(psion_honda_slot_device::write_dsr)); + m_honda->cts_handler().set(DEVICE_SELF_OWNER, FUNC(psion_honda_slot_device::write_cts)); + } + + virtual uint8_t data_r() override { return m_ssd->data_r(); } + virtual void data_w(uint16_t data) override { m_ssd->data_w(data); } + + virtual void write_txd(int state) override { m_honda->write_txd(state); } + virtual void write_dtr(int state) override { m_honda->write_dtr(state); } + virtual void write_rts(int state) override { m_honda->write_rts(state); } + +private: + required_device m_ssd; + required_device m_honda; +}; + +} // anonymous namespace + + +DEFINE_DEVICE_TYPE_PRIVATE(PSION_SIENA_SSD, device_psion_honda_interface, psion_siena_ssd_device, "psion_siena_ssd", "Psion Siena SSD Drive") diff --git a/src/devices/bus/psion/honda/ssd.h b/src/devices/bus/psion/honda/ssd.h index 9302c544b10..d45b8eb07eb 100644 --- a/src/devices/bus/psion/honda/ssd.h +++ b/src/devices/bus/psion/honda/ssd.h @@ -1,51 +1,12 @@ // license:BSD-3-Clause // copyright-holders:Nigel Barnes -/********************************************************************** - - Psion Siena SSD Drive - -**********************************************************************/ - #ifndef MAME_BUS_PSION_HONDA_SSD_H #define MAME_BUS_PSION_HONDA_SSD_H -#include "slot.h" -#include "machine/psion_ssd.h" - - -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -// ======================> psion_siena_ssd_device - -class psion_siena_ssd_device : - public device_t, - public device_psion_honda_interface -{ -public: - // construction/destruction - psion_siena_ssd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - - static constexpr feature_type unemulated_features() { return feature::COMMS; } - -protected: - // device_t overrides - virtual void device_start() override ATTR_COLD; - - // optional information overrides - virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; - - virtual uint8_t data_r() override { return m_ssd->data_r(); } - virtual void data_w(uint16_t data) override { m_ssd->data_w(data); } - -private: - required_device m_ssd; -}; +#include "slot.h" -// device type definition -DECLARE_DEVICE_TYPE(PSION_SIENA_SSD, psion_siena_ssd_device) +DECLARE_DEVICE_TYPE(PSION_SIENA_SSD, device_psion_honda_interface) #endif // MAME_BUS_PSION_HONDA_SSD_H diff --git a/src/devices/bus/psion/module/serpar.cpp b/src/devices/bus/psion/module/serpar.cpp new file mode 100644 index 00000000000..ff3cee82253 --- /dev/null +++ b/src/devices/bus/psion/module/serpar.cpp @@ -0,0 +1,91 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************** + + Psion RS232/Parallel Module + +**********************************************************************/ + +#include "emu.h" +#include "serpar.h" + +#include "bus/centronics/ctronics.h" +#include "bus/rs232/rs232.h" +#include "machine/output_latch.h" +#include "machine/psion_asic5.h" + + +namespace { + +class psion_serial_parallel_device : public device_t, public device_psion_module_interface +{ +public: + psion_serial_parallel_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, PSION_SERIAL_PARALLEL, tag, owner, clock) + , device_psion_module_interface(mconfig, *this) + , m_asic5(*this, "asic5") + , m_cent_ctrl_out(*this, "cent_ctrl_out") + { + } + +protected: + // device_t overrides + virtual void device_start() override ATTR_COLD { }; + virtual void device_reset() override ATTR_COLD { m_cent_ctrl_out->write(0xff); }; + + // optional information overrides + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + + virtual uint8_t data_r() override { return m_asic5->data_r(); } + virtual void data_w(uint16_t data) override { m_asic5->data_w(data); } + +private: + required_device m_asic5; + required_device m_cent_ctrl_out; +}; + + +//------------------------------------------------- +// device_add_mconfig - add device configuration +//------------------------------------------------- + +void psion_serial_parallel_device::device_add_mconfig(machine_config &config) +{ + PSION_ASIC5(config, m_asic5, 1'536'000).set_mode(psion_asic5_device::PERIPHERAL_MODE); // TODO: clock derived from host + m_asic5->set_info_byte(0x03); // RS232 + Parallel + m_asic5->readpa_handler().set("cent_status_in", FUNC(input_buffer_device::read)); + m_asic5->writepb_handler().set("cent_data_out", FUNC(output_latch_device::write)); + m_asic5->writepc_handler().set("cent_ctrl_out", FUNC(output_latch_device::write)); + m_asic5->txd_handler().set("rs232", FUNC(rs232_port_device::write_txd)); + m_asic5->rts_handler().set("rs232", FUNC(rs232_port_device::write_rts)); + m_asic5->dtr_handler().set("rs232", FUNC(rs232_port_device::write_dtr)); + m_asic5->int_handler().set(DEVICE_SELF_OWNER, FUNC(psion_module_slot_device::intr_w)); + + rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr)); + rs232.rxd_handler().set(m_asic5, FUNC(psion_asic5_device::write_rxd)); + rs232.dcd_handler().set(m_asic5, FUNC(psion_asic5_device::write_dcd)); + rs232.dsr_handler().set(m_asic5, FUNC(psion_asic5_device::write_dsr)); + rs232.cts_handler().set(m_asic5, FUNC(psion_asic5_device::write_cts)); + + centronics_device ¢ronics(CENTRONICS(config, "centronics", centronics_devices, "printer")); + centronics.busy_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit4)); + centronics.ack_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit5)); + centronics.fault_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit6)); + centronics.perror_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit7)); + + output_latch_device ¢_data_out(OUTPUT_LATCH(config, "cent_data_out")); + centronics.set_output_latch(cent_data_out); + + output_latch_device ¢_ctrl_out(OUTPUT_LATCH(config, "cent_ctrl_out")); + cent_ctrl_out.bit_handler<4>().set("centronics", FUNC(centronics_device::write_strobe)); + cent_ctrl_out.bit_handler<5>().set("centronics", FUNC(centronics_device::write_init)); + cent_ctrl_out.bit_handler<6>().set("centronics", FUNC(centronics_device::write_autofd)); + cent_ctrl_out.bit_handler<7>().set("centronics", FUNC(centronics_device::write_select_in)); + + INPUT_BUFFER(config, "cent_status_in"); +} + +} // anonymous namespace + + +DEFINE_DEVICE_TYPE_PRIVATE(PSION_SERIAL_PARALLEL, device_psion_module_interface, psion_serial_parallel_device, "psion_serpar", "Psion RS232/Parallel Module") diff --git a/src/devices/bus/psion/module/serpar.h b/src/devices/bus/psion/module/serpar.h new file mode 100644 index 00000000000..7c434d78230 --- /dev/null +++ b/src/devices/bus/psion/module/serpar.h @@ -0,0 +1,13 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +#ifndef MAME_BUS_PSION_MODULE_SERPAR_H +#define MAME_BUS_PSION_MODULE_SERPAR_H + +#pragma once + +#include "slot.h" + + +DECLARE_DEVICE_TYPE(PSION_SERIAL_PARALLEL, device_psion_module_interface) + +#endif // MAME_BUS_PSION_MODULE_SERPAR_H diff --git a/src/devices/bus/psion/module/slot.cpp b/src/devices/bus/psion/module/slot.cpp index 55107f8f3ac..1388110534d 100644 --- a/src/devices/bus/psion/module/slot.cpp +++ b/src/devices/bus/psion/module/slot.cpp @@ -45,8 +45,8 @@ device_psion_module_interface::device_psion_module_interface(const machine_confi psion_module_slot_device::psion_module_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, PSION_MODULE_SLOT, tag, owner, clock) , device_single_card_slot_interface(mconfig, *this) - , m_card(nullptr) , m_intr_cb(*this) + , m_card(nullptr) { } @@ -101,13 +101,14 @@ void psion_module_slot_device::io_w(offs_t offset, uint8_t data) //------------------------------------------------- // slot devices -//#include "rs232parallel" -//#include "rs232ttl" +#include "serpar.h" void psion_hcmodule_devices(device_slot_interface &device) { + device.option_add("serpar", PSION_SERIAL_PARALLEL); // Psion RS232/Parallel Module } void psion_mcmodule_devices(device_slot_interface &device) { + device.option_add("serpar", PSION_SERIAL_PARALLEL); // Psion RS232/Parallel Module } diff --git a/src/devices/bus/psion/module/slot.h b/src/devices/bus/psion/module/slot.h index 66c427dfb94..93acbebdbca 100644 --- a/src/devices/bus/psion/module/slot.h +++ b/src/devices/bus/psion/module/slot.h @@ -78,13 +78,13 @@ public: void intr_w(int state) { m_intr_cb(state); } protected: - // device-level overrides + // device_t overrides virtual void device_start() override ATTR_COLD; - device_psion_module_interface *m_card; - private: devcb_write_line m_intr_cb; + + device_psion_module_interface *m_card; }; -- cgit v1.2.3