From 263d930a127c53d75e818716587b804b41f175e7 Mon Sep 17 00:00:00 2001 From: angelosa Date: Sun, 10 Mar 2024 22:37:16 +0100 Subject: [PATCH] machine/it8705f: add UARTs --- src/devices/machine/it8705f.cpp | 243 +++++++++++++++++++++++++---- src/devices/machine/it8705f.h | 70 ++++++--- src/devices/machine/sis950_lpc.cpp | 37 ++--- src/devices/machine/sis950_lpc.h | 17 +- src/mame/pc/sis630.cpp | 49 ++++-- 5 files changed, 337 insertions(+), 79 deletions(-) diff --git a/src/devices/machine/it8705f.cpp b/src/devices/machine/it8705f.cpp index 0229109a9b3..09977ef5cce 100644 --- a/src/devices/machine/it8705f.cpp +++ b/src/devices/machine/it8705f.cpp @@ -5,7 +5,7 @@ Winbond IT8705F LPC Super I/O TODO: -- Move stuff from sis950_lpc +- Move stuff from sis950_lpc; **************************************************************************************************/ @@ -29,17 +29,18 @@ it8705f_device::it8705f_device(const machine_config &mconfig, const char *tag, d , device_isa16_card_interface(mconfig, *this) , device_memory_interface(mconfig, *this) , m_space_config("superio_config_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(it8705f_device::config_map), this)) - , m_lpt(*this, "lpt") + , m_pc_com(*this, "uart%d", 0U) + , m_pc_lpt(*this, "lpta") , m_logical_view(*this, "logical_view") , m_irq1_callback(*this) , m_irq8_callback(*this) , m_irq9_callback(*this) -// , m_txd1_callback(*this) -// , m_ndtr1_callback(*this) -// , m_nrts1_callback(*this) -// , m_txd2_callback(*this) -// , m_ndtr2_callback(*this) -// , m_nrts2_callback(*this) + , m_txd1_callback(*this) + , m_ndtr1_callback(*this) + , m_nrts1_callback(*this) + , m_txd2_callback(*this) + , m_ndtr2_callback(*this) + , m_nrts2_callback(*this) , m_index(0) , m_logical_index(0) , m_lock_sequence_index(0) @@ -67,10 +68,10 @@ void it8705f_device::device_reset() m_index = 0; m_lock_sequence_index = 0; - m_lpt_address = 0x0378; - m_lpt_irq_line = 7; - m_lpt_drq_line = 4; // disabled -// m_lpt_mode = 0x3f; + m_pc_lpt_address = 0x0378; + m_pc_lpt_irq_line = 7; + m_pc_lpt_drq_line = 4; // disabled +// m_pc_lpt_mode = 0x3f; } device_memory_interface::space_config_vector it8705f_device::memory_space_config() const @@ -82,8 +83,20 @@ device_memory_interface::space_config_vector it8705f_device::memory_space_config void it8705f_device::device_add_mconfig(machine_config &config) { - PC_LPT(config, m_lpt); - m_lpt->irq_handler().set(FUNC(it8705f_device::irq_parallel_w)); + PC_LPT(config, m_pc_lpt); + m_pc_lpt->irq_handler().set(FUNC(it8705f_device::irq_parallel_w)); + + NS16550(config, m_pc_com[0], XTAL(24'000'000) / 13); + m_pc_com[0]->out_int_callback().set(FUNC(it8705f_device::irq_serial1_w)); + m_pc_com[0]->out_tx_callback().set(FUNC(it8705f_device::txd_serial1_w)); + m_pc_com[0]->out_dtr_callback().set(FUNC(it8705f_device::dtr_serial1_w)); + m_pc_com[0]->out_rts_callback().set(FUNC(it8705f_device::rts_serial1_w)); + + NS16550(config, m_pc_com[1], XTAL(24'000'000) / 13); + m_pc_com[1]->out_int_callback().set(FUNC(it8705f_device::irq_serial2_w)); + m_pc_com[1]->out_tx_callback().set(FUNC(it8705f_device::txd_serial2_w)); + m_pc_com[1]->out_dtr_callback().set(FUNC(it8705f_device::dtr_serial2_w)); + m_pc_com[1]->out_rts_callback().set(FUNC(it8705f_device::rts_serial2_w)); } @@ -95,9 +108,18 @@ void it8705f_device::remap(int space_id, offs_t start, offs_t end) m_isa->install_device(0x002e, 0x002f, read8sm_delegate(*this, FUNC(it8705f_device::read)), write8sm_delegate(*this, FUNC(it8705f_device::write))); // can't map below 0x100 - if (m_activate[3] & 1 && m_lpt_address & 0xf00) + if (m_activate[3] & 1 && m_pc_lpt_address & 0xf00) { - m_isa->install_device(m_lpt_address, m_lpt_address + 3, read8sm_delegate(*m_lpt, FUNC(pc_lpt_device::read)), write8sm_delegate(*m_lpt, FUNC(pc_lpt_device::write))); + m_isa->install_device(m_pc_lpt_address, m_pc_lpt_address + 3, read8sm_delegate(*m_pc_lpt, FUNC(pc_lpt_device::read)), write8sm_delegate(*m_pc_lpt, FUNC(pc_lpt_device::write))); + } + + for (int i = 0; i < 2; i++) + { + if (m_activate[i + 1]) + { + const u16 uart_addr = m_pc_com_address[i]; + m_isa->install_device(uart_addr, uart_addr + 7, read8sm_delegate(*m_pc_com[i], FUNC(ns16450_device::ins8250_r)), write8sm_delegate(*m_pc_com[i], FUNC(ns16450_device::ins8250_w))); + } } } } @@ -142,7 +164,7 @@ void it8705f_device::config_map(address_map &map) NAME([this] (offs_t offset, u8 data) { if (BIT(data, 1)) m_lock_sequence_index = 0; - // TODO: bit 0 + // TODO: bit 0 for global reset }) ); map(0x07, 0x07).lr8(NAME([this] () { return m_logical_index; })).w(FUNC(it8705f_device::logical_device_select_w)); @@ -161,21 +183,26 @@ void it8705f_device::config_map(address_map &map) m_logical_view[0](0x31, 0xff).unmaprw(); // UART1 m_logical_view[1](0x30, 0x30).rw(FUNC(it8705f_device::activate_r<1>), FUNC(it8705f_device::activate_w<1>)); - m_logical_view[1](0x31, 0xff).unmaprw(); + m_logical_view[1](0x60, 0x61).rw(FUNC(it8705f_device::uart_address_r<0>), FUNC(it8705f_device::uart_address_w<0>)); + m_logical_view[1](0x70, 0x70).rw(FUNC(it8705f_device::uart_irq_r<0>), FUNC(it8705f_device::uart_irq_w<0>)); + m_logical_view[1](0xf0, 0xf0).rw(FUNC(it8705f_device::uart_config_r<0>), FUNC(it8705f_device::uart_config_w<0>)); // UART2 m_logical_view[2](0x30, 0x30).rw(FUNC(it8705f_device::activate_r<2>), FUNC(it8705f_device::activate_w<2>)); - m_logical_view[2](0x31, 0xff).unmaprw(); + m_logical_view[2](0x60, 0x61).rw(FUNC(it8705f_device::uart_address_r<1>), FUNC(it8705f_device::uart_address_w<1>)); + m_logical_view[2](0x70, 0x70).rw(FUNC(it8705f_device::uart_irq_r<1>), FUNC(it8705f_device::uart_irq_w<1>)); + m_logical_view[2](0xf0, 0xf0).rw(FUNC(it8705f_device::uart_config_r<1>), FUNC(it8705f_device::uart_config_w<1>)); // LPT m_logical_view[3](0x30, 0x30).rw(FUNC(it8705f_device::activate_r<3>), FUNC(it8705f_device::activate_w<3>)); m_logical_view[3](0x60, 0x61).lrw8( NAME([this] (offs_t offset) { - return (m_lpt_address >> (offset * 8)) & 0xff; + return (m_pc_lpt_address >> (offset * 8)) & 0xff; }), NAME([this] (offs_t offset, u8 data) { const u8 shift = offset * 8; - m_lpt_address &= 0xff << shift; - m_lpt_address |= data << (shift ^ 8); - LOG("LDN3 (LPT): remap %04x ([%d] %02x)\n", m_lpt_address, offset, data); + m_pc_lpt_address &= 0xff << shift; + m_pc_lpt_address |= data << (shift ^ 8); + m_pc_lpt_address &= ~3; + LOG("LDN3 (LPT): remap %04x ([%d] %02x)\n", m_pc_lpt_address, offset, data); remap(AS_IO, 0, 0x400); }) @@ -183,21 +210,21 @@ void it8705f_device::config_map(address_map &map) //m_logical_view[3](0x62, 0x63) secondary base address //m_logical_view[3](0x64, 0x65) POST data port base address m_logical_view[3](0x70, 0x70).lrw8( - NAME([this] () { - return m_lpt_irq_line; + NAME([this] () { + return m_pc_lpt_irq_line; }), NAME([this] (offs_t offset, u8 data) { - m_lpt_irq_line = data & 0xf; - LOG("LDN3 (LPT): irq routed to %02x\n", m_lpt_irq_line); + m_pc_lpt_irq_line = data & 0xf; + LOG("LDN3 (LPT): irq routed to %02x\n", m_pc_lpt_irq_line); }) ); m_logical_view[3](0x74, 0x74).lrw8( NAME([this] () { - return m_lpt_drq_line; + return m_pc_lpt_drq_line; }), NAME([this] (offs_t offset, u8 data) { - m_lpt_drq_line = data & 0x7; - LOG("LDN3 (LPT): drq %s (%02x)\n", BIT(m_lpt_drq_line, 2) ? "disabled" : "enabled", data); + m_pc_lpt_drq_line = data & 0x7; + LOG("LDN3 (LPT): drq %s (%02x)\n", BIT(m_pc_lpt_drq_line, 2) ? "disabled" : "enabled", data); }) ); // Environment controller / HW monitor @@ -288,6 +315,160 @@ void it8705f_device::request_irq(int irq, int state) } } +/* + * Device #1/#2 (UART) + */ + +template u8 it8705f_device::uart_address_r(offs_t offset) +{ + return (m_pc_com_address[N] >> (offset * 8)) & 0xff; +} + +template void it8705f_device::uart_address_w(offs_t offset, u8 data) +{ + const u8 shift = offset * 8; + m_pc_com_address[N] &= 0xff << shift; + m_pc_com_address[N] |= data << (shift ^ 8); + m_pc_com_address[N] &= ~7; + LOG("LDN%d (UART): remap %04x ([%d] %02x)\n", N, m_pc_com_address[N], offset, data); + + remap(AS_IO, 0, 0x400); +} + +template u8 it8705f_device::uart_irq_r(offs_t offset) +{ + return m_pc_com_irq_line[N]; +} + +template void it8705f_device::uart_irq_w(offs_t offset, u8 data) +{ + m_pc_com_irq_line[N] = data & 0xf; + LOG("LDN%d (UART): irq routed to %02x\n", N, m_pc_com_irq_line[N]); +} + +template u8 it8705f_device::uart_config_r(offs_t offset) +{ + return m_pc_com_control[N]; +} + +/* + * ---- -xx- Clock Source + * ---- -00- 24 MHz/13 + * ---- -??- + * ---- ---x IRQ sharing enable + */ +template void it8705f_device::uart_config_w(offs_t offset, u8 data) +{ + m_pc_com_control[N] = data; + LOG("LDN%d (UART): control %02x\n", N, m_pc_com_control[N]); +} + +void it8705f_device::irq_serial1_w(int state) +{ + if (!m_activate[1]) + return; + request_irq(3, state ? ASSERT_LINE : CLEAR_LINE); +} + +void it8705f_device::irq_serial2_w(int state) +{ + if (!m_activate[2]) + return; + request_irq(4, state ? ASSERT_LINE : CLEAR_LINE); +} + +void it8705f_device::txd_serial1_w(int state) +{ + if (!m_activate[1]) + return; + m_txd1_callback(state); +} + +void it8705f_device::txd_serial2_w(int state) +{ + if (!m_activate[2]) + return; + m_txd2_callback(state); +} + +void it8705f_device::dtr_serial1_w(int state) +{ + if (!m_activate[1]) + return; + m_ndtr1_callback(state); +} + +void it8705f_device::dtr_serial2_w(int state) +{ + if (!m_activate[2]) + return; + m_ndtr2_callback(state); +} + +void it8705f_device::rts_serial1_w(int state) +{ + if (!m_activate[1]) + return; + m_nrts1_callback(state); +} + +void it8705f_device::rts_serial2_w(int state) +{ + if (!m_activate[2]) + return; + m_nrts2_callback(state); +} + +void it8705f_device::rxd1_w(int state) +{ + m_pc_com[0]->rx_w(state); +} + +void it8705f_device::ndcd1_w(int state) +{ + m_pc_com[0]->dcd_w(state); +} + +void it8705f_device::ndsr1_w(int state) +{ + m_pc_com[0]->dsr_w(state); +} + +void it8705f_device::nri1_w(int state) +{ + m_pc_com[0]->ri_w(state); +} + +void it8705f_device::ncts1_w(int state) +{ + m_pc_com[0]->cts_w(state); +} + +void it8705f_device::rxd2_w(int state) +{ + m_pc_com[1]->rx_w(state); +} + +void it8705f_device::ndcd2_w(int state) +{ + m_pc_com[1]->dcd_w(state); +} + +void it8705f_device::ndsr2_w(int state) +{ + m_pc_com[1]->dsr_w(state); +} + +void it8705f_device::nri2_w(int state) +{ + m_pc_com[1]->ri_w(state); +} + +void it8705f_device::ncts2_w(int state) +{ + m_pc_com[1]->cts_w(state); +} + /* * Device #3 (Parallel) */ @@ -296,5 +477,5 @@ void it8705f_device::irq_parallel_w(int state) { if (m_activate[3] == false) return; - request_irq(m_lpt_irq_line, state ? ASSERT_LINE : CLEAR_LINE); + request_irq(m_pc_lpt_irq_line, state ? ASSERT_LINE : CLEAR_LINE); } diff --git a/src/devices/machine/it8705f.h b/src/devices/machine/it8705f.h index 68251b54178..3bedd2e2240 100644 --- a/src/devices/machine/it8705f.h +++ b/src/devices/machine/it8705f.h @@ -9,6 +9,7 @@ #include "bus/isa/isa.h" #include "machine/8042kbdc.h" #include "machine/ds128x.h" +#include "machine/ins8250.h" #include "machine/pc_lpt.h" class it8705f_device : public device_t, @@ -24,12 +25,23 @@ public: auto irq1() { return m_irq1_callback.bind(); } auto irq8() { return m_irq8_callback.bind(); } auto irq9() { return m_irq9_callback.bind(); } -// auto txd1() { return m_txd1_callback.bind(); } -// auto ndtr1() { return m_ndtr1_callback.bind(); } -// auto nrts1() { return m_nrts1_callback.bind(); } -// auto txd2() { return m_txd2_callback.bind(); } -// auto ndtr2() { return m_ndtr2_callback.bind(); } -// auto nrts2() { return m_nrts2_callback.bind(); } + auto txd1() { return m_txd1_callback.bind(); } + auto ndtr1() { return m_ndtr1_callback.bind(); } + auto nrts1() { return m_nrts1_callback.bind(); } + auto txd2() { return m_txd2_callback.bind(); } + auto ndtr2() { return m_ndtr2_callback.bind(); } + auto nrts2() { return m_nrts2_callback.bind(); } + + void rxd1_w(int state); + void ndcd1_w(int state); + void ndsr1_w(int state); + void nri1_w(int state); + void ncts1_w(int state); + void rxd2_w(int state); + void ndcd2_w(int state); + void ndsr2_w(int state); + void nri2_w(int state); + void ncts2_w(int state); protected: virtual void device_start() override; @@ -41,28 +53,25 @@ protected: private: const address_space_config m_space_config; - required_device m_lpt; + required_device_array m_pc_com; + required_device m_pc_lpt; memory_view m_logical_view; devcb_write_line m_irq1_callback; devcb_write_line m_irq8_callback; devcb_write_line m_irq9_callback; -// devcb_write_line m_txd1_callback; -// devcb_write_line m_ndtr1_callback; -// devcb_write_line m_nrts1_callback; -// devcb_write_line m_txd2_callback; -// devcb_write_line m_ndtr2_callback; -// devcb_write_line m_nrts2_callback; + devcb_write_line m_txd1_callback; + devcb_write_line m_ndtr1_callback; + devcb_write_line m_nrts1_callback; + devcb_write_line m_txd2_callback; + devcb_write_line m_ndtr2_callback; + devcb_write_line m_nrts2_callback; u8 m_index = 0; u8 m_logical_index = 0; bool m_activate[0xb]{}; u8 m_lock_sequence_index = 0; - u8 m_lpt_irq_line; - u8 m_lpt_drq_line; -// u8 m_lpt_mode; - u16 m_lpt_address; uint8_t read(offs_t offset); void write(offs_t offset, u8 data); @@ -73,9 +82,34 @@ private: template u8 activate_r(offs_t offset); template void activate_w(offs_t offset, u8 data); + void request_irq(int irq, int state); + + u8 m_pc_lpt_irq_line = 7; + u8 m_pc_lpt_drq_line = 4; +// u8 m_pc_lpt_mode; + u16 m_pc_lpt_address = 0x378; + void irq_parallel_w(int state); - void request_irq(int irq, int state); + u16 m_pc_com_address[2]{}; + u8 m_pc_com_irq_line[2]{}; + u8 m_pc_com_control[2]{}; + + void irq_serial1_w(int state); + void txd_serial1_w(int state); + void dtr_serial1_w(int state); + void rts_serial1_w(int state); + void irq_serial2_w(int state); + void txd_serial2_w(int state); + void dtr_serial2_w(int state); + void rts_serial2_w(int state); + + template u8 uart_address_r(offs_t offset); + template void uart_address_w(offs_t offset, u8 data); + template u8 uart_irq_r(offs_t offset); + template void uart_irq_w(offs_t offset, u8 data); + template u8 uart_config_r(offs_t offset); + template void uart_config_w(offs_t offset, u8 data); }; DECLARE_DEVICE_TYPE(IT8705F, it8705f_device); diff --git a/src/devices/machine/sis950_lpc.cpp b/src/devices/machine/sis950_lpc.cpp index 88085bf9eb0..a7cde1062bf 100644 --- a/src/devices/machine/sis950_lpc.cpp +++ b/src/devices/machine/sis950_lpc.cpp @@ -68,7 +68,6 @@ sis950_lpc_device::sis950_lpc_device(const machine_config &mconfig, const char * , m_isabus(*this, "isabus") , m_speaker(*this, "speaker") , m_rtc(*this, "rtc") - , m_uart(*this, "uart") , m_acpi(*this, "acpi") , m_smbus(*this, "smbus") , m_fast_reset_cb(*this) @@ -180,22 +179,6 @@ void sis950_lpc_device::device_add_mconfig(machine_config &config) m_rtc->irq().set(m_pic_slave, FUNC(pic8259_device::ir0_w)); m_rtc->set_century_index(0x32); - // serial fragment - // TODO: unconfirmed type / clock - INS8250(config, m_uart, XTAL(18'432'000) / 10); - m_uart->out_tx_callback().set("com1", FUNC(rs232_port_device::write_txd)); - m_uart->out_dtr_callback().set("com1", FUNC(rs232_port_device::write_dtr)); - m_uart->out_rts_callback().set("com1", FUNC(rs232_port_device::write_rts)); -// m_uart->out_int_callback().set() -// m_uart->out_baudout_callback().set([this](int state){ if (m_8251dtr_state) m_uart->rclk_w(state); }); // TODO: Fix INS8250 BAUDOUT pin support - - rs232_port_device &rs232(RS232_PORT(config, "com1", default_rs232_devices, nullptr)); - rs232.rxd_handler().set(m_uart, FUNC(ins8250_uart_device::rx_w)); - rs232.dcd_handler().set(m_uart, FUNC(ins8250_uart_device::dcd_w)); - rs232.dsr_handler().set(m_uart, FUNC(ins8250_uart_device::dsr_w)); - rs232.ri_handler().set(m_uart, FUNC(ins8250_uart_device::ri_w)); - rs232.cts_handler().set(m_uart, FUNC(ins8250_uart_device::cts_w)); - // TODO: left/right speaker connection SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50); @@ -520,7 +503,7 @@ void sis950_lpc_device::io_map(address_map &map) // map(0x03bc, 0x03bf) parallel port 3 // map(0x03e8, 0x03ef) serial 4 // map(0x03f0, 0x03f7) FDC 1 - map(0x03f8, 0x03ff).rw(m_uart, FUNC(ins8250_device::ins8250_r), FUNC(ins8250_device::ins8250_w)); // COM1 + // map(0x03f8, 0x03ff).rw(m_uart, FUNC(ins8250_device::ins8250_r), FUNC(ins8250_device::ins8250_w)); // COM1 // map(0x0530, 0x0537) - MSS (TCP Maximum Segment Size?) // map(0x0604, 0x060b) / @@ -598,6 +581,24 @@ void sis950_lpc_device::unmap_log_w(offs_t offset, u8 data) LOGTODO("LPC Unemulated [%02x] %02x W\n", offset + 0x10, data); } +/* + * IRQ sharing + */ + +void sis950_lpc_device::pc_irq1_w(int state) { m_pic_master->ir1_w(state); } +void sis950_lpc_device::pc_irq3_w(int state) { m_pic_master->ir3_w(state); } +void sis950_lpc_device::pc_irq4_w(int state) { m_pic_master->ir4_w(state); } +void sis950_lpc_device::pc_irq5_w(int state) { m_pic_master->ir5_w(state); } +void sis950_lpc_device::pc_irq6_w(int state) { m_pic_master->ir6_w(state); } +void sis950_lpc_device::pc_irq7_w(int state) { m_pic_master->ir7_w(state); } +void sis950_lpc_device::pc_irq8n_w(int state) { m_pic_slave->ir0_w(state); } +void sis950_lpc_device::pc_irq9_w(int state) { m_pic_slave->ir1_w(state); } +void sis950_lpc_device::pc_irq10_w(int state) { m_pic_slave->ir2_w(state); } +void sis950_lpc_device::pc_irq11_w(int state) { m_pic_slave->ir3_w(state); } +void sis950_lpc_device::pc_irq12m_w(int state) { m_pic_slave->ir4_w(state); } +void sis950_lpc_device::pc_irq14_w(int state) { m_pic_slave->ir6_w(state); } +void sis950_lpc_device::pc_irq15_w(int state) { m_pic_slave->ir7_w(state); } + /* * Start of legacy handling, to be moved out */ diff --git a/src/devices/machine/sis950_lpc.h b/src/devices/machine/sis950_lpc.h index 6aa69323268..65d23efa02b 100644 --- a/src/devices/machine/sis950_lpc.h +++ b/src/devices/machine/sis950_lpc.h @@ -10,7 +10,6 @@ #include "bus/ata/ataintf.h" #include "bus/isa/isa.h" -#include "bus/rs232/rs232.h" #include "lpc-acpi.h" #include "sis950_smbus.h" @@ -19,7 +18,6 @@ #include "machine/8042kbdc.h" #include "machine/am9517a.h" #include "machine/ds128x.h" -#include "machine/ins8250.h" #include "machine/intelfsh.h" #include "machine/pc_lpt.h" #include "machine/pic8259.h" @@ -51,6 +49,20 @@ public: auto fast_reset_cb() { return m_fast_reset_cb.bind(); } + void pc_irq1_w(int state); + void pc_irq3_w(int state); + void pc_irq4_w(int state); + void pc_irq5_w(int state); + void pc_irq6_w(int state); + void pc_irq7_w(int state); + void pc_irq8n_w(int state); + void pc_irq9_w(int state); + void pc_irq10_w(int state); + void pc_irq11_w(int state); + void pc_irq12m_w(int state); + void pc_irq14_w(int state); + void pc_irq15_w(int state); + protected: virtual void device_reset() override; virtual void device_add_mconfig(machine_config &config) override; @@ -80,7 +92,6 @@ private: required_device m_isabus; required_device m_speaker; required_device m_rtc; - required_device m_uart; required_device m_acpi; required_device m_smbus; diff --git a/src/mame/pc/sis630.cpp b/src/mame/pc/sis630.cpp index 61c099eef8b..3bc3e8e1434 100644 --- a/src/mame/pc/sis630.cpp +++ b/src/mame/pc/sis630.cpp @@ -153,6 +153,11 @@ #include "cpu/i386/i386.h" #include "bus/isa/isa_cards.h" #include "bus/pc_kbd/keyboards.h" +#include "bus/rs232/hlemouse.h" +#include "bus/rs232/null_modem.h" +#include "bus/rs232/rs232.h" +#include "bus/rs232/sun_kbd.h" +#include "bus/rs232/terminal.h" #include "machine/intelfsh.h" #include "machine/it8705f.h" #include "machine/pci.h" @@ -201,6 +206,18 @@ private: static INPUT_PORTS_START(sis630) INPUT_PORTS_END +static void isa_com(device_slot_interface &device) +{ + device.option_add("microsoft_mouse", MSFT_HLE_SERIAL_MOUSE); + device.option_add("logitech_mouse", LOGITECH_HLE_SERIAL_MOUSE); + device.option_add("wheel_mouse", WHEEL_HLE_SERIAL_MOUSE); + device.option_add("msystems_mouse", MSYSTEMS_HLE_SERIAL_MOUSE); + device.option_add("rotatable_mouse", ROTATABLE_HLE_SERIAL_MOUSE); + device.option_add("terminal", SERIAL_TERMINAL); + device.option_add("null_modem", NULL_MODEM); + device.option_add("sun_kbd", SUN_KBD_ADAPTOR); +} + static void isa_internal_devices(device_slot_interface &device) { device.option_add("it8705f", IT8705F); @@ -208,16 +225,16 @@ static void isa_internal_devices(device_slot_interface &device) void sis630_state::ite_superio_config(device_t *device) { -// it8705f_device &fdc = *downcast(device); + it8705f_device &fdc = *downcast(device); // fdc.set_sysopt_pin(1); -// fdc.irq1().set(":pci:01.0", FUNC(sis950_lpc_device::pc_irq1_w)); -// fdc.irq8().set(":pci:01.0", FUNC(sis950_lpc_device::pc_irq8n_w)); -// fdc.txd1().set(":serport0", FUNC(rs232_port_device::write_txd)); -// fdc.ndtr1().set(":serport0", FUNC(rs232_port_device::write_dtr)); -// fdc.nrts1().set(":serport0", FUNC(rs232_port_device::write_rts)); -// fdc.txd2().set(":serport1", FUNC(rs232_port_device::write_txd)); -// fdc.ndtr2().set(":serport1", FUNC(rs232_port_device::write_dtr)); -// fdc.nrts2().set(":serport1", FUNC(rs232_port_device::write_rts)); + fdc.irq1().set(":pci:01.0", FUNC(sis950_lpc_device::pc_irq1_w)); + fdc.irq8().set(":pci:01.0", FUNC(sis950_lpc_device::pc_irq8n_w)); + fdc.txd1().set(":serport0", FUNC(rs232_port_device::write_txd)); + fdc.ndtr1().set(":serport0", FUNC(rs232_port_device::write_dtr)); + fdc.nrts1().set(":serport0", FUNC(rs232_port_device::write_rts)); + fdc.txd2().set(":serport1", FUNC(rs232_port_device::write_txd)); + fdc.ndtr2().set(":serport1", FUNC(rs232_port_device::write_dtr)); + fdc.nrts2().set(":serport1", FUNC(rs232_port_device::write_rts)); } void sis630_state::sis630(machine_config &config) @@ -282,6 +299,20 @@ void sis630_state::sis630(machine_config &config) // (some unsupported variants uses W83697HF, namely Gigabyte GA-6SMZ7) ISA16_SLOT(config, "superio", 0, "pci:01.0:isabus", isa_internal_devices, "it8705f", true).set_option_machine_config("it8705f", ite_superio_config); + rs232_port_device& serport0(RS232_PORT(config, "serport0", isa_com, nullptr)); + serport0.rxd_handler().set("superio:it8705f", FUNC(it8705f_device::rxd1_w)); + serport0.dcd_handler().set("superio:it8705f", FUNC(it8705f_device::ndcd1_w)); + serport0.dsr_handler().set("superio:it8705f", FUNC(it8705f_device::ndsr1_w)); + serport0.ri_handler().set("superio:it8705f", FUNC(it8705f_device::nri1_w)); + serport0.cts_handler().set("superio:it8705f", FUNC(it8705f_device::ncts1_w)); + + rs232_port_device &serport1(RS232_PORT(config, "serport1", isa_com, nullptr)); + serport1.rxd_handler().set("superio:it8705f", FUNC(it8705f_device::rxd2_w)); + serport1.dcd_handler().set("superio:it8705f", FUNC(it8705f_device::ndcd2_w)); + serport1.dsr_handler().set("superio:it8705f", FUNC(it8705f_device::ndsr2_w)); + serport1.ri_handler().set("superio:it8705f", FUNC(it8705f_device::nri2_w)); + serport1.cts_handler().set("superio:it8705f", FUNC(it8705f_device::ncts2_w)); + // TODO: AMR (Audio/modem riser) + UPT (Panel Link-TV out), assume [E]ISA complaint, needs specific slot options // ISA16_SLOT(config, "isa1", 0, "pci:01.0:isabus", pc_isa16_cards, nullptr, false); // ISA16_SLOT(config, "isa2", 0, "pci:01.0:isabus", pc_isa16_cards, nullptr, false);