Will definitely give it a try, since I would _love_ to have a Classic Mac environment with some modern creature comforts (like file sharing) in tiny machines.
It would be fun to have a "slow it down" feature that also has the various floppy read/write noises paired with it. Bonus points for different generations of hardware and having the OG HD noises to pair with those too!
Many hours were wasted on that game.
It only takes one unintentional reliance on an implementation detail to make an application not run on another OS implementation...
make ams-vnc
./build.pl -i exhibit graft skif minivx xv68k freemountd listen vnc-interact
...
Daemon starting up... done.
T=0.037s ERROR: OpenDF is unimplemented
Hm, doesn't seem to work. Let's try the X11 version: make ams-x11
./build.pl -i exhibit graft skif minivx xv68k freemountd interact-x11
...
T=0.275s ERROR: OpenDF is unimplemented
Nope, it seems to be missing something. OpenDF? All I find is this: https://github.com/PrjEnt/OpenDF, a long-abandoned project which seems to be a more compact version of another abandoned thing.The front end deals with displaying graphics and forwarding user input to the back end. Working front ends include SDL2 (by a contributor), X11, Linux fbdev, VNC, and five different macOS APIs (Cocoa/OpenGL, CGL, AGL, Quartz, and QuickDraw).
The front and back ends communicate using FIFOs and shared memory. I'm aware that certain platforms will require refactoring all of this to run in a single process. If Emscripten is one of them, then it won't be as simple as you suggest.
In any case, if I were the one doing the port, I might write a bare-bones front end just for this purpose, possibly using the fbdev one as a starting point.
A 1 bit framebuffer and a CPU gets you most of what the machine can do.
Most of the quirk abuse of 8-bit machines came from features that were provided with limitations. Sprites, but only 8 of them, colours but only 2 in any 8x8 cell. Multicolour but only in one of two palettes and you'll hate both.
Almost all of the hacks were to get around the limitations of the features.
I don't know if the decision apple made was specifically with future machines in mind. It certainly would have been a headache to make new machines 5 generations down the track if the first one had player missile graphics.
You clipped the part that said "Starting VNC server on 127.0.0.1:5900". Did you try connecting a VNC client?
So, rather than emulating hardware to run native ROMs, they "simply" reimplemented the ROMs.
A friend of mine did this at another level. He basically rewrote the bulk of the toolbox as a C library so that the company, who had a Mac application, could port it to run on a PC, while sharing the source code.
This was before Windows, and it worked! Launched it from DOS, takes over the entire screen. He didn't copy the Mac look and feel. Instead he used OpenLook for his gadgets and what not (since it was, you know, "open").
But he rewrote the bulk of it: QuickDraw, Event Manager, Memory Manager, Window Manager, etc. Just ate it like an elephant. I don't think his regions were as clever as the Mac. Pretty sure he just stuck with rectangles.
For example, check out the MacPaint demo:
https://www.v68k.org/advanced-mac-substitute/demo/MacPaint-A...
If you were to double-click the Hello document in macOS' Finder, it would launch and open in MacPaint.app.
Some applications call `OpenDF()` without checking its availability, but fall back to `FSOpen()` or equivalent if `OpenDF()` returns `paramErr`, which is what the parent is witnessing. See `68k/modules/ams-fs/Files.cc` in the `metamage_1` repo.
If the error message is confusing people, maybe it's time to implement `OpenDF()` for real.
and yes:
https://github.com/jjuran/metamage_1/commit/30cb0e260d5ff478...
`TRAP` is a different instruction, with opcodes `$4E4x`. Each one gets its own exception vector.
It's not just trap calls, though — sometimes applications write directly to the sound buffer or use hardware page flipping.
It was the Lisa system software that was mostly implemented in Pascal and some blamed this for its largeness and its performance. Compilers and linkers weren’t great back then; most compiler code generation was pretty rigid, and most linkers didn’t even coalesce identical string literals across compilation unit boundaries!
Lisa Workshop C introduced the “pascal” keyword for function declarations and definitions to indicate they used Pascal calling conventions, and otherwise followed Lisa Pascal structure layout rules, so as to minimize the overhead of interoperating with the OS. (I’m not sure whether it introduced the “\p” Pascal string literal convention too or if that came later with Stanford or THINK Lightspeed C.)
So even things that wrote directly to the framebuffer would ask the OS for the address and bounds rather than hardcode them, copy protection would be implemented using license keys (crypto/hashes, not dongles) rather than weird track layouts on floppies, etc. It led to good enough forward compatibility that the substantial architectural changes in the Macintosh II were possible, and things just improved from there.
Much more common in my experience was the assumption that the framebuffer was 1-bit, but such games would still run on my IIci if I switched to black & white—they’d just use the upper left 3/4 of the screen since they still paid proper attention to the bytes-per-row in its GrafPort.
Could be that by the time I was using a Mac II though that all the games that didn’t meet that minimum bar had already been weeded out.
MacPaint running in Advanced Mac Substitute (click to see video)
![]()
Advanced Mac Substitute
Advanced Mac Substitute is an API-level reimplementation of 1980s-era Mac OS. It runs 68K Mac applications in an emulator without an Apple ROM or system software.

System’s Twilight running in Advanced Mac Substitute.

Lode Runner running in Advanced Mac Substitute

The opening of the prologue cinematic from The Fool’s Errand running in Advanced Mac Substitute

Amazing running in Advanced Mac Substitute (point to see the solved maze)
Unlike traditional emulators, Advanced Mac Substitute doesn’t emulate the hardware on which an operating system runs (except for the 680x0 processor), but actually replaces the OS — so it launches directly into an application, without a startup phase.

Welcome to Advanced Mac Substitute.
(This is an application, not a real loading screen.)
Advanced Mac Substitute is a factored application. The backend includes a 68K emulator and should build and run on any POSIX-like system. The frontend is a generic bitmapped terminal abstraction, provided by SDL2 (for various platforms) along with custom implementations for macOS, X11, and Linux framebuffer (fbdev).
Advanced Mac Substitute is capable of running several applications written for the original Macintosh computer. Examples include four games from 1984: Amazing, Solitaire, Missile, and IAGO.

Missile running in Advanced Mac Substitute (point to see the next frame)

IAGO running in Advanced Mac Substitute (point to see who won)
Current support includes 1-bit-deep graphics, regions, circles and roundrects, lines, cursors, GrafPorts, text, windows, controls, menus, dialogs, and more.
Source code for Advanced Mac Substitute is on GitHub.
If you’re feeling adventurous, you can try out Advanced Mac Substitute in macOS / OS X, the X Window System, a Linux framebuffer console, or a VNC client.

Nyanochrome Cat running in Advanced Mac Substitute (point to animate)
(Older documentation has moved while revision is under way.)