MacForth 4.2
Volume Number: 8
Issue Number: 1
Column Tag: Jörg's Folder
MacForth 4.2 & Other Forth News
By Jörg Langowski, MacTutor Regular Contributing Author; Neil
Ticktin, Editor, MacTutor Magazine
Note: Source code files accompanying article are located on MacTech CD-ROM or
source code disks.
MACH2 Update
As many of you already know, Palo Alto Shipping has all but formally abandoned
MACH2. Users that call Palo Alto Shipping for technical support report that no one
answers the phone and that messages are not returned. As a result, for those of you out
there who still use MACH2, MacTutor suggests that you may want to look elsewhere for
your Forth needs. [We’ve arranged with Creative Solutions a trade-in of MACH2 for
MacForth for all MacTutor readers. To take advantage of the offer, you will need to send
Creative Solutions your original MACH2 disks and $99. The offer is good through May
31, 1992. - Ed.]
MacForth® 4.2
Creative Solutions, Inc. (CSI) has been shipping a long standing Forth product
for Macintosh since February, 1984. In January, 1992, CSI announced a new version
of MacForth® Plus - Version 4.2. As far as we know, MacForth is the only commercial
Forth compiler for Macintosh at this time. But even if it was in a crowded marketplace,
it would stand out. Compared to products such as MACH2, MacForth is a very
full-featured product. But more importantly, MacForth is published by a company that
has a strong commitment to Forth and to supporting their users.
MacForth Plus features a built-in text editor, assembler, turnkey compiler,
high-level toolbox support, extensive debug tools, a 500-page manual and many
optional tools disks. Additionally, many popular software programs like Swivel 3D,
Hidden Agenda, and Voyager are written in MacForth. MacForth was originally written
by Don Colburn in 1984. CSI has provided updates to support all the major changes
through which Apple has taken the Macintosh line. The current release was written by
Xan Gregg, a third party developer, and features the following.
High Level Event support, core Apple Events handled through a built-in editor.
High Level Events (HLE’s) are supported through kernel additions and the extension file
“AppleEvents”. A constant HIGH.LEVEL.EVENT = 23 was added, and the constant
IN.CLOSE.BOX was changed from 23 to 26. Any code that depends on IN.CLOSE.BOX being
23 will have to be changed. The most recent HLE is stored in
HIGH.LEVEL.EVENT.RECORD, which is much like MOUSE.DOWN.RECORD and KEY.STROKE
in that the record is padded by two bytes at the beginning. HLE’s are buffered by
MacForth-like key events, which means that no HLE’s will be accepted until the last one
has been processed. The actual HLE handling is done by words in the extension file,
which was first written by George Furnival.
Among other things, MacForth Plus Version 4.2 adds the following:
• 68040 Compatibility.
• PPC interface for System 7’s Program-to-Program Communication
• MacsBug interface, allows high-level debugging of MacForth in MacsBug.
• Offscreen GWorld support.
• CSI graphics allowed in non-MacForth grafPorts.
• Editor enhancements.
• Updated On-line Glossary.
• Increased tokens via a new “Indirect Kernel”.
• Gestalt is now always available, on any machine.
• PaperHi now uses HiPrinting to print listings.
• SetPort trap used when changing ports (i.e., (WINDOW)).
• More Extensions files from Greg Guerin: Bitting, Lacking, Chain Ops, Easy SFP...
• Local Names.
• Miscellaneous kernel improvements: NIP, TUCK, CROPW, EXTENDW, <=, >=,
0<=....
• Faster StripAddress implemented as per Mac Tech Note #213 which improves
compile times.
• MacForth uses less time when in the background.
• Extra A5 globals allocated.
• Bug Fixes...
MacForth Plus now can generate small stand-alone code fragments. You can
write XCMDs, drivers, FKEYs, and so on. A trivial example, creating an FKEY that
beeps, is given in the manual:
: beeper 30 sysbeep ;
When you execute that code, it beeps on execution. When you then write:
SA beeper
MacForth creates a stand-alone code fragment that has the same behavior as the
word under the Forth system. That means, since MacForth uses token-threading, it adds
a “mini-kernel” to the Forth code which executes the tokens. It will also add code to set
up the registers for the Forth world and restore them after execution to their old
values. A handle to the stand-alone code segment is contained in the global variable
sa. handle, so to test your FKEY you write:
sa.handle ascii FKEY 5 “ Beeper”
add.bag. resource
and Cmd-Shift-5 will beep at you. The “resource bag” to which the FKEY is
added by add.bag. resource, is a resource file that MacForth opens on startup and which
contains your custom resources that your program might need. Resources can be added
and deleted from that file during a development session.
Stand-alone code is just one example of the multitude of features of MacForth. A
way of object-oriented programming with message passing and inheritance is supported
through the use of “Actels” (for “active elements”), and MacForth vocabularies
themselves are such actels.
Another very interesting and useful concept used in MacForth are “relative
chains”. This is a kind of linked list, and it is used in the MacForth kernel in a number
of places. For instance, there are the so-called Restorer and Exodus chains. These are
lists of words to be executed at startup and exit of the MacForth system, so you can
easily add setup and cleanup routines. The Eventer chain can be used to add
special-purpose event handlers. It is executed in the main event loop: the first word in
the chain receives an event code, decides what to do with the event, processes it or not,
and then passes on a flag (true if processed and false if not) and a new event code to the
next word in the chain, and so on until the end of the chain is reached.
In addition to MacForth, Creative Solutions has been a key supplier of
development tools for the Macintosh and other 68000 based computers since 1980.
They currently provide a line of add-on boards for the Macintosh II and SE/30 that
provide prototyping tools, serial, parallel extensions, SCSI communications, and other
custom designs.
MACH2 Patch for Better System 7 Compatibility
Steve Wiley, a MacTutor reader in Utah, has done Palo Alto Shipping’s work and
figured out a set of patches to Mach2 (2.14) which make it compatible with System 7,
although not System 7-aware.
“Jörg, I would be glad to document the changes and how to make Mach2 System
7 compatible. Mach2 is still not 100% compatible. The debugger will not work, I
think because they changed some of the interrupt vectors in System 7. This is not a
problem [if you] use [a debugger like] TMON professional for debugging. This works
very well with MACH2.
“Below I have described how MACH2 can be modified to run properly under
System 7, and still remain compatible with older systems. There are three major
incompatibilities with the current version (2.14) of MACH. The first is that MACH 2
is not MultiFinder aware. The second is that MACH expects Monaco 9pt font to be a
standard system resource (not true under System 7). The third involves changes in the
System 7 interrupt vectors that cause MACH’s resident debugger to crash. [The fourth
problem, as you will see below, is that Mach2 does NOT run with virtual memory under
any circumstances at the moment. This is a serious drawback, e.g., compared to
MacForth, and cannot be fixed by simple patches, but needs major rewriting of the Forth
system - JL].
“The first two problems are easy to fix. The third cannot be easily patched, but
is really not a problem since “real” debuggers (such as the excellent TMON
Professional) are far superior to the limited built-in facility. My programming
environment currently consists of QUED/M 2.09, MACH2 and TMON together with a few
utilities written with MACH 2 itself. Under System 7, this is a great combination and
works quite smoothly (e specially with a Mac IIfx!)
The changes made in MACH2 have two aims. The first is to allow the
programming system to run and compile under System 7. The second is to allow
programs written and compiled in MACH2 to run properly. Since “MultiFinder” is
always running under System 7, the most important change is to make MACH2 fully
MultiFinder aware and compatible. This means implementation of WaitNextEvent instead
of GetNextEvent as well as Suspend/Resume events. You published a nice article on the
implementation of WaitNextEvent in MacTutor, but as pointed out by Murray Anderegg,
this implementation assumed that the compile-time environment was the same as the
run-time. A more ambitious effort to modify the main MACH2 IOTask to be MultiFinder
compatible was provided by Murray Anderegg in an upload to GEnie, but his
implementation also has limitations. Basically, Anderegg assumed that all sub-tasks in
the MACH2 event loop are launched before the first execution of the main event loop.
The main loop would then install default Suspend/Resume routines into each tasks. For
small programs, this may be true, but is hardly likely in a more complex program. A
more general (if inconvenient) approach is to simply install a Suspend/Resume handler
into each task as they are activated. This is will always work and has the advantage that
each task can use its own custom handler and do as much (or as little) as necessary
during suspend or resume. A second problem with Anderegg’s patch was that he wrote a
Suspend/Resume handler as if it was a pseudo Activate/Deactivate event. I found that
this frequently crashed my programs. In my approach, I modified the Suspend/Resume
routine published in the article by David Kelly and David Smith in the Feb. 88 issue of
MacTutor. This routine may perform extra (unnecessary?) work, but I have found that
it works under all testing conditions.
“The following are the patches made to the IOTask code necessary to make MACH2
fully MultiFinder aware. Most of these changes were originally written by Murray
Anderegg, with the exception of the DoSuspendResume code. These are the additions made
to the IOTask code made available from PASC. [Additions see listing - JL]
“After these routines and patches are installed, it is necessary to use ResEdit to
modify the SIZE resource. This will allow the system to pass the appropriate events to
MACH. Remember, there are two resources to modify. One is within MACH2 itself. This
is the one which is used within the programming environment. The second is the
MACH.RSRC file which will be included within the compiled and “TURNKEYed”
application itself. Use ResEdit to open the SIZE -1 resource. Set Accept suspend events
and Can background to true (1). The other settings should be set to false. Save the
resource.
“The next step is to install Monaco 9pt font into the MACH2 resource fork. This
is the font that MACH uses for its interactive screen. Apparently, MACH checks for the
availability of this font when it is first run. Since System 7 uses TrueType fonts, the
absence of a true Monaco 9pt font resource in the system generates an error and
pr events updating of the interacting screen. However, since the resource manager will