1 // license:BSD-3-Clause
2 // copyright-holders:Patrick Mackinlay
3 
4 /*
5  * An emulation of systems based on the Jazz computer architecture, originally
6  * developed by Microsoft. Specific systems which implemented this architecture
7  * include the MIPS Magnum/Millenium 4000 and Olivetti M700-10.
8  *
9  * References:
10  *
11  *   https://www.linux-mips.org/wiki/Jazz
12  *   http://gunkies.org/wiki/MIPS_Magnum
13  *   http://www.sensi.org/~alec/mips/mips-history.html
14  *
15  * TODO
16  *   - big-endian support for RISC/os
17  *   - EISA bus and slots
18  *   - slotify and improve graphics board
19  *   - other models/variants
20  *   - sound and other loose ends
21  *
22  * Unconfirmed parts lists from ARCSystem reference design (which appears to
23  * be very similar or identical to the Jazz system) taken from:
24  *   https://www.linux-mips.org/archives/riscy/1993-12/msg00013.html
25  *
26  *   Ref   Part                      Function
27  *
28  * System board:
29  *
30  *         Dallas DS1287             RTC and NVRAM
31  *         Dallas DS1225Y            8k non-volatile SRAM
32  *         WD16C552                  Dual serial and parallel port controller
33  *         Intel N82077A             Floppy drive controller
34  *         National DP83932BFV       Ethernet controller
35  *         Intel 82358               EISA Bus Controller
36  *         Intel 82357               EISA Integrated System Peripheral (ISP)
37  *         Intel 82352 x 2           EISA Bus Buffer (EBB)
38  *         Emulex FAS216             SCSI controller
39  *         27C01                     128k EPROM
40  *         28F020                    256k flash memory
41  *         NEC μPD31432              ARC address path ASIC
42  *         NEC μPD31431 x 2          ARC data path ASIC
43  *         NEC μPD30400              R4000PC/50 CPU
44  *
45  * Audio board:
46  *
47  *         Crystal CS4215            Audio codec
48  *         Altera FPGA x 4           Audio DMA
49  *
50  * Video board:
51  *
52  *         27C010                    128k EPROM
53  *         IMS G364-11S              Video controller
54  *         NEC μPD42274V-80 x 16     256kx4 VRAM (2MiB)
55  */
56 
57 #include "emu.h"
58 
59 #include "cpu/mips/r4000.h"
60 
61  // memory
62 #include "machine/ram.h"
63 #include "machine/nvram.h"
64 #include "machine/28fxxx.h"
65 
66 // various hardware
67 #include "machine/mct_adr.h"
68 #include "machine/dp83932c.h"
69 #include "machine/mc146818.h"
70 #include "machine/ins8250.h"
71 #include "machine/ncr5390.h"
72 #include "machine/upd765.h"
73 #include "machine/at_keybc.h"
74 #include "machine/pc_lpt.h"
75 #include "machine/i82357.h"
76 
77 // video
78 #include "screen.h"
79 #include "video/ims_cvc.h"
80 
81 // audio
82 #include "sound/spkrdev.h"
83 #include "speaker.h"
84 
85 // busses and connectors
86 #include "machine/nscsi_bus.h"
87 #include "bus/nscsi/cd.h"
88 #include "bus/nscsi/hd.h"
89 #include "bus/rs232/rs232.h"
90 #include "bus/pc_kbd/pc_kbdc.h"
91 #include "bus/pc_kbd/keyboards.h"
92 
93 #include "imagedev/floppy.h"
94 #include "formats/pc_dsk.h"
95 #include "softlist.h"
96 
97 #include "debugger.h"
98 
99 #include "jazz.lh"
100 
101 #define VERBOSE 0
102 #include "logmacro.h"
103 
104 namespace {
105 
106 class jazz_state : public driver_device
107 {
108 public:
jazz_state(const machine_config & mconfig,device_type type,const char * tag)109 	jazz_state(const machine_config &mconfig, device_type type, const char *tag)
110 		: driver_device(mconfig, type, tag)
111 		, m_cpu(*this, "cpu")
112 		, m_ram(*this, "ram")
113 		, m_vram(*this, "vram")
114 		, m_mct_adr(*this, "mct_adr")
115 		, m_scsibus(*this, "scsi")
116 		, m_scsi(*this, "scsi:7:ncr53c94")
117 		, m_fdc(*this, "fdc")
118 		, m_rtc(*this, "rtc")
119 		, m_nvram(*this, "nvram")
120 		, m_flash(*this, "flash")
121 		, m_kbdc(*this, "kbdc")
122 		, m_net(*this, "net")
123 		, m_screen(*this, "screen")
124 		, m_cvc(*this, "g364")
125 		, m_ace(*this, "ace%u", 0)
126 		, m_lpt(*this, "lpt")
127 		, m_isp(*this, "isp")
128 		, m_buzzer(*this, "buzzer")
129 		, m_softlist(*this, "softlist")
130 		, m_led(*this, "led0")
131 	{
132 	}
133 
134 protected:
135 	// driver_device overrides
136 	virtual void machine_start() override;
137 	virtual void machine_reset() override;
138 
139 	// address maps
140 	void cpu_map(address_map &map);
141 	void mct_map(address_map &map);
142 
143 	// machine config
144 	void jazz(machine_config &config);
145 
146 	void led_w(u8 data);
147 
148 public:
149 	void mmr4000be(machine_config &config);
150 	void mmr4000le(machine_config &config);
151 
152 	void init_common();
153 
154 	DECLARE_FLOPPY_FORMATS(floppy_formats);
155 
156 protected:
157 	// devices
158 	required_device<r4000_device> m_cpu;
159 	required_device<ram_device> m_ram;
160 	required_device<ram_device> m_vram;
161 	required_device<mct_adr_device> m_mct_adr;
162 	required_device<nscsi_bus_device> m_scsibus;
163 	required_device<ncr53c94_device> m_scsi;
164 	required_device<n82077aa_device> m_fdc;
165 	required_device<mc146818_device> m_rtc;
166 	required_device<nvram_device> m_nvram;
167 	required_device<amd_28f020_device> m_flash;
168 	required_device<ps2_keyboard_controller_device> m_kbdc;
169 	required_device<dp83932c_device> m_net;
170 	required_device<screen_device> m_screen;
171 	required_device<g364_device> m_cvc;
172 	required_device_array<ns16550_device, 2> m_ace;
173 	required_device<pc_lpt_device> m_lpt;
174 	required_device<i82357_device> m_isp;
175 	required_device<speaker_sound_device> m_buzzer;
176 	required_device<software_list_device> m_softlist;
177 
178 	output_finder<> m_led;
179 };
180 
machine_start()181 void jazz_state::machine_start()
182 {
183 	m_led.resolve();
184 }
185 
machine_reset()186 void jazz_state::machine_reset()
187 {
188 	// HACK: make sure the RTC is running
189 	m_rtc->write_direct(0x0a, 0x20);
190 }
191 
init_common()192 void jazz_state::init_common()
193 {
194 	// map the configured ram and vram
195 	m_mct_adr->space(0).install_ram(0x00000000, 0x00000000 | m_ram->mask(), m_ram->pointer());
196 	m_mct_adr->space(0).install_ram(0x40000000, 0x40000000 | m_vram->mask(), m_vram->pointer());
197 }
198 
cpu_map(address_map & map)199 void jazz_state::cpu_map(address_map &map)
200 {
201 	map(0x00000000, 0xffffffff).rw(m_mct_adr, FUNC(mct_adr_device::r4k_r), FUNC(mct_adr_device::r4k_w));
202 }
203 
mct_map(address_map & map)204 void jazz_state::mct_map(address_map &map)
205 {
206 	map(0x1fc00000, 0x1fc3ffff).r(m_flash, FUNC(amd_28f020_device::read));
207 
208 	// VDR1
209 	//map(0x60000000, 0x60001fff).m(m_cvc, FUNC(g364_device::map));
210 	//map(0x60010000, 0x60010000); // id (r/w)
211 	//map(0x60020000, 0x60020000); // reset
212 
213 	// VDR1F "Fission"
214 	map(0x60000000, 0x6007ffff).rom().region("graphics", 0);
215 	map(0x60080000, 0x60081fff).m(m_cvc, FUNC(g364_device::map));
216 	map(0x60100000, 0x60100000).lw8([this] (u8 data) { m_cvc->set_swapped(ENDIANNESS_NATIVE == ENDIANNESS_BIG); }, "little_endian");
217 	map(0x60102000, 0x60102000).lw8([this] (u8 data) { m_cvc->set_swapped(ENDIANNESS_NATIVE == ENDIANNESS_LITTLE); }, "big_endian");
218 	map(0x60180000, 0x60180000).lw8([this] (u8 data) { m_cvc->reset(); }, "g364_reset");
219 	//map(0x60182000, 0x60182000); // TODO: monitor
220 
221 	// VDR2
222 	//map(0x60000000, 0x60000fff).m(m_cvc, FUNC(g300_device::map));
223 	//map(0x60008000, 0x60008fff).m(m_cursor, FUNC(bt431_device::map)).umask32(0x000000ff);
224 
225 	map(0x80000000, 0x80000fff).m(m_mct_adr, FUNC(mct_adr_device::map));
226 
227 	map(0x80001000, 0x800010ff).m(m_net, FUNC(dp83932c_device::map)).umask32(0x0000ffff);
228 	map(0x80002000, 0x8000200f).m(m_scsi, FUNC(ncr53c94_device::map));
229 	map(0x80003000, 0x8000300f).m(m_fdc, FUNC(n82077aa_device::map));
230 
231 	// LE: only reads 4000
232 	// BE: read 400d, write 400d, write 400c
233 	map(0x80004000, 0x8000400f).lrw8(
234 			NAME([this] (offs_t offset) { return m_rtc->read(1); }),
235 			NAME([this] (offs_t offset, u8 data) { m_rtc->write(1, data); }));
236 	map(0x80005000, 0x80005000).rw(m_kbdc, FUNC(ps2_keyboard_controller_device::data_r), FUNC(ps2_keyboard_controller_device::data_w));
237 	map(0x80005001, 0x80005001).rw(m_kbdc, FUNC(ps2_keyboard_controller_device::status_r), FUNC(ps2_keyboard_controller_device::command_w));
238 	map(0x80006000, 0x80006007).rw(m_ace[0], FUNC(ns16550_device::ins8250_r), FUNC(ns16550_device::ins8250_w));
239 	map(0x80007000, 0x80007007).rw(m_ace[1], FUNC(ns16550_device::ins8250_r), FUNC(ns16550_device::ins8250_w));
240 	map(0x80008000, 0x80008003).rw(m_lpt, FUNC(pc_lpt_device::read), FUNC(pc_lpt_device::write));
241 	map(0x80009000, 0x8000afff).ram().share("nvram");
242 	map(0x8000b000, 0x8000b007).lr8(
243 			[] (offs_t offset)
244 			{
245 				// mac address and checksum
246 				static u8 const mac[] = { 0x00, 0x00, 0x6b, 0x12, 0x34, 0x56, 0x00, 0xf7 };
247 
248 				return mac[offset];
249 			},
250 			"mac");
251 
252 	//map(0x8000c000, 0x8000cfff) // sound
253 	//map(0x8000d000, 0x8000dfff).noprw(); // dummy dma device?
254 	map(0x8000d600, 0x8000d607).nopw();
255 
256 	map(0x8000f000, 0x8000f000).w(FUNC(jazz_state::led_w));
257 
258 	// lots of byte data written to 800
259 	//map(0x800e0000, 0x800fffff).m() // dram config
260 
261 	map(0x90000000, 0x90ffffff).m(m_isp, FUNC(i82357_device::map));
262 
263 	// HACK: empty eisa slots
264 	map(0x90001c80, 0x90001c87).ram();
265 	map(0x90002c80, 0x90002c87).ram();
266 	map(0x90003c80, 0x90003c87).ram();
267 	map(0x90004c80, 0x90004c87).ram();
268 
269 	//map(0x91000000, 0x91ffffff).m();
270 	//map(0x92000000, 0x92ffffff).m(); // EISA I/O ports?
271 	//map(0x93000000, 0x93ffffff).m(); // EISA memory
272 
273 	map(0xf0000000, 0xf0000001).r(m_mct_adr, FUNC(mct_adr_device::isr_r));
274 	map(0xf0000002, 0xf0000003).rw(m_mct_adr, FUNC(mct_adr_device::imr_r), FUNC(mct_adr_device::imr_w));
275 
276 	map(0xfff00000, 0xfff3ffff).r(m_flash, FUNC(amd_28f020_device::read)); // mirror?
277 }
278 
jazz_scsi_devices(device_slot_interface & device)279 static void jazz_scsi_devices(device_slot_interface &device)
280 {
281 	device.option_add("harddisk", NSCSI_HARDDISK);
282 	device.option_add("cdrom", NSCSI_CDROM);
283 }
284 
FLOPPY_FORMATS_MEMBER(jazz_state::floppy_formats)285 FLOPPY_FORMATS_MEMBER(jazz_state::floppy_formats)
286 	FLOPPY_PC_FORMAT
287 FLOPPY_FORMATS_END
288 
289 void jazz_state::jazz(machine_config &config)
290 {
291 	// FIXME: slow the cpu clock to get past session manager bugcheck
292 	R4000(config, m_cpu, 50_MHz_XTAL / 5);
293 	m_cpu->set_addrmap(0, &jazz_state::cpu_map);
294 
295 	RAM(config, m_ram);
296 	m_ram->set_default_size("16M");
297 	m_ram->set_extra_options("32M,64M,128M,256M");
298 	m_ram->set_default_value(0);
299 
300 	RAM(config, m_vram);
301 	m_vram->set_default_size("2M");
302 	m_vram->set_default_value(0);
303 
304 	// local bus dma, timer and interrupt controller
305 	MCT_ADR(config, m_mct_adr, 0);
306 	m_mct_adr->set_addrmap(0, &jazz_state::mct_map);
307 	m_mct_adr->out_int_dma_cb().set_inputline(m_cpu, INPUT_LINE_IRQ0);
308 	m_mct_adr->out_int_device_cb().set_inputline(m_cpu, INPUT_LINE_IRQ1);
309 	m_mct_adr->out_int_timer_cb().set_inputline(m_cpu, INPUT_LINE_IRQ4);
310 	m_mct_adr->eisa_iack_cb().set(m_isp, FUNC(i82357_device::eisa_irq_ack));
311 
312 	// scsi bus and devices
313 	NSCSI_BUS(config, m_scsibus);
314 	NSCSI_CONNECTOR(config, "scsi:0", jazz_scsi_devices, "harddisk");
315 	NSCSI_CONNECTOR(config, "scsi:1", jazz_scsi_devices, nullptr);
316 	NSCSI_CONNECTOR(config, "scsi:2", jazz_scsi_devices, nullptr);
317 	NSCSI_CONNECTOR(config, "scsi:3", jazz_scsi_devices, nullptr);
318 	NSCSI_CONNECTOR(config, "scsi:4", jazz_scsi_devices, nullptr);
319 	NSCSI_CONNECTOR(config, "scsi:5", jazz_scsi_devices, nullptr);
320 	NSCSI_CONNECTOR(config, "scsi:6", jazz_scsi_devices, "cdrom");
321 
322 	// scsi host adapter
323 	NSCSI_CONNECTOR(config, "scsi:7").option_set("ncr53c94", NCR53C94).clock(24_MHz_XTAL).machine_config(
324 		[this] (device_t *device)
325 		{
326 			ncr53c94_device &adapter = downcast<ncr53c94_device &>(*device);
327 
328 			adapter.irq_handler_cb().set(m_mct_adr, FUNC(mct_adr_device::irq<5>));
329 			adapter.drq_handler_cb().set(m_mct_adr, FUNC(mct_adr_device::drq<0>));
330 
331 			subdevice<mct_adr_device>(":mct_adr")->dma_r_cb<0>().set(adapter, FUNC(ncr53c94_device::dma_r));
332 			subdevice<mct_adr_device>(":mct_adr")->dma_w_cb<0>().set(adapter, FUNC(ncr53c94_device::dma_w));
333 		});
334 
335 	// floppy controller and drive
336 	N82077AA(config, m_fdc, 24_MHz_XTAL);
337 	m_fdc->intrq_wr_callback().set(m_mct_adr, FUNC(mct_adr_device::irq<1>));
338 	m_fdc->drq_wr_callback().set(m_mct_adr, FUNC(mct_adr_device::drq<1>));
339 	FLOPPY_CONNECTOR(config, "fdc:0", "35hd", FLOPPY_35_HD, true, jazz_state::floppy_formats).enable_sound(false);
340 	m_mct_adr->dma_r_cb<1>().set(m_fdc, FUNC(n82077aa_device::dma_r));
341 	m_mct_adr->dma_w_cb<1>().set(m_fdc, FUNC(n82077aa_device::dma_w));
342 
343 	MC146818(config, m_rtc, 32.768_kHz_XTAL);
344 	m_rtc->set_epoch(1980);
345 
346 	NVRAM(config, m_nvram, nvram_device::DEFAULT_ALL_0);
347 
348 	AMD_28F020(config, m_flash);
349 
350 	// pc keyboard connector
351 	pc_kbdc_device &kbd_con(PC_KBDC(config, "kbd_con", 0));
352 	kbd_con.out_clock_cb().set(m_kbdc, FUNC(ps2_keyboard_controller_device::kbd_clk_w));
353 	kbd_con.out_data_cb().set(m_kbdc, FUNC(ps2_keyboard_controller_device::kbd_data_w));
354 
355 	// keyboard port
356 	pc_kbdc_slot_device &kbd(PC_KBDC_SLOT(config, "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL));
357 	kbd.set_pc_kbdc_slot(&kbd_con);
358 
359 	// auxiliary connector
360 	pc_kbdc_device &aux_con(PC_KBDC(config, "aux_con", 0));
361 	aux_con.out_clock_cb().set(m_kbdc, FUNC(ps2_keyboard_controller_device::aux_clk_w));
362 	aux_con.out_data_cb().set(m_kbdc, FUNC(ps2_keyboard_controller_device::aux_data_w));
363 
364 	// auxiliary port
365 	pc_kbdc_slot_device &aux(PC_KBDC_SLOT(config, "aux", ps2_mice, STR_HLE_PS2_MOUSE));
366 	aux.set_pc_kbdc_slot(&aux_con);
367 
368 	// keyboard controller
369 	PS2_KEYBOARD_CONTROLLER(config, m_kbdc, 12_MHz_XTAL);
370 	// FIXME: reset is probably routed through the MCT-ADR
371 	m_kbdc->hot_res().set([this] (int state) { machine().schedule_soft_reset(); });
372 	m_kbdc->kbd_clk().set(kbd_con, FUNC(pc_kbdc_device::clock_write_from_mb));
373 	m_kbdc->kbd_data().set(kbd_con, FUNC(pc_kbdc_device::data_write_from_mb));
374 	m_kbdc->kbd_irq().set(m_mct_adr, FUNC(mct_adr_device::irq<6>));
375 	m_kbdc->aux_clk().set(aux_con, FUNC(pc_kbdc_device::clock_write_from_mb));
376 	m_kbdc->aux_data().set(aux_con, FUNC(pc_kbdc_device::data_write_from_mb));
377 	m_kbdc->aux_irq().set(m_mct_adr, FUNC(mct_adr_device::irq<7>));
378 
379 	SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
380 	m_screen->set_raw(78643200, 1280, 0, 1280, 1024, 0, 1024);
381 	m_screen->set_screen_update(m_cvc, FUNC(g364_device::screen_update));
382 	m_screen->screen_vblank().set(m_mct_adr, FUNC(mct_adr_device::irq<3>)); // maybe?
383 
384 	G364(config, m_cvc, 5_MHz_XTAL); // FIXME: guessed clock
385 	m_cvc->set_screen(m_screen);
386 	m_cvc->set_vram(m_vram);
387 
388 	// WD16C552 (two 16550 + pc_lpt)
389 	NS16550(config, m_ace[0], 4233600);
390 	rs232_port_device &serial0(RS232_PORT(config, "serial0", default_rs232_devices, nullptr));
391 
392 	m_ace[0]->out_dtr_callback().set(serial0, FUNC(rs232_port_device::write_dtr));
393 	m_ace[0]->out_rts_callback().set(serial0, FUNC(rs232_port_device::write_rts));
394 	m_ace[0]->out_tx_callback().set(serial0, FUNC(rs232_port_device::write_txd));
395 	m_ace[0]->out_int_callback().set(m_mct_adr, FUNC(mct_adr_device::irq<8>));
396 
397 	serial0.cts_handler().set(m_ace[0], FUNC(ns16550_device::cts_w));
398 	serial0.dcd_handler().set(m_ace[0], FUNC(ns16550_device::dcd_w));
399 	serial0.dsr_handler().set(m_ace[0], FUNC(ns16550_device::dsr_w));
400 	serial0.ri_handler().set(m_ace[0], FUNC(ns16550_device::ri_w));
401 	serial0.rxd_handler().set(m_ace[0], FUNC(ns16550_device::rx_w));
402 
403 	NS16550(config, m_ace[1], 8_MHz_XTAL);
404 	rs232_port_device &serial1(RS232_PORT(config, "serial1", default_rs232_devices, nullptr));
405 
406 	m_ace[1]->out_dtr_callback().set(serial1, FUNC(rs232_port_device::write_dtr));
407 	m_ace[1]->out_rts_callback().set(serial1, FUNC(rs232_port_device::write_rts));
408 	m_ace[1]->out_tx_callback().set(serial1, FUNC(rs232_port_device::write_txd));
409 	m_ace[1]->out_int_callback().set(m_mct_adr, FUNC(mct_adr_device::irq<9>));
410 
411 	serial1.cts_handler().set(m_ace[1], FUNC(ns16550_device::cts_w));
412 	serial1.dcd_handler().set(m_ace[1], FUNC(ns16550_device::dcd_w));
413 	serial1.dsr_handler().set(m_ace[1], FUNC(ns16550_device::dsr_w));
414 	serial1.ri_handler().set(m_ace[1], FUNC(ns16550_device::ri_w));
415 	serial1.rxd_handler().set(m_ace[1], FUNC(ns16550_device::rx_w));
416 
417 	PC_LPT(config, m_lpt, 0);
418 	m_lpt->irq_handler().set(m_mct_adr, FUNC(mct_adr_device::irq<0>));
419 
420 	// TODO: sound, interrupt 2, drq 2(l) & 3(r)
421 
422 	// buzzer
423 	SPEAKER(config, "mono").front_center();
424 	SPEAKER_SOUND(config, m_buzzer);
425 	m_buzzer->add_route(ALL_OUTPUTS, "mono", 0.50);
426 
427 	DP83932C(config, m_net, 20_MHz_XTAL);
428 	m_net->out_int_cb().set(m_mct_adr, FUNC(mct_adr_device::irq<4>));
429 	m_net->set_bus(m_mct_adr, 1);
430 
431 	I82357(config, m_isp, 14.318181_MHz_XTAL);
432 	m_isp->out_rtc_cb().set(m_rtc, FUNC(mc146818_device::write));
433 	m_isp->out_int_cb().set_inputline(m_cpu, INPUT_LINE_IRQ2);
434 	m_isp->out_nmi_cb().set_inputline(m_cpu, INPUT_LINE_IRQ3);
435 	m_isp->out_spkr_cb().set(m_buzzer, FUNC(speaker_sound_device::level_w));
436 
437 	// TODO: 4 EISA slots
438 
439 	config.set_default_layout(layout_jazz);
440 
441 	// software list
442 	SOFTWARE_LIST(config, m_softlist).set_original("jazz");
443 }
444 
led_w(u8 data)445 void jazz_state::led_w(u8 data)
446 {
447 	// 7-segment diagnostic led
448 	static u8 const patterns[16] =
449 	{
450 			  // test      output
451 		0x3f, // mct-adr     0
452 		0x06, // network     1
453 		0x5b, // scsi        2
454 		0x4f, // floppy      3
455 		0x66, // isp/rtc     4
456 		0x6d, // keyboard    5
457 		0x7d, // serial      6
458 		0x07, // nvram       7
459 		0x7f, //             8?
460 		0x6f, // video       9
461 		0x77, // memory      A
462 		0x40, //             -
463 		0x39, // flash       C
464 		0x00, //           (blank)
465 		0x79, // cpu         E
466 		0x71, //             F?
467 	};
468 
469 	m_led = patterns[data & 0xf] | (BIT(data, 4) ? 0x80 : 0);
470 }
471 
mmr4000be(machine_config & config)472 void jazz_state::mmr4000be(machine_config &config)
473 {
474 	jazz(config);
475 
476 	m_cpu->set_config(r4000_device::CONFIG_BE, r4000_device::CONFIG_BE);
477 }
478 
mmr4000le(machine_config & config)479 void jazz_state::mmr4000le(machine_config &config)
480 {
481 	jazz(config);
482 
483 	m_cpu->set_config(0, r4000_device::CONFIG_BE);
484 }
485 
486 ROM_START(mmr4000be)
487 	ROM_REGION32_LE(0x40000, "flash", 0)
488 	ROM_SYSTEM_BIOS(0, "riscos", "R4000 RISC/os PROM")
489 	ROMX_LOAD("riscos.bin", 0x00000, 0x40000, CRC(cea6bc8f) SHA1(3e47b4ad5d1a0c7aac649e6aef3df1bf86fc938b), ROM_BIOS(0))
490 
491 	ROM_REGION32_LE(0x800000, "graphics", 0)
492 	ROM_LOAD64_BYTE("mips_g364.bin", 0x000000, 0x020000, CRC(be6a726e) SHA1(225c198f6a7f8445dac3de052ecceecbb5be6bc7) BAD_DUMP)
493 ROM_END
494 
495 ROM_START(mmr4000le)
496 	ROM_REGION32_LE(0x40000, "flash", 0)
497 	ROM_SYSTEM_BIOS(0, "ntprom", "R4000 Windows NT PROM")
498 	ROMX_LOAD("ntprom.bin", 0x00000, 0x40000, CRC(d91018d7) SHA1(316de17820192c89b8ee6d9936ab8364a739ca53), ROM_BIOS(0))
499 
500 	ROM_REGION32_LE(0x800000, "graphics", 0)
501 	// Jazz G300 (8.125MHz video clock, Bt431)
502 	//ROM_LOAD64_BYTE("jazz_g300.bin", 0x00, 0x40, CRC(258eb00a) SHA1(6e3fd0272957524de82e7042d6e36aca492c4d26) BAD_DUMP)
503 	// Jazz G364 (8.125MHz video clock)
504 	//ROM_LOAD64_BYTE("jazz_g364.bin", 0x000000, 0x020000, CRC(495fb417) SHA1(c341f3d498822ec1ee07a70076d7bbbf7aa60cb5) BAD_DUMP)
505 	// Jazz VXL (aka Jaguar, part number 09-00184, Bt484 or Bt485)
506 	//ROM_LOAD64_BYTE("jazz_vxl.bin", 0x000000, 0x010000, CRC(8edf1a62) SHA1(7750833eac0708ee79f01f36523554d29a094692) BAD_DUMP)
507 	// MIPS G364 (5MHz video clock, part number 09-00176)
508 	ROM_LOAD64_BYTE("mips_g364.bin", 0x000000, 0x020000, CRC(be6a726e) SHA1(225c198f6a7f8445dac3de052ecceecbb5be6bc7) BAD_DUMP)
509 ROM_END
510 
511 }
512 
513 /*   YEAR   NAME       PARENT  COMPAT  MACHINE    INPUT  CLASS       INIT         COMPANY  FULLNAME             FLAGS */
514 COMP(1992,  mmr4000be, 0,      0,      mmr4000be, 0,     jazz_state, init_common, "MIPS",  "Magnum R4000 (be)", MACHINE_NO_SOUND)
515 COMP(1992,  mmr4000le, 0,      0,      mmr4000le, 0,     jazz_state, init_common, "MIPS",  "Magnum R4000 (le)", MACHINE_NO_SOUND)
516