@@ -41,18 +41,26 @@ static void xmap_set(uptr *map, int shift, u32 start_addr, u32 end_addr,
4141 return ;
4242 }
4343
44- if (addr & 1 ) {
45- elprintf (EL_STATUS |EL_ANOMALY , "xmap_set: ptr is not aligned: %08lx" , addr );
46- return ;
44+ if (is_func ) {
45+ if (addr & ((1 << MAP_FUNCTION_SHIFT ) - 1 )) {
46+ elprintf (EL_STATUS |EL_ANOMALY , "xmap_set: function ptr is not aligned: %08lx" , addr );
47+ return ;
48+ }
49+ } else {
50+ if (addr & 1 ) {
51+ elprintf (EL_STATUS |EL_ANOMALY , "xmap_set: data ptr is not aligned: %08lx" , addr );
52+ return ;
53+ }
4754 }
4855
4956 if (!is_func )
5057 addr -= start_addr ;
5158
5259 for (i = start_addr >> shift ; i <= end_addr >> shift ; i ++ ) {
53- map [i ] = addr >> 1 ;
5460 if (is_func )
55- map [i ] |= MAP_FLAG ;
61+ map [i ] = (addr >> MAP_FUNCTION_SHIFT ) | MAP_FLAG ;
62+ else
63+ map [i ] = addr >> 1 ;
5664 }
5765}
5866
@@ -168,8 +176,8 @@ void cpu68k_map_read_funcs(u32 start_addr, u32 end_addr, u32 (*r8)(u32), u32 (*r
168176 r16map = s68k_read16_map ;
169177 }
170178
171- ar8 = (ar8 >> 1 ) | MAP_FLAG ;
172- ar16 = (ar16 >> 1 ) | MAP_FLAG ;
179+ ar8 = (ar8 >> MAP_FUNCTION_SHIFT ) | MAP_FLAG ;
180+ ar16 = (ar16 >> MAP_FUNCTION_SHIFT ) | MAP_FLAG ;
173181 for (i = start_addr >> shift ; i <= end_addr >> shift ; i ++ )
174182 r8map [i ] = ar8 , r16map [i ] = ar16 ;
175183}
@@ -194,10 +202,10 @@ void cpu68k_map_all_funcs(u32 start_addr, u32 end_addr, u32 (*r8)(u32), u32 (*r1
194202 w16map = s68k_write16_map ;
195203 }
196204
197- ar8 = (ar8 >> 1 ) | MAP_FLAG ;
198- ar16 = (ar16 >> 1 ) | MAP_FLAG ;
199- aw8 = (aw8 >> 1 ) | MAP_FLAG ;
200- aw16 = (aw16 >> 1 ) | MAP_FLAG ;
205+ ar8 = (ar8 >> MAP_FUNCTION_SHIFT ) | MAP_FLAG ;
206+ ar16 = (ar16 >> MAP_FUNCTION_SHIFT ) | MAP_FLAG ;
207+ aw8 = (aw8 >> MAP_FUNCTION_SHIFT ) | MAP_FLAG ;
208+ aw16 = (aw16 >> MAP_FUNCTION_SHIFT ) | MAP_FLAG ;
201209 for (i = start_addr >> shift ; i <= end_addr >> shift ; i ++ )
202210 r8map [i ] = ar8 , r16map [i ] = ar16 , w8map [i ] = aw8 , w16map [i ] = aw16 ;
203211}
@@ -246,19 +254,19 @@ void m68k_map_unmap(u32 start_addr, u32 end_addr)
246254
247255 addr = (uptr )m68k_unmapped_read8 ;
248256 for (i = start_addr >> shift ; i <= end_addr >> shift ; i ++ )
249- m68k_read8_map [i ] = (addr >> 1 ) | MAP_FLAG ;
257+ m68k_read8_map [i ] = (addr >> MAP_FUNCTION_SHIFT ) | MAP_FLAG ;
250258
251259 addr = (uptr )m68k_unmapped_read16 ;
252260 for (i = start_addr >> shift ; i <= end_addr >> shift ; i ++ )
253- m68k_read16_map [i ] = (addr >> 1 ) | MAP_FLAG ;
261+ m68k_read16_map [i ] = (addr >> MAP_FUNCTION_SHIFT ) | MAP_FLAG ;
254262
255263 addr = (uptr )m68k_unmapped_write8 ;
256264 for (i = start_addr >> shift ; i <= end_addr >> shift ; i ++ )
257- m68k_write8_map [i ] = (addr >> 1 ) | MAP_FLAG ;
265+ m68k_write8_map [i ] = (addr >> MAP_FUNCTION_SHIFT ) | MAP_FLAG ;
258266
259267 addr = (uptr )m68k_unmapped_write16 ;
260268 for (i = start_addr >> shift ; i <= end_addr >> shift ; i ++ )
261- m68k_write16_map [i ] = (addr >> 1 ) | MAP_FLAG ;
269+ m68k_write16_map [i ] = (addr >> MAP_FUNCTION_SHIFT ) | MAP_FLAG ;
262270}
263271
264272#ifndef _ASM_MEMORY_C
0 commit comments