You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

235 lines
5.8 KiB

/* Print instructions for Tahoe target machines, for GDB.
Copyright 1986, 1989, 1991, 1992 Free Software Foundation, Inc.
Contributed by the State University of New York at Buffalo, by the
Distributed Computer Systems Lab, Department of Computer Science, 1991.
36 years ago
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
36 years ago
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
36 years ago
#include "defs.h"
#include "symtab.h"
#include "opcode/tahoe.h"
36 years ago
/* Tahoe instructions are never longer than this. */
#define MAXLEN 62
/* Number of elements in the opcode table. */
#define NOPCODES (sizeof votstrs / sizeof votstrs[0])
static unsigned char *print_insn_arg ();
/* Print the Tahoe instruction at address MEMADDR in debugged memory,
on STREAM. Returns length of the instruction, in bytes. */
int
General cleanup and simplication of disassembler interface. * a29k-pinsn.c, arm-pinsn.c, convex-pinsn.c, gould-pinsn.c, hppa-pinsn.c, i386-pinsn.c, i960-pinsn.c, m68k-pinsn.c, m88k-pinsn.c, mips-pinsn.c, ns32k-pinsn.c, pyr-pinsn.c, rs6000-pinsn.c, sparc-pinsn.c, tahoe-pinsn.c, vax-pinsn.c: Remove. * gould-tdep.c, ns32k-tdep.c, tahoe-tdep.c, vax-tdep.c: New files, had been -pinsn.c files. * Makefile.in (ALLDEPFILES): Remove removed files. (a29k-pinsn.o, arm-pinsn.o, convex-pinsn.o, gould-pinsn.o, hppa-pinsn.o, i386-pinsn.o, i960-pinsn.o, m68k-pinsn.o, m88k-pinsn.o, mips-pinsn.o, ns32k-pinsn.o, pyr-pinsn.o, rs6000-pinsn.o, sparc-pinsn.o, tahoe-pinsn.o, vax-pinsn.o): Remove compile actions. * arm-tdep.o, gould-tdep.o, ns32k-tdep.o, tahoe-tdep.o, vax-tdep.o: Add compile actions. * defs.h (tm_print_insn): New global. * a29k-tdep.c (gdb_print_insn_a29k): New function. (_initialize_a29k_tdep): Rename from _initialize_29k, set tm_print_insn. * alpha-tdep.c (print_insn): Remove. (_initialize_alpha_tdep): Set tm_print_insn. * arm-tdep.c (arm_print_insn): New function, was print_insn in arm-pinsn.c. * convex-tdep.c (convex_print_insn): New function, was print_insn in convex-pinsn.c. * h8300-tdep.c (print_insn): Remove. (gdb_print_insn_h8300): New function. (_initialize_h8300_tdep): New function. * h8500-tdep.c (print_insn): Remove. (_initialize_h8500_tdep): New function. * hppa-tdep.c (_initialize_hppa_tdep): Set tm_print_insn. * i386-tdep.c (_initialize_i386_tdep): New function. * i960-tdep.c (mem, next_insn): New functions, were in i960-pinsn.c. (_initialize_i960_tdep): Set tm_print_insn. * m68k-tdep.c (_initialize_m68k_tdep): New function. * m88k-tdep.c (_initialize_m88k_tdep): New function. * mips-tdep.c (gdb_print_insn_mips): New function. (_initialize_mips_tdep): Set tm_print_insn. * pyr-tdep.c (pyr_print_insn): New function, was print_insn in pyr-pinsn.c. * rs6000-tdep.c (_initialize_rs6000_tdep): New function. * sh-tdep.c (print_insn): Remove. (gdb_print_insn_sh): New function. (_initialize_sh_tdep): Set tm_print_insn. * sparc-tdep.c (_initialize_sparc_tdep): New function. * w65-tdep.c (print_insn): Remove. (_initialize_w65_tdep): New function. * z8k-tdep.c (print_insn): Remove. (gdb_print_insn_z8k): New function. (_initialize_z8k_tdep): Set tm_print_insn. * printcmd.c (print_insn): New function, generic disassembler. * config/*/*.mt (TDEPFILES): Remove refs to *-pinsn.o. * defs.h (query_hook, error_hook): Fix prototypes.
32 years ago
tahoe_print_insn (memaddr, stream)
36 years ago
CORE_ADDR memaddr;
GDB_FILE *stream;
36 years ago
{
unsigned char buffer[MAXLEN];
register int i;
register unsigned char *p;
register char *d;
read_memory (memaddr, buffer, MAXLEN);
for (i = 0; i < NOPCODES; i++)
if (votstrs[i].detail.code == buffer[0]
|| votstrs[i].detail.code == *(unsigned short *)buffer)
break;
/* Handle undefined instructions. */
if (i == NOPCODES)
{
fprintf_unfiltered (stream, "0%o", buffer[0]);
36 years ago
return 1;
}
fprintf_unfiltered (stream, "%s", votstrs[i].name);
36 years ago
/* Point at first byte of argument data,
and at descriptor for first argument. */
p = buffer + 1 + (votstrs[i].detail.code >= 0x100);
d = votstrs[i].detail.args;
if (*d)
fputc_unfiltered ('\t', stream);
36 years ago
while (*d)
{
p = print_insn_arg (d, p, memaddr + (p - buffer), stream);
d += 2;
if (*d)
fprintf_unfiltered (stream, ",");
36 years ago
}
return p - buffer;
}
/*******************************************************************/
static unsigned char *
print_insn_arg (d, p, addr, stream)
char *d;
register char *p;
CORE_ADDR addr;
GDB_FILE *stream;
36 years ago
{
int temp1 = 0;
register int regnum = *p & 0xf;
float floatlitbuf;
if (*d == 'b')
{
if (d[1] == 'b')
fprintf_unfiltered (stream, "0x%x", addr + *p++ + 1);
36 years ago
else
{
temp1 = *p;
temp1 <<= 8;
temp1 |= *(p + 1);
fprintf_unfiltered (stream, "0x%x", addr + temp1 + 2);
36 years ago
p += 2;
}
}
else
switch ((*p++ >> 4) & 0xf)
{
case 0:
case 1:
case 2:
case 3: /* Literal (short immediate byte) mode */
36 years ago
if (d[1] == 'd' || d[1] == 'f' || d[1] == 'g' || d[1] == 'h')
{
*(int *)&floatlitbuf = 0x4000 + ((p[-1] & 0x3f) << 4);
fprintf_unfiltered (stream, "$%f", floatlitbuf);
36 years ago
}
else
fprintf_unfiltered (stream, "$%d", p[-1] & 0x3f);
36 years ago
break;
case 4: /* Indexed */
p = (char *) print_insn_arg (d, p, addr + 1, stream);
fprintf_unfiltered (stream, "[%s]", reg_names[regnum]);
36 years ago
break;
case 5: /* Register */
fprintf_unfiltered (stream, reg_names[regnum]);
36 years ago
break;
case 7: /* Autodecrement */
fputc_unfiltered ('-', stream);
36 years ago
case 6: /* Register deferred */
fprintf_unfiltered (stream, "(%s)", reg_names[regnum]);
36 years ago
break;
case 9: /* Absolute Address & Autoincrement deferred */
fputc_unfiltered ('*', stream);
36 years ago
if (regnum == PC_REGNUM)
{
temp1 = *p;
temp1 <<= 8;
temp1 |= *(p +1);
fputc_unfiltered ('$', stream);
36 years ago
print_address (temp1, stream);
p += 4;
break;
}
case 8: /*Immediate & Autoincrement SP */
if (regnum == 8) /*88 is Immediate Byte Mode*/
fprintf_unfiltered (stream, "$%d", *p++);
36 years ago
else if (regnum == 9) /*89 is Immediate Word Mode*/
{
temp1 = *p;
temp1 <<= 8;
temp1 |= *(p +1);
fprintf_unfiltered (stream, "$%d", temp1);
36 years ago
p += 2;
}
else if (regnum == PC_REGNUM) /*8F is Immediate Long Mode*/
{
temp1 = *p;
temp1 <<=8;
temp1 |= *(p +1);
temp1 <<=8;
temp1 |= *(p +2);
temp1 <<= 8;
temp1 |= *(p +3);
fprintf_unfiltered (stream, "$%d", temp1);
36 years ago
p += 4;
}
else /*8E is Autoincrement SP Mode*/
fprintf_unfiltered (stream, "(%s)+", reg_names[regnum]);
36 years ago
break;
case 11: /* Register + Byte Displacement Deferred Mode*/
fputc_unfiltered ('*', stream);
36 years ago
case 10: /* Register + Byte Displacement Mode*/
if (regnum == PC_REGNUM)
print_address (addr + *p + 2, stream);
else
fprintf_unfiltered (stream, "%d(%s)", *p, reg_names[regnum]);
36 years ago
p += 1;
break;
case 13: /* Register + Word Displacement Deferred Mode*/
fputc_unfiltered ('*', stream);
36 years ago
case 12: /* Register + Word Displacement Mode*/
temp1 = *p;
temp1 <<= 8;
temp1 |= *(p +1);
if (regnum == PC_REGNUM)
print_address (addr + temp1 + 3, stream);
else
fprintf_unfiltered (stream, "%d(%s)", temp1, reg_names[regnum]);
36 years ago
p += 2;
break;
case 15: /* Register + Long Displacement Deferred Mode*/
fputc_unfiltered ('*', stream);
36 years ago
case 14: /* Register + Long Displacement Mode*/
temp1 = *p;
temp1 <<= 8;
temp1 |= *(p +1);
temp1 <<= 8;
temp1 |= *(p +2);
temp1 <<= 8;
temp1 |= *(p +3);
if (regnum == PC_REGNUM)
print_address (addr + temp1 + 5, stream);
else
fprintf_unfiltered (stream, "%d(%s)", temp1, reg_names[regnum]);
36 years ago
p += 4;
}
return (unsigned char *) p;
}