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 or source 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 Rimars 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