9 |
|
#ifndef UAE_MEMORY_H |
10 |
|
#define UAE_MEMORY_H |
11 |
|
|
12 |
+ |
#if !DIRECT_ADDRESSING && !REAL_ADDRESSING |
13 |
+ |
|
14 |
|
/* Enabling this adds one additional native memory reference per 68k memory |
15 |
|
* access, but saves one shift (on the x86). Enabling this is probably |
16 |
|
* better for the cache. My favourite benchmark (PP2) doesn't show a |
110 |
|
|
111 |
|
#endif |
112 |
|
|
113 |
+ |
#endif /* !DIRECT_ADDRESSING && !REAL_ADDRESSING */ |
114 |
+ |
|
115 |
|
#if REAL_ADDRESSING |
116 |
+ |
const uintptr MEMBaseDiff = 0; |
117 |
+ |
#define do_get_real_address(a) ((uae_u8 *)(a)) |
118 |
+ |
#define do_get_virtual_address(a) ((uae_u32)(a)) |
119 |
+ |
#endif /* REAL_ADDRESSING */ |
120 |
+ |
|
121 |
+ |
#if DIRECT_ADDRESSING |
122 |
+ |
extern uintptr MEMBaseDiff; |
123 |
+ |
#define do_get_real_address(a) ((uae_u8 *)(a) + MEMBaseDiff) |
124 |
+ |
#define do_get_virtual_address(a) ((uae_u32)(a) - MEMBaseDiff) |
125 |
+ |
#endif /* DIRECT_ADDRESSING */ |
126 |
+ |
|
127 |
+ |
#if REAL_ADDRESSING || DIRECT_ADDRESSING |
128 |
|
static __inline__ uae_u32 get_long(uaecptr addr) |
129 |
|
{ |
130 |
< |
return ntohl(*(uae_u32 *)addr); |
130 |
> |
uae_u32 * const m = (uae_u32 *)do_get_real_address(addr); |
131 |
> |
return do_get_mem_long(m); |
132 |
|
} |
133 |
|
static __inline__ uae_u32 get_word(uaecptr addr) |
134 |
|
{ |
135 |
< |
return ntohs(*(uae_u16 *)addr); |
135 |
> |
uae_u16 * const m = (uae_u16 *)do_get_real_address(addr); |
136 |
> |
return do_get_mem_word(m); |
137 |
|
} |
138 |
|
static __inline__ uae_u32 get_byte(uaecptr addr) |
139 |
|
{ |
140 |
< |
return *(uae_u8 *)addr; |
140 |
> |
uae_u8 * const m = (uae_u8 *)do_get_real_address(addr); |
141 |
> |
return do_get_mem_byte(m); |
142 |
|
} |
143 |
|
static __inline__ void put_long(uaecptr addr, uae_u32 l) |
144 |
|
{ |
145 |
< |
*(uae_u32 *)addr = htonl(l); |
145 |
> |
uae_u32 * const m = (uae_u32 *)do_get_real_address(addr); |
146 |
> |
do_put_mem_long(m, l); |
147 |
|
} |
148 |
|
static __inline__ void put_word(uaecptr addr, uae_u32 w) |
149 |
|
{ |
150 |
< |
*(uae_u16 *)addr = htons(w); |
150 |
> |
uae_u16 * const m = (uae_u16 *)do_get_real_address(addr); |
151 |
> |
do_put_mem_word(m, w); |
152 |
|
} |
153 |
|
static __inline__ void put_byte(uaecptr addr, uae_u32 b) |
154 |
|
{ |
155 |
< |
*(uae_u8 *)addr = b; |
155 |
> |
uae_u8 * const m = (uae_u8 *)do_get_real_address(addr); |
156 |
> |
do_put_mem_byte(m, b); |
157 |
|
} |
158 |
|
static __inline__ uae_u8 *get_real_address(uaecptr addr) |
159 |
|
{ |
160 |
< |
return (uae_u8 *)addr; |
160 |
> |
return do_get_real_address(addr); |
161 |
> |
} |
162 |
> |
static __inline__ uae_u32 get_virtual_address(uae_u8 *addr) |
163 |
> |
{ |
164 |
> |
return do_get_virtual_address(addr); |
165 |
|
} |
166 |
|
static __inline__ int valid_address(uaecptr addr, uae_u32 size) |
167 |
|
{ |
192 |
|
{ |
193 |
|
byteput_1(addr, b); |
194 |
|
} |
169 |
– |
|
195 |
|
static __inline__ uae_u8 *get_real_address(uaecptr addr) |
196 |
|
{ |
197 |
|
return get_mem_bank(addr).xlateaddr(addr); |
198 |
|
} |
199 |
< |
|
199 |
> |
/* gb-- deliberately not implemented since it shall not be used... */ |
200 |
> |
extern uae_u32 get_virtual_address(uae_u8 *addr); |
201 |
|
static __inline__ int valid_address(uaecptr addr, uae_u32 size) |
202 |
|
{ |
203 |
|
return get_mem_bank(addr).check(addr, size); |
204 |
|
} |
205 |
< |
#endif |
205 |
> |
#endif /* DIRECT_ADDRESSING || REAL_ADDRESSING */ |
206 |
> |
|
207 |
> |
#endif /* MEMORY_H */ |
208 |
|
|
181 |
– |
#endif |