From b7a10782d7adb8c76b4b589c252b66135166652c Mon Sep 17 00:00:00 2001 From: angelosa Date: Sun, 10 Mar 2024 23:29:52 +0100 Subject: machine/it8705f: add non-working FDC --- src/devices/machine/it8705f.cpp | 138 +++++++++++++++++++++++++++++++++---- src/devices/machine/it8705f.h | 16 ++++- src/devices/machine/sis950_lpc.cpp | 22 +++--- 3 files changed, 151 insertions(+), 25 deletions(-) diff --git a/src/devices/machine/it8705f.cpp b/src/devices/machine/it8705f.cpp index 09977ef5cce..4538d60b799 100644 --- a/src/devices/machine/it8705f.cpp +++ b/src/devices/machine/it8705f.cpp @@ -6,14 +6,14 @@ Winbond IT8705F LPC Super I/O TODO: - Move stuff from sis950_lpc; +- shutms11 fails detecting FDC; **************************************************************************************************/ #include "emu.h" #include "machine/it8705f.h" -//#include "machine/ds128x.h" -#include "machine/pckeybrd.h" +#include "formats/naslite_dsk.h" #include @@ -29,6 +29,7 @@ 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_pc_fdc(*this, "fdc") , m_pc_com(*this, "uart%d", 0U) , m_pc_lpt(*this, "lpta") , m_logical_view(*this, "logical_view") @@ -55,10 +56,10 @@ it8705f_device::~it8705f_device() void it8705f_device::device_start() { set_isa_device(); - //m_isa->set_dma_channel(0, this, true); - //m_isa->set_dma_channel(1, this, true); - //m_isa->set_dma_channel(2, this, true); - //m_isa->set_dma_channel(3, this, true); + m_isa->set_dma_channel(0, this, true); + m_isa->set_dma_channel(1, this, true); + m_isa->set_dma_channel(2, this, true); + m_isa->set_dma_channel(3, this, true); remap(AS_IO, 0, 0x400); } @@ -68,10 +69,17 @@ void it8705f_device::device_reset() m_index = 0; m_lock_sequence_index = 0; + m_pc_fdc_irq_line = 6; + m_pc_fdc_drq_line = 2; +// m_pc_fdc_mode = ; + m_pc_fdc_address = 0x3f0; + m_pc_lpt_address = 0x0378; m_pc_lpt_irq_line = 7; m_pc_lpt_drq_line = 4; // disabled // m_pc_lpt_mode = 0x3f; + + m_pc_fdc->set_rate(500000); } device_memory_interface::space_config_vector it8705f_device::memory_space_config() const @@ -81,10 +89,28 @@ device_memory_interface::space_config_vector it8705f_device::memory_space_config }; } +static void pc_hd_floppies(device_slot_interface &device) +{ + device.option_add("525hd", FLOPPY_525_HD); + device.option_add("35hd", FLOPPY_35_HD); + device.option_add("525dd", FLOPPY_525_DD); + device.option_add("35dd", FLOPPY_35_DD); +} + +void it8705f_device::floppy_formats(format_registration &fr) +{ + fr.add_pc_formats(); + fr.add(FLOPPY_NASLITE_FORMAT); +} + void it8705f_device::device_add_mconfig(machine_config &config) { - PC_LPT(config, m_pc_lpt); - m_pc_lpt->irq_handler().set(FUNC(it8705f_device::irq_parallel_w)); + // 82077 compatible + N82077AA(config, m_pc_fdc, XTAL(24'000'000), upd765_family_device::mode_t::AT); + m_pc_fdc->intrq_wr_callback().set(FUNC(it8705f_device::irq_floppy_w)); + m_pc_fdc->drq_wr_callback().set(FUNC(it8705f_device::drq_floppy_w)); + FLOPPY_CONNECTOR(config, "fdc:0", pc_hd_floppies, "35hd", it8705f_device::floppy_formats); + FLOPPY_CONNECTOR(config, "fdc:1", pc_hd_floppies, "35hd", it8705f_device::floppy_formats); 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)); @@ -97,6 +123,10 @@ void it8705f_device::device_add_mconfig(machine_config &config) 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)); + + PC_LPT(config, m_pc_lpt); + m_pc_lpt->irq_handler().set(FUNC(it8705f_device::irq_parallel_w)); + } @@ -107,10 +137,9 @@ void it8705f_device::remap(int space_id, offs_t start, offs_t end) // TODO: apparently installs two ports, an alias at 0x4e/0x4f 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_pc_lpt_address & 0xf00) + if (m_activate[0]) { - 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))); + m_isa->install_device(m_pc_fdc_address, m_pc_fdc_address + 7, *m_pc_fdc, &n82077aa_device::map); } for (int i = 0; i < 2; i++) @@ -121,6 +150,12 @@ void it8705f_device::remap(int space_id, offs_t start, offs_t end) 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))); } } + + // can't map below 0x100 + if (m_activate[3] & 1 && m_pc_lpt_address & 0xf00) + { + 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))); + } } } @@ -180,17 +215,52 @@ void it8705f_device::config_map(address_map &map) map(0x30, 0xff).view(m_logical_view); // FDC m_logical_view[0](0x30, 0x30).rw(FUNC(it8705f_device::activate_r<0>), FUNC(it8705f_device::activate_w<0>)); - m_logical_view[0](0x31, 0xff).unmaprw(); + m_logical_view[0](0x60, 0x61).lrw8( + NAME([this] (offs_t offset) { + return (m_pc_fdc_address >> (offset * 8)) & 0xff; + }), + NAME([this] (offs_t offset, u8 data) { + const u8 shift = offset * 8; + m_pc_fdc_address &= 0xff << shift; + m_pc_fdc_address |= data << (shift ^ 8); + m_pc_fdc_address &= ~7; + LOG("LDN0 (FDC): remap %04x ([%d] %02x)\n", m_pc_fdc_address, offset, data); + + remap(AS_IO, 0, 0x400); + }) + ); + m_logical_view[0](0x70, 0x70).lrw8( + NAME([this] () { + return m_pc_fdc_irq_line; + }), + NAME([this] (offs_t offset, u8 data) { + m_pc_fdc_irq_line = data & 0xf; + LOG("LDN0 (FDC): irq routed to %02x\n", m_pc_lpt_irq_line); + }) + ); + m_logical_view[0](0x74, 0x74).lrw8( + NAME([this] () { + return m_pc_lpt_drq_line; + }), + NAME([this] (offs_t offset, u8 data) { + m_pc_fdc_drq_line = data & 0x7; + LOG("LDN0 (FDC): drq %s (%02x)\n", BIT(m_pc_lpt_drq_line, 2) ? "disabled" : "enabled", data); + }) + ); + // TODO: m_logical_view[0](0xf0, 0xf1) FDC config + // UART1 m_logical_view[1](0x30, 0x30).rw(FUNC(it8705f_device::activate_r<1>), FUNC(it8705f_device::activate_w<1>)); 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](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( @@ -219,7 +289,7 @@ void it8705f_device::config_map(address_map &map) }) ); m_logical_view[3](0x74, 0x74).lrw8( - NAME([this] () { + NAME([this] () { return m_pc_lpt_drq_line; }), NAME([this] (offs_t offset, u8 data) { @@ -227,18 +297,23 @@ void it8705f_device::config_map(address_map &map) LOG("LDN3 (LPT): drq %s (%02x)\n", BIT(m_pc_lpt_drq_line, 2) ? "disabled" : "enabled", data); }) ); + // Environment controller / HW monitor m_logical_view[4](0x30, 0x30).rw(FUNC(it8705f_device::activate_r<4>), FUNC(it8705f_device::activate_w<4>)); m_logical_view[4](0x31, 0xff).unmaprw(); + // GPIO m_logical_view[5](0x30, 0x30).rw(FUNC(it8705f_device::activate_r<5>), FUNC(it8705f_device::activate_w<5>)); m_logical_view[5](0x31, 0xff).unmaprw(); + // Game port m_logical_view[6](0x30, 0x30).rw(FUNC(it8705f_device::activate_r<6>), FUNC(it8705f_device::activate_w<6>)); m_logical_view[6](0x31, 0xff).unmaprw(); + // Consumer IR m_logical_view[7](0x30, 0x30).rw(FUNC(it8705f_device::activate_r<7>), FUNC(it8705f_device::activate_w<7>)); m_logical_view[7](0x31, 0xff).unmaprw(); + // MIDI port m_logical_view[8](0x30, 0x30).rw(FUNC(it8705f_device::activate_r<8>), FUNC(it8705f_device::activate_w<8>)); m_logical_view[8](0x31, 0xff).unmaprw(); @@ -315,6 +390,43 @@ void it8705f_device::request_irq(int irq, int state) } } +void it8705f_device::request_dma(int dreq, int state) +{ + switch (dreq) + { + case 0: + m_isa->drq0_w(state); + break; + case 1: + m_isa->drq1_w(state); + break; + case 2: + m_isa->drq2_w(state); + break; + case 3: + m_isa->drq3_w(state); + break; + } +} + +/* + * Device #0 (FDC) + */ + +void it8705f_device::irq_floppy_w(int state) +{ + if (!m_activate[0]) + return; + request_irq(m_pc_fdc_irq_line, state ? ASSERT_LINE : CLEAR_LINE); +} + +void it8705f_device::drq_floppy_w(int state) +{ + if (!m_activate[0]) + return; + request_dma(m_pc_fdc_drq_line, state ? ASSERT_LINE : CLEAR_LINE); +} + /* * Device #1/#2 (UART) */ diff --git a/src/devices/machine/it8705f.h b/src/devices/machine/it8705f.h index 3bedd2e2240..810d75c0258 100644 --- a/src/devices/machine/it8705f.h +++ b/src/devices/machine/it8705f.h @@ -7,10 +7,12 @@ #pragma once #include "bus/isa/isa.h" +#include "imagedev/floppy.h" #include "machine/8042kbdc.h" #include "machine/ds128x.h" #include "machine/ins8250.h" #include "machine/pc_lpt.h" +#include "machine/upd765.h" class it8705f_device : public device_t, public device_isa16_card_interface, @@ -43,6 +45,8 @@ public: void nri2_w(int state); void ncts2_w(int state); + static void floppy_formats(format_registration &fr); + protected: virtual void device_start() override; virtual void device_reset() override; @@ -53,6 +57,7 @@ protected: private: const address_space_config m_space_config; + required_device m_pc_fdc; required_device_array m_pc_com; required_device m_pc_lpt; memory_view m_logical_view; @@ -69,7 +74,7 @@ private: u8 m_index = 0; u8 m_logical_index = 0; - bool m_activate[0xb]{}; + bool m_activate[9]{}; u8 m_lock_sequence_index = 0; @@ -83,6 +88,15 @@ private: template void activate_w(offs_t offset, u8 data); void request_irq(int irq, int state); + void request_dma(int dreq, int state); + + u8 m_pc_fdc_irq_line = 6; + u8 m_pc_fdc_drq_line = 2; +// u8 m_pc_fdc_mode; + u16 m_pc_fdc_address = 0x3f0; + + void irq_floppy_w(int state); + void drq_floppy_w(int state); u8 m_pc_lpt_irq_line = 7; u8 m_pc_lpt_drq_line = 4; diff --git a/src/devices/machine/sis950_lpc.cpp b/src/devices/machine/sis950_lpc.cpp index a7cde1062bf..9ebd0444fa7 100644 --- a/src/devices/machine/sis950_lpc.cpp +++ b/src/devices/machine/sis950_lpc.cpp @@ -184,17 +184,17 @@ void sis950_lpc_device::device_add_mconfig(machine_config &config) SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50); ISA16(config, m_isabus, 0); -// m_isabus->irq3_callback().set(FUNC(sis950_lpc_device::pc_irq3_w)); -// m_isabus->irq4_callback().set(FUNC(sis950_lpc_device::pc_irq4_w)); -// m_isabus->irq6_callback().set(FUNC(sis950_lpc_device::pc_irq6_w)); -// m_isabus->irq5_callback().set(FUNC(sis950_lpc_device::pc_irq5_w)); -// m_isabus->irq7_callback().set(FUNC(sis950_lpc_device::pc_irq7_w)); -// m_isabus->irq2_callback().set(FUNC(sis950_lpc_device::pc_irq9_w)); -// m_isabus->irq10_callback().set(FUNC(sis950_lpc_device::pc_irq10_w)); -// m_isabus->irq11_callback().set(FUNC(sis950_lpc_device::pc_irq11_w)); -// m_isabus->irq12_callback().set(FUNC(sis950_lpc_device::pc_irq12m_w)); -// m_isabus->irq14_callback().set(FUNC(sis950_lpc_device::pc_irq14_w)); -// m_isabus->irq15_callback().set(FUNC(sis950_lpc_device::pc_irq15_w)); + m_isabus->irq3_callback().set(FUNC(sis950_lpc_device::pc_irq3_w)); + m_isabus->irq4_callback().set(FUNC(sis950_lpc_device::pc_irq4_w)); + m_isabus->irq6_callback().set(FUNC(sis950_lpc_device::pc_irq6_w)); + m_isabus->irq5_callback().set(FUNC(sis950_lpc_device::pc_irq5_w)); + m_isabus->irq7_callback().set(FUNC(sis950_lpc_device::pc_irq7_w)); + m_isabus->irq2_callback().set(FUNC(sis950_lpc_device::pc_irq9_w)); + m_isabus->irq10_callback().set(FUNC(sis950_lpc_device::pc_irq10_w)); + m_isabus->irq11_callback().set(FUNC(sis950_lpc_device::pc_irq11_w)); + m_isabus->irq12_callback().set(FUNC(sis950_lpc_device::pc_irq12m_w)); + m_isabus->irq14_callback().set(FUNC(sis950_lpc_device::pc_irq14_w)); + m_isabus->irq15_callback().set(FUNC(sis950_lpc_device::pc_irq15_w)); m_isabus->iochck_callback().set(FUNC(sis950_lpc_device::iochck_w)); } -- cgit v1.2.3