1 #include "config_file/config_file.h"
3 #include "platforms/amiga/Gayle.h"
6 #define CHKRANGE(a, b, c) a >= (unsigned int)b && a < (unsigned int)(b + c)
7 #define CHKRANGE_ABS(a, b, c) a >= (unsigned int)b && a < (unsigned int) c
9 static unsigned int target;
12 extern const char *map_type_names[MAPTYPE_NUM];
13 const char *op_type_names[OP_TYPE_NUM] = {
20 inline int handle_mapped_read(struct emulator_config *cfg, unsigned int addr, unsigned int *val, unsigned char type) {
21 unsigned char *read_addr = NULL;
23 for (int i = 0; i < MAX_NUM_MAPPED_ITEMS; i++) {
24 if (cfg->map_type[i] == MAPTYPE_NONE)
26 else if (ovl && cfg->map_type[i] == MAPTYPE_ROM) {
27 if (cfg->map_mirror[i] != -1 && CHKRANGE(addr, cfg->map_mirror[i], cfg->map_size[i])) {
28 read_addr = cfg->map_data[i] + ((addr - cfg->map_mirror[i]) % cfg->rom_size[i]);
32 if (CHKRANGE_ABS(addr, cfg->map_offset[i], cfg->map_high[i])) {
33 switch(cfg->map_type[i]) {
35 read_addr = cfg->map_data[i] + ((addr - cfg->map_offset[i]) % cfg->rom_size[i]);
39 read_addr = cfg->map_data[i] + (addr - cfg->map_offset[i]);
42 case MAPTYPE_REGISTER:
43 if (cfg->platform && cfg->platform->register_read) {
44 if (cfg->platform->register_read(addr, type, &target) != -1) {
58 //printf("Read value from %.8X\n", addr);
65 *val = be16toh(((unsigned short *)read_addr)[0]);
68 case OP_TYPE_LONGWORD:
69 *val = be32toh(((unsigned int *)read_addr)[0]);
80 inline int handle_mapped_write(struct emulator_config *cfg, unsigned int addr, unsigned int value, unsigned char type) {
81 unsigned char *write_addr = NULL;
83 for (int i = 0; i < MAX_NUM_MAPPED_ITEMS; i++) {
84 if (cfg->map_type[i] == MAPTYPE_NONE)
86 else if (CHKRANGE_ABS(addr, cfg->map_offset[i], cfg->map_high[i])) {
87 switch(cfg->map_type[i]) {
92 write_addr = cfg->map_data[i] + (addr - cfg->map_offset[i]);
95 case MAPTYPE_REGISTER:
96 if (cfg->platform && cfg->platform->register_write) {
97 return cfg->platform->register_write(addr, value, type);
107 //printf("Write value to %.8X\n", addr);
110 write_addr[0] = (unsigned char)value;
114 ((short *)write_addr)[0] = htobe16(value);
117 case OP_TYPE_LONGWORD:
118 ((int *)write_addr)[0] = htobe32(value);