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]);
41 read_addr = cfg->map_data[i] + (addr - cfg->map_offset[i]);
44 case MAPTYPE_REGISTER:
45 if (cfg->platform && cfg->platform->register_read) {
46 if (cfg->platform->register_read(addr, type, &target) != -1) {
60 //printf("Read value from %.8X\n", addr);
67 *val = be16toh(((unsigned short *)read_addr)[0]);
70 case OP_TYPE_LONGWORD:
71 *val = be32toh(((unsigned int *)read_addr)[0]);
82 inline int handle_mapped_write(struct emulator_config *cfg, unsigned int addr, unsigned int value, unsigned char type) {
83 unsigned char *write_addr = NULL;
85 for (int i = 0; i < MAX_NUM_MAPPED_ITEMS; i++) {
86 if (cfg->map_type[i] == MAPTYPE_NONE)
88 else if (CHKRANGE_ABS(addr, cfg->map_offset[i], cfg->map_high[i])) {
89 switch(cfg->map_type[i]) {
94 write_addr = cfg->map_data[i] + (addr - cfg->map_offset[i]);
97 case MAPTYPE_REGISTER:
98 if (cfg->platform && cfg->platform->register_write) {
99 return cfg->platform->register_write(addr, value, type);
109 //printf("Write value to %.8X\n", addr);
112 write_addr[0] = (unsigned char)value;
116 ((short *)write_addr)[0] = htobe16(value);
119 case OP_TYPE_LONGWORD:
120 ((int *)write_addr)[0] = htobe32(value);