* v850-opc.c (v850_operands): Add "SR1" and "SR2" for system
[deliverable/binutils-gdb.git] / opcodes / h8300-dis.c
index 4064158a6013786d025b538827312f5fb525573b..b3a9496d5c10767c4f15d82446748371eca42294 100644 (file)
@@ -13,7 +13,7 @@ GNU General Public License for more details.
 
 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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #define DEFINE_TABLE
 
@@ -64,10 +64,10 @@ bfd_h8_disassemble_init ()
 
 
 unsigned int
-bfd_h8_disassemble (addr, info, hmode)
+bfd_h8_disassemble (addr, info, mode)
      bfd_vma addr;
      disassemble_info *info;
-     int hmode;
+     int mode;
 {
   /* Find the first entry in the table for this opcode */
   static CONST char *regnames[] =
@@ -92,10 +92,11 @@ bfd_h8_disassemble (addr, info, hmode)
   int rd = 0;
   int rdisp = 0;
   int abs = 0;
+  int bit = 0;
   int plen = 0;
   static boolean init = 0;
   struct h8_opcode *q = h8_opcodes;
-  char CONST **pregnames = hmode ? lregnames : wregnames;
+  char CONST **pregnames = mode != 0 ? lregnames : wregnames;
   int status;
   int l;
   
@@ -233,6 +234,8 @@ bfd_h8_disassemble (addr, info, hmode)
                    case 0:
                      abs = 1;
                      break;
+                   default:
+                     goto fail;
                    }
                }
              else if (looking_for & L_8)
@@ -242,9 +245,12 @@ bfd_h8_disassemble (addr, info, hmode)
                }
              else if (looking_for & L_3)
                {
-                 plen = 3;
-             
-                 abs = thisnib;
+                 bit = thisnib & 0x7;
+               }
+             else if (looking_for & L_2)
+               {
+                 plen = 2;
+                 abs = thisnib & 0x3;
                }
              else if (looking_for == E)
                {
@@ -262,6 +268,30 @@ bfd_h8_disassemble (addr, info, hmode)
                      }
                  }
                  fprintf (stream, "%s\t", q->name);
+
+                 /* Gross.  Disgusting.  */
+                 if (strcmp (q->name, "ldm.l") == 0)
+                   {
+                     int count, high;
+
+                     count = (data[1] >> 4) & 0x3;
+                     high = data[3] & 0x7;
+
+                     fprintf (stream, "@sp+,er%d-er%d", high - count, high);
+                     return q->length;
+                   }
+
+                 if (strcmp (q->name, "stm.l") == 0)
+                   {
+                     int count, low;
+
+                     count = (data[1] >> 4) & 0x3;
+                     low = data[3] & 0x7;
+
+                     fprintf (stream, "er%d-er%d,@-sp", low, low + count);
+                     return q->length;
+                   }
+
                  /* Fill in the args */
                  {
                    op_type *args = q->args.nib;
@@ -275,9 +305,16 @@ bfd_h8_disassemble (addr, info, hmode)
                          fprintf (stream, ",");
 
 
-                       if (x & (IMM|KBIT|DBIT))
+                       if (x & L_3)
+                         {
+                           fprintf (stream, "#0x%x", (unsigned) bit);
+                         }
+                       else if (x & (IMM|KBIT|DBIT))
                          {
-                       
+                           /* Bletch.  For shal #2,er0 and friends.  */
+                           if (*(args+1) & SRC_IN_DST)
+                             abs = 2;
+
                            fprintf (stream, "#0x%x", (unsigned) abs);
                          }
                        else if (x & REG)
@@ -314,7 +351,12 @@ bfd_h8_disassemble (addr, info, hmode)
                            fprintf (stream, "@%s", pregnames[rn]);
                          }
 
-                       else if (x & (ABS|ABSJMP|ABSMOV))
+                       else if (x & ABS8MEM)
+                         {
+                           fprintf (stream, "@0x%x:8", (unsigned) abs);
+                         }
+
+                       else if (x & (ABS|ABSJMP))
                          {
                            fprintf (stream, "@0x%x:%d", (unsigned) abs, plen);
                          }
@@ -326,10 +368,16 @@ bfd_h8_disassemble (addr, info, hmode)
 
                        else if (x & PCREL)
                          {
-                           if (x & L_16)
-                             abs  +=2;
-                           fprintf (stream, ".%s%d (%x)", (char) abs > 0 ? "+" : "", (char) abs,
-                                    addr + (char) abs + 2);
+                           if (x & L_16) 
+                             {
+                               abs  +=2;
+                               fprintf (stream, ".%s%d (%x)", (short) abs > 0 ? "+" : "", (short) abs,
+                                        addr + (short) abs + 2);
+                             }
+                           else {
+                             fprintf (stream, ".%s%d (%x)", (char) abs > 0 ? "+" : "", (char) abs,
+                                      addr + (char) abs + 2);
+                           }
                          }
                        else if (x & DISP)
                          {
@@ -338,9 +386,12 @@ bfd_h8_disassemble (addr, info, hmode)
 
                        else if (x & CCR)
                          {
-
                            fprintf (stream, "ccr");
                          }
+                       else if (x & EXR)
+                         {
+                           fprintf (stream, "exr");
+                         }
 
                        else
                          fprintf (stream, "Hmmmm %x", x);
@@ -381,7 +432,7 @@ disassemble_info *info;
   return bfd_h8_disassemble (addr, info , 0);
 }
 
- int 
+int 
 print_insn_h8300h (addr, info)
 bfd_vma addr;
 disassemble_info *info;
@@ -389,3 +440,10 @@ disassemble_info *info;
   return bfd_h8_disassemble (addr, info , 1);
 }
 
+int 
+print_insn_h8300s (addr, info)
+bfd_vma addr;
+disassemble_info *info;
+{
+  return bfd_h8_disassemble (addr, info , 2);
+}
This page took 0.024978 seconds and 4 git commands to generate.