Annotation of 43BSDTahoe/sys/vax/kdb_opset.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *     @(#)kdb_opset.c 7.3 (Berkeley) 5/26/88
        !             3:  */
        !             4: 
        !             5: #include "../kdb/defs.h"
        !             6: 
        !             7: /*
        !             8:  * Instruction printing.
        !             9:  */
        !            10: REGLIST reglist [] = {
        !            11:        "p1lr", &pcb.pcb_p1lr,  "p1br", (int *)&pcb.pcb_p1br,
        !            12:        "p0lr", &pcb.pcb_p0lr,  "p0br", (int *)&pcb.pcb_p0br,
        !            13:        "ksp",  &pcb.pcb_ksp,   "esp",  &pcb.pcb_esp,
        !            14:        "ssp",  &pcb.pcb_ssp,   "psl",  &pcb.pcb_psl,
        !            15:        "pc",   &pcb.pcb_pc,    "usp",  &pcb.pcb_usp,
        !            16:        "fp",   &pcb.pcb_fp,    "ap",   &pcb.pcb_ap,
        !            17:        "r11",  &pcb.pcb_r11,   "r10",  &pcb.pcb_r10,
        !            18:        "r9",   &pcb.pcb_r9,    "r8",   &pcb.pcb_r8,
        !            19:        "r7",   &pcb.pcb_r7,    "r6",   &pcb.pcb_r6,
        !            20:        "r5",   &pcb.pcb_r5,    "r4",   &pcb.pcb_r4,
        !            21:        "r3",   &pcb.pcb_r3,    "r2",   &pcb.pcb_r2,
        !            22:        "r1",   &pcb.pcb_r1,    "r0",   &pcb.pcb_r0,
        !            23: };
        !            24: 
        !            25: /*
        !            26:  * Argument data types
        !            27:  *
        !            28:  * If you change these definitions, you must also change the tables
        !            29:  * in assizetab.c
        !            30:  */
        !            31: #define        TYPB            000     /* byte integer */
        !            32: #define        TYPW            001     /* word integer */
        !            33: #define        TYPL            002     /* long integer */
        !            34: #define        TYPQ            003     /* quad integer */
        !            35: #define        TYPO            004     /* octa integer */
        !            36: #define        TYPF            005     /* F float */
        !            37: #define        TYPD            006     /* D float */
        !            38: #define        TYPG            007     /* G float */
        !            39: #define        TYPH            010     /* H float */
        !            40: #define        TYPUNPACKED     011     /* when unpacked into mantissa & exponent */
        !            41: #define        TYPNONE         012     /* when nothing */
        !            42: #define        TYPLG           4       /* number of bits the above take up */
        !            43: 
        !            44: #define        TYPMASK ((1<<TYPLG)-1)  /* the mask (assumes 2's comp arith) */
        !            45: /*
        !            46:  * Constructors and extractors for argument access kinds and types
        !            47:  */
        !            48: #define A_CONS(access, type)   ((access) | (type))
        !            49: #define        A_ACCEXT(consed)        ((consed) & (TYPMASK << TYPLG))
        !            50: #define        A_TYPEXT(consed)        ((consed) & TYPMASK)
        !            51: 
        !            52: /*
        !            53:  * Argument access types used to test validity of operands to operators
        !            54:  */
        !            55: #define        ACCR    (1<<TYPLG)                      /* read */
        !            56: #define        ACCW    (2<<TYPLG)                      /* write */
        !            57: #define        ACCB    (4<<TYPLG)                      /* branch displacement */
        !            58: #define        ACCA    (8<<TYPLG)                      /* address only */
        !            59: #define        ACCV    (8<<TYPLG)                      /* address only */
        !            60: #define        ACCM    (ACCR | ACCW)                   /* modify */
        !            61: #define        ACCI    (ACCB | ACCR)                   /* XFC code */
        !            62: 
        !            63: #define ACCESSMASK     (ACCA | ACCR | ACCW | ACCB)     /* the mask */
        !            64: 
        !            65: /*
        !            66:  * Construction of TYPX and ACCX, to make the instrs table
        !            67:  * easy to use and read.
        !            68:  */
        !            69: /*
        !            70:  * For real memory address
        !            71:  */
        !            72: #define        A_AB    A_CONS(ACCA, TYPB)
        !            73: #define        A_AW    A_CONS(ACCA, TYPW)
        !            74: #define        A_AL    A_CONS(ACCA, TYPL)
        !            75: #define        A_AQ    A_CONS(ACCA, TYPQ)
        !            76: #define        A_AO    A_CONS(ACCA, TYPO)
        !            77: #define        A_AF    A_CONS(ACCA, TYPF)
        !            78: #define        A_AD    A_CONS(ACCA, TYPD)
        !            79: #define        A_AG    A_CONS(ACCA, TYPG)
        !            80: #define        A_AH    A_CONS(ACCA, TYPH)
        !            81: /*
        !            82:  * For real memory addresses, or register addresses [sic]
        !            83:  *
        !            84:  * CHEAT! we just call these read access, since
        !            85:  * registers are allowed. All field instruction, except insv,
        !            86:  * are are read access fields.
        !            87:  */
        !            88: #define        A_VB    A_CONS(ACCR, TYPB)
        !            89: #define        A_VW    A_CONS(ACCR, TYPW)
        !            90: #define        A_VL    A_CONS(ACCR, TYPL)
        !            91: #define        A_VQ    A_CONS(ACCR, TYPQ)
        !            92: #define        A_VO    A_CONS(ACCR, TYPO)
        !            93: #define        A_VF    A_CONS(ACCR, TYPF)
        !            94: #define        A_VD    A_CONS(ACCR, TYPD)
        !            95: #define        A_VG    A_CONS(ACCR, TYPG)
        !            96: #define        A_VH    A_CONS(ACCR, TYPH)
        !            97: /*
        !            98:  * For branch displacement
        !            99:  */
        !           100: #define        A_BB    A_CONS(ACCB, TYPB)
        !           101: #define        A_BW    A_CONS(ACCB, TYPW)
        !           102: /*
        !           103:  * For modification
        !           104:  */
        !           105: #define        A_MB    A_CONS(ACCM, TYPB)
        !           106: #define        A_MW    A_CONS(ACCM, TYPW)
        !           107: #define        A_ML    A_CONS(ACCM, TYPL)
        !           108: #define        A_MF    A_CONS(ACCM, TYPF)
        !           109: #define        A_MD    A_CONS(ACCM, TYPD)
        !           110: #define        A_MG    A_CONS(ACCM, TYPG)
        !           111: #define        A_MH    A_CONS(ACCM, TYPH)
        !           112: /*
        !           113:  * For reading
        !           114:  */
        !           115: #define        A_RB    A_CONS(ACCR, TYPB)
        !           116: #define        A_RW    A_CONS(ACCR, TYPW)
        !           117: #define        A_RL    A_CONS(ACCR, TYPL)
        !           118: #define        A_RQ    A_CONS(ACCR, TYPQ)
        !           119: #define        A_RO    A_CONS(ACCR, TYPO)
        !           120: #define        A_RF    A_CONS(ACCR, TYPF)
        !           121: #define        A_RD    A_CONS(ACCR, TYPD)
        !           122: #define        A_RG    A_CONS(ACCR, TYPG)
        !           123: #define        A_RH    A_CONS(ACCR, TYPH)
        !           124: /*
        !           125:  * For writing
        !           126:  */
        !           127: #define        A_WB    A_CONS(ACCW, TYPB)
        !           128: #define        A_WW    A_CONS(ACCW, TYPW)
        !           129: #define        A_WL    A_CONS(ACCW, TYPL)
        !           130: #define        A_WQ    A_CONS(ACCW, TYPQ)
        !           131: #define        A_WO    A_CONS(ACCW, TYPO)
        !           132: #define        A_WF    A_CONS(ACCW, TYPF)
        !           133: #define        A_WD    A_CONS(ACCW, TYPD)
        !           134: #define        A_WG    A_CONS(ACCW, TYPG)
        !           135: #define        A_WH    A_CONS(ACCW, TYPH)
        !           136: 
        !           137: struct insttab {
        !           138:        char    *iname;
        !           139:        u_char  eopcode;
        !           140:        u_char  popcode;
        !           141:        char    nargs;
        !           142:        u_char  argtype[6];
        !           143: };
        !           144: 
        !           145: #define OP(name,eopcode,popdcode,nargs,a1,a2,a3,a4,a5,a6) \
        !           146:        {name,eopcode,popdcode,nargs,a1,a2,a3,a4,a5,a6}
        !           147: /*
        !           148:  * Definitions for the escape bytes
        !           149:  */
        !           150: #define        CORE    0
        !           151: #define        NEW     1
        !           152: #define        ESCD    0xfd
        !           153: #define        ESCF    0xff
        !           154: #define        mapescbyte(b)   ((b) == ESCD ? 1 : (b) == ESCF ? 2 : 0)
        !           155: 
        !           156: static struct insttab insttab[] = {
        !           157: #include "../vax/kdb_instrs"
        !           158: 0};
        !           159: 
        !           160: /*
        !           161:  * Convert TYP[BWLQOFDGH] into {1 if relocation not OK}
        !           162:  */
        !           163: int    ty_NORELOC[] = {
        !           164:        0,      /* TYPB */
        !           165:        0,      /* TYPW */
        !           166:        0,      /* TYPL */
        !           167:        1,      /* TYPQ */
        !           168:        1,      /* TYPO */
        !           169:        1,      /* TYPF */
        !           170:        1,      /* TYPD */
        !           171:        1,      /* TYPG */
        !           172:        1,      /* TYPH */
        !           173:        1       /* TYPNONE */
        !           174: };
        !           175: 
        !           176: /*
        !           177:  * Convert TYP[BWLQOFDGH] into {1 ... 16}
        !           178:  */
        !           179: int    ty_nbyte[] = {
        !           180:        1,      /* TYPB */
        !           181:        2,      /* TYPW */
        !           182:        4,      /* TYPL */
        !           183:        8,      /* TYPQ */
        !           184:        16,     /* TYPO */
        !           185:        4,      /* TYPF */
        !           186:        8,      /* TYPD */
        !           187:        8,      /* TYPG */
        !           188:        16,     /* TYPH */
        !           189:        0       /* TYPNONE */
        !           190: };
        !           191: 
        !           192: static char *regname[] = {
        !           193:        "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
        !           194:        "r8", "r9", "r10","r11","ap", "fp", "sp", "pc"
        !           195: };
        !           196: static char *fltimm[] = {
        !           197: "0.5", "0.5625", "0.625", "0.6875", "0.75", "0.8125", "0.875", "0.9375",
        !           198: "1.0", "1.125", "1.25", "1.375", "1.5", "1.625", "1.75", "1.875",
        !           199: "2.0", "2.25", "2.5", "2.75", "3.0", "3.25", "3.5", "3.75",
        !           200: "4.0", "4.5", "5.0", "5.5", "6.0", "6.5", "7.0", "7.5",
        !           201: "8.0", "9.0", "10.0", "11.0", "12.0", "13.0", "14.0", "15.0",
        !           202: "16.0", "18.0", "20.0", "22.0", "24.0", "26.0", "28.0", "30.0",
        !           203: "32.0", "36.0", "40.0", "44.0", "48.0", "52.0", "56.0", "60.0",
        !           204: "64.0", "72.0", "80.0", "88.0", "96.0", "104.0", "112.0", "120.0"
        !           205: };
        !           206: 
        !           207: static int type, space, incp;
        !           208: static long insoutvar[36];
        !           209: /*
        !           210:  * Definitions for registers and for operand classes
        !           211:  */
        !           212: static char *insregname();     /* how to print a register */
        !           213: 
        !           214: #define        R_PC            0xF
        !           215: 
        !           216: #define        OC_IMM0         0x0
        !           217: #define        OC_IMM1         0x1
        !           218: #define        OC_IMM2         0x2
        !           219: #define        OC_IMM3         0x3
        !           220: #define        OC_INDEX        0x4
        !           221: #define        OC_REG          0x5
        !           222: #define        OC_DREG         0x6
        !           223: #define        OC_ADREG        0x7
        !           224: #define        OC_AIREG        0x8
        !           225: #define        OC_DAIREG       0x9
        !           226: 
        !           227: #define        OC_BDISP        0xA
        !           228: #define        OC_DBDISP       0xB
        !           229: #define        OC_WDISP        0xC
        !           230: #define        OC_DWDISP       0xD
        !           231: #define        OC_LDISP        0xE
        !           232: #define        OC_DLDISP       0xF
        !           233: 
        !           234: #define        OC_SHIFT        4
        !           235: #define        OC_CONS(oc,reg) (((oc & 0xF) << OC_SHIFT) | (reg & 0xF))
        !           236: #define        OC_AMEXT(x)     (((x) >> OC_SHIFT) & 0xF)
        !           237: #define        OC_REGEXT(x)    ((x) & 0xF)
        !           238: 
        !           239: /*
        !           240:  * Definitions for large numbers
        !           241:  */
        !           242: #include "asnumber.h"
        !           243: typedef        struct  as_number       *numberp;
        !           244: static numberp snarf();
        !           245: static numberp snarfreloc();
        !           246: /*
        !           247:  * Definitions for special instructions
        !           248:  */
        !           249: #define        CASEB   0x8F
        !           250: #define        CASEW   0xAF
        !           251: #define        CASEL   0xCF
        !           252: 
        !           253: /* two level 1-based index by opcode into insttab */
        !           254: static short ioptab[3][256];
        !           255: 
        !           256: kdbsetup()
        !           257: {
        !           258:        register struct insttab *p;
        !           259:                int     mapchar;
        !           260: 
        !           261:        for(p = insttab; p->iname; p++){
        !           262:                mapchar = mapescbyte(p->eopcode);
        !           263:                if (ioptab[mapchar][p->popcode])
        !           264:                        continue;
        !           265:                ioptab[mapchar][p->popcode] = (p - insttab) + 1;
        !           266:        }
        !           267: }
        !           268: 
        !           269: static u_char snarfuchar();
        !           270: /*
        !           271:  * Global variables for communicating with the minions and printins
        !           272:  */
        !           273: static int     idsp;
        !           274: static short   argno;          /* which argument one is working on */
        !           275: static char    insoutfmt[2];   /* how to format the relocated symbols */
        !           276: 
        !           277: static savevar(val)
        !           278:        long    val;
        !           279: {
        !           280:        var[argno] = val;
        !           281:        insoutvar[argno] = val;
        !           282: }
        !           283: 
        !           284: /* ARGSUSED */
        !           285: printins(fmt, Idsp, ins)
        !           286:        char    fmt;
        !           287:        u_char  ins;
        !           288:        int     Idsp;
        !           289: {
        !           290:                u_char  mode;           /* mode */
        !           291:                u_char  ins2;
        !           292:                char    *indexreg;      /* print of which register indexes */
        !           293:                char    *indexed;       /* we indexed */
        !           294:                char    *operandout();
        !           295:        register u_char         *ap;
        !           296:        register struct insttab *ip;
        !           297:                u_char  optype;
        !           298:                int     mapchar;
        !           299: 
        !           300:        idsp = Idsp;
        !           301:        type = DSYM;
        !           302:        space = idsp;
        !           303:        insoutfmt[0] = 0;
        !           304: 
        !           305:        incp = 1;
        !           306:        if ((mapchar = mapescbyte(ins)) != 0){
        !           307:                ins2 = snarfuchar();
        !           308:                if (ioptab[mapchar][ins2] == 0){
        !           309:                        /*
        !           310:                         *      Oops; not a defined instruction;
        !           311:                         *      back over this escape byte.
        !           312:                         */
        !           313:                        incp -= 1;
        !           314:                        mapchar = 0;
        !           315:                } else {
        !           316:                        ins = ins2;
        !           317:                }
        !           318:        }
        !           319:        if (ioptab[mapchar][ins] == 0){
        !           320:                printf("<undefined operator byte>: %x", ins);
        !           321:                goto ret;
        !           322:        }
        !           323:        ip = &insttab[ioptab[mapchar][ins] - 1];
        !           324:        printf("%s\t", ip->iname);
        !           325: 
        !           326:        for (ap = ip->argtype, argno = 0; argno < ip->nargs; argno++, ap++) {
        !           327:                savevar(0x80000000);    /* an illegal symbol */
        !           328:                optype = *ap;
        !           329:                if (argno != 0)
        !           330:                        printc(',');
        !           331:                indexreg = 0;
        !           332:                indexed = 0;
        !           333:                do{
        !           334:                        if (A_ACCEXT(optype) & ACCB){
        !           335:                                switch(A_TYPEXT(optype)){
        !           336:                                case TYPB:
        !           337:                                        mode = OC_CONS(OC_BDISP, R_PC);
        !           338:                                        break;
        !           339:                                case TYPW:
        !           340:                                        mode = OC_CONS(OC_WDISP, R_PC);
        !           341:                                        break;
        !           342:                                }
        !           343:                        } else {
        !           344:                                mode = snarfuchar();
        !           345:                        }
        !           346:                        indexreg = operandout(mode, optype);
        !           347:                        if (indexed)
        !           348:                                printf("[%s]", indexed);
        !           349:                        indexed = indexreg;
        !           350:                } while(indexed);
        !           351:        }
        !           352:        if (mapchar == 0){
        !           353:                switch(ins){
        !           354:                case CASEB:
        !           355:                case CASEW:
        !           356:                case CASEL:
        !           357:                        casebody(insoutvar[1], insoutvar[2]);
        !           358:                        break;
        !           359:                default:
        !           360:                        break;
        !           361:                }
        !           362:        }
        !           363:    ret: ;
        !           364: 
        !           365:        dotinc = incp;
        !           366: }
        !           367: 
        !           368: casebody(base, limit)
        !           369:        long    base;
        !           370:        long    limit;
        !           371: {
        !           372:        int     i;
        !           373:        u_int   baseincp;
        !           374:        u_int   advincp;
        !           375:        struct  as_number       *valuep;
        !           376: #define        OSIZE (sizeof(short))
        !           377:        argno = 0;
        !           378:        baseincp = incp;
        !           379:        for (i = 0; i <= limit; i++) {
        !           380:                printc(EOR);
        !           381:                printf("    %R:  ", i + base);
        !           382:                valuep = snarfreloc(OSIZE, 0);
        !           383:                advincp = incp;
        !           384:                incp = baseincp;
        !           385:                dispaddress(valuep, OC_CONS(OC_WDISP, R_PC));
        !           386:                incp = advincp;
        !           387:        }
        !           388: }
        !           389: 
        !           390: /*
        !           391:  * magic values to mung an offset to a register into
        !           392:  * something that psymoff can understand.. all magic
        !           393:  */
        !           394:                              /* 0      1       2       3       4 */
        !           395: static long magic_masks[5] =   {0,     0x80,   0x8000, 0,      0};     
        !           396: static long magic_compl[5] =   {0,     0x100,  0x10000,0,      0};
        !           397: /*
        !           398:  * Snarf up some bytes, and put in the magic relocation flags
        !           399:  */
        !           400: static numberp snarfreloc(nbytes)
        !           401:        int     nbytes;
        !           402: {
        !           403:        numberp back;
        !           404:        back = snarf(nbytes);
        !           405:        if (back->num_ulong[0] & magic_masks[nbytes])
        !           406:                back->num_ulong[0] -= magic_compl[nbytes];
        !           407:        return(back);
        !           408: }
        !           409: /*
        !           410:  * The following code is NOT portable from the PDP 11 to the VAX
        !           411:  * because of the byte ordering problem.
        !           412:  */
        !           413: static numberp snarf(nbytes)
        !           414:        int     nbytes;
        !           415: {
        !           416:        register        int     i;
        !           417: 
        !           418:        static  struct  as_number       backnumber;
        !           419:        static  struct  as_number       znumber;        /* init'ed to 0 */
        !           420: 
        !           421:        backnumber = znumber;
        !           422:        for (i = 0; i < nbytes; i++)
        !           423:                backnumber.num_uchar[i] = snarfuchar();
        !           424:        return(&backnumber);
        !           425: }
        !           426: 
        !           427: /*
        !           428:  * Read one single character, and advance the dot
        !           429:  */
        !           430: static u_char
        !           431: snarfuchar()
        !           432: {
        !           433:        u_char  back;
        !           434:        /*
        !           435:         *      assert: bchkget and inkdot don't have side effects
        !           436:         */
        !           437:        back = (u_char)bchkget(inkdot(incp), idsp);
        !           438:        incp += 1;
        !           439:        return(back);
        !           440: }
        !           441: 
        !           442: /*
        !           443:  * normal operand; return non zero pointer to register
        !           444:  * name if this is an index instruction.
        !           445:  */
        !           446: char *operandout(mode, optype)
        !           447:        u_char  mode;
        !           448:        u_char  optype;
        !           449: {
        !           450:        char    *r;
        !           451:        int     regnumber;
        !           452:        int     nbytes;
        !           453: 
        !           454:        regnumber = OC_REGEXT(mode);
        !           455:        r = insregname(regnumber);
        !           456:        switch (OC_AMEXT(mode)){
        !           457:        case OC_IMM0:
        !           458:        case OC_IMM1:
        !           459:        case OC_IMM2:
        !           460:        case OC_IMM3:
        !           461:                shortliteral(mode, optype);
        !           462:                return(0);
        !           463:        case OC_INDEX:
        !           464:                return(r);              /* will be printed later */
        !           465:        case OC_REG:
        !           466:                printf("%s", r);
        !           467:                return(0);
        !           468:        case OC_DREG:
        !           469:                printf("(%s)", r);
        !           470:                return(0);
        !           471:        case OC_ADREG:
        !           472:                printf("-(%s)", r);
        !           473:                return(0);
        !           474:        case OC_DAIREG:
        !           475:                printc('*');
        !           476:        case OC_AIREG:
        !           477:                if (regnumber == R_PC){
        !           478:                        pcimmediate(mode, optype);
        !           479:                } else {
        !           480:                        printf("(%s)+", r);
        !           481:                }
        !           482:                return(0);
        !           483:        case OC_DBDISP:
        !           484:                printc('*');
        !           485:        case OC_BDISP:
        !           486:                nbytes = 1;
        !           487:                break;
        !           488:        case OC_DWDISP:
        !           489:                printc('*');
        !           490:        case OC_WDISP:
        !           491:                nbytes = 2;
        !           492:                break;
        !           493:        case OC_DLDISP:
        !           494:                printc('*');
        !           495:        case OC_LDISP:
        !           496:                nbytes = 4;
        !           497:                break;
        !           498:        }
        !           499:        dispaddress(snarfreloc(nbytes), mode);
        !           500:        return(0);
        !           501: }
        !           502: 
        !           503: dispaddress(valuep, mode)
        !           504:        numberp valuep;
        !           505:        u_char  mode;
        !           506: {
        !           507:        int     regnumber = OC_REGEXT(mode);
        !           508: 
        !           509:        switch(OC_AMEXT(mode)){
        !           510:        case OC_BDISP:
        !           511:        case OC_DBDISP:
        !           512:        case OC_WDISP:
        !           513:        case OC_DWDISP:
        !           514:        case OC_LDISP:
        !           515:        case OC_DLDISP:
        !           516:                if (regnumber == R_PC){
        !           517:                        /* PC offset addressing */
        !           518:                        valuep->num_ulong[0] += inkdot(incp);
        !           519:                }
        !           520:        }
        !           521:        if (regnumber == R_PC)
        !           522:                psymoff(valuep->num_ulong[0], type, &insoutfmt[0]);
        !           523:        else {                          /* } */
        !           524:                printf(LPRMODE, valuep->num_ulong[0]);
        !           525:                printf(insoutfmt);
        !           526:                printf("(%s)", insregname(regnumber));
        !           527:        }
        !           528:        savevar((long)valuep->num_ulong[0]);
        !           529: }
        !           530: 
        !           531: /*
        !           532:  * get a register name
        !           533:  */
        !           534: static char *
        !           535: insregname(regnumber)
        !           536:        int     regnumber;
        !           537: {
        !           538:        char    *r;
        !           539:        r = regname[regnumber];
        !           540:        return(r);
        !           541: }
        !           542: 
        !           543: /*
        !           544:  * print out a short literal
        !           545:  */
        !           546: shortliteral(mode, optype)
        !           547:        u_char  mode;
        !           548:        u_char  optype;
        !           549: {
        !           550:        savevar((long)mode);
        !           551:        switch(A_TYPEXT(optype)){
        !           552:        case TYPF:
        !           553:        case TYPD:
        !           554:        case TYPG:
        !           555:        case TYPH:
        !           556:                printf("$%s", fltimm[mode]);
        !           557:                break;
        !           558:        default:
        !           559:                printf("$%r", mode);
        !           560:                break;
        !           561:        }
        !           562: }
        !           563: 
        !           564: pcimmediate(mode, optype)
        !           565:        u_char  mode;
        !           566:        u_char  optype;
        !           567: {
        !           568:        int     nbytes;
        !           569: 
        !           570:        printc('$');
        !           571:        if (mode == OC_CONS(OC_DAIREG, R_PC)){  /* PC absolute, always 4 bytes*/
        !           572:                dispaddress(snarfreloc(4), mode);
        !           573:                return;
        !           574:        }
        !           575:        nbytes = ty_nbyte[A_TYPEXT(optype)];
        !           576:        if (! ty_NORELOC[A_TYPEXT(optype)]){
        !           577:                dispaddress(snarfreloc(nbytes), mode);
        !           578:                return;
        !           579:        }
        !           580:        bignumprint(nbytes, optype);
        !           581: }
        !           582: 
        !           583: bignumprint(nbytes, optype)
        !           584:        int     nbytes;
        !           585:        u_char  optype;
        !           586: {
        !           587:        numberp valuep;
        !           588:        int     leading_zero = 1;
        !           589:        register int    bindex;
        !           590:        register int    nindex;
        !           591:        register int    ch;
        !           592: 
        !           593:        valuep = snarf(nbytes);
        !           594:        switch(A_TYPEXT(optype)){
        !           595:        case TYPF:      
        !           596:                printf("0f%f", valuep->num_num.numFf_float.Ff_value);
        !           597:                break;
        !           598:        case TYPD:
        !           599:                printf("0d%f", valuep->num_num.numFd_float.Fd_value);
        !           600:                break;
        !           601:        case TYPG:
        !           602:                printf("0g::"); goto qprint;
        !           603:        case TYPH:
        !           604:                printf("0h::"); goto qprint;
        !           605:        case TYPQ:
        !           606:        case TYPO:
        !           607:        qprint:
        !           608:                for (bindex = nbytes - 1; bindex >= 0; --bindex){
        !           609:                        for (nindex = 4; nindex >= 0; nindex -= 4){
        !           610:                                ch = (valuep->num_uchar[bindex] >> nindex);
        !           611:                                ch &= 0x0F;
        !           612:                                if ( ! (leading_zero &= (ch == 0) ) ){
        !           613:                                        if (ch <= 0x09)
        !           614:                                                printc(ch + '0');
        !           615:                                        else
        !           616:                                                printc(ch - 0x0A + 'a');
        !           617:                                }
        !           618:                        }
        !           619:                }
        !           620:                break;
        !           621:        }
        !           622: }

unix.superglobalmegacorp.com

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