summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/jazz.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/jazz.cpp')
-rw-r--r--src/mame/drivers/jazz.cpp206
1 files changed, 206 insertions, 0 deletions
diff --git a/src/mame/drivers/jazz.cpp b/src/mame/drivers/jazz.cpp
new file mode 100644
index 00000000000..14b9d0876dc
--- /dev/null
+++ b/src/mame/drivers/jazz.cpp
@@ -0,0 +1,206 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+/*
+ * An emulation of systems based on the Jazz computer architecture, originally
+ * developed by Microsoft. Specific systems which implemented this architecture
+ * include the MIPS Magnum/Millenium 4000 and Olivetti M700-10.
+ *
+ * References:
+ *
+ * https://www.linux-mips.org/wiki/Jazz
+ * http://gunkies.org/wiki/MIPS_Magnum
+ * http://www.sensi.org/~alec/mips/mips-history.html
+ *
+ * TODO
+ * - everything (skeleton only)
+ *
+ * Unconfirmed parts lists from ARCSystem reference design (which appears to
+ * be very similar or identical to the Jazz system) taken from:
+ * https://www.linux-mips.org/archives/riscy/1993-12/msg00013.html
+ *
+ * Ref Part Function
+ *
+ * System board:
+ *
+ * Dallas DS1287 RTC and NVRAM
+ * Dallas DS1225Y 8k non-volatile SRAM
+ * WD16C552 Dual serial and parallel port controller
+ * Intel N82077A Floppy drive controller
+ * National DP83932BFV Ethernet controller
+ * Intel 82358 EISA Bus Controller
+ * Intel 82357 EISA Integrated System Peripheral (ISP)
+ * Intel 82352 x 2 EISA Bus Buffer (EBB)
+ * Emulex FAS216 SCSI controller
+ * 27C01 128k EPROM
+ * 28F020 256k flash memory
+ * NEC μPD31432 ARC address path ASIC
+ * NEC μPD31431 x 2 ARC data path ASIC
+ * NEC μPD30400 R4000PC/50 CPU
+ *
+ * Audio board:
+ *
+ * Crystal CS4215 Audio codec
+ * Altera FPGA x 4 Audio DMA
+ *
+ * Video board:
+ *
+ * 27C010 128k EPROM
+ * IMS G364-11S Video controller
+ * NEC μPD42274V-80 x 16 256kx4 VRAM (2MiB)
+ */
+
+#include "emu.h"
+
+#include "includes/jazz.h"
+
+#include "debugger.h"
+
+#define VERBOSE 0
+#include "logmacro.h"
+
+void jazz_state::machine_start()
+{
+}
+
+void jazz_state::machine_reset()
+{
+}
+
+void jazz_state::init_common()
+{
+ // map the configured ram
+ m_maincpu->space(AS_PROGRAM).install_ram(0, m_ram->mask(), m_ram->pointer());
+}
+
+void jazz_state::jazz_common_map(address_map &map)
+{
+ map(0x1fc00000, 0x1fc3ffff).r(m_flash, FUNC(amd_28f020_device::read));
+
+ // FIXME: lots of guesswork and assumptions here for now
+ map(0x80000000, 0x80000fff).m(m_mct_adr, FUNC(jazz_mct_adr_device::map));
+ map(0x80001000, 0x80001fff).m(m_network, FUNC(dp83932c_device::map));
+ //map(0x80002000, 0x80002fff).m(m_scsi, FUNC(ncr5390_device::map)).umask32(0x000000ff);
+ map(0x80003000, 0x80003fff).m(m_fdc, FUNC(n82077aa_device::map));
+ //map(0x80004000, 0x80004fff).rw(m_rtc, FUNC(mc146818_device::read), FUNC(mc146818_device::write));
+ //map(0x80005000, 0x80005fff).m() // keyboard/mouse
+ //map(0x80006000, 0x80006fff).m() // serial1
+ //map(0x80007000, 0x80007fff).m() // serial2
+ //map(0x80008000, 0x80008fff).m() // parallel
+ map(0x80009000, 0x80009fff).ram().share("nvram"); // unprotected?
+ map(0x8000a000, 0x8000afff).ram().share("nvram"); // protected?
+ map(0x8000b000, 0x8000bfff).ram().share("nvram"); // read-only? also sonic IO access?
+ //map(0x8000c000, 0x8000cfff) // sound
+ map(0x8000d000, 0x8000dfff).noprw(); // dummy dma device?
+
+ map(0x8000f000, 0x8000f001).rw(FUNC(jazz_state::led_r), FUNC(jazz_state::led_w));
+
+ //map(0x800e0000, 0x800e0000).rw(FUNC(jazz_state::dram_config_r), FUNC(jazz_state::dram_config_w));
+
+ map(0xe0800000, 0xe0bfffff).ram().share("vram"); // framebuffer?
+
+ map(0xfff00000, 0xfff3ffff).r(m_flash, FUNC(amd_28f020_device::read)); // mirror?
+}
+
+static void jazz_scsi_devices(device_slot_interface &device)
+{
+ device.option_add("harddisk", NSCSI_HARDDISK);
+ device.option_add("cdrom", NSCSI_CDROM);
+}
+
+void jazz_state::jazz(machine_config &config)
+{
+ m_maincpu->set_addrmap(AS_PROGRAM, &jazz_state::jazz_common_map);
+
+ RAM(config, m_ram, 0);
+ m_ram->set_default_size("8M");
+ m_ram->set_extra_options("16M,32M,64M,128M,256M");
+ m_ram->set_default_value(0);
+
+ // FIXME: may require big and little endian variants
+ JAZZ_MCT_ADR(config, m_mct_adr, 0);
+
+ // scsi bus and devices
+ NSCSI_BUS(config, m_scsibus, 0);
+
+ nscsi_connector &harddisk(NSCSI_CONNECTOR(config, "scsi:0", 0));
+ jazz_scsi_devices(harddisk);
+ harddisk.set_default_option("harddisk");
+
+ nscsi_connector &cdrom(NSCSI_CONNECTOR(config, "scsi:6", 0));
+ jazz_scsi_devices(cdrom);
+ cdrom.set_default_option("cdrom");
+
+ jazz_scsi_devices(NSCSI_CONNECTOR(config, "scsi:1", 0));
+ jazz_scsi_devices(NSCSI_CONNECTOR(config, "scsi:2", 0));
+ jazz_scsi_devices(NSCSI_CONNECTOR(config, "scsi:3", 0));
+ jazz_scsi_devices(NSCSI_CONNECTOR(config, "scsi:4", 0));
+ jazz_scsi_devices(NSCSI_CONNECTOR(config, "scsi:5", 0));
+
+ // scsi host adapter
+ nscsi_connector &adapter(NSCSI_CONNECTOR(config, "scsi:7", 0));
+ adapter.option_add_internal("host", NCR53C90A);
+ adapter.set_default_option("host");
+ adapter.set_fixed(true);
+
+ N82077AA(config, m_fdc, 24_MHz_XTAL);
+
+ MC146818(config, m_rtc, 32.768_kHz_XTAL);
+
+ NVRAM(config, m_nvram, nvram_device::DEFAULT_ALL_0);
+
+ AMD_28F020(config, m_flash);
+
+ // pc keyboard controller?
+ pc_kbdc_device &kbdc(PC_KBDC(config, "pc_kbdc", 0));
+ kbdc.out_clock_cb().set(m_kbdc, FUNC(at_keyboard_controller_device::keyboard_clock_w));
+ kbdc.out_data_cb().set(m_kbdc, FUNC(at_keyboard_controller_device::keyboard_data_w));
+
+ // keyboard port
+ pc_kbdc_slot_device &kbd(PC_KBDC_SLOT(config, "kbd", 0));
+ pc_at_keyboards(kbd);
+ kbd.set_default_option(STR_KBD_IBM_PC_AT_84);
+ kbd.set_pc_kbdc_slot(&kbdc);
+
+ // at keyboard controller
+ AT_KEYBOARD_CONTROLLER(config, m_kbdc, 12_MHz_XTAL);
+ m_kbdc->system_reset_cb().set_inputline(m_maincpu, INPUT_LINE_RESET);
+ m_kbdc->keyboard_clock_cb().set(kbdc, FUNC(pc_kbdc_device::clock_write_from_mb));
+ m_kbdc->keyboard_data_cb().set(kbdc, FUNC(pc_kbdc_device::data_write_from_mb));
+
+ G364(config, m_ramdac, 0);
+}
+
+void jazz_state::mmr4000be(machine_config &config)
+{
+ R4000BE(config, m_maincpu, 50_MHz_XTAL);
+
+ jazz(config);
+
+ DP83932C_BE(config, m_network, 20_MHz_XTAL);
+}
+
+void jazz_state::mmr4000le(machine_config &config)
+{
+ R4000LE(config, m_maincpu, 50_MHz_XTAL);
+
+ jazz(config);
+
+ DP83932C_LE(config, m_network, 20_MHz_XTAL);
+}
+
+ROM_START(mmr4000be)
+ ROM_REGION32_BE(0x40000, "flash", 0)
+ ROM_SYSTEM_BIOS(0, "riscos", "R4000 RISC/os PROM")
+ ROMX_LOAD("riscos.bin", 0x00000, 0x40000, CRC(cea6bc8f) SHA1(3e47b4ad5d1a0c7aac649e6aef3df1bf86fc938b), ROM_BIOS(0))
+ROM_END
+
+ROM_START(mmr4000le)
+ ROM_REGION32_LE(0x40000, "flash", 0)
+ ROM_SYSTEM_BIOS(0, "ntprom", "R4000 Windows NT PROM")
+ ROMX_LOAD("ntprom.bin", 0x00000, 0x40000, CRC(d91018d7) SHA1(316de17820192c89b8ee6d9936ab8364a739ca53), ROM_BIOS(0))
+ROM_END
+
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
+COMP( 1992, mmr4000be, 0, 0, mmr4000be, 0, jazz_state, init_common, "MIPS", "Magnum R4000 (big)", MACHINE_IS_SKELETON)
+COMP( 1992, mmr4000le, 0, 0, mmr4000le, 0, jazz_state, init_common, "MIPS", "Magnum R4000 (little)", MACHINE_IS_SKELETON)