diff --git a/hash/sun_sparc.xml b/hash/sun_sparc.xml
new file mode 100644
index 0000000000000..a5ef0218a1ecc
--- /dev/null
+++ b/hash/sun_sparc.xml
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+ Solaris 8 10-00 Media - SPARC Platform Edition for Sun Computer Systems
+ 2000
+ Sun Microsystems
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sun Management Center 2.1.1 - February 2000 Revision A
+ 2000
+ Sun Microsystems
+
+
+
+
+
+
+
+
+
+ SunSolutions CD Volume 1 2000
+ 2000
+ Sun Microsystems
+
+
+
+
+
+
+
+
+
+ Raptor GFX Open Windows for Solaris - Version 2.1
+ 1999
+ Tech Source Inc.
+
+
+
+
+
+
+
+
diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua
index 2f3855e57c121..8f4ed7ba58843 100644
--- a/scripts/src/bus.lua
+++ b/scripts/src/bus.lua
@@ -5891,6 +5891,8 @@ if (BUSES["PCI"]~=null) then
MAME_DIR .. "src/devices/bus/pci/opti82c861.h",
MAME_DIR .. "src/devices/bus/pci/pdc20262.cpp",
MAME_DIR .. "src/devices/bus/pci/pdc20262.h",
+ MAME_DIR .. "src/devices/bus/pci/permedia2.cpp",
+ MAME_DIR .. "src/devices/bus/pci/permedia2.h",
MAME_DIR .. "src/devices/bus/pci/promotion.cpp",
MAME_DIR .. "src/devices/bus/pci/promotion.h",
MAME_DIR .. "src/devices/bus/pci/riva128.cpp",
diff --git a/src/devices/bus/pci/pci_slot.cpp b/src/devices/bus/pci/pci_slot.cpp
index ae9d42afc63e0..4c105169e97cd 100644
--- a/src/devices/bus/pci/pci_slot.cpp
+++ b/src/devices/bus/pci/pci_slot.cpp
@@ -19,6 +19,7 @@
#include "opti82c861.h"
#include "oti_spitfire.h"
#include "pdc20262.h"
+#include "permedia2.h"
#include "promotion.h"
#include "riva128.h"
#include "rivatnt.h"
@@ -166,6 +167,8 @@ void pci_cards(device_slot_interface &device)
// assume all natively with class code 03
void agp_cards(device_slot_interface &device)
{
+ // 3Dlabs
+ device.option_add("permedia2", PERMEDIA2);
// nVidia
device.option_add("riva128", RIVA128);
device.option_add("riva128zx", RIVA128ZX);
diff --git a/src/devices/bus/pci/permedia2.cpp b/src/devices/bus/pci/permedia2.cpp
new file mode 100644
index 0000000000000..8966953bc54fb
--- /dev/null
+++ b/src/devices/bus/pci/permedia2.cpp
@@ -0,0 +1,166 @@
+// license:BSD-3-Clause
+// copyright-holders:
+/**************************************************************************************************
+
+
+**************************************************************************************************/
+
+#include "emu.h"
+#include "permedia2.h"
+
+#define LOG_WARN (1U << 1)
+
+#define VERBOSE (LOG_GENERAL | LOG_WARN)
+//#define LOG_OUTPUT_FUNC osd_printf_info
+#include "logmacro.h"
+
+#define LOGWARN(...) LOGMASKED(LOG_WARN, __VA_ARGS__)
+
+
+DEFINE_DEVICE_TYPE(PERMEDIA2, permedia2_device, "permedia2", "3Dlabs Permedia 2")
+
+permedia2_device::permedia2_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : pci_card_device(mconfig, type, tag, owner, clock)
+ , m_vga(*this, "vga")
+ , m_vga_rom(*this, "vga_rom")
+{
+ // TODO: can change class code
+ set_ids(0x104c3d07, 0x01, 0x030100, 0x104c3d07);
+}
+
+permedia2_device::permedia2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : permedia2_device(mconfig, PERMEDIA2, tag, owner, clock)
+
+{
+}
+
+ROM_START( permedia2 )
+ ROM_REGION32_LE( 0x20000, "vga_rom", ROMREGION_ERASEFF )
+ // TODO: 4 other dumps available on VGALegacyMK3, separate Sun versions to own subclass
+ ROM_SYSTEM_BIOS( 0, "creative", "03/03/98 Creative Graphics Blaster Exxtreme" )
+ ROMX_LOAD( "creative.vbi", 0x00000, 0x08000, CRC(3e622da7) SHA1(b06f89777badfdb7cd4c76b414ba19fcaed243c9), ROM_BIOS(0) )
+ // Tech-Source Inc. Raptor GFX
+ ROM_SYSTEM_BIOS( 1, "sparc_1_60", "18/May/2000 (Rev 1.60) for Solaris SPARC" )
+ ROMX_LOAD( "raptor160.u10", 0x00000, 0x20000, CRC(8d6706d5) SHA1(6df6719aa8f46176d837b1b05e90f7e541416b4c), ROM_BIOS(1) )
+ // Tech-Source Inc. Raptor GFX // Half-size ROM?
+ ROM_SYSTEM_BIOS( 2, "sparc_1_11", "07/Jun/1999 (Rev 1.11) for Solaris SPARC" )
+ ROMX_LOAD( "raptor111.bin", 0x00000, 0x10000, CRC(ee21d1f4) SHA1(04845a2e0938b9ecd88934c148e637e6f00e2578), ROM_BIOS(2) )
+ // Tech-Source Inc. Raptor GFX
+ ROM_SYSTEM_BIOS( 3, "sparc_1_10", "15/Mar/1999 (Rev 1.10) for Solaris SPARC" )
+ ROMX_LOAD( "raptor110.bin", 0x00000, 0x20000, CRC(6a6f4ba4) SHA1(89df1a7bc52693e34b79587c16f2c2efb30bd3f1), ROM_BIOS(3) )
+ // Phoenix / 3DLabs generic BIOS for IBM PC Compatible systems
+ ROM_SYSTEM_BIOS( 4, "pc_99", "25/Feb/1999 for IBM PC Compatible" )
+ ROMX_LOAD( "permed2pc.bin", 0x00000, 0x20000, CRC(6711ddf8) SHA1(9f02e4d1a64c42e4a17df8428d8cc9a72e78e0d5), ROM_BIOS(4) )
+
+ROM_END
+
+const tiny_rom_entry *permedia2_device::device_rom_region() const
+{
+ return ROM_NAME(permedia2);
+}
+
+
+void permedia2_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(XTAL(25'174'800), 900, 0, 640, 526, 0, 480);
+ screen.set_screen_update(m_vga, FUNC(vga_device::screen_update));
+
+ // TODO: bump to TVP4020 core
+ VGA(config, m_vga, 0);
+ m_vga->set_screen("screen");
+ // either 4 or 8MB
+ m_vga->set_vram_size(8*1024*1024);
+
+}
+
+void permedia2_device::device_start()
+{
+ pci_card_device::device_start();
+
+ add_map( 128*1024, M_MEM, FUNC(permedia2_device::control_map));
+ add_map(8*1024*1024, M_MEM, FUNC(permedia2_device::aperture1_map));
+ add_map(8*1024*1024, M_MEM, FUNC(permedia2_device::aperture2_map));
+
+ add_rom((u8 *)m_vga_rom->base(), 128*1024 );
+ expansion_rom_base = 0xc0000;
+
+ // INTA#
+ intr_pin = 1;
+}
+
+void permedia2_device::device_reset()
+{
+ pci_card_device::device_reset();
+
+ // TODO: to be checked
+ command = 0x0000;
+ command_mask = 0x0027;
+ status = 0x0000;
+
+ remap_cb();
+}
+
+u8 permedia2_device::capptr_r()
+{
+ return 0x40;
+}
+
+void permedia2_device::config_map(address_map &map)
+{
+ pci_card_device::config_map(map);
+ map(0x40, 0x43).lr32(NAME([] { return 0x0010'0002; }));
+ // AGP 1x + SBA + 31 RQ
+ map(0x44, 0x47).lr32(NAME([] { return 0x1f00'0201; }));
+
+// map(0xf8, 0xf8) CFGIndirectAddress
+// map(0xfc, 0xfc) CFGIndirectData
+}
+
+void permedia2_device::control_map(address_map &map)
+{
+
+}
+
+void permedia2_device::aperture1_map(address_map &map)
+{
+
+}
+
+void permedia2_device::aperture2_map(address_map &map)
+{
+
+}
+
+void permedia2_device::legacy_memory_map(address_map &map)
+{
+ map(0xa0000, 0xbffff).rw(FUNC(permedia2_device::vram_r), FUNC(permedia2_device::vram_w));
+}
+
+void permedia2_device::legacy_io_map(address_map &map)
+{
+ map(0, 0x02f).m(m_vga, FUNC(vga_device::io_map));
+}
+
+uint8_t permedia2_device::vram_r(offs_t offset)
+{
+ return downcast(m_vga.target())->mem_r(offset);
+}
+
+void permedia2_device::vram_w(offs_t offset, uint8_t data)
+{
+ downcast(m_vga.target())->mem_w(offset, data);
+}
+
+void permedia2_device::map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space,
+ uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space)
+{
+ if (command & 7)
+ {
+ memory_space->install_readwrite_handler(0xa0000, 0xbffff, read8sm_delegate(*this, FUNC(permedia2_device::vram_r)), write8sm_delegate(*this, FUNC(permedia2_device::vram_w)));
+
+ io_space->install_device(0x03b0, 0x03df, *this, &permedia2_device::legacy_io_map);
+ //memory_space->install_rom(0xc0000, 0xcffff, (void *)expansion_rom);
+ }
+}
+
diff --git a/src/devices/bus/pci/permedia2.h b/src/devices/bus/pci/permedia2.h
new file mode 100644
index 0000000000000..be397bf6131c7
--- /dev/null
+++ b/src/devices/bus/pci/permedia2.h
@@ -0,0 +1,52 @@
+// license:BSD-3-Clause
+// copyright-holders:
+
+#ifndef MAME_BUS_PCI_PERMEDIA2_H
+#define MAME_BUS_PCI_PERMEDIA2_H
+
+#pragma once
+
+#include "pci_slot.h"
+
+#include "video/pc_vga.h"
+
+class permedia2_device : public pci_card_device
+{
+public:
+ permedia2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ static constexpr feature_type unemulated_features() { return feature::GRAPHICS; }
+
+ void legacy_memory_map(address_map &map) ATTR_COLD;
+ void legacy_io_map(address_map &map) ATTR_COLD;
+
+protected:
+ permedia2_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_add_mconfig(machine_config &config) override;
+
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ virtual void map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space,
+ uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) override;
+
+ virtual void config_map(address_map &map) override;
+
+ virtual u8 capptr_r() override;
+private:
+ required_device m_vga;
+ required_memory_region m_vga_rom;
+
+ u8 vram_r(offs_t offset);
+ void vram_w(offs_t offset, uint8_t data);
+
+ void control_map(address_map &map) ATTR_COLD;
+ void aperture1_map(address_map &map) ATTR_COLD;
+ void aperture2_map(address_map &map) ATTR_COLD;
+};
+
+DECLARE_DEVICE_TYPE(PERMEDIA2, permedia2_device)
+
+#endif // MAME_BUS_PCI_PERMEDIA2_H
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 6f9c077b69bbe..9f1df1c9f8978 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -44625,6 +44625,9 @@ sothello
@source:success/tonton.cpp
tonton
+@source:sun/e250.cpp
+e250
+
@source:sun/sun1.cpp
sun1
diff --git a/src/mame/sun/e250.cpp b/src/mame/sun/e250.cpp
new file mode 100644
index 0000000000000..211d78b6ed899
--- /dev/null
+++ b/src/mame/sun/e250.cpp
@@ -0,0 +1,104 @@
+// license:BSD-3-Clause
+// copyright-holders:
+
+/***********************************************************************************************************
+Skeleton driver for Sun Microsystems Enterprise 250 Server.
+
+Hardware info about Enterprise 250 Server:
+ -Dual 250, 300 or 400 MHz UltraSPARC II with onboard e-cache.
+ -1-MB external cache per processor with 250-MHz CPU or 2-MB per processor with 300 or 400 MHz CPU.
+ -16 DIMM slots, four banks of four slots. 128 MB to 2 GB total memory capacity.
+ -Four full-size slots compliant with PCI specification version 2.1:
+ One slot operating at 33- or 66-MHz, 32- or 64-bit data bus width, 3.3 volt
+ Three slots operating at 33 MHz, 32- or 64-bit data bus width, 5 volt
+ -One 40MB/sec, 68-pin, Ultra SCSI (SCSI-3), 2 channels (synchronous).
+ -Two RS-232D/RS423 serial ports (DB25).
+
+Main components found on its main PCB:
+ -LSI LSA0009 LSI53C876 PCI to Dual Channel SCSI Multifunction Controller.
+ -Sun Microsystems STP2223BGA (PN 100-4611-05) UPA to PCI Interface.
+ -Motorola XPC823ZT66B2 RISC Microprocessor, 32-Bit, 66MHz.
+ -SMSC LAN91C96 Non-PCI Single-Chip Ethernet Controller.
+ -Synergy SY100E11LEJC.
+ -Infineon SAB82532N 10 multiprotocol data communication controller with two symmetrical serial channels.
+ -Sun Microsystems STP2210QFP (PN 100-3988-01) Uniprocessor System Controller (USC).
+ -National Semiconductor ES0012BG DP83840AVCE-1.
+ -National Semiconductor NS0052AJ PC87332VLJ SuperI/O III.
+ -Sun Microsystems STP2003QFP (PN 100-4183-05) LAN Node Controller.
+ -Sun Microsystems STP2202ABGA (ON 100-4671-02).
+ -National Semiconductor ES00116AD DP83223V.
+ -Analog Devices ADM5180JP.
+ -Motorola MC12439.
+
+***********************************************************************************************************/
+
+#include "emu.h"
+
+#include "cpu/powerpc/ppc.h"
+#include "cpu/sparc/sparc.h"
+
+#include "machine/pci.h"
+
+#include "softlist_dev.h"
+
+#include "sun_fcnc_270_4373_07.h"
+//#include "bus/pci/permedia2.h"
+
+
+namespace {
+
+class e250_state : public driver_device
+{
+public:
+ e250_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_subcpu(*this, "subcpu")
+ { }
+
+ void e250(machine_config &config);
+
+private:
+ required_device m_maincpu;
+ required_device m_subcpu;
+};
+
+
+static INPUT_PORTS_START(e250)
+INPUT_PORTS_END
+
+void e250_state::e250(machine_config &config)
+{
+ SPARCV8(config, m_maincpu, 20'000'000); // Actually a UltraSPARC II 250, 300 or 400 MHz
+ //SPARCV8(config, m_maincpu, 20'000'000); // Actually a UltraSPARC II 250, 300 or 400 MHz (optional 2nd CPU)
+
+ // For management console
+ MPC8240(config, m_subcpu, XTAL(66'000'000)); // Actually a Motorola XPC823ZT66B2
+
+ SOFTWARE_LIST(config, "sun_sparc").set_original("sun_sparc");
+
+ PCI_ROOT(config, "pci", 0);
+
+ // PCI Cards
+ SUN_FCNC_270_4373_07(config, "sun_fcnc_270_4373_07"); // Sun Microsystems 270-4373-07 Gigabit Fiber Channel Network Card
+ //PERMEDIA2(config, "permedia2"); // Raptor GFX PCI Video Card
+}
+
+
+ROM_START(e250)
+ ROM_REGION(0x400000, "maincpu", 0)
+ ROM_LOAD( "525-1718-15_a30250_e28f008sa.u2703", 0x000000, 0x100000, CRC(293ac969) SHA1(88fa0c2607bd68bbb209fc8242efeaba60956daa) )
+
+ ROM_REGION(0x400000, "subcpu", 0)
+ ROM_LOAD( "525-1724-08_a29898_e28f008sa.u4401", 0x000000, 0x100000, CRC(567fcc56) SHA1(c6a26b34f61559ec49119eed258666318d551378) ) // VxWorks for management console
+
+ ROM_REGION(0x021000, "nvram", 0)
+ ROM_LOAD( "525-1726-02_stm48t59y-70p10.u2706", 0x000000, 0x002000, CRC(adc6696f) SHA1(97e4d4709ba739e8adbe5298175d38e826c0321f) )
+
+ ROM_REGION(0x008000, "seeprom", 0)
+ ROM_LOAD( "24c02n.u4402", 0x000000, 0x000100, CRC(e98dd85c) SHA1(014e89081945a6c16e1498a2f10604ce64048ae6) ) // Seems to contain passwords
+ROM_END
+
+} // anonymous namespace
+
+COMP( 1998, e250, 0, 0, e250, e250, e250_state, empty_init, "Sun Microsystems", "Enterprise 250", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
diff --git a/src/mame/sun/sun_fcnc_270_4373_07.cpp b/src/mame/sun/sun_fcnc_270_4373_07.cpp
new file mode 100644
index 0000000000000..d8c9dc1aaf37a
--- /dev/null
+++ b/src/mame/sun/sun_fcnc_270_4373_07.cpp
@@ -0,0 +1,42 @@
+// license:BSD-3-Clause
+// copyright-holders:
+
+/*******************************************************************************************
+
+ Skeleton device for Sun Microsystems 270-4373-07 Fiber Channel Network Card.
+ Main components:
+ -Agilent HDMP-1646A.
+ -125 MHz xtal.
+ -Sun Microsystems 100-5234-03 SME2005PBGAC.
+ -LT1587.
+ -Infineon V23826-K305-C13.
+
+*******************************************************************************************/
+
+#include "emu.h"
+#include "sun_fcnc_270_4373_07.h"
+
+DEFINE_DEVICE_TYPE(SUN_FCNC_270_4373_07, sun_fcnc_270_4373_07_device, "sun_fcnc_270_4373_07", "Sun Microsystems 270-4373-07 Gigabit Fiber Channel Network Card")
+
+sun_fcnc_270_4373_07_device::sun_fcnc_270_4373_07_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, SUN_FCNC_270_4373_07, tag, owner, clock)
+{
+}
+
+void sun_fcnc_270_4373_07_device::device_start()
+{
+}
+
+void sun_fcnc_270_4373_07_device::device_add_mconfig(machine_config &config)
+{
+}
+
+ROM_START(sun_fcnc_270_4373_07)
+ ROM_REGION(0x10000, "bios", 0)
+ ROM_LOAD("517543-ee17c8_at29c512.u0901", 0x00000, 0x10000, CRC(d0797304) SHA1(b22046b8b574acf7818ebb00dc8d78c04c170ac0)) // 1.7.0, 22-Jun-1998
+ROM_END
+
+const tiny_rom_entry *sun_fcnc_270_4373_07_device::device_rom_region() const
+{
+ return ROM_NAME(sun_fcnc_270_4373_07);
+}
diff --git a/src/mame/sun/sun_fcnc_270_4373_07.h b/src/mame/sun/sun_fcnc_270_4373_07.h
new file mode 100644
index 0000000000000..544585d98378d
--- /dev/null
+++ b/src/mame/sun/sun_fcnc_270_4373_07.h
@@ -0,0 +1,23 @@
+// license:BSD-3-Clause
+// copyright-holders:
+
+#ifndef MAME_SUN_SUN_FCNC_270_4373_07_H
+#define MAME_SUN_SUN_FCNC_270_4373_07_H
+
+#pragma once
+
+class sun_fcnc_270_4373_07_device : public device_t
+{
+public:
+ sun_fcnc_270_4373_07_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
+ void sun_fcnc_270_4373_07(machine_config &config) ATTR_COLD;
+
+protected:
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
+ virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
+};
+
+DECLARE_DEVICE_TYPE(SUN_FCNC_270_4373_07, sun_fcnc_270_4373_07_device)
+
+#endif // MAME_SUN_SUN_FCNC_270_4373_07_H