From 56281ca4637409056d15f4eac9bcfe31dc5b6e52 Mon Sep 17 00:00:00 2001 From: Brian Johnson Date: Wed, 29 Mar 2023 00:49:58 -0400 Subject: bus/nabupc: Added support for RS232 Card. (#11047) --- scripts/src/bus.lua | 2 + src/devices/bus/nabupc/option.cpp | 2 + src/devices/bus/nabupc/rs232.cpp | 141 ++++++++++++++++++++++++++++++++++++++ src/devices/bus/nabupc/rs232.h | 20 ++++++ 4 files changed, 165 insertions(+) create mode 100644 src/devices/bus/nabupc/rs232.cpp create mode 100644 src/devices/bus/nabupc/rs232.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index a06a1a43aea..5809fd9d07c 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -5187,6 +5187,8 @@ if (BUSES["NABU"]~=null) then MAME_DIR .. "src/devices/bus/nabupc/hdd.h", MAME_DIR .. "src/devices/bus/nabupc/option.cpp", MAME_DIR .. "src/devices/bus/nabupc/option.h", + MAME_DIR .. "src/devices/bus/nabupc/rs232.cpp", + MAME_DIR .. "src/devices/bus/nabupc/rs232.h", } end diff --git a/src/devices/bus/nabupc/option.cpp b/src/devices/bus/nabupc/option.cpp index 59ca2d660d3..40af4f53fe0 100644 --- a/src/devices/bus/nabupc/option.cpp +++ b/src/devices/bus/nabupc/option.cpp @@ -11,6 +11,7 @@ #include "fdc.h" #include "hdd.h" +#include "rs232.h" DEFINE_DEVICE_TYPE(NABUPC_OPTION_BUS_SLOT, bus::nabupc::option_slot_device, "nabupc_option_slot", "NABU PC Option slot") DEFINE_DEVICE_TYPE(NABUPC_OPTION_BUS, bus::nabupc::option_bus_device, "nabupc_option_bus", "NABU PC Option Bus") @@ -129,6 +130,7 @@ void option_bus_devices(device_slot_interface &device) { device.option_add("fdc", NABUPC_OPTION_FDC); device.option_add("hdd", NABUPC_OPTION_HDD); + device.option_add("rs232", NABUPC_OPTION_RS232); } } // namespace bus::nabupc diff --git a/src/devices/bus/nabupc/rs232.cpp b/src/devices/bus/nabupc/rs232.cpp new file mode 100644 index 00000000000..1da633f9bfe --- /dev/null +++ b/src/devices/bus/nabupc/rs232.cpp @@ -0,0 +1,141 @@ +// license:BSD-3-Clause +// copyright-holders:Brian Johnson +/******************************************************************* + * + * NABU PC RS232 Card + * + *******************************************************************/ + +#include "emu.h" +#include "rs232.h" + +#include "bus/rs232/rs232.h" +#include "machine/i8251.h" +#include "machine/pit8253.h" + + +namespace { + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +/* NABU PC RS232 Device */ + +class rs232_device : public device_t, public bus::nabupc::device_option_expansion_interface +{ +public: + // construction/destruction + rs232_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + // device_option_expansion_interface implementation + virtual uint8_t read(offs_t offset) override; + virtual void write(offs_t offset, uint8_t data) override; + +protected: + // device_t implementation + virtual void device_add_mconfig(machine_config &config) override; + virtual void device_start() override; + + DECLARE_WRITE_LINE_MEMBER(rxrdy_w); + +private: + required_device m_i8251; + required_device m_pit8253; +}; + +//------------------------------------------------- +// rs232_device - constructor +//------------------------------------------------- +rs232_device::rs232_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, NABUPC_OPTION_RS232, tag, owner, clock), + device_option_expansion_interface(mconfig, *this), + m_i8251(*this, "i8251"), + m_pit8253(*this, "i8253") +{ +} + +static DEVICE_INPUT_DEFAULTS_START( terminal ) + DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_9600 ) + DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_9600 ) + DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_8 ) + DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_NONE ) + DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_1 ) +DEVICE_INPUT_DEFAULTS_END + +//------------------------------------------------- +// device_add_mconfig - device-specific config +//------------------------------------------------- +void rs232_device::device_add_mconfig(machine_config &config) +{ + I8251(config, m_i8251, DERIVED_CLOCK(1, 2)); + m_i8251->rxrdy_handler().set(FUNC(rs232_device::rxrdy_w)); + m_i8251->txd_handler().set("rs232", FUNC(rs232_port_device::write_txd)); + + PIT8253(config, m_pit8253, DERIVED_CLOCK(1, 2)); + m_pit8253->set_clk<0>(clock() / 2); + m_pit8253->out_handler<0>().set(m_i8251, FUNC(i8251_device::write_txc)); + m_pit8253->set_clk<1>(clock() / 2); + m_pit8253->out_handler<1>().set(m_i8251, FUNC(i8251_device::write_rxc)); + + rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr)); + rs232.rxd_handler().set(m_i8251, FUNC(i8251_device::write_rxd)); + rs232.cts_handler().set(m_i8251, FUNC(i8251_device::write_cts)); + rs232.set_option_device_input_defaults("null_modem", DEVICE_INPUT_DEFAULTS_NAME(terminal)); + rs232.set_option_device_input_defaults("terminal", DEVICE_INPUT_DEFAULTS_NAME(terminal)); +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- +void rs232_device::device_start() +{ +} + +WRITE_LINE_MEMBER(rs232_device::rxrdy_w) +{ + get_slot()->int_w(!state); +} + +uint8_t rs232_device::read(offs_t offset) +{ + uint8_t result = 0xff; + + switch (offset) { + case 0x00: + case 0x01: + result = m_i8251->read(offset); + break; + case 0x04: + case 0x05: + case 0x07: + result = m_pit8253->read(offset & 3); + break; + case 0x0f: + result = 0x08; + } + return result; +} + +void rs232_device::write(offs_t offset, uint8_t data) +{ + switch (offset) { + case 0x00: + case 0x01: + m_i8251->write(offset, data); + break; + case 0x04: + case 0x05: + case 0x07: + m_pit8253->write(offset & 3, data); + break; + } +} + +} // anonymous namespace + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE_PRIVATE(NABUPC_OPTION_RS232, bus::nabupc::device_option_expansion_interface, rs232_device, "nabupc_option_rs232", "NABU PC RS232 Card") diff --git a/src/devices/bus/nabupc/rs232.h b/src/devices/bus/nabupc/rs232.h new file mode 100644 index 00000000000..613f167b932 --- /dev/null +++ b/src/devices/bus/nabupc/rs232.h @@ -0,0 +1,20 @@ +// license:BSD-3-Clause +// copyright-holders:Brian Johnson +/******************************************************************* + * + * NABU PC RS232 Controller + * + *******************************************************************/ + +#ifndef MAME_BUS_NABUPC_RS232_H +#define MAME_BUS_NABUPC_RS232_H + +#pragma once + +#include "option.h" + + +// device type definition +DECLARE_DEVICE_TYPE_NS(NABUPC_OPTION_RS232, bus::nabupc, device_option_expansion_interface) + +#endif // MAME_BUS_NABUPC_RS232_H -- cgit v1.2.3