From: pottier@clipper.ens.fr (Francois Pottier)
Subject: csmp-digest-v3-027
Date: Sun, 15 May 94 21:57:08 MET DST

C.S.M.P. Digest             Sun, 15 May 94       Volume 3 : Issue 27
 
Today's Topics:
 
        Determining if user has a CD ROM drive
        Lex and Yacc for Mac Programmers
        PowerMac FP performance - interesting results????
        Saving the floating Point Registers
        The NewWindow case
        Truetype font format specification: No longer available from Apple ?!



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 as comp.sys.mac.programmer.src.


-------------------------------------------------------

>From mkelly@cs.uoregon.edu (Michael A. Kelly)
Subject: Determining if user has a CD ROM drive
Date: 25 Apr 1994 15:18:08 -0700
Organization: High Risk Ventures


Hey,

Is there any way to determine (through software) if a given machine has a
CD ROM drive attached to it?  Do I just have to look for an unwritable disk
larger than 500MB (and wouldn't that only show up if there's a CD mounted)?
Is there any other way?

Thanks,

Mike.
-- 
_____________________________________________________________________________
Michael A. Kelly                                                President/CEO
mkelly@cs.uoregon.edu                                      High Risk Ventures
_____________________________________________________________________________

+++++++++++++++++++++++++++

>From mxmora@unix.sri.com (Matt Mora)
Date: 25 Apr 1994 16:55:17 -0700
Organization: SRI International, Menlo Park, CA

In article <2phfj0$95h@majestix.cs.uoregon.edu> mkelly@cs.uoregon.edu (Michael A. Kelly) writes:
>
>Hey,
>
>Is there any way to determine (through software) if a given machine has a
>CD ROM drive attached to it?  Do I just have to look for an unwritable disk
>larger than 500MB (and wouldn't that only show up if there's a CD mounted)?
>Is there any other way?


Sure,

Here you go:

//------------------------------------------------------------
  pascal  OSErr OpenCD(Byte CDDrive, short *ioRefNum) {
//------------------------------------------------------------

  auto  OSErr     osErr;
  auto  short     ioRefNumTemp,
                  CDDriveCount,
                  SCSIID;
  auto  WhoIsThereRec *pb;

  pb = (WhoIsThereRec *) NewPtrClear(sizeof (*pb));
  osErr = MemError();
  if (0 != pb && noErr == osErr) {
    osErr = OpenDriver("\p.AppleCD", &ioRefNumTemp);
    if (noErr == osErr) {
      (*pb).ioRefNum    = ioRefNumTemp;
      (*pb).csCode    = csWhoIsThere;
      osErr = PBStatus((ParmBlkPtr)pb, false);
      if (noErr == osErr) {
        CDDriveCount = 0;
        for (SCSIID = 0; SCSIID < 7; ++SCSIID) {
          if (BitTst(&(*pb).csParam.SCSIMask, 7 - SCSIID)) {
            ++CDDriveCount;
            if (CDDrive == CDDriveCount) {
              *ioRefNum = -(32 + SCSIID) - 1;
              DisposPtr((Ptr) pb);
              return noErr;
            }
          }
        }
        osErr = paramErr;
      }
    }
    DisposPtr((Ptr) pb);
  }
  return osErr;
}


I didn't write it it came from:

// imWare
// Wednesday, February 14, 1990
// James Beninghaus


Xavier


-- 
___________________________________________________________
Matthew Xavier Mora                       Matt_Mora@sri.com
SRI International                       mxmora@unix.sri.com
333 Ravenswood Ave                    Menlo Park, CA. 94025

+++++++++++++++++++++++++++

>From mclow@csusm.edu (Marshall Clow)
Date: 26 Apr 1994 00:36:17 GMT
Organization: (none)

Matt Mora (mxmora@unix.sri.com) wrote:
>In article <2phfj0$95h@majestix.cs.uoregon.edu> mkelly@cs.uoregon.edu
> (Michael A. Kelly) writes:
>>
>>Hey,
>>
>>Is there any way to determine (through software) if a given machine has a
>>CD ROM drive attached to it?  Do I just have to look for an unwritable disk
>>larger than 500MB (and wouldn't that only show up if there's a CD mounted)?
>>Is there any other way?


>Sure,

>Here you go:

[ code deleted ]

Matt,
	Pardon me if I missed something, but the code that you posted
only works if the Apple CD-ROM drivers are installed. What if the CD-ROM
that the user has uses it's own, custom driver?

Perhaps if the original poster could provide some more information
about what he was trying to accomplish, someone could suggest a solution.

-- Marshall

Marshall Clow
I are an Engineer!
Aladdin Systems
mclow@san_marcos.csusm.edu


+++++++++++++++++++++++++++

>From mkelly@cs.uoregon.edu (Michael A. Kelly)
Date: 26 Apr 1994 00:08:21 -0700
Organization: High Risk Ventures

In article <2phnm1$dqm@coyote.csusm.edu>,
Marshall Clow <mclow@csusm.edu> wrote:
>	Pardon me if I missed something, but the code that you posted
>only works if the Apple CD-ROM drivers are installed. What if the CD-ROM
>that the user has uses it's own, custom driver?
>
>Perhaps if the original poster could provide some more information
>about what he was trying to accomplish, someone could suggest a solution.

I simply want to know if there is a CD ROM drive attached to the machine.
I am not going to do anything with that information, besides take note of
it.  It will become part of a 'system code' that the user can give to a
tech support person when there is trouble - rather than the tech support
person having to ask the user for each tidbit of information, they just
ask for this code, which immediately gives them all the basic information
they need about the user's machine.

Of course, whether or not the user has a CD ROM drive is pretty unimportant
for tech support (if it was important it would probably be given).  This
system code is also used to give us some statistics about the number of
CD ROM drives in our customer base.

All of this is irrelevant to the question at hand, though.

Mike.
-- 
_____________________________________________________________________________
Michael A. Kelly                                                President/CEO
mkelly@cs.uoregon.edu                                      High Risk Ventures
_____________________________________________________________________________

+++++++++++++++++++++++++++

>From d88-jwa@dront.nada.kth.se (Jon Wätte)
Date: 26 Apr 1994 08:10:11 GMT
Organization: The Royal Institute of Technology

In <2phfj0$95h@majestix.cs.uoregon.edu> mkelly@cs.uoregon.edu (Michael A. Kelly) writes:

>Is there any way to determine (through software) if a given machine has a
>CD ROM drive attached to it?  Do I just have to look for an unwritable disk

Use the SCSI manager to examine all SCSI devices and look for a CD-ROM
type device.

But why? Most users can be trusted to look around their computer, see
"hey, here's a CD-ROM" and check the appropriate check box; that's
several magnitudes safer than any automatic check.

