Annotation of 43BSDReno/contrib/emacs-18.55/gdb/vax-pinsn.c, revision 1.1.1.1

1.1       root        1: /* Print vax instructions for GDB, the GNU debugger.
                      2:    Copyright (C) 1986 Free Software Foundation, Inc.
                      3: 
                      4: GDB is distributed in the hope that it will be useful, but WITHOUT ANY
                      5: WARRANTY.  No author or distributor accepts responsibility to anyone
                      6: for the consequences of using it or for whether it serves any
                      7: particular purpose or works at all, unless he says so in writing.
                      8: Refer to the GDB General Public License for full details.
                      9: 
                     10: Everyone is granted permission to copy, modify and redistribute GDB,
                     11: but only under the conditions described in the GDB General Public
                     12: License.  A copy of this license is supposed to have been given to you
                     13: along with GDB so you can know your rights and responsibilities.  It
                     14: should be in a file named COPYING.  Among other things, the copyright
                     15: notice and this notice must be preserved on all copies.
                     16: 
                     17: In other words, go ahead and share GDB, but don't try to stop
                     18: anyone else from sharing it farther.  Help stamp out software hoarding!
                     19: */
                     20: 
                     21: #include <stdio.h>
                     22: 
                     23: #include "defs.h"
                     24: #include "param.h"
                     25: #include "symtab.h"
                     26: #include "opcode.h"
                     27: 
                     28: /* Vax instructions are never longer than this.  */
                     29: #define MAXLEN 62
                     30: 
                     31: /* Number of elements in the opcode table.  */
                     32: #define NOPCODES (sizeof votstrs / sizeof votstrs[0])
                     33: 
                     34: extern char *reg_names[];
                     35: 
                     36: static unsigned char *print_insn_arg ();
                     37: 
                     38: /* Print the vax instruction at address MEMADDR in debugged memory,
                     39:    on STREAM.  Returns length of the instruction, in bytes.  */
                     40: 
                     41: int
                     42: print_insn (memaddr, stream)
                     43:      CORE_ADDR memaddr;
                     44:      FILE *stream;
                     45: {
                     46:   unsigned char buffer[MAXLEN];
                     47:   register int i;
                     48:   register unsigned char *p;
                     49:   register char *d;
                     50: 
                     51:   read_memory (memaddr, buffer, MAXLEN);
                     52: 
                     53:   for (i = 0; i < NOPCODES; i++)
                     54:     if (votstrs[i].detail.code == buffer[0]
                     55:        || votstrs[i].detail.code == *(unsigned short *)buffer)
                     56:       break;
                     57: 
                     58:   /* Handle undefined instructions.  */
                     59:   if (i == NOPCODES)
                     60:     {
                     61:       fprintf (stream, "0%o", buffer[0]);
                     62:       return 1;
                     63:     }
                     64: 
                     65:   fprintf (stream, "%s", votstrs[i].name);
                     66: 
                     67:   /* Point at first byte of argument data,
                     68:      and at descriptor for first argument.  */
                     69:   p = buffer + 1 + (votstrs[i].detail.code >= 0x100);
                     70:   d = votstrs[i].detail.args;
                     71: 
                     72:   if (*d)
                     73:     fputc (' ', stream);
                     74: 
                     75:   while (*d)
                     76:     {
                     77:       p = print_insn_arg (d, p, memaddr + (p - buffer), stream);
                     78:       d += 2;
                     79:       if (*d)
                     80:        fprintf (stream, ",");
                     81:     }
                     82:   return p - buffer;
                     83: }
                     84: 
                     85: static unsigned char *
                     86: print_insn_arg (d, p, addr, stream)
                     87:      char *d;
                     88:      register char *p;
                     89:      CORE_ADDR addr;
                     90:      FILE *stream;
                     91: {
                     92:   register int regnum = *p & 0xf;
                     93:   float floatlitbuf;
                     94: 
                     95:   if (*d == 'b')
                     96:     {
                     97:       if (d[1] == 'b')
                     98:        fprintf (stream, "0x%x", addr + *p++ + 1);
                     99:       else
                    100:        {
                    101:          fprintf (stream, "0x%x", addr + *(short *)p + 2);
                    102:          p += 2;
                    103:        }
                    104:     }
                    105:   else
                    106:     switch ((*p++ >> 4) & 0xf)
                    107:       {
                    108:       case 0:
                    109:       case 1:
                    110:       case 2:
                    111:       case 3:                  /* Literal mode */
                    112:        if (d[1] == 'd' || d[1] == 'f' || d[1] == 'g' || d[1] == 'h')
                    113:          {
                    114:            *(int *)&floatlitbuf = 0x4000 + ((p[-1] & 0x3f) << 4);
                    115:            fprintf (stream, "$%f", floatlitbuf);
                    116:          }
                    117:        else
                    118:          fprintf (stream, "$%d", p[-1] & 0x3f);
                    119:        break;
                    120: 
                    121:       case 4:                  /* Indexed */
                    122:        p = (char *) print_insn_arg (d, p, addr + 1, stream);
                    123:        fprintf (stream, "[%s]", reg_names[regnum]);
                    124:        break;
                    125: 
                    126:       case 5:                  /* Register */
                    127:        fprintf (stream, reg_names[regnum]);
                    128:        break;
                    129: 
                    130:       case 7:                  /* Autodecrement */
                    131:        fputc ('-', stream);
                    132:       case 6:                  /* Register deferred */
                    133:        fprintf (stream, "(%s)", reg_names[regnum]);
                    134:        break;
                    135: 
                    136:       case 9:                  /* Autoincrement deferred */
                    137:        fputc ('@', stream);
                    138:        if (regnum == PC_REGNUM)
                    139:          {
                    140:            fputc ('#', stream);
                    141:            print_address (*(long *)p, stream);
                    142:            p += 4;
                    143:            break;
                    144:          }
                    145:       case 8:                  /* Autoincrement */
                    146:        if (regnum == PC_REGNUM)
                    147:          {
                    148:            fputc ('#', stream);
                    149:            switch (d[1])
                    150:              {
                    151:              case 'b':
                    152:                fprintf (stream, "%d", *p++);
                    153:                break;
                    154: 
                    155:              case 'w':
                    156:                fprintf (stream, "%d", *(short *)p);
                    157:                p += 2;
                    158:                break;
                    159: 
                    160:              case 'l':
                    161:                fprintf (stream, "%d", *(long *)p);
                    162:                p += 4;
                    163:                break;
                    164: 
                    165:              case 'q':
                    166:                fprintf (stream, "0x%x%08x", ((long *)p)[1], ((long *)p)[0]);
                    167:                p += 8;
                    168:                break;
                    169: 
                    170:              case 'o':
                    171:                fprintf (stream, "0x%x%08x%08x%08x",
                    172:                         ((long *)p)[3], ((long *)p)[2],
                    173:                         ((long *)p)[1], ((long *)p)[0]);
                    174:                p += 16;
                    175:                break;
                    176: 
                    177:              case 'f':
                    178:                if (INVALID_FLOAT (p, 4))
                    179:                  fprintf (stream, "<<invalid float 0x%x>>", *(int *) p);
                    180:                else
                    181:                  fprintf (stream, "%f", *(float *) p);
                    182:                p += 4;
                    183:                break;
                    184: 
                    185:              case 'd':
                    186:                if (INVALID_FLOAT (p, 8))
                    187:                  fprintf (stream, "<<invalid float 0x%x%08x>>",
                    188:                           ((long *)p)[1], ((long *)p)[0]);
                    189:                else
                    190:                  fprintf (stream, "%f", *(double *) p);
                    191:                p += 8;
                    192:                break;
                    193: 
                    194:              case 'g':
                    195:                fprintf (stream, "g-float");
                    196:                p += 8;
                    197:                break;
                    198: 
                    199:              case 'h':
                    200:                fprintf (stream, "h-float");
                    201:                p += 16;
                    202:                break;
                    203: 
                    204:              }
                    205:          }
                    206:        else
                    207:          fprintf (stream, "(%s)+", reg_names[regnum]);
                    208:        break;
                    209: 
                    210:       case 11:                 /* Byte displacement deferred */
                    211:        fputc ('@', stream);
                    212:       case 10:                 /* Byte displacement */
                    213:        if (regnum == PC_REGNUM)
                    214:          print_address (addr + *p + 2, stream);
                    215:        else
                    216:          fprintf (stream, "%d(%s)", *p, reg_names[regnum]);
                    217:        p += 1;
                    218:        break;
                    219: 
                    220:       case 13:                 /* Word displacement deferred */
                    221:        fputc ('@', stream);
                    222:       case 12:                 /* Word displacement */
                    223:        if (regnum == PC_REGNUM)
                    224:          print_address (addr + *(short *)p + 3, stream);
                    225:        else
                    226:          fprintf (stream, "%d(%s)", *(short *)p, reg_names[regnum]);
                    227:        p += 2;
                    228:        break;
                    229: 
                    230:       case 15:                 /* Long displacement deferred */
                    231:        fputc ('@', stream);
                    232:       case 14:                 /* Long displacement */
                    233:        if (regnum == PC_REGNUM)
                    234:          print_address (addr + *(long *)p + 5, stream);
                    235:        else
                    236:          fprintf (stream, "%d(%s)", *(long *)p, reg_names[regnum]);
                    237:        p += 4;
                    238:       }
                    239: 
                    240:   return (unsigned char *) p;
                    241: }

unix.superglobalmegacorp.com

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