summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/isa/lrk330.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/isa/lrk330.cpp')
-rw-r--r--src/devices/bus/isa/lrk330.cpp130
1 files changed, 130 insertions, 0 deletions
diff --git a/src/devices/bus/isa/lrk330.cpp b/src/devices/bus/isa/lrk330.cpp
new file mode 100644
index 00000000000..18cd1bfe29e
--- /dev/null
+++ b/src/devices/bus/isa/lrk330.cpp
@@ -0,0 +1,130 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ Skeleton driver for ESDI controllers by Lark Associates Inc.
+
+ Major ICs excluding EPROMs, in order of decreasing pin count:
+ * Silicon Logic LD1111 HDC (QFP128, U1)
+ * Xilinx XC2018-70PC68C Logic Cell Array (PLCC84, U11)
+ * National DP8473V Floppy Disk Controller PLUS-2 (PLCC52, U4)
+ * Signetics SCN8032HCCA44 8-Bit Microcontroller (PLCC44, U20)
+ * Sharp LH52258D-45 32Kx8 CMOS Static RAM (SDIP28, U2 & U3)
+ * Vitelic V61C16F70L 2Kx8 CMOS Static RAM (SSOP24, U19)
+
+ The purpose of the small SRAM is not clear. Perhaps it can be banked
+ into the lower part of the 8032 program space after loading patches
+ for the EPROM microcode, since that uses the upper mirror addresses
+ almost exclusively.
+
+ A transfer rate of up to 24 megabits per second was advertised.
+
+ LRK-330 is presumably identical to LRK-331, only without the FDC or
+ 34-pin floppy drive cable connector installed.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "lrk330.h"
+
+#include "imagedev/floppy.h"
+#include "machine/upd765.h"
+
+// device type definition
+DEFINE_DEVICE_TYPE(LRK331, lrk331_device, "lrk331", "Lark Associates LRK-331 ESDI Controller")
+
+
+lrk331_device::lrk331_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, LRK331, tag, owner, clock)
+ , device_isa16_card_interface(mconfig, *this)
+ , m_mcu(*this, "mcu")
+ , m_bios(*this, "bios")
+ , m_config(*this, "CONFIG")
+{
+}
+
+void lrk331_device::device_start()
+{
+}
+
+void lrk331_device::device_reset()
+{
+}
+
+void lrk331_device::ucode_map(address_map &map)
+{
+ map(0x0000, 0x3fff).mirror(0x4000).rom().region("ucode", 0);
+}
+
+void lrk331_device::ext_map(address_map &map)
+{
+ map.global_mask(0xff);
+ map(0x0b, 0x0b).nopw();
+}
+
+static INPUT_PORTS_START(lrk331)
+ PORT_START("CONFIG")
+ PORT_DIPNAME(0x001, 0x001, "Drive Addresses") PORT_DIPLOCATION("W1:1")
+ PORT_DIPSETTING(0x001, "Primary (1F0h-1F7h, 3F0h-3F7h)")
+ PORT_DIPSETTING(0x000, "Secondary (170h-177h, 370h-377h)")
+ PORT_DIPNAME(0x002, 0x002, "Floppy Drive Speed") PORT_DIPLOCATION("W2:2")
+ PORT_DIPSETTING(0x002, "Single")
+ PORT_DIPSETTING(0x000, "Dual")
+ PORT_DIPNAME(0x004, 0x004, "Interrupt Delay") PORT_DIPLOCATION("W3:1")
+ PORT_DIPSETTING(0x004, "Disabled")
+ PORT_DIPSETTING(0x000, "Enabled")
+ PORT_DIPNAME(0x008, 0x008, "Factory Configured - Do Not Alter") PORT_DIPLOCATION("W4:1")
+ PORT_DIPSETTING(0x008, DEF_STR(Off))
+ PORT_DIPSETTING(0x000, DEF_STR(On))
+ PORT_DIPNAME(0x0f0, 0x0e0, "BIOS Address") PORT_DIPLOCATION("W5-W8:1,2,3,4")
+ PORT_DIPSETTING(0x0f0, "Disabled")
+ PORT_DIPSETTING(0x0e0, "C800h")
+ PORT_DIPSETTING(0x0d0, "CC00h")
+ PORT_DIPSETTING(0x0b0, "D000h")
+ PORT_DIPSETTING(0x070, "D400h")
+ PORT_DIPNAME(0x300, 0x200, "IRQ Select") PORT_DIPLOCATION("W9-W10:1,2")
+ PORT_DIPSETTING(0x200, "IRQ 14")
+ PORT_DIPSETTING(0x100, "IRQ 15")
+ PORT_DIPNAME(0x400, 0x000, "Floppy Drive Interface") PORT_DIPLOCATION("W11:1")
+ PORT_DIPSETTING(0x400, "Disabled")
+ PORT_DIPSETTING(0x000, "Enabled")
+INPUT_PORTS_END
+
+ioport_constructor lrk331_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(lrk331);
+}
+
+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 lrk331_device::device_add_mconfig(machine_config &config)
+{
+ I8032(config, m_mcu, 24_MHz_XTAL / 2);
+ m_mcu->set_addrmap(AS_PROGRAM, &lrk331_device::ucode_map);
+ m_mcu->set_addrmap(AS_IO, &lrk331_device::ext_map);
+
+ //LD1111(config, m_hdc, 24_MHz_XTAL);
+
+ DP8473(config, "fdc", 24_MHz_XTAL);
+ FLOPPY_CONNECTOR(config, "fdc:0", pc_hd_floppies, "525hd", floppy_image_device::default_pc_floppy_formats);
+ FLOPPY_CONNECTOR(config, "fdc:1", pc_hd_floppies, nullptr, floppy_image_device::default_pc_floppy_formats);
+}
+
+ROM_START(lrk331)
+ ROM_REGION(0x2000, "bios", 0)
+ ROM_LOAD("63308-10.bin", 0x0000, 0x2000, CRC(f16d4f25) SHA1(437664ff9723c8036a40f1e504899b7cacd21ad0))
+
+ ROM_REGION(0x4000, "ucode", 0)
+ ROM_LOAD("63307-08.bin", 0x0000, 0x4000, CRC(6d2e8b26) SHA1(1a33462a29b306b01960cf2ac0b209b2adf58dbe))
+ROM_END
+
+const tiny_rom_entry *lrk331_device::device_rom_region() const
+{
+ return ROM_NAME(lrk331);
+}