PowerEmu
Twenty years of Mac. Running at full speed.
PowerEmu runs Mac OS X Tiger on your Apple silicon Mac. The whole system, exactly as it shipped in 2005 — Finder, Dock, Aqua, Classic. Not a picture of it. The real thing.
Most emulators draw the screen in software. Windows drag, screen savers stutter, and games refuse to start at all. PowerEmu renders through Metal, on the graphics chip already in your Mac. Quartz Extreme switches on. Windows glide. Games play.
Warcraft III runs at 26 frames per second.
What it can do
- Games that play. 3D runs on your Mac’s graphics chip, so games, screen savers and Chess all work the way they did on the real hardware.
- Smooth, the way it was meant to be. Quartz Extreme turns on, so windows glide and the transparency and glow come with them.
- Sound without the stutter. Steady audio, no crackle, no dropouts.
- Copy here. Paste there. Your clipboard works across both Macs, in both directions.
- Shared folders. Drop a file in on one side, pick it up on the other.
- Edge to edge. Full screen on any Mac display, notch included.
- Always the right time. The clock stays in step with your Mac’s, automatically.
- Mail that works again. PowerEmu handles the modern security Gmail and iCloud require, so the old Mac’s own Mail app can sign in.
- A faster web. Same idea, applied to web pages — your Mac does the heavy part.
- Mac OS 9, too. Classic runs, so the software from before Mac OS X runs with it.
- A shelf of Macs. Keep as many as you like, each with its own disks and settings, and start whichever one you need.
- Your drives are its drives. CDs, DVDs, disc images and USB devices, handed straight through.
Why it’s faster than the alternatives
PowerEmu is built on QEMU, the free emulator that already knows how to be an old Mac. On its own, though, it stops well short. Here’s the difference.
| Plain QEMU | PowerEmu |
|---|---|
| No real graphics card. The Mac draws every window itself, in software. | A graphics card Mac OS X recognizes and drives with its own drivers. |
| No 3D. Games and screen savers crawl or refuse to start. | 3D runs on your Mac’s graphics chip. Games play. |
| Quartz Extreme stays off. Mac OS X looks for a real graphics card and doesn’t find one. | It finds one. The effects switch on and windows move smoothly. |
| The pointer leaves smudges behind it. | Your Mac draws the pointer. It stays clean. |
| A handful of old screen sizes, none of them the shape of a Mac display. | Sizes that match your display, and true full screen. |
| Audio crackles and cuts out. | Audio is steady. |
| A USB device plugged in at a busy moment can freeze everything. | It keeps running. |
| Click away and macOS quietly slows it down to save battery. | Full speed, even in the background. |
| Default settings that suit old Mac software poorly, so everything runs slower than it needs to. | Tuned for it. One benchmark went from about ten seconds to two. |
| No connection to your Mac. No clipboard, no shared folders, no clock. | All three — and a real Shut Down instead of pulling the plug. |
| A second icon in your Dock, and nothing to manage machines with. | One app. A library of Macs, with storage and settings for each. |
Technical details
Graphics
- An emulated ATI Radeon 9000 (RV280/R200) —
ppc-mac-gpu, with an MMIO register set, a PM4 command processor and ring buffer, a 2D engine (fills, blits, host data, clipping) and AGP/GART address translation. Mac OS X’s own ATI kexts bind to it unmodified. - A Metal renderer for the R200 3D pipeline. Draw packets go straight to Metal: hardware T&L (model-view-projection, lighting, spot lights and attenuation, texture matrices, fog), viewport and scissor, R200 texture combiners, alpha test, blending done in-shader through framebuffer fetch, plane masks, depth and stencil. Textures in ARGB8888, RGBA/ABGR8888, RGB565, ARGB1555, ARGB4444, I8, AI88, DXT1/3/5 and YUV 4:2:2, resident in VRAM or fetched over AGP. It renders into VRAM through linear Metal texture views — no shadow copies.
- Quartz Extreme. The uni-north host bridge gets an AGP capability and a working
GART, so Apple’s
AppleMacRiscAGPdrives the bus, the Radeon driver builds its AGP GART and reportsAccelCaps = 1, and WindowServer switches on the OpenGL compositor. - A hardware cursor. A patched QEMU VGA NDRV reports cursor support and hands the image and position to the GPU model, which draws it on the host — fixing the stale save-under that left cursor-shaped notches over OpenGL windows.
- Host-shaped display modes. The device’s EDID (Established Timings III) and the patched NDRV’s mode table add 1440×932, 1280×828, 1152×746 and 1680×1088, plus below-the-notch variants. Full-panel fullscreen covers the whole display including the notch strip.
- 64, 128 or 256 MB of VRAM, behind a 1 GB uni-north PCI window.
Sound, input and stability
- Screamer audio pulls DMA at the sample rate from a 1 ms virtual-clock timer into a 186 ms ring; the position register advances with it and a 40 ms jitter buffer fronts the host backend. A four-second 1 kHz capture went from 10–20 dropouts to zero.
- Seamless pointer via a USB tablet taking absolute positions; captured mode remains for games.
- OHCI bounds transfer descriptors per endpoint per frame and drops missed frames rather than replaying them, which used to livelock the emulator under host load.
Speed
- Host scheduling. An
NSActivityUserInitiated | LatencyCriticalassertion plusQOS_CLASS_USER_INTERACTIVEon the TCG vCPU threads stops App Nap exiling the emulator to the efficiency cores. A guest benchmark loop dropped from 9–11 s to 3.4 s on that change alone. - TCG: a raised softmmu TLB floor (1024 entries) and a 64K-entry TB jump cache
retired by a generation counter, so a flush stays O(1) — a game covers 100k+
translation blocks and every PowerPC
blris an indirect branch. - target/ppc:
lmw/stmwexpanded inline instead of a helper thatprobe_accesses the range, and a host-FPU fast path for A-form arithmetic when FPSCR is RN with no enables and no NaNs. - GPU batching: conflicting batches ordered on the GPU with shared events rather
than
waitUntilCompletedon the vCPU thread, hybrid fences, an AGP/GART page-to-host-pointer cache, and draw vertices bump-allocated from a recycled 8 MB buffer. - Net result: benchmark loop 9–11 s → 1.95 s. Warcraft III menu 4–5 fps → 26 fps, and 15–40 fps at 1680×1050.
The app and the guest
- SwiftUI app driving QEMU over QMP. VMs are
.poweremupackages; importing disks and ROMs uses APFS clones. The guest screen is drawn inside the app through apoweremu-displayobject over a Unix socket with shared memory and damage rectangles, so QEMU isn’t a second Dock icon. - PowerEmu Tools — a guest agent for 10.4+ PPC, installed per user with no
administrator password: clipboard both ways, shutdown and restart through loginwindow
(
kAEShutDown/kAERestart), and an optional root clock daemon that steps errors over 1 s and slews smaller ones withadjtime. - Shared folders over a WebDAV server implementing enough of RFC 4918 for
Tiger’s
webdavfs, on a per-VM Unix socket so no TCP port is opened. - Service Hub: a mail proxy (the guest authenticates locally; PowerEmu does
implicit TLS or STARTTLS to iCloud, Gmail, Yahoo or Fastmail with an app password) and a
Web Accelerator on
10.0.2.100:7780doing TLS 1.3 and HTTP/2, WebP/AVIF/HEIC transcoding, image downscaling and 204s for trackers. - Built on QEMU 10.0.2 as patched by UTM. GPL-2.0-or-later.
Still in progress. Tested on Tiger; Leopard is untested. Free, and always will be.