Jan 94 Tips
Volume Number: 10
Issue Number: 1
Column Tag: Tips & Tidbits
Tips & Tidbits 
By Neil Ticktin, Editor-in-Chief
Note: Source code files accompanying article are located on MacTech CD-ROM orsource code disks.
Tip Of The Month
The 6-byte Code Resource Stub Trick
Many Macintosh programmers who have debugged a CDEF, LDEF, MDEF, or WDEF
know “the 6-byte code resource stub trick.” Its been covered in MacTech Magazine,
and the wisdom is often passed along online.
To briefly summarize, instead of burying all the code inside a separate code
resource where it can't see the structure of the main program (global variables and
functions), the programmer creates a 6-byte code stub. In that stub is one MC68000
jump-absolute instruction (as hex in a resource: 4EF9 0000 0000). The
programmer replaces the jump destination address (the trailing 32 bits of 0) at
runtime with a function address, then informs the relevant Toolbox manager that it
should use the resource to define a control, list, or window. (Using this trick with a
menu is similar.) Since code is modified, it's always safest to flush the CPU's
instruction cache to avoid confusing (read: crashing) it. Refer to the Apple DSC
Technical Note "Cache As Cache Can" for the long story.
Now, instead of reading and understanding the tech note and including relevant
compensations in your code, you can use a different code resource stub. This stub still
includes the function address, but it uses MC68000 instructions to retrieve the
address as data, avoiding the code modification problem. In hex: 2F3A 0004 4E75
0000 0000. The 32 bits of zero are again the address you replace with a function
address. A disassembly might read:
/* 1 */
MOVE.L *+$0006,-(A7) ; push the DC.L onto the stack for RTS
RTS ; jump to the definition function
DC.L 0 ; placeholder for addr of defn function
Since the DC.L never actually runs as code, there's no risk of confusing the cache
in the CPU. You can use the following C structure declaration to access the address:
/* 2 */
typedef struct
{
short push [2], rts;
void *addr;
}
tCodeStub, *tCodeStubP, **tCodeStubH;
- Pete Gontier
Berkeley, CA
This column is your opportunity to spread the word about little bits of
information that you find out about. These tidbits can be programming related or they
can be user tips that are particularly useful to programmers.
MacTech Magazine will pay $25 for every tip used, and $50 for the Tip of the
Month. Or you can take your award in orders or subscriptions.
To submit a tip, send in a letter to the magazine. E-mail is our preferred
method, but feel free to send something via the US Mail. See page two for all addresses.
If you do send snail mail, enclose a printed copy and a disk copy of the letter so that it
does not have to be retyped.
Precomputing Static value in constants
The compiler is not always smart enough to precompute static values in your
code. Static values are values that stay constant throughout the program and cannot be
changed. By use of constants you can help to compile precomputed values. This saves
time and space in your program.
For example, the compiler will generate code to compute the value of the next
expression at runtime. The code will be larger and slower.
someValue := 5 * 4 + anotherValue + 90;
But, if you use a constant to compute the static value in the above expression, the
compiler will precompute the value and place it in your compiled object code. The code
will be smaller and faster as a result. Change the above expression like this:
CONST
kPrecomputedStaticValue = 5 * 4 + 90;
BEGIN
someValue := kPrecomputedStaticValue +
anotherValue;
(* Other code *)
- Marek Hajek
Incline Village, Nevada
Toggle Invisibles Part 2
I read Lee Rimar’s tip "Toggle Invisibles in MPW" in November, 1993 Tips &
Tidbits column. I found Mr. Rimar's script useful, and I've modified it to avoid making
assumptions about the auto-indent and lock-scroll options. The trick is to use "=~" to
match a regular expression against the three-character result of Format, and extract
the second character into the ®1 variable (see "help patterns" in MPW). (If you're
running out of sensible Command-key combinations, you can use SetKey instead, in
MPW 3.3, to set up a function key, keypad key, control key, or whatever.)
AddMenu Edit "Toggle Invisibles/¥" ∂
'(evaluate "`Format "{active}" -x a`" =~ /?(?)®1?/ ) > Dev:Null ; ∂
if {®1}=="i" ; ∂
Format "{Active}" -a I ; ∂
else ; ∂
Format "{Active}" -a i ; ∂
end'
- Dave Lyons
Apple Computer, Inc.
International system Tip
Attention all single-byte developers!! Your software is ugly on double-byte
machines! (see screen shot) Why? Because any resource that contains an odd number
of text characters has an extra character added to the end (the second byte). Here in
Japan, quality is very important and having funky looking characters on every menu
and dialog box certainly doesn't convey quality. So what to do?
1. Startup your Mac with a double-byte system disk (check any CD-ROMS you have
from Apple for a Japanese "Disk Tools" image.) Don't worry if you can't read
Japanese because the menu items and short-cut keys are the same.
2. Launch ResEdit and open your application's resources (also notice ResEdit has the
extra characters too! A little sloppy for Apple.)
3. Simply open each of you application's resources and find the foreign characters
and backspace over them. Be sure to check everything!! Buttons, dialogs, text
strings, etc. If it has text, it is possible there is problems.
4. When your finished, launch your application (while still in Japanese mode) and
verify that it looks and runs correctly.
5. Restart your system and you're back to where you were! (Warning: depending
upon the version you use, your desktop may be rebuilt on restart)
Even if you don't officially sell your software in Japan, most titles are available
as gray market imports (even though the package says in big letters "For Sale in The
USA Only".) So take a few minutes to improve your reputation for quality!
- Brett Bibby
Tokyo, Japan