* compile.c (sim_resume): Correctly handle divu.
authorJeff Law <law@redhat.com>
Thu, 23 May 1996 04:25:43 +0000 (04:25 +0000)
committerJeff Law <law@redhat.com>
Thu, 23 May 1996 04:25:43 +0000 (04:25 +0000)
More bugfixing.  HMSE

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

index b20fc31e60c810bd5422843d0d781741c2f0ad15..cf5e61eab232a1cefb491ffa1a79366e26507321 100644 (file)
@@ -1,4 +1,25 @@
-Fri Apr 12 16:44:10 1996  Jeffrey A Law  (law@cygnus.com)
+Wed May 22 22:23:37 1996  Jeffrey A Law  (law@cygnus.com)
+
+       * compile.c (sim_resume): Correctly handle divu.
+
+Tue May  7 02:13:05 1996  Jeffrey A Law  (law@cygnus.com)
+
+       * compile.c (sim_resume): Never allow the PC to have an
+       odd value.
+
+Fri Apr 12 16:50:37 1996  Jeffrey A Law  (law@cygnus.com)
+
+       * inst.h: Expand on comments regarding H8300H_MSIZE.  Note
+       separate memory is allocate for the 8-bit area.
+       (struct cpu_state_type): Add new "eightbit' field.
+       * compile.c (GET_MEMORY_L): Handle access into the 8-bit
+       area.
+       (GET_MEMORY_W, GET_MEMORY_B): Likewise.
+       (SET_MEMORY_L, SET_MEMORY_W, SET_MEMORY_B): Likewise.
+       (init_pointers): Initialize space for the 8-bit area.
+       (sim_write): Handle writing into the 8-bit area.
+       (sim_read): Handle reading from the 8-bit area.
+       (sim_load): Reallocate space for the 8-bit area.
 
        * compile.c (sim_load): Re-allocate memory for the simulator
        here.
index b7e1c2948c23dff3dc91cc40a28dd3f647bb6e81..2e02aa07fdc4cfd9934b96fd28c4dc8679084178 100644 (file)
@@ -494,26 +494,34 @@ static unsigned int *lreg[18];
 #define SET_L_REG(x,y) (*(lreg[x])) = (y)
 
 #define GET_MEMORY_L(x) \
-  ((cpu.memory[x+0] << 24) | (cpu.memory[x+1] << 16) | (cpu.memory[x+2] << 8) | cpu.memory[x+3])
+  (x < memory_size \
+   ? ((cpu.memory[x+0] << 24) | (cpu.memory[x+1] << 16) \
+      | (cpu.memory[x+2] << 8) | cpu.memory[x+3]) \
+   : ((cpu.eightbit[(x+0) & 0xff] << 24) | (cpu.eightbit[(x+1) & 0xff] << 16) \
+      | (cpu.eightbit[(x+2) & 0xff] << 8) | cpu.eightbit[(x+3) & 0xff]))
 
 #define GET_MEMORY_W(x) \
-  ((cpu.memory[x+0] << 8) | (cpu.memory[x+1] << 0))
+  (x < memory_size \
+   ? ((cpu.memory[x+0] << 8) | (cpu.memory[x+1] << 0)) \
+   : ((cpu.eightbit[(x+0) & 0xff] << 8) | (cpu.eightbit[(x+1) & 0xff] << 0)))
 
 
-#define SET_MEMORY_B(x,y) \
-  (cpu.memory[(x)] = y)
-
-#define SET_MEMORY_W(x,y) \
-{register unsigned char *_p = cpu.memory+x;\
-   register int __y = y;\
-     _p[0] = (__y)>>8;\
-       _p[1] =(__y);     }
+#define GET_MEMORY_B(x) \
+  (x < memory_size ? (cpu.memory[x]) : (cpu.eightbit[x & 0xff]))
 
 #define SET_MEMORY_L(x,y)  \
