home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
OSK
/
EFFO
/
forum16.lzh
/
SOFTWARE
/
ASSEMBLER
/
EXCEPT_HANDLER
/
dmplib.c
next >
Wrap
Text File
|
1991-01-09
|
3KB
|
190 lines
/* 1990-Nov-05 : changed _mkdata_module permissions to 557 (from 555) DFK */
#include <module.h>
#include <errno.h>
#include <stdio.h>
#define MODSIZE sizeof (struct dump)
#define REGWORDS 8
#define STKWORDS 32
struct dump
{
int valid;
int errno;
int pc;
int offset;
int d [REGWORDS];
int a [REGWORDS];
int stk [STKWORDS];
};
static struct dump *dtaptr;
static mod_exec *modptr;
void outpc (),
outreg (),
outstk (),
bname (); /* this is tricky: I want a reference from pc */
dmp_link (name)
char *name;
{
char modname [20];
mod_exec *modlink ();
void *_mkdata_module ();
if (!dtaptr)
{
if (name == NULL)
name = (void*)bname;
strncpy (modname, name, 15);
strcat (modname, ".dmp");
modptr = modlink (modname,(MT_DATA << 8)+ML_ANY);
if (modptr == (void*)-1)
{
register struct dump *d;
_mkdata_module (modname, MODSIZE, 0xc000, 0x557);
modptr = modlink (modname,(MT_DATA << 8)+ML_ANY);
d = (void*)((char*)modptr + modptr->_mexec);
d->valid = 0;
}
if (modptr != (void*)-1)
dtaptr = (void*)((char*)modptr + modptr->_mexec);
}
}
dmp_unlink ()
{
munlink (modptr);
}
dmp_stderr ()
{
if (dtaptr)
{
register struct dump *d = dtaptr;
if (d->valid)
{
outpc (d->errno, d->pc, d->offset);
outreg (d->d);
outstk (d->stk, d->valid);
}
}
}
dmp_pc (errno, pc, offpc)
int errno,
pc,
offpc;
{
register struct dump *d = dtaptr;
outpc (errno, pc, offpc);
if (d)
{
d->errno = errno;
d->pc = pc;
d->offset = offpc;
}
}
dmp_reg (reg)
register int *reg;
{
register int i;
register struct dump *d = dtaptr;
outreg (reg);
if (d)
{
for (i = 0; i < REGWORDS; i++, reg++)
d->d[i] = *reg;
for (i = 0; i < REGWORDS; i++, reg++)
d->a[i] = *reg;
}
}
dmp_stk (stk)
register int *stk;
{
register int i;
register struct dump *d = dtaptr;
outstk (stk, STKWORDS);
if (d)
{
d->valid = STKWORDS;
for (i = 0; i < STKWORDS; i++, stk++)
d->stk[i] = *stk;
}
}
static void outpc (errno, pc, offpc)
int errno,
pc,
offpc;
{
register char *out;
switch (errno)
{
case E_BUSERR:
out = "Bus Error at : %08X\n";
break;
case E_ADRERR:
out = "Address Error at : %08X\n";
break;
case E_ILLINS:
out = "Illegal Instr. at : %08X\n";
break;
case E_ZERDIV:
out = "Divide by Zero at : %08X\n";
break;
case E_1010:
out = "1010 Exception at : %08X\n";
break;
case E_1111:
out = "1111 Exception at : %08X\n";
break;
}
fprintf (stderr, out, pc);
fprintf (stderr, "offset from main () : %08X\n", offpc);
}
static void outreg (reg)
register int *reg;
{
register int i;
fprintf (stderr, "d0-7:");
for (i = 0; i < REGWORDS; i++, reg++)
fprintf (stderr, " %08X", *reg);
fprintf (stderr, "\na0-7:");
for (i = 0; i < REGWORDS; i++, reg++)
fprintf (stderr, " %08X", *reg);
fprintf (stderr, "\n");
}
static void outstk (stk, n)
register int *stk;
register int n;
{
register int i;
fprintf (stderr, ".sp :");
for (i = 0; i < n; i++, stk++)
{
fprintf (stderr, " %08X", *stk);
if (i % 8 == 7)
fprintf (stderr, "\n ");
}
fprintf (stderr, "\n");
fflush (stderr);
}