Heres my (mostly my claude agent) write up;
MX Simulator on Apple Silicon (M-series Mac) via Wine — free, mostly full framerate
Credits
Nearly all of the real work here belongs to others — this post just tidies it up and adds a couple of paste fixes and a tuned settings list:
- Lancer2004 — started the whole investigation and did the bulk of the troubleshooting, including pinning down that the game fails at modern OpenGL (3+) context creation under Wine/CrossOver on Apple Silicon.
- jlv — pointed the way to the snapshot builds and the --glversion option that makes this possible at all.
- kawy949 / Jon (mxscentral.com) — produced the actual free-WineHQ method below, including the one-byte winemac.so patch, and confirmed 125fps on Alcrest.
What you need
- An Apple Silicon Mac (M1–M5). Tested on M5 / macOS 26 / WineHQ Stable 11.0.
- The 64-bit snapshot, not the 1.13 release build. The --glversion option only exists in snapshots from 2021-11-22 onward, and this method relies on it — the plain 1.13 exe won't work. This guide uses mx-2026-05-14-1684.exe from https://mxsimulator.com/snapshots/
- The 1.13 installer as well (for the game data / .saf files) — e.g. ~/Downloads/mxsimulator-1_13-install.exe
Performance
The game runs CPU-bound through the translation layer. With
optimised settings (included further down), most tracks still run at full 125fps. Heavy tracks can be accommodated quickly by lowering "Model Geometric Detail" without needing a restart.
--
Step 0 — Install Homebrew (optional — skip if you already have it)[/b]
Run the official installer, then add brew to your PATH (the second block is needed on Apple Silicon, where brew installs to /opt/homebrew — without it, the brew command won't be found in later steps):
Code: Select all
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
echo >> ~/.zprofile
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
Check it worked:
Step 1 — Install Rosetta 2 (skip if you already have it)
Code: Select all
softwareupdate --install-rosetta --agree-to-license
(A cosmetic "Package Authoring Error" line is fine as long as it prints "Install of Rosetta 2 finished successfully".)
Step 2 — Install WineHQ Wine (Stable 11) and clear quarantine
Code: Select all
brew install --cask wine-stable
xattr -dr com.apple.quarantine "/Applications/Wine Stable.app"
Step 3 — Create a Wine prefix
Code: Select all
mkdir -p ~/Games
export WINEPREFIX="$HOME/Games/mxsim-prefix"
"/Applications/Wine Stable.app/Contents/Resources/wine/bin/wine" wineboot
First boot prints a lot of fixme/err chatter and a big Vulkan/MoltenVK dump — all normal. Confirm it worked:
Step 4 — Install the game
Extract the 1.13 installer with 7-zip (its GUI installer doesn't always run cleanly).
Code: Select all
brew install sevenzip
mkdir -p ~/Downloads/mxs-extract
cd ~/Downloads/mxs-extract
7zz x -y ~/Downloads/mxsimulator-1_13-install.exe
ls *.saf mx.exe CREDITS.TXT
Note: using this method, we cd into the folder and DON'T use 7-zip's -o flag — 7-Zip wants no space after -o, so "7zz x -y -o ~/path" fails with "Too short switch: -o".
Copy the data + both exes into the prefix (keep the 1.13 exe as a backup, put the snapshot in as mx.exe).
Code: Select all
GAME="$WINEPREFIX/drive_c/Program Files (x86)/MX Simulator"
mkdir -p "$GAME"
cp ~/Downloads/mxs-extract/*.saf ~/Downloads/mxs-extract/CREDITS.TXT "$GAME/"
cp ~/Downloads/mxs-extract/mx.exe "$GAME/mx-1.13-original.exe"
cp ~/Downloads/mx-2026-05-14-1684.exe "$GAME/mx.exe"
ls "$GAME"
Note: no inline # comments here — in interactive zsh they run as commands ("command not found: #"). Run "setopt interactive_comments" first if you want them.
(That last cp assumes the snapshot is in ~/Downloads/ — it often downloads there rather than a subfolder, so adjust if yours is elsewhere.)
Step 5 — The key fix: patch a private copy of Wine's Mac driver
Makes a separate copy of Wine (main install untouched), flips one byte so the driver stops rejecting the OpenGL core context, then re-signs it.
Code: Select all
mkdir -p ~/Games/wine-mxsim
ditto "/Applications/Wine Stable.app/Contents/Resources/wine" ~/Games/wine-mxsim/wine
python3 -c "
import os
p=os.path.expanduser('~/Games/wine-mxsim/wine/lib/wine/x86_64-unix/winemac.so')
d=bytearray(open(p,'rb').read())
assert d[0x31b6b]==0x74, hex(d[0x31b6b])
d[0x31b6b]=0xeb
open(p,'wb').write(d)
print('patched OK')
"
codesign --force -s - ~/Games/wine-mxsim/wine/lib/wine/x86_64-unix/winemac.so
xattr -dr com.apple.quarantine ~/Games/wine-mxsim/wine
Look for "patched OK". If you get an
AssertionError instead, stop — the offset differs for your Wine version and the assert safely writes nothing. (See dev notes at the end for how to find the right offset.)
Step 6 — Launch (the --glversion 4.1core flag is required; 3.2core also works)
Code: Select all
export WINEPREFIX="$HOME/Games/mxsim-prefix"
cd "$WINEPREFIX/drive_c/Program Files (x86)/MX Simulator"
~/Games/wine-mxsim/wine/bin/wine mx.exe --glversion 4.1core
Expect harmless log chatter, then the game window opens. Keep this plain command for the first run so you have the logs if anything goes wrong.
--
Optional — no-Terminal launcher
A .command file works but leaves a Terminal window open. An Automator
Application launches with no Terminal window and can go on the Dock:
Fair warning that settings & setups (at least un-saved ones) don't carry over from the terminal launcher to the non-terminal launcher so if you do this later you'll have to re-do your settings & setups.
- Automator → New Document → Application → add "Run Shell Script".
- Paste:
Code: Select all
exec "$HOME/Games/wine-mxsim/wine/bin/wine" "$HOME/Games/mxsim-prefix/drive_c/Program Files (x86)/MX Simulator/mx.exe" --glversion 4.1core
- Save as "MX Simulator" to Applications.
Recommended in-game settings
Because the translation layer bottlenecks the CPU (draw calls / terrain sim), the wins come from cutting CPU work.
Graphics/Sound Setup
- Select a specific higher resolution such as 3024x1890. "Default Fullscreen" utilises a lower resolution.
Advanced Graphics Setup
- Ground Geometric Detail — 20 meaningful gains, allows for more reasonable model texture detail
- Ground Sub-Mesh Resolution — 16x16 lowering this seems to reduce framerate unless i'm mistaken
- Ground Texture Levels — ExtraLow+Low+Mid+High
- Ground Texture Resolution — 1024x1024 seems to help a little bit, could be meaningless but any lower looks awful
- Ground Texture Update Rate — 16
- Enable Ground Mipmaps — Yes
- Compress Textures — Always
- Model Geometric Detail — 20 lower to 0-6 for a quick fps bump on heavier maps
- Model Texture Detail — 10
- Roost Density — 0
- Treadmark Limit — 0
- Terrain Sync Rate — 0
- Enable Lens Flares — Noprobably no issue enabling this
- Enable Reflections — Noprobably no issue enabling this
Why this works (and why plain Wine fails)
The modern 64-bit snapshot needs an OpenGL
core context. Stock WineHQ's Mac driver refuses to create one — it rejects the request ("OS X only supports forward-compatible 3.2+ contexts") and the game dies instantly. macOS actually supports exactly the context the game wants; Wine is just being overly strict about a flag. CrossOver patches around this; plain WineHQ doesn't. The one-byte patch to a private copy of the driver + the --glversion 4.1core flag is the whole trick. Wine is LGPL, so editing your own private copy is fine.
Dev notes / troubleshooting
- The patch offset is version-specific. 0x31b6b is for WineHQ 11.0's 64-bit winemac.so. On a different Wine version, look for the je immediately after the "forward-compatible" check — the bytes there are 84 c0 74 20; change the 74 to eb. The assert in the Python snippet protects you: it writes nothing unless the byte matches.
- The patch survives game updates. It lives in your private Wine copy (~/Games/wine-mxsim), not the game folder, so swapping snapshots doesn't undo it. Only redo Step 5 if you change Wine version.
- Keep the 1.13 backup. Snapshots aren't heavily tested. If one misbehaves, copy mx-1.13-original.exe back over mx.exe, or drop in a newer snapshot the same way.
- Fresh terminal? $WINEPREFIX is per-session — re-run the export before any command that uses it.
- Model/skin packs install by dropping the unzipped folder (don't rename it or remove files) into the MX Simulator folder inside the prefix.
- Audio device: Wine grabs its output device at launch — pick your headphones/speakers as the macOS output first, then start the game.
- Live GPU stats: add "export MTL_HUD_ENABLED=1" to the launch environment for macOS's built-in Metal HUD (framerate, frame time, GPU memory).