And if you're gathering statistics behind the users back, don't.
Remember that Prograph was close to being publicly flogged for the
"Exploding Pink Poodles" stuff, which was something their mastering
company put there.
-- 
 -- Jon W{tte, h+@nada.kth.se, Mac Hacker Deluxe --
 "Don't Deal with a Dragon."

+++++++++++++++++++++++++++

>From d88-jwa@dront.nada.kth.se (Jon Wätte)
Date: 26 Apr 1994 08:11:07 GMT
Organization: The Royal Institute of Technology

In <2phl95$i30@unix.sri.com> mxmora@unix.sri.com (Matt Mora) writes:

>    osErr = OpenDriver("\p.AppleCD", &ioRefNumTemp);

There are other CD-ROM drivers than Apple's CD driver, like
NECs or Toshibas. This solution loses.
-- 
 -- Jon W{tte, h+@nada.kth.se, Mac Hacker Deluxe --
 "Don't Deal with a Dragon."

+++++++++++++++++++++++++++

>From mxmora@unix.sri.com (Matt Mora)
Date: 26 Apr 1994 10:47:41 -0700
Organization: SRI International, Menlo Park, CA

In article <2phnm1$dqm@coyote.csusm.edu> mclow@csusm.edu (Marshall Clow) writes:

>Matt,
>	Pardon me if I missed something, but the code that you posted
>only works if the Apple CD-ROM drivers are installed. What if the CD-ROM
>that the user has uses it's own, custom driver?


Picky, Picky.  Test for non-apple drivers is left as an exercise for the 
reader. :-)

I thought that he might want to do something usefull like distribute
his games on CDrom chock full of 32 bit sounds and graphics using driver
calls for access.



Xavier



-- 
___________________________________________________________
Matthew Xavier Mora                       Matt_Mora@sri.com
SRI International                       mxmora@unix.sri.com
333 Ravenswood Ave                    Menlo Park, CA. 94025

+++++++++++++++++++++++++++

>From mkelly@cs.uoregon.edu (Michael A. Kelly)
Date: 26 Apr 1994 11:46:35 -0700
Organization: High Risk Ventures

In article <2pii93$hls@news.kth.se>,
Jon Wätte <d88-jwa@dront.nada.kth.se> wrote:
>Use the SCSI manager to examine all SCSI devices and look for a CD-ROM
>type device.

How do I do that?  I've been looking at the SCSI Manager in Think Reference,
and I can't figure out how to tell if the device is a CD ROM device.

>Remember that Prograph was close to being publicly flogged for the
>"Exploding Pink Poodles" stuff, which was something their mastering
>company put there.

I don't remember anything about that - what happened?

We have no intention of making the data we gather public in any way - it's
strictly for our own information.  So that someday in the future when we're
thinking that we'd like to make an action CD game, we can look at our
customer base and see what percentage of action game players have a CD drive.
I don't expect the information to be all that useful, or reliable, but it
doesn't hurt to gather it.

Mike.
-- 
_____________________________________________________________________________
Michael A. Kelly                                                President/CEO
mkelly@cs.uoregon.edu                                      High Risk Ventures
_____________________________________________________________________________

+++++++++++++++++++++++++++

>From isis@netcom.com (Mike Cohen)
Date: Tue, 26 Apr 1994 17:40:03 GMT
Organization: ISIS International

mxmora@unix.sri.com (Matt Mora) writes:

>In article <2phfj0$95h@majestix.cs.uoregon.edu> mkelly@cs.uoregon.edu (Michael A. Kelly) writes:
>>
>>Hey,
>>
>>Is there any way to determine (through software) if a given machine has a
>>CD ROM drive attached to it?  Do I just have to look for an unwritable disk
>>larger than 500MB (and wouldn't that only show up if there's a CD mounted)?
>>Is there any other way?


>Sure,

>Here you go:
(code snippet deleted)
>I didn't write it it came from:

>// imWare
>// Wednesday, February 14, 1990
>// James Beninghaus

This is the cleanest way (I've done it that way myself for an ISO9660 CD
browser), but it will only work for an Apple or compatible drive.
-- 
Mike Cohen - isis@netcom.com
NewtonMail, eWorld: MikeC / ALink: D6734 / AOL: MikeC20

+++++++++++++++++++++++++++

>From Phil Smy <psmy@io.org>
Date: 27 Apr 1994 13:50:26 GMT
Organization: Innotech MultiMedia Corp.

In article <2piiar$hlt@news.kth.se> Jon W!tte, d88-jwa@dront.nada.kth.se
writes:
>>    osErr = OpenDriver("\p.AppleCD", &ioRefNumTemp);
>
>There are other CD-ROM drivers than Apple's CD driver, like
>NECs or Toshibas. This solution loses.

Actually, for some reason, with NEC drivers this does work! They must
register themselves (actually I think all cd drivers do) as ".AppleCD".

Phil
******************************************************************
* Phil Smy                    * Interactive CDRom MultiMedia     *
* Sr. Developer               * #include <stddisclaimer.h>       *
* Innotech MultiMedia Corp.   * Wot Gorilla?                     *
******************************************************************

+++++++++++++++++++++++++++

>From sch@unx.sas.com (Steve Holzworth)
Date: Wed, 27 Apr 1994 21:10:12 GMT
Organization: SAS Institute Inc.

mkelly@cs.uoregon.edu (Michael A. Kelly) writes:

>In article <2pii93$hls@news.kth.se>,
>Jon Wätte <d88-jwa@dront.nada.kth.se> wrote:
>>Use the SCSI manager to examine all SCSI devices and look for a CD-ROM
>>type device.

>How do I do that?  I've been looking at the SCSI Manager in Think Reference,
>and I can't figure out how to tell if the device is a CD ROM device.

The SCSI "Inquiry" command returns info about the specified SCSI device,
including a code which says that it is a ROM, WORM, DISK, etc.

A peripheral type  5 should be a CD-ROM drive.
--
Steve Holzworth
sch@unx.sas.com                    "Do not attribute to poor spelling
SAS Institute   x6872               That which is actually poor typing..."
SAS/Macintosh Development Team                            - me
Cary, N.C.

+++++++++++++++++++++++++++

>From mkelly@cs.uoregon.edu (Michael A. Kelly)
Date: 28 Apr 94 08:30:22 GMT
Organization: High Risk Ventures

In article <sch.767481012@gargoyle>, Steve Holzworth <sch@unx.sas.com> wrote:
>
>The SCSI "Inquiry" command returns info about the specified SCSI device,
>including a code which says that it is a ROM, WORM, DISK, etc.

OK, but the problem is that I don't have the scsi specs, so I don't know
how to send an inquiry command or get the id from whatever it returns....

Mike.
-- 
_____________________________________________________________________________
Michael A. Kelly                                                President/CEO
mkelly@cs.uoregon.edu                                      High Risk Ventures
_____________________________________________________________________________

+++++++++++++++++++++++++++

>From sch@unx.sas.com (Steve Holzworth)
Date: Thu, 28 Apr 1994 22:37:52 GMT
Organization: SAS Institute Inc.

mkelly@cs.uoregon.edu (Michael A. Kelly) writes:

>In article <sch.767481012@gargoyle>, Steve Holzworth <sch@unx.sas.com> wrote:
>>
>>The SCSI "Inquiry" command returns info about the specified SCSI device,
>>including a code which says that it is a ROM, WORM, DISK, etc.

>OK, but the problem is that I don't have the scsi specs, so I don't know
>how to send an inquiry command or get the id from whatever it returns....

I hope you have Macintosh documentation on the SCSI Manager, otherwise
the problem becomes too complex, short of me writing you the actual code
to do the Inquiry. Assuming you DO have the SCSI Manager doc, use a
SCSI command block as follows:

The SCSI Inquiry command is command code 0x12.
The command block is as follows (conforms to SCSI2 spec):

		Bits
     | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Byte
0	Inquiry (0x12)
1    | LogUnit#  |        0          |
2	    0
3           0
4    Allocation Length
5           0

LogUnit# is a logical unit at this SCSI ID, and should almost always be
zero (note, this isn't the same as the SCSI ID itself; it's a sub-unit).

Allocation Length is the size of the maximum buffer that should be returned
by this command. You only care about the first byte, so try 1. The Macintosh
is good about throwing away excess bytes and resyncing the SCSI handshake.

The first byte returned is the device type, as mentioned in the previous
post.

--
Steve Holzworth
sch@unx.sas.com                    "Do not attribute to poor spelling
SAS Institute   x6872               That which is actually poor typing..."
SAS/Macintosh Development Team                            - me
Cary, N.C.

+++++++++++++++++++++++++++

>From tzs@u.washington.edu (Tim Smith)
Date: 1 May 1994 06:32:31 GMT
Organization: University of Washington School of Law, Class of '95

Michael A. Kelly <mkelly@cs.uoregon.edu> wrote:
>How do I do that?  I've been looking at the SCSI Manager in Think Reference,
>and I can't figure out how to tell if the device is a CD ROM device.

Try this.  The following was written when Think C first came out with
the objected oriented extensions, and was my first attempt to use
them, which is why it goes a bit overboard.  The first two files
below define an object oriented interface to the SCSI manager.
The third file scans the SCSI bus looking for a tape drive.
At the end, I'll tell you where to change it to look for a
CD-ROM drive.

- -------- file cscsi.h ----------

#ifndef CSCSI_H
#define	CSCSI_H

#include	<SCSI.H>

typedef enum
{
	dataIn=1, dataOut=2, noData=3
} XferDir;

#define	USE_CDB		0x01
#define	USE_BUF		0x02
#define	USE_LEN		0x04
#define	USE_DIR		0x08
#define	USE_ID		0x10

#define	CAN_DATA	(USE_CDB|USE_BUF|USE_LEN|USE_DIR|USE_ID)
#define	CAN_NO_DATA	(USE_CDB|USE_DIR|USE_ID)

#define	SCSI_NEED_INFO	(-1)
#define	SCSI_OK			(0)

class	CSCSIOp
{
	short	targetID;
	char	cdb[12];
	char	cdbLen;
	unsigned char *	dataPtr;
	long	dataLen;
	short	status;
	short	message;
	OSErr	err;
	XferDir	dir;
	long	timeout;
	int		haveInfo;
	long	moved;
public:
			CSCSIOp( void );
			~CSCSIOp( void );
	void	keep( int what );
	void	setID( short ID );
	void	setCDB( int len, char * cdbPtr );
	void	set6( char a, char b, char c, char d, char e, char f );
	void	set10( char a, char b, char c, char d, char e, char f,
					char g, char h, char i, char j );
	void	set12( char a, char b, char c, char d, char e, char f,
					char g, char h, char i, char j, char k, char l );
	void	setLen( long len );
	void	setBuf( void * buf );
	void	setDir( XferDir direction );
	int		execute( void );
	short	getStatus( void );
	short	getMessage( void );
	void	setTimeout( long newTime );
	OSErr	getErr( void );
	long	getMoved( void );
};

#endif

- ------ file cscsi.cp ------------

#include	"CSCSI.h"
#include	<stdio.h>

CSCSIOp::CSCSIOp( void )
{
	haveInfo = 0;
	timeout = 60L;
}

CSCSIOp::~CSCSIOp( void )
{
}

void	CSCSIOp::keep( int what )
{
	haveInfo = what;
}

void	CSCSIOp::setID( short ID )
{
	targetID = ID;
	haveInfo |= USE_ID;
}

void	CSCSIOp::setCDB( int len, char * cdbPtr )
{
	int		i;
	cdbLen = len;
	for ( i = 0; i < len; i++ )
		cdb[i] = *cdbPtr++;
	haveInfo |= USE_CDB;
}

void	CSCSIOp::set6( char a, char b, char c, char d, char e, char f )
{
	cdbLen = 6;
	cdb[0] = a; cdb[1] = b; cdb[2] = c; cdb[3] = d; cdb[4] = e; cdb[5] = f;
	haveInfo |= USE_CDB;
}

void	CSCSIOp::set10( char a, char b, char c, char d, char e, char f,
				char g, char h, char i, char j )
{
	cdbLen = 10;
	cdb[0] = a; cdb[1] = b; cdb[2] = c; cdb[3] = d; cdb[4] = e; cdb[5] = f;
	cdb[6] = g; cdb[7] = h; cdb[8] = i; cdb[9] = j;
	haveInfo |= USE_CDB;
}

void	CSCSIOp::set12( char a, char b, char c, char d, char e, char f,
				char g, char h, char i, char j, char k, char l )
{
	cdbLen = 12;
	cdb[0] = a; cdb[1] = b; cdb[2] = c; cdb[3] = d; cdb[4] = e; cdb[5] = f;
	cdb[6] = g; cdb[7] = h; cdb[8] = i; cdb[9] = j; cdb[10] = k; cdb[11] = l;
	haveInfo |= USE_CDB;
}

void	CSCSIOp::setLen( long len )
{
	dataLen = len;
	haveInfo |= USE_LEN;
}

void	CSCSIOp::setBuf( void * buf )
{
	dataPtr = (unsigned char *)buf;
	haveInfo |= USE_BUF;
}

void	CSCSIOp::setDir( XferDir direction )
{
	dir = direction;
	haveInfo |= USE_DIR;
}

int		CSCSIOp::execute( void )
{
	SCSIInstr	xfer[3];
	int			info = haveInfo;
	
	haveInfo = 0;
	
	if ( info & USE_DIR )
	{
		if ( dir == noData )
		{
			if ( (info & CAN_NO_DATA) != CAN_NO_DATA )
			{
				return err = SCSI_NEED_INFO;
			}
		}
		else if ( (info & CAN_DATA) != CAN_DATA )
		{
			return err = SCSI_NEED_INFO;
		}
	}
	else
		return err = SCSI_NEED_INFO;
		
	if ( dir != noData )
	{
		//
		// SCSIManager seems to update scParam1 on scInc only if the scInc did
		// not fail.  Thus, if we need to know the exact data count, we need
		// to use a loop, doing on scInc for each byte.
		//
		// If the dataLen is not a multiple of 0x200, we assume the user needs
		// to know the exact amount, and so we loop.  If the dataLen is a multiple
		// of 0x200, we assume it is a read or write to a blocked device, and the
		// user wants efficiency more than an exact byte count.
		//
		if ( dataLen & 0x1ff )
		{
			xfer[0].scOpcode = scInc;
			xfer[0].scParam1 = (unsigned long)dataPtr;
			xfer[0].scParam2 = 1;
			xfer[1].scOpcode = scLoop;
			xfer[1].scParam1 = -10;
			xfer[1].scParam2 = dataLen;
			xfer[2].scOpcode = scStop;
		}
		else
		{
			xfer[0].scOpcode = scInc;
			xfer[0].scParam1 = (unsigned long)dataPtr;
			xfer[0].scParam2 = dataLen;
			xfer[1].scOpcode = scStop;
		}
	}
	
	moved = 0;
	
	err = SCSIGet();
	if ( err )
		return err;
		
	err = SCSISelect( targetID );
	if ( err )
		return err;
		
	err = SCSICmd( (Ptr)cdb, cdbLen );
	if ( err )
	{
		SCSIComplete( &status, &message, 60L );
		return err;
	}
	
	if ( dir == dataIn )
		err = SCSIRead( (Ptr)xfer );
	else if ( dir == dataOut )
		err = SCSIWrite( (Ptr)xfer );
		
	moved = xfer[0].scParam1 - (unsigned long)dataPtr;
	
	if ( err && err != scPhaseErr )
	{
		SCSIComplete( &status, &message, 60L );
		return err;
	}
	
	err = SCSIComplete( &status, &message, timeout );
	
	return err;
}

short	CSCSIOp::getStatus( void )
{
	return status;
}

short	CSCSIOp::getMessage( void )
{
	return message;
}

void	CSCSIOp::setTimeout( long newTime )
{
	timeout = newTime;
}

OSErr	CSCSIOp::getErr( void )
{
	return err;
}

long	CSCSIOp::getMoved( void )
{
	return moved;
}

- ----- excerpt from main.cp ------

uchar	buf[256];

void	main( void )
{
	long	i;
	int		id;
	CSCSIOp	* inq = new CSCSIOp;
	CSCSIOp * cmd = new CSCSIOp;
	CSCSIOp * rew = new CSCSIOp;
	CSCSIOp * load = new CSCSIOp;
	CSCSIOp * sense = new CSCSIOp;
	
	cout << "Tape drive simple test v0.00" << endl;
	
	inq->set6( 18, 0, 0, 0, 255, 0 );
	inq->setBuf( buf );
	inq->setLen( 255 );
	inq->setDir( dataIn );
	
	//
	// Find the tape drive
	//
	for ( id = 0; id < 7; id++ )
	{
		//
		//First, we issue an INQUIRY to see what kind of device it is.
		//
		inq->keep( USE_CDB | USE_DIR | USE_BUF | USE_LEN );
		inq->setID( id );
		inq->execute();
		if ( inq->getErr() )
			continue;
		//
		// Byte 0 of INQUIRY data contains the device type.
		//
		if ( (buf[0] & 0x1f) == 1 )
		{
			//
			// It's a tape drive
			//

- ------------

See that "== 1" in that last if statement?  That's where it's checking
for a tape drive.  Change that to 5 for CD-ROM.  If you really want
to be complete, here are the possible devices:

	0	Direct-access device (disk)
	1	Sequential-access device (tape)
	2	Printer
	3	Processor
	4	Write-once device (some optical disks)
	5	CD-ROM
	6	Scanner
	7	Optical memory (some optical disks)
	8	Medium changer
	9	Communications
	10-11	Graphic Arts Pre-Press devices

--Tim Smith

---------------------------

>From krame893@cs.uidaho.edu (Brian Kramer)
Subject: Lex and Yacc for Mac Programmers
Date: 28 Apr 1994 16:54:36 GMT
Organization: University of Idaho, Moscow, Idaho

As the title implies, I am looking for lex and yacc (or their equivalents)
for using for a Mac-based parser of mine.

If anyone can give an ftp address, or least let me know that they exist,
I would be _extremely_ appreciative!

Brian



=                            =
Brian Kramer
krame893@cs.uidaho.edu
Laboratory for Applied Logic
University of Idaho
Moscow, ID
=                            =

+++++++++++++++++++++++++++

>From neeri@iis.ee.ethz.ch (Matthias Neeracher)
Date: 29 Apr 94 18:07:22
Organization: Integrated Systems Laboratory, ETH, Zurich

In article <2popoc$3hu@owl.csrv.uidaho.edu>, krame893@cs.uidaho.edu (Brian Kramer) writes:

> As the title implies, I am looking for lex and yacc (or their equivalents)
> for using for a Mac-based parser of mine.

Try:

ftp://ftp.switch.ch/software/mac/src/mpw_c/bison-1.22.sit.bin
ftp://ftp.switch.ch/software/mac/src/think_c/Bison-1.18.cpt.bin

ftp://ftp.switch.ch/software/mac/src/mpw_c/MPW_Perl_bYacc_181.sit.bin
ftp://ftp.switch.ch/software/mac/src/think_c/BYacc-1.8.2.cpt

ftp://ftp.switch.ch/software/mac/src/mpw_c/flex-2.3.8.sit.bin
ftp://ftp.switch.ch/software/mac/src/think_c/Flex-2.3.7.cpt.bin

BYacc and Bison are Yacc equivalents. Bison has more faetures, BYacc generates
code without legal restrictions on it. Flex is a lex equivalent.

Matthias

- ---
Matthias Neeracher                                   neeri@iis.ethz.ch
   "Have you heard of the new Cambridge compilers ? They distribute
    gear-wear much more evenly"
        -- William Gibson/Bruce Sterling, _The Difference Engine_


+++++++++++++++++++++++++++

>From krame893@cs.uidaho.edu (Brian Kramer)
Date: 29 Apr 1994 21:59:55 GMT
Organization: University of Idaho, Moscow, Idaho

I have received responses from several people.  I was able to locate
Bison and Yacc (on sumex, umich, among several other places).  Thank
you to those who helped me out.

Brian


: =                            =
: Brian Kramer
: krame893@cs.uidaho.edu
: Laboratory for Applied Logic
: University of Idaho
: Moscow, ID
: =                            =

---------------------------

>From bcorrie@csr.UVic.CA (Brian  Corrie)
Subject: PowerMac FP performance - interesting results????
Date: 26 Apr 94 20:59:59 GMT
Organization: University of Victoria

G'day folks,

I recently got a new toy, a PowerMac 6100 based on the Motorola/IBM/
Apple PowerPC 601 chip. Of course, I was curious how fast it really
was so I have done a bit of benchmarking on my own to see just what
it can do. Some people may have been following the thread about slow
floating point performance using sin/cos over the last week or so. This
little test is similar to that except that it does not use sin/cos.
Here are the results that I have seen thus far.

Timing statistics for a numerically intensive computation: 

The code performs typical 3D shading calculations (as would be found in a 3D
renderer such as a ray tracer or scan-line renderer) a whole bunch of times
in a tight loop. Timings were done on a IBM RS6000 (POWERStation 375) a
SPARC 10, a SPARC 2 GX, a PowerMac 7100 (PowerPC @ 66Mhz), a PowerMac 6100 
(PowerPC @ 60Mhz), a Quadra 840 (68040 @ 40MHz), and a NeXTstation
(68040 @ ??Mhz).

Optimization codes for CodeWarrior are:

Peep == peephole optimization
Glob == global optimization
IS   == instruction shceduling

Machine		   Time (seconds)    Compiler	    Optimization?
=====================================================================
RS6000			4.1		xlC		-O2
RS6000			4.1		xlC		-O
RS6000			4.9		xlC		none
RS6000			5.1		xlC		-g

SPARC 10		4.7		acc		-O2 libm.il
SPARC 10		4.9		acc		-O2
SPARC 10		4.9		acc		-O
SPARC 10		5.6		acc		none
SPARC 10		5.7		acc		-g

SPARC 2GX		11.6		acc		-O2
SPARC 2GX		13.9		acc		none

PowerMac 7100		12		CodeWarrior	some??
PowerMac 6100		16.52		CodeWarrior	Peep
PowerMac 6100		16.56		CodeWarrior	Peep + Glob
PowerMac 6100		16.43		CodeWarrior	Peep + Glob + IS
PowerMac 6100		16.15		CodeWarrior	Peep + Glob + IS
							No extensions

NeXTstation		32.9		gcc		-O2

Quadra 840		34		Symantec	All


So what does this mean??? You got me, but its interesting. A few things
to note with the above numbers. I know a fair bit about how to get as
much floating point grunt out of the SPARC 10 so those numbers might be
a bit lower than they should (especially due to the use of inline functions
for math (libm.il)). The PowerMac numbers I achieved are also worthy of
comment. I don't know much about getting performance out of the Mac. Are
there special libraries to link in that are faster???? Also, the
CodeWarrior compiler I have is a Beta release and Metrowerks (the company
that makes it) states clearly that their optimizations are 
minimal at this time. Thus no matter what optimizations I used, the
time did not change significantly. Also, neither the PM 7100 or the PM 6100
have a Level 2 instruction cache. This is supposed to increase the
performance of the machine quite drastically. Anyone out there at UVic
got a PowerMac 8100 that I can run this test on (the 8100 comes standard
with the Level 2 cache).

What else have I noticed? If you can avoid it, DO NOT use sin/cos/tan
on the PowerMacs, their implementation is terribly slow. A similar
test to the one above results in the PowerMac being slower than the
Quadra 840AV. Strange, but true....

Overall, I am a bit disapointed that the performance wasn't a bit closer
to the SPARC 10 and further from the 68040 based machines. That is what
I would have expected, but that mat be explainable by the 60Mhz clock
on my machine and no Level 2 cache.

Any comments????

	Brian



--
                  Brian Corrie (bcorrie@csr.uvic.ca)
Under the most rigorously controlled conditions of pressure, temperature,
volume, humidity and other variables, the organism will do as it damn well
pleases. Sounds like some of the code I have written......  8-)

+++++++++++++++++++++++++++

>From tmcgrath@netcom10.netcom.com (Timothy McGrath)
Date: Wed, 27 Apr 1994 23:20:27 GMT
Organization: NETCOM On-line services

In article <bcorrie.767393999@tara> bcorrie@csr.UVic.CA (Brian  Corrie) writes:

>Machine		   Time (seconds)    Compiler	    Optimization?
>=====================================================================
>RS6000			4.1		xlC		-O2
>RS6000			4.1		xlC		-O
>RS6000			4.9		xlC		none
>RS6000			5.1		xlC		-g
>
>SPARC 10		4.7		acc		-O2 libm.il
>SPARC 10		4.9		acc		-O2
>SPARC 10		4.9		acc		-O
>SPARC 10		5.6		acc		none
>SPARC 10		5.7		acc		-g
>
>SPARC 2GX		11.6		acc		-O2
>SPARC 2GX		13.9		acc		none
>
>PowerMac 7100		12		CodeWarrior	some??
>PowerMac 6100		16.52		CodeWarrior	Peep
>PowerMac 6100		16.56		CodeWarrior	Peep + Glob
>PowerMac 6100		16.43		CodeWarrior	Peep + Glob + IS
>PowerMac 6100		16.15		CodeWarrior	Peep + Glob + IS
>							No extensions
>
>NeXTstation		32.9		gcc		-O2
>
>Quadra 840		34		Symantec	All
>

These very interesting numeric results are showing surprisingly poor PPC
performance in comparison to Sun and IBM RISC workstations. The results are
at clear odds with published specmarks from IEEE Spectrum a few months ago.

>So what does this mean??? You got me, but its interesting. A few things

This continues a pattern that I've long observed: there seems to be
something about the Mac that produces poor performance using standard
compilers (MPW, Symantic, or CW).  For instance, the deleted figures show
that a 25 MHz 68040 NeXT does the computation faster than the 40Mhz 68040
in the Quadra 840AV.

I compiled POV-Ray, a popular freeware raytracer, on a 25Mhz 68040 unix box
and compared POV-Ray's performance to my own 33Mhz 68040-based Mac
(with cache; Symantec C 6.0). The results for such a floating-point
intensive application: the Unix box won by being 30% faster!! (Worse still,
yer bog $1500 486-66 runs the same app about 50% faster than the Unix box).

I don't know if the problem is poor compiler optimization, poor runtime
libraries, poor performance out of system software, or bottlenecks in the Mac
hardware. I'm about the biggest Mac fan there is, and I'm really unhappy
that my favorite computer is such a performance dog.
-- 
Tim McGrath ----- tmcgrath@netcom.com ----- "Minimalist signaturist"

+++++++++++++++++++++++++++

>From greer@utdallas.edu (Dale M. Greer)
Date: 28 Apr 1994 03:45:38 GMT
Organization: The University of Texas at Dallas

Brian  Corrie (bcorrie@csr.UVic.CA) wrote:
> G'day folks,

> Timing statistics for a numerically intensive computation: 

> The code performs typical 3D shading calculations (as would be found in a 3D
> renderer such as a ray tracer or scan-line renderer) a whole bunch of times
> in a tight loop. Timings were done on a IBM RS6000 (POWERStation 375) a
> SPARC 10, a SPARC 2 GX, a PowerMac 7100 (PowerPC @ 66Mhz), a PowerMac 6100 
> (PowerPC @ 60Mhz), a Quadra 840 (68040 @ 40MHz), and a NeXTstation
> (68040 @ ??Mhz).

> Optimization codes for CodeWarrior are:

> Peep == peephole optimization
> Glob == global optimization
> IS   == instruction shceduling

But are you using SANE on the Mac?

[...]
> What else have I noticed? If you can avoid it, DO NOT use sin/cos/tan
> on the PowerMacs, their implementation is terribly slow. A similar
> test to the one above results in the PowerMac being slower than the
> Quadra 840AV. Strange, but true....

Bummer!  Sounds like SANE.  I once wrote a floating point library for
the 68K that had a sin/cos/tan about 10 times faster than SANE.  The
PowerMac doesn't have to be that slow.  Maybe MetroWerks will tap IBM
for a good algorithm.

--

Dale Greer, greer@utdallas.edu
"They know that it is human nature to take up causes whereby a man may
 oppress his neighbor, no matter how unjustly. ... Hence they have had
 no trouble in finding men who would preach the damnability and heresy
 of the new doctrine from the very pulpit..." - Galileo Galilei, 1615


+++++++++++++++++++++++++++

>From sdoran@cis.ksu.edu (Steven D. Marcotte)
Date: 28 Apr 94 06:29:45 GMT
Organization: Kansas State University

tmcgrath@netcom10.netcom.com (Timothy McGrath) writes:

>In article <bcorrie.767393999@tara> bcorrie@csr.UVic.CA (Brian  Corrie) writes:

>>Machine		   Time (seconds)    Compiler	    Optimization?
>>=====================================================================
>>RS6000			4.1		xlC		-O2
>>RS6000			4.1		xlC		-O
>>RS6000			4.9		xlC		none
>>RS6000			5.1		xlC		-g
>>
>>SPARC 10		4.7		acc		-O2 libm.il
>>SPARC 10		4.9		acc		-O2
>>SPARC 10		4.9		acc		-O
>>SPARC 10		5.6		acc		none
>>SPARC 10		5.7		acc		-g
>>
>>SPARC 2GX		11.6		acc		-O2
>>SPARC 2GX		13.9		acc		none
>>
>>PowerMac 7100		12		CodeWarrior	some??
>>PowerMac 6100		16.52		CodeWarrior	Peep
>>PowerMac 6100		16.56		CodeWarrior	Peep + Glob
>>PowerMac 6100		16.43		CodeWarrior	Peep + Glob + IS
>>PowerMac 6100		16.15		CodeWarrior	Peep + Glob + IS
>>							No extensions
>>
>>NeXTstation		32.9		gcc		-O2
>>
>>Quadra 840		34		Symantec	All
>>

>These very interesting numeric results are showing surprisingly poor PPC
>performance in comparison to Sun and IBM RISC workstations. The results are
>at clear odds with published specmarks from IEEE Spectrum a few months ago.

>>So what does this mean??? You got me, but its interesting. A few things

>This continues a pattern that I've long observed: there seems to be
>something about the Mac that produces poor performance using standard
>compilers (MPW, Symantic, or CW).  For instance, the deleted figures show
>that a 25 MHz 68040 NeXT does the computation faster than the 40Mhz 68040
>in the Quadra 840AV.

	I may be way off here but, with Symantec C++ at least, you can
compile a straight ANSI C program.  If you do, the compiler will
generate a window for you to do I/O with, I assume with an appropriate
event loop.  I would imagine this is where a lot of the slow down is,
waiting for events.  If you are ambitious, try porting your stuff so
don't wait for events until all your calculations are done and see how
that compairs.

Steven

-- 

                                        Steven Marcotte
                                        sdoran@cis.ksu.edu

+++++++++++++++++++++++++++

>From palais@binah.cc.brandeis.edu
Date: Thu, 28 Apr 1994 13:00:21 GMT
Organization: Brandeis University

It seems to be pretty "well-known" that the reason that SANE has
a reputation for being slow is connected mainly with a few
transcendental functions which, to get the guaranteed accuracy
need a lot of computation. Most of the basic routines are in fact
quite fast. Since for most purposes SANE accuracy is overkill,
but SANE is still a better way to go than direct FPU calls 
(for compatibility reasons---particularly with the PowerPC), 
the obvious approach is to re-write these transcendental functions
using lower tolerances. I'm sure this is no big deal---one could
crib the algorithms from Numerical Recipes or IMSL. But just what
are the offending routines? I assume they are sin and cos, but does
anyone really know?

+++++++++++++++++++++++++++

>From bcorrie@csr.UVic.CA (Brian  Corrie)
Date: 28 Apr 94 19:05:36 GMT
Organization: University of Victoria

tmcgrath@netcom10.netcom.com (Timothy McGrath) writes:
>In article <bcorrie.767393999@tara> bcorrie@csr.UVic.CA (Brian  Corrie) writes:

>>Machine		   Time (seconds)    Compiler	    Optimization?
>>=====================================================================
>>RS6000			4.1		xlC		-O2
>>RS6000			4.1		xlC		-O
>>RS6000			4.9		xlC		none
>>RS6000			5.1		xlC		-g
>>
>>SPARC 10		4.7		acc		-O2 libm.il
>>SPARC 10		4.9		acc		-O2
>>SPARC 10		4.9		acc		-O
>>SPARC 10		5.6		acc		none
>>SPARC 10		5.7		acc		-g
>>
>>SPARC 2GX		11.6		acc		-O2
>>SPARC 2GX		13.9		acc		none
>>
>>PowerMac 7100		12		CodeWarrior	some??
>>PowerMac 6100		16.52		CodeWarrior	Peep
>>PowerMac 6100		16.56		CodeWarrior	Peep + Glob
>>PowerMac 6100		16.43		CodeWarrior	Peep + Glob + IS
>>PowerMac 6100		16.15		CodeWarrior	Peep + Glob + IS
>>							No extensions
>>
>>NeXTstation		32.9		gcc		-O2
>>
>>Quadra 840		34		Symantec	All
>>

>These very interesting numeric results are showing surprisingly poor PPC
>performance in comparison to Sun and IBM RISC workstations. The results are
>at clear odds with published specmarks from IEEE Spectrum a few months ago.

The processor used in the IEEE article (I assume you are talking about
"The New Contenders", December 1993) is an 80 MHz 601. I wouldn't be
surprised if it had a cache as well (not clear to me in the table on
page 21). Thus this would be a similar setup to that in the 8100. I haven't
seen a test result from such a machine yet so hopefully it will be better.
It may turn out that with good optimizations (which CodeWarrior does not do),
an 80MHz 601, and a level 2 cache, the PowerMac's might come close to
the SPARC 10 as one would expect/hope. I am not ready to moan about the
performance just yet....  8-)  I will include the code I used below
if anyone with an 8100 wants to try it out....

>>So what does this mean??? You got me, but its interesting. A few things

>This continues a pattern that I've long observed: there seems to be
>something about the Mac that produces poor performance using standard
>compilers (MPW, Symantic, or CW).  For instance, the deleted figures show
>that a 25 MHz 68040 NeXT does the computation faster than the 40Mhz 68040
>in the Quadra 840AV.

Hopefully, the compilers will get better.... the sooner the better.

>I don't know if the problem is poor compiler optimization, poor runtime
>libraries, poor performance out of system software, or bottlenecks in the Mac
>hardware. I'm about the biggest Mac fan there is, and I'm really unhappy
>that my favorite computer is such a performance dog.

I would say a bit of each of the above. As time goes by hopefully the
various groups involved (Apple, Compiler types, etc.) will spend more
time optimizing for the new machines. Libraries will improve over time.
Hopefully the compilers will improve very quickly....

	Brian

======================================================================


/* Note this is the UNIX version of the code. I used TickCount()
   on the Mac to get my timing results.
 */

#include <stdio.h>
#include <math.h>

#define SL_VECDOT( A,B )   ((A)[0]*(B)[0]+(A)[1]*(B)[1]+(A)[2]*(B)[2])
#define SL_VECLEN( A )     (sqrt((A)[0]*(A)[0]+(A)[1]*(A)[1]+(A)[2]*(A)[2]))
#define SL_VECCROSS( A,B,C ) \
    {                     \
         (C)[0] = (A)[1]*(B)[2] - (A)[2]*(B)[1] ; \
         (C)[1] = (A)[2]*(B)[0] - (A)[0]*(B)[2] ; \
         (C)[2] = (A)[0]*(B)[1] - (A)[1]*(B)[0] ; \
    }
#define SL_VECMULT( a,A,B ) \
    {                    \
         (B)[0]=(a)*(A)[0] ; \
         (B)[1]=(a)*(A)[1] ; \
         (B)[2]=(a)*(A)[2] ; \
    }
#define SL_VECDIV( a,A,B ) \
    {                    \
         (B)[0]=(A)[0]/(a) ; \
         (B)[1]=(A)[1]/(a) ; \
         (B)[2]=(A)[2]/(a) ; \
    }

#define SL_VECADD( A,B,C ) \
    {                   \
        (C)[0]=(A)[0]+(B)[0] ; \
        (C)[1]=(A)[1]+(B)[1] ; \
        (C)[2]=(A)[2]+(B)[2] ; \
    }

#define SL_VECADDS( a,A,B,C ) \
    {                      \
         (C)[0] = (a) * (A)[0] + (B)[0] ; \
         (C)[1] = (a) * (A)[1] + (B)[1] ; \
         (C)[2] = (a) * (A)[2] + (B)[2] ; \
    }


main(argc, argv)
  int argc;
  char **argv;
{
  register int i;
  register int MAXI;
  double N[3], L[3], Cl[3], C[3];
  double len, dot;

  N[0] = 1.0;
  N[1] = 2.0;
  N[2] = 3.5;
  L[0] = 1.8;
  L[1] = 0.2;
  L[2] = 1.4;
  Cl[0] = 1.5;
  Cl[1] = -0.2;
  Cl[2] = 1.9;
  C[0] = 0.0;
  C[1] = 0.0;
  C[2] = 0.0;

  if (argc < 2) MAXI = 1000;
  else MAXI = atoi(argv[1]);
  printf("Loop count = %d\n", MAXI);

  for(i=0 ; i<MAXI ; i++)
  {
    len = sqrt(SL_VECDOT(N, N));
    if (len != 0.0) SL_VECDIV(len, N, N);

    len = sqrt(SL_VECDOT(L, L));
    if (len != 0.0) SL_VECDIV(len, L, L);

    dot = SL_VECDOT(N, L);
    if (dot > 0.0) SL_VECADDS(dot, Cl, C, C);

  }
  printf("Color = %g, %g, %g\n", C[0], C[1], C[2]);
}


--
                  Brian Corrie (bcorrie@csr.uvic.ca)
Under the most rigorously controlled conditions of pressure, temperature,
volume, humidity and other variables, the organism will do as it damn well
pleases. Sounds like some of the code I have written......  8-)

+++++++++++++++++++++++++++

>From bcorrie@csr.UVic.CA (Brian  Corrie)
Date: 28 Apr 94 19:20:05 GMT
Organization: University of Victoria

greer@utdallas.edu (Dale M. Greer) writes:

>Brian  Corrie (bcorrie@csr.UVic.CA) wrote:
>> G'day folks,

>> Timing statistics for a numerically intensive computation: 

>> The code performs typical 3D shading calculations (as would be found in a 3D
>> renderer such as a ray tracer or scan-line renderer) a whole bunch of times
>> in a tight loop. Timings were done on a IBM RS6000 (POWERStation 375) a
>> SPARC 10, a SPARC 2 GX, a PowerMac 7100 (PowerPC @ 66Mhz), a PowerMac 6100 
>> (PowerPC @ 60Mhz), a Quadra 840 (68040 @ 40MHz), and a NeXTstation
>> (68040 @ ??Mhz).

>> Optimization codes for CodeWarrior are:

>> Peep == peephole optimization
>> Glob == global optimization
>> IS   == instruction shceduling

>But are you using SANE on the Mac?

Not as far as I know. Just doing multiplies, adds, divisions, and one sqrt
per iteration through the loop. I posted the code in response to another
article in this thread if anyone is interested.

	Brian
--
                  Brian Corrie (bcorrie@csr.uvic.ca)
Under the most rigorously controlled conditions of pressure, temperature,
volume, humidity and other variables, the organism will do as it damn well
pleases. Sounds like some of the code I have written......  8-)

