// 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::kbd_clk_w)); kbdc.out_data_cb().set(m_kbdc, FUNC(at_keyboard_controller_device::kbd_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->hot_res().set_inputline(m_maincpu, INPUT_LINE_RESET); m_kbdc->kbd_clk().set(kbdc, FUNC(pc_kbdc_device::clock_write_from_mb)); m_kbdc->kbd_data().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)