Annotation of researchv10no/cmd/spitbol/cint/sigs.c, revision 1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.