Sega Model 2 Emulator: The Complete Arcade Cabinet Engineering Guide
Technical analysis and engineering manual for the Sega Model 2 Emulator v1.1a. Run Daytona USA, Virtua Fighter 2, Sega Rally Championship, Virtua Cop, and The House of the Dead on your custom arcade cabinet with full force feedback, lightgun support, and multi-cabinet networking.
Overview — Architectural Foundations and Runtime Fragility
The Sega Model 2 Emulator v1.1a is a legacy, single-purpose software translation layer engineered to recreate the highly customized graphics pipeline and logic environment of the physical Sega Model 2 arcade board. The emulator operates under rigid runtime assumptions: single-game execution boundary, exclusive display ownership, fragility of state changes (Alt-Tab breaks the D3D device lock), and orderly shutdown requirements for NVRAM persistence.
Two executable versions exist: emulator.exe (single-threaded) and emulator_multicpu.exe (multi-threaded with geometry offloading). The multi-CPU version introduces synchronization risks if external wrappers alter thread scheduling.
Beginning — Global Configuration vs. Software DIP Switch Logic
EMULATOR.INI Configuration
The global environment is managed by EMULATOR.INI. Key parameters include: SoftwareVertexProcessing (CPU vertex fallback), Bilinear/Trilinear (texture filtering), ForceManaged (managed memory textures for modern GPUs), ForceSync (vsync lock), FullScreenWidth/Height (resolution), MeshTransparency (alpha translucency), DrawCross (lightgun crosshair), XInput (Xbox controller API), EnableFF (force feedback), UseRawInput (dual lightgun segregation), and RawDevP1/P2 (raw input device binding).
Critical: The emulator lacks per-game configuration isolation. Any change to EMULATOR.INI applies to ALL games. Enabling UseRawInput for lightgun titles will break racing games. Enabling XInput for racing causes double-enumeration crashes in lightgun setups.
Per-Game Software DIP Switches
Game-specific settings (difficulty, coinage, cabinet type, link ID) are controlled via the built-in Service Menu accessed with F2 (enter/confirm) and F1 (navigate). Settings are saved to NVDATA/*.dat files on orderly exit. Never edit .dat files directly — they use compressed undocumented binary format.
Intermediate — Input Subsystem and Multi-Cabinet Networking
DirectInput Device Limit Crash
More than 3-4 USB input devices causes the DirectInput enumeration loop to overflow its static buffer, crashing the controller config UI. Modern XInput controllers count double (XInput + DirectInput fallback). Solutions: physical isolation, HidHide filtering, or vJoy virtual aggregation.
Protocol Mapping Anomalies
Under DirectInput, left/right analog triggers merge into a single Z-axis, making independent gas/brake impossible unless XInput=1 is enabled. Racing titles (daytona, srallyc) expose granular config blocks; others (stcc, sgt24h, indy500) restrict to generic Button 1-4 mappings.
Multi-Cabinet Networking (Token Ring)
The emulator reproduces Token Ring networking via m2network.ini with RxPort, NextIP, and NextPort parameters. Supports loopback (single PC), multi-instance loopback (two cabinets on one PC), and LAN configurations. The "Network Board Not Present" error is resolved by setting LINK ID to SINGLE in the service menu.
Cabinet Killer Traps
- Alt-Tab Death Spiral — Switching focus breaks the D3D device lock permanently. Disable all notifications and overlays.
- USB Device Overflow — More than 3-4 devices crashes DirectInput enumeration. Use HidHide or vJoy.
- Global Config Bleed — UseRawInput breaks racing; XInput breaks lightgun. No per-game isolation exists.
- Force-Kill NVRAM Corruption — taskkill /F bypasses orderly shutdown, corrupting NVDATA. Always use WM_CLOSE.
- Missing BIOS Brick — model2.zip must be in ROMS folder or all games fail to boot.
- Z-Axis Trigger Merge — DirectInput merges triggers into one axis. Enable XInput=1 for racing.
- NVDATA Binary Edit Trap — Direct .dat editing corrupts NVRAM. Use Service Menu only.
- Scroll Lock Speed Trap — Losing focus with Scroll Lock active causes hyper-speed execution.
Advanced — LUA Scripting, Memory Patches, and Recovery
Widescreen Hacks and LUA Integration
The built-in LUA engine uses I960_ReadByte to monitor memory addresses and apply widescreen rendering per game state. Key functions: Model2_SetWideScreen(1), Model2_SetStretchALow(1), Model2_SetStretchBLow(1). Scripts exist for vf2.lua (0x50002B), srally.lua (0x202098), doa.lua (0x54F9D5), hotd.lua (0x51EE14), fvipers.lua (0x50002A), and indy500.lua (0x54C224).
Memory Offset Deltas and Reload Hacks
Lightgun reload mechanics use memory-snooping: Virtua Cop uses additive buffers at +18F7BC (0=none, 1=P1, 2=P2, 3=both). House of the Dead and Virtua Cop 2 use subtractive buffers at +18F7DC (3=active, 2=P1 reload, 1=P2 reload, 0=both). Behind Enemy Lines requires Y-axis NOP patches; Virtual-On requires NOP at +B75CF for twin-stick controls.
Dirty Exit Recovery Protocol
Phase 1: Delete all NVDATA/*.dat files, CFG/*.input files, and EMULATOR.INI. Phase 2: Run emulator_multicpu.exe to regenerate defaults; verify model2.zip in ROMS. Phase 3: Apply emergency overrides — ForceManaged=1, SoftwareVertexProcessing=1, XInput=0, EnableFF=0, UseRawInput=0.
ROM Registry
Complete supported ROM short-names: bel (Behind Enemy Lines), von (Virtual-On), daytona/daytonam/dayton93 (Daytona USA variants), doa (Dead or Alive), desert (Desert Tank), dynabb/dynabb97 (Dynamite Baseball), dyndeka2 (Dynamite Cop), fvipers (Fighting Vipers), gunblade (Gunblade NY), hotd (House of the Dead), indy500 (INDY 500), lastbrnx (Last Bronx), manxtt/manxttdx (Manx TT), motoraid (Motor Raid), overrev (Over Rev), pltkids (Pilot Kids), rchase2 (Rail Chase 2), srallyc/srallycj (Sega Rally), stcc (Sega Touring Car), schamp (Sonic the Fighters), sgt24h (Super GT 24h), topskatr (Top Skater), vcop/vcop2 (Virtua Cop 1&2), vf2/vf2a/vf2b (Virtua Fighter 2), vstrik (Virtua Striker), waverunr (Wave Runner), zerogun (Zero Gunner).
System Hotkeys
F1 (Service Coin/Navigate), F2 (Service Menu/Select), F3 (Soft Reset), F6 (Frame-Skip), F7 (Tilemap Toggle), F8 (Renderer Stats), F9 (FPS Counter), F10 (Load State), F11 (Save State), F12 (Screenshot), Pause (Emulation Pause), Scroll Lock (Refresh Rate Lock).
FAQ
Why did changing one setting affect all my Model 2 games? The emulator uses a single global EMULATOR.INI for all titles. There is no per-game configuration isolation.
Is this behavior controlled by a DIP switch or global config? Video, audio, and input system settings are global (EMULATOR.INI). Difficulty, lives, free play, link roles, and gun calibration are per-game DIP switches saved in NVDATA.
My controller config UI crashes immediately. More than 3-4 USB devices causes DirectInput buffer overflow. Disconnect devices, use HidHide, or aggregate with vJoy.
How do I fix Network Board Not Present? Enter service menu (F2), navigate to GAME SYSTEM SETTINGS, set LINK ID to SINGLE, exit with save.
Can I edit NVDATA .dat files directly? No. They use compressed undocumented binary format. Use the Service Menu (F2) instead.
Why can I not map gas and brake independently? DirectInput merges analog triggers into one Z-axis. Enable XInput=1 in EMULATOR.INI for independent trigger mapping.
Verdict
The Sega Model 2 Emulator v1.1a delivers arcade-perfect emulation of Daytona USA, Virtua Fighter 2, Sega Rally, House of the Dead, and Virtua Cop with LUA widescreen, Token Ring networking, and force feedback. However, its rigid runtime assumptions, global config scope, and DirectInput limits demand careful configuration. For cabinet builders who maintain separate INI profiles per genre and follow the Dirty Exit Recovery Protocol, it delivers an unmatched experience for this specific hardware platform.