diff options
Diffstat (limited to 'sim/h8300/compile.c')
-rw-r--r-- | sim/h8300/compile.c | 67 |
1 files changed, 45 insertions, 22 deletions
diff --git a/sim/h8300/compile.c b/sim/h8300/compile.c index b7e1c29..2e02aa0 100644 --- a/sim/h8300/compile.c +++ b/sim/h8300/compile.c @@ -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); |