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 or source 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, theres 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.
Youll 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. Its like tying a string around your finger to help you remember something. This really works to reduce eyestrain. But its so simple and inexpensive that most people dont believe it until theyve 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 <SetUpA4.h> // 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 doesnt 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 Research, Belgium
Tiny MPWScript
Heres 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, its a two-line script.
- Dave Lyons