Annotation of 43BSD/games/compat/dofloat.c, revision 1.1

1.1     ! root        1: #ifndef        lint
        !             2: static char sccsid[] = "       dofloat.c       4.2     84/05/05        ";
        !             3: #endif
        !             4: 
        !             5: /* From Lou Salkind: compat/RCS/dofloat.c,v 1.2 84/01/31 13:33:53 */
        !             6: 
        !             7: /*
        !             8:  * Partial PDP-11 floating-point simulator.  Always in double mode,
        !             9:  * chop mode.  All arithmetic done in double-precision. Storing longs
        !            10:  * into or taking longs from general registers doesn't work.
        !            11:  * Overflow is never detected.
        !            12:  */
        !            13: 
        !            14: #include <stdio.h>
        !            15: #include "defs.h"
        !            16: 
        !            17: #define TRUE 1
        !            18: #define FALSE 0
        !            19: 
        !            20: #define ABSD   0170600
        !            21: #define ADDD   0172000
        !            22: #define CFCC   0170000
        !            23: #define CLRD   0170400
        !            24: #define CMPD   0173400
        !            25: #define DIVD   0174400
        !            26: #define LDCFD  0177400
        !            27: #define LDCLD  0177000
        !            28: #define LDD    0172400
        !            29: #define LDEXP  0176400
        !            30: #define MODD   0171400
        !            31: #define MULD   0171000
        !            32: #define NEGD   0170700
        !            33: #define SETD   0170011
        !            34: #define SETI   0170002
        !            35: #define SETL   0170012
        !            36: #define STCDL  0175400
        !            37: #define STCDF  0176000
        !            38: #define STD    0174000
        !            39: #define STEXP  0175000
        !            40: #define SUBD   0173000
        !            41: #define TSTD   0170500
        !            42: 
        !            43: static struct {
        !            44:        unsigned fc :1;
        !            45:        unsigned fv :1;
        !            46:        unsigned fz :1;
        !            47:        unsigned fn :1;
        !            48:        unsigned fmm :1;
        !            49:        unsigned ft :1;
        !            50:        unsigned fl :1;
        !            51:        unsigned fd :1;
        !            52: } fps = FALSE;
        !            53: 
        !            54: #define FZ fps.fz
        !            55: #define FN fps.fn
        !            56: #define FL fps.fl
        !            57: #define FD fps.fd
        !            58: 
        !            59: #define LMODE FL
        !            60: #define IMODE (!LMODE)
        !            61: 
        !            62: static double fregs[6];
        !            63: 
        !            64: dofloat(instr)
        !            65: unsigned int instr;
        !            66: {
        !            67:        int mode, reg, ac;
        !            68:        unsigned short * x, * resolve();
        !            69: #define DOUBLE (*((double *)x))
        !            70: #define FLOAT (*(float *)x)
        !            71: #define LONG (*(long *)x)
        !            72: #define SHORT (*(short *)x)
        !            73: #define GETDOUBLE (x = resolve(mode, reg, 8, TRUE))
        !            74: #define GETFLOAT (x = resolve(mode, reg, 4, TRUE))
        !            75: #define GETLONG (x = resolve(mode, reg, 4, FALSE))
        !            76: #define GETSHORT (x = resolve(mode, reg, 2, FALSE))
        !            77: #define FREG fregs[ac]
        !            78:        double temp;
        !            79:        union {
        !            80:                double d;
        !            81:                short s;
        !            82:        } bits;
        !            83: 
        !            84:        switch (instr & 0170000) {
        !            85:        case 0170000:
        !            86:                break;
        !            87:        default:
        !            88:                fprintf(stderr, "Unrecognized instr in dofloat %0o\n", instr);
        !            89:                return (-1);
        !            90:        }
        !            91: 
        !            92:        switch (instr & 07000) {
        !            93:        case 0:
        !            94:                switch (instr & 0700) {
        !            95:                case 0:
        !            96:                        switch (instr) {
        !            97:                        case CFCC:
        !            98:                                psl &= ~017;
        !            99:                                if (FN) {
        !           100:                                        psl |= 010;
        !           101:                                }
        !           102:                                if (FZ) {
        !           103:                                        psl |= 04;
        !           104:                                }
        !           105:                                return (0);
        !           106:                        case SETD:
        !           107:                                FD = TRUE;
        !           108:                                return (0);
        !           109:                        case SETI:
        !           110:                                FL = FALSE;
        !           111:                                return (0);
        !           112:                        case SETL:
        !           113:                                FL = TRUE;
        !           114:                                return (0);
        !           115:                        default:
        !           116:                                fprintf(stderr, "Unrecognized instr in dofloat %0o\n", instr);
        !           117:                                return (-1);
        !           118:                        }
        !           119:                default:
        !           120:                        break;
        !           121:                }
        !           122: 
        !           123:                mode = (instr & 070) >> 3;
        !           124:                reg = instr & 07;
        !           125: 
        !           126:                switch (instr & 0177700) {
        !           127:                case ABSD:
        !           128:                        GETDOUBLE;
        !           129:                        if (DOUBLE < 0.0) {
        !           130:                                DOUBLE = -DOUBLE;
        !           131:                        }
        !           132:                        FZ = (DOUBLE == 0.0);
        !           133:                        FN = (DOUBLE < 0.0);
        !           134:                        return (0);
        !           135:                case CLRD:
        !           136:                        GETDOUBLE;
        !           137:                        DOUBLE = 0.0;
        !           138:                        FZ = TRUE;
        !           139:                        FN = FALSE;
        !           140:                        return (0);
        !           141:                case NEGD:
        !           142:                        GETDOUBLE;
        !           143:                        DOUBLE = -DOUBLE;
        !           144:                        FZ = (DOUBLE == 0.0);
        !           145:                        FN = (DOUBLE < 0.0);
        !           146:                        return (0);
        !           147:                case TSTD:
        !           148:                        GETDOUBLE;
        !           149:                        FZ = (DOUBLE == 0.0);
        !           150:                        FN = (DOUBLE < 0.0);
        !           151:                        return (0);
        !           152:                default:
        !           153:                        fprintf(stderr, "Unrecognized instr in dofloat %0o\n", instr);
        !           154:                        return (-1);
        !           155:                }
        !           156:        default:
        !           157:                break;
        !           158:        }
        !           159: 
        !           160:        ac = (instr & 0300) >> 6;
        !           161:        mode = (instr & 070) >> 3;
        !           162:        reg = instr & 07;
        !           163: 
        !           164:        switch (instr & 0177400) {
        !           165:        case ADDD:
        !           166:                GETDOUBLE;
        !           167:                FREG += DOUBLE;
        !           168:                FZ = (FREG == 0.0);
        !           169:                FN = (FREG < 0.0);
        !           170:                return (0);
        !           171:        case CMPD:
        !           172:                GETDOUBLE;
        !           173:                FZ = (DOUBLE == FREG);
        !           174:                FN = (DOUBLE < FREG);
        !           175:                return (0);
        !           176:        case DIVD:
        !           177:                GETDOUBLE;
        !           178:                FREG /= DOUBLE;
        !           179:                FZ = (FREG == 0.0);
        !           180:                FN = (FREG < 0.0);
        !           181:                return (0);
        !           182:        case LDCFD:
        !           183:                GETFLOAT;
        !           184:                FREG = FLOAT;
        !           185:                FZ = (FREG == 0.0);
        !           186:                FN = (FREG < 0.0);
        !           187:                return (0);
        !           188:        case LDCLD:
        !           189:                if (IMODE) {
        !           190:                        GETSHORT;
        !           191:                        FREG = SHORT;
        !           192:                } else {
        !           193:                        GETLONG;
        !           194:                        FREG = fliplong(LONG);
        !           195:                }
        !           196:                FZ = (FREG == 0.0);
        !           197:                FN = (FREG < 0.0);
        !           198:                return (0);
        !           199:        case LDD:
        !           200:                GETDOUBLE;
        !           201:                FREG = DOUBLE;
        !           202:                FZ = (FREG == 0.0);
        !           203:                FN = (FREG < 0.0);
        !           204:                return (0);
        !           205:        case LDEXP:
        !           206:                GETSHORT;
        !           207:                bits.d = FREG;
        !           208:                bits.s &= ~077600;
        !           209:                bits.s |= (SHORT + 0200) << 7;
        !           210:                FREG = bits.d;
        !           211:                FZ = (SHORT == 0);
        !           212:                FN = (FREG < 0.0);
        !           213:                return (0);
        !           214:        case MODD:
        !           215:                GETDOUBLE;
        !           216:                temp = FREG * DOUBLE;
        !           217:                fregs[ac|1] = (long) temp;
        !           218:                FREG = temp - (long) temp;
        !           219:                FZ = (FREG == 0.0);
        !           220:                FN = (FREG < 0.0);
        !           221:                return (0);
        !           222:        case MULD:
        !           223:                GETDOUBLE;
        !           224:                FREG = FREG * DOUBLE;
        !           225:                FZ = (FREG == 0.0);
        !           226:                FN = (FREG < 0.0);
        !           227:                return (0);
        !           228:        case STCDF:
        !           229:                GETFLOAT;
        !           230:                FLOAT = FREG;
        !           231:                FZ = (FREG == 0.0);
        !           232:                FN = (FREG < 0.0);
        !           233:                return (0);
        !           234:        case STCDL:
        !           235:                if (IMODE) {
        !           236:                        GETSHORT;
        !           237:                        SHORT = FREG;
        !           238:                        psl &= ~017;
        !           239:                        if (SHORT == 0) {
        !           240:                                psl |= 04;
        !           241:                        }
        !           242:                        if (SHORT < 0) {
        !           243:                                psl |= 010;
        !           244:                        }
        !           245:                } else {
        !           246:                        GETLONG;
        !           247:                        LONG = fliplong((long) FREG);
        !           248:                        psl &= ~017;
        !           249:                        if (fliplong(LONG) == 0) {
        !           250:                                psl |= 04;
        !           251:                        }
        !           252:                        if (fliplong(LONG) < 0) {
        !           253:                                psl |= 010;
        !           254:                        }
        !           255:                }
        !           256:                FZ = (FREG == 0.0);
        !           257:                FN = (FREG < 0.0);
        !           258:                return (0);
        !           259:        case STD:
        !           260:                GETDOUBLE;
        !           261:                DOUBLE = FREG;
        !           262:                return (0);
        !           263:        case STEXP:
        !           264:                GETSHORT;
        !           265:                bits.d = FREG;
        !           266:                SHORT = ((bits.s & 077600) >> 7) - 0200;
        !           267:                FZ = (SHORT == 0);
        !           268:                FN = (SHORT < 0);
        !           269:                psl &= ~017;
        !           270:                if (FZ) {
        !           271:                        psl |= 04;
        !           272:                }
        !           273:                if (FN) {
        !           274:                        psl |= 010;
        !           275:                }
        !           276:                return (0);
        !           277:        case SUBD:
        !           278:                GETDOUBLE;
        !           279:                FREG -= DOUBLE;
        !           280:                FZ = (FREG == 0.0);
        !           281:                FN = (FREG < 0.0);
        !           282:                return (0);
        !           283:        default:
        !           284:                fprintf(stderr, "Unrecognized instr in dofloat %0o\n", instr);
        !           285:                return (-1);
        !           286:        }
        !           287: }
        !           288: 
        !           289: unsigned short *
        !           290: resolve(mode, reg, bytes, floating)
        !           291: {
        !           292:        static unsigned short *x;
        !           293:        static union {
        !           294:                double d;
        !           295:                unsigned short s;
        !           296:        } bits;
        !           297: 
        !           298:        switch (mode) {
        !           299:        case 0:
        !           300:                if (floating) {
        !           301:                        if (bytes != 8) {
        !           302:                                fprintf(stderr, "Bad length in dofloat\n");
        !           303:                                return ((unsigned short *) -1);
        !           304:                        }
        !           305:                        x = (unsigned short *) &fregs[reg];
        !           306:                } else {
        !           307:                        if (bytes != 2) {
        !           308:                                fprintf(stderr, "Bad length in dofloat\n");
        !           309:                                return ((unsigned short *) -1);
        !           310:                        }
        !           311:                        x = (unsigned short *) &regs[reg];
        !           312:                }
        !           313:                break;
        !           314:        case 1:
        !           315:                x = (unsigned short *) regs[reg];
        !           316:                break;
        !           317:        case 2:
        !           318:                if (reg == 7 && floating) {
        !           319:                        bits.d = 0.0;
        !           320:                        bits.s = *(unsigned short *) regs[7];
        !           321:                        x = (unsigned short *) &bits;
        !           322:                        regs[7] += 2;
        !           323:                        pc = (unsigned short *) regs[7];
        !           324:                } else {
        !           325:                        x = (unsigned short *) regs[reg];
        !           326:                        regs[reg] += bytes;
        !           327:                        if (reg == 7) {
        !           328:                                if (bytes != 2) {
        !           329:                                        return((unsigned short *) -1);
        !           330:                                }
        !           331:                                pc = (unsigned short *) regs[7];
        !           332:                        }
        !           333:                }
        !           334:                break;
        !           335:        case 3:
        !           336:                x = (unsigned short *) regs[reg];
        !           337:                x = (unsigned short *) *x;
        !           338:                regs[reg] += 2;
        !           339:                if (reg == 7) {
        !           340:                        pc = (unsigned short *) regs[7];
        !           341:                }
        !           342:                break;
        !           343:        case 4:
        !           344:                regs[reg] -= bytes;
        !           345:                if (reg == 7) {
        !           346:                        pc = (unsigned short *) regs[7];
        !           347:                }
        !           348:                x = (unsigned short *) regs[reg];
        !           349:                break;
        !           350:        case 5:
        !           351:                regs[reg] -= 2;
        !           352:                if (reg == 7) {
        !           353:                        pc = (unsigned short *) regs[7];
        !           354:                }
        !           355:                x = (unsigned short *) regs[reg];
        !           356:                x = (unsigned short *) *x;
        !           357:                break;
        !           358:        case 6:
        !           359:                x = (unsigned short *) (unsigned short) (regs[reg] + *(pc++));
        !           360:                if (reg == 7) {
        !           361:                        ++x;
        !           362:                }
        !           363:                break;
        !           364:        case 7:
        !           365:                x = (unsigned short *) (unsigned short) (regs[reg] + *(pc++));
        !           366:                if (reg == 7) {
        !           367:                        ++x;
        !           368:                }
        !           369:                x = (unsigned short *) *x;
        !           370:                break;
        !           371:        }
        !           372: 
        !           373:        return (x);
        !           374: }
        !           375: 
        !           376: long
        !           377: fliplong(l)
        !           378: long l;
        !           379: {
        !           380:        union {
        !           381:                long l;
        !           382:                short s[2];
        !           383:        } bits[2];
        !           384: 
        !           385:        bits[0].l = l;
        !           386:        bits[1].s[1] = bits[0].s[0];
        !           387:        bits[1].s[0] = bits[0].s[1];
        !           388:        return (bits[1].l);
        !           389: }

unix.superglobalmegacorp.com

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