diff --git a/bios/Id Software/Quake/id1/pak0.pak b/bios/Id Software/Quake/id1/pak0.pak
new file mode 100644
index 00000000..88c2532d
Binary files /dev/null and b/bios/Id Software/Quake/id1/pak0.pak differ
diff --git a/bios/Sega/Model 3/Config/.variants/Games.xml.84b66c6c b/bios/Sega/Model 3/Config/.variants/Games.xml.84b66c6c
new file mode 100644
index 00000000..bfeab722
--- /dev/null
+++ b/bios/Sega/Model 3/Config/.variants/Games.xml.84b66c6c
@@ -0,0 +1,3250 @@
+
+
+
+
+ Sega Bass Fishing
+ USA, Deluxe
+ Sega
+ 1997
+
+
+ Sega Model 3
+ 1.0
+ MPC106
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Get Bass: Sega Bass Fishing
+ Japan, Deluxe
+ Sega
+ 1997
+
+
+ Sega Model 3
+ 1.0
+ MPC106
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Get Bass: Sega Bass Fishing
+ Japan, Upright
+ Sega
+ 1997
+
+
+ Sega Model 3
+ 1.0
+ MPC106
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Get Bass: Sega Bass Fishing
+ Japan, Standard
+ Sega
+ 1997
+
+
+ Sega Model 3
+ 1.0
+ MPC106
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Daytona USA 2 - Battle on the Edge
+ Japan, Revision A
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 2.1
+ DSB2
+ Wheel
+ 24
+ true
+
+
+
+
+
+
+
+ 0x29250e16
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Daytona USA 2 - Power Edition
+ Japan
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 2.1
+ DSB2
+ Wheel
+ true
+
+
+
+
+
+
+
+ 0x29222CC4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dirt Devils
+ Export, Revision A
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 2.1
+ DSB2
+ Wheel
+ 0x16C311DB
+ true
+
+
+
+
+
+
+
+ 0x29290f17
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dirt Devils
+ USA, Revision A
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 2.1
+ DSB2
+ Wheel
+ 0x16C311DB
+ true
+
+
+
+
+
+
+
+ 0x29290f17
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dirt Devils
+ Australia, Revision A
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 2.1
+ DSB2
+ Wheel
+ 0x16C311DB
+ true
+
+
+
+
+
+
+
+ 0x29290f17
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dirt Devils
+ Japan, Revision A
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 2.1
+ DSB2
+ Wheel
+ 0x16C311DB
+ true
+
+
+
+
+
+
+
+ 0x29290f17
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dirt Devils
+ Export, Ver. G?
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 2.1
+ DSB2
+ Wheel
+ 0x16C311DB
+ true
+
+
+
+
+
+
+
+ 0x29290f17
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Emergency Call Ambulance
+ Export
+ Sega
+ 1999
+
+
+ Sega Model 3
+ 2.1
+ Wheel
+
+
+
+
+
+
+
+ 0x2923aa91
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Emergency Call Ambulance
+ US location test?
+ Sega
+ 1999
+
+
+ Sega Model 3
+ 2.1
+ Wheel
+
+
+
+
+
+
+
+ 0x2923aa91
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Emergency Call Ambulance
+ USA
+ Sega
+ 1999
+
+
+ Sega Model 3
+ 2.1
+ Wheel
+
+
+
+
+
+
+
+ 0x2923aa91
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Emergency Call Ambulance
+ Japan
+ Sega
+ 1999
+
+
+ Sega Model 3
+ 2.1
+ Wheel
+
+
+
+
+
+
+
+ 0x2923aa91
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Fighting Vipers 2
+ Japan, Revision A
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 2.0
+ Billboard
+ 24
+
+
+
+
+
+
+ 0x29260e96
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Fighting Vipers 2
+ ?
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 2.0
+ 24
+
+
+
+
+
+
+ 0x29260e96
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Harley-Davidson and L.A. Riders
+ Revision B
+ Sega
+ 1997
+
+
+ Sega Model 3
+ 2.0
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Harley-Davidson and L.A. Riders
+ Revision A
+ Sega
+ 1997
+
+
+ Sega Model 3
+ 2.0
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ L.A. Machineguns: Rage of the Machines
+ Japan
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 2.1
+ 0x16C311DB
+
+
+
+
+
+ 0x292A2BC5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Le Mans 24
+ Japan, Revision B
+ Sega
+ 1997
+
+
+ Sega Model 3
+ 1.5
+ Wheel
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The Lost World
+ Japan, Revision A
+ Sega
+ 1997
+
+
+ Sega Model 3
+ 1.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The Lost World
+
+ Location Test
+ Sega
+ 1997
+
+
+ Sega Model 3
+ 1.5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Magical Truck Adventure
+ Japan
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 2.1
+ 0x16C311DB
+
+
+
+
+ 0x29266e45
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The Ocean Hunter
+ Japan
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 2.1
+
+
+
+
+
+ 0x292B6A01
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Scud Race
+ Export, Twin/DX
+ Sega
+ 1996
+
+
+ Sega Model 3
+ 1.5
+ DSB1
+ Wheel
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Scud Race
+ Australia, Twin/DX
+ Sega
+ 1996
+
+
+ Sega Model 3
+ 1.5
+ DSB1
+ Wheel
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Scud Race
+ Export, Deluxe
+ Sega
+ 1996
+
+
+ Sega Model 3
+ 1.5
+ DSB1
+ Wheel
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Scud Race Plus
+ Export, Twin/DX, Revision A
+ Sega
+ 1997
+
+
+ Sega Model 3
+ 1.5
+ DSB1
+ Wheel
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Scud Race Plus
+ Export, Twin/DX
+ Sega
+ 1997
+
+
+ Sega Model 3
+ 1.5
+ DSB1
+ Wheel
+ MPC106
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Ski Champ
+ Japan
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 2.0
+ Ski
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Spikeout Final Edition
+ Export
+ Sega
+ 1999
+
+
+ Sega Model 3
+ 2.1
+ DSB2
+ true
+
+
+
+
+
+ 0x29236fc8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Spikeout
+ Export, Revision C
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 2.1
+ DSB2
+ true
+
+
+
+
+
+ 0x292f2b04
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sega Rally 2
+ Export
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 2.0
+ DSB2
+ Wheel
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sega Rally 2
+ Prototype
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 2.0
+ DSB2
+ Wheel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sega Rally 2
+ Prototype Version A
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 2.0
+ DSB2
+ Wheel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sega Rally 2
+ Export, Deluxe
+ Sega
+ 1998
+
+
+
+ Sega Model 3
+ 2.0
+ DSB2
+ Wheel
+ 48
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Star Wars Trilogy Arcade
+ Export, Revision A
+ Sega, LucasArts
+ 1998
+
+
+ Sega Model 3
+ 2.1
+ DSB2
+ Joystick
+
+
+
+
+ 0x31272A01
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Star Wars Trilogy Arcade
+ Export
+ Sega, LucasArts
+ 1998
+
+
+ Sega Model 3
+ 2.1
+ DSB2
+ Joystick
+
+
+
+
+ 0x31272A01
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Star Wars Trilogy Arcade
+ Location Test, 16.09.98
+ Sega, LucasArts
+ 1998
+
+
+ Sega Model 3
+ 2.1
+ DSB2
+ Joystick
+
+
+
+
+ 0x31272A01
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Virtua Fighter 3
+ Revision D
+ Sega
+ 1996
+
+
+ Sega Model 3
+ 1.0
+ Billboard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Virtua Fighter 3
+ Revision A
+ Sega
+ 1996
+
+
+ Sega Model 3
+ 1.0
+ Billboard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Virtua Fighter 3
+ Revision C
+ Sega
+ 1996
+
+
+ Sega Model 3
+ 1.0
+ Billboard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Virtua Fighter 3 Team Battle
+ ?
+ Sega
+ 1996
+
+
+ Sega Model 3
+ 1.0
+ Billboard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Virtual On 2: Oratorio Tangram
+ Revision B
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 2.0
+ Billboard
+ 0x16C311DB
+ true
+
+
+
+
+ 0x292a0e97
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Virtual On 2: Oratorio Tangram
+ Ver 5.4g
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 2.0
+ Billboard
+ 0x16C311DB
+ true
+
+
+
+
+ 0x292a0e97
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Virtual On 2: Oratorio Tangram
+ Revision A
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 2.0
+ Billboard
+ 0x16C311DB
+ true
+
+
+
+
+ 0x292a0e97
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Virtual On 2: Oratorio Tangram
+ ?
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 2.0
+ Billboard
+ 0x16C311DB
+ true
+
+
+
+
+ 0x292a0e97
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Virtua Striker 2
+ Step 2.0
+ Sega
+ 1997
+
+
+ Sega Model 3
+ 2.0
+ Billboard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Virtua Striker 2
+ Step 1.5
+ Sega
+ 1997
+
+
+ Sega Model 3
+ 1.5
+ Billboard
+ MPC106
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Virtua Striker 2
+ Step 1.5, older
+ Sega
+ 1997
+
+
+ Sega Model 3
+ 1.5
+ Billboard
+ MPC106
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Virtua Striker 2 '98
+ Step 2.0
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 2.0
+ Billboard
+
+
+
+
+
+
+ 0x29234e96
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Virtua Striker 2 '98
+ Step 1.5
+ Sega
+ 1998
+
+
+ Sega Model 3
+ 1.5
+ Billboard
+ MPC106
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Virtua Striker 2 '99.1
+ Export, USA, Revision B
+ Sega
+ 1999
+
+
+ Sega Model 3
+ 2.1
+ Billboard
+
+
+
+
+
+
+ 0x29222ac8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Virtua Striker 2 '99
+ Export, USA, Revision A
+ Sega
+ 1999
+
+
+ Sega Model 3
+ 2.1
+ Billboard
+
+
+
+
+
+
+ 0x29222ac8
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Virtua Striker 2 '99
+ Export, USA
+ Sega
+ 1999
+
+
+ Sega Model 3
+ 2.1
+ Billboard
+
+
+
+
+
+
+ 0x29222ac8
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Virtua Striker 2 '99.1
+ Japan, Revision B
+ Sega
+ 1999
+
+
+ Sega Model 3
+ 2.1
+ Billboard
+
+
+
+
+
+
+ 0x29222ac8
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Virtua Striker 2 '99.1
+ Step 1.5 Export, USA, Revision B
+ Sega
+ 1999
+
+
+ Sega Model 3
+ 1.5
+ Billboard
+ MPC106
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Virtua Striker 2 '99
+ Step 1.5 Export, USA
+ Sega
+ 1999
+
+
+ Sega Model 3
+ 1.5
+ MPC106
+ Billboard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Virtua Striker 2 '99.1
+ Step 1.5 Japan, Revision B
+ Sega
+ 1999
+
+
+ Sega Model 3
+ 1.5
+ MPC106
+ Billboard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/emulators/supermodel-legacy.yml b/emulators/supermodel-legacy.yml
new file mode 100644
index 00000000..47c85215
--- /dev/null
+++ b/emulators/supermodel-legacy.yml
@@ -0,0 +1,73 @@
+emulator: Supermodel Legacy
+type: standalone
+core_classification: frozen_snapshot
+source: "https://github.com/trzy/Supermodel"
+upstream: "https://github.com/trzy/Supermodel"
+profiled_date: "2026-10-17"
+source_commit: "0eef09ba2b74e48fd5cfd388ee69a3743fd5f618"
+pin_frozen: "Batocera's supermodel-legacy package builds this revision, held before the renderer moved to OpenGL 4.1. Recaling would repoint these refs at code this build never had."
+core_version: "0.3a-WIP"
+display_name: "Sega - Model 3 (Supermodel Legacy)"
+cores:
+ - "supermodel-legacy"
+systems:
+ - "sega-model3"
+
+notes: |
+ Supermodel at trzy/Supermodel 0eef09b of 2022-08-19, the revision Batocera
+ builds as supermodel-legacy for boards without OpenGL 4.1, the version the
+ renderer moved to after it. Batocera applies five patches; 001 rewrites the
+ fixed paths below, the others touch the INI template, the build rules, audio
+ volume and an evdev light gun input system.
+ ref: Src/Version.h:32
+
+ All paths are compiled in and relative to the working directory: Config/Games.xml,
+ Config/Supermodel.ini, NVRAM/.nv and Saves/.st. There is no
+ per-OS path resolution at this revision. Batocera's patch replaces them with
+ /usr/share/supermodel/Games.xml, /userdata/system/configs/supermodel/Supermodel.ini,
+ /userdata/saves/supermodel/NVRAM/.nv and /userdata/saves/supermodel/.st.
+ ref: Src/OSD/SDL/Main.cpp:1320-1321, Src/OSD/SDL/Main.cpp:579, Src/OSD/SDL/Main.cpp:638,
+ Src/OSD/SDL/Main.cpp:661
+
+ ROM sets are MAME format per game archives identified by the CRC32 values in
+ Games.xml, 60 sets at this revision. A child set missing files makes the loader
+ open .zip from the same directory; parents are regional or revision
+ variants of one game, not a shared BIOS. Each Model 3 board carries its own
+ program, video, sound and drive board ROMs, so no system ROM is read outside
+ those archives.
+ ref: Src/GameLoader.cpp:858-893
+
+ Supermodel.ini is optional: when it cannot be opened the compiled-in defaults
+ apply. The emulator writes it only after interactive input configuration.
+ Batocera generates it from its own template before each launch.
+ ref: Src/Util/ConfigBuilders.cpp:134-142, Src/OSD/SDL/Main.cpp:1356-1358,
+ Src/OSD/SDL/Main.cpp:1861
+
+ NVRAM/.nv is loaded after the ROMs when present, silently skipped when
+ absent, and written on exit. Batocera ships 43 .nv files, copied into
+ the save directory by its launcher, preset so the games start without a
+ pass through the service menu.
+ ref: Src/OSD/SDL/Main.cpp:656-688, Src/OSD/SDL/Main.cpp:900, Src/OSD/SDL/Main.cpp:1297
+
+ Crosshairs are drawn as GL primitives; no Assets/ bitmap and no Music.xml are
+ read at this revision. External GLSL shaders are read only when a VertexShader
+ or FragmentShader key names a file, and all six keys default to empty.
+ ref: Src/OSD/SDL/Main.cpp:703-712, Src/OSD/SDL/Main.cpp:1420-1425,
+ Src/Graphics/Shader.cpp:93-100
+
+files:
+ - name: "Games.xml"
+ path: "Config/Games.xml"
+ required: true
+ bundled: true
+ size: 152488
+ sha1: "599a74894c61c1849e2aeff17507c233e2f459d6"
+ md5: "84b66c6c9eb9370e983d88c4d187ea05"
+ description: "ROM set definitions"
+ note: "Parsed by the GameLoader constructor before the ROM archive is opened. A file that fails to parse leaves no game defined, no set in the archive is recognised, and main returns 1. The path is the GameXMLFile key, so -game-xml-file moves it; Batocera's patch sets the default to /usr/share/supermodel/Games.xml. The hash is that of Config/Games.xml at the pinned revision, which Batocera installs."
+ source_ref: "Src/OSD/SDL/Main.cpp:1321, Src/OSD/SDL/Main.cpp:1412, Src/OSD/SDL/Main.cpp:1866-1874, Src/GameLoader.cpp:492-502, Src/GameLoader.cpp:689-693, Src/GameLoader.cpp:895-898"
+
+exclusion_note: >
+ The Sega Model 3 has no shared system BIOS. Program, video, sound and drive
+ board ROMs are all inside per-game MAME-format archives identified by the
+ CRC32 values in Games.xml.
diff --git a/emulators/vkquake.yml b/emulators/vkquake.yml
new file mode 100644
index 00000000..23737143
--- /dev/null
+++ b/emulators/vkquake.yml
@@ -0,0 +1,80 @@
+emulator: vkQuake
+type: standalone
+core_classification: game_engine
+source: "https://github.com/Novum/vkQuake"
+upstream: "https://sourceforge.net/projects/quakespasm/"
+profiled_date: "2026-10-17"
+source_commit: "6f9c012a9176ee36663fd7a6d30b6291a0dbbcc1"
+core_version: "1.33.0"
+display_name: "Quake (vkQuake)"
+cores: ["vkquake"]
+systems: [quake]
+
+notes: |
+ Vulkan Quake engine derived from QuakeSpasm. VKQUAKE_VERSION 1.33,
+ VKQUAKE_VER_PATCH 0 (Quake/quakever.h:37-41). GAMENAME = "id1"
+ (Quake/quakedef.h:37).
+
+ COM_InitFilesystem takes the base directory from -basedir, otherwise
+ host_parms->basedir (Quake/common.c:2463-2467). COM_AddGameDirectory
+ opens //pak0.pak, pak1.pak, ... and stops at the first
+ index that does not open (Quake/common.c:2241-2245). Right after
+ id1/pak0.pak it mounts vkquake.pak, built from Misc/vq_pak and embedded
+ in the binary (Quake/common.c:2257-2282); it carries default.cfg, three
+ menu pictures and entity fixes, no gfx.wad and no palette.
+
+ gfx.wad and gfx/colormap.lmp come from id1/pak0.pak; without either the
+ engine stops with Sys_Error (Quake/wad.c:80-87, Quake/host.c:1093-1095).
+ gfx/pop.lmp, present only in the registered id1/pak1.pak, sets the
+ registered cvar (Quake/common.c:1458-1484).
+
+ COM_LoadPackFile compares the file count (339) and the CRC of the pak
+ directory against id1/pak0.pak v1.00, v1.01 and v1.06
+ (Quake/common.c:56-59, 2105-2118). A mismatch only sets com_modified;
+ the file is still mounted. With com_modified set and no gfx/pop.lmp the
+ engine stops (Quake/common.c:1464-1470), so -game, -hipnotic and -rogue,
+ whose paks differ from id1/pak0.pak, need the registered id1/pak1.pak.
+
+ -rogue and -hipnotic add rogue/ and hipnotic/ after id1/
+ (Quake/common.c:2507-2510). Batocera 43.1 runs
+ `vkquake -basedir /userdata/roms/quake` and adds -hipnotic or -rogue
+ from the ROM name (configgen generators/vkquake/vkquakeGenerator.py).
+
+ Background music is streamed from /music/trackNN., ogg, opus,
+ flac, mp3 and wav, when present (Quake/bgmusic.c:29, 321).
+
+files:
+ - name: "pak0.pak"
+ category: game_data
+ system: quake
+ path: "id1/pak0.pak"
+ required: true
+ source_ref: "Quake/common.c:2241-2245 (pak%i.pak loop), 2496 (id1 by default); Quake/wad.c:80-87 (gfx.wad fatal)"
+ note: "Shareware and registered Quake data, one file in both releases. Directory CRC compared to v1.00, v1.01, v1.06; a mismatch does not refuse the file."
+
+ - name: "pak1.pak"
+ category: game_data
+ system: quake
+ path: "id1/pak1.pak"
+ required: false
+ source_ref: "Quake/common.c:2241-2245 (pak%i.pak loop), 1458-1470 (gfx/pop.lmp, registered check)"
+ note: "Registered episodes 2 to 4. Read only after pak0.pak opens. Needed by -hipnotic, -rogue and -game."
+ unsourceable: "retail data the collection does not hold; a same-named file of another game must not stand in"
+
+ - name: "pak0.pak"
+ category: game_data
+ system: quake
+ path: "hipnotic/pak0.pak"
+ required: false
+ source_ref: "Quake/common.c:2509-2510 (-hipnotic), 2241-2245 (pak%i.pak loop)"
+ note: "Scourge of Armagon data. Loaded with -hipnotic."
+ unsourceable: "retail data the collection does not hold; a same-named file of another game must not stand in"
+
+ - name: "pak0.pak"
+ category: game_data
+ system: quake
+ path: "rogue/pak0.pak"
+ required: false
+ source_ref: "Quake/common.c:2507-2508 (-rogue), 2241-2245 (pak%i.pak loop)"
+ note: "Dissolution of Eternity data. Loaded with -rogue."
+ unsourceable: "retail data the collection does not hold; a same-named file of another game must not stand in"
diff --git a/emulators/vkquake2.yml b/emulators/vkquake2.yml
new file mode 100644
index 00000000..6669fb50
--- /dev/null
+++ b/emulators/vkquake2.yml
@@ -0,0 +1,107 @@
+emulator: vkQuake2
+type: standalone
+core_classification: game_engine
+source: "https://github.com/kondrak/vkQuake2"
+upstream: "https://github.com/id-Software/Quake-2"
+profiled_date: "2026-10-17"
+source_commit: "5bf9c012024884234df0f63c615daec0c740def7"
+core_version: "1.5.10"
+display_name: "Quake II (vkQuake2)"
+cores: ["vkquake2"]
+systems: [quake2, xatrix, rogue, ctf]
+
+notes: |
+ Quake II 3.21 with a Vulkan renderer. VERSION 3.21, VKQUAKE2_VERSION
+ "1.5.10", BASEDIRNAME = "baseq2" (qcommon/qcommon.h:26-30).
+
+ FS_InitFilesystem reads the basedir cvar, default ".", and mounts
+ /baseq2 (qcommon/files.c:858, 872). A non-empty game cvar adds
+ / on top (qcommon/files.c:878-880, 640).
+ FS_AddGameDirectory tries pak0.pak through pak9.pak in each directory and
+ skips an index that does not open (qcommon/files.c:537-542).
+
+ FS_LoadPackFile computes a checksum of the pak directory, but the
+ comparison against PAK0_CHECKSUM only runs with NO_ADDONS, which is
+ commented out (qcommon/files.c:24, 28, 484-489). No pak is rejected for
+ its contents. The Vulkan renderer, vid_ref default "vk"
+ (linux/vid_so.c:448), stops with ERR_FATAL when pics/colormap.pcx is
+ missing (ref_vk/vk_image.c:1640-1642); that file is in baseq2/pak0.pak.
+
+ Batocera 43.1 copies /usr/bin/vkquake2 (binary, ref_*.so and the game
+ libraries of baseq2, ctf, rogue, smd, xatrix, zaero) into
+ /userdata/roms/quake2, changes to that directory and runs ./quake2, with
+ `+set game rogue|xatrix|zaero|smd` chosen from the ROM name (configgen
+ generators/vkquake2/vkquake2Generator.py). The basedir is therefore
+ /userdata/roms/quake2.
+
+ Music is read from /music/trackNN.ogg, .flac, .mp3 or .wav,
+ then from baseq2/music/ (client/snd_miniaudio.c:215-220, 241-246).
+
+files:
+ - name: "pak0.pak"
+ category: game_data
+ system: quake2
+ path: "baseq2/pak0.pak"
+ required: true
+ source_ref: "qcommon/files.c:872 (baseq2 mounted), 537-542 (pak%i.pak loop); ref_vk/vk_image.c:1640-1642 (pics/colormap.pcx fatal)"
+ note: "Retail Quake II data. Not hash-checked."
+
+ - name: "pak1.pak"
+ category: game_data
+ system: quake2
+ path: "baseq2/pak1.pak"
+ required: false
+ source_ref: "qcommon/files.c:537-542"
+ note: "Shipped by the 3.20 point release."
+
+ - name: "pak2.pak"
+ category: game_data
+ system: quake2
+ path: "baseq2/pak2.pak"
+ required: false
+ source_ref: "qcommon/files.c:537-542"
+ note: "Shipped by the 3.20 point release."
+
+ - name: "pak0.pak"
+ category: game_data
+ system: xatrix
+ path: "xatrix/pak0.pak"
+ required: false
+ source_ref: "qcommon/files.c:878-880 (game cvar), 640 (game dir mounted), 537-542"
+ note: "The Reckoning data. Loaded with `+set game xatrix`."
+ unsourceable: "retail data the collection does not hold; a same-named file of another game must not stand in"
+
+ - name: "pak0.pak"
+ category: game_data
+ system: rogue
+ path: "rogue/pak0.pak"
+ required: false
+ source_ref: "qcommon/files.c:878-880 (game cvar), 640 (game dir mounted), 537-542"
+ note: "Ground Zero data. Loaded with `+set game rogue`."
+ unsourceable: "retail data the collection does not hold; a same-named file of another game must not stand in"
+
+ - name: "pak0.pak"
+ category: game_data
+ system: ctf
+ path: "ctf/pak0.pak"
+ required: false
+ source_ref: "qcommon/files.c:878-880 (game cvar), 640 (game dir mounted), 537-542"
+ note: "Three Wave CTF data from the 3.20 point release. Loaded with `+set game ctf`."
+
+ - name: "pak0.pak"
+ category: game_data
+ system: quake2
+ path: "zaero/pak0.pak"
+ required: false
+ source_ref: "qcommon/files.c:878-880 (game cvar), 640 (game dir mounted), 537-542"
+ note: "Zaero data. Loaded with `+set game zaero`."
+ unsourceable: "data the collection does not hold; a same-named file of another game must not stand in"
+
+ - name: "pak0.pak"
+ category: game_data
+ system: quake2
+ path: "smd/pak0.pak"
+ required: false
+ source_ref: "qcommon/files.c:878-880 (game cvar), 640 (game dir mounted), 537-542"
+ note: "Slight Mechanical Destruction data. Loaded with `+set game smd`."
+ unsourceable: "data the collection does not hold; a same-named file of another game must not stand in"
diff --git a/emulators/vkquake3.yml b/emulators/vkquake3.yml
new file mode 100644
index 00000000..c3c716df
--- /dev/null
+++ b/emulators/vkquake3.yml
@@ -0,0 +1,147 @@
+emulator: vkQuake3
+type: standalone
+core_classification: game_engine
+source: "https://github.com/suijingfeng/vkQuake3"
+upstream: "https://github.com/ioquake/ioq3"
+profiled_date: "2026-10-17"
+source_commit: "5300b32803c1c61bc3b6bdf86a084c1db1a217ad"
+core_version: "1.36"
+display_name: "Quake III Arena (vkQuake3)"
+cores: ["vkquake3"]
+systems: [quake3, teamarena]
+
+notes: |
+ ioquake3 fork with a Vulkan renderer. PRODUCT_VERSION "1.36",
+ BASEGAME = "baseq3", BASETA = "missionpack" (code/qcommon/q_shared.h:45,
+ 68, 71). NUM_ID_PAKS 9, NUM_TA_PAKS 4 (code/qcommon/qcommon.h:597-598).
+
+ fs_basepath defaults to Sys_DefaultInstallPath, the directory of the
+ binary (code/qcommon/files.c:3323, code/sys/sys_main.c:88-94, 738).
+ FS_Startup mounts baseq3 under fs_basepath and fs_homepath, then fs_game
+ when set (code/qcommon/files.c:3362-3377, 3396-3409). FS_AddGameDirectory
+ mounts every .pk3 of each directory (code/qcommon/files.c:2933).
+
+ FS_CheckPak0 compares the pak checksum of baseq3/pak0.pk3 through
+ pak8.pk3 and missionpack/pak0.pk3 through pak3.pk3 to pak_checksums[] and
+ missionpak_checksums[] (code/qcommon/files.c:179-197, 3486, 3516). The
+ value is a block checksum over the CRC32 of every member
+ (code/qcommon/files.c:2111), not a file hash. A mismatch prints a warning and the pak stays
+ mounted. A missing baseq3 pak is fatal unless the engine runs standalone,
+ which needs com_basegame other than baseq3 (code/qcommon/files.c:3570-3572,
+ 3596-3619). Once any Team Arena pak is found the four are required
+ (code/qcommon/files.c:3622-3640). demoq3/pak0.pk3 with
+ DEMO_PAK0_CHECKSUM counts as baseq3/pak0.pk3 (code/qcommon/files.c:178,
+ 3475-3479, 3580-3590).
+
+ Batocera 43.1 installs the binary as /usr/bin/ioquake3/ioquake3 and runs
+ it through the ioquake3 generator, which copies /usr/bin/ioquake3 into
+ /userdata/roms/quake3 and starts /userdata/roms/quake3/ioquake3 with the
+ arguments written in the ROM file (configgen
+ generators/ioquake3/ioquake3Generator.py). fs_basepath is therefore
+ /userdata/roms/quake3. Patch 001-config-dir.patch sets
+ HOMEPATH_NAME_UNIX to "/configs/ioquake3", appended to $HOME
+ (code/sys/sys_unix.c:65, 79).
+
+files:
+ - name: "pak0.pk3"
+ category: game_data
+ system: quake3
+ path: "baseq3/pak0.pk3"
+ required: true
+ source_ref: "code/qcommon/files.c:180 (pak_checksums[0]=1566731103u), 3486 (checksum compare), 3596-3619 (fatal when a baseq3 pak is absent)"
+ note: "Retail Quake III Arena pak. A checksum mismatch prints a warning, the file is not refused."
+ unsourceable: "retail data the collection does not hold; a same-named file of another game must not stand in"
+
+ - name: "pak1.pk3"
+ category: game_data
+ system: quake3
+ path: "baseq3/pak1.pk3"
+ required: true
+ source_ref: "code/qcommon/files.c:181 (pak_checksums[1]=298122907u), 3596-3619 (fatal when a baseq3 pak is absent)"
+
+ - name: "pak2.pk3"
+ category: game_data
+ system: quake3
+ path: "baseq3/pak2.pk3"
+ required: true
+ source_ref: "code/qcommon/files.c:182 (pak_checksums[2]=412165236u), 3596-3619 (fatal when a baseq3 pak is absent)"
+
+ - name: "pak3.pk3"
+ category: game_data
+ system: quake3
+ path: "baseq3/pak3.pk3"
+ required: true
+ source_ref: "code/qcommon/files.c:183 (pak_checksums[3]=2991495316u), 3596-3619 (fatal when a baseq3 pak is absent)"
+
+ - name: "pak4.pk3"
+ category: game_data
+ system: quake3
+ path: "baseq3/pak4.pk3"
+ required: true
+ source_ref: "code/qcommon/files.c:184 (pak_checksums[4]=1197932710u), 3596-3619 (fatal when a baseq3 pak is absent)"
+
+ - name: "pak5.pk3"
+ category: game_data
+ system: quake3
+ path: "baseq3/pak5.pk3"
+ required: true
+ source_ref: "code/qcommon/files.c:185 (pak_checksums[5]=4087071573u), 3596-3619 (fatal when a baseq3 pak is absent)"
+
+ - name: "pak6.pk3"
+ category: game_data
+ system: quake3
+ path: "baseq3/pak6.pk3"
+ required: true
+ source_ref: "code/qcommon/files.c:186 (pak_checksums[6]=3709064859u), 3596-3619 (fatal when a baseq3 pak is absent)"
+
+ - name: "pak7.pk3"
+ category: game_data
+ system: quake3
+ path: "baseq3/pak7.pk3"
+ required: true
+ source_ref: "code/qcommon/files.c:187 (pak_checksums[7]=908855077u), 3596-3619 (fatal when a baseq3 pak is absent)"
+
+ - name: "pak8.pk3"
+ category: game_data
+ system: quake3
+ path: "baseq3/pak8.pk3"
+ required: true
+ source_ref: "code/qcommon/files.c:188 (pak_checksums[8]=977125798u), 3596-3619 (fatal when a baseq3 pak is absent)"
+
+ - name: "pak0.pk3"
+ category: game_data
+ system: quake3
+ path: "demoq3/pak0.pk3"
+ required: false
+ source_ref: "code/qcommon/files.c:178 (DEMO_PAK0_CHECKSUM=2985612116u), 3475-3479 (demoq3 pak0 checksum compare), 3580-3590 (counted as baseq3/pak0.pk3)"
+ note: "Demo pak. Recognised only under demoq3/ with this checksum; the engine then prints a warning and counts baseq3/pak0.pk3 as found."
+
+ - name: "pak0.pk3"
+ category: game_data
+ system: teamarena
+ path: "missionpack/pak0.pk3"
+ required: false
+ source_ref: "code/qcommon/files.c:193 (missionpak_checksums[0]=2430342401u), 3622-3640 (fatal when a Team Arena pak is absent)"
+ note: "Team Arena pak. Read with `+set fs_game missionpack`."
+ unsourceable: "retail data the collection does not hold; a same-named file of another game must not stand in"
+
+ - name: "pak1.pk3"
+ category: game_data
+ system: teamarena
+ path: "missionpack/pak1.pk3"
+ required: false
+ source_ref: "code/qcommon/files.c:194 (missionpak_checksums[1]=511014160u), 3622-3640 (fatal when a Team Arena pak is absent)"
+
+ - name: "pak2.pk3"
+ category: game_data
+ system: teamarena
+ path: "missionpack/pak2.pk3"
+ required: false
+ source_ref: "code/qcommon/files.c:195 (missionpak_checksums[2]=2662638993u), 3622-3640 (fatal when a Team Arena pak is absent)"
+
+ - name: "pak3.pk3"
+ category: game_data
+ system: teamarena
+ path: "missionpack/pak3.pk3"
+ required: false
+ source_ref: "code/qcommon/files.c:196 (missionpak_checksums[3]=1438664554u), 3622-3640 (fatal when a Team Arena pak is absent)"