+++++++++++++++++++++++++++

>From nagle@netcom.com (John Nagle)
Date: Thu, 28 Apr 1994 19:19:56 GMT
Organization: NETCOM On-line Communication Services (408 241-9760 guest)

palais@binah.cc.brandeis.edu writes:
>It seems to be pretty "well-known" that the reason that SANE has
>a reputation for being slow is connected mainly with a few
>transcendental functions which, to get the guaranteed accuracy
>need a lot of computation. Most of the basic routines are in fact
>quite fast. Since for most purposes SANE accuracy is overkill,
>but SANE is still a better way to go than direct FPU calls 
>(for compatibility reasons---particularly with the PowerPC), 

      Nah.  You're guaranteed that an FPU is present on PPC, so use it.
Worse, "double" using SANE is 80 bits, and the PPC has only 64-bit
floating point hardware, which makes 80-bit floating point expensive.

      SANE is slow because you spend so much time pushing big floating
point objects on the stack and taking them off the stack.  You lose
a factor of 10 with SANE on 68K macs equipped with FPUs for multiply.

						John Nagle

+++++++++++++++++++++++++++

>From bcorrie@csr.UVic.CA (Brian  Corrie)
Date: 28 Apr 94 23:35:40 GMT
Organization: University of Victoria

sdoran@cis.ksu.edu (Steven D. Marcotte) writes:
>tmcgrath@netcom10.netcom.com (Timothy McGrath) writes:
>>In article <bcorrie.767393999@tara> bcorrie@csr.UVic.CA (Brian  Corrie) writes:
[Bunch of stats deleted]
>>These very interesting numeric results are showing surprisingly poor PPC
>>performance in comparison to Sun and IBM RISC workstations. The results are
>>at clear odds with published specmarks from IEEE Spectrum a few months ago.

