TweetFollow Us on Twitter

Mar 89 Letters
Volume Number:5
Issue Number:3
Column Tag:Letters

Letters

By David E. Smith, Editor & Publisher, MacTutor

INIT29 & Hpat Virsus Wanted!

Steve Sequist is requesting an infected disk with the new INIT29 and Hpat (nVir type) virus so he can update last month's Security Patrol anit-virus program to detect and destroy them. If you have one or both, please send an infected disk, clearly marked with a skull and crossbones, to MacTutor, PO Box 400, Placentia, CA 92670, attn: Virus! -Ed

Watch Cursor Revisited

Jan Eugenides

Waterbury Center, VT

David Stoops’ Animated Cursors from the December issue was interesting, but it had two deficiencies:

1) It was hard-coded for eight cursors, instead of obtaining the real number of cursors from the ‘acur’ resource,

2) It used SetUpA5 and RestoreA5, which should no longer be used.

I recoded the example in MPW C 3.0b1, with the modifications, and here is the result. I also changed to an ‘acur’ resource with an ID of 128, so as not to conflict with any system resources. The Rez source code for the watch ‘acur’ and the associated cursors are as follows:

/* 1 */

#include <Types.h>
#include <Resources.h>
#include <QuickDraw.h>
#include <OSUtils.h>
#include <Retrace.h>
#include <Memory.h>
#include <ToolUtils.h>
#include <Strings.h>
#include <Errors.h>

typedef struct {
 short  numCurs; /*number of cursor “frames” */
 short  whichCur;/*used as “frame” counter*/
 CursHandle Curs[1]; /*can actually be any number of cursors here*/
 }acur;
typedef acur*acurPtr,**acurHandle;

static acurHandleCurList;
static VBLTask   VBL;

pascal void AnimateWatch()  /*the VBL routine*/
{
long    oldA5;

oldA5 = SetCurrentA5();
if((*CurList)->whichCur >= (*CurList)->numCurs-1 )
 (*CurList)->whichCur = 0;
else
 (*CurList)->whichCur ++;
SetCursor(*((*CurList)->Curs[(*CurList)->whichCur]));
VBL.vblCount = 10;
SetA5(oldA5);
}

InitWatch()
{
short   curCount;

CurList = (acurHandle)GetResource(‘acur’,128);
for(curCount = 0; curCount < (*CurList)->numCurs; curCount++)
 (*CurList)->Curs[curCount] = GetCursor(HiWord((long)(*CurList)->Curs[curCount]));
(*CurList)->whichCur = 0;
}
StartWatch()
{
OSErr   err;

VBL.qType = vType;
VBL.vblAddr = (VBLProcPtr)AnimateWatch;
VBL.vblCount = 10;
VBL.vblPhase = 0;
err = VInstall((QElemPtr)&VBL);
}

StopWatch()
{
OSErr err;

err = VRemove((QElemPtr)&VBL);
}
/* 2 */

#include “types.r”

