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