>>>So what does this mean??? You got me, but its interesting. A few things

>>This continues a pattern that I've long observed: there seems to be
>>something about the Mac that produces poor performance using standard
>>compilers (MPW, Symantic, or CW).  For instance, the deleted figures show
>>that a 25 MHz 68040 NeXT does the computation faster than the 40Mhz 68040
>>in the Quadra 840AV.

>	I may be way off here but, with Symantec C++ at least, you can
>compile a straight ANSI C program.  If you do, the compiler will
>generate a window for you to do I/O with, I assume with an appropriate
>event loop.  I would imagine this is where a lot of the slow down is,
>waiting for events.  If you are ambitious, try porting your stuff so
>don't wait for events until all your calculations are done and see how
>that compairs.

With CodeWarrior, you get a IO window, but as far as I know there is 
no event loop, the benchmark program is in total control of the machine
(at least it control mine, short of forcing it to quit). I don't
think that is the source of much of the slow down anyway. Of course
I am no expert and may be completely out to lunch 8-)

	Brian
--
                  Brian Corrie (bcorrie@csr.uvic.ca)
Under the most rigorously controlled conditions of pressure, temperature,
volume, humidity and other variables, the organism will do as it damn well
pleases. Sounds like some of the code I have written......  8-)

+++++++++++++++++++++++++++

