Annotation of coherent/b/bin/db_400/i8086b.c, revision 1.1

1.1     ! root        1: /* $Header: /src386/bin/db/RCS/i8086b.c,v 1.3 93/03/11 07:45:40 bin Exp Locker: bin $
        !             2:  *
        !             3:  *     The information contained herein is a trade secret of Mark Williams
        !             4:  *     Company, and  is confidential information.  It is provided  under a
        !             5:  *     license agreement,  and may be  copied or disclosed  only under the
        !             6:  *     terms of  that agreement.  Any  reproduction or disclosure  of this
        !             7:  *     material without the express written authorization of Mark Williams
        !             8:  *     Company or persuant to the license agreement is unlawful.
        !             9:  *
        !            10:  *     COHERENT Version 2.3.35
        !            11:  *     Copyright (c) 1982, 1983, 1984.
        !            12:  *     An unpublished work by Mark Williams Company, Chicago.
        !            13:  *     All rights reserved.
        !            14:  */
        !            15: /*
        !            16:  * A debugger.
        !            17:  * Intel 8086.
        !            18:  *
        !            19:  * $Log:       i8086b.c,v $
        !            20:  * Revision 1.3  93/03/11  07:45:40  bin
        !            21:  * Hal: post NDP update that at least
        !            22:  * can st breakpoints.
        !            23:  * 
        !            24:  * Revision 1.1  92/06/10  14:36:31  bin
        !            25:  * Initial revision
        !            26:  * 
        !            27:  * Revision 1.2        89/06/19  16:46:29      src
        !            28:  * Bug:        80286 virtual mode instructions not supported [ie: lgdt].
        !            29:  * Fix:        Metakey 'V' added to support 3 byte virtual mode instructions. (ABC)
        !            30:  * 
        !            31:  * Revision 1.1        88/10/17  04:03:49      src
        !            32:  * Initial revision
        !            33:  *
        !            34:  * Revision: 386 version 92/05/01 
        !            35:  * Bernard Wald, Wald Software Consulting, Germany
        !            36:  */
        !            37: 
        !            38: #include <stdio.h>
        !            39: #include <sys/param.h>
        !            40: #include <l.out.h>
        !            41: #include "trace.h"
        !            42: #include "i8086.h"
        !            43: 
        !            44: /*
        !            45:  * Disassemble an Intel 80386 instruction.
        !            46:  */
        !            47: 
        !            48: #define        MAXINSTLEN      50      /* max. expanded opcode string length */
        !            49: #define        MAXDISPLCTSIZE  6       /* max. displacement size in bytes */
        !            50: #define        ESC_2_OPMAP2    0x0F    /* escape to second byte of the opcode */
        !            51: 
        !            52: /* define instruction prefix codes */
        !            53: #define REP    0xF3
        !            54: #define REPNE  0xF2
        !            55: #define LOCK   0xF0
        !            56: 
        !            57: /* define address size prefix codes */
        !            58: #define ADDRPRE        0x67
        !            59: 
        !            60: /* define operand size prefix codes */
        !            61: #define OPDPRE 0x66
        !            62: 
        !            63: /* define segment override prefix codes */
        !            64: #define CS_PFX 0x2E
        !            65: #define DS_PFX 0x3E
        !            66: #define ES_PFX 0x26
        !            67: #define FS_PFX 0x64
        !            68: #define GS_PFX 0x65
        !            69: #define SS_PFX 0x36
        !            70: 
        !            71: #define EBP_SIB        5
        !            72: 
        !            73: #define UNSIGNED       0
        !            74: #define SIGNED         1
        !            75: 
        !            76: #define ADDZERO                0
        !            77: #define ADDADDR                1
        !            78: 
        !            79: #define mod(x)         (((x)>>6)&3)
        !            80: #define modR(x)                (((x)>>3)&7)
        !            81: #define modRM(x)       ((x)&7)
        !            82: #define sibss(x)       (((x)>>6)&3)
        !            83: #define sibx(x)                (((x)>>3)&7)
        !            84: #define sibb(x)                ((x)&7)
        !            85: 
        !            86: #define ADDRINDEX(x)   (x == RM32 ? 1 : 0)
        !            87: 
        !            88: #define TOLSYM         0x100           /* print symbol if greater */
        !            89: #define TOLHEX         0x10            /* print hexidecimal if greater */
        !            90:                                        /* print decimal if less */
        !            91: static int             addrflag=0;     /* address size prefix flag */
        !            92: static int             opdflag=0;      /* operand size prefix flag */
        !            93: static int             segflag=0;      /* segment override prefix flag */
        !            94: static char            *segPreStrp;    /* segment prefix str., e.g. "cs:" */
        !            95: static unsigned char   m;              /* "Mod" field of ModR/M byte */
        !            96: static unsigned char   mRM;            /* "R/M" field of ModR/M byte */
        !            97: static unsigned char   mReg;           /* "REG" field of ModR/M byte */
        !            98: static unsigned char   modRMloaded;    /* ModR/M byte part of instruction
        !            99:                                           has already been loaded, if set */
        !           100: static unsigned char   sb;             /* "base" field of SIB byte */
        !           101: static unsigned char   sss;            /* "ss" field of SIB byte */
        !           102: static unsigned char   sx;             /* "index" field of SIB byte */
        !           103: static unsigned char   sibLoaded;      /* SIB byte part of instruction
        !           104:                                           has already been loaded, if set */
        !           105: 
        !           106: /* Function declatations */
        !           107: char           *getmodREGstr();
        !           108: char           *getmodRM16str();
        !           109: char           *getmodRM32str();
        !           110: char           *getsibstr();
        !           111: char           *getmodRMstr();
        !           112: unsigned long  getVal();
        !           113: unsigned short getValData();
        !           114: unsigned char  check4prefix();
        !           115: unsigned long  evalValData();
        !           116: char           *getSegValStr();
        !           117: char           *getASCIIimmediateStr();
        !           118: char           *getASCIIdisplcmtStr();
        !           119: char           *getSegPreStr();
        !           120: unsigned char  c2opdsizeAdj();
        !           121: unsigned char  getnbytes();
        !           122: unsigned char  getgenRegIndex();
        !           123: 
        !           124: char *
        !           125: newconinst(sp, s)
        !           126: char   *sp;            /* pointer to assembler nmeumonic string, which will 
        !           127:                           contain the expanded string to be output (to screen). */
        !           128: int    s;              /* segment number */
        !           129: {
        !           130:        unsigned char   ibp[MAXDISPLCTSIZE];    /* buffer to store read-in instruction/
        !           131:                                                   displacement machine code */
        !           132:        char            is[MAXINSTLEN], *isp;   /* buffer to store formatted 
        !           133:                                                   instructon string. */
        !           134:        char            *tsp;                   /* temporary string pointer */
        !           135:        int             loop, useMap2;
        !           136: 
        !           137:        /*
        !           138:         * Initialize
        !           139:         */
        !           140:        addrflag = 0;
        !           141:        opdflag = 0;    
        !           142:        segflag = 0;    
        !           143:        modRMloaded = 0;
        !           144:        sibLoaded = 0;  
        !           145: 
        !           146:        isp = is;
        !           147: 
        !           148:        /*
        !           149:         * Check whether any prefixes are present
        !           150:         */
        !           151:        for (loop=1, useMap2=0; loop; ) {
        !           152:                if (getb(s, ibp, sizeof(char)) == 0)
        !           153:                        return (NULL);
        !           154:                switch (ibp[0]) {
        !           155:                case REP:               /* rep instruction prefix */
        !           156:                case REPNE:             /* repne instruction prefix */
        !           157:                case LOCK:              /* lock instruction prefix */
        !           158:                        loop = 0;       /* treat instruction prefixe like a */
        !           159:                        break;          /* separate instruction */              
        !           160:                case ADDRPRE:           /* address size prefix */
        !           161:                        addrflag = 1;
        !           162:                        continue;
        !           163:                case OPDPRE:            /* operand size prefix */
        !           164:                        opdflag = 1;
        !           165:                        continue;
        !           166:                case CS_PFX:            /* "cs:" segment override prefix */
        !           167:                case DS_PFX:            /* "ds:" segment override prefix */
        !           168:                case ES_PFX:            /* "es:" segment override prefix */
        !           169:                case FS_PFX:            /* "fs:" segment override prefix */
        !           170:                case GS_PFX:            /* "gs:" segment override prefix */
        !           171:                case SS_PFX:            /* "ss:" segment override prefix */
        !           172:                        segPreStrp = opStrMap1[ ibp[0] ]; /* store segment override */ 
        !           173:                        segflag = 1;
        !           174:                        break;
        !           175:                case ESC_2_OPMAP2:      /* opcode info is in the next byte */
        !           176:                        useMap2 = 1;
        !           177:                        if (getb(s, ibp, sizeof(char)) == 0)
        !           178:                                return (NULL);
        !           179:                        loop = 0;
        !           180:                        break;
        !           181:                default:
        !           182:                        loop = 0;
        !           183:                }
        !           184:        }
        !           185: 
        !           186:        /*
        !           187:         * get and evaluate the formated opcode string obtained from the 
        !           188:         * opStrMap1&2[]
        !           189:         */
        !           190: 
        !           191:        /* get formatted opcode string and store in is[] */
        !           192:        if ( (tsp = useMap2 ? opStrMap2[ibp[0]] : opStrMap1[ibp[0]]) == NULL ) {
        !           193:                sprintf(sp, "Invalid instruction byte = %02x (opStrMap%d)\n"
        !           194:                        , ibp[0], useMap2 ? 2 : 1);
        !           195:                return( sp = (char *)strchr(sp, '\0') );
        !           196:        }
        !           197:        strcpy(isp, tsp);
        !           198: 
        !           199:        /* Expand the formatted opcode string pointed at by isp to produce an 
        !           200:           assembler nmeumonic string. Make sure sp is pointing to the current
        !           201:           end-of-string after each loop. */
        !           202:        for ( ; isp[0]; isp++) {
        !           203:                switch (isp[0]) {
        !           204:                case '%':
        !           205:                        if ( (isp = fmatPercent(isp, sp, s, ibp)) == NULL) {
        !           206:                                printf("Invalid opcode string.\n");
        !           207:                                return(NULL);
        !           208:                        }
        !           209:                        /* point to end of string */
        !           210:                        sp = (char *)strchr(sp, '\0');
        !           211:                        break;
        !           212:                case ' ':
        !           213:                        *sp++ = '\t';
        !           214:                        *sp = '\0';
        !           215:                        break;
        !           216:                default:
        !           217:                        *sp++ = isp[0];
        !           218:                        *sp = '\0';
        !           219: 
        !           220:                }
        !           221:        }
        !           222:        return(sp);
        !           223: }
        !           224: 
        !           225: 
        !           226: /*
        !           227:  * Evalute "%c1c2" and store the expanded results in wb[]. Then, copy wb[] into
        !           228:  * sp[] and return isp pointing to the next character of the formatted 
        !           229:  * instruction string. 
        !           230:  *
        !           231:  *     CAREFULL! - when doing string manipulations, make sure that wbp
        !           232:  *                 is pointing at '\0' before breaking from switch statement.
        !           233:  */
        !           234: char *
        !           235: fmatPercent(isp, sp, s, ibp)
        !           236: char           *isp, *sp;
        !           237: int            s;
        !           238: unsigned char  *ibp;
        !           239: {
        !           240:        char            wb[MAXINSTLEN], *wbp;   /* work buffer (pointer) */
        !           241:        unsigned char   c1, c2;                 /* 1st & 2nd char after '%' */
        !           242:        long            deltaVal;
        !           243:        unsigned long   val;
        !           244:        char            *tsp1, *tsp2;           /* temporary string pointer */
        !           245: 
        !           246:        c1 = *++isp;
        !           247:        c2 = *++isp;
        !           248:        wbp = wb;
        !           249:        wbp[0] = '\0';
        !           250:        
        !           251:        switch (c1) {
        !           252:        case 'A':
        !           253:                c2 = c2opdsizeAdj(c2);
        !           254:                val = getVal(s, ibp, c2, UNSIGNED, ADDZERO, &deltaVal);
        !           255:                wbp = getSegValStr(ibp, wbp, c2);
        !           256:                wbp = getASCIIdisplcmtStr(wbp, 'a', UNSIGNED, s, deltaVal, val);
        !           257:                break;
        !           258:        case 'C':
        !           259:                getmodRM(s, ibp, sizeof(char));
        !           260:                wbp = (char *)strcpy(wbp, ctrlReg[mReg]);
        !           261:                wbp = (char *)strchr(wbp, '\0');
        !           262:                break;
        !           263:        case 'D':
        !           264:                getmodRM(s, ibp, sizeof(char));
        !           265:                wbp = (char *)strcpy(wbp, dbgReg[mReg]);
        !           266:                wbp = (char *)strchr(wbp, '\0');
        !           267:                break;
        !           268:        case 'E':
        !           269:        case 'M':
        !           270:        case 'R':
        !           271:                if (getaddrsize() == RM16)
        !           272:                        wbp = getmodRM16str(s, ibp, c2, wbp);
        !           273:                else
        !           274:                        wbp = getmodRM32str(s, ibp, c2, wbp);
        !           275:                break;
        !           276:        case 'G':
        !           277:                wbp = getmodREGstr(s, ibp, c2, wbp);
        !           278:                break;
        !           279:        case 'I':
        !           280:                *wbp++ = '$';
        !           281:                c2 = c2opdsizeAdj(c2);
        !           282:                val = getVal(s, ibp, c2, SIGNED, ADDZERO, &deltaVal);
        !           283:                wbp = getSegValStr(ibp, wbp, c2);
        !           284:                wbp = getASCIIimmediateStr(wbp, 'x',
        !           285:                        SIGNED, s, deltaVal, val, c2);
        !           286:                break;
        !           287:        case 'J':
        !           288:                wbp = getSegPreStr(wbp);
        !           289:                c2 = c2opdsizeAdj(c2);
        !           290:                val = getVal(s, ibp, c2, SIGNED, ADDADDR, &deltaVal);
        !           291:                wbp = getSegValStr(ibp, wbp, c2);
        !           292:                wbp = getASCIIdisplcmtStr(wbp, 'a', SIGNED, s, deltaVal, val);
        !           293:                break;
        !           294:        case 'K':
        !           295:                wbp = getSegPreStr(wbp);
        !           296:                c2 = c2opdsizeAdj(c2);
        !           297:                val = getVal(s, ibp, c2, SIGNED, ADDADDR, &deltaVal);
        !           298:                wbp = getSegValStr(ibp, wbp, c2);
        !           299:                wbp = getASCIIdisplcmtStr(wbp, 's', SIGNED, s, deltaVal, val);
        !           300:                break;
        !           301: /*     case 'M':        see case 'E' 
        !           302:                break;                  */
        !           303:        case 'O':
        !           304:                wbp = getSegPreStr(wbp);
        !           305:                c2 = getaddrsize() == RM16 ? 'w' : 'd';
        !           306:                val = getVal(s, ibp, c2, SIGNED, ADDZERO, &deltaVal);
        !           307:                wbp = getSegValStr(ibp, wbp, c2);
        !           308:                wbp = getASCIIdisplcmtStr(wbp, 's', SIGNED, 
        !           309:                        (hdrinfo.defsegatt == RM16 ? 2 : 1), deltaVal, val);
        !           310:                break;
        !           311: /*     case 'R':        see case 'E' 
        !           312:                break;                  */
        !           313:        case 'S':
        !           314:                getmodRM(s, ibp, sizeof(char));
        !           315:                wbp = (char *)strcpy(wbp, segReg[mReg]);
        !           316:                wbp = (char *)strchr(wbp, '\0');
        !           317:                break;
        !           318:        case 'T':
        !           319:                getmodRM(s, ibp, sizeof(char));
        !           320:                wbp = (char *)strcpy(wbp, tstReg[mReg]);
        !           321:                wbp = (char *)strchr(wbp, '\0');
        !           322:                break;
        !           323:        case 'X':
        !           324: /*             if (getaddrsize()==RM16) {
        !           325:                        sprintf(wbp, "ds:(%%si)");
        !           326:                }
        !           327:                else {
        !           328:                        sprintf(wbp, "ds:(%%esi)");
        !           329:                }
        !           330:                wbp = (char *)strchr(wbp, '\0');
        !           331:                break;
        !           332: */     case 'Y':
        !           333: /*             if (getaddrsize()==RM16) {
        !           334:                        sprintf(wbp, "es:(%%di)");
        !           335:                }
        !           336:                else {
        !           337:                        sprintf(wbp, "es:(%%edi)");
        !           338:                }
        !           339:                wbp = (char *)strchr(wbp, '\0');
        !           340: */             break;
        !           341:        case 'Z':
        !           342:                c2 = c2opdsizeAdj(c2);
        !           343:                switch(c2) {
        !           344:                case 'b':
        !           345:                        *wbp++ = 'b';
        !           346:                        break;
        !           347:                case 'd':
        !           348:                        *wbp++ = 'l';
        !           349:                        break;
        !           350:                case 'w':
        !           351:                        *wbp++ = 'w';
        !           352:                        break;
        !           353:                case 'z':
        !           354:                        *wbp++ = (getopdsize()==RM16 ? 'w': 'l');
        !           355:                        break;
        !           356:                }
        !           357:                wbp[0] = '\0';
        !           358:                break;
        !           359:        case 'e':
        !           360:                if (getopdsize()==OPD16) {
        !           361:                        *wbp++ = '%';
        !           362:                        *wbp++ = c2;
        !           363:                        *wbp = '\0';
        !           364:                }
        !           365:                else {
        !           366:                        *wbp++ = '%';
        !           367:                        *wbp++ = 'e';
        !           368:                        *wbp++ = c2;
        !           369:                        *wbp = '\0';
        !           370:                }
        !           371:                break;
        !           372:        case 'g':       /* just inserting the group string into isp */
        !           373:                getmodRM(s, ibp, sizeof(char));
        !           374:                if (grpStrMap[c2-'0'][mReg] == NULL) {
        !           375:                        sprintf(wbp, "\nInvalid instruction byte = %02x (grpStrMap[%d][%d])\n"
        !           376:                                , ibp[0], c2-'0', mReg);
        !           377:                        return( wbp = (char *)strchr(wbp, '\0') );
        !           378:                }
        !           379:                tsp1 = malloc(MAXINSTLEN);
        !           380:                tsp2 = isp;
        !           381:                strcpy(tsp1, isp+1);
        !           382:                strcpy(isp+1, grpStrMap[c2-'0'][mReg]);
        !           383:                isp = (char *)strchr(isp+1, '\0');
        !           384:                strcpy(isp, tsp1);
        !           385:                isp = tsp2;
        !           386:                free(tsp1);
        !           387:                *wbp = '\0';
        !           388:                break;
        !           389:        case 'r':
        !           390:                if (getb(s, ibp, sizeof(char)) == 0)
        !           391:                        return (NULL);
        !           392:                break;
        !           393:        default:
        !           394:                *wbp++ = c1;
        !           395:                *wbp++ = c2;
        !           396:                *wbp = '\0';
        !           397:        }
        !           398: 
        !           399:        sp = (char *)strcpy(sp, wb);
        !           400: 
        !           401:        return(isp);
        !           402: }
        !           403: 
        !           404: char   *
        !           405: getmodREGstr(s, ibp, c2, wbp)
        !           406: int            s;
        !           407: unsigned char  *ibp;
        !           408: char           c2, *wbp;
        !           409: {
        !           410:        getmodRM(s, ibp, sizeof(char));
        !           411:        strcpy(wbp, genReg[getgenRegIndex(c2)][mReg]);
        !           412:        wbp = (char *)strchr(wbp, '\0');
        !           413:        return(wbp);
        !           414: }
        !           415: 
        !           416: char   *
        !           417: getmodRM16str(s, ibp, c2, wbp)
        !           418: int            s;
        !           419: unsigned char  *ibp;
        !           420: char           c2, *wbp;
        !           421: {
        !           422:        unsigned char   genRegIndex;
        !           423:        long            deltaVal;
        !           424:        unsigned long   val;
        !           425: 
        !           426:        getmodRM(s, ibp, sizeof(char));
        !           427:        c2 = c2opdsizeAdj(c2);
        !           428: 
        !           429:        switch(m) {
        !           430:        case 0:
        !           431:                if (mRM==6) {
        !           432:                        wbp = getSegPreStr(wbp);
        !           433:                        val = getVal(s, ibp, 'w', SIGNED, ADDZERO, &deltaVal);
        !           434:                        wbp = getSegValStr(ibp, wbp, 'w');
        !           435:                        wbp = getASCIIdisplcmtStr(wbp, 's', SIGNED, 
        !           436:                            (hdrinfo.defsegatt == RM16 ? 2 : 1), deltaVal, val);
        !           437:                        break;
        !           438:                }
        !           439:                wbp = getSegPreStr(wbp);
        !           440:                wbp = (char *)strcpy(wbp, modRMtab16[mRM] );
        !           441:                wbp = (char *)strchr(wbp, '\0');
        !           442:                break;
        !           443:        case 1:
        !           444:                wbp = getmodRMstr(s, ibp, wbp, 'b', 'd', RM16, 1);
        !           445:                break;
        !           446:        case 2:
        !           447:                wbp = getmodRMstr(s, ibp, wbp, 'w', 'd', RM16, 1);
        !           448:                break;
        !           449:        case 3:
        !           450:                genRegIndex = getgenRegIndex(c2);
        !           451: 
        !           452:                wbp = (char *)strcpy(wbp, genReg[genRegIndex][mRM]);
        !           453:                wbp = (char *)strchr(wbp, '\0');
        !           454:                break;
        !           455:        }
        !           456:        return(wbp);
        !           457: }
        !           458: 
        !           459: char   *
        !           460: getmodRM32str(s, ibp, c2, wbp)
        !           461: int            s;
        !           462: unsigned char  *ibp;
        !           463: char           c2, *wbp;
        !           464: {
        !           465:        unsigned char   genRegIndex;
        !           466:        long            deltaVal;
        !           467:        unsigned long   val;
        !           468: 
        !           469:        getmodRM(s, ibp, sizeof(char));
        !           470:        c2 = c2opdsizeAdj(c2);
        !           471: 
        !           472:        switch(m) {
        !           473:        case 0:
        !           474:                if (mRM==4) {
        !           475:                        wbp = getsibstr(s, ibp, wbp, '\0', m);
        !           476:                        break;
        !           477:                }
        !           478:                if (mRM==5) {
        !           479:                        wbp = getSegPreStr(wbp);
        !           480:                        val = getVal(s, ibp, 'd', SIGNED, ADDZERO, &deltaVal);
        !           481:                        wbp = getSegValStr(ibp, wbp, 'd');
        !           482:                        wbp = getASCIIdisplcmtStr(wbp, 's', SIGNED, 
        !           483:                            (hdrinfo.defsegatt == RM16 ? 2 : 1), deltaVal, val);
        !           484:                        break;
        !           485:                }
        !           486:                wbp = getSegPreStr(wbp);
        !           487:                wbp = (char *)strcpy(wbp, modRMtab32[mRM] );
        !           488:                wbp = (char *)strchr(wbp, '\0');
        !           489:                break;
        !           490:        case 1:
        !           491:                if (mRM==4) {
        !           492:                        wbp = getsibstr(s, ibp, wbp, 'b', m);
        !           493:                        break;
        !           494:                }
        !           495:                wbp = getmodRMstr(s, ibp, wbp, 'b', 'd', RM32, 1);
        !           496:                break;
        !           497:        case 2:
        !           498:                if (mRM==4) {
        !           499:                        wbp = getsibstr(s, ibp, wbp, 'd', m);
        !           500:                        break;
        !           501:                }
        !           502:                wbp = getmodRMstr(s, ibp, wbp, 'd', 'd', RM32, 1);
        !           503:                break;
        !           504:        case 3:
        !           505:                genRegIndex = getgenRegIndex(c2);
        !           506: 
        !           507:                wbp = (char *)strcpy(wbp, genReg[genRegIndex][mRM]);
        !           508:                wbp = (char *)strchr(wbp, '\0');
        !           509:                break;
        !           510:        }
        !           511:        return(wbp);
        !           512: }
        !           513: 
        !           514: char   *
        !           515: getmodRMstr(s, ibp, wbp, displctsize, form, addrsize, signedVal)
        !           516: int            s;
        !           517: unsigned char  *ibp;
        !           518: char           *wbp;
        !           519: unsigned char  displctsize, form, addrsize, signedVal;
        !           520: {
        !           521:        long            deltaVal;
        !           522:        unsigned long   val;
        !           523: 
        !           524:        wbp = getSegPreStr(wbp);
        !           525: 
        !           526:        val = getVal(s, ibp, displctsize, signedVal, ADDZERO, &deltaVal);
        !           527:        wbp = getSegValStr(ibp, wbp, displctsize);
        !           528:        wbp = getASCIIdisplcmtStr(wbp, form, signedVal, s, deltaVal, val);
        !           529: 
        !           530:        wbp = (char *)strcpy(wbp, modRMtab[ADDRINDEX(addrsize)][mRM] );
        !           531:        wbp = (char *)strchr(wbp, '\0');
        !           532: 
        !           533:        return(wbp);
        !           534: }
        !           535: 
        !           536: char   *
        !           537: getsibstr(s, ibp, wbp, displctsize, m)
        !           538: int            s;
        !           539: unsigned char  *ibp;
        !           540: char           *wbp;
        !           541: unsigned char  displctsize, m;
        !           542: {
        !           543:        long            deltaVal;
        !           544:        unsigned long   val;
        !           545: 
        !           546:        getsib(s, ibp, sizeof(char));
        !           547: 
        !           548:        switch(m) {
        !           549:        case 0:
        !           550:                wbp = getSegPreStr(wbp);
        !           551:                if (sb == EBP_SIB) {
        !           552:                        val = getVal(s, ibp, 'd', SIGNED, ADDZERO, &deltaVal);
        !           553:                        wbp = getSegValStr(ibp, wbp, 'd');
        !           554:                        wbp = getASCIIdisplcmtStr(wbp, 'd', SIGNED, s, deltaVal, val);
        !           555:                }
        !           556:                else {
        !           557:                        wbp = (char *)strcpy(wbp, modRMtab[ADDRINDEX(RM32)][sb]);
        !           558:                        wbp = (char *)strchr(wbp, '\0');
        !           559:                }
        !           560:                break;
        !           561:        case 1:
        !           562:                wbp = getSegPreStr(wbp);
        !           563: 
        !           564:                val = getVal(s, ibp, displctsize, SIGNED, ADDZERO, &deltaVal);
        !           565:                wbp = getSegValStr(ibp, wbp, displctsize);
        !           566:                wbp = getASCIIdisplcmtStr(wbp, 'd', SIGNED, s, deltaVal, val);
        !           567: 
        !           568:                wbp = (char *)strcpy(wbp, modRMtab[ADDRINDEX(RM32)][sb]);
        !           569:                wbp = (char *)strchr(wbp, '\0');
        !           570:                break;
        !           571:        case 2:
        !           572:                wbp = getSegPreStr(wbp);
        !           573: 
        !           574:                val = getVal(s, ibp, displctsize, SIGNED, ADDZERO, &deltaVal);
        !           575:                wbp = getSegValStr(ibp, wbp, displctsize);
        !           576:                wbp = getASCIIdisplcmtStr(wbp, 'd', SIGNED, s, deltaVal, val);
        !           577: 
        !           578:                wbp = (char *)strcpy(wbp, modRMtab[ADDRINDEX(RM32)][sb]);
        !           579:                wbp = (char *)strchr(wbp, '\0');
        !           580:                break;
        !           581:        }
        !           582:        if (sibtab[sss][sx] != NULL) {
        !           583:                wbp = (char *)strcpy(wbp, sibtab[sss][sx]);
        !           584:                wbp = (char *)strchr(wbp, '\0');
        !           585:        }
        !           586:        return(wbp);
        !           587: }
        !           588: 
        !           589: unsigned long
        !           590: getVal(s, ibp, mysizeof, signedVal, addVal, deltaValp)
        !           591: int            s;
        !           592: unsigned char  *ibp;
        !           593: unsigned char  mysizeof, signedVal;
        !           594: unsigned char  addVal;
        !           595: long           *deltaValp;
        !           596: {
        !           597:        unsigned char   nbytes;
        !           598:        unsigned long   val;
        !           599: 
        !           600:        if ( (nbytes = getValData(s, ibp, signedVal, mysizeof)) == 0)
        !           601:                return(ADDZERO);
        !           602:        nbytes = check4prefix(mysizeof, nbytes);
        !           603:        val = evalValData(ibp, signedVal, nbytes, addVal, deltaValp);
        !           604:        return(val);
        !           605: }
        !           606: 
        !           607: unsigned short
        !           608: getValData(s, ibp, signedVal, mysizeof)
        !           609: int            s;
        !           610: unsigned char  *ibp, signedVal;
        !           611: unsigned char  mysizeof;
        !           612: {
        !           613:        unsigned char   nbytes, i;
        !           614: 
        !           615:        if ( (nbytes = getnbytes(mysizeof)) == 0 )
        !           616:                return(0);
        !           617: 
        !           618:        if ( (getb(s, ibp, nbytes)) == 0 ) {
        !           619:                printf("Unable to read opcode displacement or immediate data\n");
        !           620:                return (0);
        !           621:        }
        !           622: 
        !           623:        for (i=nbytes; i<MAXDISPLCTSIZE; i++) {
        !           624:                if (signedVal)
        !           625:                        ibp[i] = (ibp[i-1] & 0x80) ? 0xFF : 0;
        !           626:                else
        !           627:                        ibp[i] = 0;
        !           628:        }
        !           629:        return(nbytes);
        !           630: }
        !           631: 
        !           632: unsigned char
        !           633: check4prefix(mysizeof, nbytes)
        !           634: {
        !           635:        switch(mysizeof) {
        !           636:        case 'f':               /* 32 bit pointer */
        !           637:        case 'l':               /* 48 bit pointer */
        !           638:                nbytes -= 2;
        !           639:                break;
        !           640:        }
        !           641:        return(nbytes);
        !           642: }
        !           643: 
        !           644: unsigned long
        !           645: evalValData(ibp, signedVal, nbytes, addVal, deltaValp)
        !           646: unsigned char  *ibp;
        !           647: unsigned char  signedVal, nbytes;
        !           648: unsigned char  addVal;
        !           649: long           *deltaValp;
        !           650: {
        !           651:        unsigned long   baseVal, val;
        !           652: 
        !           653:        if (addVal)
        !           654:                baseVal = add;
        !           655:        else    baseVal = 0L;
        !           656: 
        !           657:        switch (nbytes) {
        !           658:                case DBBYTE:
        !           659:                        if (signedVal) {
        !           660:                                *deltaValp = *(signed char *)ibp;
        !           661:                                if ((signed long)*deltaValp >= 0)
        !           662:                                        val = baseVal + *deltaValp;
        !           663:                                else
        !           664:                                        val = baseVal   
        !           665:                                            - (unsigned long)
        !           666:                                                (-(signed long)*deltaValp);
        !           667:                        }
        !           668:                        else {
        !           669:                                *deltaValp = *(unsigned char *)ibp;
        !           670:                                val = baseVal + *deltaValp;
        !           671:                        }
        !           672:                        break;          
        !           673:                case DBWORD:
        !           674:                        if (signedVal) {
        !           675:                                *deltaValp = *(signed short *)ibp;
        !           676:                                if ((signed long)*deltaValp >= 0)
        !           677:                                        val = baseVal + *deltaValp;
        !           678:                                else
        !           679:                                        val = baseVal   
        !           680:                                            - (unsigned long)
        !           681:                                                (-(signed long)*deltaValp);
        !           682:                        }
        !           683:                        else {
        !           684:                                *deltaValp = *(unsigned short *)ibp;
        !           685:                                val = baseVal + *deltaValp;
        !           686:                        }
        !           687:                        break;          
        !           688:                case DBLONG:
        !           689:                        *deltaValp = *(long *)ibp;
        !           690:                        if (signedVal) {
        !           691:                                if ((signed long)*deltaValp >= 0)
        !           692:                                        val = baseVal + *deltaValp;
        !           693:                                else
        !           694:                                        val = baseVal   
        !           695:                                            - (unsigned long)
        !           696:                                                (-(signed long)*deltaValp);
        !           697:                        }
        !           698:                        else {
        !           699:                                val = baseVal + *deltaValp;
        !           700:                        }
        !           701:                        break;          
        !           702:        }       
        !           703:        return(val);
        !           704: }
        !           705: 
        !           706: char   *
        !           707: getSegValStr(ibp, wbp, mysizeof)
        !           708: unsigned char  *ibp;
        !           709: char           *wbp;
        !           710: unsigned char  mysizeof;
        !           711: {
        !           712:        unsigned char   nbytes;
        !           713: 
        !           714:        nbytes = getnbytes(mysizeof);
        !           715: 
        !           716:        switch(mysizeof) {
        !           717:        case 'f':               /* 32 bit pointer */
        !           718:        case 'l':               /* 48 bit pointer */
        !           719:                sprintf(wbp, "0x%02x%02x:", ibp[nbytes-1], ibp[nbytes-2]);
        !           720:                wbp = (char *)strchr(wbp, '\0');
        !           721:                break;
        !           722:        }
        !           723:        return(wbp);
        !           724: }
        !           725: 
        !           726: char   *
        !           727: getASCIIimmediateStr(wbp, form, signedVal, segn, deltaVal, val, mysizeof)
        !           728: char           *wbp;
        !           729: unsigned char  form, signedVal;
        !           730: int            segn;
        !           731: signed long    deltaVal;
        !           732: unsigned long  val;
        !           733: unsigned char  mysizeof;
        !           734: {
        !           735:        switch (getnbytes(mysizeof)) {
        !           736:        case DBBYTE:
        !           737:                val &= 0xFF;
        !           738:                break;
        !           739:        case DBWORD:
        !           740:                val &= 0xFFFF;
        !           741:                break;
        !           742:        }
        !           743:        getASCIIdisplcmtStr(wbp, form, signedVal, segn, deltaVal, val);
        !           744: }
        !           745: 
        !           746: char   *
        !           747: getASCIIdisplcmtStr(wbp, form, signedVal, segn, deltaVal, val)
        !           748: char           *wbp;
        !           749: unsigned char  form, signedVal;
        !           750: int            segn;
        !           751: signed long    deltaVal;
        !           752: unsigned long  val;
        !           753: {
        !           754:        if (signedVal && deltaVal<0)
        !           755:                deltaVal = -deltaVal;
        !           756:        switch(form) {
        !           757:        case 'a':       /* print address */
        !           758:                if ( deltaVal > TOLSYM)         /* print out symbol, if possible */
        !           759:                        conaddr(wbp, segn, val, I);
        !           760:                else {                  /* Print out address in hex format */
        !           761:                        *wbp = '(';
        !           762:                        printaddr(wbp, val);
        !           763:                        wbp = (char *)strchr(wbp, '\0');
        !           764:                        *wbp = ')';
        !           765:                        *wbp = '\0';
        !           766:                }
        !           767:                break;
        !           768:        case 'd':                                       /* print decimal */
        !           769:                if (!val)
        !           770:                        break;
        !           771: /*             if (deltaVal > TOLSYM) {
        !           772:                        conaddr(wbp, segn, val, I);
        !           773:                }
        !           774:                else {
        !           775: */                     if (getopdsize()==OPD16) {
        !           776:                                sprintf(wbp, "%d", val);
        !           777:                        }
        !           778:                        else {
        !           779:                                sprintf(wbp, "%ld", val);
        !           780:                        }
        !           781: /*             }
        !           782: */             break;
        !           783:        case 's':       /* if available, print symbol; otherwise print address */
        !           784:                conaddr(wbp, segn, val, I);
        !           785:                break;
        !           786:        case 'x':                                       /* print hex */
        !           787: /*             if (deltaVal > TOLSYM) {
        !           788:                        conaddr(wbp, segn, val, I);
        !           789:                }
        !           790:                else {
        !           791: */                     if (getopdsize()==OPD16) {
        !           792:                                if (deltaVal > TOLHEX) {
        !           793:                                        sprintf(wbp, "0x%x", val);
        !           794:                                }
        !           795:                                else {
        !           796:                                        sprintf(wbp, "%d", val);
        !           797:                                }
        !           798:                        }
        !           799:                        else {
        !           800:                                if (deltaVal > TOLHEX) {
        !           801:                                        sprintf(wbp, "0x%lx", val);
        !           802:                                }
        !           803:                                else {
        !           804:                                        sprintf(wbp, "%ld", val);
        !           805:                                }
        !           806:                        }
        !           807: /*             }
        !           808: */             break;
        !           809:        default:
        !           810:                if(1) printf("invalid form = %c;  ", form);
        !           811:        }
        !           812: 
        !           813:        wbp = (char *)strchr(wbp, '\0');
        !           814:        return(wbp);
        !           815: }
        !           816: 
        !           817: printaddr(wbp, v)
        !           818: char           *wbp;
        !           819: unsigned long  v;
        !           820: {
        !           821:        if (getopdsize()==OPD16) {
        !           822:                sprintf(wbp, "%04x", v);
        !           823:        }
        !           824:        else {
        !           825:                sprintf(wbp, "%04X", v);
        !           826:        }
        !           827: }
        !           828: 
        !           829: char *
        !           830: getSegPreStr(wbp)
        !           831: char   *wbp;
        !           832: {
        !           833:        if (segflag) {
        !           834:                strcpy(wbp, segPreStrp);
        !           835:                wbp = (char *)strchr(wbp, '\0');
        !           836:        }
        !           837:        return(wbp);
        !           838: }
        !           839: 
        !           840: unsigned char c2opdsizeAdj(c2)
        !           841: unsigned char c2;
        !           842: {
        !           843:        if (getopdsize()==RM16) {
        !           844:                switch(c2) {                    /* set to addr16 lengths */
        !           845:                case 'a':
        !           846:                        c2 = 'w';
        !           847:                        break;
        !           848:                case 'p':
        !           849:                        c2 = 'f';
        !           850:                        break;
        !           851:                case 'v':
        !           852:                        c2 = 'w';
        !           853:                        break;
        !           854:                }
        !           855:        }
        !           856:        else {
        !           857:                switch(c2) {                    /* set to addr32 lengths */
        !           858:                case 'a':
        !           859:                        c2 = 'd';
        !           860:                        break;
        !           861:                case 'p':
        !           862:                        c2 = 'l';
        !           863:                        break;
        !           864:                case 'v':
        !           865:                        c2 = 'd';
        !           866:                        break;
        !           867:                }
        !           868:        }
        !           869:        return(c2);
        !           870: }
        !           871: 
        !           872: unsigned char
        !           873: getnbytes(mysizeof)
        !           874: unsigned char mysizeof;
        !           875: {
        !           876:        unsigned char nbytes;
        !           877: 
        !           878:        switch(mysizeof) {
        !           879:        case 'b':
        !           880:                nbytes = DBBYTE;
        !           881:                break;
        !           882:        case 'd':
        !           883:                nbytes = DBLONG;
        !           884:                break;
        !           885:        case 'f':
        !           886:                nbytes = DBPTR32;
        !           887:                break;
        !           888:        case 'l':
        !           889:                nbytes = DBPTR48;
        !           890:                break;
        !           891:        case 'w':
        !           892:                nbytes = DBWORD;
        !           893:                break;
        !           894:        case '\0':
        !           895:                nbytes = 0;
        !           896:                break;
        !           897:        default:
        !           898:                if(1) printf("invalid nbytes = %c;  "
        !           899:                        "a 1 byte size is chosen by default\n"
        !           900:                        , mysizeof);
        !           901:                nbytes = DBBYTE;
        !           902:        }
        !           903:        return(nbytes);
        !           904: }
        !           905: 
        !           906: unsigned char
        !           907: getgenRegIndex(c2)
        !           908: unsigned char  c2;
        !           909: {
        !           910:        unsigned char genRegIndex;
        !           911: 
        !           912:        switch(c2) {
        !           913:        case 'a':
        !           914:                if (getopdsize() == OPD16)
        !           915:                        genRegIndex = 1;
        !           916:                else
        !           917:                        genRegIndex = 2;
        !           918:                break;
        !           919:        case 'b':
        !           920:                genRegIndex = 0;
        !           921:                break;
        !           922:        case 'd':
        !           923:                genRegIndex = 2;
        !           924:                break;
        !           925:        case 'v':
        !           926:                if (getopdsize() == OPD16)
        !           927:                        genRegIndex = 1;
        !           928:                else
        !           929:                        genRegIndex = 2;
        !           930:                break;
        !           931:        case 'w':
        !           932:                genRegIndex = 1;
        !           933:                break;
        !           934:        default:
        !           935:                if(1) printf("invalid c2 = %c;  "
        !           936:                        "a 1 byte reg is shown by default\n"
        !           937:                        , c2);
        !           938:                genRegIndex = 0;
        !           939:        }
        !           940:        return(genRegIndex);
        !           941: }
        !           942: 
        !           943: getaddrsize()
        !           944: {
        !           945:        return( addrflag ? 48 - hdrinfo.defsegatt : hdrinfo.defsegatt );
        !           946: }
        !           947: 
        !           948: getopdsize()
        !           949: {
        !           950:        return( opdflag ? 48 - hdrinfo.defsegatt : hdrinfo.defsegatt );
        !           951: }
        !           952: 
        !           953: getmodRM(s, ibp, c)
        !           954: unsigned char  *ibp;
        !           955: unsigned       c;
        !           956: {
        !           957:        if (!modRMloaded) {
        !           958:                if (getb(s, ibp, c) == 0)
        !           959:                        return (NULL);
        !           960:                m = mod(ibp[0]);
        !           961:                mRM = modRM(ibp[0]);
        !           962:                mReg = modR(ibp[0]);
        !           963:                modRMloaded = 1;
        !           964:        }
        !           965: }
        !           966: 
        !           967: getsib(s, ibp, c)
        !           968: unsigned char  *ibp;
        !           969: unsigned       c;
        !           970: {
        !           971:        if (!sibLoaded) {
        !           972:                if ((getb(s, ibp, c)) == 0)
        !           973:                        return (NULL);
        !           974:                sss = sibss(ibp[0]);
        !           975:                sx = sibx(ibp[0]);
        !           976:                sb = sibb(ibp[0]);
        !           977:                sibLoaded = 1;
        !           978:        }
        !           979: }
        !           980: 
        !           981: /*
        !           982:  * Given a size character, `t1', and a type, `t2', return the appropriate
        !           983:  * format string.
        !           984:  */
        !           985: char *
        !           986: getform(t1, t2)
        !           987: register int t1;
        !           988: register int t2;
        !           989: {
        !           990:        register char *cp;
        !           991:        register char *sp;
        !           992: 
        !           993:        if (t1=='f' || t1=='F')
        !           994:                return ("%g");
        !           995:        if (t1 == 'h')
        !           996:                t1 = 'w';
        !           997:        if ((cp=strchr(sp="bwlv", t1)) == NULL)
        !           998:                return ("?");
        !           999:        t1 = cp-sp;
        !          1000:        if ((cp=strchr(sp="duox", t2)) == NULL)
        !          1001:                return ("?");
        !          1002:        t2 = cp-sp;
        !          1003:        return (formtab[t1][t2]);
        !          1004: }
        !          1005: 
        !          1006: /* End of i8086b1.c */

unix.superglobalmegacorp.com

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