]> git.sesse.net Git - pistorm/blobdiff - memory_mapped.c
Add write-through cached RAM for Mac experiments
[pistorm] / memory_mapped.c
index 1e5522cb584720356446d8300a09dc2e54bda7c6..372485d46eb4cb66939b77bea9168bb571dd2999 100644 (file)
@@ -1,6 +1,8 @@
+// SPDX-License-Identifier: MIT
+
 #include "config_file/config_file.h"
 #include "m68k.h"
-#include "Gayle.h"
+#include "platforms/amiga/Gayle.h"
 #include <endian.h>
 
 #define CHKRANGE(a, b, c) a >= (unsigned int)b && a < (unsigned int)(b + c)
@@ -24,7 +26,7 @@ inline int handle_mapped_read(struct emulator_config *cfg, unsigned int addr, un
     if (cfg->map_type[i] == MAPTYPE_NONE)
       continue;
     else if (ovl && cfg->map_type[i] == MAPTYPE_ROM) {
-      if (cfg->map_mirror[i] != -1 && CHKRANGE(addr, cfg->map_mirror[i], cfg->map_size[i])) {
+      if (cfg->map_mirror[i] != ((unsigned int)-1) && CHKRANGE(addr, cfg->map_mirror[i], cfg->map_size[i])) {
         read_addr = cfg->map_data[i] + ((addr - cfg->map_mirror[i]) % cfg->rom_size[i]);
         goto read_value;
       }
@@ -36,6 +38,8 @@ inline int handle_mapped_read(struct emulator_config *cfg, unsigned int addr, un
           goto read_value;
           break;
         case MAPTYPE_RAM:
+        case MAPTYPE_RAM_WTC:
+        case MAPTYPE_RAM_NOALLOC:
           read_addr = cfg->map_data[i] + (addr - cfg->map_offset[i]);
           goto read_value;
           break;
@@ -55,7 +59,6 @@ inline int handle_mapped_read(struct emulator_config *cfg, unsigned int addr, un
   return -1;
 
 read_value:;
-  //printf("Read value from %.8X\n", addr);
   switch(type) {
     case OP_TYPE_BYTE:
       *val = read_addr[0];
@@ -78,6 +81,7 @@ read_value:;
 }
 
 inline int handle_mapped_write(struct emulator_config *cfg, unsigned int addr, unsigned int value, unsigned char type) {
+  int res = -1;
   unsigned char *write_addr = NULL;
 
   for (int i = 0; i < MAX_NUM_MAPPED_ITEMS; i++) {
@@ -86,10 +90,17 @@ inline int handle_mapped_write(struct emulator_config *cfg, unsigned int addr, u
     else if (CHKRANGE_ABS(addr, cfg->map_offset[i], cfg->map_high[i])) {
       switch(cfg->map_type[i]) {
         case MAPTYPE_ROM:
-          return 1;
+          res = 1;
           break;
         case MAPTYPE_RAM:
+        case MAPTYPE_RAM_NOALLOC:
           write_addr = cfg->map_data[i] + (addr - cfg->map_offset[i]);
+          res = 1;
+          goto write_value;
+          break;
+        case MAPTYPE_RAM_WTC:
+          write_addr = cfg->map_data[i] + (addr - cfg->map_offset[i]);
+          res = -1;
           goto write_value;
           break;
         case MAPTYPE_REGISTER:
@@ -101,27 +112,27 @@ inline int handle_mapped_write(struct emulator_config *cfg, unsigned int addr, u
     }
   }
 
-  return -1;
+  return res;
 
 write_value:;
-  //printf("Write value to %.8X\n", addr);
   switch(type) {
     case OP_TYPE_BYTE:
       write_addr[0] = (unsigned char)value;
-      return 1;
+      return res;
       break;
     case OP_TYPE_WORD:
       ((short *)write_addr)[0] = htobe16(value);
-      return 1;
+      return res;
       break;
     case OP_TYPE_LONGWORD:
       ((int *)write_addr)[0] = htobe32(value);
-      return 1;
+      return res;
       break;
     case OP_TYPE_MEM:
       return -1;
       break;
   }
 
-  return 1;
+  // This should never actually happen.
+  return res;
 }