+// 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)
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_ABS(addr, cfg->map_mirror[i], cfg->map_high[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;
}
}
- else if (CHKRANGE_ABS(addr, cfg->map_offset[i], cfg->map_high[i])) {
+ if (CHKRANGE_ABS(addr, cfg->map_offset[i], cfg->map_high[i])) {
switch(cfg->map_type[i]) {
case MAPTYPE_ROM:
read_addr = cfg->map_data[i] + ((addr - cfg->map_offset[i]) % cfg->rom_size[i]);
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;
return -1;
read_value:;
- //printf("Read value from %.8X\n", addr);
switch(type) {
case OP_TYPE_BYTE:
*val = read_addr[0];
}
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:
}
}
- 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;
}