>From bcorrie@csr.UVic.CA (Brian  Corrie)
Date: 28 Apr 94 23:39:19 GMT
Organization: University of Victoria

palais@binah.cc.brandeis.edu writes:
>It seems to be pretty "well-known" that the reason that SANE has
>a reputation for being slow is connected mainly with a few
>transcendental functions which, to get the guaranteed accuracy
>need a lot of computation. Most of the basic routines are in fact
>quite fast. Since for most purposes SANE accuracy is overkill,
>but SANE is still a better way to go than direct FPU calls 
>(for compatibility reasons---particularly with the PowerPC), 
>the obvious approach is to re-write these transcendental functions
>using lower tolerances. I'm sure this is no big deal---one could
>crib the algorithms from Numerical Recipes or IMSL. But just what
>are the offending routines? I assume they are sin and cos, but does
>anyone really know?

So maybe someone can tell me. If I use CodeWarrior, include the ANSI
library and the MathLibrary, am I using SANE????? I don't think I am,
but I may be wrong!?!?

My experiences thus far show that a computation that uses all sin/cos
calls is HORRIBLY slow on the PowerMacs. Slower even than a Quadra 840.
And yes, that is native PowerMac code. Obviously the sin/cos implementation
is faster on the Quadra. Is it a hardware calculation on the Quadra's
floating point unit, or is it less accurate on the Quadra? You got me,
but I know its slow on the PowerMac!!

	Brian


--
                  Brian Corrie (bcorrie@csr.uvic.ca)
Under the most rigorously controlled conditions of pressure, temperature,
volume, humidity and other variables, the organism will do as it damn well
pleases. Sounds like some of the code I have written......  8-)

+++++++++++++++++++++++++++

>From nagle@netcom.com (John Nagle)
Date: Fri, 29 Apr 1994 02:09:29 GMT
Organization: NETCOM On-line Communication Services (408 241-9760 guest)

