home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d1xx
/
d128
/
prtdriver.lha
/
PrtDriver
/
debug.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-01-02
|
4KB
|
167 lines
/* DEBUGGING-- This is Matt Dillon's debugger code,
* which is *real* handy when you're paranoid about what
* you can and can't do because of your task/process state
*
* It's even better than kprintf :-)
*/
#include <exec/types.h>
#include <exec/nodes.h>
#include <exec/lists.h>
#include <exec/memory.h>
#include <devices/printer.h>
#include <devices/prtbase.h>
#ifndef DEBUG
dbprintf() {} /* empty function declaration */
#else
#define CTOB(x) (void *)(((long)(x))>>2)
struct Task *FindTask();
struct MsgPort *CreatePort();
struct FileHandle *Open();
struct Message *GetMsg();
struct MsgPort *Dbport; /* owned by the debug process */
struct MsgPort *Dback; /* owned by the DOS device driver */
short DBDisable;
struct Message DummyMsg;
void dbstart()
{
DBDisable = 0;
Dbport = Dback = NULL;
/* need DosBase and SysBase to use debugger */
/* DEBUGGING */
dbinit(); /* to close off debugger call dbuninit() */
}
/*
* DEBUGGING CODE. You cannot make DOS library calls that access other
* devices from within a DOS device driver because they use the same
* message port as the driver. If you need to make such calls you must
* create a port and construct the DOS messages yourself. I do not
* do this. To get debugging info out another PROCESS is created to which
* debugging messages can be sent.
*
* You want the priority of the debug process to be larger than the
* priority of your DOS handler. This is so if your DOS handler crashes
* you have a better idea of where it died from the debugging messages
* (remember that the two processes are asyncronous from each other).
*/
extern void debugproc();
dbinit()
{
struct Task *task = FindTask(NULL);
Dback = CreatePort(NULL,NULL);
CreateProc("DEV_DB", task->tc_Node.ln_Pri+1, CTOB(debugproc), 4096);
WaitPort(Dback); /* handshake startup */
GetMsg(Dback); /* remove dummy msg */
dbprintf("Debugger running V1.00\n");
}
dbuninit()
{
struct Message killmsg;
if (Dbport) {
killmsg.mn_Length = 0; /* 0 means die */
PutMsg(Dbport,&killmsg);
WaitPort(Dback); /* He's dead jim! */
GetMsg(Dback);
DeletePort(Dback);
/*
* Since the debug process is running at a greater priority, I
* am pretty sure that it is guarenteed to be completely removed
* before this task gets control again. Still, it doesn't hurt...
*/
/* Delay(50); */ /* ensure he's dead */
}
}
dbprintf(a,b,c,d,e,f,g,h,i,j)
{
static char buf[256];
struct Message *msg;
if (Dbport && !DBDisable) {
sprintf(buf,a,b,c,d,e,f,g,h,i,j);
msg = AllocMem(sizeof(struct Message)+strlen(buf)+1,
MEMF_PUBLIC|MEMF_CLEAR);
msg->mn_Length = strlen(buf)+1; /* Length NEVER 0 */
strcpy(msg+1,buf);
PutMsg(Dbport,msg);
}
}
/*
* BTW, the DOS library used by debugmain() was actually openned by
* the _Init routine. Note: DummyMsg cannot be on debugmain()'s stack
* since debugmain() goes away on the final handshake.
*/
debugmain()
{
struct Message *msg;
short len;
void *fh;
Dbport = CreatePort(NULL,NULL);
fh = Open("con:0/0/640/100/debugwindow", 1006);
PutMsg(Dback, &DummyMsg);
for (;;) {
WaitPort(Dbport);
msg = GetMsg(Dbport);
len = msg->mn_Length;
if (len == 0)
break;
--len; /* Fix length up */
Write(fh, msg+1, len);
FreeMem(msg,sizeof(struct Message)+len+1);
}
Close(fh);
DeletePort(Dbport);
PutMsg(Dback,&DummyMsg); /* Kill handshake */
}
/*
* The assembly tag for the DOS process: CNOP causes alignment problems
* with the Aztec assembler for some reason. I assume then, that the
* alignment is unknown. Since the BCPL conversion basically zero's the
* lower two bits of the address the actual code may start anywhere
* within 8 bytes of address (remember the first longword is a segment
* pointer and skipped). Sigh.... (see CreatProc() above).
*/
#asm
public _debugproc
public _debugmain
cseg
_debugproc:
nop
nop
nop
nop
nop
movem.l D2-D7/A2-A6,-(sp)
jsr _debugmain
movem.l (sp)+,D2-D7/A2-A6
rts
#endasm
#endif