machine/it8705f: add UARTs

This commit is contained in:
angelosa 2024-03-10 22:37:16 +01:00
parent 224ebc70ab
commit 263d930a12
5 changed files with 337 additions and 79 deletions

View File

@ -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 <unsigned N> u8 it8705f_device::uart_address_r(offs_t offset)
{
return (m_pc_com_address[N] >> (offset * 8)) & 0xff;
}
template <unsigned N> 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 <unsigned N> u8 it8705f_device::uart_irq_r(offs_t offset)
{
return m_pc_com_irq_line[N];
}
template <unsigned N> 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 <unsigned N> u8 it8705f_device::uart_config_r(offs_t offset)
{
return m_pc_com_control[N];
}
/*
* ---- -xx- Clock Source
* ---- -00- 24 MHz/13
* ---- -??- <reserved>
* ---- ---x IRQ sharing enable
*/
template <unsigned N> 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);
}

View File

@ -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<pc_lpt_device> m_lpt;
required_device_array<ns16550_device, 2> m_pc_com;
required_device<pc_lpt_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 <unsigned N> u8 activate_r(offs_t offset);
template <unsigned N> 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 <unsigned N> u8 uart_address_r(offs_t offset);
template <unsigned N> void uart_address_w(offs_t offset, u8 data);
template <unsigned N> u8 uart_irq_r(offs_t offset);
template <unsigned N> void uart_irq_w(offs_t offset, u8 data);
template <unsigned N> u8 uart_config_r(offs_t offset);
template <unsigned N> void uart_config_w(offs_t offset, u8 data);
};
DECLARE_DEVICE_TYPE(IT8705F, it8705f_device);

View File

@ -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
*/

View File

@ -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<isa16_device> m_isabus;
required_device<speaker_sound_device> m_speaker;
required_device<ds12885ext_device> m_rtc;
required_device<ins8250_device> m_uart;
required_device<lpc_acpi_device> m_acpi;
required_device<sis950_smbus_device> m_smbus;

View File

@ -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<it8705f_device *>(device);
it8705f_device &fdc = *downcast<it8705f_device *>(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);