Repository navigation
AArchX 0.8
AArchX 0.8 runs 32-bit Mac programs, which macOS has not run since 10.15: games from Steam, games and apps from the 2000s, and the Carbon and Cocoa they were written against. 32-bit games also got faster, and threads in translated loops now receive their signals.
32-bit Mac games
- From Steam. Left 4 Dead 2 and Call of Duty: Modern Warfare 3 play, beside Batman: Arkham Asylum. This is Jfishin's work in MacShack, brought into AArchX. Steam games need a one-time setup from a source checkout (the Steam interface database and the 32-bit C++ runtimes); 32-bit Mac games from Steam walks through it.
- Free games, as they were released. AssaultCube 1.1, SuperTuxKart 0.6.2a, Neverball and Neverputt 1.5.3, Battle for Wesnoth 1.8.6, Teeworlds 0.5.2 and Nexuiz 2.5.2 play, with their sound. On the way: SDL 1.2's keyboard, cursors and audio, GLUT, audio units through the Component Manager (Mac OS X 10.1's descriptions included), the system OpenAL in place of a bundled one, images linked with
-flat_namespace, OpenGL vertex and index buffers, and calls through function pointers, which DarkPlaces makes for all of OpenGL. Games built with GCC's C++ library, such as Teeworlds, also need the 32-bit C++ runtimetools/fetch_guest32_cxx.shfetches from MacPorts, which no release carries. - Started from the
.app.ocerz Nexuiz.appworks even though Nexuiz's executable is a shell script that starts the game: such a script now runs on its interpreter's x86_64 slice under ocerz, so the program it starts is translated too.
32-bit apps
- Adium 1.4.5 opens its setup assistant, its contact list and Sparkle's update prompt. Objective-C 1 grew to carry it: an object's guest copy lives exactly as long as the object, nib outlets reach guest instance variables,
NSNotFound,NSError **andNSRangepointers cross between the 32- and 64-bit layouts in both directions, AppKit's tracking-rectangle and tool-tip tags fit in 32 bits, and frameworks load in dependency order. - Carbon. QuickDraw ports and drawing on CoreGraphics, AGL, the menu and control calls Apple silicon dropped (rebuilt from what it keeps), ATSUI on CoreText, and the Apple Event, OSA and other calls whose structures Carbon packs to 2 bytes. Kega Fusion 3.63 and VLC 1.1.12 open their windows.
- Older programs. UPX-packed programs, which unpack themselves, and programs linked for Mac OS X 10.4 start.
Native mode
Older Intel apps open their windows in native mode: Transmission, Sequel Pro, HandBrake and VLC 2.2.
Faster
- 32-bit code. Nexuiz's benchmark demo takes about 30% fewer cycles:
- a call through a function pointer to a system function stays in translated code, where it used to leave for the run loop every time;
- a 32-bit program runs in native mode by default, which spares two FPCR writes (about 17 ns) on every call into macOS;
- an
adcorsbbinto memory, i386's way of adding a 64-bit value, is translated instead of run one instruction at a time.
- Branches. A superblock whose branches the profile keeps as they are is translated again without its probes.
bench brtakes 5% fewer cycles, and xbench'sstrwent from 1.07 times Rosetta's time to 0.97.
Fixes
- Signals in tight loops. A thread spinning in a translated loop used to receive a signal only when it left the loop; it is now stopped and gets the signal between two steps. 0.7.3 listed this under "Not yet".
Changes in behaviour
- 32-bit programs run in native mode unless
-cacheorOCERZ_MODE=cachesays otherwise. They never used the x86 shared cache, so nothing else changes.
Install
curl -fsSL https://mont127.github.io/AArchX/install.sh | shor brew upgrade --cask aarchx, or AArchX.zip below. The installer and the cask update an existing install in place.
Downloads
aarchx-macos-arm64.tar.gz:ocerz, its runtime files and AArchX.app. SHA-256:961f1346ba6004c839ac56c0836fb3fadadbffb1827fb0611807420f0e85bcdcAArchX.zip: the self-contained app. SHA-256:d778a73b8710ef876e2dcfc2c1ee5ab63aa24056d8a5fe7f60eeadb78c8f6230
Both are built for Apple silicon against the macOS 26.5 SDK, with macOS 12 as the minimum. They have been tested on macOS 27 only. No file in either names a path on the machine that built it.
Testing
- Full gate on this release's code (MacBook Air M5, macOS 27):
- unit tests pass;
- guest 134/134 under both engines;
- differential 100/100;
- diff32 40,044/40,044 in each memory layout;
- dynamic 406/406;
- native 87/87;
- m32 79/79, plus the Steam bridge test, which skips without a Steam interface database.
- The games and apps above were each run as their fixes landed, muted and in a scratch home directory; Left 4 Dead 2 and Modern Warfare 3 were tested by Jfishin.
- The prebuilt itself:
- with its own runtime files: native 87/87, and m32 76/76 plus four expected skips (three need the 32-bit C++ runtimes, one the Steam interface database);
- Nexuiz's benchmark demo played all 3,104 frames from the extracted archive, and Teeworlds opened its window once given the 32-bit C++ runtime;
- installed with the one-liner into an empty home directory,
ocerz0.8 ran a CoreFoundation program in cache and native mode, AArchX.app landed in~/Applicationswith a valid signature, and--uninstallremoved both; AArchX.zippassescodesign --verify --deep --strict.
Not yet
- CrossOver's alternate loader under
ocerz. Fixing it would give a ticked bottle's programs their launcher's Dock icon andsteam://links back. - Firefox 3.6 draws its window but the window stays off screen, and the Carbon controls Apple silicon dropped entirely (sliders, tabs, Navigation Services) are not provided yet.
- A 32-bit game that needs GCC's C++ library, run without
tools/fetch_guest32_cxx.sh's runtime, crashes instead of saying what it is missing. - Everything listed under "Not yet" in 0.7 still applies.
Shoutout to @Jfishin