]> git.sesse.net Git - pistorm/blobdiff - memory_mapped.c
Add Meson build files.
[pistorm] / memory_mapped.c
index c3a02be902f0163df9ddc7887f009c174270c4a4..0b5b358804bc0ccda644135b91f9884afffb49a7 100644 (file)
@@ -25,7 +25,7 @@ inline int handle_mapped_read(struct emulator_config *cfg, unsigned int addr, un
   for (int i = 0; i < MAX_NUM_MAPPED_ITEMS; i++) {
     if (cfg->map_type[i] == MAPTYPE_NONE)
       continue;
-    else if (ovl && cfg->map_type[i] == MAPTYPE_ROM) {
+    else if (ovl && (cfg->map_type[i] == MAPTYPE_ROM || cfg->map_type[i] == MAPTYPE_RAM_WTC)) {
       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;
@@ -38,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;
@@ -57,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];
@@ -80,18 +81,34 @@ 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++) {
     if (cfg->map_type[i] == MAPTYPE_NONE)
       continue;
+    else if (ovl && cfg->map_type[i] == MAPTYPE_RAM_WTC) {
+      if (cfg->map_mirror[i] != ((unsigned int)-1) && CHKRANGE(addr, cfg->map_mirror[i], cfg->map_size[i])) {
+        write_addr = cfg->map_data[i] + ((addr - cfg->map_mirror[i]) % cfg->rom_size[i]);
+        res = -1;
+        goto write_value;
+      }
+    }
     else if (CHKRANGE_ABS(addr, cfg->map_offset[i], cfg->map_high[i])) {
       switch(cfg->map_type[i]) {
         case MAPTYPE_ROM:
           return 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:
+          //printf("Some write to WTC RAM.\n");
           write_addr = cfg->map_data[i] + (addr - cfg->map_offset[i]);
+          res = -1;
           goto write_value;
           break;
         case MAPTYPE_REGISTER:
@@ -103,27 +120,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;
 }