Require always-non-stop for multi-target resumptions
[deliverable/binutils-gdb.git] / sim / rl78 / mem.c
index 46db3d515adf97eb97ddabab8676a3589340dc9a..9e84fc9166d8bec74b13da71fdc217b1e6cc2273 100644 (file)
@@ -1,6 +1,6 @@
 /* mem.c --- memory for RL78 simulator.
 
-   Copyright (C) 2011-2014 Free Software Foundation, Inc.
+   Copyright (C) 2011-2020 Free Software Foundation, Inc.
    Contributed by Red Hat, Inc.
 
    This file is part of the GNU simulators.
@@ -63,6 +63,18 @@ mem_rom_size (int rom_bytes)
   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
@@ -92,13 +104,11 @@ static int
 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;
@@ -140,6 +150,10 @@ mem_put_byte (int address, unsigned char value)
       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)
@@ -166,20 +180,23 @@ mem_put_byte (int address, unsigned char value)
              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;
@@ -190,7 +207,8 @@ mem_put_byte (int address, unsigned char value)
              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);
@@ -228,7 +246,7 @@ mem_get_byte (int address)
            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;
This page took 0.037627 seconds and 4 git commands to generate.