-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.
#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)
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)
pc = cpu.pc;
+ /* The PC should never be odd. */
+ if (pc & 0x1)
+ abort ();
+
GETSR ();
oldmask = cpu.mask;
if (!h8300hmode)
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;
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;
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;
}
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;
}
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);