From: pottier@clipper.ens.fr (Francois Pottier) Subject: csmp-digest-v3-034 Date: Sun, 12 Jun 1994 14:10:18 +0200 (MET DST) C.S.M.P. Digest Sun, 12 Jun 94 Volume 3 : Issue 34 Today's Topics: 32-Bit Addressing AppleScript Questions Code Warrior allocation of Objects Code Warrior: ruminations of a long-time MPW user Refinement of SC++ 7.0 code gen bug Serial Port Programming? Serial port use THINK Class Library FTP Site? storage for XCMDS The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier (pottier@clipper.ens.fr). The digest is a collection of article threads from the internet newsgroup comp.sys.mac.programmer. It is designed for people who read c.s.m.p. semi- regularly and want an archive of the discussions. If you don't know what a newsgroup is, you probably don't have access to it. Ask your systems administrator(s) for details. If you don't have access to news, you may still be able to post messages to the group by using a mail server like anon.penet.fi (mail help@anon.penet.fi for more information). Each issue of the digest contains one or more sets of articles (called threads), with each set corresponding to a 'discussion' of a particular subject. The articles are not edited; all articles included in this digest are in their original posted form (as received by our news server at nef.ens.fr). Article threads are not added to the digest until the last article added to the thread is at least two weeks old (this is to ensure that the thread is dead before adding it to the digest). Article threads that consist of only one message are generally not included in the digest. The digest is officially distributed by two means, by email and ftp. If you want to receive the digest by mail, send email to listserv@ens.fr with no subject and one of the following commands as body: help Sends you a summary of commands subscribe csmp-digest Your Name Adds you to the mailing list signoff csmp-digest Removes you from the list Once you have subscribed, you will automatically receive each new issue as it is created. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest. Questions related to the ftp site should be directed to scott.silver@dartmouth.edu. Currently no previous volumes of the CSMP digest are available there. Also, the digests are available to WAIS users. To search back issues with WAIS, use comp.sys.mac.programmer.src. With Mosaic, use http://www.wais.com/wais-dbs/comp.sys.mac.programmer.html. ------------------------------------------------------- >From spencerl@crl.com (Spencer Low) Subject: 32-Bit Addressing Date: 20 May 1994 18:43:48 -0700 Organization: LowTek Creations How do you detect whether 32-bit Addressing is enabled/disabled? Also, how can you turn it on? I remember reading somewhere that there's a bit in PRAM that you can modify. Does anyone have any specifics or sample code (THINK C)? I realize that the Mac would be require to be rebooted, but I would still like an automated way to turn it on (with the authorization of the user). Thanks, Spencer -- Spencer Low | Creators of MaxRAM!! LowTek Creations | Anonymous FTP to crl.com and look in spencerl@crl.com | /users/ro/spencerl/ for more info. +++++++++++++++++++++++++++ >From jwbaxter@olympus.net (John W. Baxter) Date: Fri, 20 May 1994 23:12:09 -0700 Organization: Internet for the Olympic Peninsula In article <2rjp0k$cqe@crl2.crl.com>, spencerl@crl.com (Spencer Low) wrote: > How do you detect whether 32-bit Addressing is enabled/disabled? Also, > how can you turn it on? I remember reading somewhere that there's a bit > in PRAM that you can modify. Does anyone have any specifics or sample > code (THINK C)? I realize that the Mac would be require to be rebooted, > but I would still like an automated way to turn it on (with the > authorization of the user). Send a 4 byte -1 through the StripAddress trap, and see what comes out. -- John Baxter Port Ludlow, WA, USA [West shore, Puget Sound] jwbaxter@pt.olympus.net +++++++++++++++++++++++++++ >From spencerl@crl.com (Spencer Low) Date: 21 May 1994 00:08:14 -0700 Organization: LowTek Creations John W. Baxter (jwbaxter@olympus.net) wrote: > Send a 4 byte -1 through the StripAddress trap, and see what comes out. I just tried that and StripAddress returned 0xFFFFFFFF, or -1. What will it return in 24-bit mode? 0x00FFFFFF? I think I just answered my own question (well, part of it)... GestaltEqu.h tells me that the gestaltAddressingModeAttr selector will tell me about the addressing mode of the Mac. Just test for bit 0 (gestalt32BitAddressing). So how do I turn it on? And I shouldn't turn it on if gestalt32BitCapable is false? Thanks, Spencer -- Spencer Low | Creators of MaxRAM!! LowTek Creations | Anonymous FTP to crl.com and look in spencerl@crl.com | /users/ro/spencerl/ for more info. +++++++++++++++++++++++++++ >From spencerl@crl.com (Spencer Low) Date: 21 May 1994 12:47:41 -0700 Organization: LowTek Creations Spencer Low (spencerl@crl.com, aka "me") wrote: > So how do I turn it on? And I shouldn't turn it on if gestalt32BitCapable > is false? I did soom searching on the 'net (the alt.sources.mac archive) and I found out some information about extended PRAM (XPRAM) and memory settings. I looked at the Extended PRAM Layout from Kiselyov Oleg (oleg@ponder.csci.unt.edu) and I copied/composed the following code: (THINK C style with inline assembly) char buffer; asm { LEA buffer, A0 // pass the address as a parameter MOVE.W #1, D0 // the length of the data SWAP D0 MOVE.W #0x8A, D0 // location in XPRAM DC.W 0xA051 // ReadXPRam trap } BitSet( &buffer, 15 ); // Set xxxx x1x1 (should mean 32-bit on) BitSet( &buffer, 13 ); asm { LEA buffer, A0 // pass the address as a parameter MOVE.W #1, D0 // the length of the data SWAP D0 MOVE.W #0x8A, D0 // location in XPRAM DC.W 0xA052 // WriteXPRam trap } Kiselyov Oleg's info tells us the following: Loc Length (hex) (dec) 8A 1 Bit field: Memory/cache control flags 1xxx xxxx 68040 Cache is OFF | Toggled through Cache control 0xxx xxxx 68040 Cache is ON | panel xxxx x1x1 32-bit addressing is ON (toggled through the Memory control panel) So it seems like my code is setting the right stuff, correct? Does my code make sense? I can't test it on my 660AV, since the 660AV doesn't support 24-bit mode (or does it?). Also, I noticed that Kiselyov's info says 1xxx xxxx means that the cache is off, but on my Mac, my cache is on and ReadXPRam returns 1xxx xxxx. Is there a typo or something? Thanks in advance for your help, Spencer -- Spencer Low | Creators of MaxRAM!! LowTek Creations | Anonymous FTP to crl.com and look in spencerl@crl.com | /users/ro/spencerl/ for more info. +++++++++++++++++++++++++++ >From spencerl@crl.com (Spencer Low) Date: 21 May 1994 14:00:02 -0700 Organization: LowTek Creations Spencer Low (spencerl@crl.com) wrote: > BitSet( &buffer, 15 ); // Set xxxx x1x1 (should mean 32-bit on) > BitSet( &buffer, 13 ); Whoops! This code should be BitSet(&buffer, 5); & BitSet(&buffer, 7); instead. (this is the first time I've ever used BitSet.) > Kiselyov Oleg's info tells us the following: > Loc Length > (hex) (dec) > 8A 1 Bit field: Memory/cache control flags > 1xxx xxxx 68040 Cache is OFF | Toggled through Cache control > 0xxx xxxx 68040 Cache is ON | panel > xxxx x1x1 32-bit addressing is ON (toggled through the Memory > control panel) > So it seems like my code is setting the right stuff, correct? Does my > code make sense? I can't test it on my 660AV, since the 660AV doesn't > support 24-bit mode (or does it?). Also, I noticed that Kiselyov's info > says 1xxx xxxx means that the cache is off, but on my Mac, my cache is on > and ReadXPRam returns 1xxx xxxx. Is there a typo or something? It seems like I was the one making the typo. I checked on my calculator (conversions) and ReadXPRam was returning x1xx x1x1, meaning that 32-bit addressing was on and the cache was on. I don't know what that second "1" means, though. Perhaps it means that 32-bit can't be turned off? Spencer -- Spencer Low | Creators of MaxRAM!! LowTek Creations | Anonymous FTP to crl.com and look in spencerl@crl.com | /users/ro/spencerl/ for more info. +++++++++++++++++++++++++++ >From jrb@mitre.org (Bob Boonstra) Date: Sun, 22 May 1994 07:37:29 -0500 Organization: MITRE In article <2rjp0k$cqe@crl2.crl.com>, spencerl@crl.com (Spencer Low) wrote: > How do you detect whether 32-bit Addressing is enabled/disabled? Also, > how can you turn it on? mode = GetMMUMode(); /* returns false32b (0) or true32b (1) */ SwapMMUMode(&mode); /* sets addressing mode and returns old mode */ -- -- Bob Boonstra -- jrb@mitre.org -- My opinion, not my employer's +++++++++++++++++++++++++++ >From spencerl@crl.com (Spencer Low) Date: 22 May 1994 12:56:20 -0700 Organization: LowTek Creations Bob Boonstra (jrb@mitre.org) wrote: > In article <2rjp0k$cqe@crl2.crl.com>, spencerl@crl.com (Spencer Low) wrote: > > How do you detect whether 32-bit Addressing is enabled/disabled? Also, > > how can you turn it on? > mode = GetMMUMode(); /* returns false32b (0) or true32b (1) */ > SwapMMUMode(&mode); /* sets addressing mode and returns old mode */ Is this the same 32-bit mode that the Memory control panel controls? I always thought that this was a different related thing. If there are these routines, why do we have to reboot after changing the mode in the Memory control panel? Thanks, Spencer -- Spencer Low | Creators of MaxRAM!! LowTek Creations | Anonymous FTP to crl.com and look in spencerl@crl.com | /users/ro/spencerl/ for more info. +++++++++++++++++++++++++++ >From jwbaxter@olympus.net (John W. Baxter) Date: Mon, 23 May 1994 07:47:10 -0700 Organization: Internet for the Olympic Peninsula In article <2rodd4$99s@crl2.crl.com>, spencerl@crl.com (Spencer Low) wrote: > Bob Boonstra (jrb@mitre.org) wrote: > > In article <2rjp0k$cqe@crl2.crl.com>, spencerl@crl.com (Spencer Low) wrote: > > > > How do you detect whether 32-bit Addressing is enabled/disabled? Also, > > > how can you turn it on? > > > mode = GetMMUMode(); /* returns false32b (0) or true32b (1) */ > > SwapMMUMode(&mode); /* sets addressing mode and returns old mode */ > > Is this the same 32-bit mode that the Memory control panel controls? I > always thought that this was a different related thing. If there are > these routines, why do we have to reboot after changing the mode in the > Memory control panel? SwapMMUMode () is intended for *temporary* mode changes (such as the necessary switch to 32-bit mode to access video memory on typical cards). It does not magically change all the heaps in the machine between 24-bit form and 32-bit form (not to mention that there are now [at least] two variations of the 32-bit heap). [So...what you can do during the temporary switch is quite limited.] -- John Baxter Port Ludlow, WA, USA [West shore, Puget Sound] jwbaxter@pt.olympus.net +++++++++++++++++++++++++++ >From philip@cs.wits.ac.za (Philip Machanick) Date: Wed, 25 May 1994 07:32:57 +0200 Organization: Computer Science Dept, U of Witwatersrand In article <2rodd4$99s@crl2.crl.com>, spencerl@crl.com (Spencer Low) wrote: > Is this the same 32-bit mode that the Memory control panel controls? I > always thought that this was a different related thing. If there are > these routines, why do we have to reboot after changing the mode in the > Memory control panel? Could it be that there's a difference between locally changing the mode for a little piece of your code (e.g., check if in 32-bit mode, if so switch it off for a piece of old code then switch it on again) and globally changing it for every piece of software on the system? -- Philip Machanick philip@cs.wits.ac.za Department of Computer Science, University of the Witwatersrand 2050 Wits, South Africa phone 27(11)716-3309 fax 27(11)339-7965 +++++++++++++++++++++++++++ >From shirleyd@cognos.COM (Dieter Shirley) Date: Fri, 27 May 1994 17:27:04 GMT Organization: Cognos Incorporated, Ottawa CANADA Spencer Low (spencerl@crl.com) wrote: : Bob Boonstra (jrb@mitre.org) wrote: : > mode = GetMMUMode(); /* returns false32b (0) or true32b (1) */ : > SwapMMUMode(&mode); /* sets addressing mode and returns old mode */ : Is this the same 32-bit mode that the Memory control panel controls? I : always thought that this was a different related thing. If there are : these routines, why do we have to reboot after changing the mode in the : Memory control panel? All the traps and stuff are initialized at boot up to either work in 24-bit or 32-bit mode. If you swap it, you can do writes to upper (video and NuBus) memory, but if you call any traps during this time, they'll expect to be in the mode that the computer started in. If you're in a different mode, they could crash horrifically. If you need to know if 32-bit addressing is on, use the Gestalt call. If you need 32-bit addressing on for a *short* time use SwapMMUMode(). If you need 32-bit addressing on for a long time (like, the whole course of your program) inform the user to turn it on via the control panel, and then quit. You could set the bit in PRAM yourself, but then they'd still have to restart. Good luck, -dete --------------------------- >From Stephan Bublava Subject: AppleScript Questions Date: 14 May 1994 17:45:37 GMT Organization: Vienna University of Technology Hi, I have two questions regarding AppleScript: 1) Is there any way to allow/disallow user interaction? 2) Can I run a script asynchronously? I am playing around with OSA menu and whenever I activate a script the front application is blocked until the script is finished. I know that "ignoring application responses" works around this, but on the other hand, I need application responses for some scripts to work, and to get errors back. Any info would be appreciated. Stephan -- Stephan Bublava stephan@iguwnext.tuwien.ac.at +++++++++++++++++++++++++++ >From Jens Alfke Date: Wed, 25 May 1994 18:38:34 GMT Organization: Apple Computer Stephan Bublava, stephan@iguwnext.tuwien.ac.at writes: > 1) Is there any way to allow/disallow user interaction? I seem to remember that there is, but I can't remember the syntax. Check the manual... > 2) Can I run a script asynchronously? I am playing around > with OSA menu and whenever I activate a script the > front application is blocked until the script is finished. > I know that "ignoring application responses" works around > this, but on the other hand, I need application responses > for some scripts to work, and to get errors back. If you save a script as an application ("applet") it will run asynchronously in its own process. If you still want the ease-of-triggering of a menu command, you can either put the applet in the Apple menu (which will bring its layer to the front) or write a little launcher script for OSAMenu that just launches your applet. --Jens Alfke jens_alfke@powertalk Rebel girl, rebel girl, .apple.com Rebel girl you are the queen of my world +++++++++++++++++++++++++++ >From Stephan Bublava Date: 27 May 1994 12:17:14 GMT Organization: Vienna University of Technology In article <1994May25.183834.6893@gallant.apple.com> Jens Alfke, jens_alfke@powertalk.apple.com writes: >> 1) Is there any way to allow/disallow user interaction? >I seem to remember that there is, but I can't remember the >syntax. Check the manual... Well, that's what I did before posting, but it does not contain anything (I checked the manual for 1.0, and the release notes for both 1.0 and 1.1). Thanks for your information on my other question. In the meantime I have yet another problem: I can't get transactions to work. For example: tell application "FileMaker Pro" with transaction ... end transaction end tell The problem is "end transaction" because there also is a command with the same name. If you only write "end" then it will compile, but only once because AppleScript changes the line back to "end transaction". But apart from that, it didn't work right (with FileMaker Pro): In the transaction I created a new record and then searched for a record that did not exist. I expected that the record I had created would be automatically deleted again (since the search failed), but I just got an error message. Is this one of the many problems FileMaker has with AppleScript, or am I doing something wrong? Stephan -- Stephan Bublava stephan@iguwnext.tuwien.ac.at +++++++++++++++++++++++++++ >From hades@coos.dartmouth.edu (Brian V. Hughes) Date: 27 May 1994 15:52:27 GMT Organization: Dartmouth College, Hanover, NH, USA Stephan Bublava writes: >In the meantime I have yet another problem: I can't get >transactions to work. >For example: >tell application "FileMaker Pro" > with transaction > ... > end transaction >end tell >The problem is "end transaction" because there also is >a command with the same name. If you only write "end" then >it will compile, but only once because AppleScript changes >the line back to "end transaction". I think what you need to do is use the "Begin Transation" and "End Transaction" AppleScript commands that are part of FM Pro's dictionary. I don't know how they differ from the with transaction control statement but my guess is that AppleEvents were added to FM Pro before the with transaction control statement was fully implimented, and therefore it doesn't support it correctly. That's why there are separate commands for it that are FM Pro specific. -Hades +++++++++++++++++++++++++++ >From jonpugh@netcom.com (Jon Pugh) Date: Sun, 29 May 1994 06:36:13 GMT Organization: NETCOM On-line Communication Services (408 261-4700 guest) Jens Alfke (jens_alfke@powertalk.apple.com) wrote: > Stephan Bublava, stephan@iguwnext.tuwien.ac.at writes: > > 1) Is there any way to allow/disallow user interaction? > I seem to remember that there is, but I can't remember the syntax. Check the > manual... There are no user interaction events or settings in AppleScript. That's why programs will need to implement something similar to what I did in PhotoFlash. I created an application property called "user iteraction" which takes a set of enums; none, interact with local, interact with remote, & interact with all. Then before you put up any dialog, call a CanDoUI routine which checks the UI level and calls AEInteractWithUser if it is not none (since the AEM doesn't include a none setting). This ensures that you get brought to the front and/or a notification is posted. You need to implement none because the AEM's minimum is "interact with local" and if you run a script (via a script menu or so) your script is local and allowed to interact. Yuck. You need to use a global to get the never interact level and you need to provide defaults for every function that calls CanDoUI and gets back a false. I would suggest that a future version of AppleScript and the AEM support this feature, if there anyone working on either. ;) Jon +++++++++++++++++++++++++++ >From jwbaxter@olympus.net (John W. Baxter) Date: Sun, 29 May 1994 08:25:58 -0700 Organization: Internet for the Olympic Peninsula In article , jonpugh@netcom.com (Jon Pugh) wrote: > There are no user interaction events or settings in AppleScript. That's > why programs will need to implement something similar to what I did in > PhotoFlash. I created an application property called "user iteraction" > which takes a set of enums; none, interact with local, interact with remote, > & interact with all. Then before you put up any dialog, call a CanDoUI > routine which checks the UI level and calls AEInteractWithUser if it is not > none (since the AEM doesn't include a none setting). This ensures that you > get brought to the front and/or a notification is posted. You need to > implement none because the AEM's minimum is "interact with local" and if you > run a script (via a script menu or so) your script is local and allowed to > interact. Yuck. You need to use a global to get the never interact level > and you need to provide defaults for every function that calls CanDoUI and > gets back a false. Jon...The AE Manager is quite happy with "never interact" as sent by the sender. It is of course true that the client side's minimum level for AESetInteractionAllowed () is self (which I think I consider "lower" than local, since it cuts out other clients). So you are right that to achieve never, the application has to remember that it shouldn't interact. > I would suggest that a future version of AppleScript and the AEM support > this feature, if there anyone working on either. ;) I found it surprising that AppleScript elected to use only "can" interact. Frontier, on the other hand, can currently be set to send either "never" or "always" (version 2 was "never" or "can"...the change to "always" has caused some scripting glitches with FileMaker, which now must be brought to the front before certain actions are sent from Frontier). So an OSA Menu script which needs to be never interact could be written in UserTalk, with the level being set to never [the UserTalk for that is setEventInteraction (false)...the setting is per-script]. I concur that AppleScript should be enhanced to permit per-script settings of "never", "can", and "always" (and control might be desired for the kAECanSwitchLayer flag, too). Good job with your PhotoFlash workaround...I'll have to remember to implement (ie, steal) that idea. -- John Baxter Port Ludlow, WA, USA [West shore, Puget Sound] jwbaxter@pt.olympus.net --------------------------- >From eshieh@po.EECS.Berkeley.EDU (Eric Shieh) Subject: Code Warrior allocation of Objects Date: 22 May 1994 20:54:17 GMT Organization: University of California, Berkeley Just received CW Gold DR/2 2 weeks ago and have ported my program from Think C 5.0 to it...seems to work great except that the CW compiler is a lot pickier about types...anyways, that's OK. The bulk of my program is in standard C. Now, I'm trying to add some stuff using C++. The problem: once I allocate an object via 'new' (i haven't tryied allocating it on the stack), about 80K is allocated in the heap... Now, this may be OK in a 2-3 meg program, but since my program's total file size is 68K in a 120K partition, 80K is a big deal... Oh, and if I call delete, the 80K remains in the heap, non-relocatable. but calling new again doesn't try to allocate another 80K.... So, my question is: Is this just the way it works or is this a bug? It seems rather odd that it's allocating so much memory since as I said, my program size is 68K, what could it be sticking in that 80K block? Oh, btw, is their any way to create objects as Handles instead of Pointers? And I also recall a codewarrior mailing list around here, anyone know the address/instructions? Thanks for listening, Eric eshieh@cory.berkeley.edu +++++++++++++++++++++++++++ >From scouten@maroon.tc.umn.edu (Eric Scouten) Date: Mon, 23 May 1994 13:31:56 GMT Organization: University of Minnesota, Student Affairs In article <2rogpp$3j1@agate.berkeley.edu>, eshieh@po.EECS.Berkeley.EDU (Eric Shieh) wrote: > The bulk of my program is in standard C. Now, I'm trying to add some > stuff using C++. The problem: once I allocate an object via 'new' (i haven't > tryied allocating it on the stack), about 80K is allocated in the heap... CodeWarrior's operator new bypasses the Memory Manager when allocating small objects. It allocates its own pool of (apparently) 80K for any objects that are below a certain threshold size (4K I think?). This pool remains permanently allocated until the app quits; if it fills, CW grabs another 80K pool to create the next set of objects. The advantage of this is that the operator new/delete pair can manage objects more efficiently (both in memory and speed) than can the Memory Manager. > Oh, btw, is their any way to create objects as Handles instead of Pointers? Not in any compiler that supports multiple inheritance. (At least SC++ 7.0 and CodeWarrior don't support handle objects.) Handles are an ugly way to manage objects anyway: accessing member fields is considerably less efficient, and you have to be much more careful about how you use pointers. > And I also recall a codewarrior mailing list around here, anyone know the > address/instructions? Yup. To subscribe send a one line message... subscribe cwarrior ... to the address listserv@netcom.com. Make sure your signature is turned off. -Eric -- Eric Scouten * Univ of Minnesota * Student Affairs * +1 612 626 0746 ** MS Computer Science student, Univ of Illinois, starting Aug '94 ** WYSIWIG: What You See Is What You Get WYSIWOBBLE: What You See Isn't What's Output By the Blasted Laserwriter Eh? +++++++++++++++++++++++++++ >From partingt@fwi.uva.nl (Vincent Partington) Date: 24 May 1994 11:58:59 GMT Organization: FWI, University of Amsterdam eshieh@po.EECS.Berkeley.EDU (Eric Shieh) writes: >The bulk of my program is in standard C. Now, I'm trying to add some >stuff using C++. The problem: once I allocate an object via 'new' (i haven't >tryied allocating it on the stack), about 80K is allocated in the heap... >Now, this may be OK in a 2-3 meg program, but since my program's total >file size is 68K in a 120K partition, 80K is a big deal... This is because new and delete use their own allocator system that gets chunks of OS-memory at once to efficiently manage memory. You can bypass this be recompiling the C++ Runtime library: the source- code for new/delete is in the C++ Runtime directory, there's a define that you can change to make new/delete use NewPtr/DisposePtr, just have a look at the code in the New.cp and NewMore.cp files. Vincent. -- My opinions are not my own. I copy them | Internet : partingt@fwi.uva.nl from books, television, video, the net, | vincent@tnc.nl my friends, my parents, my teachers and | FidoNet : 2:281/202.15 and numerous other contributors. | NeST : 90:500/202.15 +++++++++++++++++++++++++++ >From Jens Alfke Date: Wed, 25 May 1994 19:15:42 GMT Organization: Apple Computer In article <2rsq63$h0k@hermes.fwi.uva.nl> Vincent Partington, partingt@fwi.uva.nl writes: > This is because new and delete use their own allocator system that gets > chunks of OS-memory at once to efficiently manage memory. > You can bypass this be recompiling the C++ Runtime library... Naw, just add an 'operator new' and 'operator delete' in the base class and have it use some other allocation scheme. NewPtr will work okay but will be lots slower if tons of objects are being created and deleted. If the program is already using some more efficient memory allocator (malloc or something) then you can use that. --Jens Alfke jens_alfke@powertalk Rebel girl, rebel girl, .apple.com Rebel girl you are the queen of my world +++++++++++++++++++++++++++ >From partingt@fwi.uva.nl (Vincent Partington) Date: 26 May 1994 10:47:10 GMT Organization: FWI, University of Amsterdam Jens Alfke writes: >> This is because new and delete use their own allocator system that gets >> chunks of OS-memory at once to efficiently manage memory. >> You can bypass this be recompiling the C++ Runtime library... >Naw, just add an 'operator new' and 'operator delete' in the base class and >have it use some other allocation scheme. NewPtr will work okay but will be >lots slower if tons of objects are being created and deleted. If the program >is already using some more efficient memory allocator (malloc or something) >then you can use that. When adding those operators to "the" base class you have to change your C++ code and derive all your classes from that class. Changing the C++ Runtime lib is admittedly dirtier but doesn't require changing the C++ code. Changing the C++ Runtime lib also allows you to change the allocation routines for arrays becuase AFAIK you can't change operator new/delete for arrays. Vincent\n -- My opinions are not my own. I copy them | Internet : partingt@fwi.uva.nl from books, television, video, the net, | vincent@tnc.nl my friends, my parents, my teachers and | FidoNet : 2:281/202.15 and numerous other contributors. | NeST : 90:500/202.15 +++++++++++++++++++++++++++ >From Jens Alfke Date: Fri, 27 May 1994 20:04:20 GMT Organization: Apple Computer Vincent Partington, partingt@fwi.uva.nl writes: > When adding those operators to "the" base class you have to change your C++ > code and derive all your classes from that class. Changing the C++ Runtime lib > is admittedly dirtier but doesn't require changing the C++ code. That's a fair point; but you can always just define your own global operator new and operator delete, and then include the C++ runtime library without its operator new support. (I think there is a version of the library without operator new in it.) All of your classes will use the global operator new/delete by default. I'm always leery of modifying system libraries, since they generally change in every release and then I have to redo my work all over again. --Jens Alfke jens_alfke@powertalk Rebel girl, rebel girl, .apple.com Rebel girl you are the queen of my world --------------------------- >From amanda@intercon.com (Amanda Walker) Subject: Code Warrior: ruminations of a long-time MPW user Date: Tue, 24 May 1994 11:47:08 -0500 Organization: InterCon Systems Corporation, Herndon, VA USA Several people have expressed surprise at my couple of posts supporting Code Warrior yesterday, since I've been a die-hard MPW user for years. I thought I'd go into some more detail on this, since the issues involved are not unique to me alone. I've been using MPW since version 2. I've also used just about every other C compiler to come out for the Mac, from the Megamax C and Consulair C to THINK C 7.0. All of these systems have their good points and their bad points. However, for multi-project multi-person development, MPW has held the lead. It is no speed demon in terms of lines per minute compiled, but it is extremely flexible. The abilities to script the environment, provide multi- user source code and revision control, and add custom tools serve to make up in the long term for a lack of compilation speed. Also, Apple generally releases new technology via MPW header files and/or libraries, which can be especially important when dealing with pre-release versions of Apple software (as I have been a number of times). All of these things have kept me in the MPW camp for the kind of work I do most. Symantec C 6.0 looked promising, since it was finally scriptable, but the bugs in it and the general manner in which Symantec has handled 6.x and 7.0 have undermined my faith in their ability to deliver a quality product, despite having used it off and on since it was called "Lightspeed C". I'd seen a preview of Code Warrior in December at one of Apple's "PowerPC Coding Kitchens" which they ran for developers in the seeding program. It looked promising, but it was still kind of buggy, and was not scriptable. The person doing the demo characterized it as analogous to THINK C 5.x for the PowerPC. As a result, I sighed and went back to the Apple RISC SDK, which I fought with for some time before finally getting a build that I felt comfortable saying we could ship to customers. However, by this time I was getting aggravated at MPW as well. The PowerPC C compilers and linker in Apple's SDK are excruciatingly slow, and the optimizer breaks. TCP/Connect II 1.2.1 is built with optimization off to avoid compiler bus errors and bad code generation. It also doesn't run native, making the 8100/80 on my desk almost usefuless for anything but testing. It has not been a fun spring in some respects. By the WWDC, Code Warrior had started to get rave reviews, both here and from other developers whose opinions I have learned to respect, so I went with an open mind. After watching the Metrowerks presentation, and sitting down with Code Warrior myself, I became convinced that they really did know what they were doing. It was fast, native, and had an optimizer that seems to actually work. It's scriptable, so that I can do a large multi-project build without having to hand-drive the process. It coexists nicely with SourceServer, so that I can continue to use existing source code databases. It's code generator isn't a mangled version of an 8x86 code generator, so it actually generates nice code. I don't have to hook my PowerBook up to my Power Mac just to run the debugger. It's not perfect, but it finally tipped the scale compared to MPW. MPW tool versions of the compilers and linkers, which Metrowerks says are in the pipeline, will be the final clincher, since they will give me the best of both worlds. Besides, Metrowerks seems to be as much a bunch of crazy workaholics as InterCon is :). Amanda Walker Advanced Projects InterCon Systems Corporation +++++++++++++++++++++++++++ >From mikel@intercon.com (Michael W. Wellman) Date: Tue, 24 May 1994 14:30:57 -0500 Organization: InterCon Systems Corp., Herndon, VA, USA amanda@intercon.com (Amanda Walker) writes: > However, by this time I was getting aggravated at MPW as well. > The PowerPC C compilers and linker in Apple's SDK are excruciatingly > slow, and the optimizer breaks. TCP/Connect II 1.2.1 is built with > optimization off to avoid compiler bus errors and bad code generation. > It also doesn't run native, making the 8100/80 on my desk almost > usefuless for anything but testing. Er, I'd just like to make it clear that the "It" above refers to MPW and not TCP/Connect II 1.2.1. The latter works quite nicely natively... Now if only Metrowerks and Apple's Open Transport would work out their differences regards Apple's Shared Library Manager. mikel +++++++++++++++++++++++++++ >From peirce@outpost.SF-Bay.org (Michael Peirce) Date: Tue, 24 May 94 14:30:05 PST Organization: Peirce Software, Inc. In article <9405241430.AA57204@mikel.intercon.com> (comp.sys.mac.programmer), mikel@intercon.com (Michael W. Wellman) writes: > amanda@intercon.com (Amanda Walker) writes: > > However, by this time I was getting aggravated at MPW as well. > > The PowerPC C compilers and linker in Apple's SDK are excruciatingly > > slow, and the optimizer breaks. TCP/Connect II 1.2.1 is built with > > optimization off to avoid compiler bus errors and bad code generation. > > It also doesn't run native, making the 8100/80 on my desk almost > > usefuless for anything but testing. > > Er, I'd just like to make it clear that the "It" above refers to MPW and not > TCP/Connect II 1.2.1. The latter works quite nicely natively... The "prerelease MPW" version 3.4a2 from E.T.O. 14 has some native parts in it now. The shell is native, as is make, rez, derez, and rezdet. Too bad Link and C aren't native, but the native shell (and my faster hard disk) make for a quicker startup. And the Make doesn't take any time anymore either. It's only a start, but at least its better than nothing. (I'm very much looking forward to trying the CodeWarrior compiler and linker under MPW!) __ Michael Peirce __ peirce@outpost.sf-bay.org __ Peirce Software, Inc. __ 719 Hibiscus Place, Suite 301 __ __ San Jose, California USA 95117-1844 __ Makers of: Smoothie & __ voice: +1.408.244.6554 fax: +1.408.244.6882 __ Peirce Print Tools __ AppleLink: peirce & AOL: AFC Peirce +++++++++++++++++++++++++++ >From songer@ovation.lexmark.com (Christopher Songer) Date: Wed, 25 May 1994 13:50:40 GMT Organization: Lexmark International, Lexington, KY In article <9405241147.AA08906@fusion.intercon.com> amanda@intercon.com (Amanda Walker) writes: [...] By the WWDC, Code Warrior had started to get rave reviews, both here and from other developers whose opinions I have learned to respect, so I went with an open mind. [...] Hi! Thanks for the review -- it is much appreciated and was quite informative. Can you speak to the source control management provided by the CodeWarrior package? Thanks! -Chris songer@lexmark.com +++++++++++++++++++++++++++ >From amanda@intercon.com (Amanda Walker) Date: Wed, 25 May 1994 17:35:41 -0400 Organization: InterCon Systems Corporation, Herndon, VA USA mikel@intercon.com (Michael W. Wellman) writes: > Er, I'd just like to make it clear that the "It" above refers to MPW > and not TCP/Connect II 1.2.1. The latter works quite nicely natively... Yes, indeed. I used it to post that article, in fact :). Amanda Walker InterCon Systems Corporation +++++++++++++++++++++++++++ >From jpurlia@qualcomm.com (John Purlia) Date: Thu, 26 May 1994 13:17:22 -0800 Organization: Qualcomm, Inc. In article <9405241147.AA08906@fusion.intercon.com> amanda@intercon.com (Amanda Walker) writes: >[...] >By the WWDC, Code Warrior had started to get rave reviews, both here and from >other developers whose opinions I have learned to respect, so I went with an >open mind. >[...] Yes, a very large number of Apple engineers are using and raving about Code Warrior which is encouraging when evaluating the stability and usefulness of a new development environment. I'd very much prefer to use the power available to me through the MPW environment so I'm eagerly awaiting the release of native MPW tools from MetroWerks -- especially after talking to a couple of people at the MPW station at the conference expo who regrettably informed me that there are no plans for porting a 68K compiler to run native on PPC, which means... writing fat binaries will require you to compile the 68K portion of your app with an emulated compiler! AARGH!!! ........................................................................... John Purlia : My brain; not my company's brain. My brain says... jpurlia@qualcomm.com : Applelink AM0470 : "Newton could never live on Via de la Valle, NewtonMail: JPurlia : but it would be right at home on Cruel Lucille" +++++++++++++++++++++++++++ >From amanda@intercon.com (Amanda Walker) Date: Fri, 27 May 1994 12:27:38 -0500 Organization: InterCon Systems Corporation, Herndon, VA USA songer@ovation.lexmark.com (Christopher Songer) writes: > Thanks for the review -- it is much appreciated and was quite > informative. Can you speak to the source control management provided > by the CodeWarrior package? Currently, it is Projector-aware, so we're continuing to use SourceServer from MPW. Code Warrior does not have its own source code control system. Amanda Walker InterCon Systems Corporation --------------------------- >From nathan@cse.ucsc.edu (Nathan J. Wilson) Subject: Refinement of SC++ 7.0 code gen bug Date: 27 May 1994 06:34:38 GMT Organization: UC Santa Cruz CIS/CE First, I must say that I have been pleased with the response to my original posting (Thanks Tom and Phil!). I managed to reduce the bug to a small stand alone example. I have already send this to Symantec directly, but I thought I should post it here so other's could know what to watch out for until a fix is available. The causes appears to be with assign in the results of virtual member function that returns a double directly to a member of another class (or struct) within a loop. The effect is that some unpreserved registers get trashed resulting in garbage. Work around is to assign the result to a temporary. -Nathan // main.cpp // Demonstration of a code generation bug in Symantec C++ 7.0 // Output should be: // 12.34 == // // If you set BUG to 0 then you get the correct output which should be // 12.34 == 12.34 // #define BUG 1 #include #define THE_TYPE double // Must be double, float works fine class FeatureNum { public: THE_TYPE num; // Destination must be a member of a class or struct }; class Foo { public: virtual THE_TYPE Eval() { return 12.34; }; // Function must be a virtual member function }; int main() { Foo *foo = new Foo(); // Must be pointer to an object. Can't use Foo foo; FeatureNum table2[1]; long i = 0; while (i < 1) { // Must have loop #if BUG table2[i].num = foo->Eval(); // Obviously, assignment must be direct #else THE_TYPE tmp = foo->Eval(); table2[i].num = tmp; #endif printf("%lg == %lg\n", foo->Eval(), table2[i].num); i++; } delete foo; return 0; } #ifdef NEVER Here is the disassembled buggy code: main: 00000000: 4E56 FFDC LINK A6,#$FFDC 00000004: 48E7 1838 MOVEM.L D3/D4/A2-A4,-(A7) 00000008: 7004 MOVEQ #$04,D0 0000000A: 2F00 MOVE.L D0,-(A7) 0000000C: 4EBA 0000 JSR operator new(unsigned int) 00000010: 2840 MOVEA.L D0,A4 00000012: 4A80 TST.L D0 00000014: 670C BEQ.S *+$000E ; 00000022 00000016: 2D40 FFE8 MOVE.L D0,$FFE8(A6) 0000001A: 41ED 0000 LEA Foo::_vtbl,A0 0000001E: 2240 MOVEA.L D0,A1 00000020: 2288 MOVE.L A0,(A1) 00000022: 200C MOVE.L A4,D0 00000024: 2640 MOVEA.L D0,A3 00000026: 7000 MOVEQ #$00,D0 00000028: 2800 MOVE.L D0,D4 0000002A: 0C84 0000 0001 CMPI.L #$00000001,D4 00000030: 6C00 0096 BGE *+$0098 ; 000000C8 00000034: 2F0B MOVE.L A3,-(A7) 00000036: 204B MOVEA.L A3,A0 00000038: 2250 MOVEA.L (A0),A1 0000003A: 2251 MOVEA.L (A1),A1 0000003C: 4E91 JSR (A1) 0000003E: 2604 MOVE.L D4,D3 00000040: 2003 MOVE.L D3,D0 00000042: C6FC 000A MULU.W #$000A,D3 00000046: 4840 SWAP D0 00000048: C0FC 000A MULU.W #$000A,D0 0000004C: 4840 SWAP D0 0000004E: 4240 CLR.W D0 00000050: D680 ADD.L D0,D3 00000052: 45EE FFDC LEA $FFDC(A6),A2 00000056: 3580 3000 MOVE.W D0,$00(A2,D3.W) 0000005A: 2581 3002 MOVE.L D1,$02(A2,D3.W) 0000005E: 2588 3006 MOVE.L A0,$06(A2,D3.W) 00000062: 2004 MOVE.L D4,D0 00000064: 2200 MOVE.L D0,D1 00000066: C0FC 000A MULU.W #$000A,D0 0000006A: 4841 SWAP D1 0000006C: C2FC 000A MULU.W #$000A,D1 00000070: 4841 SWAP D1 00000072: 4241 CLR.W D1 00000074: D081 ADD.L D1,D0 00000076: 2D72 0000 FFF6 MOVE.L $00(A2,D0.W),$FFF6(A6) 0000007C: 2D72 0004 FFFA MOVE.L $04(A2,D0.W),$FFFA(A6) 00000082: 3D72 0008 FFFE MOVE.W $08(A2,D0.W),$FFFE(A6) 00000088: 2F2E FFFC MOVE.L $FFFC(A6),-(A7) 0000008C: 2F2E FFF8 MOVE.L $FFF8(A6),-(A7) 00000090: 3F2E FFF6 MOVE.W $FFF6(A6),-(A7) 00000094: 2F0B MOVE.L A3,-(A7) 00000096: 204B MOVEA.L A3,A0 00000098: 2050 MOVEA.L (A0),A0 0000009A: 2050 MOVEA.L (A0),A0 0000009C: 4E90 JSR (A0) 0000009E: 3D40 FFEC MOVE.W D0,$FFEC(A6) 000000A2: 2D41 FFEE MOVE.L D1,$FFEE(A6) 000000A6: 2D48 FFF2 MOVE.L A0,$FFF2(A6) 000000AA: 2F2E FFF2 MOVE.L $FFF2(A6),-(A7) 000000AE: 2F2E FFEE MOVE.L $FFEE(A6),-(A7) 000000B2: 3F2E FFEC MOVE.W $FFEC(A6),-(A7) 000000B6: 486D 0000 PEA $0000(A5) 000000BA: 4EBA 0000 JSR printf 000000BE: 4FEF 0018 LEA $0018(A7),A7 000000C2: 5284 ADDQ.L #$1,D4 000000C4: 6000 FF64 BRA *-$009A ; 0000002A 000000C8: 2F0B MOVE.L A3,-(A7) 000000CA: 4EBA 0000 JSR operator delete(void *) 000000CE: 7000 MOVEQ #$00,D0 000000D0: 4CDF 1C18 MOVEM.L (A7)+,D3/D4/A2-A4 000000D4: 4E5E UNLK A6 000000D6: 4E75 RTS 000000D8 Foo::Eval(void): 00000000: 4E56 FFF4 LINK A6,#$FFF4 00000004: 2D7C 4002 C570 MOVE.L #$4002C570,$FFF6(A6) FFF6 0000000C: 2D7C A3D7 0A3D MOVE.L #$A3D70A3D,$FFFA(A6) FFFA 00000014: 3D7C 7000 FFFE MOVE.W #$7000,$FFFE(A6) 0000001A: 302E FFF6 MOVE.W $FFF6(A6),D0 0000001E: 222E FFF8 MOVE.L $FFF8(A6),D1 00000022: 206E FFFC MOVEA.L $FFFC(A6),A0 00000026: 4E5E UNLK A6 00000028: 225F MOVEA.L (A7)+,A1 0000002A: 584F ADDQ.W #$4,A7 0000002C: 4ED1 JMP (A1) 0000002E Here is the disassembled non-buggy code. Changes are commented: main: 00000000: 4E56 FFD0 LINK A6,#$FFD0 00000004: 48E7 1838 MOVEM.L D3/D4/A2-A4,-(A7) 00000008: 7004 MOVEQ #$04,D0 0000000A: 2F00 MOVE.L D0,-(A7) 0000000C: 4EBA 0000 JSR operator new(unsigned int) 00000010: 2840 MOVEA.L D0,A4 00000012: 4A80 TST.L D0 00000014: 670C BEQ.S *+$000E ; 00000022 00000016: 2D40 FFE8 MOVE.L D0,$FFE8(A6) 0000001A: 41ED 0000 LEA Foo::_vtbl,A0 0000001E: 2240 MOVEA.L D0,A1 00000020: 2288 MOVE.L A0,(A1) 00000022: 200C MOVE.L A4,D0 00000024: 2640 MOVEA.L D0,A3 00000026: 7000 MOVEQ #$00,D0 00000028: 2800 MOVE.L D0,D4 0000002A: 0C84 0000 0001 CMPI.L #$00000001,D4 00000030: 6C00 00A8 BGE *+$00AA ; 000000DA 00000034: 2F0B MOVE.L A3,-(A7) 00000036: 204B MOVEA.L A3,A0 00000038: 2250 MOVEA.L (A0),A1 0000003A: 2251 MOVEA.L (A1),A1 0000003C: 4E91 JSR (A1) 0000003E: 3D40 FFDC MOVE.W D0,$FFDC(A6) ; Added 00000042: 2D41 FFDE MOVE.L D1,$FFDE(A6) ; Added 00000046: 2D48 FFE2 MOVE.L A0,$FFE2(A6) ; Added 0000004A: 2604 MOVE.L D4,D3 0000004C: 2003 MOVE.L D3,D0 0000004E: C6FC 000A MULU.W #$000A,D3 00000052: 4840 SWAP D0 00000054: C0FC 000A MULU.W #$000A,D0 00000058: 4840 SWAP D0 0000005A: 4240 CLR.W D0 0000005C: D680 ADD.L D0,D3 0000005E: 45EE FFD0 LEA $FFD0(A6),A2 00000062: 25AE FFDC 3000 MOVE.L $FFDC(A6),$00(A2,D3.W) ; Change 00000068: 25AE FFE0 3004 MOVE.L $FFE0(A6),$04(A2,D3.W) ; Change 0000006E: 35AE FFE4 3008 MOVE.W $FFE4(A6),$08(A2,D3.W) ; Change 00000074: 2004 MOVE.L D4,D0 00000076: 2200 MOVE.L D0,D1 00000078: C0FC 000A MULU.W #$000A,D0 0000007C: 4841 SWAP D1 0000007E: C2FC 000A MULU.W #$000A,D1 00000082: 4841 SWAP D1 00000084: 4241 CLR.W D1 00000086: D081 ADD.L D1,D0 00000088: 2D72 0000 FFF6 MOVE.L $00(A2,D0.W),$FFF6(A6) 0000008E: 2D72 0004 FFFA MOVE.L $04(A2,D0.W),$FFFA(A6) 00000094: 3D72 0008 FFFE MOVE.W $08(A2,D0.W),$FFFE(A6) 0000009A: 2F2E FFFC MOVE.L $FFFC(A6),-(A7) 0000009E: 2F2E FFF8 MOVE.L $FFF8(A6),-(A7) 000000A2: 3F2E FFF6 MOVE.W $FFF6(A6),-(A7) 000000A6: 2F0B MOVE.L A3,-(A7) 000000A8: 204B MOVEA.L A3,A0 000000AA: 2050 MOVEA.L (A0),A0 000000AC: 2050 MOVEA.L (A0),A0 000000AE: 4E90 JSR (A0) 000000B0: 3D40 FFEC MOVE.W D0,$FFEC(A6) 000000B4: 2D41 FFEE MOVE.L D1,$FFEE(A6) 000000B8: 2D48 FFF2 MOVE.L A0,$FFF2(A6) 000000BC: 2F2E FFF2 MOVE.L $FFF2(A6),-(A7) 000000C0: 2F2E FFEE MOVE.L $FFEE(A6),-(A7) 000000C4: 3F2E FFEC MOVE.W $FFEC(A6),-(A7) 000000C8: 486D 0000 PEA $0000(A5) 000000CC: 4EBA 0000 JSR printf 000000D0: 4FEF 0018 LEA $0018(A7),A7 000000D4: 5284 ADDQ.L #$1,D4 000000D6: 6000 FF52 BRA *-$00AC ; 0000002A 000000DA: 2F0B MOVE.L A3,-(A7) 000000DC: 4EBA 0000 JSR operator delete(void *) 000000E0: 7000 MOVEQ #$00,D0 000000E2: 4CDF 1C18 MOVEM.L (A7)+,D3/D4/A2-A4 000000E6: 4E5E UNLK A6 000000E8: 4E75 RTS 000000EA Foo::Eval(void): 00000000: 4E56 FFF4 LINK A6,#$FFF4 00000004: 2D7C 4002 C570 MOVE.L #$4002C570,$FFF6(A6) FFF6 0000000C: 2D7C A3D7 0A3D MOVE.L #$A3D70A3D,$FFFA(A6) FFFA 00000014: 3D7C 7000 FFFE MOVE.W #$7000,$FFFE(A6) 0000001A: 302E FFF6 MOVE.W $FFF6(A6),D0 0000001E: 222E FFF8 MOVE.L $FFF8(A6),D1 00000022: 206E FFFC MOVEA.L $FFFC(A6),A0 00000026: 4E5E UNLK A6 00000028: 225F MOVEA.L (A7)+,A1 0000002A: 584F ADDQ.W #$4,A7 0000002C: 4ED1 JMP (A1) 0000002E Finally, here is a text version of the project file used to compile the code: Wombat:Apps:ThinkC/C++:Play:Play.¹ 1 segments 3 files Segment 3 Name: Preload: false Protected: true Locked: true Purgeable: true SystemHeap: false 3 files: Wombat:Apps:ThinkC/C++:SC++7.0:Standard Libraries:ANSI++ Wombat:Apps:ThinkC/C++:SC++7.0:Standard Libraries:CPlusLib Wombat:Apps:ThinkC/C++:Play:main.cpp #endif --------------------------- >From fever@winternet.com (Fever) Subject: Serial Port Programming? Date: 26 May 1994 20:45:00 GMT Organization: StarNet Communications, Inc Could someone direct me to where I can find information on programming the Mac's serial ports? (Specifically: For modems, in C) I'd appreciate any information... +++++++++++++++++++++++++++ >From d88-jwa@dront.nada.kth.se (Jon Wätte) Date: 27 May 1994 06:48:46 GMT Organization: The Royal Institute of Technology In <2s31oc$16d@blackice.winternet.com> fever@winternet.com (Fever) writes: >Could someone direct me to where I can find information on programming the >Mac's serial ports? (Specifically: For modems, in C) The comp.sys.mac.programmer FAQ answer sheet shows, in code, how to make a list of all available serial ports, and then go on to use it for something. You can also check Think Reference 2.0. nada.kth.se:pub/hacks/mac-faq Cheers, / h+ -- -- Jon W{tte, h+@nada.kth.se, Mac Software Engineer Deluxe -- "After I first used the Mac, I had a dream in which I would walk up to people, touch them, and they'd turn black. Then I could talk to them." -- Anon +++++++++++++++++++++++++++ >From egurney@vcd.hp.com (Eddy J. Gurney) Date: Sat, 28 May 1994 00:49:06 GMT Organization: Hewlett-Packard VCD Fever (fever@winternet.com) wrote: >Could someone direct me to where I can find information on programming the >Mac's serial ports? (Specifically: For modems, in C) Check out the sample code on ftp.apple.com in: /dts/mac/sc/snippets/devices/pbxxx-serial-demo.hqx It is a good example of using the Mac serial ports "correctly". -- Eddy J. Gurney N8FPW Hewlett-Packard Company, Vancouver (USA!) Division egurney@vcd.hp.com #include "Failures are divided into two classes-- those who thought and never did, and those who did and never thought." John Charles Salak --------------------------- >From sfkaplan@alife.santafe.edu (Scott Kaplan) Subject: Serial port use Date: 24 May 1994 19:59:57 GMT Organization: The Santa Fe Institute Hi there. I'm writing a quick little program which needs to make use of the serial ports (specifically, the modem port attached to, of all things, a modem...). For what this program is doing, it does not seem worth my time to figure out how to use the Comm Toolbox, so I thought I'd do it directly by opening the serial drivers and using good ol' FSRead and FSWrite. I'm having trouble, and I was hoping someone could tell me why. Here's the problem. I've go to do an FSRead on the modem port. If there is something waiting in the modem port's buffer, everything's great. However, if there is nothing there (nothing has come in since I read from it last), I die. Rather than returning a count of 0 bytes read in, and rather than returning some error value from FSRead, the machine crashes completely. I have to reboot. So, I am clearly doing something wrong here... If someone knows what this might be, please let me know. If more information about what I'm doing is needed, please ask, I'll be happy to provide it. and if you think that I shouldn't be avoiding the Comm Toolbox and that it would easily solve my problems, let me know about that too. Thanks muchly. Scott Kaplan +++++++++++++++++++++++++++ >From egurney@vcd.hp.com (Eddy J. Gurney) Date: Tue, 24 May 1994 23:23:40 GMT Organization: Hewlett-Packard VCD Scott Kaplan (sfkaplan@alife.santafe.edu) wrote: >Hi there. I'm writing a quick little program which needs to make use of the >serial ports (specifically, the modem port attached to, of all things, a >modem...). >For what this program is doing, it does not seem worth my time to figure out >how to use the Comm Toolbox, so I thought I'd do it directly by opening the >serial drivers and using good ol' FSRead and FSWrite. I'm having trouble, >and I was hoping someone could tell me why. Check out the sample code on ftp.apple.com: /dts/mac/sc/snippets/devices/pbxxx-serial-demo.hqx The snippets directory is a GREAT place to look for answers to ALL of your questions BEFORE posting to net... -- Eddy J. Gurney N8FPW Hewlett-Packard Company, Vancouver (USA!) Division egurney@vcd.hp.com #include "Failures are divided into two classes-- those who thought and never did, and those who did and never thought." John Charles Salak +++++++++++++++++++++++++++ >From ab@crosfield.co.uk (Andrew Bradley) Date: Thu, 26 May 1994 09:03:15 GMT Organization: Crosfield, Hemel Hempstead, UK In article <2rtmbt$o8m@tierra.santafe.ede> sfkaplan@alife.santafe.edu (Scott Kaplan) writes: >Hi there. I'm writing a quick little program which needs to make use of the >serial ports (specifically, the modem port attached to, of all things, a >modem...). >Here's the problem. I've go to do an FSRead on the modem port. If there is >something waiting in the modem port's buffer, everything's great. However, >if there is nothing there (nothing has come in since I read from it last), >I die. Rather than returning a count of 0 bytes read in, and rather than >returning some error value from FSRead, the machine crashes completely. I >have to reboot. So, I am clearly doing something wrong here... > I use SerGetBuf to check whats available and read that in - if its zero I use my own minimum data size because otherwise the FSRead will hang until it got all the bytes you asked for. Remember the Mac may be written in C but its not UNIX. You have to study the Mac libraries very carefully and forget all your unix past ! Regards Andrew -- |\/\/\/\ Andrew Bradley | | Crosfield Electronics Limited +++++++++++++++++++++++++++ >From cswan@actrix.gen.nz (Chris Swan) Date: Thu, 26 May 1994 21:25:04 GMT Organization: Actrix Information Exchange Scott Kaplan wrote: > Hi there. I'm writing a quick little program which needs to make use of the > serial ports (specifically, the modem port attached to, of all things, a > modem...). > Here's the problem. I've go to do an FSRead on the modem port. If there is > something waiting in the modem port's buffer, everything's great. However, > if there is nothing there (nothing has come in since I read from it last), > I die. Rather than returning a count of 0 bytes read in, and rather than > returning some error value from FSRead, the machine crashes completely. I > have to reboot. So, I am clearly doing something wrong here... I'm not sure why you're crashing but the normal way is to call: theError:= SerGetBuf(refNum,count); if (theError=noErr) and (count>0) then theError:= FSRead(refNum,count,buffPtr); works for me ! -- Chris Swan cswan@actrix.gen.nz -- +++++++++++++++++++++++++++ >From Bruce@hoult.actrix.gen.nz (Bruce Hoult) Date: Fri, 27 May 1994 14:08:43 +1200 (NZST) Organization: (none) sfkaplan@alife.santafe.edu (Scott Kaplan) writes: > Here's the problem. I've go to do an FSRead on the modem port. If there is > something waiting in the modem port's buffer, everything's great. However, > if there is nothing there (nothing has come in since I read from it last), > I die. Rather than returning a count of 0 bytes read in, and rather than > returning some error value from FSRead, the machine crashes completely. I > have to reboot. So, I am clearly doing something wrong here... The machine hasn't crashed -- it's just waiting for the data you asked for. If you want your program to continue if there's nothing there then use... SerGetBuf(refNum:INTEGER;VAR count:LONGINT):OSErr; ...to find out how many bytes are available, and then ask for at most that many in your FSRead. -- Bruce btw, I just used ObiWan to paste the definition of SerGetBuf. It's nice, but what I *hate* about it is that the first time I use it after a restart, it puts up a much larger window and all my Icons that are nicely arranged along the bottom of my Finder desktop somehow get moved to the RH side of the desktop. ::aaaarggghhhh:: +++++++++++++++++++++++++++ >From gurgle@netcom.com (Pete Gontier) Date: Fri, 27 May 1994 21:33:37 GMT Organization: cellular ab@crosfield.co.uk (Andrew Bradley) writes: >Remember the Mac may be written in C but its not UNIX. I know it's a persistent rumor, but the Mac ROMs were not written in any particular high-level language. I guess from now on the Power Mac ROMs will mostly be written in C, or perhaps C++, but from what I understand, much of that work has not yet been released. It's still mostly 68K assembly using the Pascal calling convention. -- Pete Gontier, CTO, Integer Poet Software; gurgle@netcom.com "Bedrock does support a form of drag and drop. Development dragged on for about two years, and then was dropped." -- Brian Clark +++++++++++++++++++++++++++ >From sfkaplan@alife.santafe.edu (Scott Kaplan) Date: 29 May 1994 16:43:44 GMT Organization: The Santa Fe Institute Many thanks to those that responded! I know now of a very useful place for sample source code from Apple, which will always be a good thing. More- over, I now know what I was doing wrong. Sure enough, the use of SerGetBuf fixed my troubles. My apologies for not having read through the serial driver toolbox routines more carefully. It's been a little while since I had done Mac programming, so I had fallen out of that good habit. Scott Kaplan sfkaplan@santafe.edu --------------------------- >From stevenj@ATHENA.MIT.EDU (Steven G. Johnson) Subject: THINK Class Library FTP Site? Date: 26 May 1994 18:32:48 GMT Organization: Massachvsetts Institvte of Technology There used to be an FTP site containing an archive of classes that people have written for TCL. It was connected to a mailing list (called TCL-talk, I think), and was located at ftp.brown.edu. However, I looked at this site today and I couldn't find anything! Does anyone know what has happened to the archive (and the mailing list)? Has it been moved to someplace else? If so, where? Please email all responses, as it is difficult for me to read this newsgroup at the moment. I will post a summary of the replies if anyone is interested. Thanks! Cordially, Steven G. Johnson +++++++++++++++++++++++++++ >From stevenj@ATHENA.MIT.EDU (Steven G. Johnson) Date: 27 May 1994 16:28:35 GMT Organization: Massachvsetts Institvte of Technology I recently posted a request for the location of the FTP site containing TCL classes and functions. I was told that the new site is: daemon.ncsa.uiuc.edu (I checked it out and this is indeed the correct address). Thanks to all who replied. Cordially, Steven G. Johnson --------------------------- >From Will Husain Subject: storage for XCMDS Date: 23 May 1994 14:51:52 GMT Organization: k12 I'd like to write an XCMD for hypercard that will store information between successive calls from hypercard. How can I keep track of global data with this kind of resource? Thanks for any suggestions Will Glass-Husain Catalina Foothills High School whusain@k12.az.us +++++++++++++++++++++++++++ >From alex@metcalf.demon.co.uk (Alex Metcalf) Date: Tue, 24 May 1994 12:02:21 GMT Organization: Best Before Yesterday In article <2rqfu8$ffs@azedlink1.ade.state.az.us>, Will Husain wrote: > I'd like to write an XCMD for hypercard that will store information > between successive calls from hypercard. How can I keep track of global > data with this kind of resource? You first need to make up your own struct of information which you want to keep, something like this: typedef struct { Ptr myMemory; long myLong; short myShort; } MyData, *MyDataPtr; So, you use NewPtr to make some space on the heap for your data. Then, you take the pointer (to your data), typecast it to a 'long', use NumToString, and store the string (which is actually the address of your info) in a HyperCard global variable using SetGlobal. Next time round, use GetGlobal, use StringToNum, and then typecast back to a pointer. You can then access your information. Hope this helps! Get in touch if you have any other questions. Best wishes, Alex -- Alex Metcalf, Best Before Yesterday Mac programmer in C, C++, HyperTalk, assembler Internet, AOL, BIX: alex@metcalf.demon.co.uk "Surely you AppleLink: alex@metcalf.demon.co.uk@internet# can't be CompuServe: INTERNET:alex@metcalf.demon.co.uk serious?" Delphi: alex@metcalf.demon.co.uk@inet# FirstClass: alex@metcalf.demon.co.uk,Internet "I am serious... Fax (UK): (0570) 45636 and don't call Fax (US / Canada): 011 44 570 45636 me Shirley." +++++++++++++++++++++++++++ >From Arne.Venstad@DELAB.SINTEF.no (Arne Venstad) Date: 25 May 1994 08:44:02 GMT Organization: SINTEF DELAB In article , alex@metcalf.demon.co.uk (Alex Metcalf) wrote: > > In article <2rqfu8$ffs@azedlink1.ade.state.az.us>, Will Husain > wrote: > > > I'd like to write an XCMD for hypercard that will store information > > between successive calls from hypercard. How can I keep track of global > > data with this kind of resource? > > You first need to make up your own struct of information which you want to > keep, something like this: > > typedef struct > { > Ptr myMemory; > long myLong; > short myShort; > } MyData, *MyDataPtr; > > So, you use NewPtr to make some space on the heap for your data. Then, you > take the pointer (to your data), typecast it to a 'long', use NumToString, > and store the string (which is actually the address of your info) in a > HyperCard global variable using SetGlobal. > >... I do not think it is wise to allocate locked memory blocks behind the back of HyperCard. I would therefore suggest you use NewHandle instead of NewPtr, and always unlock it before returning to HyperCard. Otherwise the schema is ok. Arne Venstad Internet: Arne.Venstad@delab.sintef.no SINTEF DELAB, N-7034 Trondheim, Norway. +++++++++++++++++++++++++++ >From alex@metcalf.demon.co.uk (Alex Metcalf) Date: Wed, 25 May 1994 12:01:50 GMT Organization: Best Before Yesterday In article , Arne.Venstad@DELAB.SINTEF.no (Arne Venstad) wrote: > In article , > alex@metcalf.demon.co.uk (Alex Metcalf) wrote: > > > > In article <2rqfu8$ffs@azedlink1.ade.state.az.us>, Will Husain > > wrote: > > > > > I'd like to write an XCMD for hypercard that will store information > > > between successive calls from hypercard. How can I keep track of global > > > data with this kind of resource? > > > > You first need to make up your own struct of information which you want to > > keep, something like this: > > > > typedef struct > > { > > Ptr myMemory; > > long myLong; > > short myShort; > > } MyData, *MyDataPtr; > > > > So, you use NewPtr to make some space on the heap for your data. Then, you > > take the pointer (to your data), typecast it to a 'long', use NumToString, > > and store the string (which is actually the address of your info) in a > > HyperCard global variable using SetGlobal. > > > >... > > I do not think it is wise to allocate locked memory blocks behind > the back of HyperCard. I would therefore suggest you use NewHandle > instead of NewPtr, and always unlock it before returning to HyperCard. > Otherwise the schema is ok. I've had problems before with NewHandle: HyperCard enjoys moving memory around, especially when stacks are switched/closed. If HyperCard (or the system memory fuctions) decide to purge your block then there's no way to get your data back. Alex +++++++++++++++++++++++++++ >From Ron_Hunsinger@bmug.org (Ron Hunsinger) Date: Wed, 25 May 94 22:52:20 PST Organization: Berkeley Macintosh Users Group Will Husain writes: >I'd like to write an XCMD for hypercard that will store information >between successive calls from hypercard. How can I keep track of global >data with this kind of resource? Store the data in a relocatable block, and convert the Handle to that block to a string and store the string in a global variable. (Choose a name that won't be used by somebody else.) On entry to the XCMD, get the value of that variable. If it doesn't have a value, you know this is the first call of the XCMD, and you should allocate your data. If the variable does have a value, convert it back to a long, and cast it as a Handle to your data. -Ron Hunsinger +++++++++++++++++++++++++++ >From Kevin Marks Date: Sat, 28 May 1994 11:08:05 GMT Organization: Me In article <001565AE.fc@bmug.org> Ron Hunsinger, Ron_Hunsinger@bmug.org writes: >Store the data in a relocatable block, and convert the Handle to that >block to a string and store the string in a global variable. (Choose a >name that won't be used by somebody else.) This is a bit dodgy - you can't guarantee that someone else won't trash your variable... The best way is to write a XWindow instead, and store your Handle in the window's refcon. You don't have to show the window if it's not working on visual stuf, and thsi means you can send messages to it and set properties, so your HyperTalk looks less obscure. --------------------------- End of C.S.M.P. Digest **********************