/* mem.c --- memory for RL78 simulator.
- Copyright (C) 2011
- Free Software Foundation, Inc.
+ Copyright (C) 2011-2019 Free Software Foundation, Inc.
Contributed by Red Hat, Inc.
This file is part of the GNU simulators.
rom_limit = rom_bytes;
}
+int mirror_rom_base = 0x01000;
+int mirror_ram_base = 0xf1000;
+int mirror_length = 0x7000;
+
+void
+mem_set_mirror (int rom_base, int ram_base, int length)
+{
+ mirror_rom_base = rom_base;
+ mirror_ram_base = ram_base;
+ mirror_length = length;
+}
+
/* ---------------------------------------------------------------------- */
/* Note: the RL78 memory map has a few surprises. For starters, part
of the first 64k is mapped to the last 64k, depending on an SFR bit
#define MDUC 0xf00e8
#define MDAL 0xffff0
#define MDAH 0xffff2
-#define MDBL 0xffff4
-#define MDBH 0xffff6
+#define MDBL 0xffff6
+#define MDBH 0xffff4
#define MDCL 0xf00e0
#define MDCH 0xf00e2
static long long mduc_clock = 0;
address_mapping (int address)
{
address &= MASK;
- if (address >= 0xf1000 && address < ram_base)
+ if (address >= mirror_ram_base && address < mirror_ram_base + mirror_length)
{
- address &= 0xffff;
- tprintf ("&");
+ address = address - mirror_ram_base + mirror_rom_base;
if (memory[RL78_SFR_PMC] & 1)
{
- tprintf ("|");
address |= 0x10000;
}
last_addr_was_mirror = 1;
printf ("Warning: SP value 0x%04x truncated at pc=0x%05x\n", value, pc);
value &= ~1;
}
+
+ if (! g13_multiply)
+ return;
+
if (address == MDUC)
{
if ((value & 0x81) == 0x81)
ahu = mem_get_hi (MDAH);
rvu = alu * ahu;
tprintf ("MDUC: %lu * %lu = %lu\n", alu, ahu, rvu);
- mem_put_si (MDBL, rvu);
+ mem_put_hi (MDBL, rvu & 0xffff);
+ mem_put_hi (MDBH, rvu >> 16);
break;
case 0x08:
als = sign_ext (mem_get_hi (MDAL), 16);
ahs = sign_ext (mem_get_hi (MDAH), 16);
rvs = als * ahs;
tprintf ("MDUC: %ld * %ld = %ld\n", als, ahs, rvs);
- mem_put_si (MDBL, rvs);
+ mem_put_hi (MDBL, rvs & 0xffff);
+ mem_put_hi (MDBH, rvs >> 16);
break;
case 0x40:
alu = mem_get_hi (MDAL);
ahu = mem_get_hi (MDAH);
rvu = alu * ahu;
- mem_put_si (MDBL, rvu);
+ mem_put_hi (MDBL, rvu & 0xffff);
+ mem_put_hi (MDBH, rvu >> 16);
mdc = mem_get_si (MDCL);
tprintf ("MDUC: %lu * %lu + %lu = ", alu, ahu, mdc);
mdc += (long) rvu;
als = sign_ext (mem_get_hi (MDAL), 16);
ahs = sign_ext (mem_get_hi (MDAH), 16);
rvs = als * ahs;
- mem_put_si (MDBL, rvs);
+ mem_put_hi (MDBL, rvs & 0xffff);
+ mem_put_hi (MDBH, rvs >> 16);
mdc = mem_get_si (MDCL);
tprintf ("MDUC: %ld * %ld + %ld = ", als, ahs, mdc);
tprintf ("%ld\n", mdc);
unsigned long a, b, q, r;
memory [MDUC] &= 0xfe;
a = mem_get_si (MDAL);
- b = mem_get_si (MDAL);
+ b = mem_get_hi (MDBL) | (mem_get_hi (MDBH) << 16);
if (b == 0)
{
q = ~0;