|
|
1.1 root 1:
2: #define I_ADDF2 0x40
3: #define I_ADDF3 0x41
4: #define I_DIVF2 0x46
5: #define I_DIVF3 0x47
6: #define I_MULF2 0x44
7: #define I_MULF3 0x45
8: #define I_SUBF2 0x42
9: #define I_SUBF3 0x43
10:
11: #define PC 15
12:
13: #include <signal.h>
14:
15: void setsigs();
16:
17: static void
18: ovfltrap (signo, param, xx, pc, psl)
19: unsigned char *pc;
20: {
21: register int operands = 2;
22: register unsigned char *rpc = pc;
23:
24: setsigs(); /* trap overflow again */
25: psl |= 02; /* set the overflow bit */
26:
27: /* Adjust the PC if this is an op code we know about */
28: switch (*rpc) {
29:
30: case I_ADDF3:
31: case I_SUBF3:
32: case I_MULF3:
33: case I_DIVF3:
34: operands++;
35:
36: case I_ADDF2:
37: case I_SUBF2:
38: case I_MULF2:
39: case I_DIVF2:
40:
41: rpc++;
42:
43: do {
44:
45: /* Fetch and step past the first operand byte */
46: register int mode = (*rpc & 0xf0) >> 4;
47: register int reg = *rpc++ & 0xf;
48:
49: switch (mode) {
50:
51: case 0: /* literal */
52: case 1: /* literal */
53: case 2: /* literal */
54: case 3: /* literal */
55: break;
56:
57: case 4: /* [reg] */
58: operands++;
59: break;
60:
61: case 5: /* reg */
62: case 6: /* (reg) */
63: case 7: /* -(reg) */
64: break;
65:
66: case 8: /* (reg)+ */
67: if (reg == PC)
68: rpc += sizeof (float);
69: break;
70:
71: case 9: /* autoincrement deferred or absolute */
72:
73: if (reg == PC)
74: rpc += 4;
75: break;
76:
77: case 10: /* byte displacement */
78: case 11: /* byte displacement deferred */
79: rpc++;
80: break;
81:
82: case 12: /* word displacement */
83: case 13: /* word displacement deferred */
84: rpc += 2;
85: break;
86:
87: case 14: /* longword displacement */
88: case 15: /* longword displacement deferred */
89: rpc += 4;
90: break;
91: }
92: } while (--operands);
93:
94: }
95: pc = rpc;
96: }
97:
98: void
99: setsigs()
100: {
101: signal (SIGFPE, ovfltrap);
102: }
103:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.