X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=memory_mapped.c;h=0b5b358804bc0ccda644135b91f9884afffb49a7;hb=HEAD;hp=3764631f2c9d8bbf6cd81c6b4df1e2d0bb9efe4c;hpb=b4f8819a4c05358bb4da950b1995941024691898;p=pistorm diff --git a/memory_mapped.c b/memory_mapped.c index 3764631..0b5b358 100644 --- a/memory_mapped.c +++ b/memory_mapped.c @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: MIT + #include "config_file/config_file.h" #include "m68k.h" #include "platforms/amiga/Gayle.h" @@ -23,8 +25,8 @@ 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) { - if (cfg->map_mirror[i] != -1 && CHKRANGE(addr, cfg->map_mirror[i], cfg->map_size[i])) { + 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; } @@ -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,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: @@ -101,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; }