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 |
+ |
#endif |
118 |
+ |
#if DIRECT_ADDRESSING |
119 |
+ |
extern uintptr MEMBaseDiff; |
120 |
+ |
#endif |
121 |
+ |
|
122 |
+ |
static __inline__ uae_u8 *do_get_real_address(uaecptr addr) |
123 |
+ |
{ |
124 |
+ |
return (uae_u8 *)MEMBaseDiff + addr; |
125 |
+ |
} |
126 |
+ |
static __inline__ uae_u32 do_get_virtual_address(uae_u8 *addr) |
127 |
+ |
{ |
128 |
+ |
return (uintptr)addr - MEMBaseDiff; |
129 |
+ |
} |
130 |
+ |
|
131 |
+ |
#if REAL_ADDRESSING || DIRECT_ADDRESSING |
132 |
|
static __inline__ uae_u32 get_long(uaecptr addr) |
133 |
|
{ |
134 |
< |
return ntohl(*(uae_u32 *)addr); |
134 |
> |
uae_u32 * const m = (uae_u32 *)do_get_real_address(addr); |
135 |
> |
return do_get_mem_long(m); |
136 |
|
} |
137 |
|
static __inline__ uae_u32 get_word(uaecptr addr) |
138 |
|
{ |
139 |
< |
return ntohs(*(uae_u16 *)addr); |
139 |
> |
uae_u16 * const m = (uae_u16 *)do_get_real_address(addr); |
140 |
> |
return do_get_mem_word(m); |
141 |
|
} |
142 |
|
static __inline__ uae_u32 get_byte(uaecptr addr) |
143 |
|
{ |
144 |
< |
return *(uae_u8 *)addr; |
144 |
> |
uae_u8 * const m = (uae_u8 *)do_get_real_address(addr); |
145 |
> |
return do_get_mem_byte(m); |
146 |
|
} |
147 |
|
static __inline__ void put_long(uaecptr addr, uae_u32 l) |
148 |
|
{ |
149 |
< |
*(uae_u32 *)addr = htonl(l); |
149 |
> |
uae_u32 * const m = (uae_u32 *)do_get_real_address(addr); |
150 |
> |
do_put_mem_long(m, l); |
151 |
|
} |
152 |
|
static __inline__ void put_word(uaecptr addr, uae_u32 w) |
153 |
|
{ |
154 |
< |
*(uae_u16 *)addr = htons(w); |
154 |
> |
uae_u16 * const m = (uae_u16 *)do_get_real_address(addr); |
155 |
> |
do_put_mem_word(m, w); |
156 |
|
} |
157 |
|
static __inline__ void put_byte(uaecptr addr, uae_u32 b) |
158 |
|
{ |
159 |
< |
*(uae_u8 *)addr = b; |
159 |
> |
uae_u8 * const m = (uae_u8 *)do_get_real_address(addr); |
160 |
> |
do_put_mem_byte(m, b); |
161 |
|
} |
162 |
|
static __inline__ uae_u8 *get_real_address(uaecptr addr) |
163 |
|
{ |
164 |
< |
return (uae_u8 *)addr; |
164 |
> |
return do_get_real_address(addr); |
165 |
> |
} |
166 |
> |
static __inline__ uae_u32 get_virtual_address(uae_u8 *addr) |
167 |
> |
{ |
168 |
> |
return do_get_virtual_address(addr); |
169 |
|
} |
170 |
|
static __inline__ int valid_address(uaecptr addr, uae_u32 size) |
171 |
|
{ |
196 |
|
{ |
197 |
|
byteput_1(addr, b); |
198 |
|
} |
169 |
– |
|
199 |
|
static __inline__ uae_u8 *get_real_address(uaecptr addr) |
200 |
|
{ |
201 |
|
return get_mem_bank(addr).xlateaddr(addr); |
202 |
|
} |
203 |
< |
|
203 |
> |
/* gb-- deliberately not implemented since it shall not be used... */ |
204 |
> |
extern uae_u32 get_virtual_address(uae_u8 *addr); |
205 |
|
static __inline__ int valid_address(uaecptr addr, uae_u32 size) |
206 |
|
{ |
207 |
|
return get_mem_bank(addr).check(addr, size); |
208 |
|
} |
209 |
< |
#endif |
209 |
> |
#endif /* DIRECT_ADDRESSING || REAL_ADDRESSING */ |
210 |
> |
|
211 |
> |
#endif /* MEMORY_H */ |
212 |
|
|
181 |
– |
#endif |