Supermodel s’impose comme l’émulateur de référence, initialement développé par Bart Trzynadlowski, Ville Linde et Stefano Teso pour restituer avec une grande fidélité les jeux de la célèbre architecture Sega Model 3 (Scud Race, Daytona USA 2, Le Mans 24, etc.).
Au fil des évolutions du projet, ses contributeurs ont considérablement étendu ses capacités pour intégrer la prise en charge complète des générations d’arcades précédentes, englobant désormais les systèmes Sega Model 1 et Sega Model 2 (avec toutes leurs variantes 2A, 2B et 2C).
Grâce à ses nombreuses optimisations techniques, notamment un rendu graphique moderne exploitant l’accélération GPU, une reproduction fidèle des processeurs et des puces sonores d’origine, ainsi qu’une prise en charge étendue des périphériques de contrôle spécifiques aux bornes d’arcade (volants, boîtes de vitesses, manches de vol et pistolets optiques), Supermodel offre une expérience d’émulation particulièrement fidèle et fluide, permettant de retrouver les grands classiques de l’arcade Sega dans des conditions optimales.
– Anciennes références [ici/là].
– Fichiers de configurations préparés ici.


Les changements:
Le système de mise à jour passe de SVN à GIT, du coup le nom des versions changent, par simplicité j’utiliserai un système par date de release plus compréhensible que le par défaut de GIT.
– Merge pull request #373 from trzy/bart/threads
– Replace SDL concurrency with STL (C++17)
– SCSP: restore SCSP_Deinit(), now empty
– It pairs with SCSP_Init() like the other components’ init and shutdown calls, so CSoundBoard keeps calling it even though the MIDI mutex no longer needs freeing.
– Makefiles: generate the Musashi 68K sources once in parallel builds
– The rule for the five generated files listed them as separate explicit targets, which GNU make treats as five rules sharing a recipe. With -j, make started the generator once per file at the same time; each run truncates and rewrites all five files, so a late run could empty a file that was already being compiled, failing the build intermittently.
– A multi-target pattern rule tells make that one run of the recipe makes all of the targets, in every GNU make version (grouped targets, &:, need 4.3, and macOS ships 3.81).
– SDL audio: update rate control with the audio lock held
– In frame-driven mode, PlayCallback() resets rateErrorFiltered after an under-run (RestartQueue()) with the audio lock held, while OutputAudio() updated it in UpdateRateControl() after releasing the lock. ThreadSanitizer reports this as a data race with -no-threads. Compute the playback rate inside the lock that already reads the queue length.
– SCSP: read the MIDI FIFO pointers under MIDILock in CheckPendingIRQ
CheckPendingIRQ() compared MidiW and MidiR without the lock, while the main board thread pushes MIDI input (SCSP_MidiIn) under it, so TSan reported a data race on MidiW from the sound board thread (SCSP_DoMasterSamples -> CheckPendingIRQ). Sample the FIFO state under the lock, as the other accesses do. No caller holds MIDILock when it calls CheckPendingIRQ (SCSP_ReadCommonReg unlocks first), so the non-recursive lock can’t deadlock. Emulated behaviour is unchanged.
– SDL audio: make the enabled flag atomic
SetAudioEnabled() writes the flag on the main thread while PlayCallback() reads it on SDL’s audio thread, which ThreadSanitizer reports as a data race. The emulator threads are already paused before audio is disabled, sothe callback only needs to see the new value soon, not to be stopped, and an atomic is enough.
– Co-Authored-By: Claude Opus 5.5
– Threads: use the STL directly, remove CThread, CMutex, CSemaphore, CCondVar
– Model 3 and PRO-1000 own std::thread, std::mutex and std::condition_variable members instead of wrapper pointers. The debugger keeps recursive mutexes because CCPUDebug::WaitCommand re-enters its own lock through CDebugger::ReleasePrimary.
– Thread.h is now small: Thread::Start() starts a named thread that blocks asynchronous signals, Thread::SetCurrentName() names the calling thread, and Thread::Semaphore stands in for the C++20 one.
– Lock errors are no longer caught: they can only come from programming errors. Failing to create a thread still falls back to single-threaded emulation. sndBrdWakeNotify is now initialized, and SCSP_Deinit, which only freed the MIDI mutex, is gone.
– MB86233: no NaN or infinity in the TGP’s floating point (Desert Tank’s bunker)
An exponent of 255 is an ordinary (huge) number, taken as the largest finite value, and a result that overflows saturates; a NaN result (0/0) is 0. Desert Tank’s attract mode checks the cannon shell against an object through a null pointer, reading the program ROM’s FFFFFFFF words: as IEEE NaNs the distance came back NaN (negative) and the shell hit at the muzzle. On the board it flies on and destroys the bunker.
– Merge pull request #371 from DirtBagXon/rchase2-ROM-mirror
– CThread: implement on the STL instead of SDL, name every thread
Thread.cpp no longer uses SDL and moves from OSD/SDL to OSD. The CThread API is unchanged, so its callers are too. What SDL did implicitly is kept: mutexes are recursive, threads block asynchronous signals, and a thread that is never waited on is reported as a runaway rather than terminating the program.
– CThread::SetCurrentThreadName() names the calling thread on macOS, Linux and
– Windows 10+, and every std::thread Supermodel creates now calls it.
– Test_Thread.cpp is a standalone test of the wrapper.
– rchase2: Mirror and rename roms to latest MAME findings. by @DirtBagXon in #371
– Merge branch ‘master’ of https://github.com/trzy/Supermodel
– Model 2: lamp outputs and the Versus City billboard (Last Bronx)
Port F of the 315-5649 I/O chip (2A/2B/2C) drives the lamp outputs, with Model 3’s bit layout (MAME’s lamp_output_w), and port E the raw drive output. Last Bronx’s billboard (837-11854, EPR-18022, the same board as Model 3’s versus cabinets) takes its commands on port E: Model 3’s CBillBoard is run when the game has drive_board Billboard, the ROM is present and outputs are on. Its ROM is optional in Games.xml.
– Model 2: draw the frame buffer in render test mode (Last Bronx’s title logo)
The i960 writes Last Bronx’s title screen into the 3D frame buffer and sets render test mode. As MAME’s draw_framebuffer(), the bank of the frame is shown in place of the 3D, over the tilemaps below it, through the scrollcolour table and gamma, placed by the sync registers.
– Model 2B: the SHARC’s slice ends when it wakes the i960
The SHARC’s slice was sized while the i960 was halted waiting for its result, so it ran on to the end of the line after posting it. Last Bronx sends one 8-word command per result: each round trip took a line instead of a few microseconds, and the game ran at about half speed.
– Merge pull request #369 from pnixon-afk/pr/model3-lostworld-reload
– Version numbering updated (#370)
– Add Version.cpp and -version, take version number from source, bump to 0.4, remove build bot
– Rules.inc: fix how version is read for Windows Command Prompt
– Model 2: Top Skater’s speed meter at the bottom left, not the centre
Its command 11 objects repeat the rasterizer command in their low byte, with the center select (bits 6-7) that the high one, the only one used, lacks.
The speed meter (opcode 08805151) selects center 1, at the bottom left of its window, and was drawn around center 0, the screen’s centre.
– DSB2 program ROM in the 68K’s byte order; Model 2 MPEG board from Games.xml
– Top Skater had no music: Model 2 passed its DSB2 the 68K program as loaded (Games.xml’s byte_swap region, big endian), but CDSB2 read it as little endian words, as Model 3 left it after swapping it back. The 68K ran scrambled code and crashed. CDSB2 now reads the ROM big endian, as the 68K sees it, so neither model swaps it.
– Model 2 takes the board type from Games.xml’s mpeg_board, as Model 3, instead of the game’s name: DSB1 for Sega Touring Car, DSB2 for Top Skater.
– Misc fixes
A noter qu’un fork ajoutant le support du Sinden est dispo ici.
Pour générer un dat vous pouvez utiliser cet outil.
Télécharger SuperModel v0.4 Build 261107 (3.7 Mo)
Télécharger SuperModel WIP (XP) v0.3a r862 (6.3 Mo)
Site Officiel
En savoir plus…