MoBetta
LiveOld clients, new Macs.
Custom Wine engine for running World of Warcraft 3.3.5a (WotLK) on Apple Silicon Macs. It might work for other old 32-bit games too, but only 3.3.5a has been tested (see Requirements).
- Phase 1: Confirm faulting instructions
- Phase 2: Reproducible engine build
- Phase 3: Instruction emulation (in game: past character select, playing in the world)
- Phase 3b: Performance (20 -> 80 FPS average, 30+ minute sessions; buffer mapping up to ~20% more)
-
Engine package
WS12WineCX26.3_Mobetta - mtld3d (Direct3D 9 on Metal) in the engine package (~140 FPS at the inn)
- One build script for the whole engine, reproducible from any directory
- Release: download, install guide, checksums
- Phase 4: Wider testing
WoW 3.3.5a crashes at character select when running under Wine on Apple Silicon:
ERROR #132 (0x85100084) Fatal Exception
Exception: 0xC000001D (ILLEGAL_INSTRUCTION)
This affects all old WoW clients (1.12, 2.4.3, 3.3.5a) because Rosetta 2 doesn't implement certain legacy x86 instructions.
MoBetta is a Wineskin engine. Everything happens inside Wine:
- The crash: Wine's signal handler emulates the instructions Rosetta 2 rejects (
ARPLand nine undocumented x87 opcodes), exactly as real x86 hardware runs them - The frame rate: game processes start under x87sidecar, which makes Rosetta translate the game's x87 floating point to native ARM code instead of a slow software path. 20 FPS -> 80 FPS average (106 max)
- Graphics buffers: Wine's OpenGL keeps the low-memory view of a graphics buffer between maps instead of rebuilding it every time. Up to ~20% more FPS, 127 max
- DEP stays on under Rosetta, as on Windows
- Direct3D 9 on Metal: our build of mtld3d, without the hooks its release puts into the game's memory, with HDR off and its logs kept out of the game folder. ~140 FPS at the inn (was 60-80), ~170 in a light view
Key constraint: No game file modifications, nothing injected into the game process. This engine is designed for use with servers that run anti-cheat systems. A SHA-256 baseline of the game folder is checked before and after every test.
Other tools already run 3.3.5a on Apple Silicon. The best known, WoWSilicon, is a full launcher for 1.12, 2.4.3 and 3.3.5a with addon and mod managers. It gets there by patching the game folder: for a 3.3.5a client it adds d3d9.dll, mtld3d.conf, libDllLdr.dll, mods/winerosetta.dll and mods/libSiliconPatch.dll, lists them in dlls.txt, and patches the game's own DivxDecoder.dll so those DLLs load into the game (WoWSilicon's PatchService.swift, October 2026).
MoBetta is for players who want the client left exactly as Blizzard shipped it:
- The game folder is untouched. No files added, none patched. A SHA-256 of every file in the game folder is checked before and after each test
- Nothing is added to the game process. No extra DLLs, no DLL loader, no hooks or patches in the game's code. The crash fix lives in Wine's own exception handling, and Direct3D is the engine's own
d3d9, in place of Wine's - It's an engine, not a launcher. Your Porting Kit or Wineskin wrapper switches to it in a few clicks, and switching back undoes it
- Open and reproducible. Built from pinned sources;
build_engine.shrebuilds the release byte for byte
MoBetta can't promise how any server's rules or anti-cheat treat a Mac client. What it does promise is an unmodified client. If you'd rather have an all-in-one launcher with addon management and several game versions, WoWSilicon is a good choice; both build on x87sidecar and mtld3d.
In game with the v1.0.0 engine on a MacBook M3, windowed, medium-high graphics settings, FPS from the in-game counter (Ctrl+R). Shattrath and Booty Bay in the rain run lowest.
| Place | FPS |
|---|---|
| Loch Modan, Valley of Kings (Ironforge gate) | 191 |
| Stormwind, Trade District | 155 |
| Duskwood | 149 |
| Orgrimmar, Valley of Strength | 138 |
| Durotar, zeppelin tower | 135 |
| Howling Fjord, Kamagua | 135 |
| Booty Bay, rain | 97 |
| Shattrath City | 86 |
Chat and character names are blurred in the screenshots.
- Mac: Apple Silicon (M1 or later) with Rosetta 2 installed
- Porting Kit or Wineskin installed: Porting Kit or Wineskin Winery, with a wrapper (port) for the game already set up and working
- Game: WoW 3.3.5a (build 12340)
- Other games: untested. Nothing in the engine is specific to WoW: the instruction emulation and x87sidecar apply to any 32-bit Windows program, and mtld3d to any Direct3D 9 game. It might work for other old games, including WoW 1.12 and 2.4.3, but only 3.3.5a has been tested
- Tested on: MacBook M3, macOS 27
- Base: CrossOver 26.3 Wine (Porting Kit's engine
WS12WineCX26.3_DXMT)
Added
- Performance section in the README with eight in-game screenshots and an FPS table, on the v1.0.0 engine on a MacBook M3 at medium-high settings: 191 FPS at the Ironforge gate, 155 in Stormwind, 138 in Orgrimmar, down to 97 in Booty Bay in the rain and 86 in Shattrath. Images are in
docs/screenshots/, with chat and character names blurred - Other games in the README's Requirements: nothing in the engine is WoW-specific, but only 3.3.5a has been tested
- Why MoBetta in the README: what it does differently from WoWSilicon (no game-folder patching, nothing added to the game process)
- Porting Kit guide (
docs/PORTING_KIT.md): a new port with the MoBetta engine, step by step with screenshots, plus switching an existing port's engine through Wineskin, and turning off Vertical Sync in game
Added
- Install guide in the README: download, check with
SHA256SUMS, put the engine in Wineskin's Engines folder, switch a Porting Kit or Wineskin wrapper to it through itsWineskin.app(Advanced > Tools > Change Engine Used) SHA256SUMSwith the release engine's hash.build_engine.shchecks the same value- License: MoBetta is LGPL 2.1 or later, the same as Wine (
LICENSE) - The engine now carries Wine's license and a source note.
share/doc/wine/COPYING.LIBis Wine's LGPL text.share/doc/mobetta/SOURCElists every file that differs from the stock engine and where its exact source is. The stock engine had neither. No code changed; engine SHA-2569bc8ec0626d050dcd0de110ced7ca331e62df0ab48211633cc0b5462807b5beb(was71cb6239...)
Fixed
build_mtld3d.shexplains a shared-Mac clash. mtld3d has to build in/private/tmp/mobetta-mtld3dfor its output to match the release. If another user on the Mac built there first, the script now says so and stops, instead of failing midway
Added
scripts/build_engine.shbuilds the whole engine from a fresh clone. It checks the tools it needs first, runs the four build steps, and fails unless the engine matches the pinned SHA-256:71cb623920136b06f4515074b2dc238c702c0b76bf4cb1f68aa0511e48588441. A clone in another directory, with every download fetched again, produced the same engine byte for byte
Fixed
- Wine's
ntdll.soandopengl32.sonow build the same in any directory. Their Mach-O UUID was computed from debug info that recorded absolute build paths, so a build elsewhere differed in those 16 bytes. Source and object paths are now written relative to the repo. The code is unchanged; new hashes32d1fa05...(ntdll.so) and2eda5e35...(opengl32.so), engine71cb6239...(was41d2a31e...). Tested in game: loads, same frame rate - mtld3d failed to build in a fresh tree. A Wine library it links against was built without our cross compiler on the path, so Homebrew's mingw gcc was picked up instead.
build_ntdll.shnow builds it with the right compiler
On the source. This project is open source: the code lives at github.com/rawdata369/MoBetta. The milestones, changelog and narrative on this page come from its README and CHANGELOG, and the statistics are read live from the GitHub API, so it reflects the state of the work rather than a summary written after the fact.