V10/cmd/spitbol/sigs.c

Compare this file to the similar file:
Show the results in this format:

#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);
}