Line 268... |
Line 268... |
cur_vadd = memaddr;
|
cur_vadd = memaddr;
|
if (config.debug.enabled)
|
if (config.debug.enabled)
|
*breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
|
*breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
|
temp = evalsim_mem32(memaddr);
|
temp = evalsim_mem32(memaddr);
|
if (!cur_area) {
|
if (!cur_area) {
|
printf("EXCEPTION: read out of memory (16-bit access to %.8lx)\n", memaddr);
|
PRINTF("EXCEPTION: read out of memory (16-bit access to %.8lx)\n", memaddr);
|
except_handle(EXCEPT_BUSERR, cur_vadd);
|
except_handle(EXCEPT_BUSERR, cur_vadd);
|
temp = 0;
|
temp = 0;
|
}
|
}
|
|
|
if (!pending.valid && cur_area->log)
|
if (!pending.valid && cur_area->log)
|
Line 309... |
Line 309... |
if (config.dc.enabled)
|
if (config.dc.enabled)
|
temp = dc_simulate_read(memaddr, 4);
|
temp = dc_simulate_read(memaddr, 4);
|
else {
|
else {
|
temp = evalsim_mem32(memaddr);
|
temp = evalsim_mem32(memaddr);
|
if (!cur_area) {
|
if (!cur_area) {
|
printf("EXCEPTION: read out of memory (32-bit access to %.8lx)\n", memaddr);
|
PRINTF("EXCEPTION: read out of memory (32-bit access to %.8lx)\n", memaddr);
|
except_handle(EXCEPT_BUSERR, cur_vadd);
|
except_handle(EXCEPT_BUSERR, cur_vadd);
|
temp = 0;
|
temp = 0;
|
}
|
}
|
}
|
}
|
|
|
Line 337... |
Line 337... |
if (config.ic.enabled)
|
if (config.ic.enabled)
|
temp = ic_simulate_fetch(memaddr);
|
temp = ic_simulate_fetch(memaddr);
|
else {
|
else {
|
temp = evalsim_mem32(memaddr);
|
temp = evalsim_mem32(memaddr);
|
if (!cur_area) {
|
if (!cur_area) {
|
printf("EXCEPTION: read out of memory (32-bit access to %.8lx)\n", memaddr);
|
PRINTF("EXCEPTION: read out of memory (32-bit access to %.8lx)\n", memaddr);
|
except_handle(EXCEPT_BUSERR, cur_vadd);
|
except_handle(EXCEPT_BUSERR, cur_vadd);
|
temp = 0;
|
temp = 0;
|
}
|
}
|
}
|
}
|
|
|
Line 376... |
Line 376... |
if (config.dc.enabled)
|
if (config.dc.enabled)
|
temp = (unsigned short)dc_simulate_read(memaddr, 2);
|
temp = (unsigned short)dc_simulate_read(memaddr, 2);
|
else {
|
else {
|
temp = evalsim_mem16(memaddr);
|
temp = evalsim_mem16(memaddr);
|
if (!cur_area) {
|
if (!cur_area) {
|
printf("EXCEPTION: read out of memory (16-bit access to %.8lx)\n", memaddr);
|
PRINTF("EXCEPTION: read out of memory (16-bit access to %.8lx)\n", memaddr);
|
except_handle(EXCEPT_BUSERR, cur_vadd);
|
except_handle(EXCEPT_BUSERR, cur_vadd);
|
temp = 0;
|
temp = 0;
|
}
|
}
|
}
|
}
|
|
|
Line 410... |
Line 410... |
if (config.dc.enabled)
|
if (config.dc.enabled)
|
temp = (unsigned char)dc_simulate_read(memaddr, 1);
|
temp = (unsigned char)dc_simulate_read(memaddr, 1);
|
else {
|
else {
|
temp = evalsim_mem8(memaddr);
|
temp = evalsim_mem8(memaddr);
|
if (!cur_area) {
|
if (!cur_area) {
|
printf("EXCEPTION: read out of memory (8-bit access to %.8lx)\n", memaddr);
|
PRINTF("EXCEPTION: read out of memory (8-bit access to %.8lx)\n", memaddr);
|
except_handle(EXCEPT_BUSERR, cur_vadd);
|
except_handle(EXCEPT_BUSERR, cur_vadd);
|
temp = 0;
|
temp = 0;
|
}
|
}
|
}
|
}
|
|
|
Line 445... |
Line 445... |
cur_area->writefunc(memaddr + 2, value & 0xFFFF);
|
cur_area->writefunc(memaddr + 2, value & 0xFFFF);
|
runtime.sim.mem_cycles += cur_area->delayw * 2;
|
runtime.sim.mem_cycles += cur_area->delayw * 2;
|
break;
|
break;
|
}
|
}
|
} else {
|
} else {
|
printf("EXCEPTION: write out of memory (32-bit access to %.8lx)\n", memaddr);
|
PRINTF("EXCEPTION: write out of memory (32-bit access to %.8lx)\n", memaddr);
|
except_handle(EXCEPT_BUSERR, cur_vadd);
|
except_handle(EXCEPT_BUSERR, cur_vadd);
|
}
|
}
|
}
|
}
|
|
|
void setsim_mem16(unsigned long memaddr, unsigned short value)
|
void setsim_mem16(unsigned long memaddr, unsigned short value)
|
Line 472... |
Line 472... |
temp |= (unsigned long)(value & 0xffff) << ((memaddr & 2) ? 0 : 16);
|
temp |= (unsigned long)(value & 0xffff) << ((memaddr & 2) ? 0 : 16);
|
setsim_mem32 (memaddr & ~3ul, temp);
|
setsim_mem32 (memaddr & ~3ul, temp);
|
break;
|
break;
|
}
|
}
|
} else {
|
} else {
|
printf("EXCEPTION: write out of memory (16-bit access to %.8lx)\n", memaddr);
|
PRINTF("EXCEPTION: write out of memory (16-bit access to %.8lx)\n", memaddr);
|
except_handle(EXCEPT_BUSERR, cur_vadd);
|
except_handle(EXCEPT_BUSERR, cur_vadd);
|
}
|
}
|
}
|
}
|
|
|
void setsim_mem8(unsigned long memaddr, unsigned char value)
|
void setsim_mem8(unsigned long memaddr, unsigned char value)
|
Line 500... |
Line 500... |
temp |= (unsigned long)(value & 0xff) << (8 * (3 - (memaddr & 3)));
|
temp |= (unsigned long)(value & 0xff) << (8 * (3 - (memaddr & 3)));
|
setsim_mem32 (memaddr & ~3ul, temp);
|
setsim_mem32 (memaddr & ~3ul, temp);
|
break;
|
break;
|
}
|
}
|
} else {
|
} else {
|
printf("EXCEPTION: write out of memory (8-bit access to %.8lx)\n", memaddr);
|
PRINTF("EXCEPTION: write out of memory (8-bit access to %.8lx)\n", memaddr);
|
except_handle(EXCEPT_BUSERR, cur_vadd);
|
except_handle(EXCEPT_BUSERR, cur_vadd);
|
}
|
}
|
}
|
}
|
|
|
/* Set mem, 32-bit. Big endian version. */
|
/* Set mem, 32-bit. Big endian version. */
|
Line 594... |
Line 594... |
struct label_entry *tmp;
|
struct label_entry *tmp;
|
int breakpoint = 0;
|
int breakpoint = 0;
|
int ilen = disasm ? 4 : 16;
|
int ilen = disasm ? 4 : 16;
|
|
|
for(i = from; i < to; i += ilen) {
|
for(i = from; i < to; i += ilen) {
|
printf("%.8x: ", i);
|
PRINTF("%.8x: ", i);
|
for (j = 0; j < ilen;) {
|
for (j = 0; j < ilen;) {
|
int data = -1;
|
int data = -1;
|
if (!disasm) {
|
if (!disasm) {
|
tmp = NULL;
|
tmp = NULL;
|
if (verify_memoryarea(i+j)) {
|
if (verify_memoryarea(i+j)) {
|
struct label_entry *entry;
|
struct label_entry *entry;
|
entry = get_label(i + j);
|
entry = get_label(i + j);
|
if (entry)
|
if (entry)
|
printf("(%s)", entry->name);
|
PRINTF("(%s)", entry->name);
|
printf("%02x ", data = evalsim_mem8(i+j));
|
PRINTF("%02x ", data = evalsim_mem8(i+j));
|
} else printf("XX ");
|
} else PRINTF("XX ");
|
j++;
|
j++;
|
} else {
|
} else {
|
int breakpoint;
|
int breakpoint;
|
unsigned int _insn = read_mem(i, &breakpoint);
|
unsigned int _insn = read_mem(i, &breakpoint);
|
int index = insn_decode (_insn);
|
int index = insn_decode (_insn);
|
Line 618... |
Line 618... |
tmp = NULL;
|
tmp = NULL;
|
if (verify_memoryarea(i+j)) {
|
if (verify_memoryarea(i+j)) {
|
struct label_entry *entry;
|
struct label_entry *entry;
|
entry = get_label(i + j);
|
entry = get_label(i + j);
|
if (entry)
|
if (entry)
|
printf("(%s)", entry->name);
|
PRINTF("(%s)", entry->name);
|
|
|
printf(": %08x ", (unsigned long)_insn);
|
PRINTF(": %08x ", (unsigned long)_insn);
|
if (index >= 0) {
|
if (index >= 0) {
|
disassemble_insn (_insn);
|
disassemble_insn (_insn);
|
printf(" %s", disassembled);
|
PRINTF(" %s", disassembled);
|
} else
|
} else
|
printf("<invalid>");
|
PRINTF("<invalid>");
|
} else printf("XXXXXXXX");
|
} else PRINTF("XXXXXXXX");
|
j += len;
|
j += len;
|
}
|
}
|
}
|
}
|
if (nl)
|
if (nl)
|
printf ("\n");
|
PRINTF ("\n");
|
}
|
}
|
}
|
}
|
|
|
unsigned long simmem_read_word(unsigned long addr) {
|
unsigned long simmem_read_word(unsigned long addr) {
|
return simmem32[(cur_area->misc + (addr & cur_area->size_mask)) >> 2];
|
return simmem32[(cur_area->misc + (addr & cur_area->size_mask)) >> 2];
|
Line 686... |
Line 686... |
fprintf (stderr, "WARNING: Cannot open '%s'.\n", config.memory.table[i].log);
|
fprintf (stderr, "WARNING: Cannot open '%s'.\n", config.memory.table[i].log);
|
} else
|
} else
|
cur_area->log = NULL;
|
cur_area->log = NULL;
|
memory_needed += cur_area->size;
|
memory_needed += cur_area->size;
|
}
|
}
|
printf ("\n");
|
PRINTF ("\n");
|
} else {
|
} else {
|
if (config.sim.verbose)
|
if (config.sim.verbose)
|
fprintf (stderr, "WARNING: Memory not defined, assuming standard configuration.\n");
|
fprintf (stderr, "WARNING: Memory not defined, assuming standard configuration.\n");
|
register_memoryarea(DEFAULT_MEMORY_START, DEFAULT_MEMORY_LEN, 4, 0, &simmem_read_word, &simmem_write_word);
|
register_memoryarea(DEFAULT_MEMORY_START, DEFAULT_MEMORY_LEN, 4, 0, &simmem_read_word, &simmem_write_word);
|
cur_area->misc = memory_needed;
|
cur_area->misc = memory_needed;
|
Line 750... |
Line 750... |
{
|
{
|
struct dev_memarea *ptmp;
|
struct dev_memarea *ptmp;
|
|
|
/* Check list of registered devices. */
|
/* Check list of registered devices. */
|
for(ptmp = dev_list; ptmp; ptmp = ptmp->next) {
|
for(ptmp = dev_list; ptmp; ptmp = ptmp->next) {
|
printf ("addr & %08x == %08x to %08x, size %08x, gran %iB\n",
|
PRINTF ("addr & %08x == %08x to %08x, size %08x, gran %iB\n",
|
ptmp->addr_mask, ptmp->addr_compare, ptmp->addr_compare | bit_mask (ptmp->size),
|
ptmp->addr_mask, ptmp->addr_compare, ptmp->addr_compare | bit_mask (ptmp->size),
|
ptmp->size, ptmp->granularity);
|
ptmp->size, ptmp->granularity);
|
printf ("\t");
|
PRINTF ("\t");
|
if (ptmp->delayr >= 0)
|
if (ptmp->delayr >= 0)
|
printf ("read delay = %i cycles, ", ptmp->delayr);
|
PRINTF ("read delay = %i cycles, ", ptmp->delayr);
|
else
|
else
|
printf ("reads not possible, ");
|
PRINTF ("reads not possible, ");
|
|
|
if (ptmp->delayw >= 0)
|
if (ptmp->delayw >= 0)
|
printf ("write delay = %i cycles", ptmp->delayw);
|
PRINTF ("write delay = %i cycles", ptmp->delayw);
|
else
|
else
|
printf ("writes not possible");
|
PRINTF ("writes not possible");
|
|
|
if (ptmp->log)
|
if (ptmp->log)
|
printf (", (logged)\n");
|
PRINTF (", (logged)\n");
|
else
|
else
|
printf ("\n");
|
PRINTF ("\n");
|
}
|
}
|
}
|
}
|
|
|
/* Outputs time in pretty form to dest string */
|
/* Outputs time in pretty form to dest string */
|
|
|