summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/nforcepc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/nforcepc.cpp')
-rw-r--r--src/mame/drivers/nforcepc.cpp114
1 files changed, 101 insertions, 13 deletions
diff --git a/src/mame/drivers/nforcepc.cpp b/src/mame/drivers/nforcepc.cpp
index 59d5ca5d712..2d4c21dcede 100644
--- a/src/mame/drivers/nforcepc.cpp
+++ b/src/mame/drivers/nforcepc.cpp
@@ -377,6 +377,7 @@ it8703f_device::it8703f_device(const machine_config &mconfig, const char *tag, d
, m_txd2_callback(*this)
, m_ndtr2_callback(*this)
, m_nrts2_callback(*this)
+ , floppy_controller_fdcdev(*this, "fdc")
, pc_lpt_lptdev(*this, "lpt")
, pc_serial1_comdev(*this, "uart_0")
, pc_serial2_comdev(*this, "uart_1")
@@ -389,6 +390,12 @@ it8703f_device::it8703f_device(const machine_config &mconfig, const char *tag, d
global_configuration_registers[0x21] = 1;
global_configuration_registers[0x24] = 4;
memset(configuration_registers, 0, sizeof(configuration_registers));
+ configuration_registers[LogicalDevice::FDC][0x60] = 3;
+ configuration_registers[LogicalDevice::FDC][0x61] = 0xf0;
+ configuration_registers[LogicalDevice::FDC][0x70] = 6;
+ configuration_registers[LogicalDevice::FDC][0x74] = 2;
+ configuration_registers[LogicalDevice::FDC][0xf0] = 0xe;
+ configuration_registers[LogicalDevice::FDC][0xf2] = 0xff;
configuration_registers[LogicalDevice::Parallel][0x74] = 4;
configuration_registers[LogicalDevice::Parallel][0xf0] = 0x3f;
for (int n = 0; n < 13; n++)
@@ -425,6 +432,11 @@ uint16_t it8703f_device::get_base_address(int logical, int index)
void it8703f_device::device_add_mconfig(machine_config &config)
{
+ // floppy disc controller
+ smc37c78_device& fdcdev(SMC37C78(config, floppy_controller_fdcdev, 24'000'000));
+ fdcdev.intrq_wr_callback().set(FUNC(it8703f_device::irq_floppy_w));
+ fdcdev.drq_wr_callback().set(FUNC(it8703f_device::drq_floppy_w));
+
// parallel port
PC_LPT(config, pc_lpt_lptdev);
pc_lpt_lptdev->irq_handler().set(FUNC(it8703f_device::irq_parallel_w));
@@ -531,6 +543,9 @@ void it8703f_device::write_logical_configuration_register(int index, int data)
configuration_registers[logical_device][index] = data;
switch (logical_device)
{
+ case LogicalDevice::FDC:
+ write_fdd_configuration_register(index, data);
+ break;
case LogicalDevice::Serial1:
write_serial1_configuration_register(index, data);
break;
@@ -555,6 +570,33 @@ void it8703f_device::write_logical_configuration_register(int index, int data)
}
}
+void it8703f_device::write_fdd_configuration_register(int index, int data)
+{
+ if (index == 0x30)
+ {
+ if (data & 1)
+ {
+ if (enabled_logical[LogicalDevice::FDC] == false)
+ {
+ enabled_logical[LogicalDevice::FDC] = true;
+ lpchost->remap();
+ }
+ logerror("Enabled FDD at %04X\n", get_base_address(LogicalDevice::FDC, 0));
+ }
+ else
+ {
+ if (enabled_logical[LogicalDevice::FDC] == true)
+ {
+ enabled_logical[LogicalDevice::FDC] = false;
+ lpchost->remap();
+ }
+ logerror("Disabled FDD at %04X\n", get_base_address(LogicalDevice::FDC, 0));
+ }
+ }
+ if (index == 0x74)
+ logerror("Set FDD dma channel %d\n", configuration_registers[LogicalDevice::FDC][0x74]);
+}
+
void it8703f_device::write_parallel_configuration_register(int index, int data)
{
if (index == 0x30)
@@ -577,6 +619,8 @@ void it8703f_device::write_parallel_configuration_register(int index, int data)
}
}
}
+ if (index == 0x74)
+ logerror("Set LPT dma channel %d\n", configuration_registers[LogicalDevice::Parallel][0x74]);
}
void it8703f_device::write_serial1_configuration_register(int index, int data)
@@ -672,6 +716,9 @@ uint16_t it8703f_device::read_logical_configuration_register(int index)
switch (logical_device)
{
+ case LogicalDevice::FDC:
+ ret = read_fdd_configuration_register(index);
+ break;
case LogicalDevice::Parallel:
ret = read_parallel_configuration_register(index);
break;
@@ -691,6 +738,20 @@ uint16_t it8703f_device::read_logical_configuration_register(int index)
return ret;
}
+WRITE_LINE_MEMBER(it8703f_device::irq_floppy_w)
+{
+ if (enabled_logical[LogicalDevice::FDC] == false)
+ return;
+ lpchost->set_virtual_line(configuration_registers[LogicalDevice::FDC][0x70], state ? ASSERT_LINE : CLEAR_LINE);
+}
+
+WRITE_LINE_MEMBER(it8703f_device::drq_floppy_w)
+{
+ if (enabled_logical[LogicalDevice::FDC] == false)
+ return;
+ lpchost->set_virtual_line(configuration_registers[LogicalDevice::FDC][0x74] + 16, state ? ASSERT_LINE : CLEAR_LINE);
+}
+
WRITE_LINE_MEMBER(it8703f_device::irq_parallel_w)
{
if (enabled_logical[LogicalDevice::Parallel] == false)
@@ -698,6 +759,13 @@ WRITE_LINE_MEMBER(it8703f_device::irq_parallel_w)
lpchost->set_virtual_line(configuration_registers[LogicalDevice::Parallel][0x70], state ? ASSERT_LINE : CLEAR_LINE);
}
+WRITE_LINE_MEMBER(it8703f_device::drq_parallel_w)
+{
+ if (enabled_logical[LogicalDevice::Parallel] == false)
+ return;
+ lpchost->set_virtual_line(configuration_registers[LogicalDevice::Parallel][0x74] + 16, state ? ASSERT_LINE : CLEAR_LINE);
+}
+
WRITE_LINE_MEMBER(it8703f_device::irq_serial1_w)
{
if (enabled_logical[LogicalDevice::Serial1] == false)
@@ -825,6 +893,13 @@ WRITE_LINE_MEMBER(it8703f_device::kbdp20_gp20_reset_w)
pin_reset_callback(state);
}
+void it8703f_device::map_fdc_addresses()
+{
+ uint16_t base = get_base_address(LogicalDevice::FDC, 0);
+
+ iospace->install_device(base, base + 7, *floppy_controller_fdcdev, &pc_fdc_interface::map);
+}
+
void it8703f_device::map_lpt(address_map& map)
{
map(0x0, 0x3).rw(FUNC(it8703f_device::lpt_read), FUNC(it8703f_device::lpt_write));
@@ -897,12 +972,6 @@ void it8703f_device::map_keyboard(address_map &map)
map(0x4, 0x4).rw(FUNC(it8703f_device::keybc_status_r), FUNC(it8703f_device::keybc_command_w));
}
-void it8703f_device::unmap_keyboard(address_map &map)
-{
- map(0x0, 0x0).noprw();
- map(0x4, 0x4).noprw();
-}
-
READ8_MEMBER(it8703f_device::at_keybc_r)
{
switch (offset) //m_kbdc
@@ -945,6 +1014,8 @@ void it8703f_device::map_extra(address_space *memory_space, address_space *io_sp
memspace = memory_space;
iospace = io_space;
io_space->install_device(0, 0xffff, *this, &it8703f_device::internal_io_map);
+ if (enabled_logical[LogicalDevice::FDC] == true)
+ map_fdc_addresses();
if (enabled_logical[LogicalDevice::Parallel] == true)
map_lpt_addresses();
if (enabled_logical[LogicalDevice::Serial1] == true)
@@ -1061,6 +1132,19 @@ static void isa_com(device_slot_interface& device)
device.option_add("sun_kbd", SUN_KBD_ADAPTOR);
}
+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);
+}
+
+DECLARE_FLOPPY_FORMATS(floppy_formats) = {
+ FLOPPY_PC_FORMAT,
+ FLOPPY_NASLITE_FORMAT
+FLOPPY_FORMATS_END
+
/*
Machine configuration
*/
@@ -1085,12 +1169,12 @@ void nforcepc_state::nforcepc(machine_config &config)
it8703f_device &ite(IT8703F(config, ":pci:01.0:0", 0));
ite.pin_reset().set_inputline(":maincpu", INPUT_LINE_RESET);
ite.pin_gatea20().set_inputline(":maincpu", INPUT_LINE_A20);
- ite.txd1().set(":serport0", FUNC(rs232_port_device::write_txd));
- ite.ndtr1().set(":serport0", FUNC(rs232_port_device::write_dtr));
- ite.nrts1().set(":serport0", FUNC(rs232_port_device::write_rts));
- ite.txd2().set(":serport1", FUNC(rs232_port_device::write_txd));
- ite.ndtr2().set(":serport1", FUNC(rs232_port_device::write_dtr));
- ite.nrts2().set(":serport1", FUNC(rs232_port_device::write_rts));
+ ite.txd1().set("serport0", FUNC(rs232_port_device::write_txd));
+ ite.ndtr1().set("serport0", FUNC(rs232_port_device::write_dtr));
+ ite.nrts1().set("serport0", FUNC(rs232_port_device::write_rts));
+ ite.txd2().set("serport1", FUNC(rs232_port_device::write_txd));
+ ite.ndtr2().set("serport1", FUNC(rs232_port_device::write_dtr));
+ ite.nrts2().set("serport1", FUNC(rs232_port_device::write_rts));
MCPX_SMBUS(config, ":pci:01.1", 0); // 10de:01b4 NVIDIA Corporation nForce PCI System Management (SMBus)
SMBUS_ROM(config, ":pci:01.1:050", 0, test_spd_data, sizeof(test_spd_data)); // these 3 are on smbus number 0
SMBUS_LOGGER(config, ":pci:01.1:051", 0);
@@ -1110,11 +1194,15 @@ void nforcepc_state::nforcepc(machine_config &config)
mcpx_ide_device &ide(MCPX_IDE(config, ":pci:09.0", 0)); // 10de:01bc NVIDIA Corporation nForce IDE
ide.pri_interrupt_handler().set(":pci:01.0", FUNC(mcpx_isalpc_device::irq14));
ide.sec_interrupt_handler().set(":pci:01.0", FUNC(mcpx_isalpc_device::irq15));
- /*subdevice<ide_controller_32_device>(":pci:09.0:ide")->options(ata_devices, "hdd", "cdrom", true);*/
+ ide.subdevice<ide_controller_32_device>("ide1")->options(ata_devices, "hdd", nullptr, true);
+ ide.subdevice<ide_controller_32_device>("ide2")->options(ata_devices, "cdrom", nullptr, true);
NV2A_AGP(config, ":pci:1e.0", 0, 0x10de01b7, 0); // 10de:01b7 NVIDIA Corporation nForce AGP to PCI Bridge
VIRGEDX_PCI(config, ":pci:0a.0", 0);
SST_49LF020(config, "bios", 0);
+ FLOPPY_CONNECTOR(config, ":pci:01.0:0:fdc:0", pc_hd_floppies, "35hd", floppy_formats);
+ FLOPPY_CONNECTOR(config, ":pci:01.0:0:fdc:1", pc_hd_floppies, "35hd", floppy_formats);
+
rs232_port_device& serport0(RS232_PORT(config, "serport0", isa_com, nullptr));
serport0.rxd_handler().set(":pci:01.0:0", FUNC(it8703f_device::rxd1_w));
serport0.dcd_handler().set(":pci:01.0:0", FUNC(it8703f_device::ndcd1_w));