bcorrie@csr.UVic.CA (Brian  Corrie) answers the question:
>>But are you using SANE on the Mac?

>Not as far as I know. Just doing multiplies, adds, divisions, and one sqrt
>per iteration through the loop. I posted the code in response to another
>article in this thread if anyone is interested.

      Try using 8-byte doubles and see if things improve.  PPC doesn't have
an 80-bit FPU, so 80-bit performance suffers.  Or try using "float" instead
of "double", which consistently gets you 32-bit floats on all Apple
platforms.

					John Nagle

+++++++++++++++++++++++++++

>From 103t_english@west.cscwc.pima.edu
Date: 29 Apr 94 03:09:48 MST
Organization: (none)

In article <1994Apr28.130021.22832@news.cs.brandeis.edu>, palais@binah.cc.brandeis.edu writes:
> It seems to be pretty "well-known" that the reason that SANE has
> a reputation for being slow is connected mainly with a few
> transcendental functions which, to get the guaranteed accuracy
> need a lot of computation. Most of the basic routines are in fact
> quite fast. Since for most purposes SANE accuracy is overkill,
> but SANE is still a better way to go than direct FPU calls 
> (for compatibility reasons---particularly with the PowerPC), 
> the obvious approach is to re-write these transcendental functions
> using lower tolerances. I'm sure this is no big deal---one could
> crib the algorithms from Numerical Recipes or IMSL. But just what
> are the offending routines? I assume they are sin and cos, but does
> anyone really know?


IF the FPU is present on a 68K Mac, the SANE calls will use it, but only for
arithmetic. All other SANE calls are done using Apple's own libraries (using
the fpu for addition/subtraction/etc).

The overhead from SANE also comes from the fact that it is called via the Trap
Dispatcher, instead of directly, and that translations between the SANE format
and the 68881 format need to be done.


Lawson

+++++++++++++++++++++++++++

>From sparent@mv.us.adobe.com (Sean Parent)
Date: Sat, 30 Apr 1994 00:02:02 GMT
Organization: Adobe Systems Incorporated

This is getting awfully messy. The original discussion was talking about
native floating point performance. Some how the question of SANE came up.
Let me list some info:

¥ On 68K machines w/o an FPU, SANE is a software floating point package
implemented using integer arithmetic and provides 80bit "extended" floating
point support. For most (all) operations, floating point types (whether
double, single, comp, etc.) promote to 80 bit extendes for maximal
accuracy. Hence, using 80 bit extendeds tends to be fastest. SANE is
invoked via an A-Trap but in recent systems SANE back pages the calling
code so the A-Trap overhead is only paid on the first invocation.

¥ On 68K machines w/ an FPU, SANE is still available and is implement using
the FPU for those operations that it can and maintain accuracy. The FPU
(68881/2 or 040) uses 96bit format but 16 bits are unused so converting
>From 80bit to 96 bit format only requires a shift. Applications can be
compiled to call the FPU directly and they can check for it via a call to
Gestalt. On the 040, the transcendental functions are not in the FPU so
those instructions are handled in software as exceptions.

¥ On a Power Mac, running emulated code, there is no emulated FPU so it is
similar to the first case above except SANE is build into the emulator so
it is running "native" (though it still only uses integer math to do the fp
calculations). There is no "Mixed Mode" overhead or A-Trap dispatch
overhead because SANE is handled as any other instructions (there really
isn't any "A-Trap" overhead at all on the Power Mac because the A-Trap
dispatching is handled by the emulator).

¥ On a Power Mac, running a "native" application SANE is not available. You
can't do native 80 or 96bit arithmetic (unless you wan't to implement it
yourself or call some 68K code to do it). Instead, there is a new numerics
package based on the NCEG spec. It support most all of what SANE did
(though a couple of types are missing, like comp) and a bit more. The
supported types are: float (IEEE single), double (IEEE double), and long
double (IBM's "double double" which is 128bits and is IEEE extended
complient).

A portable application should use floats or doubles for persistent data
storage (files), float_t or double_t for fast calculations with precision
and least that of float and double respectively, and long double for
intermediate results that require extra precision. On the various machines,
these types are:

                68K SANE     68K FPU      PowerPC
float           32bit        32bit        32bit
double          64bit        64bit        64bit
float_t         80bit        96bit        32bit
double_t        80bit        96bit        64bit
long double     80bit        96bit       128bit

Now, I haven't looked at this bench mark that is floating around that shows
native PPC applications in such bad light but what could attribute to it is
the compiler (I don't know of a PPC compiler other than xlc that does
really good FP optimizations), and the floating point library. Last I
checked Apple's library was a bit slower than IBM's though it was
considerably more accurate. Someone with some time should compiler the
"bench mark" with xlc and run it on a PowerMac and time the library
routines. I know of no reason why there would be any significant difference
in time between a 66MHz PowerMac and a 66MHz 250 given the same compiler
and the same libraries.

-- 
Sean Parent

+++++++++++++++++++++++++++

>From rang@winternet.mpls.mn.us (Anton Rang)
Date: 29 Apr 1994 23:08:18 GMT
Organization: Minnesota Angsters

In article <bcorrie.767576359@tara> bcorrie@csr.UVic.CA (Brian  Corrie) writes:
>So maybe someone can tell me. If I use CodeWarrior, include the ANSI
>library and the MathLibrary, am I using SANE????? I don't think I am,
>but I may be wrong!?!?

  No, you're not using SANE, unless you're compiling for the 68000.
SANE is only used on the 68000 series.  It's not available on the
Power Macintoshes except in emulation mode.

>My experiences thus far show that a computation that uses all sin/cos
>calls is HORRIBLY slow on the PowerMacs. Slower even than a Quadra 840.

  Right.  The transcendental functions are sloooooow.  I don't know
how much of this is related to supporting the NCEG exception model,
but I suspect an awful lot of is.  (Alternatively, it could be that
range reduction is implemented poorly?)

  After all, to a first approximation, computing a sin requires:

    (i) Range-reduce to (say) 0 to pi/2.
        This may require a division (slow) if you're out of the range
        -pi to +pi, but shouldn't be *that* incredibly slow.

    (ii) Compute a Taylor series (or a more quickly converging one).
         I'm not sure how many terms would be required, not being up
         on state-of-the-art numerical algorithms, but probably not
         more than 5 or so for single precision, perhaps 8-10 for
         double precision.  These should be multiply-add, relatively
         fast.

    (iii) Do a little cleanup depending on the original sign etc.

>Is it a hardware calculation on the Quadra's
>floating point unit, or is it less accurate on the Quadra?

  Neither, as far as I know (not sure about accuracy).  The 68040
doesn't have built-in transcendental functions; they're implemented in
software.  Heck, I've been tempted to disassemble the 68040 FPSP, grab
the appropriate constants, port it to PPC assembly and time the
result.  It would be *bound* to be faster than the current one.

  SOMEONE out there must know the story about why MathLib runs so
slowly.  Is it the exception handling?  There are a bunch of procedure
calls in it related to that, and handling all of the boundaries right
undoubtedly requires a lot of work...sigh.  Wish I knew for sure.
--
Anton Rang (rang@winternet.mpls.mn.us)

+++++++++++++++++++++++++++

>From jwbaxter@olympus.net (John W. Baxter)
Date: Sun, 01 May 1994 10:32:08 -0700
Organization: Internet for the Olympic Peninsula

In article <TMCGRATH.94Apr27162028@netcom10.netcom.com>,
tmcgrath@netcom10.netcom.com (Timothy McGrath) wrote:

[Table of results omitted...it's been quoted many times already.]
> 
> These very interesting numeric results are showing surprisingly poor PPC
> performance in comparison to Sun and IBM RISC workstations. The results are
> at clear odds with published specmarks from IEEE Spectrum a few months ago.
> 
No...take a look at the improvements for the 6100 as additional
optimizations are added.  Notice that essentially there aren't any
improvements.

What is being compared is optimized code (I suspect, but don't have access
to the compilers on the other systems compared) versus essentially
unoptimized code.  With the added complication that different hardware is
running the optimized code.


> >So what does this mean???

It means that CodeWarrior isn't finished.  There are easier ways to learn
this astounding fact, such as by looking at the version number.

****Someone who has the means:
    Could we run the code in question through the xlc compiler, move it to
the Mac, and time it?

    [Given the code, I could now do that for the MPW compiler, which is
said to lie between xlc and CodeWarrior in current quality...closer to the
former.]
-- 
John Baxter    Port Ludlow, WA, USA  [West shore, Puget Sound]
   jwbaxter@pt.olympus.net

+++++++++++++++++++++++++++

>From John Brewer <jbrewer@wri.com>
Date: Tue, 3 May 1994 03:11:15 GMT
Organization: Wolfram Research, Inc.

In article <bcorrie.767393999@tara> Brian  Corrie, bcorrie@csr.UVic.CA writes:
>The code performs typical 3D shading calculations (as would be found in a 3D
>renderer such as a ray tracer or scan-line renderer) a whole bunch of times
>in a tight loop. Timings were done on a IBM RS6000 (POWERStation 375) a
>SPARC 10, a SPARC 2 GX, a PowerMac 7100 (PowerPC @ 66Mhz), a PowerMac 6100 
>(PowerPC @ 60Mhz), a Quadra 840 (68040 @ 40MHz), and a NeXTstation
>(68040 @ ??Mhz).

It'd be interresting to try using xlc to generate the PowerMac code.
It seems to be the best at optimization, although it can easily take up to
100 Mb of swap space to compile a large program.

John Brewer
Wolfram Research, Inc.
(but speaking for myself)

+++++++++++++++++++++++++++

>From uzun@crash.cts.com (Roger Uzun)
Date: Tue, 3 May 1994 17:03:00 GMT
Organization: CTS Network Services (CTSNET/crash), San Diego, CA

I have this 3D shading code, the tight loop benchmark that
was circulating around here, but I do not know how
many loops were performed to get the results that
were posted was it 1,000,000?
The default is 1000 and this executes in less than a second
on all machines around here (040, pentiums, no macs).
How many iterations were used in the running of this benchmark?
Also could someone repost any results people came up with.

-Roger
- ------------------------------------------------------------
bix: ruzun
NET: uzun@crash.cts.com

+++++++++++++++++++++++++++

>From bcorrie@csr.UVic.CA (Brian  Corrie)
Date: 3 May 94 23:47:51 GMT
Organization: University of Victoria

uzun@crash.cts.com (Roger Uzun) writes:
>I have this 3D shading code, the tight loop benchmark that
>was circulating around here, but I do not know how
>many loops were performed to get the results that
>were posted was it 1,000,000?
>The default is 1000 and this executes in less than a second
>on all machines around here (040, pentiums, no macs).
>How many iterations were used in the running of this benchmark?
>Also could someone repost any results people came up with.

Oppps, Sorry about that. Yes, 1,000,000 is the correct magic
number to produce the same results that I got. Please post any
results that you get....

Cheers,

	Brian

--
                  Brian Corrie (bcorrie@csr.uvic.ca)
Under the most rigorously controlled conditions of pressure, temperature,
volume, humidity and other variables, the organism will do as it damn well
pleases. Sounds like some of the code I have written......  8-)

