[net.micro.atari] ERROR MESSAGES AND HIPPO-C

terrell@OHIO-STATE.CSNET (Eric Terrell) (12/04/85)

Does anyone know what to do about the "out of registers" error message
in the HIPPO-C compiler?

Also, is it possible to start up with the original disk and then change
to a copy of the disk?  With my single-drive system I am currently
unable to use the compiler unless I use the original disk (yuk!)

Thanks,

Eric Terrell

oconnor@umd5.UUCP (12/07/85)

The "out of registers" error is a result of poor compiler design.
When generating subroutine calls the Hippo C compiler generates code that
moves each argument into a data register before moving it onto the
stack.  Unfortunately it does not reuse the data register, so that when you
have a call with more arguments than available registers the compiler will
halt with the error "out of registers".  Of the 8 data registers in the
68K only six can be used this way (a Hippo issue, not hardware).  So a call to
the VDI routine "v_ellpie()" which has 7 arguments will not compile (even
though it is "supported" by Hippo).

	For example, if a  program contained the following subroutine call:

	v_ellpie( handle, x, y, xradius, yradius, begang, endang ) ;

where all the arguments are automatic variables contained in "main",
the Hippo compiler generates the following assembly language:

	move.w	-200(a6),d2
	ext.l	d2
	move.w	-198(a6),d3
	ext.l	d3
	move.w	-196(a6),d4
	ext.l	d4
	move.w	-194(a6),d5
	ext.l	d5
	move.w	-192(a6),d6
	ext.l	d6
	move.w	-190(a6),d7
	
whereupon it would halt with the "out of registers" error message.  If there
were enough registers, it would have continued with:

	ext.l	d7
	move.w	-188(a6),d8
	ext.l	d8
	move.l	d2,-(sp)
	move.l	d3,-(sp)
	move.l	d4,-(sp)
	move.l	d5,-(sp)
	move.l	d6,-(sp)
	move.l	d7,-(sp)
	move.l	d8,-(sp)
	jsr	_v_ellpie

	Because of this and their copy-protection I do not recommend this
compiler to anyone.
			Mike O'Connor
			oconnor@umd5.arpa
			oconnor@umd5.UUCP

tim@ISM780C.UUCP (Tim Smith) (12/10/85)

In article <8512061148.AA25696@ucbvax.berkeley.edu> terrell@OHIO-STATE.CSNET (Eric Terrell) writes:
>
>Also, is it possible to start up with the original disk and then change
>to a copy of the disk?  With my single-drive system I am currently
>unable to use the compiler unless I use the original disk (yuk!)
>

I haven't seen Hippo-C on the ST, but if it is like the Mac version, then
I believe only the linker checks the copy protection.  So you will have to
use the original disk every time you link.  But you should be able to use
the compiler from a copy of the original disk.  This is still "yuk!", but
at least it's not as bad a "yuk!".

Also, call Hippo and see if they will sell you an unprotected disk.  They
were doing that for the Mac ( it was $25 for the unprotected disk ).

Can the ST handle single sided disks?  If it can, it would be interesting
to see if a bit copier on the Mac, like Copy II Mac, could duplicate
Atari disks on a Mac.  Copy II can handle Hippo-C on the Mac, so maybe
it would work for the ST?  ( or do they have Copy II ST yet? )
-- 
Tim Smith       sdcrdcf!ism780c!tim || ima!ism780!tim || ihnp4!cithep!tim
			  ^
			  ^-- Not ISM780C, ignore the header!

jenkin@utai.UUCP (Michael Jenkin) (12/10/85)

In article <8512061148.AA25696@ucbvax.berkeley.edu> terrell@OHIO-STATE.CSNET (Eric Terrell) writes:
>Does anyone know what to do about the "out of registers" error message
>in the HIPPO-C compiler?
>
Yes.  It will occur whenever a subroutine call requires too many
registers to hold all the intermediate results before putting them
on the stack.  Someone's register reclemation algorithm could
use a little fine tuning.  In particular, constructs like

	a = foo(bar[i].left, bar[i].right, ... );

will get the error.  However, it can be recoded as

	t1 = bar[i].left;
	t2 = bar[i].right;
	...
	a = foo(t1, t2, ... );

What a hack eh?
>Also, is it possible to start up with the original disk and then change
>to a copy of the disk?  With my single-drive system I am currently
>unable to use the compiler unless I use the original disk (yuk!)
Oh yes.. There is documentation on how to do this supplied with the
compiler, but..

	(a) initialize a new disk
	(b) copy everything but hos.tos to this new disk. DO NOT
	    USE A SECTOR COPY.
	(c) To run, boot on HOS.TOS on the supplied disk, eject it
	    and insert your copy.  You should do a 'ls' to get the
	    new disk directory information set up properly.

NOTE: If you have a one drive system, go an borrow a 2 drive one for
step (b).  There are 40 or so files that have to be copied, 3 disk
swaps per file = 120 disk swaps.

They suggest that you do not use a sector copy.  I would assume that
their protection mechanism either (i) will cause the sector copy to
abort, or (ii) foul up the protection on their disk.
-- 
--
Michael Jenkin					University of Toronto
USENET:	{decvax,ihnp4,allegra}!utcsri!utai!jenkin
CSNET:	jenkin@Toronto 
BELL: 	416-978-7321