It is now two years since we started this project, and so far the progress is looking promising. At this point, it is good to take a brief overall look at where we are right now… so far, we have a lot of phase #1 goals accomplished:
- Good enough 68000 emulation to run majority of games designed to use that CPU.
- Majority of “classic” QuickDraw traps implemented to allow black & white games which needs them to work. Also hardware-level VIA page-swapping support for double-buffered games such as Dark Castle and Continuum.
- Complete “.Sound” driver functionality, including ~99% coverage of low-level sound hardware emulation to allow games such as Dark Castle, Tetris and Pirates! to have working sound.
- External file system emulation with HFS metadata support abstracted to ADF files, with almost all read/write operations tested working (except delete/rename, which have so far been rarely needed)
- Basically implemented most of toolbox calls needed to, get out of the 87 test applications, 78 to work in at least somewhat usable way, and 43 to function near-perfectly.
- Ability to run (or try running) the test applications/games as native OSX application bundles (and now with Windows support, also as windows EXE files), with full mouse/keyboard support, fullscreen/windowed and pixel-double support. Sound also mostly works but the SDL buffering needs some tweaking especially on windows…
As the toolbox is quite large, and there is a large number of traps/selectors which are rarely needed, and have not been encountered in the applications we have been testing vigorously. These APIs are still unimplemented, but they will be eventually added to the emulation. However, because these missing phase #1 features have such minor impact on most test applications, we also have started to work on some phase #2 features which are not only beneficial for a lot of current test suite, but which also will allow a huge number of new applications to be added to our tests:
- 68020/030/040 emulation, which Pukka has already done a lot of progress on.
- Color QuickDraw support, which was started after Christmas (more about that later in this post – very important for getting color games to work!)
- Some preliminary progress on System 7.x APIs (FSSpec calls, Folder Manager, Time Manager, Script Manager, etc.).
Because of the fact that as we are implementing new features in a parallel fashion, we don’t have any fixed schedule for milestones. But realistically we expect to get a lot progress on the color support during the spring, which is the biggest bottleneck for getting much larger test application coverage. The downside of this is, however, that a “generic” emulator release will get delayed, because we want it to be as complete as possible, so that you won’t have to suffer from the incomplete features until we get everything polished. You can always follow the test application coverage (and overall progress) on our status page at https://mace.software/status/.
Color QuickDraw progress & first color game (somewhat) playable: KYE!
Since the previous post, majority of work as focused on getting source-mode blitting to work within the color hardware and Color QD API emulation. One of the easiest test cases for that purpose is a fun game called KYE, which was one of personal favorites of Toni on his LC II in early 90’s. The reason why this particular game is nicely suited for this early-stage testing is the fact that it uses mostly just PlotCIcon to draw all of its “sprite” graphics. Thanks to this, we did not have to work on a huge number of different calls at once, but were able to focus on getting that single call working. That way we could get something visible progress on the screen, instead of the invisible “under-the-hood” type of progress which has more impact on the long term.
For curiosity, below is a set of screenshots taken during the PlotCIcon development, which shows how the bugs were squished one by one until the rendering was finally okay:
Here’s a screenshot of latest stage of PlotCIcon functionality in KYE:

