home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / Information / csmp-v2 / csmp-v2-018.txt < prev    next >
Text File  |  1994-06-07  |  42KB  |  1,112 lines

  1. C.S.M.P. Digest             Thu, 11 Mar 93       Volume 2 : Issue 18
  2.  
  3. Today's Topics:
  4.  
  5.     help calling assembly from C
  6.     Calling external code resources - how?
  7.     What's in an unloaded resource handle?
  8.     SystemClick neccesary in Sys. 7?
  9.     Mac Plus Driver Unit Table
  10.     Hints on getting a spinning cursors..
  11.     Game Animation
  12.  
  13.  
  14.  
  15. The Comp.Sys.Mac.Programmer Digest is moderated by Michael A. Kelly.
  16.  
  17. The digest is a collection of article threads from the usenet newsgroup
  18. comp.sys.mac.programmer.  It is designed for people who read c.s.m.p. semi-
  19. regularly and want an archive of the discussions.  If you don't know what a
  20. newsgroup is, you probably don't have access to it.  Ask your systems
  21. administrator(s) for details.  If you don't have access to news, you can
  22. post articles to any newsgroup by mailing your article to
  23.     newsgroup@cs.utexas.edu
  24. So, to post an article to comp.sys.mac.programmer, mail your article to
  25.     comp-sys-mac-programmer@cs.utexas.edu
  26. Note the '-' instead of '.' in the newsgroup name.  Be sure to ask that
  27. replies be emailed to you instead of posted to the group, and give your
  28. email address.
  29.  
  30. Each issue of the digest contains one or more sets of articles (called
  31. threads), with each set corresponding to a 'discussion' of a particular
  32. subject.  The articles are not edited; all articles included in this digest
  33. are in their original posted form (as received by our news server at
  34. cs.uoregon.edu).  Article threads are not added to the digest until the last
  35. article added to the thread is at least one month old (this is to ensure that
  36. the thread is dead before adding it to the digest).  Article threads that
  37. consist of only one message are generally not included in the digest.
  38.  
  39. The entire digest is available for anonymous ftp from ftp.cs.uoregon.edu
  40. [128.223.8.8] in the directory /pub/mac/csmp-digest.  Be sure to read the
  41. file /pub/mac/csmp-digest/README before downloading any files.  The most
  42. recent issues are available from sumex-aim.stanford.edu [36.44.0.6] in the
  43. directory /info-mac/digest/csmp.  If you don't have ftp capability, the sumex
  44. archive has a mail server; send a message with the text '$MACarch help' (no
  45. quotes) to LISTSERV@ricevm1.rice.edu for more information.
  46.  
  47. The digest is also available via email.  Just send a note saying that you
  48. want to be on the digest mailing list to mkelly@cs.uoregon.edu, and you will
  49. automatically receive each new issue as it is created.  Sorry, back issues
  50. are not available through the mailing list.
  51.  
  52. Send administrative mail to mkelly@cs.uoregon.edu.
  53.  
  54.  
  55. -------------------------------------------------------
  56.  
  57. From: eapg070@orion.oac.uci.edu (Caroll Elke Pohl)
  58. Subject: help calling assembly from C
  59. Organization: University of California, Irvine
  60. Date: 23 Jan 93 19:13:05 GMT
  61.  
  62. greetings mac programmers!
  63.  
  64. i wonder if someone out there can assist me with a small problem.
  65. i'm using MPW (3.2) and want to call an assembly language subroutine
  66. i wrote from a C program _however_ i want to pass the parameters in
  67. A0 and A1 instead of using the stack (much like certain memory
  68. manager traps). how can i get the C compiler to recognize this fact?
  69.  
  70. on a related matter, can anyone recommend a good book on writing
  71. assembly programs on the mac.
  72. a perfect book would include:
  73. 1) writing MC68000 code in general
  74. 2) using mac traps, pascal and C stack frames and the like
  75. 3) using the MPW assembler. things like:
  76.    a) special syntax
  77.    b) all the assembler directives and keywords
  78.    c) how to do more complicated things like segmenting
  79.         and external routines.
  80.  
  81. any recommendations would be much appreciated.
  82. please e-mail.
  83.  
  84. - -caroll
  85.  
  86. *********************************************
  87.                       ) """ (
  88.                        (Q Q)
  89.    Don't spook        (  |  )
  90.     the horse!         \ A /
  91.                        (___)
  92. *********************************************
  93.  
  94. +++++++++++++++++++++++++++
  95.  
  96. From: keith@taligent.com (Keith Rollin)
  97. Organization: Taligent
  98. Date: Mon, 25 Jan 1993 01:34:42 GMT
  99.  
  100. In article <2B6198C1.22487@news.service.uci.edu>, eapg070@orion.oac.uci.edu
  101. (Caroll Elke Pohl) wrote:
  102. > i wonder if someone out there can assist me with a small problem.
  103. > i'm using MPW (3.2) and want to call an assembly language subroutine
  104. > i wrote from a C program _however_ i want to pass the parameters in
  105. > A0 and A1 instead of using the stack (much like certain memory
  106. > manager traps). how can i get the C compiler to recognize this fact?
  107.  
  108. You came really close to answering your own question. You know that there
  109. are Mac OS functions that work like this, so why don't you declare your
  110. function the same way they are? For instance:
  111.  
  112. #pragma parameter DisposePtr(__A0)
  113. pascal void DisposePtr(Ptr p); 
  114.  
  115. This is an example of a function that simply takes a parameter in A0.
  116. Here's a more complex example:
  117.  
  118. #pragma parameter __D0 HoldMemory(__A0,__A1)
  119. pascal OSErr HoldMemory(void *address,unsigned long count); 
  120.  
  121. HoldMemory takes the first parameter ("address") in A0, and the second
  122. parameter ("count") in A1. It returns its result in D0 (which will be
  123. treated like a short, because the function is declared to return an OSErr).
  124.  
  125. - -----
  126. Keith Rollin
  127. Phantom Programmer
  128. Taligent, Inc.
  129.  
  130. +++++++++++++++++++++++++++
  131.  
  132. From: absurd@apple.apple.com (Tim Dierks, software saboteur)
  133. Date: Tue, 26 Jan 1993 22:57:21 GMT
  134. Organization: MacDTS Marauders
  135.  
  136. In article <keith-240193173019@kip-50.taligent.com>, keith@taligent.com
  137. (Keith Rollin) wrote:
  138. > In article <2B6198C1.22487@news.service.uci.edu>, eapg070@orion.oac.uci.edu
  139. > (Caroll Elke Pohl) wrote:
  140. > > 
  141. > > i wonder if someone out there can assist me with a small problem.
  142. > > i'm using MPW (3.2) and want to call an assembly language subroutine
  143. > > i wrote from a C program _however_ i want to pass the parameters in
  144. > > A0 and A1 instead of using the stack (much like certain memory
  145. > > manager traps). how can i get the C compiler to recognize this fact?
  146. > You came really close to answering your own question. You know that there
  147. > are Mac OS functions that work like this, so why don't you declare your
  148. > function the same way they are? For instance:
  149. > #pragma parameter DisposePtr(__A0)
  150. > pascal void DisposePtr(Ptr p); 
  151. > This is an example of a function that simply takes a parameter in A0.
  152. > Here's a more complex example:
  153. > #pragma parameter __D0 HoldMemory(__A0,__A1)
  154. > pascal OSErr HoldMemory(void *address,unsigned long count); 
  155. > HoldMemory takes the first parameter ("address") in A0, and the second
  156. > parameter ("count") in A1. It returns its result in D0 (which will be
  157. > treated like a short, because the function is declared to return an OSErr).
  158. > -----
  159. > Keith Rollin
  160. > Phantom Programmer
  161. > Taligent, Inc.
  162.  
  163. Unfortunately, MPW doesn't currently work this way (please correct me
  164. if I'm wrong).  While it does use the #pragma register syntax to specify
  165. register passing, I believe it only works for hex inlined functions;
  166. i.e., it's only useful for specifying Toolbox calls or other code
  167. that doesn't require linking, because you can't specify symbols.
  168. This means that if your assembly routine is short (or even if it's not),
  169. you can assemble it, convert it to a bunch of hex constants, and
  170. define it in the same way MPW defines inline code:
  171.  
  172. #pragma parameter __D0 MyWackyFunction(__A0)
  173. long MyWackyFunction(char *data) = {0xDEAD, 0xFACE, 0xBABE};
  174.  
  175. or whatever your hex constants are.  This should work as long as your
  176. assembly routine doesn't call other routines or refer to global
  177. variables; i.e., any routine which is entirely self-contained.
  178. Also, your function needs to take its arguments in particular
  179. registers: #pragma parameter can only pass arguments or get
  180. results in the "scratch" registers: D0, D1, D2, A0, and A1.
  181.  
  182. This approach obviously isn't for all code.  You've got two alternatives:
  183. the best one is just to write a little routine in assembly which pulls
  184. the arguments for the function off of the stack and puts them into
  185. registers, then calls the function, or convert your function so it
  186. takes its parameters on the stack.  An alternative is to use a hex
  187. inlined function which takes its destination in a register and JSRs
  188. to it:
  189.  
  190. #pragma parameter __D0 CallMyWackyFunction(__A0,__A1)
  191. long CallMyWackyFunction(char *data,void *myWackyFunctionPtr) = 0x4E91;
  192.  
  193. (0x4E91 is the hex opcode for a JSR (A1)).  You can call this like so:
  194.  
  195. result = CallMyWackyFunction(data,MyWackyFunction);
  196.  
  197. By passing a pointer to the routine you wish to call, this avoids the
  198. problem that the hex inline can't call the function itself because
  199. it can't contain symbols that need to be linked.
  200.  
  201. Hope all this helps;
  202. Tim Dierks
  203. MacDTS, but I speak for myself
  204.  
  205. ---------------------------
  206.  
  207. From: jochen@blanc.north.de (Jochen Meyer)
  208. Subject: Calling external code resources - how?
  209. Date: 23 Jan 93 11:10:15 GMT
  210. Organization: Jochen & Son
  211.  
  212. Hello, folks!
  213.  
  214. I am currently writing a program that I want to be extensible. The
  215. most common way of handling extensibility seems to be using external
  216. code resources, like in Canvas or BBEdit.
  217.  
  218. Where can I find information on how to do this? The Segment Manager
  219. chapter of IM gives no clues on this. Anyone has got some sample code
  220. on this?
  221.  
  222. Thanks
  223.     Jochen
  224.  
  225.  
  226.  
  227.  
  228. - -------------------------------------------------------------
  229. | Jochen Meyer         |  Internet: jochen@blanc.north.de   |
  230. | Sandfurter Weg 11a   |  phone: (+49) -441 / 50 85 47      |
  231. | D-2900 Oldenburg     |------------------------------------|
  232. |----------------------|"Features are well-documented bugs."|
  233.  
  234. +++++++++++++++++++++++++++
  235.  
  236. Organization: Royal Institute of Technology, Stockholm, Sweden
  237. Date: Mon, 25 Jan 1993 00:52:16 GMT
  238.  
  239. In <01050014.odph61@blanc.north.de> jochen@blanc.north.de (Jochen Meyer) writes:
  240.  
  241. >Where can I find information on how to do this? The Segment Manager
  242. >chapter of IM gives no clues on this. Anyone has got some sample code
  243. >on this?
  244.  
  245. Your extensions can't get at your globals, however,
  246. you're not lost.
  247.  
  248. Define an interface for the extensions, consisting of ONE
  249. function that takes a lot of interesting parameters,
  250. like a handle to some data and a command, and a handle to
  251. put retusn data in, and returns an err code.
  252.  
  253. The just load in the resource, lock it, and call the dereferenced
  254. resource as a function pointers with the right arguments.
  255.  
  256. Something like:
  257.  
  258. typedef short ( * myFuncType ) ( short code , Handle dataIn , Handle dataOut ) ;
  259.  
  260. Code resources have a main with the same arguments, and
  261. you call 'em like:
  262.  
  263.     Handle h = GetResource ( 'Xtns' , 128 ) ; /* Whatever */
  264.     HLockHi ( h ) ;
  265.     result = ( * h ) ( theCode , theInData , theOutData ) ;
  266.     ReleaseResource ( h ) ;
  267.  
  268. Cheers,
  269.  
  270.                         / h+
  271. - -- 
  272.  -- Jon W{tte, h+@nada.kth.se, Mac Hacker Deluxe --
  273.  
  274.    There's no sex act that can't be made better with Yell-O.
  275.  
  276. +++++++++++++++++++++++++++
  277.  
  278. From: keith@taligent.com (Keith Rollin)
  279. Organization: Taligent
  280. Date: Mon, 25 Jan 1993 01:59:02 GMT
  281.  
  282. In article <01050014.odph61@blanc.north.de>, jochen@blanc.north.de (Jochen
  283. Meyer) wrote:
  284. > I am currently writing a program that I want to be extensible. The
  285. > most common way of handling extensibility seems to be using external
  286. > code resources, like in Canvas or BBEdit.
  287. > Where can I find information on how to do this? The Segment Manager
  288. > chapter of IM gives no clues on this. Anyone has got some sample code
  289. > on this?
  290.  
  291. If you have Technote #256, read it. If you don't, log onto ftp.apple.com,
  292. go to /dts/mac/tn/patforms.tools and download the file called
  293. stand-alone-code.hqx. It will tell you just what you want.
  294.  
  295. Just to whet your appetite, here's some code that I use to call CDEF's
  296. directly:
  297.  
  298.  
  299. typedef pascal long (*CDEFProc)(short varCode, ControlHandle theControl,
  300.                                     short msg, long param);
  301.  
  302. long CallCDEF(ControlHandle theControl, short msg, long param)
  303. {
  304.     CDEFProc*    defProcHandle;
  305.     GrafPtr        oldPort;
  306.     char        oldState;
  307.     long        result;
  308.             
  309.     defProcHandle = (CDEFProc*) StripAddress((**theControl).contrlDefProc);
  310.  
  311.     if (defProcHandle != nil) {
  312.  
  313.         if (*defProcHandle == nil)  {
  314.             LoadResource((Handle) defProcHandle);
  315.         }
  316.  
  317.         if (*defProcHandle != nil) {
  318.         
  319.             GetPort(&oldPort);
  320.             SetPort((**theControl).contrlOwner);
  321.             
  322.             oldState = HGetState((Handle) defProcHandle);
  323.             HLock((Handle) defProcHandle);
  324.             
  325.             result = (*defProcHandle)(GetCVariant(theControl), theControl, msg,
  326. param);
  327.                                         
  328.             HSetState((Handle) defProcHandle, oldState);
  329.             SetPort(oldPort);
  330.             
  331.             return result;
  332.         }
  333.     }
  334.  
  335.     SysError(dsCDEFNotFound);
  336. }
  337.  
  338.  
  339. - -----
  340. Keith Rollin
  341. Phantom Programmer
  342. Taligent, Inc.
  343.  
  344. +++++++++++++++++++++++++++
  345.  
  346. From: lari@cs.unc.edu (Humayun Lari)
  347. Date: 25 Jan 1993 12:10:32 -0500
  348. Organization: The University of North Carolina at Chapel Hill
  349.  
  350. tte) writes:
  351. [deleted]
  352. >you call 'em like:
  353. >
  354. >    Handle h = GetResource ( 'Xtns' , 128 ) ; /* Whatever */
  355. >    HLockHi ( h ) ;
  356. >    result = ( * h ) ( theCode , theInData , theOutData ) ;
  357. [rest deleted]
  358.  
  359. It's a good idea to StripAddress the pointer first, say:
  360.         funcPtr = StripAddress(*h);
  361.         result = funcPtr(theCode, theInData, theOutData);
  362.  
  363. This is really only necessary if the code resource will call SwapMMUMode,
  364. but it's better to be safe...
  365.  
  366. Humayun Lari
  367. (lari@cs.unc.edu)
  368.  
  369. +++++++++++++++++++++++++++
  370.  
  371. From: time@ice.com (Tim Endres)
  372. Date: Mon, 25 Jan 93 15:59:44 EST
  373. Organization: ICE Engineering, Inc.
  374.  
  375.  
  376. tte) writes:
  377. > >Where can I find information on how to do this? The Segment Manager
  378. > >chapter of IM gives no clues on this. Anyone has got some sample code
  379. > >on this?
  380. > Your extensions can't get at your globals, however,
  381. > you're not lost.
  382.  
  383. uAccess extensions can get at the globals of uAccess. These globals
  384. have been placed inside of a large data structure inside of uAccess
  385. and uAccess hands a pointer to this structure to the extension. The
  386. globals in this data structure are only those that it is felt the
  387. extension would need to access, and are "stable" enough to be locked
  388. down to a documented data structure. However, it does make for some
  389. very powerful possibilities.
  390.  
  391.  
  392. tim endres - time@ice.com  (UUCP: heifetz!tbomb!time)
  393.  
  394. USENET - a slow moving self parody... ph
  395.  
  396. +++++++++++++++++++++++++++
  397.  
  398. From: peter@cujo.curtin.edu.au (Peter N Lewis)
  399. Organization: NCRPDA, Curtin University
  400. Date: Tue, 26 Jan 1993 03:10:29 GMT
  401.  
  402. In article <1993Jan25.005216.12749@kth.se>, d88-jwa@dront.nada.kth.se (Jon
  403. Wtte) wrote:
  404. > In <01050014.odph61@blanc.north.de> jochen@blanc.north.de (Jochen Meyer) writes:
  405. > >Where can I find information on how to do this? The Segment Manager
  406. > >chapter of IM gives no clues on this. Anyone has got some sample code
  407. > >on this?
  408.  
  409. > Define an interface for the extensions, consisting of ONE
  410. > function that takes a lot of interesting parameters,
  411. > like a handle to some data and a command, and a handle to
  412. > put retusn data in, and returns an err code.
  413. > The just load in the resource, lock it, and call the dereferenced
  414. > resource as a function pointers with the right arguments.
  415.  
  416. If you want other people to be able to write externals in Pascal, give the
  417. function a Pascal interface.
  418.  
  419. Another good idea is to pass a single param block containg all the
  420. parmaeters, with a version parameter at the front, so if you decide to add
  421. more parameters later, you don't need to rewrite all the externals, you
  422. just bump the version number, and add the new parameters to the end.  An
  423. OSErr is often a good return result.
  424.  
  425. In Pascal:
  426.  
  427. type MyExternalParamBlock = record
  428.     version:longInt;
  429.     { other stuff }
  430.   end;
  431. function External(var pb:MyExternalParamBlock): OSErr;
  432.  
  433. [
  434. In C, something like this I think
  435. OSErr External(MyExternalParamBlock *pb)
  436. ]
  437.  
  438. Call it something like this:
  439.  
  440. function CallExternal(var pb:MyExternalParamBlock; proc:Ptr):OSErr;
  441. inline $205F, $4E90;
  442.  
  443. var h:handle;
  444.  
  445. h:=GetResource('Xtns',128);
  446. HLockHi(h);
  447. oe:=CallExternal(pb,h^);
  448. ReleaseResource(h)
  449.  
  450. I did something akin to this in the external tokens for Finger, the source
  451. of which should be on sumex or umich, as well as
  452. redback.cs.uwa.edu.au:/others/peterlewis.
  453.  
  454. Have fun,
  455.    Peter.
  456.  
  457. _______________________________________________________________________
  458. Peter N Lewis <peter@cujo.curtin.edu.au>             Ph: +61 9 368 2055
  459.  
  460. +++++++++++++++++++++++++++
  461.  
  462. From: Dave_Burnett@bmug.org
  463. Organization: BMUG, Inc.
  464. Date: Tue, 26 Jan 1993 10:46:54 PST
  465.  
  466. In article <1993Jan25.005216.12749@kth.se> (comp.sys.mac.programmer),
  467. d88-jwa@dront.nada.kth.se (Jon W%tte) writes:
  468. > >Where can I find information on how to do this? The Segment Manager
  469. > >chapter of IM gives no clues on this. Anyone has got some sample code
  470. > >on this?
  471.  
  472. In develop 10 there was an application with source that implemented plug-ins. 
  473. However, the implementation required that plug-ins be pasted into the app's
  474. resource fork instead of reading it from a "plug-ins folder."
  475.  
  476. **** From Planet BMUG, the FirstClass BBS of BMUG.  The message contained in
  477. **** this posting does not in any way reflect BMUG's official views.
  478.  
  479.  
  480. ---------------------------
  481.  
  482. From: thomas@camino.mic.cl (Thomas Fruin)
  483. Subject: What's in an unloaded resource handle?
  484. Organization: El Camino
  485. Date: Mon, 01 Feb 1993 23:28:58 CST
  486.  
  487. I'm doing some stuff with resources without loading them, and was
  488. wondering what's in an unloaded resource handle. For example, suppose
  489. I do (in C++)
  490.  
  491.   Handle resHndl;
  492.   SetResLoad( FALSE );
  493.   Handle resHndl = GetResource( myType, myID );
  494.   SetResLoad( TRUE );
  495.  
  496. Is resHndl now a Memory Manager handle? The Resource Manager chapter
  497. of Inside Macintosh tells me I can call routines such as GetResInfo
  498. with this Handle, but what happens if I call ReleaseResource or
  499. RmveResource? What happens if I dereference the "handle"?
  500.  
  501. Maybe somebody can give some background on what's technically in one
  502. of those handle's?
  503.  
  504. Thanks,
  505.  
  506. - -- Thomas Fruin
  507.  
  508.    GroupWare Ltda.
  509.    Niebla, Chile
  510.  
  511.    thomas@camino.mic.cl
  512.  
  513.  
  514. +++++++++++++++++++++++++++
  515.  
  516. Organization: Royal Institute of Technology, Stockholm, Sweden
  517. Date: Wed, 3 Feb 1993 20:07:09 GMT
  518.  
  519. In <0105013E.p3dn57@camino.mic.cl> thomas@camino.mic.cl (Thomas Fruin) writes:
  520.  
  521. >  SetResLoad( FALSE );
  522. >  Handle resHndl = GetResource( myType, myID );
  523. >  SetResLoad( TRUE );
  524.  
  525. >Is resHndl now a Memory Manager handle? The Resource Manager chapter
  526. >of Inside Macintosh tells me I can call routines such as GetResInfo
  527. >with this Handle, but what happens if I call ReleaseResource or
  528. >RmveResource? What happens if I dereference the "handle"?
  529.  
  530. The handle is still exactly the same as if you had
  531. loaded a resource, except the master pointer it points
  532. to is NULL (i.e. DON'T DEREFERENCE IT)
  533.  
  534. The effect is the same as if the resource had been read
  535. and then purged (i.e. marked purgable and unlocked) All
  536. information about the resource is still intact; you can
  537. get the actual data by calling LoadResource. Note that
  538. when the resource is marked as purgeable (and is not
  539. locked) the same thing can happen.
  540.  
  541. Cheers,
  542.  
  543.                         / h+
  544. - -- 
  545.  -- Jon W{tte, h+@nada.kth.se, Mac Hacker Deluxe --
  546.  
  547.   "Practice random kindness, and senseless acts of beauty."
  548.  
  549. +++++++++++++++++++++++++++
  550.  
  551. From: kurisuto@chopin.udel.edu (Sean J. Crist)
  552. Organization: University of Delaware
  553. Date: Wed, 3 Feb 1993 21:32:15 GMT
  554.  
  555. tte) writes:
  556. >In <0105013E.p3dn57@camino.mic.cl> thomas@camino.mic.cl (Thomas Fruin) writes:
  557.  
  558. >>  SetResLoad( FALSE );
  559. >>  Handle resHndl = GetResource( myType, myID );
  560. >>  SetResLoad( TRUE );
  561.  
  562. >>Is resHndl now a Memory Manager handle? The Resource Manager chapter
  563. >>of Inside Macintosh tells me I can call routines such as GetResInfo
  564. >>with this Handle, but what happens if I call ReleaseResource or
  565. >>RmveResource? What happens if I dereference the "handle"?
  566.  
  567. >The handle is still exactly the same as if you had
  568. >loaded a resource, except the master pointer it points
  569. >to is NULL (i.e. DON'T DEREFERENCE IT)
  570.  
  571. If I'm not mistaken, it will not always be null.  If the resource already
  572. happens to be in memory, I believe that GetResource returns a handle to it
  573. whether resource loading is turned on or off.  If you wanted to do
  574. something with this handle you'd have to test it to see whether it were
  575. actually null or not.
  576.  
  577. - --Kurisuto
  578.  
  579.  
  580. ---------------------------
  581.  
  582. Subject: SystemClick neccesary in Sys. 7?
  583. From: seth@physc1.byu.edu
  584. Date: 4 Feb 93 19:43:33 -0700
  585. Organization: Brigham Young University
  586.  
  587. Hi folks. 
  588. In these days of System 7, is it necessary to use the SystemClick function in
  589. our event loops anymore? I have read that DA's don't work like they used to, 
  590. and are more like real apps now. If I write a sys 7 only app, is it really
  591. necessary to include a call to SystemClick? What other "system windows" are
  592. there that would require this? The THINK Reference 1.0 doesn't answer my 
  593. question. 
  594.  
  595. Seth Leigh
  596. BYU Physics Dept.
  597.  
  598. PS: I sent off my upgrade form and check about two weeks ago. How long does it
  599. take for them to get me my ugrade to THINK Reference 2.0? I just love the 
  600. heck out of 1.0, I'm sure I will adore 2.0 to no end...
  601.  
  602.  
  603. +++++++++++++++++++++++++++
  604.  
  605. Organization: Royal Institute of Technology, Stockholm, Sweden
  606. Date: Fri, 5 Feb 1993 09:13:11 GMT
  607.  
  608. In <1993Feb4.194334.389@physc1.byu.edu> seth@physc1.byu.edu writes:
  609.  
  610. >In these days of System 7, is it necessary to use the SystemClick function in
  611. >our event loops anymore? I have read that DA's don't work like they used to, 
  612. >and are more like real apps now. If I write a sys 7 only app, is it really
  613.  
  614. I think SystemClick is used for the switching between application
  615. clicking, and switch-to-finder-in-desktop clicks.
  616.  
  617. I e all windows that aren't your are "System" windows (to your
  618. app)
  619.  
  620. Cheers,
  621.  
  622.                         / h+
  623. - -- 
  624.  -- Jon W{tte, h+@nada.kth.se, Mac Hacker Deluxe --
  625.  Engineering: "How will this work?" Science: "Why will this work?" Management:
  626.  "When will this work?"  Liberal Arts: "Do you want fries with that?"
  627.                      -- Jesse N. Schell
  628.  
  629. ---------------------------
  630.  
  631. From: csuley@cs.cornell.edu (Christopher Suley)
  632. Subject: Mac Plus Driver Unit Table
  633. Organization: Cornell Univ. CS Dept, Ithaca NY 14853
  634. Date: Thu, 4 Feb 1993 02:38:44 GMT
  635.  
  636. csuley@cs.cornell.edu (Christopher Suley) writes:
  637. >How many entries are there in the driver unit table on a Plus?
  638. >Is it 48 as indicated in Inside Mac IV, or has it expanded to
  639. >64 as indicated in Inside Mac V?
  640.  
  641. Well? No one knows? Could someone with a Plus break into MacsBug and
  642. type 'du' (dm utablebase unittable) and tell me what the biggest number
  643. on the driver table is?  If I had a Plus anywhere around me, I'd do it
  644. myself but I don't so I can't.
  645.  
  646. - -- 
  647. *plonk*
  648. This post comes pre-*plonk*ed for your convenience.
  649.  
  650. +++++++++++++++++++++++++++
  651.  
  652. From: resnick@cogsci.uiuc.edu (Pete Resnick)
  653. Date: Thu, 4 Feb 1993 20:36:56 GMT
  654. Organization: University of Illinois at Urbana
  655.  
  656. csuley@cs.cornell.edu (Christopher Suley) writes:
  657.  
  658. >csuley@cs.cornell.edu (Christopher Suley) writes:
  659. >>How many entries are there in the driver unit table on a Plus?
  660. >>Is it 48 as indicated in Inside Mac IV, or has it expanded to
  661. >>64 as indicated in Inside Mac V?
  662.  
  663. >Well? No one knows? Could someone with a Plus break into MacsBug and
  664. >type 'du' (dm utablebase unittable) and tell me what the biggest number
  665. >on the driver table is?  If I had a Plus anywhere around me, I'd do it
  666. >myself but I don't so I can't.
  667.  
  668. Checking the driver table on a Plus in Macsbug won't do it since many
  669. INITs expand the Unit Table. As far as I know, the Mac Plus still has
  670. only 48 entries by default. There is a method for increasing that
  671. number to as much as 128. I have code examples which explain this very
  672. nicely and are available by anonymous FTP from several places and are
  673. on Compuserve. The last release version was "driver 2.1.8", but please
  674. look for "driver 2.1.9" which I am about to send out today or
  675. tomorrow; there were some problems with 2.1.8 which I have since
  676. fixed.
  677.  
  678. pr
  679. - -- 
  680. Pete Resnick             (...so what is a mojo, and why would one be rising?)
  681. Graduate assistant - Philosophy Department, Gregory Hall, UIUC
  682. System manager - Cognitive Science Group, Beckman Institute, UIUC
  683. Internet: resnick@cogsci.uiuc.edu
  684.  
  685. +++++++++++++++++++++++++++
  686.  
  687. From: maarten@fwi.uva.nl (Maarten Carels)
  688. Organization: FWI, University of Amsterdam
  689. Date: Fri, 5 Feb 1993 09:26:48 GMT
  690.  
  691. resnick@cogsci.uiuc.edu (Pete Resnick) writes:
  692. >csuley@cs.cornell.edu (Christopher Suley) writes:
  693.  
  694. >>csuley@cs.cornell.edu (Christopher Suley) writes:
  695. >>>How many entries are there in the driver unit table on a Plus?
  696. >>>Is it 48 as indicated in Inside Mac IV, or has it expanded to
  697. >>>64 as indicated in Inside Mac V?
  698. >Checking the driver table on a Plus in Macsbug won't do it since many
  699. >INITs expand the Unit Table. As far as I know, the Mac Plus still has
  700. >only 48 entries by default.
  701. There is no need to hardcode any such number. There exists a low mem global,
  702. it's called UnitNtry, a word at 0x1d2, it contains the number of entries in
  703. the Unit table.
  704.  
  705. Note that the size of the block the unittable is in may be other than 4 times
  706. this value. I've seen the unittable block as large as 96 entries, with UnitNtry
  707. only being 48. If you need more entries, compare UnitNtry against
  708. GetPointerSize (UTableBase).
  709. You can set UnitNtry to GetPointerSize (UTableBase) / sizeof (long).
  710.  
  711. - --maarten
  712. - -- 
  713. In real life:    Maarten Carels
  714.         Computer Science Department
  715.         University of Amsterdam
  716. email:        maarten@fwi.uva.nl
  717.  
  718. ---------------------------
  719.  
  720. From: walrath@faw.uni-ulm.de (Wayne K. Walrath)
  721. Subject: Hints on getting a spinning cursors..
  722. Organization: FAW (Research Institute For Applied Knowledge Processing, Ulm, Germany)
  723. Date: Thu, 4 Feb 1993 13:06:33 GMT
  724.  
  725. Thanks to Jon and Peter (and others) for the sample code and 
  726. suggestions on how to get a directory's contents. 
  727.  
  728. >As Jon said, learn to love the PBGetCatInfo call, its very important (less
  729. >important than learning the difference between vrn's and working directory
  730. >numbers and how dirIDs fit in, but still quite important).
  731.  
  732. After two long evenings in the debugger everything is working beautifully,
  733. and I HAVE learned to love PBGetCatInfo.... But I did have a terrible time
  734. with the data structure for this call (CInfoPBRec or something similiar); 
  735. being not such an accomplished C programmer, I didn't fully understand how
  736. to work with Unions, and kept getting a member not found error message. In 
  737. Think C the record is defined as having a ParamBlockHeader, then the union
  738. of a hFileInfo and dirInfo structures.
  739.  
  740. I need to get my cursor to spin now, and I presume that I can define a 
  741. number of different cursors myself, then call a SpinCursor routine which
  742. cycles through all them.  Is this basically correct?  If I just want to spin
  743. the watch cursor, how is that done? 
  744.  
  745. What is the best way to deal with these resources?  Load each cursor from
  746. the resource file right before the call to SetCursor, or should I attempt
  747. to keep them all locked in memory.
  748.  
  749. Suggestions appreciated.
  750.  
  751. - -wayne
  752.              / Wayne K. Walrath                      \
  753.             / walrath@faw.uni-ulm.de                   \
  754.             \ The Rsrch. Institute for Applied         /
  755.              \ Knowledge Processing & AI-Ulm, Germany /
  756.  
  757.  
  758. +++++++++++++++++++++++++++
  759.  
  760. From: casgrain@ERE.UMontreal.CA (Casgrain Philippe)
  761. Date: 4 Feb 93 14:43:33 GMT
  762. Organization: Universite de Montreal
  763.  
  764. In article <1993Feb4.130633.21433@wega.rz.uni-ulm.de> walrath@faw.uni-ulm.de (Wayne K. Walrath) writes:
  765. >
  766. >I need to get my cursor to spin now, and I presume that I can define a 
  767. >number of different cursors myself, then call a SpinCursor routine which
  768. >cycles through all them.  Is this basically correct?  If I just want to spin
  769. >the watch cursor, how is that done? 
  770. >
  771. >What is the best way to deal with these resources?  Load each cursor from
  772. >the resource file right before the call to SetCursor, or should I attempt
  773. >to keep them all locked in memory.
  774. >
  775. I would suggest installing the SpinCursor routine as a VBL (i.e. asynchronous)
  776. task.  This means that the cursor will spin at the same speed regardless
  777. of the current task.
  778.  
  779. It is well documented in Knaster 'n Rollin's "Mac. Programming Secrets, 2nd ed."
  780. (yeah, I know, I liked it so much that I bought the company! ;-).
  781. I have followed their advice, and created a little library that you can link
  782. to anything (Pascal, C, even Fortran!). If you want it, let me know
  783.  
  784. Philippe
  785.  
  786. - -- 
  787. - -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  788. Philippe Casgrain              Etudiant-Chercheur      Casgrain@ERE.UMontreal.CA
  789. Departement des Sciences Biologiques                      Universite de Montreal
  790. #define disclaimer(caught) (caught ? "I wasn't even there!" : "I didn't do it!")
  791.  
  792. +++++++++++++++++++++++++++
  793.  
  794. From: keith@taligent.com (Keith Rollin)
  795. Organization: Taligent
  796. Date: Fri, 5 Feb 1993 01:10:41 GMT
  797.  
  798. In article <1993Feb4.144333.10555@cc.umontreal.ca>,
  799. casgrain@ERE.UMontreal.CA (Casgrain Philippe) wrote:
  800. > In article <1993Feb4.130633.21433@wega.rz.uni-ulm.de> walrath@faw.uni-ulm.de (Wayne K. Walrath) writes:
  801. > >
  802. > >I need to get my cursor to spin now, and I presume that I can define a 
  803. > >number of different cursors myself, then call a SpinCursor routine which
  804. > >cycles through all them.  Is this basically correct?  If I just want to spin
  805. > >the watch cursor, how is that done? 
  806. > >
  807. > >What is the best way to deal with these resources?  Load each cursor from
  808. > >the resource file right before the call to SetCursor, or should I attempt
  809. > >to keep them all locked in memory.
  810. > >
  811. > I would suggest installing the SpinCursor routine as a VBL (i.e. asynchronous)
  812. > task.  This means that the cursor will spin at the same speed regardless
  813. > of the current task.
  814.  
  815. There was discussion on this on the net about a year ago. I think that the
  816. general consensus was that it was better to spin the cursor by calling
  817. SpinCursor from various spots within the program. That way, it conveys to
  818. the user that the process is proceeding from one stage to another (first it
  819. hits a slow algorithm, then it hits a fast one, now it's writing data to
  820. disk so the cursor has stopped spinning altogether, etc.).
  821.  
  822. I don't like the VBL approach because it gives no indication that the
  823. program has hung (important to us developers). There have been articles
  824. suggesting how to feed the VBL task tickle messages from the application so
  825. that it knows the application hasn't hung, but now your program is
  826. sprinkled with calls to TickleCursorVBL instead of SpinCursor.
  827.  
  828. > It is well documented in Knaster 'n Rollin's "Mac. Programming Secrets, 2nd ed."
  829. > (yeah, I know, I liked it so much that I bought the company! ;-).
  830.  
  831. So that's who bought all my stock!
  832.  
  833. - -----
  834. Keith Rollin
  835. Phantom Programmer
  836. Taligent, Inc.
  837.  
  838. +++++++++++++++++++++++++++
  839.  
  840. From: lari@cs.unc.edu (Humayun Lari)
  841. Date: 5 Feb 1993 10:35:40 -0500
  842. Organization: The University of North Carolina at Chapel Hill
  843.  
  844. In article <keith-040293165323@kip-50.taligent.com> keith@taligent.com (Keith Rollin) writes:
  845. >There was discussion on this on the net about a year ago. I think that the
  846. >general consensus was that it was better to spin the cursor by calling
  847. >SpinCursor from various spots within the program. That way, it conveys to
  848. >the user that the process is proceeding from one stage to another (first it
  849. >hits a slow algorithm, then it hits a fast one, now it's writing data to
  850. >disk so the cursor has stopped spinning altogether, etc.).
  851.  
  852. One problem with this method is that the speed of the spinning is dependent
  853. on the speed of the Mac. In some programs, the cursor is changed so often on
  854. fast machines that it flickers, making the program look rather unpolished.
  855. And machines are getting faster all the time.
  856.  
  857. A possible solution is to set some kind of threshold, so, for instance, the
  858. cursor's only changed if *at least* 1/10 of a second has gone by.
  859.  
  860. >I don't like the VBL approach because it gives no indication that the
  861. >program has hung (important to us developers). There have been articles
  862. >suggesting how to feed the VBL task tickle messages from the application so
  863. >that it knows the application hasn't hung, but now your program is
  864. >sprinkled with calls to TickleCursorVBL instead of SpinCursor.
  865.  
  866. IMHO, this can be better, if only because it matches the constant rate used by
  867. the spinning hands on Finder 7.x's watch cursor.
  868.  
  869. It would be nice to have a HIN on this. Does anyone know if there's an
  870. "official" way to propose a HIN topic?
  871.  
  872. Humayun Lari
  873. (lari@cs.unc.edu)
  874.  
  875. ---------------------------
  876.  
  877. From: david.wareing@insane.apana.org.au (David Wareing)
  878. Subject: Game Animation
  879. Date: Wed, 03 Feb 1993 08:30:00
  880.  
  881.  
  882. There has been some discussion in recent months about the suitability of QD to
  883.  efficiently handle fast, clean animation - of the type required for
  884.  action/arcade games.  Several people have claimed that a game such as Prince
  885.  of Persia *could* be  written with QD, others have protested this.
  886.  
  887. Can someone please clarify this.  I am in the process of writing a game.  I
  888.  need to know if it is possible to animate (say at the the POP level) with QD
  889.  or do I HAVE to start learning assembly real fast?
  890.  
  891. thanks,
  892.  
  893. David Wareing
  894. Seacliff, South Australia.
  895.  
  896.  
  897.  
  898. +++++++++++++++++++++++++++
  899.  
  900. From: zobkiw@world.std.com (Joe Zobkiw)
  901. Organization: The World Public Access UNIX, Brookline, MA
  902. Date: Fri, 5 Feb 1993 14:58:37 GMT
  903.  
  904. In article <728841576.AA00368@insane.apana.org.au> david.wareing@insane.apana.org.au (David Wareing) writes:
  905. >
  906. >There has been some discussion in recent months about the suitability of QD to
  907. > efficiently handle fast, clean animation - of the type required for
  908. > action/arcade games.  Several people have claimed that a game such as Prince
  909. > of Persia *could* be  written with QD, others have protested this.
  910. >
  911. >Can someone please clarify this.  I am in the process of writing a game.  I
  912. > need to know if it is possible to animate (say at the the POP level) with QD
  913. > or do I HAVE to start learning assembly real fast?
  914. >
  915.  
  916. No matter what anyone says...some games will do fine with QuickDraw...
  917. others need custom routines. It entirely depends on how much action
  918. you have in the game. You should probably perform some timing tests
  919. yourself to see how QuickDraw works for YOU :)
  920.  
  921.  
  922.  
  923. - -- 
  924. - -------------------------------------------------------------
  925. joe zobkiw                               zobkiw@world.std.com
  926. - -------------------------------------------------------------
  927.  
  928. +++++++++++++++++++++++++++
  929.  
  930. From: werner@dewey.soe.berkeley.edu (John Werner)
  931. Date: 5 Feb 1993 19:45:19 GMT
  932. Organization: School of Education, U.C. Berkeley
  933.  
  934. In article <C1zDLp.FCJ@world.std.com> zobkiw@world.std.com (Joe Zobkiw) writes:
  935. >
  936. >No matter what anyone says...some games will do fine with QuickDraw...
  937. >others need custom routines. It entirely depends on how much action
  938. >you have in the game. You should probably perform some timing tests
  939. >yourself to see how QuickDraw works for YOU :)
  940.  
  941. I agree.  Write it first using QuickDraw.  There's no sense in
  942. worrying about writing the game code and your own custom graphics
  943. routines at the same time; it just gives you more things to debug at
  944. once.  If it's a sprite-based game, concentrate on making your
  945. algorithm clever enough to minimize the amount of CopyBitsing that has
  946. to go on for each frame.  Some of the recent posts on "Arcade-style
  947. game animation" had some good hints that I incorporated into the
  948. simulation program I'm working on.
  949.  
  950. If you still can't get it fast enough, then it's time to start
  951. worrying about rewriting the low-level bit-blasting routines in
  952. assembler.  
  953.  
  954. This is a bit over-simplified, of course.  If your initial QuickDraw
  955. version is WAY too slow, then you might want to start doing some
  956. detailed timing tests and experiments with assembler before you get
  957. too far along.
  958. - -- 
  959. John Werner                        werner@soe.berkeley.edu
  960. UC Berkeley School of Education    (510) 596-5868 (new number)
  961.  
  962. +++++++++++++++++++++++++++
  963.  
  964. From: mssmith@afterlife.ncsc.mil (M. Scott Smith)
  965. Date: 5 Feb 93 21:48:10 GMT
  966. Organization: The Great Beyond
  967.  
  968. In article <728841576.AA00368@insane.apana.org.au> david.wareing@insane.apana.org.au (David Wareing) writes:
  969. >
  970. >There has been some discussion in recent months about the suitability of QD to
  971. > efficiently handle fast, clean animation - of the type required for
  972. > action/arcade games.  Several people have claimed that a game such as Prince
  973. > of Persia *could* be  written with QD, others have protested this.
  974. >
  975. >Can someone please clarify this.  I am in the process of writing a game.  I
  976. > need to know if it is possible to animate (say at the the POP level) with QD
  977. > or do I HAVE to start learning assembly real fast?
  978. >
  979. >thanks,
  980. >
  981. >David Wareing
  982. >Seacliff, South Australia.
  983. >
  984.  
  985. David,
  986.  
  987.    I have been working on learning the fundamentals for writing Mac games
  988. for the past year or so, albeit not at any great pace.  I had heard that
  989. fast, smooth animation required direct-screen drawing, and believed it,
  990. but concluded that since I didn't know assembly I wouldn't be able to do it.
  991. And so I concentrated on learning about GWorlds and CopyBits and how to do
  992. the fastest graphics possible using QuickDraw.
  993.  
  994.    And it was a pain.  I won't say it would be impossible to write something
  995. like Prince of Persia using QuickDraw -- well, OK, I will -- it probably
  996. would be pretty close to impossible.  Quickdraw can be Quick -- but while
  997. I can't authoritatively say that it can't be used to write fast-action games
  998. (since I don't know how to do fast-action games with it), I do point to all
  999. the fast action games that have been written for the Mac, and none, to my
  1000. knowledge, have used QuickDraw.
  1001.  
  1002.    So at some point I resolved that I would learn how to write directly to
  1003. the screen.  And I did.  And I do.  And I wouldn't do it any other way now.
  1004.  
  1005.    You *don't* need to know assembly to do it, although it certainly would
  1006. help.  I've developed a pretty thorough library of routines that write to the
  1007. screen very quickly, handle sprites, etc.  I've still got some work to do;
  1008. I'm working on a fast masking algorithm suited specifically for my types of
  1009. sprites, etc., but I've been able to demonstrate that I will be able to have
  1010. very fast, arcade-action graphics.  Definitely comparable with Prince of
  1011. Persia and just about anything else out there.  (Now, if I only had the
  1012. artistic talent..)
  1013.  
  1014.    And I still don't know Assembly.  However, I'm pretty good at bit
  1015. manipulations and it's definitely helpful if you can think in bases other
  1016. than 10.  If you want to sync your game with the monitor, then you would
  1017. need to know assembly, although there's several Think C snippets floating
  1018. around (that use assembly) that accomplish this task for you.  There's
  1019. also handy code around that fades the monitor in and out.
  1020.  
  1021.    So how can you learn how to write directly to the screen?  If you go
  1022. back and look at some of the comp.sys.mac.programmer/games archives,
  1023. there's been threads in the past related to it.  Some very smart people
  1024. have divulged some helpful pointers, like Ben Staller and Joe Holt.
  1025. Also, issue 11 of Develop (Apple's programming journal) contains an
  1026. article (and sample code) titled "Graphical Truffles," written by Brigham
  1027. Stevens and Bill Guschwan, that contains basically all the info. you need
  1028. to know to successfully write to the screen.  (For example, it tells you
  1029. things to do to keep your program from breaking -- such as changing to
  1030. 32-bit mode before you go messing around with the video RAM, etc.)
  1031.  
  1032.    Writing directly to the screen is dangerous and hard to do "right".  You
  1033. have probably heard a lot of people warning not to do it, and this might
  1034. have scared you away -- don't let it.  I've got three pages of source code
  1035. which seem to safely implement direct-drawing on just about any system.
  1036. (In 8-bit color, at least.  Monitor size doesn't matter.)  (And those three
  1037. pages contain routines to draw points, fills, lines, etc., very quickly.
  1038. Even scroll the screen horizontally -- not slow at all, but definitely not
  1039. Sonic the Hedgehog.)
  1040.  
  1041.    It's a challenge, it's fun, and you get to learn a lot..  I'm starting
  1042. from the ground up, trying to build my own library that's equivilent in many
  1043. ways to QuickDraw, except without the speed barrier.
  1044.  
  1045.    So, to sum up this long message: You probably *can't* write a game like
  1046. Prince of Persia with Quickdraw.  However, there's lots of games you CAN
  1047. write with Quickdraw -- in which case you should definitely use Quickdraw.
  1048. (For example, strategy games, games like Tetris that don't have a lot
  1049. of sprites moving at once, etc.)
  1050.  
  1051.    But if you want to write a fast-action arcade game, don't hesitate to
  1052. investigate looking into the direct-screen approach.  At the least, you'll
  1053. learn something from it -- you'll have a better understanding of how graphics
  1054. work on computers.  (And you might gain an appreciation for something like
  1055. CopyMask!)
  1056.  
  1057.    It's not as hard as it's rumored to be.  It's not as imcompatible as it's
  1058. rumored to be, either, although you might want to focus on working in one
  1059. bit depth, such as 8-bit, at least as a starter until you get up to speed.
  1060.  
  1061.    There are now a collection of references available that will help you
  1062. learn it -- the Graphics Truffles article being an excellent start (you
  1063. can get it from ftp.apple.com), as well as some hints filed away in the
  1064. archives of the internet.
  1065.  
  1066.    And you can keep my name around if you have questions..  I'm not an expert
  1067. on this, but I'm learning quickly and know the fundamentals.
  1068.  
  1069.    There's also source available from cool people like Juri Munki (I hope I got
  1070. his name right), such as the Arashi demo (and I hope I got THAT name right,
  1071. too!  ;) that implement direct screen graphics.  However, it was done mostly
  1072. in assembly and was over my head.
  1073.  
  1074.    But you can get away without knowing assembly.
  1075.  
  1076. Hope this helps!
  1077.  
  1078. M. Scott Smith
  1079.   (mssmith@afterlife.ncsc.mil)
  1080.   (umsmith@mcs.drexel.edu)
  1081.  
  1082. +++++++++++++++++++++++++++
  1083.  
  1084. From: sjked@ritvax.isc.rit.edu ("Sgt. Kleper")
  1085. Organization: Rochester Institute of Technology
  1086. Date: Mon, 8 Feb 1993 03:35:49 GMT
  1087.  
  1088. I think (that's THINK) that Pararena has an option of using Quick
  1089. Draw. I recall trying it once, and it worked about the same from
  1090. all that I could tell.
  1091.  
  1092. ---------------------------
  1093.  
  1094. End of C.S.M.P. Digest
  1095. **********************
  1096.