Article View: comp.sys.atari.st
Article #32314Re: Bomb list
From: Leo de Wit
Date: Tue, 03 May 1988 11:21
Date: Tue, 03 May 1988 11:21
92 lines
3309 bytes
3309 bytes
Having recieved a few enthousiastic reactions for the Bomb detector program,
here is it. You can run it afterwards whenever a bombing has taken place.
The main pre is that it does not have to be resident and that it is an
ordinary C program (what is ordinary C? :=).
The program is called LASTERR and compiles succesfull on a Lattice-C compiler,
so note that int == 4 bytes, and short == 2 bytes!
It could be cleaned up a bit, replacing the 'magic numbers' by macro's etc.
It is mainly self-explainatory; the data referenced (addresses 0x380 etc.)
have already been filled in by the standard error routine (the one that also
throws bombs).
------------------------------- CUT HERE --------------------------------------
/* lasterr.c: report last occured error and stack dump.
* Copyright L.J.M. de Wit, 1988.
* This source and the generated code may be freely distributed, if not used
* commercially.
*/
#define PEEKB(a) (*(unsigned char *)(a))
#define PEEKW(a) (*(unsigned short *)(a))
#define PEEKL(a) (*(unsigned long *)(a))
main()
{
int ssp, i;
ssp = gemdos(0x20,0); /* switch to supervisor mode, save stack pointer */
if (PEEKL(0x380) != 0x12345678) { /* magic marker */
printf("No error occured since last reset\n");
} else {
static char *errmsg[] = {
"Reset", "Reset",
"Bus error",
"Address error",
"Illegal instruction",
"Division by zero",
"CHK",
"TRAPV",
"Privilege violation",
"Trace"
};
short excepno, offset;
excepno = PEEKB(0x3c4);
offset = ((excepno == 2) || (excepno == 3)) ? 8 : 0;
printf("Exception no. %d (%s)\n",excepno,
(excepno >= sizeof(errmsg)/sizeof(errmsg[0]))
? "Unassigned" : errmsg[excepno]);
for (i = 0; i < 8; i++) {
printf(D%d : %8x\tA%d : %8x\n",
i, PEEKL(0x384 + 4 * i), i, PEEKL(0x3a4 + 4 * i));
}
printf(PC : %8x\tUSP: %8x\nSR : %8x\n",
PEEKL(0x3ce + offset), PEEKL(0x3c8), PEEKW(0x3cc + offset));
if (offset == 8) { /* exceptions 2 and 3 */
short status = PEEKW(0x3cc);
static char *accmode[] = {
"unassigned",
"user mode data reference",
"user mode program reference",
"unassigned",
"unassigned",
"supervisor mode data reference",
"supervisor mode program reference",
"interrupt acknowledge"
};
printf("\nRead/Write : %s\n",
(status & 16) ? "read" : "write");
printf("In-/Extern : %s\n",
(status & 8) ? "extern" : "intern");
printf("Access mode : %s\n",accmode[status & 7]);
printf("Address : %8x\n", PEEKL(0x3ce));
printf("Instruction : %8x\n", PEEKW(0x3d2));
}
}
gemdos(0x20,ssp);
}
------------------------------- CUT HERE --------------------------------------
I hope no errors have crept into the source while I was typing it over; but
then, you could use this program to see what bomb was produced ( :=)).
Have fun!
leo. (What you C is what you get).
Technical Details
Message-ID:
<477@philmds.UUCP>Path:
arc1-ca.pugleaf.net!utzoo!mnetor!uunet!mcvax!philmds!leoReferences:
<2905@saturn.ucsc.edu> <1773@netmbx.UUCP>Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!mnetor!uunet!mcvax!philmds!leo From: leo@philmds.UUCP (Leo de Wit) Newsgroups: comp.sys.atari.st Subject: Re: Bomb list Message-ID: <477@philmds.UUCP> Date: 3 May 88 11:21:48 GMT References: <2905@saturn.ucsc.edu> <1773@netmbx.UUCP> Reply-To: leo@philmds.UUCP (L.J.M. de Wit) Organization: Philips I&E DTS Eindhoven Lines: 92