]> git.sesse.net Git - pistorm/blob - memory_mapped.c
Actually add data/fs directory
[pistorm] / memory_mapped.c
1 // SPDX-License-Identifier: MIT
2
3 #include "config_file/config_file.h"
4 #include "m68k.h"
5 #include "platforms/amiga/Gayle.h"
6 #include <endian.h>
7
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
10
11 static unsigned int target;
12 extern int ovl;
13
14 extern const char *map_type_names[MAPTYPE_NUM];
15 const char *op_type_names[OP_TYPE_NUM] = {
16   "BYTE",
17   "WORD",
18   "LONGWORD",
19   "MEM",
20 };
21
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;
24
25   for (int i = 0; i < MAX_NUM_MAPPED_ITEMS; i++) {
26     if (cfg->map_type[i] == MAPTYPE_NONE)
27       continue;
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]);
31         goto read_value;
32       }
33     }
34     if (CHKRANGE_ABS(addr, cfg->map_offset[i], cfg->map_high[i])) {
35       switch(cfg->map_type[i]) {
36         case MAPTYPE_ROM:
37           read_addr = cfg->map_data[i] + ((addr - cfg->map_offset[i]) % cfg->rom_size[i]);
38           goto read_value;
39           break;
40         case MAPTYPE_RAM:
41           read_addr = cfg->map_data[i] + (addr - cfg->map_offset[i]);
42           goto read_value;
43           break;
44         case MAPTYPE_REGISTER:
45           if (cfg->platform && cfg->platform->register_read) {
46             if (cfg->platform->register_read(addr, type, &target) != -1) {
47               *val = target;
48               return 1;
49             }
50           }
51           return -1;
52           break;
53       }
54     }
55   }
56
57   return -1;
58
59 read_value:;
60   //printf("Read value from %.8X\n", addr);
61   switch(type) {
62     case OP_TYPE_BYTE:
63       *val = read_addr[0];
64       return 1;
65       break;
66     case OP_TYPE_WORD:
67       *val = be16toh(((unsigned short *)read_addr)[0]);
68       return 1;
69       break;
70     case OP_TYPE_LONGWORD:
71       *val = be32toh(((unsigned int *)read_addr)[0]);
72       return 1;
73       break;
74     case OP_TYPE_MEM:
75       return -1;
76       break;
77   }
78
79   return 1;
80 }
81
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;
84
85   for (int i = 0; i < MAX_NUM_MAPPED_ITEMS; i++) {
86     if (cfg->map_type[i] == MAPTYPE_NONE)
87       continue;
88     else if (CHKRANGE_ABS(addr, cfg->map_offset[i], cfg->map_high[i])) {
89       switch(cfg->map_type[i]) {
90         case MAPTYPE_ROM:
91           return 1;
92           break;
93         case MAPTYPE_RAM:
94           write_addr = cfg->map_data[i] + (addr - cfg->map_offset[i]);
95           goto write_value;
96           break;
97         case MAPTYPE_REGISTER:
98           if (cfg->platform && cfg->platform->register_write) {
99             return cfg->platform->register_write(addr, value, type);
100           }
101           break;
102       }
103     }
104   }
105
106   return -1;
107
108 write_value:;
109   //printf("Write value to %.8X\n", addr);
110   switch(type) {
111     case OP_TYPE_BYTE:
112       write_addr[0] = (unsigned char)value;
113       return 1;
114       break;
115     case OP_TYPE_WORD:
116       ((short *)write_addr)[0] = htobe16(value);
117       return 1;
118       break;
119     case OP_TYPE_LONGWORD:
120       ((int *)write_addr)[0] = htobe32(value);
121       return 1;
122       break;
123     case OP_TYPE_MEM:
124       return -1;
125       break;
126   }
127
128   return 1;
129 }