Annotation of coherent/b/bin/db_400/i8086d.c, revision 1.1.1.1

1.1       root        1: /* $Header: /src386/bin/db/RCS/i8086d.c,v 1.4 93/03/11 07:45:48 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: #include <stdio.h>
                     17: #include <sys/param.h>
                     18: #include <l.out.h>
                     19: #include "trace.h"
                     20: #include "i8086.h"
                     21: 
                     22: 
                     23: /* 
                     24:  * Legend to characters following "%" tokens in strings - Taken from intel
                     25:  * 386 "Programmer's Reference Manual".
                     26:  */
                     27: 
                     28: /*     First char after '%'; see also 2nd char, general case below:
                     29:                A - direct address
                     30:                C - reg of r/m selects control register
                     31:                D - reg of r/m selects debug register
                     32:                E - modR/M selects operand
                     33:                F - flags register
                     34:                G - reg field of modR/M selects general register
                     35:                I - immediate data
                     36:                J - relative offset added to IP
                     37:                K - as J, except find symbol, if possible
                     38:                M - modR/M selects memory only
                     39:                O - no modR/M byte; offset only
                     40:                R - mod field of modR/M selects register only
                     41:                S - reg field of modR/M selects segment register
                     42:                T - reg feild of modR/M selects test register
                     43:                X - memory addressed by DS:ESI
                     44:                Y - memory addressed by ES:EDI
                     45:                Z - assembler instruction mneumonic size qualifier
                     46:                2 - prefix of two-byte opcode
                     47: 
                     48:        For the following first characters after the %, the second after the %
                     49:        has a special meaning associated with it:
                     50:                e - put in 'e' if address size attribute = 32 
                     51:                        - second char is part of reg name
                     52:                f - floating point 
                     53:                        - second char is esc value
                     54:                g - REG/OPCODE field of the modR/M byte is interpreted as
                     55:                    additional opcode; it is used as an index to a
                     56:                    column in the 2-d group array (grp[][])
                     57:                        - second character yields the group number, i.e., it 
                     58:                          is used as an index to a row in grp[][]  
                     59:                r - read next n bytes, but don't do anything with them; n is 
                     60:                    given by 2nd char and meaning conforms with general case
                     61:                s - size override:
                     62:                        - second char has following meanings:
                     63:                                "a" - address size override
                     64:                                "o" - operand size override
                     65: 
                     66:        Second char after '%', the general case:
                     67:                a - two words or dwords in memory (BOUND)
                     68:                b - byte
                     69:                d - dword
                     70:                f - 32 bit pointer
                     71:                l - 48 bit pointer
                     72:                p - 32 or 48 bit pointer
                     73:                s - six byte pseudo-descriptor
                     74:                v - word or dword
                     75:                w - word
                     76:                z - r/m16: append 'w' to assem. nmeumonic
                     77:                  - r/m32: append 'w' to assem. nmeumonic if operand size = 16,
                     78:                           append 'l' to assem. nmeumonic if operand size = 32
                     79: !!!!!!!!!!!
                     80:                F - use floating regs in mod/rm
                     81:                1-8 - group number
                     82: */
                     83: 
                     84: char *opStrMap1[] = {
                     85:        /* 0 */
                     86:        "add%Zb %Eb,%Gb", "add%Zv %Ev,%Gv", "add%Zb %Gb,%Eb", "add%Zv %Gv,%Ev",
                     87:        "add%Zb al,%Ib", "add%Zv %eax,%Iv", "pushw es", "popw es",
                     88:        "or%Zb %Eb,%Gb", "or%Zv %Ev,%Gv", "or%Zb %Gb,%Eb", "or%Zv %Gv,%Ev",
                     89:        "or%Zb al,%Ib", "or%Zv %eax,%Iv", "pushw cs", "%2 ",
                     90: 
                     91:        /* 1 */
                     92:        "adc%Zb %Eb,%Gb", "adc%Zv %Ev,%Gv", "adc%Zb %Gb,%Eb", "adc%Zv %Gv,%Ev",
                     93:        "adc%Zb al,%Ib", "adc%Zv %eax,%Iv", "pushw ss", "popw ss",
                     94:        "sbb%Zb %Eb,%Gb", "sbb%Zv %Ev,%Gv", "sbb%Zb %Gb,%Eb", "sbb%Zv %Gv,%Ev",
                     95:        "sbb%Zb al,%Ib", "sbb%Zv %eax,%Iv", "pushw ds", "popw ds",
                     96: 
                     97:        /* 2 */
                     98:        "and%Zb %Eb,%Gb", "and%Zv %Ev,%Gv", "and%Zb %Gb,%Eb", "and%Zv %Gv,%Ev",
                     99:        "and%Zb al,%Ib", "and%Zv %eax,%Iv", "es:", "daa",
                    100:        "sub%Zb %Eb,%Gb", "sub%Zv %Ev,%Gv", "sub%Zb %Gb,%Eb", "sub%Zv %Gv,%Ev",
                    101:        "sub%Zb al,%Ib", "sub%Zv %eax,%Iv", "cs:", "das",
                    102: 
                    103:        /* 3 */
                    104:        "xor%Zb %Eb,%Gb", "xor%Zv %Ev,%Gv", "xor%Zb %Gb,%Eb", "xor%Zv %Gv,%Ev",
                    105:        "xor%Zb al,%Ib", "xor%Zv %eax,%Iv", "ss:", "aaa",
                    106:        "cmp%Zb %Eb,%Gb", "cmp%Zv %Ev,%Gv", "cmp%Zb %Gb,%Eb", "cmp%Zv %Gv,%Ev",
                    107:        "cmp%Zb al,%Ib", "cmp%Zv %eax,%Iv", "ds:", "aas",
                    108: 
                    109:        /* 4 */
                    110:        "inc%Zv %eax", "inc%Zv %ecx", "inc%Zv %edx", "inc%Zv %ebx",
                    111:        "inc%Zv %esp", "inc%Zv %ebp", "inc%Zv %esi", "inc%Zv %edi",
                    112:        "dec%Zv %eax", "dec%Zv %ecx", "dec%Zv %edx", "dec%Zv %ebx",
                    113:        "dec%Zv %esp", "dec%Zv %ebp", "dec%Zv %esi", "dec%Zv %edi",
                    114: 
                    115:        /* 5 */
                    116:        "push%Zv %eax", "push%Zv %ecx", "push%Zv %edx", "push%Zv %ebx",
                    117:        "push%Zv %esp", "push%Zv %ebp", "push%Zv %esi", "push%Zv %edi",
                    118:        "pop%Zv %eax", "pop%Zv %ecx", "pop%Zv %edx", "pop%Zv %ebx",
                    119:        "pop%Zv %esp", "pop%Zv %ebp", "pop%Zv %esi", "pop%Zv %edi",
                    120: 
                    121:        /* 6 */
                    122:        "pusha%Zv", "popa%Zv", "bound%Zv %Gv,%Ma", "arpl %Ew,%Gw",
                    123:        "fs:", "gs:", "%so", "%sa",
                    124:        "push%Zv %Iv", "imul%Zv %Gv=%Ev*%Iv", "push%Zb %Ib", "imul%Zv %Gv=%Ev*%Ib",
                    125:        "ins%Zb %Yb", "ins%Zv %Yv", "outs%Zb %Xb", "outs%Zv %Xv",
                    126: 
                    127:        /* 7 */
                    128:        "jo %Jb", "jno %Jb", "jb %Jb", "jae %Jb",
                    129:        "je %Jb", "jne %Jb", "jbe %Jb", "ja %Jb",
                    130:        "js %Jb", "jns %Jb", "jp %Jb", "jnp %Jb",
                    131:        "jl %Jb", "jge %Jb", "jle %Jb", "jg %Jb",
                    132: 
                    133:        /* 8 */
                    134:        "%g1%Zb %Eb,%Ib", "%g1%Zv %Ev,%Iv", "mov%Zb al,%Ib", "%g1%Zv %Ev,%Ib",
                    135:        "test%Zb %Eb,%Gb", "test%Zv %Ev,%Gv", "xchg%Zb %Eb,%Gb", "xchg%Zv %Ev,%Gv",
                    136:        "mov%Zb %Eb,%Gb", "mov%Zv %Ev,%Gv", "mov%Zb %Gb,%Eb", "mov%Zv %Gv,%Ev",
                    137:        "mov%Zw %Ew,%Sw", "lea%Zv %Gv,%M ", "mov%Zw %Sw,%Ew", "pop%Zv %Ev",
                    138: 
                    139:        /* 9 */
                    140:        "nop", "xchg%Zv %eax,%ecx", "xchg%Zv %eax,%edx", "xchg%Zv %eax,%ebx",
                    141:        "xchg%Zv %eax,%esp", "xchg%Zv %eax,%ebp", 
                    142:                                        "xchg%Zv %eax,%esi", "xchg%Zv %eax,%edi",
                    143:        "cbw", "cwd", "lcall %Ap", "fwait",
                    144:        "pushf%Zv", "popf%Zv", "sahf", "lahf",
                    145: 
                    146:        /* A */
                    147:        "mov%Zb al,%Ob", "mov%Zv %eax,%Ov", "mov%Zb %Ob,al", "mov%Zv %Ov,%eax",
                    148:        "movs%Zb %Xb%Yb", "movs%Zz %Xv%Yv", "cmps%Zb %Xb%Yb", "cmps%Zz %Xv%Yv",
                    149:        "test%Zb al,%Ib", "test%Zv %eax,%Iv", "stos%Zb %Yb", "stos%Zz %Yv",
                    150:        "lods%Zb %Xb", "lods%Zz %Xv", "scas%Zb %Xb", "scas%Zv %Xv",
                    151: 
                    152:        /* B */
                    153:        "mov%Zb al,%Ib", "mov%Zb cl,%Ib", "mov%Zb dl,%Ib", "mov%Zb bl,%Ib",
                    154:        "mov%Zb ah,%Ib", "mov%Zb ch,%Ib", "mov%Zb dh,%Ib", "mov%Zb bh,%Ib",
                    155:        "mov%Zv %eax,%Iv", "mov%Zv %ecx,%Iv", "mov%Zv %edx,%Iv", "mov%Zv %ebx,%Iv",
                    156:        "mov%Zv %esp,%Iv", "mov%Zv %ebp,%Iv", "mov%Zv %esi,%Iv", "mov%Zv %edi,%Iv",
                    157: 
                    158:        /* C */
                    159:        "%g2%Zb %Eb,%Ib", "%g2%Zv %Ev,%Ib", "ret %Iw", "ret",
                    160:        "les%Zv %Gv,%Mp", "lds%Zv %Gv,%Mp", "mov%Zb %Eb,%Ib", "mov%Zv %Ev,%Iv",
                    161:        "enter %Iw,%Ib", "leave", "lret %Iw", "lret",
                    162:        "int 3", "int %Ib", "into", "iret",
                    163: 
                    164:        /* D */
                    165:        "%g2%Zb %Eb,$1", "%g2%Zv %Ev,$1", "%g2%Zb %Eb,cl", "%g2%Zv %Ev,cl",
                    166:        "aam %rb", "aad %rb", NULL, "xlat",
                    167: #if 0
                    168:        "esc 0,%Ib", "esc 1,%Ib", "esc 2,%Ib", "esc 3,%Ib",
                    169:        "esc 4,%Ib", "esc 5,%Ib", "esc 6,%Ib", "esc 7,%Ib",
                    170: #else
                    171:        "%f0", "%f1", "%f2", "%f3",
                    172:        "%f4", "%f5", "%f6", "%f7",
                    173: #endif
                    174: 
                    175:        /* E */
                    176:        "loopne %Jb", "loope %Jb", "loop %Jb", "jcxz %Jb",
                    177:        "in%Zb %Ib", "in%Zv %Ib", "out%Zb %Ib,al", "out%Zv %Ib,%eax",
                    178:        "call %Kv", "jmp %Jv", "ljmp %Ap", "jmp %Jb",
                    179:        "in%Zb ", "in%Zv ", "out%Zb dx,al", "out%Zv dx,%eax",
                    180: 
                    181:        /* F */
                    182:        "lock", NULL, "repne", "rep",
                    183:        "hlt", "cmc", "%g3", "%g0",
                    184:        "clc", "stc", "cli", "sti",
                    185:        "cld", "std", "%g4", "%g5"
                    186: };
                    187: 
                    188: /******************************************************************************/
                    189: char *opStrMap2[] = {
                    190:        /* 0 */
                    191:        "%g6", "%g7", "lar%Zv %Gv,%Ew", "lsl%Zv %Gv,%Ew", 
                    192:        NULL, NULL, "clts", NULL,
                    193:        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                    194: 
                    195:        /* 1 */
                    196:        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                    197:        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                    198: 
                    199:        /* 2 */
                    200:        "mov%Zd %Rd,%Cd", "mov%Zd %Rd,%Dd", "mov%Zd %Cd,%Rd", "mov%Zd %Dd,%Rd",
                    201:        "mov%Zd %Rd,%Td", NULL, "mov%Zd %Td,%Rd", NULL,
                    202:        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                    203: 
                    204:        /* 3 */
                    205:        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                    206:        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                    207: 
                    208:        /* 4 */
                    209:        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                    210:        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                    211: 
                    212:        /* 5 */
                    213:        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                    214:        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                    215: 
                    216:        /* 6 */
                    217:        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                    218:        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                    219: 
                    220:        /* 7 */
                    221:        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                    222:        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                    223: 
                    224:        /* 8 */
                    225:        "jo %Jv", "jno %Jv", "jb %Jv", "jae %Jv",
                    226:        "je %Jv", "jne %Jv", "jbe %Jv", "ja %Jv",
                    227:        "js %Jv", "jns %Jv", "jp %Jv", "jnp %Jv",
                    228:        "jl %Jv", "jge %Jv", "jle %Jv", "jg %Jv",
                    229: 
                    230:        /* 9 */
                    231:        "seto %Eb", "setno %Eb", "setb %Eb", "setae %Eb",
                    232:        "sete %Eb", "setne %Eb", "setbe %Eb", "seta %Eb",
                    233:        "sets %Eb", "setns %Eb", "setp %Eb", "setnp %Eb",
                    234:        "setl %Eb", "setge %Eb", "setle %Eb", "setg %Eb",
                    235: 
                    236:        /* A */
                    237:        "pushw fs", "popw fs", NULL, "bt%Zv %Ev,%Gv",
                    238:        "shld%Zv %Ev,%Gv,%Ib", "shld%Zv %Ev,%Gv,cl", NULL, NULL,
                    239:        "pushw gs", "popw gs", NULL, "bts%Zv %Ev,%Gv",
                    240:        "shrd%Zv %Ev,%Gv,%Ib", "shrd%Zv %Ev,%Gv,cl", NULL, "imul%Zv %Gv,%Ev",
                    241: 
                    242:        /* B */
                    243:        NULL, NULL, "lss%Zv %Mp", "btr%Zv %Ev,%Gv",
                    244:        "lfs%Zv %Mp", "lgs%Zv %Mp", "movzx%Zb %Gv,%Eb", "movzx%Zw %Gv,%Ew",
                    245:        NULL, NULL, "%g8%Zv %Ev,%Ib", "btc%Zv %Ev,%Gv",
                    246:        "bsf%Zv %Gv,%Ev", "bsr%Zv %Gv,%Ev", "movsx%Zb %Gv,%Eb", "movsx%Zw %Gv,%Ew",
                    247: 
                    248:        /* C */
                    249:        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                    250:        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                    251: 
                    252:        /* D */
                    253:        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                    254:        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                    255: 
                    256:        /* E */
                    257:        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                    258:        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                    259: 
                    260:        /* F */
                    261:        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                    262:        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
                    263: };
                    264: 
                    265: 
                    266: /******************************************************************************/
                    267: /*
                    268:  *     Intel groups 1 to 8: grpStrMap0[] is the %Ev case for grpStrMap3[]  
                    269:  */
                    270: 
                    271: char   *grpStrMap0[] = 
                    272:        { "test%Zv %Ev,%Iv", "test%Zv %Ev,%Iv,", "not%Zv %Ev", "neg%Zv %Ev",
                    273:        "mul%Zv %eax,%Ev", "imul%Zv %eax,%Ev", "div%Zv %eax,%Ev", "idiv%Zv %eax,%Ev" };
                    274: 
                    275: /* grp[1][] */
                    276: char   *grpStrMap1[] = 
                    277:        { "add", "or", "adc", "sbb", "and", "sub", "xor", "cmp" };
                    278: 
                    279: /* grp[2][] */
                    280: char   *grpStrMap2[] = 
                    281:        { "rol", "ror", "rcl", "rcr", "shl", "shr", "shl", "sar" };
                    282: 
                    283: /* grp[3][] */
                    284: char   *grpStrMap3[] = 
                    285:        { "test%Zb %Eb,%Ib", "test%Zb %Eb,%Ib,", "not%Zb %Eb", "neg%Zb %Eb",
                    286:          "mul%Zb al,%Eb", "imul%Zb al,%Eb", "div%Zb al,%Eb", "idiv%Zb al,%Eb" };
                    287: 
                    288: /* grp[4][] */
                    289: char   *grpStrMap4[] = 
                    290:        { "inc%Zb %Eb", "dec%Zb %Eb", NULL, NULL, NULL, NULL, NULL, NULL };
                    291: 
                    292: /* grp[5][] */
                    293: char   *grpStrMap5[] = 
                    294:        { "inc%Zv %Ev", "dec%Zv %Ev", "icall %Ev", "ilcall %Ep",
                    295:          "ijmp %Ev", "iljmp %Ep", "push%Zv %Ev", NULL };
                    296: 
                    297: /* grp[6][] */
                    298: char   *grpStrMap6[] = 
                    299:        { "sldt %Ew", "str %Ew", "lldt %Ew", "ltr %Ew",
                    300:          "verr %Ew", "verw %Ew", NULL, NULL };
                    301: 
                    302: /* grp[7][] */
                    303: char   *grpStrMap7[] = 
                    304:        { "sgdt %Ms", "sidt %Ms", "lgdt%Zv %Ms", "lidt%Zv %Ms",
                    305:          "smsw %Ew", NULL, "lmsw %Ew", NULL };
                    306: 
                    307: /* grp[8][] */
                    308: char   *grpStrMap8[] = 
                    309:        { NULL, NULL, NULL, NULL, "bt", "bts", "btr", "btc" };
                    310: 
                    311: char   **grpStrMap[] = { grpStrMap0, grpStrMap1, grpStrMap2, grpStrMap3,
                    312:                          grpStrMap4, grpStrMap5, grpStrMap6, grpStrMap7,
                    313:                          grpStrMap8 };
                    314: 
                    315: 
                    316: /******************************************************************************/
                    317: /* 
                    318:  * Define arrays of the various 80386 registers
                    319:  */
                    320: 
                    321: /* segment registers */
                    322: char   *segReg[NSEGREGS] = {"es", "cs", "ss", "ds", "fs", "gs"};
                    323: 
                    324: /* general registers */
                    325: char   *genReg8[] = {"%al", "%cl", "%dl", "%bl"
                    326:                                        , "%ah", "%ch", "%dh", "%bh"};
                    327: char   *genReg16[] = {"%ax", "%cx", "%dx", "%bx"
                    328:                                        , "%sp", "%bp", "%si", "%di"};
                    329: char   *genReg32[] = {"%eax", "%ecx", "%edx", "%ebx"
                    330:                                        , "%esp", "%ebp", "%esi", "%edi"};
                    331: char   **genReg[] = {genReg8, genReg16, genReg32};
                    332: 
                    333: /* control registers */
                    334: char *ctrlReg[NCTRLREGS] = {
                    335:        "%cr0", "%cr1", "%cr2", "%cr3"  
                    336: };
                    337: 
                    338: /* debug registers */
                    339: char *dbgReg[NDBGREGS] = {
                    340:        "%dr0", "%dr1", "%dr2", "%dr3", "%dr4", "%dr5", "%dr6", "%dr7"  
                    341: };
                    342: 
                    343: /* test registers */
                    344: char *tstReg[NTSTREGS] = {
                    345:        NULL, NULL, NULL, NULL, NULL, NULL, "%tr6", "%tr7"      
                    346: };
                    347: 
                    348: 
                    349: /******************************************************************************/
                    350: /*
                    351:  * Indirect mode tables (including indexing for the 16 bit addressing form)
                    352:  */
                    353: 
                    354: /* 16 bit indirect addressing forms with the ModR/M byte */
                    355: char   *modRMtab16[] = {
                    356:                "(%bx)(%si)", "(%bx)(%di)", "(%bp)(%si)", "(%bp)(%di)",
                    357:                "(%si)", "(%di)", "(%bp)", "(%bx)"                      
                    358: };
                    359: 
                    360: /* 32 bit indirect addressing forms with the ModR/M byte
                    361:    or indirect base addressing with the SIB byte */
                    362: char   *modRMtab32[] = {
                    363:                "(%eax)", "(%ecx)", "(%edx)", "(%ebx)", 
                    364:                "(%esp)", "(%ebp)", "(%esi)", "(%edi)"          
                    365: };
                    366: 
                    367: char **modRMtab[] = { modRMtab16, modRMtab32 };
                    368: 
                    369: /******************************************************************************/
                    370: /*
                    371:  * 32 bit indirect indexed addressing forms with the SIB byte 
                    372:  */
                    373: 
                    374: /* index multiplied by 1 */
                    375: char   *sibtab0[] = {
                    376:                "(%eax)", "(%ecx)", "(%edx)", "(%ebx)", 
                    377:                 NULL    , "(%ebp)", "(%esi)", "(%edi)" 
                    378: };
                    379: 
                    380: /* index multiplied by 2 */
                    381: char   *sibtab1[] = {
                    382:                "(%eax*2)", "(%ecx*2)", "(%edx*2)", "(%ebx*2)",
                    383:                 NULL      , "(%ebp*2)", "(%esi*2)", "(%edi*2)"
                    384: };
                    385: 
                    386: /* index multiplied by 4 */
                    387: char   *sibtab2[] = {
                    388:                "(%eax*4)", "(%ecx*4)", "(%edx*4)", "(%ebx*4)", 
                    389:                 NULL      , "(%ebp*4)", "(%esi*4)", "(%edi*4)"
                    390: };
                    391: 
                    392: /* index multiplied by 8 */
                    393: char   *sibtab3[] = {
                    394:                "(%eax*8)", "(%ecx*8)", "(%edx*8)", "(%ebx*8)", 
                    395:                 NULL      , "(%ebp*8)", "(%esi*8)", "(%edi*8)"
                    396: };
                    397: 
                    398: char   **sibtab[] = { sibtab0, sibtab1, sibtab2, sibtab3 };
                    399: 
                    400: /*
                    401:  * 8087 Instruction table.
                    402:  * The bits considered are the last 3 bits of the ESC
                    403:  * instruction and the next instruction byte.
                    404:  */
                    405: INS    fpinstab[] = {
                    406:        0x000, 0x138,   "fadd?",
                    407:        0x0C0, 0x1F8,   "fadd\tST(i)?",
                    408:        0x020, 0x130,   "fsubb?",
                    409:        0x0E0, 0x1F0,   "fsub\tST(i)?",
                    410:        0x008, 0x138,   "fmul?",
                    411:        0x0C8, 0x1F8,   "fmul\tST(i)?",
                    412:        0x030, 0x130,   "fdiv?",
                    413:        0x0F0, 0x1F0,   "fdiv\tST(i)?",
                    414:        0x1FA, 0x7FF,   "fsqrt",
                    415:        0x1FD, 0x7FF,   "fscale",
                    416:        0x1F8, 0x7FF,   "fprem",
                    417:        0x1FC, 0x7FF,   "frndint",
                    418:        0x1F4, 0x7FF,   "fxtract",
                    419:        0x1E1, 0x7FF,   "fabs",
                    420:        0x1E0, 0x7FF,   "fchs",
                    421:        0x1F2, 0x7FF,   "fptan",
                    422:        0x1F3, 0x7FF,   "fpatan",
                    423:        0x1F0, 0x7FF,   "f2xm1",
                    424:        0x1F1, 0x7FF,   "fyl2x",
                    425:        0x1F9, 0x7FF,   "fyl2p1",
                    426:        0x1EE, 0x7FF,   "fldz",
                    427:        0x1E8, 0x7FF,   "fld1",
                    428:        0x1EB, 0x7FF,   "fldpi",
                    429:        0x1E9, 0x7FF,   "fldl2t",
                    430:        0x1EA, 0x7FF,   "fldl2e",
                    431:        0x1EC, 0x7FF,   "fldlg2",
                    432:        0x1ED, 0x7FF,   "fldln2",
                    433:        0x3E3, 0x7FF,   "finit",
                    434:        0x3E0, 0x77FF,  "feni",
                    435:        0x3E1, 0x7FF,   "fdisi",
                    436:        0x128, 0x738,   "fldcw?",
                    437:        0x138, 0x738,   "fstcw?",
                    438:        0x538, 0x738,   "fstsw?",
                    439:        0x3E2, 0x7FF,   "fclex",
                    440:        0x130, 0x738,   "fstenv?",
                    441:        0x120, 0x738,   "fldenv?",
                    442:        0x530, 0x738,   "fsave?",
                    443:        0x520, 0x738,   "frstor?",
                    444:        0x1F7, 0x7FF,   "fincstp",
                    445:        0x1F6, 0x7FF,   "fdecstp",
                    446:        0x5C0, 0x7F8,   "ffree\tST(i)?",
                    447:        0x1D0, 0x7FF,   "fnop",
                    448:        0x00,   0x00,   NULL
                    449: };
                    450: 
                    451: /* end of i8086d1.c */

unix.superglobalmegacorp.com

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