-{register unsigned char *_p = cpu.memory+x;register int __y = y;\
-   _p[0] = (__y)>>24;   _p[1] = (__y)>>16;      _p[2] = (__y)>>8;       _p[3] = (__y)>>0;}
+{  register unsigned char *_p; register int __y = y; \
+   _p = (x < memory_size ? cpu.memory+x : cpu.eightbit + (x & 0xff)); \
+   _p[0] = (__y)>>24; _p[1] = (__y)>>16; \
+   _p[2] = (__y)>>8; _p[3] = (__y)>>0;}
 
-#define GET_MEMORY_B(x)  (cpu.memory[x])
+#define SET_MEMORY_W(x,y) \
+{  register unsigned char *_p; register int __y = y; \
+   _p = (x < memory_size ? cpu.memory+x : cpu.eightbit + (x & 0xff)); \
+   _p[0] = (__y)>>8; _p[1] =(__y);}
+
+#define SET_MEMORY_B(x,y) \
+  (x < memory_size ? (cpu.memory[(x)] = y) : (cpu.eightbit[x & 0xff] = y))
 
 int
 fetch (arg, n)
@@ -694,6 +702,7 @@ init_pointers ()
        memory_size = H8300_MSIZE;
       cpu.memory = (unsigned char *) calloc (sizeof (char), memory_size);
       cpu.cache_idx = (unsigned short *) calloc (sizeof (short), memory_size);
+      cpu.eightbit = (unsigned char *) calloc (sizeof (char), 256);
 
       /* `msize' must be a power of two */
       if ((memory_size & (memory_size - 1)) != 0)
@@ -880,6 +889,10 @@ sim_resume (step, siggnal)
 
   pc = cpu.pc;
 
+  /* The PC should never be odd.  */
+  if (pc & 0x1)
+    abort ();
+
   GETSR ();
   oldmask = cpu.mask;
   if (!h8300hmode)
@@ -1330,8 +1343,8 @@ sim_resume (step, siggnal)
            ea = GET_B_REG (code->src.reg);
            if (ea)
              {
-               tmp = rd % ea;
-               rd = rd / ea;
+               tmp = (unsigned)rd % ea;
+               rd = (unsigned)rd / ea;
              }
            SET_W_REG (code->dst.reg, (rd & 0xff) | (tmp << 8));
            n = ea & 0x80;
@@ -1347,8 +1360,8 @@ sim_resume (step, siggnal)
            nz = ea & 0xffff;
            if (ea)
              {
-               tmp = rd % ea;
-               rd = rd / ea;
+               tmp = (unsigned)rd % ea;
+               rd = (unsigned)rd / ea;
              }
            SET_L_REG (code->dst.reg, (rd & 0xffff) | (tmp << 16));
            goto next;
@@ -1627,12 +1640,17 @@ sim_write (addr, buffer, size)
   int i;
 
   init_pointers ();
-  if (addr < 0 || addr + size > memory_size)
+  if (addr < 0)
     return 0;
   for (i = 0; i < size; i++)
     {
-      cpu.memory[addr + i] = buffer[i];
-      cpu.cache_idx[addr + i] = 0;
+      if (addr < memory_size)
+       {
+         cpu.memory[addr + i] = buffer[i];
+         cpu.cache_idx[addr + i] = 0;
+       }
+      else
+       cpu.eightbit[(addr + i) & 0xff] = buffer[i];
     }
   return size;
 }
@@ -1644,9 +1662,12 @@ sim_read (addr, buffer, size)
      int size;
 {
   init_pointers ();
-  if (addr < 0 || addr + size > memory_size)
+  if (addr < 0)
     return 0;
-  memcpy (buffer, cpu.memory + addr, size);
+  if (addr < memory_size)
+    memcpy (buffer, cpu.memory + addr, size);
+  else
+    memcpy (buffer, cpu.eightbit + (addr & 0xff), size);
   return size;
 }
 
@@ -1898,6 +1919,8 @@ sim_load (prog, from_tty)
     free (cpu.memory);
   if (cpu.cache_idx)
     free (cpu.cache_idx);
+  if (cpu.eightbit)
+    free (cpu.eightbit);
 
   cpu.memory = (unsigned char *) calloc (sizeof (char), memory_size);
   cpu.cache_idx = (unsigned short *) calloc (sizeof (short), memory_size);