Mar 94 Tips
Volume Number: 10
Issue Number: 3
Column Tag: Tips & Tidbits
Tips & Tidbits 
Using GWorlds and the Pallette Manager
Edited by Scott Boyd and Neil Ticktin
Note: Source code files accompanying article are located on MacTech CD-ROM orsource code disks.
Tip Of The Month
Studies have shown that anyone who has to focus visual attention in one place for
a long time (like a computer user), will blink less often. This makes your eyes dry,
and is the main cause of eyestrain. Even though blinking is a reflex action and usually
outside of conscious control, there’s an easy way to increase your blink-rate.
Write the word “Blink!” on a small piece of paper. Then stick it someplace on
your computer monitor where you will always be able to see it. Put one on every
monitor you have. Every time you notice it, follow the instruction: Blink a couple of
times, and look away from your monitor to focus on some distant object for a few
seconds. Then get back to work before your boss catches you staring off into space.
You’ll notice the paper a lot at first, eventually less often. The initial effect is
just to make you think about it. But even after you stop noticing it consciously, leave
the note there. It has a subliminal “training” effect that makes you blink more often.
It’s like tying a string around your finger to help you remember something. This
really works to reduce eyestrain. But it’s so simple and inexpensive that most people
don’t believe it until they’ve used it for a while.
- Lee David Rimar, Absoft Corporation
[As with all tips, consult your physician before trying this at home! - Ed. nst]
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.
Down and dirty
The following two MOVE instructions will load a zero into lower D0 on a 68000
processor and a one on 68020 or better.
/* 1 */
; Get offset to be scaled
303C 0001 Move.W #1,D0
; Get one of the two bytes 00 or 01!
103B 02FB Move.B *-3(PC,D0.W*2),D0
This is a much cheaper way than _Gestalt to find out if the 32x32 => 64 multiply
instructions are available, etc. To see why this works, first consider 68020 or better
hardware. After the Move.W instruction lower D0 will contain the value one. The
*-3(PC) part of the Move.B addresses the 3C byte of the Move.W instruction, but
indexing by D0 is also specified. Since the scaling field is two, the effective index is
two times one or two. Thus the Move.B fetches the byte two down from the 3C byte,
which is the 01 byte. Thus on 68020 or better hardware we get a one.
Now consider 68000 hardware. It does not implement index scaling, nor does it
notice it being called for! Thus a 68000 will execute the Move.B instruction as if it
were the instruction:
/* 2 */
Move.B *-3(PC,D0.W),D0
Now the effective index is one (not two) and the zero byte that is one down from
the 3C byte is loaded. Thus on 68000 hardware we get a zero. Note also that the Zero
toggle will be set on 68000 and cleared on 68020 or better hardware. This allows an
immediate BZ/BEq or BNZ/BNE to be used.
The information that the 68000 processor fully decodes all 16384 possible
opcode words but does not fully decode the addressing modes in extension words can be
found in the Advanced Topics appendix of Motorola's MC68020 32-Bit Microprocessor
User's Manual (Second Edition).
- Charles Cranston
zben@ni.umd.edu
Starting an init
I always the following code for the entry point for an INIT, WDEF or any other
code resource. This template can only be used with Think C, as it uses assembly and it
relies on A4 to reference globals. The 'Custom Header' must be checked in the 'Set
Project Type'- dialog.
/* 3 */
void main (void) ;
void header (void) ;
void header (void)
{
asm {
BRA.S @next ; jump over the following data
DC.L 'TMON' ; tell TMON todo label- searching
DC.L 'INIT' ; use this and the next 4 bytes to label
DC.L 'SPPS' ; this code resouce
next:
LEAheader, A0 ; load the address of the code resource in A0
JMP main ; jump to main
}
}
#include // We need this if we have globals
void main (void)
{ Ptr mySelf ; // pointer to this code resource
asm {
move.l A0, mySelf
}
RememberA0() ; // put A0 in a save spot
SetUpA4() ; // and use it to set up A4
RestoreA4() ;
The low-level debugger TMON looks for MacsBug labels in code resources that it
knows about. If it doesn’t know the type of a resource to be code, or if it is detached and
no longer a resource, TMON will not show labels in the code. The TMON User Area
'AddRange/TMON.fixed' looks for the string 'TMON' two bytes into every block it finds,
and then asks TMON to scan it for labels. It was written by Ken Schalk and it is
available on bulletin boards.
The following two strings mark what the block is about. This is great for
debugging. If I want to set a breakpoint, I simply search for these strings in memory,
After the 'next' label, I load the address of the start of the code resource in
register A0. This is required by Think C so that it can retrieve it to set A4 for
accessing globals. The statements RememberA0() and SetUpA4() do the trick. Always
be sure to call RestoreA4() before leaving the routine. A0 contains a pointer to the
start of the block, and I save it in the variable 'mySelf'. If I want to keep the code in
memory afterwards, I simply have to execute
'DetachResource(RecoverHandle(mySelf))'.
- Jan Bruyndonckx
Wave Re search, Belgium
Tiny MPWScript
Here’s a tiny MPW script I find indispensible when collaborating on an MPW
project. It lets you instantly open the files that your coworkers have changed.
The CheckOut command does have a -open option, but with this script you can
choose which files to open and in what order, and you can wait until later to do it. Of
course, once you have a file open you can use CompareRevisions to see what changed.
Put this script in your MPW:Scripts folder and call it “Checked”. Opens the file
referenced in the output of a projector CheckOut -p command:
/* 4 */
Checked out "HD:Blah:Blah.c,9" from "Blah∫".
You can execute lines of this form directly from your worksheet (in groups or
individually). This is an amazingly complicated script...not! It ignores its first
argument, which is always “out”, its third argument, which is always “from”, and its
fourth argument, which is the project pathname. All we care about is the second
argument, which is almost the filename that we want the trick is ignoring the
comma and digits at the end, which we do by matching the argument against a regular
expression (see “help patterns”).
/* 5 */
(evaluate "{2}" =~ /()®1,[0-9.]+/ ) > Dev:Null
open "{®1}
Yes, it’s a two-line script.
- Dave Lyons