summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2019-04-14 21:19:50 -0400
committer AJR <ajrhacker@users.noreply.github.com>2019-04-14 21:19:50 -0400
commit295d25cff0e39deb821d383b708ebd64a2a0fc58 (patch)
tree0e3254b334a2893844b55d6f384f6a2578536809
parent55558bb1d3378be89c523fc493d3c69496096a3c (diff)
Add skeleton device for UltraStor Ultra-24F EISA SCSI controller [Metropoli BBS Archive]
-rw-r--r--scripts/src/bus.lua2
-rw-r--r--src/devices/bus/isa/isa_cards.cpp2
-rw-r--r--src/devices/bus/isa/ultra24f.cpp97
-rw-r--r--src/devices/bus/isa/ultra24f.h40
4 files changed, 141 insertions, 0 deletions
diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua
index b2717ba20c9..cffef2183ac 100644
--- a/scripts/src/bus.lua
+++ b/scripts/src/bus.lua
@@ -1324,6 +1324,8 @@ if (BUSES["ISA"]~=null) then
MAME_DIR .. "src/devices/bus/isa/ultra12f.h",
MAME_DIR .. "src/devices/bus/isa/ultra14f.cpp",
MAME_DIR .. "src/devices/bus/isa/ultra14f.h",
+ MAME_DIR .. "src/devices/bus/isa/ultra24f.cpp",
+ MAME_DIR .. "src/devices/bus/isa/ultra24f.h",
}
end
diff --git a/src/devices/bus/isa/isa_cards.cpp b/src/devices/bus/isa/isa_cards.cpp
index cd49ea82c19..73e19da2397 100644
--- a/src/devices/bus/isa/isa_cards.cpp
+++ b/src/devices/bus/isa/isa_cards.cpp
@@ -43,6 +43,7 @@
#include "dcb.h"
#include "ultra12f.h"
#include "ultra14f.h"
+#include "ultra24f.h"
// sound
#include "adlib.h"
@@ -191,4 +192,5 @@ void pc_isa16_cards(device_slot_interface &device)
device.option_add("dcb", NOVELL_DCB);
device.option_add("ultra12f", ULTRA12F);
device.option_add("ultra14f", ULTRA14F);
+ device.option_add("ultra24f", ULTRA24F); // actually an EISA card
}
diff --git a/src/devices/bus/isa/ultra24f.cpp b/src/devices/bus/isa/ultra24f.cpp
new file mode 100644
index 00000000000..199545404ca
--- /dev/null
+++ b/src/devices/bus/isa/ultra24f.cpp
@@ -0,0 +1,97 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ UltraStor Ultra-24F EISA SCSI Host Adapter
+
+***************************************************************************/
+
+#include "emu.h"
+#include "ultra24f.h"
+
+#include "cpu/m68000/m68000.h"
+//#include "machine/i82355.h"
+#include "machine/ncr5390.h"
+#include "machine/nscsi_bus.h"
+#include "machine/nscsi_hd.h"
+
+DEFINE_DEVICE_TYPE(ULTRA24F, ultra24f_device, "ultra24f", "Ultra-24F SCSI Host Adapter")
+
+ultra24f_device::ultra24f_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, ULTRA24F, tag, owner, clock)
+ , device_isa16_card_interface(mconfig, *this)
+ , m_uscpu(*this, "uscpu")
+ , m_fdc(*this, "fdc")
+ , m_bios16(*this, "bios16")
+{
+}
+
+void ultra24f_device::device_start()
+{
+ // Firmware EPROMs have a couple of lines scrambled
+ u16 *firmware = &memregion("firmware")->as_u16();
+ for (offs_t b = 0; b < 0x8000; b += 0x100)
+ {
+ std::swap_ranges(&firmware[b | 0x10], &firmware[b | 0x20], &firmware[b | 0x80]);
+ std::swap_ranges(&firmware[b | 0x30], &firmware[b | 0x40], &firmware[b | 0xa0]);
+ std::swap_ranges(&firmware[b | 0x50], &firmware[b | 0x60], &firmware[b | 0xc0]);
+ std::swap_ranges(&firmware[b | 0x70], &firmware[b | 0x80], &firmware[b | 0xe0]);
+ }
+}
+
+void ultra24f_device::uscpu_map(address_map &map)
+{
+ map(0x000000, 0x00ffff).rom().region("firmware", 0);
+ map(0xa00000, 0xa00001).nopr();
+ //map(0xff8001, 0xff8001).select(0x18).rw(FUNC(ultra24f_device::bmic_r), FUNC(ultra24f_device::bmic_w));
+ map(0xff9000, 0xff901f).m("scsi:7:scsic", FUNC(ncr53cf94_device::map)).umask16(0x00ff);
+ map(0xffc000, 0xffffff).ram();
+}
+
+static void u24f_scsi_devices(device_slot_interface &device)
+{
+ device.option_add("harddisk", NSCSI_HARDDISK);
+ device.option_add_internal("scsic", NCR53CF94); // Emulex FAS216
+}
+
+void ultra24f_device::scsic_config(device_t *device)
+{
+ device->set_clock(40_MHz_XTAL);
+ //downcast<ncr53cf94_device &>(*device).irq_handler_cb().set_inputline(m_uscpu, M68K_IRQ_1);
+}
+
+void ultra24f_device::device_add_mconfig(machine_config &config)
+{
+ M68000(config, m_uscpu, 32_MHz_XTAL / 4); // custom-marked as USC080-5-12A; clock guessed
+ m_uscpu->set_addrmap(AS_PROGRAM, &ultra24f_device::uscpu_map);
+
+ NSCSI_BUS(config, "scsi");
+ NSCSI_CONNECTOR(config, "scsi:0", u24f_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:1", u24f_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:2", u24f_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:3", u24f_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:4", u24f_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:5", u24f_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:6", u24f_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:7", u24f_scsi_devices, "scsic", true)
+ .set_option_machine_config("scsic", [this] (device_t *device) { scsic_config(device); });
+
+ DP8473(config, m_fdc, 24_MHz_XTAL); // custom-marked as USC020-1-24
+}
+
+ROM_START(ultra24f)
+ ROM_REGION16_BE(0x10000, "firmware", 0)
+ ROM_LOAD16_BYTE("28111008.bin", 0x00000, 0x08000, CRC(fcced531) SHA1(2ebcf57c4aea56eb2646e826d9cb3370ebef042e))
+ ROM_LOAD16_BYTE("28110008.bin", 0x00001, 0x08000, CRC(3f26d927) SHA1(4ab98840e3af72bf08adfcf478e708fad309f4b7))
+ //ROM_LOAD16_BYTE("28110.008", 0x00001, 0x08000, CRC(1d24cf9e) SHA1(6120af5308ed1cb0e5c3d14a4b436edb6559f8a5)) // identical except for last byte being 0xff instead of 0x49
+
+ ROM_REGION16_LE(0x8000, "bios16", 0) // "Date : 06/24/92 Version 2.00"
+ ROM_LOAD16_BYTE("38110005.bin", 0x0000, 0x4000, CRC(498f2aa5) SHA1(8405a91bb445cb99059c65a2e711d425fc69f5d6))
+ ROM_LOAD16_BYTE("38111005.bin", 0x0001, 0x4000, CRC(826d5ad1) SHA1(052602e4788b7364670f7c0b5fe0bb0eacc4d9ac))
+ // UltraStor also offered double-size binaries for programming onto 27C256 ROMs, with identical data in both halves of each file
+ROM_END
+
+const tiny_rom_entry *ultra24f_device::device_rom_region() const
+{
+ return ROM_NAME(ultra24f);
+}
diff --git a/src/devices/bus/isa/ultra24f.h b/src/devices/bus/isa/ultra24f.h
new file mode 100644
index 00000000000..49e7e39f66f
--- /dev/null
+++ b/src/devices/bus/isa/ultra24f.h
@@ -0,0 +1,40 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ UltraStor Ultra-24F EISA SCSI Host Adapter
+
+***************************************************************************/
+
+#ifndef MAME_BUS_ISA_ULTRA24F_H
+#define MAME_BUS_ISA_ULTRA24F_H
+
+#pragma once
+
+#include "isa.h"
+#include "machine/upd765.h"
+
+class ultra24f_device : public device_t, public device_isa16_card_interface
+{
+public:
+ ultra24f_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ static constexpr feature_type unemulated_features() { return feature::DISK; }
+
+protected:
+ virtual void device_start() override;
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+private:
+ void uscpu_map(address_map &map);
+ void scsic_config(device_t *device);
+
+ required_device<cpu_device> m_uscpu;
+ required_device<upd765_family_device> m_fdc;
+ required_region_ptr<u16> m_bios16;
+};
+
+DECLARE_DEVICE_TYPE(ULTRA24F, ultra24f_device)
+
+#endif // MAME_BUS_ISA_ULTRA24F_H