As you can see in the screenshot, icon rendering is working nicely, but text rendering is still completely missing. We also updated the WDEF 0 to have most of color support, so it uses now shading from the default ‘wctb’, leading to authentic System 7-style look and feel. Because of early stage of implementation, the color blitter has right now following limitations:
- Blitter only works on “indexed” targets (1-8 bit pixmaps), i.e. not on “direct” (16/32-bit) screens
- Only supports indexed sources too
- Only simple srcCopy and srcOr modes supported (non-colorized)
- No stretching support yet (only 1:1 scaling)
- No arithmetic modes yet
- Focus at this stage is on accuracy – that is, getting the output results to look exactly same as on the original, “real” Color QD – so performance is far from optimal for now. Leaves a lot of space for blitter optimization in future though…
- Probably a lot of other use cases which I can’t recall right now…
Below is also a short video of level 2 gameplay:
Anniversary bonus! PT-109 gameplay video
To celebrate the two-year anniversary, we also recorded 90 minutes of PT-109 gameplay to show the current state of that game’s compatibility with M.A.C.E. below:
This video shows what to expect when we get the “generic” emulator released some day in the future. For now, we can only share the video of this awesome game as it is sadly copyrighted – but we have a bunch of freely available games at our downloads page at https://mace.software/files for both Mac OS X and Windows 64-bit.
If you are interested in keeping up with our progress (now that we start the third year with full speed) you can follow this blog, or one or more of the following:
- 68kMLA discussion thread at https://68kmla.org/forums/index.php?/topic/56322-progress-on-our-new-mac-app-compatibility-environment/
- Emaculation discussion thread at https://www.emaculation.com/forum/viewtopic.php?f=7&t=10079&sid=78c5d396823029d01259ef6f5f45932d
- Our YouTube channel at https://www.youtube.com/playlist?list=PLEW7v-eMZEJElUv0UchqQ1BVqcKjbHWdq
Full list of changes since last post
2020-02-23 22:32:57 +0200 • Add srcOr transfer mode to generic (=slow) blitter 2020-02-22 21:39:25 +0200 • Fix MOVE SR,-(A7) bug 2020-02-22 19:27:03 +0200 • Fix byteswap bug of ctSeed & tweak 2-&4- bit cluts 2020-02-22 18:51:04 +0200 • PenMode color QD compatibility 2020-02-22 18:50:30 +0200 • Add patXor mode for pixpat color rectangle blitter 2020-02-22 18:03:25 +0200 • Implement color QD versions of Get/SetPenState 2020-02-22 18:02:26 +0200 • Implement PenPixPat 2020-02-22 17:25:03 +0200 • Apply source mask to region scanlines when seeking 2020-02-22 17:24:06 +0200 • Fix align to destination in color srcCopy blitter 2020-02-22 17:21:57 +0200 • Fix b&w pixel data expansion being off by 32 bits 2020-02-22 17:19:46 +0200 • Add extra space after mask buffer for alignment 2020-02-22 17:18:43 +0200 • Keep rgn buffers 1-bit until destination expansion 2020-02-22 05:10:55 +0200 • Fix rowbytes calculation, cicns are now almost ok 2020-02-22 04:45:39 +0200 • Color blitter progress, KYE cicns almost visible 2020-02-22 02:33:59 +0200 • Region scanline to destination scaling functions 2020-02-21 22:50:17 +0200 • First successful pixel depth & clut translation 2020-02-21 22:17:11 +0200 • Get source & mask pixel data to translation buffer 2020-02-21 22:14:54 +0200 • Fix missing DerefHandle in PlotCIcon pixmap setup 2020-02-21 02:59:49 +0200 • More work on color blitter (PlotCIcon case init) 2020-02-18 01:02:13 +0200 • Progress on pixel translation in color src blitter 2020-02-17 17:05:51 +0200 • First colorized WDEF 0 parts (doc variant tested) 2020-02-17 17:03:33 +0200 • Fix missing deref of pixpat handle in color mapper 2020-02-17 16:18:49 +0200 • Fix assignment of WMgrCPort in InitWindows 2020-02-17 16:17:55 +0200 • Fix byteswap bug in PlotCIcon (b&w case detection) 2020-02-17 16:16:12 +0200 • Fix invalid portRect in InitCPort 2020-02-17 02:53:34 +0200 • Add RSAllocArray to allocate arrays in the scratch 2020-02-16 01:58:21 +0200 • Separate color QD CopyMask trap from "classic" one 2020-02-16 01:57:31 +0200 • Add dummy color stretch blitter & map use cases 2020-02-13 02:28:58 +0200 • Fix WindowManager colorQD CalcVis portBits mapping 2020-02-13 02:26:55 +0200 • Fix incorrect source rect passed in PlotCIcon 2020-02-13 02:01:51 +0200 • Half-dummy PlotCIcon, missing still src blitters 2020-02-13 02:00:49 +0200 • Fix window port bitmap size for color QD wCalcRgns 2020-02-12 02:24:35 +0200 • Fix MovePortTo (target rect did not map to pixmap) 2020-02-11 23:09:14 +0200 • Implement GetCIcon 2020-02-11 00:41:10 +0200 • Single-device colorQD DeviceLoop implementation 2020-02-11 00:29:28 +0200 • Improve WDEF 0 color compatibility for NewWindow 2020-02-11 00:20:50 +0200 • Fix default AuxWinHandle result of GetAuxWin trap 2020-02-10 23:46:56 +0200 • ColorQD version of BackPat 2020-02-10 21:25:14 +0200 • Fix wrong pattern given by QDDrawRegion to blitter 2020-02-10 06:25:48 +0200 • MovePortTo and PortSize colorQD compatibility 2020-02-10 05:37:21 +0200 • Fix colorQD multidevice StdArc drawing 2020-02-10 05:03:29 +0200 • Refactor 'MBDF' 0 for more color QD compatibility 2020-02-10 02:36:45 +0200 • Finish implementation of SetMCEntries 2020-02-10 02:16:13 +0200 • First (non-complete) InitPalettes pass 2020-02-10 02:15:26 +0200 • Add RSEnter/RSReturn pair to colorQD PenNormal 2020-02-10 02:14:46 +0200 • Fix RSEnter/RSReturn imbalance in QDDrawRegion 2020-02-10 02:14:11 +0200 • Tweak GestaltQDVersion selector result in color QD 2020-02-10 02:13:24 +0200 • Tweak default placeholder device mode 2020-02-09 23:05:22 +0200 • Tweak fake-ROM clut table seeds to match rsrc IDs 2020-02-09 03:38:12 +0200 • Implement NewPalette in Palette Manager 2020-02-09 02:33:13 +0200 • Implement GetNewPalette trap for Palette Manager 2020-02-08 17:09:07 +0200 • ColorQD compatible SetPortBits (no-op @CGrafPorts) 2020-02-08 17:08:02 +0200 • ColorQD SetOrigin (dereference CGrafPort pixmap) 2020-02-08 13:43:47 +0200 • Fix GrayRgn calculation in colorQD mode 2020-02-08 13:41:36 +0200 • Add ColorQD Region draw operations (non-masked) 2020-02-08 05:29:59 +0200 • Fix window manager clip bug in colorQD InitWindows 2020-02-08 05:27:57 +0200 • Fix detection of color port in ColorStretchBits 2020-02-08 04:54:31 +0200 • ColorQD Line and LineTo + line renderer 2020-02-08 02:42:58 +0200 • Implement ColorQD Move and MoveTo 2020-02-08 02:12:25 +0200 • ColorQD versions of PenNormal and PenPat 2020-02-08 02:02:08 +0200 • Fix CGrafPort/GrafPort target check for patterns 2020-02-08 02:00:44 +0200 • Start work on FillCRoundRect (PixPat expansion) 2020-02-08 00:01:45 +0200 • 8- & 16-bit scanline srcCopy & fix PixPat handling 2020-02-07 17:20:08 +0200 • 1, 2 & 4-bit scanline blitter and region expansion 2020-02-07 01:52:53 +0200 • Unify color QD and classic QD Arc draw traps 2020-02-07 01:44:43 +0200 • Generalize color QD pattern expansion for arcs too 2020-02-06 22:54:14 +0200 • Implement custom grafProcs support for Arc drawing 2020-02-06 22:36:47 +0200 • Refactor scanline blitters into separate module 2020-02-06 04:11:58 +0200 • Tweak base address and rowbytes for arc draw loop 2020-02-06 03:46:00 +0200 • Major region buffer refactor part #1 for color QD 2020-02-06 03:33:18 +0200 • Setup default mctb colors for drawing the menu bar 2020-02-03 22:58:37 +0200 • Implement GetMaskTable 2020-02-01 19:28:29 +0200 • Use OpenCPort instead of OpenPort in color QD init 2020-02-01 19:27:36 +0200 • Add RGBWhite/RGBBlack low-mem globals 2020-02-01 19:26:23 +0200 • GetForeColor/GetBackColor CGrafPort support 2020-02-01 19:14:41 +0200 • Implement GetMCEntry 2020-02-01 18:05:19 +0200 • Implement GetMaxDevice 2020-02-01 01:44:33 +0200 • Fix ShieldCursor/ShowCursor imbalance in QDDrawArc 2020-02-01 01:04:38 +0200 • Fix byteswap bug in rectangle region recording 2020-02-01 01:03:00 +0200 • Disable ROM write check for now, DungeonOfDoom fix