V10/cmd/spitbol/sigs.c
#define I_ADDF2 0x40
#define I_ADDF3 0x41
#define I_DIVF2 0x46
#define I_DIVF3 0x47
#define I_MULF2 0x44
#define I_MULF3 0x45
#define I_SUBF2 0x42
#define I_SUBF3 0x43
#define PC 15
#include <signal.h>
void setsigs();
static void
ovfltrap (signo, param, xx, pc, psl)
unsigned char *pc;
{
register int operands = 2;
register unsigned char *rpc = pc;
setsigs(); /* trap overflow again */
psl |= 02; /* set the overflow bit */
/* Adjust the PC if this is an op code we know about */
switch (*rpc) {
case I_ADDF3:
case I_SUBF3:
case I_MULF3:
case I_DIVF3:
operands++;
case I_ADDF2:
case I_SUBF2:
case I_MULF2:
case I_DIVF2:
rpc++;
do {
/* Fetch and step past the first operand byte */
register int mode = (*rpc & 0xf0) >> 4;
register int reg = *rpc++ & 0xf;
switch (mode) {
case 0: /* literal */
case 1: /* literal */
case 2: /* literal */
case 3: /* literal */
break;
case 4: /* [reg] */
operands++;
break;
case 5: /* reg */
case 6: /* (reg) */
case 7: /* -(reg) */
break;
case 8: /* (reg)+ */
if (reg == PC)
rpc += sizeof (float);
break;
case 9: /* autoincrement deferred or absolute */
if (reg == PC)
rpc += 4;
break;
case 10: /* byte displacement */
case 11: /* byte displacement deferred */
rpc++;
break;
case 12: /* word displacement */
case 13: /* word displacement deferred */
rpc += 2;
break;
case 14: /* longword displacement */
case 15: /* longword displacement deferred */
rpc += 4;
break;
}
} while (--operands);
}
pc = rpc;
}
void
setsigs()
{
signal (SIGFPE, ovfltrap);
}