+++++++++++++++++++++++++++

>From oliver@psy.fsu.edu (Bill Oliver)
Date: 4 May 1994 14:14:33 GMT
Organization: FSU Psych Dept

In article <bcorrie.768008871@tara>
bcorrie@csr.UVic.CA (Brian  Corrie) writes:

> uzun@crash.cts.com (Roger Uzun) writes:
> >I have this 3D shading code, the tight loop benchmark that
> >was circulating around here, but I do not know how
> >many loops were performed to get the results that
> >were posted was it 1,000,000?
> >The default is 1000 and this executes in less than a second
> >on all machines around here (040, pentiums, no macs).
> >How many iterations were used in the running of this benchmark?
> >Also could someone repost any results people came up with.
> 
> Oppps, Sorry about that. Yes, 1,000,000 is the correct magic
> number to produce the same results that I got. Please post any
> results that you get....
> 
> Cheers,
> 
>         Brian



Your code is taking approximately 35 seconds to run on my Centris
660AV. The compiler I'm using is Metrowerks CW C (68020&6881 Codegen, 4
Byte Ints, Peephole & CSE optimizers). I'm quite happy with this result
given the other times that were posted (I'm reposting those below). I
think I'll wait on the PowerMac :-)

-Bill-

>>Machine                 Time (seconds)    Compiler       Optimization?
>>=====================================================================
>>RS6000                4.1             xlC             -O2
>>RS6000                4.1             xlC             -O
>>RS6000                4.9             xlC             none
>>RS6000                5.1             xlC             -g
>>
>>SPARC 10             4.7             acc             -O2 libm.il
>>SPARC 10             4.9             acc             -O2
>>SPARC 10             4.9             acc             -O
>>SPARC 10             5.6             acc             none
>>SPARC 10             5.7             acc             -g
>>
>>SPARC 2GX            11.6            acc             -O2
>>SPARC 2GX            13.9            acc             none
>>
>>PowerMac 7100                12              CodeWarrior     some??
>>PowerMac 6100                16.52           CodeWarrior     Peep
>>PowerMac 6100                16.56           CodeWarrior     Peep + Glob
>>PowerMac 6100                16.43           CodeWarrior     Peep + Glob 
+ IS
>>PowerMac 6100                16.15           CodeWarrior     Peep + Glob 
+ IS
>>                                                      No extensions
>>
>>NeXTstation          32.9            gcc             -O2
>>
>>Quadra 840           34              SymantecAll

+++++++++++++++++++++++++++

>From Dave Falkenburg <falken@apple.com>
Date: Fri, 29 Apr 1994 08:00:16 GMT
Organization: Apple Computer, Inc.

In article <TMCGRATH.94Apr27162028@netcom10.netcom.com> Timothy McGrath,
tmcgrath@netcom10.netcom.com writes:
>I compiled POV-Ray, a popular freeware raytracer, on a 25Mhz 68040 unix
box
>and compared POV-Ray's performance to my own 33Mhz 68040-based Mac
>(with cache; Symantec C 6.0). The results for such a floating-point
>intensive application: the Unix box won by being 30% faster!! (Worse
still,
>yer bog $1500 486-66 runs the same app about 50% faster than the Unix
box).

Are you running the version that calls SetCPixel for every pixel to be
rendered?
My brother recompiled POV a couple of months ago and got barn-burning
performance out of it.

The Mac-specific stuff in the version you have might be a complete dog.

>I don't know if the problem is poor compiler optimization, poor runtime
>libraries, poor performance out of system software, or bottlenecks in
the Mac
>hardware. I'm about the biggest Mac fan there is, and I'm really unhappy
>that my favorite computer is such a performance dog.

Remember that CW isn't final yet AND this version will not be as good as
xlc on AIX, or PPCC in the PowerMac SDK.

One big hog is mathlib--> the AIX libm.a is MUCH faster than one in ROM
Apple is shipping today-- it's hand tuned code for calculating sin, cos,
etc.


If I were a developer, I'd scream at the top of my lungs at the WWDC
about this...


-Dave Falkenburg
-Not speaking for "Apple Computer, Inc." in this posting

---------------------------

>From rcohen@ssl.umd.edu (Rob Cohen)
Subject: Saving the floating Point Registers
Date: 26 Apr 1994 20:43:17 GMT
Organization: Space Systems Laboratory, University of Maryland

I've written an interrupt service routine that when called does some
floating point math.  There is also a lot of floating point math that
goes on in the rest of the code.  Unfortunately, my code crashes when
I'm running the ISR in places that do math.  I think the problem is
that I'm not preserving the values in the floating point registers.  I
think I want to push them on the stack when I enter the ISR, do what I
have to do and then pop them off.  My question then becomes how do you
do this.  I know the locations of the floating point register,
FP0...FP7, but what does the assembler look like to do this.

Thanks

- -----------------------------------------------------------------
Rob Cohen              rcohen@ssl.umd.edu

The views expressed here are my own Blah, blah, blah, blah (The
standard disclaimer)

+++++++++++++++++++++++++++

>From Ron_Hunsinger@bmug.org (Ron Hunsinger)
Date: Sun,  1 May 94 23:38:47 PST
Organization: Berkeley Macintosh Users Group

rcohen@ssl.umd.edu (Rob Cohen) writes:

>I've written an interrupt service routine that when called does some
>floating point math.  There is also a lot of floating point math that
>goes on in the rest of the code.  Unfortunately, my code crashes when
>I'm running the ISR in places that do math.  I think the problem is
>that I'm not preserving the values in the floating point registers.  I
>think I want to push them on the stack when I enter the ISR, do what I
>have to do and then pop them off.  My question then becomes how do you
>do this.  I know the locations of the floating point register,
>FP0...FP7, but what does the assembler look like to do this.

It's not just the registers that have to be saved.  You have to save
the state of the FPU also, since you could have interrupted it in the
middle of an operation.  In general, you have to:

    FSAVE    <ea>                   ; save the non-visible state
    FMOVEM.L FPCR/FPSR/FPIAR, <ea>  ; save the control registers
    FMOVEM.X FP0-FP7, <ea>          ; save the data registers

    ; establish the environment you want to run in
    ;          (rounding rules, traps, etc) because the task you
    ;          interrupted may have changed them.  A quick way to
    ;          reset the fpu is to do an FRESTORE from a longword
    ;          containing $00000000, but this clears ALL the registers
    ;          so you can't have skimped on any of the above register-
    ;          saving.

    ; do your work

    FMOVEM.X <ea>, FP0-FP7          ; restore the data registers
    FMOVEM.L <ea>, FPCR/FPSR/FPIAR  ; restore the control registers
    FRESTORE <ea>                   ; restore the non-visible state

All of this saving and restoring is not guaranteed to be cheap, which 
is why it wasn't done automatically for you.

-Ron Hunsinger

---------------------------

>From Daniel Jibouleau <jiboule@hermes.ulaval.ca>
Subject: The NewWindow case
Date: Thu, 28 Apr 1994 23:19:08 GMT
Organization: UniversitŽ Laval

For a long time now, i am still asking myself whether it is better to
call NewWindow (or GetNewWindow) with a storage or to let it allocate
it's storage itself.  Note that both ways may be correct.  Consider the
following example:

NewWindow with a storage:

{
    WindowPtr theWindow;
    WindowRecord windStorage;
    
    /* Use a pointer to our storage to store the window associated
information.  It will be stored on the stack, thus reducing heap
fragmentation. */
    theWindow = GetNewWindow (&windStorage, fooWindID, (WindowPtr) -1L);
}

NewWindow without storage:

{
    WindowPtr theWindow;
    
    /* Let the Window Manager allocate the storage for the window itself.
 It will be placed on the heap, thus increasing chances of heap
fragmentation.  The Window Manager may be doing this in a better way,
tough. */
    theWindow = GetNewWindow (nil, fooWindID, (WindowPtr) -1L);
}


Daniel Jibouleau
jiboule@hermes.ulaval.ca

+++++++++++++++++++++++++++

>From rmah@panix.com (Robert S. Mah)
Date: Fri, 29 Apr 1994 10:16:54 -0500
Organization: One Step Beyond

Daniel Jibouleau <jiboule@hermes.ulaval.ca> wrote:

> For a long time now, i am still asking myself whether it is better to
> call NewWindow (or GetNewWindow) with a storage or to let it allocate
> it's storage itself.  Note that both ways may be correct.  Consider the
> following example:
> 
> NewWindow with a storage:
> 
> {
>     WindowPtr theWindow;
>     WindowRecord windStorage;
>     
>     /* Use a pointer to our storage to store the window associated
> information.  It will be stored on the stack, thus reducing heap
> fragmentation. */
>     theWindow = GetNewWindow (&windStorage, fooWindID, (WindowPtr) -1L);
> }
> 
> NewWindow without storage:
> 
> {
>     WindowPtr theWindow;
>     
>     /* Let the Window Manager allocate the storage for the window itself.
>  It will be placed on the heap, thus increasing chances of heap
> fragmentation.  The Window Manager may be doing this in a better way,
> tough. */
>     theWindow = GetNewWindow (nil, fooWindID, (WindowPtr) -1L);
> }

The first example is very, very dangerous.  Since the storage is a local
variable, and allocated on the stack, it goes away after the function
is exited.  This is fine if that function is main(), but not the other
way around.  Better to use a global (or static) if you care about heap
fragging.

My rule of thumb is to use static/global (stack based) allocation for
window storage only if the app only uses a small, fairly constant set 
of windows.  For apps with user-created documents, static allocation
is not such a good thing because it would limit the # of docs the user
could open.

Cheers,
Rob
___________________________________________________________________________
Robert S. Mah  -=-  One Step Beyond  -=-  212-947-6507  -=-  rmah@panix.com

+++++++++++++++++++++++++++

>From dean@genmagic.com (Dean Yu)
Date: 29 Apr 1994 17:57:56 GMT
Organization: General Magic, Inc.

In article <Cozsrx.6Kp@athena.ulaval.ca>, Daniel Jibouleau
<jiboule@hermes.ulaval.ca> wrote:
> For a long time now, i am still asking myself whether it is better to
> call NewWindow (or GetNewWindow) with a storage or to let it allocate
> it's storage itself.  Note that both ways may be correct.  Consider the
> following example:

  Although allocating the storage space for the window record yourself
might help your memory management now, it might be a hindrance in the
future. If Apple ever goes to a protected memory model, it would almost
definitely be better if the toolbox would be able to allocate its data
structures in another address space and pass you a reference to that data
structure. If everyone specified nil as the wStorage parameter now, it
would be much much simpler for a future Window Manager to change while
still maintaining API compatibility. But because storage can be allocated
by the application, it makes moving forward while still maintaining
compatibility much more difficult.
  I've gone on tirades about this topic before; it was something I really
wanted to do at Apple, but never had the time for. :/

-- Dean Yu
   Negative Ethnic Role Model
   General Magic, Inc.

---------------------------

>From ereidell@media.mit.edu (Evan A. Reidell)
Subject: Truetype font format specification: No longer available from Apple ?!
Date: Mon, 25 Apr 1994 19:57:29 GMT
Organization: MIT Media Laboratory

I have been having a hell of a time trying to find 
the Apple TrueType font format specification.

Luckily, this is _theoretically_ available
as "Apple Finished Goods" product number:
M0825 LL/A ``TrueType font format specification''

Unluckily, no one at ALL seems to know anything about it.

I've been bounced around between Catalog Sales, Apple Authorized Dealers,
AP.D.A, Apple Customer Assistance, and Apple R&D groups so many times
that I'm beginning to wonder if the TrueType font format even exists.

Is it worth the grief??  Or is Adobe PostScript the way to go,
no matter how Apple and Microsoft would like to play their games?

Can anyone out there help me get my hands on this "document" ?

-- evan reidell

+++++++++++++++++++++++++++

>From s66039@cc.ntnu.edu.tw (Riboflavin)
Date: Tue, 26 Apr 1994 09:54:40 GMT
Organization: NTNU, Taiwan, R.O.C.

Evan A. Reidell (ereidell@media.mit.edu) wrote:
: I have been having a hell of a time trying to find 
: the Apple TrueType font format specification.
: Unluckily, no one at ALL seems to know anything about it.
: I've been bounced around between Catalog Sales, Apple Authorized Dealers,
: AP.D.A, Apple Customer Assistance, and Apple R&D groups so many times
: that I'm beginning to wonder if the TrueType font format even exists.
: Is it worth the grief??  Or is Adobe PostScript the way to go,
: no matter how Apple and Microsoft would like to play their games?

I don't know, I had an heck of a time getting a particular document from
Adobe a while back, but they finally came through. As for the TrueType spec.,
forget Apple. Instead, ftp to ftp.microsoft.com and look for it - it's there!
Only catch is it comes either as a Windows help file, or as a PC Word 2.0 
file, the latter of which you should be able to load into your Mac version
of Word.

-Steven Fox-


+++++++++++++++++++++++++++

>From tkr@puffball.demon.co.uk (Tim Rylance)
Date: Tue, 26 Apr 1994 11:45:10 +0000
Organization: Tim Rylance, Bath, UK

s66039@cc.ntnu.edu.tw (Riboflavin) writes:

>I don't know, I had an heck of a time getting a particular document from
>Adobe a while back, but they finally came through. As for the TrueType spec.,
>forget Apple. Instead, ftp to ftp.microsoft.com and look for it - it's there!
>Only catch is it comes either as a Windows help file, or as a PC Word 2.0 
>file, the latter of which you should be able to load into your Mac version
>of Word.

There's a Postscript version at

  ftp.icce.rug.nl:pub/erikjan/truetype/ttspec/*.ps

--
Tim Rylance <tkr@puffball.demon.co.uk>

+++++++++++++++++++++++++++

>From vens007@telecom.ptt.nl (Erik-Jan Vens,HD,)
Date: 26 Apr 1994 11:53:04 +0200
Organization: PTT Telecom B.V. The Netherlands

dixit ereidell@media.mit.edu (Evan A. Reidell) in <1994Apr25.195729.2855@news.media.mit.edu>:
>I have been having a hell of a time trying to find 
>the Apple TrueType font format specification.
>
>Luckily, this is _theoretically_ available
>as "Apple Finished Goods" product number:
>M0825 LL/A ``TrueType font format specification''

Supposedly the TrueType format should be the same for DOS and Apple.
Maybe you should try ftp.icce.rug.nl in pub/erikjan/truetype/ttspec. I
have converted the MS version to Postscript.

EJee

-- 
- -----------------------------------------------------------------------------
Erik-Jan Vens 			| Telephone: +31 50 855994
PTT Telecom BV			| Telefax  : +31 50 855777
I&AT				| E-mail   : vens007@telecom.ptt.nl
P.O. Box 188			| DISCLAIMER: This statement is not an official
NL-9700 AD Groningen		| statement from, nor does it represent an
The Netherlands			| official position of, PTT Telecom B.V.
- -----------------------------------------------------------------------------

+++++++++++++++++++++++++++

>From pan@vaxc.cc.monash.edu.au (Pan Thongvilu)
Date: 27 Apr 1994 02:34:50 GMT
Organization: Monash University

In article <1994Apr26.095440.19400@cc.ntnu.edu.tw>, s66039@cc.ntnu.edu.tw (Riboflavin) writes:
|> Evan A. Reidell (ereidell@media.mit.edu) wrote:
|> : I have been having a hell of a time trying to find 
|> : the Apple TrueType font format specification.
|> : Unluckily, no one at ALL seems to know anything about it.
|> : I've been bounced around between Catalog Sales, Apple Authorized Dealers,
|> : AP.D.A, Apple Customer Assistance, and Apple R&D groups so many times
|> : that I'm beginning to wonder if the TrueType font format even exists.
|> : Is it worth the grief??  Or is Adobe PostScript the way to go,
|> : no matter how Apple and Microsoft would like to play their games?
|> 
|> I don't know, I had an heck of a time getting a particular document from
|> Adobe a while back, but they finally came through. As for the TrueType spec.,
|> forget Apple. Instead, ftp to ftp.microsoft.com and look for it - it's there!
|> Only catch is it comes either as a Windows help file, or as a PC Word 2.0 
|> file, the latter of which you should be able to load into your Mac version
|> of Word.
|> 
|> -Steven Fox-
|> 
	Hi,

	I went to ftp.microsoft.com a couple of times. I looked and looked
	but could not find it. 

	Can someone tell us where to find it on the tree and what it is 
	called so I can do an 'archie -c' on it.

	Thanks,
	Pan.

+++++++++++++++++++++++++++

>From dmunsil@netcom.com (Don Munsil)
Date: Wed, 27 Apr 1994 16:48:08 GMT
Organization: The Munsil/Stone Organization

Pan Thongvilu (pan@vaxc.cc.monash.edu.au) wrote:
: In article <1994Apr26.095440.19400@cc.ntnu.edu.tw>, s66039@cc.ntnu.edu.tw (Riboflavin) writes:
: |> Evan A. Reidell (ereidell@media.mit.edu) wrote:
: |> : I have been having a hell of a time trying to find 
: |> : the Apple TrueType font format specification.

: 	I went to ftp.microsoft.com a couple of times. I looked and looked
: 	but could not find it. 

It's in about the most un-intuitive place imaginable -- I believe it's 

/developer/drg/Truetype-Info

There are a lot of documents in there. Beware! The Word for Windows 
document is not as up-to-date as the most recent printed version. The 
WinHelp file appears to be about the same as the printed version. There 
are problems and errors in the 1.00 version, so be careful.

--Don
-- 
- ----------------------------------------------------
Don Munsil          | I respect faith, but doubt is
dmunsil@netcom.com  | what gets you an education.
don@elseware.com    |                 -- Wilson Mizner

+++++++++++++++++++++++++++

>From zune@lysator.liu.se (Andreas Magnusson)
Date: 29 Apr 1994 10:42:13 GMT
Organization: (none)

dmunsil@netcom.com (Don Munsil) writes:

>Pan Thongvilu (pan@vaxc.cc.monash.edu.au) wrote:

>It's in about the most un-intuitive place imaginable -- I believe it's 

>/developer/drg/Truetype-Info

>There are a lot of documents in there. Beware! The Word for Windows 
>document is not as up-to-date as the most recent printed version. The 
>WinHelp file appears to be about the same as the printed version. There 
>are problems and errors in the 1.00 version, so be careful.

>--Don
>-- 
>------------------------------------------------------
>Don Munsil          | I respect faith, but doubt is
>dmunsil@netcom.com  | what gets you an education.
>don@elseware.com    |                 -- Wilson Mizner

While we're at it, can somebody tell me if the Apple docs are better, or 
at least more readable than the Microsoft docs.
It's a personal taste, but I can't for my life understand the MS-docs. 
All there are is a listing of all the instructions, and how they supposedly
work, but no examples or tips or tricks. It's a shame since the Adobe
docs for Type 1 (which isn't as complex, I know) is full of examples that
enables me to fully decode, understand and even hand code changes in a font.
Especially since they say that it's meant to put the intelligence in the
font instead of in the rasterizer.

Is there any examples at all available for TrueType? 

Bye
/Andreas
--
| Andreas Magnusson                  || Vet ni varf|r datavetare {r s}      |
| Linkoping Institute of Technology  || smarta? Jo, de LISTAR ut allt!      |
| c89andma@odalix.ida.liu.se         ||      Karin Willborg, C89 LiTH       |
| zune@nanny.lysator.liu.se          ||(This is in Swedish, it's a bad joke)|

---------------------------

End of C.S.M.P. Digest
**********************