data ‘acur’ (128, locked, preload) {
 $”00 08 00 00 01 00 00 00 01 01 00 00 01 02 00 00"
 $”01 03 00 00 01 04 00 00 01 05 00 00 01 06 00 00"
 $”01 07 00 00"
};
resource ‘CURS’ (263, locked, preload) {
 $”3F 00 3F 00 3F 00 3F 00 40 80 80 40 90 40 88 60"
 $”9C 60 80 40 80 40 40 80 3F 00 3F 00 3F 00 3F”,
 $”3F 00 3F 00 3F 00 3F 00 7F 80 FF C0 FF C0 FF C0"
 $”FF C0 FF C0 FF C0 7F 80 3F 00 3F 00 3F 00 3F”,
 {8, 8}
};
resource ‘CURS’ (262, locked, preload) {
 $”3F 00 3F 00 3F 00 3F 00 40 80 80 40 80 40 80 60"
 $”BC 60 80 40 80 40 40 80 3F 00 3F 00 3F 00 3F”,
 $”3F 00 3F 00 3F 00 3F 00 7F 80 FF C0 FF C0 FF C0"
 $”FF C0 FF C0 FF C0 7F 80 3F 00 3F 00 3F 00 3F”,
 {8, 8}
};
resource ‘CURS’ (261, locked, preload) {
 $”3F 00 3F 00 3F 00 3F 00 40 80 80 40 80 40 80 60"
 $”9C 60 88 40 90 40 40 80 3F 00 3F 00 3F 00 3F”,
 $”3F 00 3F 00 3F 00 3F 00 7F 80 FF C0 FF C0 FF C0"
 $”FF C0 FF C0 FF C0 7F 80 3F 00 3F 00 3F 00 3F”,
 {8, 8}
};
resource ‘CURS’ (260, locked, preload) {
 $”3F 00 3F 00 3F 00 3F 00 40 80 80 40 80 40 80 60"
 $”9C 60 84 40 84 40 40 80 3F 00 3F 00 3F 00 3F”,
 $”3F 00 3F 00 3F 00 3F 00 7F 80 FF C0 FF C0 FF C0"
 $”FF C0 FF C0 FF C0 7F 80 3F 00 3F 00 3F 00 3F”,
 {8, 8}
};
resource ‘CURS’ (259, locked, preload) {
 $”3F 00 3F 00 3F 00 3F 00 40 80 80 40 80 40 80 60"
 $”9C 60 82 40 80 40 40 80 3F 00 3F 00 3F 00 3F”,
 $”3F 00 3F 00 3F 00 3F 00 7F 80 FF C0 FF C0 FF C0"
 $”FF C0 FF C0 FF C0 7F 80 3F 00 3F 00 3F 00 3F”,
 {8, 8}
};
resource ‘CURS’ (258, locked, preload) {
 $”3F 00 3F 00 3F 00 3F 00 40 80 80 40 80 40 80 60"
 $”9F 60 80 40 80 40 40 80 3F 00 3F 00 3F 00 3F”,
 $”3F 00 3F 00 3F 00 3F 00 7F 80 FF C0 FF C0 FF C0"
 $”FF C0 FF C0 FF C0 7F 80 3F 00 3F 00 3F 00 3F”,
 {8, 8}
};
resource ‘CURS’ (257, locked, preload) {
 $”3F 00 3F 00 3F 00 3F 00 40 80 80 40 81 40 82 60"
 $”9C 60 80 40 80 40 40 80 3F 00 3F 00 3F 00 3F”,
 $”3F 00 3F 00 3F 00 3F 00 7F 80 FF C0 FF C0 FF C0"
 $”FF C0 FF C0 FF C0 7F 80 3F 00 3F 00 3F 00 3F”,
 {8, 8}
};
resource ‘CURS’ (256, locked, preload) {
 $”3F 00 3F 00 3F 00 3F 00 40 80 84 40 84 40 84 60"
 $”9C 60 80 40 80 40 40 80 3F 00 3F 00 3F 00 3F”,
 $”3F 00 3F 00 3F 00 3F 00 7F 80 FF C0 FF C0 FF C0"
 $”FF C0 FF C0 FF C0 7F 80 3F 00 3F 00 3F 00 3F”,
 {8, 8}
};

Animated Cursors Again

Erny Tontlinger

Steinfort, Luxembourg

Here are some comments to David Stoops’ Animated Cursors from the December 1988 Letters Column.

There is an error in the procedure InitWatch. The cursor id should be replaced by the cursor handle in the loop this:

/* 3 */

Watch[watchcount] := GetCursor(HiWord(longint(Watch[watchcount])));

The correct structure of a ‘acur’ resource is:

/* 4 */

acur = record
 frames: integer; {Number of frames(cursors) }
 whichWatch : integer;
 Watch : array[1..99] of CursHandle
 { size depends on frames }
end;

Then instead of using a fixed number of eight cursors, use Watch^^.frames, which happens to be eight for the Finder.

The ‘acur’ and ‘CURS’ resources should be locked, otherwise the VBL task runs into troubles with the memory Manager. The Finder uses the ‘CURS’ id 4 (classic watch cursor), which in the System file is not locked. This cursor is also in ROM, from the Mac Plus machines on, so it would be good to set RomMapInsert to mapTrue before calling GetCursor.

