Path: utzoo!mnetor!uunet!cbmvax!vu-vlsi!hvrunix!ahinds
From: ahinds@hvrunix.UUCP (Alexander Hinds)
Newsgroups: comp.sys.atari.st
Subject: Re: Bomb list
Message-ID: <424@hvrunix.UUCP>
Date: 7 May 88 19:55:18 GMT
References: <2905@saturn.ucsc.edu> <1773@netmbx.UUCP> <477@philmds.UUCP> <12463@tut.cis.ohio-state.edu>
Organization: Haverford College, Haverford, PA
Lines: 84
Summary: Yes, it can be done

In article <12463@tut.cis.ohio-state.edu>, weaver@tut.cis.ohio-state.edu (Andrew Weaver) writes:
> 
> 	Here is a question I don't think I have ever heard hashed around
> on here before.  Is there a way to intercept the 'bombs' that come onto
> the screen with some sort of dialog like on the Mac:  "Sorry,
> a system error has occureed [Restart|Resume]" or on the Amiga: "System
> Error:  Guru Meditiation xxx:xxxxxxx [Continue]" so that one can better
> diagnose problems with one's own (or someone else's) program?  It seems
> to me that having a number of non-descript cherry bombs (or mushroom clouds,
> which I am told appeared on earlier STs) is not a very good way of represent-
> ing an error, but I guess that's just me.
> 
> -- 
> Andrew Weaver 				          weaver@tut.cis.ohio-state.edu
> Soon to be a 'Zip' at the University of Akron    ...ihnp4!cbosgd!osu-cis!weaver

	What follows is somewhat long and technical in nature...


	Well, I hacked up something in 'C' on my Amiga, similar to what you're
attempting.  I didn't like my machine going down on things like divide by
zero, opcode A emulation, and things like that.  So, I wrote a little (
actually not that little) that runs in the background to catch cpu traps like
those mentioned above.  I don't know if you'll be able to do it, since
you don't have a multitasking environment.  Maybe a desk top accessory?

	I'm not too familiar with the ST, so I can tell you what I did on my
Amiga as generically as possible, and maybe you can go from there.  This
discussion presumes some knowledge of 68000 assembly and 'C'.

	O.k.  What I did was get a list of the 68000 trap vectors, and I
reset them to point to my code.  It went something like this:

void	(*ptr());	/*For a pointer to a function that returns void.
			I actually just used an unsigned long*/

void	MyTrapCode()

{

	/*Stuff.  See below*/
}

main()
{ 
	ptr = 0000014;		/*Some thing like this for divide by zero.
				I don't have my source in front of me right
				now!*/
	*ptr = &MyTrapCode;

}

	Voila!  Now any program that would divide by zero executed my 
function!  Unfortunately, where you want to go from there can get very
tricky indeed.  For me, I didn't want the machine to pop up a task failed
requester and crash.         
	Do accomplish that, (This is greatly simplified, but communicates the
essence of what I did), MyTrapCode() looked like:

void	MyTrapCode()
{
	#asm			/*This will differ for your compiler!*/
		move	-(sp),d2/d4
		unlk	a5;
	#endasm
	/*The above lines undo the default startup code for a function*/
	#asm
		/*Here's where I removed all the things pushed onto the stack
		because of a trap*/
	#endasm
	Wait(-1);	/*Stupid, but effective.  Task was held until
			I pressed ctrl-c in it's window*/
}

	I know this was kind of general, but if you use your imagination, I
think you can take it from there.  You can learn alot about your compiler and
machine in so doing.  There are alot of subtelties to watch out for, some I
didn't really discuss.  So, be careful, and happy hacking! 
	Well, I hope this helps.  If you have any specific questions, I'd
be glad to try and help you out.  Just send me mail...


Alexander Hinds
ahinds@hvrford