Creating a Classic Mac Application
, Classic Macintosh, Programming
I am no stranger to Macintosh programming. I started to program in the 1990s, and the Macintosh is what we had at home. At the time, my dad taught computer science at the University of Portland, so I had a lot of resources available when I wanted to learn—books, software, and real live experts who would answer questions or explain how pointers worked.
If I feel nostalgia towards any era or brand in computing, it would have to be the Macintosh System 7–Mac OS 8.5 era.
Aside: Are Classic Macintosh Games Worth Playing?
A few.
The DOS and Windows markets had a better library, no contest. There were a handful of Mac-only or Mac-first developers and publishers that stood out. Bungie, Ambrosia Software, Spiderweb Software, Storm Impact, Cyan Worlds, etc. Most of the good games got a PC port. Many of the classic games I remember were ports from DOS or Atari ST.
Some classic Mac games I like:
- Taskmaker, by Storm Impact
- Escape Velocity, by Ambrosia Software
- The Adventures of Sean, by Rancid Tomato
- Spacestation Pheta, by T&T Software
Hello, World
Unlike the Nintendo 64 series, I am not figuring out how to write code for classic Macintosh. Classic Macintosh programming is well-documented. There are books, there are open-source projects, and most importantly, I’ve done it before.
I have a copy of Basilisk II which I compiled from source, a ROM file of dubious origin, and a disk image containing Mac OS 7.5.3 and MPW. I mostly used CodeWarrior back in the day, but I’m going to start with MPW.
My Hello World program will display an alert dialog on screen and quit.
The C code is fairly short, it just needs to initialize a bunch of stuff
and then call the Alert()
function:
#include <Dialogs.h>
#include <Fonts.h>
#include <MacMemory.h>
#include <Menus.h>
#include <Processes.h>
#include <QuickDraw.h>
#include <TextEdit.h>
QDGlobals qd;
void main(void) {
MaxApplZone();
InitGraf(&qd.thePort);
InitFonts();
InitWindows();
InitMenus();
TEInit();
InitDialogs(NULL);
InitCursor();
Alert(128, NULL);
ExitToShell();
}
The actual alert dialog must be created as a resource, using a
ALRT
and DITL
.
The string is just long so it fills the alert box.
#include "Dialogs.r"
resource 'ALRT' (128, purgeable) {
{ 40, 40, 137, 360 },
128, /* DITL ID */
{
OK, visible, silent,
OK, visible, silent,
OK, visible, silent,
OK, visible, silent
},
centerMainScreen
};
/* See Macintosh Human Interface Guidelines (1992) */
/* p. 197 "Basic Dialog Box Layout" */
resource 'DITL' (128, purgeable) {{
/* Quit button */
{ 67, 242, 87, 312 },
Button { enabled, "Quit" },
/* Error text */
{ 7, 73, 54, 312 },
StaticText { enabled,
"Error occurred. Some crazy error. "
"Pad this out, we want it to stretch "
"across three lines of texty!" },
/* Icon */
{ 10, 20, 42, 52 },
Icon { enabled, 128 }
}};
To build, run the following commands in MPW. Note that the ∂
character is the escape character for MPW’s shell syntax.
SC main.c
Link -t APPL -c '????' -o HelloWorld ∂
main.c.o "{Libraries}Interface.o" "{Libraries}MacRuntime.o"
Rez -a -o HelloWorld resources.r icons.r
The spacing in the UI follows the Human Interface Guidelines (23 pixels and 13 pixels of between elements). Here’s what it looks like on-screen, with a custom icon:
For now, I’m not making a project out of this, but I might do some more experimentation.