diff --git a/src/mame/drivers/4dpi.cpp b/src/mame/drivers/4dpi.cpp index 95643af993b..40906a29985 100644 --- a/src/mame/drivers/4dpi.cpp +++ b/src/mame/drivers/4dpi.cpp @@ -69,10 +69,10 @@ #define VERBOSE (LOG_GENERAL) #include "logmacro.h" -class ip6_state : public driver_device +class pi4d2x_state : public driver_device { public: - ip6_state(machine_config const &mconfig, device_type type, char const *tag) + pi4d2x_state(machine_config const &mconfig, device_type type, char const *tag) : driver_device(mconfig, type, tag) , m_cpu(*this, "maincpu") , m_ram(*this, "ram") @@ -87,7 +87,9 @@ public: { } - void configure(machine_config &config); + void pi4d20(machine_config &config); + void pi4d25(machine_config &config); + void initialize(); private: @@ -111,6 +113,7 @@ private: }; output_finder<4> m_leds; + void common(machine_config &config); void map(address_map &map); template void lio_interrupt(int state) { lio_interrupt(N, state); } @@ -180,7 +183,7 @@ private: std::unique_ptr m_dma_map; }; -void ip6_state::map(address_map &map) +void pi4d2x_state::map(address_map &map) { //map(0x10000000, 0x1bffffff); // vme a32 modifier 0x09 non-privileged //map(0x1c000000, 0x1cffffff); // vme a24 modifier 0x3d privileged @@ -191,7 +194,7 @@ void ip6_state::map(address_map &map) //map(0x1df00000, 0x1df00003).umask32(0x0000ff00); // VME_IACK: vme interrupt acknowledge map(0x1f800000, 0x1f800003).lw8("mem_cfg", [this](u8 data) { m_mem_cfg = data; }).umask32(0xff000000); - map(0x1f800000, 0x1f800003).r(FUNC(ip6_state::ctl_sid_r)).umask32(0x00ff0000); + map(0x1f800000, 0x1f800003).r(FUNC(pi4d2x_state::ctl_sid_r)).umask32(0x00ff0000); map(0x1f840000, 0x1f840003).lrw8("vme_isr", [this]() { return m_vme_isr; }, [this](u8 data) { m_vme_isr = data; }).umask32(0x000000ff); map(0x1f840008, 0x1f84000b).lrw8("vme_imr", [this]() { return m_vme_imr; }, [this](u8 data) { m_vme_imr = data; }).umask32(0x000000ff); @@ -310,7 +313,7 @@ void ip6_state::map(address_map &map) map(0x1fbc0000, 0x1fbc007f).rw(m_rtc, FUNC(dp8573_device::read), FUNC(dp8573_device::write)).umask32(0xff000000); - map(0x1fc00000, 0x1fc3ffff).rom().region("prom", 0); + map(0x1fc00000, 0x1fc3ffff).rom().region("boot", 0); } static void scsi_devices(device_slot_interface &device) @@ -323,12 +326,26 @@ static void scsi_devices(device_slot_interface &device) device.option_add("harddisk", NSCSI_HARDDISK); } -void ip6_state::configure(machine_config &config) +void pi4d2x_state::pi4d20(machine_config &config) { R2000A(config, m_cpu, 25_MHz_XTAL / 2, 16384, 8192); - m_cpu->set_endianness(ENDIANNESS_BIG); - m_cpu->set_addrmap(AS_PROGRAM, &ip6_state::map); m_cpu->set_fpu(mips1_device_base::MIPS_R2010A); + + common(config); +} + +void pi4d2x_state::pi4d25(machine_config &config) +{ + R3000(config, m_cpu, 20_MHz_XTAL, 32768, 65536); + m_cpu->set_fpu(mips1_device_base::MIPS_R3010); + + common(config); +} + +void pi4d2x_state::common(machine_config &config) +{ + m_cpu->set_endianness(ENDIANNESS_BIG); + m_cpu->set_addrmap(AS_PROGRAM, &pi4d2x_state::map); m_cpu->in_brcond<0>().set([]() { return 1; }); // writeback complete // 16 SIMM slots with 1, 2 or 4MB SIMMs installed in sets of 4 @@ -355,8 +372,8 @@ void ip6_state::configure(machine_config &config) wd33c93_device &wd33c93(downcast(*device)); wd33c93.set_clock(10000000); - wd33c93.irq_cb().set(*this, FUNC(ip6_state::lio_interrupt)).invert(); - wd33c93.drq_cb().set(*this, FUNC(ip6_state::scsi_drq)); + wd33c93.irq_cb().set(*this, FUNC(pi4d2x_state::lio_interrupt)).invert(); + wd33c93.drq_cb().set(*this, FUNC(pi4d2x_state::scsi_drq)); }); NSCSI_CONNECTOR(config, "scsi:1", scsi_devices, "harddisk", false); NSCSI_CONNECTOR(config, "scsi:2", scsi_devices, nullptr, false); @@ -367,7 +384,7 @@ void ip6_state::configure(machine_config &config) NSCSI_CONNECTOR(config, "scsi:7", scsi_devices, nullptr, false); AM7990(config, m_enet); - m_enet->intr_out().set(FUNC(ip6_state::lio_interrupt)); + m_enet->intr_out().set(FUNC(pi4d2x_state::lio_interrupt)); m_enet->dma_in().set( [this](offs_t offset) { @@ -396,7 +413,7 @@ void ip6_state::configure(machine_config &config) "mouse")); // duart 0 outputs - m_duart[0]->irq_cb().set(FUNC(ip6_state::lio_interrupt)).invert(); + m_duart[0]->irq_cb().set(FUNC(pi4d2x_state::lio_interrupt)).invert(); m_duart[0]->a_tx_cb().set(keyboard_port, FUNC(sgi_keyboard_port_device::write_txd)); m_duart[0]->b_tx_cb().set(mouse_port, FUNC(rs232_port_device::write_txd)); @@ -410,7 +427,7 @@ void ip6_state::configure(machine_config &config) RS232_PORT(config, m_serial[1], default_rs232_devices, nullptr); // duart 1 outputs - m_duart[1]->irq_cb().set(FUNC(ip6_state::lio_interrupt)).invert(); + m_duart[1]->irq_cb().set(FUNC(pi4d2x_state::lio_interrupt)).invert(); m_duart[1]->a_tx_cb().set(m_serial[0], FUNC(rs232_port_device::write_txd)); m_duart[1]->b_tx_cb().set(m_serial[1], FUNC(rs232_port_device::write_txd)); m_duart[1]->outport_cb().set( @@ -434,7 +451,7 @@ void ip6_state::configure(machine_config &config) m_serial[1]->dcd_handler().set(m_duart[1], FUNC(scn2681_device::ip2_w)); } -void ip6_state::initialize() +void pi4d2x_state::initialize() { // map the configured ram m_cpu->space(0).install_ram(0x00000000, m_ram->mask(), m_ram->pointer()); @@ -452,7 +469,7 @@ void ip6_state::initialize() m_leds.resolve(); } -void ip6_state::lio_interrupt(unsigned number, int state) +void pi4d2x_state::lio_interrupt(unsigned number, int state) { u16 const mask = 1 << number; @@ -471,7 +488,7 @@ void ip6_state::lio_interrupt(unsigned number, int state) } } -void ip6_state::scsi_drq(int state) +void pi4d2x_state::scsi_drq(int state) { if (state) { @@ -488,7 +505,7 @@ void ip6_state::scsi_drq(int state) } } -u8 ip6_state::ctl_sid_r() +u8 pi4d2x_state::ctl_sid_r() { u8 data = m_ctl_sid; @@ -501,11 +518,31 @@ u8 ip6_state::ctl_sid_r() return data; } -// FIXME: boot prom is in fact four 27C512 eproms ROM_START(4d20) - ROM_REGION32_BE(0x40000, "prom", 0) - ROM_LOAD("4d202031.bin", 0x000000, 0x040000, CRC(065a290a) SHA1(6f5738e79643f94901e6efe3612468d14177f65b)) + ROM_REGION32_BE(0x40000, "boot", 0) + ROM_SYSTEM_BIOS(0, "3.1c", "Version 4D1-3.1 Rev C, Tue Jan 10 15:11:42 PST 1989 SGI") + ROMX_LOAD("070_8000_005_boot_0.h1c5", 0x000000, 0x010000, CRC(c7a182de) SHA1(56038f54b5a3254960ad7c8232f1a7cf058b9ead), ROM_BIOS(0) | ROM_SKIP(3)) + ROMX_LOAD("070_8000_005_boot_1.h1d2", 0x000001, 0x010000, CRC(4b1395f5) SHA1(926f3172b79ebaf7040ff04b0cfdc3d48d03293c), ROM_BIOS(0) | ROM_SKIP(3)) + ROMX_LOAD("070_8000_005_boot_2.h1d9", 0x000002, 0x010000, CRC(e0a55120) SHA1(0b675489ea94bf85a5a0e5f0ebf0c0b7ff5fc389), ROM_BIOS(0) | ROM_SKIP(3)) + ROMX_LOAD("070_8000_005_boot_3.h1e6", 0x000003, 0x010000, CRC(11536526) SHA1(5149f453347ae566e9fee4447615dff88c7f6a37), ROM_BIOS(0) | ROM_SKIP(3)) + + // this firmware has been found in both 4D/20 and 4D/25 hardware + ROM_SYSTEM_BIOS(1, "3.2e", "Version 3.2 Rev E, Fri Jul 14 14:37:38 PDT 1989 SGI") + ROMX_LOAD("070_8000_007_boot_0.h1c5", 0x000000, 0x010000, CRC(e448b865) SHA1(f0276b76360ea0b3250dbdaa7a1e57ea8f6144d6), ROM_BIOS(1) | ROM_SKIP(3)) + ROMX_LOAD("070_8000_007_boot_1.h1d2", 0x000001, 0x010000, CRC(59fda717) SHA1(ef3ccb1f8a815e7b13c79deeea0d73006deed09f), ROM_BIOS(1) | ROM_SKIP(3)) + ROMX_LOAD("070_8000_007_boot_2.h1d9", 0x000002, 0x010000, CRC(569146ad) SHA1(5442a13ed93afdaa55c1951b97e335cf60dde834), ROM_BIOS(1) | ROM_SKIP(3)) + ROMX_LOAD("070_8000_007_boot_3.h1e6", 0x000003, 0x010000, CRC(682977c3) SHA1(d9bcf7cdc5caef4221929fe26eccf34253fa7f29), ROM_BIOS(1) | ROM_SKIP(3)) ROM_END -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP(1988, 4d20, 0, 0, configure, 0, ip6_state, initialize, "Silicon Graphics Inc", "4D/20", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) +ROM_START(4d25) + ROM_REGION32_BE(0x40000, "boot", 0) + ROM_SYSTEM_BIOS(0, "3.2e", "Version 3.2 Rev E, Fri Jul 14 14:37:38 PDT 1989 SGI") + ROMX_LOAD("070_8000_007_boot_0.h1c5", 0x000000, 0x010000, CRC(e448b865) SHA1(f0276b76360ea0b3250dbdaa7a1e57ea8f6144d6), ROM_BIOS(0) | ROM_SKIP(3)) + ROMX_LOAD("070_8000_007_boot_1.h1d2", 0x000001, 0x010000, CRC(59fda717) SHA1(ef3ccb1f8a815e7b13c79deeea0d73006deed09f), ROM_BIOS(0) | ROM_SKIP(3)) + ROMX_LOAD("070_8000_007_boot_2.h1d9", 0x000002, 0x010000, CRC(569146ad) SHA1(5442a13ed93afdaa55c1951b97e335cf60dde834), ROM_BIOS(0) | ROM_SKIP(3)) + ROMX_LOAD("070_8000_007_boot_3.h1e6", 0x000003, 0x010000, CRC(682977c3) SHA1(d9bcf7cdc5caef4221929fe26eccf34253fa7f29), ROM_BIOS(0) | ROM_SKIP(3)) +ROM_END + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP(1988, 4d20, 0, 0, pi4d20, 0, pi4d2x_state, initialize, "Silicon Graphics Inc", "Personal Iris 4D/20", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) +COMP(1989, 4d25, 0, 0, pi4d25, 0, pi4d2x_state, initialize, "Silicon Graphics Inc", "Personal Iris 4D/25", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 44ffc49cafe..41f761bd98b 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -93,7 +93,8 @@ undoukai // A17 (c) 1984 Taito 4d410 // (c) SGI 1991 @source:4dpi.cpp -4d20 // IP6: Personal Iris 4D/20, R2000 @12.5MHz +4d20 // IP6: Personal Iris 4D/20, R2000 @12.5MHz +4d25 // IP10: Personal Iris 4D/25, R3000 @20MHz @source:4enlinea.cpp 4enlinea // (c) 1991 System Compumatic