RawData

MoBetta

Live

Old clients, new Macs.

Overview

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).

Milestones8 done · 1 in progress · 9 total
89%
  • 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
The Problem

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.

The Solution

MoBetta is a Wineskin engine. Everything happens inside Wine:

  • The crash: Wine's signal handler emulates the instructions Rosetta 2 rejects (ARPL and 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.

Why MoBetta

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.sh rebuilds 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.

Performance

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.

Requirements
  • 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)
In-game FPS screenshots 28 Oct 2026 ·

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
First release: install guide, checksums, licenses 28 Oct 2026 ·

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 its Wineskin.app (Advanced > Tools > Change Engine Used)
  • SHA256SUMS with the release engine's hash. build_engine.sh checks 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.LIB is Wine's LGPL text. share/doc/mobetta/SOURCE lists every file that differs from the stock engine and where its exact source is. The stock engine had neither. No code changed; engine SHA-256 9bc8ec0626d050dcd0de110ced7ca331e62df0ab48211633cc0b5462807b5beb (was 71cb6239...)

Fixed

  • build_mtld3d.sh explains a shared-Mac clash. mtld3d has to build in /private/tmp/mobetta-mtld3d for 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
One build script, same bytes anywhere 28 Oct 2026 ·

Added

  • scripts/build_engine.sh builds 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.so and opengl32.so now 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 hashes 32d1fa05... (ntdll.so) and 2eda5e35... (opengl32.so), engine 71cb6239... (was 41d2a31e...). 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.sh now 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.