1 // SPDX-License-Identifier: MIT
3 #include "config_file/config_file.h"
5 #include "platforms/amiga/Gayle.h"
8 #define CHKRANGE(a, b, c) a >= (unsigned int)b && a < (unsigned int)(b + c)
9 #define CHKRANGE_ABS(a, b, c) a >= (unsigned int)b && a < (unsigned int) c
11 static unsigned int target;
14 extern const char *map_type_names[MAPTYPE_NUM];
15 const char *op_type_names[OP_TYPE_NUM] = {
22 inline int handle_mapped_read(struct emulator_config *cfg, unsigned int addr, unsigned int *val, unsigned char type) {
23 unsigned char *read_addr = NULL;
25 for (int i = 0; i < MAX_NUM_MAPPED_ITEMS; i++) {
26 if (cfg->map_type[i] == MAPTYPE_NONE)
28 else if (ovl && cfg->map_type[i] == MAPTYPE_ROM) {
29 if (cfg->map_mirror[i] != ((unsigned int)-1) && CHKRANGE(addr, cfg->map_mirror[i], cfg->map_size[i])) {
30 read_addr = cfg->map_data[i] + ((addr - cfg->map_mirror[i]) % cfg->rom_size[i]);
34 if (CHKRANGE_ABS(addr, cfg->map_offset[i], cfg->map_high[i])) {
35 switch(cfg->map_type[i]) {
37 read_addr = cfg->map_data[i] + ((addr - cfg->map_offset[i]) % cfg->rom_size[i]);
42 case MAPTYPE_RAM_NOALLOC:
43 read_addr = cfg->map_data[i] + (addr - cfg->map_offset[i]);
46 case MAPTYPE_REGISTER:
47 if (cfg->platform && cfg->platform->register_read) {
48 if (cfg->platform->register_read(addr, type, &target) != -1) {
68 *val = be16toh(((unsigned short *)read_addr)[0]);
71 case OP_TYPE_LONGWORD:
72 *val = be32toh(((unsigned int *)read_addr)[0]);
83 inline int handle_mapped_write(struct emulator_config *cfg, unsigned int addr, unsigned int value, unsigned char type) {
85 unsigned char *write_addr = NULL;
87 for (int i = 0; i < MAX_NUM_MAPPED_ITEMS; i++) {
88 if (cfg->map_type[i] == MAPTYPE_NONE)
90 else if (CHKRANGE_ABS(addr, cfg->map_offset[i], cfg->map_high[i])) {
91 switch(cfg->map_type[i]) {
96 case MAPTYPE_RAM_NOALLOC:
97 write_addr = cfg->map_data[i] + (addr - cfg->map_offset[i]);
101 case MAPTYPE_RAM_WTC:
102 write_addr = cfg->map_data[i] + (addr - cfg->map_offset[i]);
106 case MAPTYPE_REGISTER:
107 if (cfg->platform && cfg->platform->register_write) {
108 return cfg->platform->register_write(addr, value, type);
120 write_addr[0] = (unsigned char)value;
124 ((short *)write_addr)[0] = htobe16(value);
127 case OP_TYPE_LONGWORD:
128 ((int *)write_addr)[0] = htobe32(value);
136 // This should never actually happen.