mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 16:34:07 +00:00
Upload
Digital Research
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
/****************************************************************************/
|
||||
/* */
|
||||
/* S i g n a l F u n c t i o n */
|
||||
/* ----------------------------- */
|
||||
/* */
|
||||
/* The "signal" function allows a routine in C to catch a 68000 */
|
||||
/* interrupt, and service it with a C function. */
|
||||
/* */
|
||||
/* Calling Sequence: */
|
||||
/* */
|
||||
/* ret = signal(sig,func); */
|
||||
/* */
|
||||
/* Where: */
|
||||
/* ret Is always 0 under CP/M. */
|
||||
/* sig Is the UNIX signal number */
|
||||
/* func -> the function to service the exception */
|
||||
/* */
|
||||
/****************************************************************************/
|
||||
#include <stdio.h> /* Include standard stuff */
|
||||
#include <signal.h> /* Include definitions */
|
||||
#include <osif.h> /* Include BDOS Functions */
|
||||
/****************************/
|
||||
EXTERN WORD *_illinst(); /* -> Illegal instruction ep*/
|
||||
EXTERN WORD *_trace(); /* -> Trace trap epa */
|
||||
EXTERN WORD *_trap(); /* -> TRAP instruction epa */
|
||||
EXTERN WORD *_buserr(); /* -> BUSERR epa */
|
||||
EXTERN WORD *_arith(); /* -> Arithmetic traps epa */
|
||||
EXTERN BYTE *__signal[NSIG]; /* Holds user func addresses*/
|
||||
/* */
|
||||
LONG signal(sig,func) /****************************/
|
||||
REG DEFAULT sig; /* Signal number */
|
||||
REG DEFAULT (*func)(); /* Function address */
|
||||
{ /* */
|
||||
REG WORD i; /* Temp */
|
||||
/* */
|
||||
if(sig >= NSIG || sig < 0) /* Too big? */
|
||||
return(BADSIG); /* Yes, return UNIX NFG code*/
|
||||
/****************************/
|
||||
__signal[sig] = func; /* Save the function addr */
|
||||
/* */
|
||||
switch(sig) /* Do signal processing */
|
||||
{ /* */
|
||||
case SIGILL: /* Illegal instruction */
|
||||
_setvec( 4,&_illinst); /* Set vector #4 */
|
||||
_setvec( 8,&_illinst); /* Privilege violation */
|
||||
_setvec(10,&_illinst); /* Set vector #10 (line A) */
|
||||
_setvec(11,&_illinst); /* Set vector #11 (line F) */
|
||||
break; /****************************/
|
||||
/* */
|
||||
case SIGTRAP: /* Trace trap */
|
||||
_setvec(9,&_trace); /* Set vector #9 */
|
||||
break; /****************************/
|
||||
/* */
|
||||
case SIGIOT: /* Bad TRAP instruction */
|
||||
_setvec(32,&_trap); /* Trap 0 */
|
||||
for(i=35; i<48; i++) /* Traps 4 - 15 */
|
||||
_setvec(i,&_trap); /* */
|
||||
break; /****************************/
|
||||
/* */
|
||||
case SIGBUS: /* BUSERR PDP-11 trap 4 & 10*/
|
||||
_setvec(2,&_buserr); /* Set nxm vector */
|
||||
_setvec(3,&_buserr); /* Set addressing vector */
|
||||
break; /****************************/
|
||||
/* */
|
||||
case SIGFPE: /* Arithmetic section */
|
||||
for(i=5; i<8; i++) /* Set all misc vectors */
|
||||
_setvec(i,&_arith); /* */
|
||||
break; /****************************/
|
||||
/* */
|
||||
} /* */
|
||||
return(0L); /* Return OK */
|
||||
} /****************************/
|
||||
|
||||
VOID _setvec(vector,func) /****************************/
|
||||
WORD vector; /* Vector # */
|
||||
BYTE *func; /* Function address */
|
||||
{ /****************************/
|
||||
struct { /* A CP/M EPB structure */
|
||||
WORD vec; /* Vector number */
|
||||
BYTE *userepa; /* User's epa */
|
||||
BYTE *bdosepa; /* BDOS's epa */
|
||||
} epb; /****************************/
|
||||
epb.vec = vector; /* Set up vector */
|
||||
epb.userepa = func; /* and function */
|
||||
epb.bdosepa = 0L; /* Clear return word */
|
||||
__BDOS(SETVEC,&epb); /* Do it. */
|
||||
} /****************************/
|
||||
Reference in New Issue
Block a user