* compile.c (decode): Use "bit" to hold L_3 immediates instead
authorJeff Law <law@redhat.com>
Sat, 6 Apr 1996 00:21:35 +0000 (00:21 +0000)
committerJeff Law <law@redhat.com>
Sat, 6 Apr 1996 00:21:35 +0000 (00:21 +0000)
        of holding them in "abs".  Handle ABS8MEM memory references aka
        8-bit area.  Replace ABSMOV references with ABS8MEM.
So we've got a chance of simulating something like btst #0,@40:8 correctly.
hmse.

sim/h8300/ChangeLog
sim/h8300/compile.c

index b96f031..f573246 100644 (file)
@@ -1,3 +1,14 @@
+Fri Apr  5 17:20:59 1996  Jeffrey A Law  (law@cygnus.com)
+
+       * compile.c (decode): Use "bit" to hold L_3 immediates instead
+       of holding them in "abs".  Handle ABS8MEM memory references aka
+       8-bit area.  Replace ABSMOV references with ABS8MEM.
+
+Wed Mar 13 17:43:56 1996  Jeffrey A Law  (law@cygnus.com)
+
+       * compile.c (fetch): Handle accesses to the exception/function
+       vectors.
+
 Mon Mar 11 09:53:25 1996  Doug Evans  <dje@charmed.cygnus.com>
 
        * compile.c: #include "wait.h".
index 2545b1d..f55249e 100644 (file)
@@ -153,6 +153,7 @@ decode (addr, data, dst)
   int rdisp = 0;
   int abs = 0;
   int plen = 0;
+  int bit = 0;
 
   struct h8_opcode *q = h8_opcodes;
   int size = 0;
@@ -286,7 +287,13 @@ decode (addr, data, dst)
                    {
                      abs = SEXTCHAR (data[len >> 1]);
                    }
-                 else
+                 else if (looking_for & ABS8MEM)
+                   {
+                     plen = 8;
+                     abs = h8300hmode ? ~0xff0000ff : ~0xffff00ff;
+                     abs |= data[len >> 1] & 0xff ;
+                   }
+                  else
                    {
                      abs = data[len >> 1] & 0xff;
                    }
@@ -295,7 +302,7 @@ decode (addr, data, dst)
                {
                  plen = 3;
 
-                 abs = thisnib;
+                 bit = thisnib;
                }
              else if (looking_for == E)
                {
@@ -321,7 +328,12 @@ decode (addr, data, dst)
                            p = &(dst->src);
                          }
 
-                       if (x & (IMM | KBIT | DBIT))
+                       if (x & (L_3))
+                         {
+                           p->type = X (OP_IMM, size);
+                           p->literal = bit;
+                         }
+                       else if (x & (IMM | KBIT | DBIT))
                          {
                            p->type = X (OP_IMM, size);
                            p->literal = abs;
@@ -351,7 +363,7 @@ decode (addr, data, dst)
                            p->reg = rn & 0x7;
                            p->literal = 0;
                          }
-                       else if (x & (ABS | ABSJMP | ABSMOV))
+                       else if (x & (ABS | ABSJMP | ABS8MEM))
                          {
                            p->type = X (OP_DISP, size);
                            p->literal = abs;
@@ -574,6 +586,11 @@ fetch (arg, n)
       t &= cpu.mask;
       return t;
 
+    case X (OP_MEM, SW):
+      t = GET_MEMORY_W (abs);
+      t &= cpu.mask;
+      return t;
+
     default:
       abort ();