SetUpA5 and RestoreA5 might not work as expected under MultiFinder. The value of A5 should be placed in a position, other than CurrentA5 in low memory globals, where the application can find it from within the VBL task. See “Programmer’s Guide to MultiFinder” (APDA# KMB017) the chapter “The A5 world/VBL tasks”.

Now something different. Why is it so difficult to print READABLE program listing in MacTutor? Your desktop publishing program seems to have problems with regular spaced tab positions. Anyhow I appreciate MacTutor very much. [Basically, we convert the source into WriteNow in a 3 1/2" width single column with tabs set at every eighth of an inch. Then we place it into PageMaker. Here is where a number of problems occur as you surmised. PageMaker doesn't exactly import tab information correctly and we have to manually fix it. -Ed]

More Animated Watch Cursors

Rob Terrell

Chapel Hill, NC

In the December issue, you printed a letter that showed how to animate the watch cursor as a VBL task, which I thought was strange since a few issues back you printed another letter that gave a very good reason not to: a VBL task can go on and on while the application has crashed, and the poor user will be stuck thinking everything is okay.

A better way to implement the animated watch is through a unit that just takes a single call to increment the cursor. Support for this exists in TML Pascal II; for those not fortunate as to own TML, here’s a unit that does essentially the same thing:

{5}

Unit WatchItSpin;
(*Make sure you have copied the ‘acur’ and ‘CURS’ *)
(* resources from the Finder into your application *)
(* ResEdit is quite handy for this *)

Interface

Uses MemTypes, QuickDraw, OSintf, Toolintf;

type
 aCur = record
 whichWatch : longint;
 watch : array[1..8] of CursHandle;
 end;
 acurPtr = ^ acur;
 acurHandle = ^acurPtr;
var
 currentWatch : integer;
 WatchList : acurHandle;

Procedure InitSpinner;
Procedure SpinWatch;

Implementation

Procedure InitSpinner;
var
 count : integer;
begin
 watchList := acurHandle(GetResource(‘acur’,0));
 with watchList^^ do begin
 for count := 1 to 8 do
 Watch[count] := GetCursor(HiWord(longint( Watch[count])));
 whichWatch := 0;
 end;
end; (* InitSpinner *)

Procedure SpinWatch;
begin
 with WatchList^^ do begin
 if whichWatch >= 8 then whichWatch := 1
 else whichWatch := whichWatch + 1;
 SetCursor(Watch[whichWatch]^^);
 end;
end; (* SpinWatch *)
end.

Most of this code was simply taken from David Stoops’ letter. However, to use this, you call InitSpinner when you initialize everything else at the beginning of your program; then you call SpinWatch each time through a loop or time-consuming process to increment it. Not quite as nice as having a VBL take care of it, but this way, if you crash, the hands will stop.

Correction to CompareString

Steve Brecher

Sunnyvale, CA

In John S. Stokes III's CompareString routine (Jan 89 Letters), use of the Ext.W instruction introduces an error:

 Move.B (A0),D1  ; length of the first string
 Ext..W D1; dbra uses word

Ext.W propagates the value in bit 15 of the register through bits 16..31. Therefore, it will not have the desired effect of clearing bits 8..15. Ext.B would not work either for cases in which the string length is greater than 127,i.e. , negative considered as a signed byte; in such cases Ext.B would set bits 8..15, making the unsigned word value very large. To convert an unsigned byte value to a word in a register, first clear the word and then move the byte into it:

;6

 Clr.W  D1
 Move.B (A0),D1

Often programmers will write MoveQ #0,Dn instead of Clr.W Dn when the value in the upper word of the register either needs to be cleared also or is not of concern. MoveQ is always a longword operation.

A corrected CompareString would look like this:

;7

; A0  --> Pascal string 1
; A1 --> Pascal string 2
; Returns D0.L=1 if equal, 0 if not equal
; Alters A0-A1

CompareString:
 MoveQ  #0,D0
 Move.B (A0),D0  ;gross len - 1
@0 Cmp.B(A0)+,(A1)+ ;loop until...
 DBne D0,@0 ;...not equal or end
 Seq  D0;D0 := $FF if equal, else 0
 Neg.B  D0;D0 := 1 if equal, else 0
 Rts

The Move.B instruction puts the length byte of string 1 into D0. We want to compare the entire string structures, including their length bytes. The length of the entire structure--the gross length--of a string is the the number of text bytes, plus one for the length byte. For a DBxx instruction, we want the gross length - 1, which is just the value of the length byte.

We use the DBne instruction to control the loop. DBxx will branch to the start of the loop if either the test condition (in this case, “ne”) is false or the loop count is exhausted. Thus DBxx should be read as “branch until xx or counter expired.” When control falls through the DBne, we use the Seq instruction to condition D0 to the result of the last Cmp.B; DBxx instructions do not alter the condition codes. If the strings (including their lengths) are equal, the result of the last Cmp.B will be “eq” and the DBne will have not branched because the D1 counter expired. If the length bytes or contents of the strings are not equal, the last Cmp.B result will have been “ne” and the DBne will have not branched because its “until” condition was met.

[Steve Brecher is a long time friend of MacTutor. We welcome his comments and hope to hear more from him in the coming months. -Ed]

 
AAPL
$113.99
Apple Inc.
+1.98
MSFT
$47.88
Microsoft Corpora
-0.26
GOOG
$534.03
Google Inc.
+5.26

MacTech Search:
Community Search:

Software Updates via MacUpdate

Google Drive 1.18.7821.2489 - File backu...
Google Drive is a place where you can create, share, collaborate, and keep all of your stuff. Whether you're working with a friend on a joint research project, planning a wedding with your fiancé, or... Read more
Eye Candy 7.1.0.1203 - 30 professional P...
Eye Candy renders realistic effects that are difficult or impossible to achieve in Photoshop alone, such as Fire, Chrome, and the new Lightning. Effects like Animal Fur, Smoke, and Reptile Skin are... Read more
Airfoil 4.8.12 - Send audio from any app...
Airfoil allows you to send any audio to AirPort Express units, Apple TVs, and even other Macs and PCs, all in sync! It's your audio - everywhere. With Airfoil you can take audio from any... Read more
Kodi 14.0. - Powerful media center tool...
Kodi (was XBMC) is an award-winning free and open-source (GPL) software media player and entertainment hub that can be installed on Linux, OS X, Windows, iOS, and Android, featuring a 10-foot user... Read more
MegaSeg 5.9.4 - Professional MP3 DJ appl...
MegaSeg is a complete solution for pro audio/video DJ mixing, radio automation, and music scheduling with rock-solid performance and an easy-to-use design. Mix with visual waveforms and Magic... Read more
Parallels Desktop 10.1.2 - Run Windows a...
Parallels Desktop is simply the world's bestselling, top-rated, and most trusted solution for running Windows applications on your Mac. With Parallels Desktop for Mac, you can seamlessly run both... Read more
GarageSale 6.9.1 - Create outstanding eB...
GarageSale is a slick, full-featured client application for the eBay online auction system. Create and manage your auctions with ease. With GarageSale, you can create, edit, track, and manage... Read more
Quicksilver 1.2.2 - Application launcher...
Quicksilver is a light, fast and free Mac application that gives you the power to control your Mac with keystrokes alone. Quicksilver allows you to find what you need quickly and easily, then act... Read more
Mac DVDRipper Pro 5.0.1 - Copy, backup,...
Mac DVDRipper Pro is the DVD backup solution that lets you protect your DVDs from scratches, save your batteries by reading your movies from your hard disk, manage your collection with just a few... Read more
ClamXav 2.7 - Free virus checker, based...
ClamXav is a free virus checker for OS X. It uses the tried, tested, and very popular ClamAV open source antivirus engine as a back end. I hope you like and use ClamXav a lot and that it helps keep... Read more

Latest Forum Discussions

See All

Forget the Gloves – It’s a Cage Match in...
Forget the Gloves – It’s a Cage Match in Real Boxing’s Underground Update Posted by Jessica Fisher on December 23rd, 2014 [ permalink ] | Read more »
Who Wore it Best? Best of 2014
It’s the end of the year, so it’s time for some arbitrary internet awards! In this wrap-up episode of Who Wore it Best? we present our winners for the best, worst, and flat-out weirdest cloned games that graced the App Store in 2014. [ Who... | Read more »
Now You Can Explore Mayan Temples in Ass...
Now You Can Explore Mayan Temples in Assassin’s Creed Pirates’ Newest Update Posted by Jessica Fisher on December 23rd, 2014 [ permalink ] | Read more »
Soft Design aims to do free-to-play righ...
They say a team is only as big as its fans and that’s also certainly the case with video games, judging from the sales certain AAA ‘heavyweights’ get year-after-year. Soft Design took that principle as a core design philosophy and worked closely... | Read more »
Bogga Christmas Tree
Bogga Christmas Tree By Amy Solomon on December 23rd, 2014 Our Rating: Universal App - Designed for iPhone and iPad Bogga Christmas Tree allows young children to trim a tree, any time or place.   | Read more »
Opera Coast 4.0 Launches on iOS with 4 N...
Opera Coast 4.0 Launches on iOS with 4 New Features Posted by Jessica Fisher on December 23rd, 2014 [ permalink ] Universal App - Designed for iPhone and iPad | Read more »
Cricket Kids: Christmas Presents
Cricket Kids: Christmas Presents By Amy Solomon on December 23rd, 2014 Our Rating: Universal App - Designed for iPhone and iPad Cricket Kids: Christmas Presents allows children to play with digital toys opened for the Christmas... | Read more »
Lara Croft & Tomb Raider Mobile Bund...
Lara Croft & Tomb Raider Mobile Bundle – Only $4.99 Posted by Jessica Fisher on December 23rd, 2014 [ permalink ] Lara Croft is coming to you in | Read more »
SimCity BuildIt Review
SimCity BuildIt Review By Nadia Oxford on December 23rd, 2014 Our Rating: :: BUILDING AN OK TOMORROWUniversal App - Designed for iPhone and iPad SimCity BuildIt is a competent city-building game, but its free-to-play trappings are... | Read more »
SimCity Buildit – Tips, Tricks, and Stra...
Hello, Budding Mayors Want to know what we made of all this upgrading and inevitable waiting? Check out our SimCity BuildIt review! SimCity BuildIt is a city-building game from EA. Your job as mayor is to build houses for people to live in, industry... | Read more »

Price Scanner via MacPrices.net

OS X NTP Security Update – What About OS Vers...
Last week, Apple released the OS X NTP Security Update patch for the three most recent versions of the OS, deeming it important enough to make it the company’s first-ever automatic system update for... Read more
Sony Fixing To Launch Large-Screen Android Ta...
Digitimes’ Aaron Lee and Joseph Tsai report that Sony, which last February exited the laptop computer market with the sale of its VIAO PC-making unit to a group of JApanese investors, is now expected... Read more
After Christmas sale: 13-inch Retina MacBook...
B&H Photo has new 13″ MacBook Pros on sale for up to $150 off MSRP as part of their Holiday pricing. Shipping is free, and B&H charges NY sales tax only: - 13″ 2.5GHz MacBook Pro: $1043 save... Read more
After Christmas sale: 15-inch Retina MacBook...
Adorama has 15″ Retina MacBook Pros on sale for up to $150 off MSRP. Shipping is free, and Adorama charges NY & NJ sales tax only: - 15″ 2.2GHz Retina MacBook Pro: $1899 save $100 - 15″ 2.5GHz... Read more
After Christmas sale: MacBook Airs for up to...
B&H Photo has 2014 MacBook Airs on sale for up to $120 off MSRP, for a limited time, for the Thanksgiving/Christmas Holiday shopping season. Shipping is free, and B&H charges NY sales tax... Read more
Apple now offering Certified Refurbished Mac...
The Apple Store is now offering Apple Certified Refurbished 2014 Mac minis, with models available starting at $419. Apple’s one-year warranty is included with each mini, and shipping is free: - 1.... Read more
Will Apple Build An A-series ARM Processor Po...
In computer terms, it’s been a very long time since the MacBook Air had a major redesign. More than four years have elapsed since Apple recast what had originally been more a pricy boutique device... Read more
iPhone 6s mini With Four-Inch Screen Rumored...
The Times of India’s Komal Mohan, citing a story in The Electronic Times of Taiwan, says that unnamed upstream supply chain sources report that Apple is gearing up to launch a new 4-inch screen... Read more
What’s The Current Value Of Your iOS Apps?
Basel, Switzerland based ConIT AG has announced AppZapp Notify and its free PC and Mac tool available for download. What is the present value of all my downloaded Apps? With AppZapp Notify, for the... Read more
PhatWare Releases WritePad Pro Advanced iOS W...
PhatWare Corporation has announced immediate availability of WritePad Pro 2.0, its advanced word processing, note-taking, and document management app which also takes full advantage of PhatWare’s... Read more

Jobs Board

Position Opening at *Apple* - Apple (United...
**Job Summary** As businesses discover the power of Apple computers and mobile devices, it's your job - as a Solutions Engineer - to show them how to introduce these Read more
Position Opening at *Apple* - Apple (United...
…Summary** As a Specialist, you help create the energy and excitement around Apple products, providing the right solutions and getting products into customers' hands. You Read more
Position Opening at *Apple* - Apple (United...
**Job Summary** Being a Business Manager at an Apple Store means you're the catalyst for businesses to discover and leverage the power, ease, and flexibility of Apple Read more
*Apple* Solutions Consultant (ASC) - Apple (...
**Job Summary** The ASC is an Apple employee who serves as an Apple brand ambassador and influencer in a Reseller's store. The ASC's role is to grow Apple Read more
Senior Event Manager, *Apple* Retail Market...
…This senior level position is responsible for leading and imagining the Apple Retail Team's global event strategy. Delivering an overarching brand story; in-store, Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.