* mem.c (mem_put_byte): Hook simulated UART to stdout.

(mem_put_hi): Hook in simulated trace port.
(mem_get_byte): Hook in simulated uart control port.
* opc2c: Be more picky about matching special comments.
* r8c.opc (shift_op): Limit shift counts to -16..16.
(BMcnd): Map conditional codes.
* reg.c (condition_true): Mask condition code to 4 bits.
* syscalls.c: Include local syscall.h.
* syscall.h: New, copied from libgloss.
This commit is contained in:
DJ Delorie 2006-03-14 03:34:28 +00:00
parent 1f810f7808
commit 727b6b4b41
6 changed files with 111 additions and 12 deletions

View file

@ -1,3 +1,15 @@
2006-03-13 DJ Delorie <dj@redhat.com>
* mem.c (mem_put_byte): Hook simulated UART to stdout.
(mem_put_hi): Hook in simulated trace port.
(mem_get_byte): Hook in simulated uart control port.
* opc2c: Be more picky about matching special comments.
* r8c.opc (shift_op): Limit shift counts to -16..16.
(BMcnd): Map conditional codes.
* reg.c (condition_true): Mask condition code to 4 bits.
* syscalls.c: Include local syscall.h.
* syscall.h: New, copied from libgloss.
2005-10-06 Jim Blandy <jimb@redhat.com>
Simulator for Renesas M32C and M16C, by DJ Delorie <dj@redhat.com>,

View file

@ -202,6 +202,23 @@ mem_put_byte (int address, unsigned char value)
}
break;
case 0x3aa: /* uart1tx */
{
static int pending_exit = 0;
if (value == 0)
{
if (pending_exit)
{
step_result = M32C_MAKE_EXITED(value);
return;
}
pending_exit = 1;
}
else
putchar(value);
}
break;
case 0x400:
m32c_syscall (value);
break;
@ -232,6 +249,11 @@ mem_put_qi (int address, unsigned char value)
void
mem_put_hi (int address, unsigned short value)
{
if (address == 0x402)
{
printf ("SimTrace: %06lx %04x\n", regs.r_pc, value);
return;
}
S ("<=");
mem_put_byte (address, value & 0xff);
mem_put_byte (address + 1, value >> 8);
@ -288,16 +310,16 @@ mem_get_byte (int address)
address &= membus_mask;
S ("=>");
m = mem_ptr (address);
if (trace)
switch (address)
{
if (tpr)
case 0x3ad: /* uart1c1 */
E();
return 2; /* transmitter empty */
break;
default:
if (trace)
printf (" %02x", *m);
else
{
S ("=>");
printf (" %02x", *m);
E ();
}
break;
}
E ();
return *m;

View file

@ -240,6 +240,15 @@ shift_op (srcdest sd, int arith, int count)
{
mask = 0xffffffffU;
msb = 0x80000000U;
if (count > 16 || count < -16)
{
fprintf(stderr, "Error: SI shift of %d undefined\n", count);
exit(1);
}
if (count > 16)
count = (count - 1) % 16 + 1;
if (count < -16)
count = -((-count - 1) % 16 + 1);
}
tprintf("%s %x by %d\n", arith ? "sha" : "shl", v, count);
@ -292,6 +301,12 @@ shift_op (srcdest sd, int arith, int count)
tprintf ("b=%d, carry=%d, %s = %d\n", b, carry, #expr, v); \
set_c (v);
/* The "BMcnd dest" opcode uses a different encoding for the */
/* condition than other opcodes. */
static int bmcnd_cond_map[] = {
0, 1, 2, 3, 8, 9, 10, 11, 4, 5, 6, 7, 12, 13, 14, 15
};
int
decode_r8c()
{
@ -448,7 +463,7 @@ decode_r8c()
/** 0111 1110 0010 dest BMcnd dest */
dc = decode_bit (dest);
if (condition_true (IMM (0)))
if (condition_true (bmcnd_cond_map [IMM (0) & 15]))
put_bit (dc, 1);
else
put_bit (dc, 0);

View file

@ -347,7 +347,7 @@ condition_true (int cond_id)
"(S^O)|Z", "O", "!(S^O)", "unk",
"!((S^O)|Z)", "!O", "S^O", "unk"
};
switch (cond_id)
switch (cond_id & 15)
{
case 0:
f = FLAG_C;
@ -409,7 +409,7 @@ condition_true (int cond_id)
"C", "GTU", "Z", "N",
"O", "LE", "LT", "!?"
};
switch (cond_id)
switch (cond_id & 15)
{
case 0:
f = !FLAG_C;

50
sim/m32c/syscall.h Normal file
View file

@ -0,0 +1,50 @@
/* Copied from libgloss */
/* General use syscall.h file.
The more ports that use this file, the simpler sim/common/nltvals.def
remains. */
#ifndef LIBGLOSS_SYSCALL_H
#define LIBGLOSS_SYSCALL_H
/* Note: This file may be included by assembler source. */
/* These should be as small as possible to allow a port to use a trap type
instruction, which the system call # as the trap (the d10v for instance
supports traps 0..31). An alternative would be to define one trap for doing
system calls, and put the system call number in a register that is not used
for the normal calling sequence (so that you don't have to shift down the
arguments to add the system call number). Obviously, if these system call
numbers are ever changed, all of the simulators and potentially user code
will need to be updated. */
/* There is no current need for the following: SYS_execv, SYS_creat, SYS_wait,
etc. etc. Don't add them. */
/* These are required by the ANSI C part of newlib (excluding system() of
course). */
#define SYS_exit 1
#define SYS_open 2
#define SYS_close 3
#define SYS_read 4
#define SYS_write 5
#define SYS_lseek 6
#define SYS_unlink 7
#define SYS_getpid 8
#define SYS_kill 9
#define SYS_fstat 10
/*#define SYS_sbrk 11 - not currently a system call, but reserved. */
/* ARGV support. */
#define SYS_argvlen 12
#define SYS_argv 13
/* These are extras added for one reason or another. */
#define SYS_chdir 14
#define SYS_stat 15
#define SYS_chmod 16
#define SYS_utime 17
#define SYS_time 18
#define SYS_gettimeofday 19
#define SYS_times 20
#define SYS_link 21
#endif

View file

@ -33,7 +33,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
#include "mem.h"
#include "syscalls.h"
#include "../../libgloss/syscall.h"
#include "syscall.h"
/* The current syscall callbacks we're using. */
static struct host_callback_struct *callbacks;