return res;
}
-static void unalign_init(bool l, bool l2)
+static void unalign_init(uaecptr addr, bool l, bool l2)
{
if (l2)
mmu030_state[1] |= MMU030_STATEFLAG1_SUBACCESSX;
if (l)
mmu030_state[1] |= MMU030_STATEFLAG1_SUBACCESSL;
mmu030_state[1] |= MMU030_STATEFLAG1_SUBACCESS0;
+#if MMU030_DEBUG > 1
+ write_log(_T("unalign_init %08x %08x %d %d\n"), addr, mmu030_state[1], l, l2);
+#endif
}
static void unalign_set(int state)
{
mmu030_state[1] |= (1 << state) << (MMU030_STATEFLAG1_SUBACCESS_SHIFT + 1);
+#if MMU030_DEBUG > 1
+ write_log(_T("unalign_set %d %08x\n"), state, mmu030_state[1]);
+#endif
}
static void unalign_clear(void)
{
+#if MMU030_DEBUG > 1
+ write_log(_T("unalign_clear %08x %08x\n"), mmu030_state[1], mmu030_data_buffer_out);
+#endif
mmu030_state[1] &= ~(MMU030_STATEFLAG1_SUBACCESSL | MMU030_STATEFLAG1_SUBACCESSX |
MMU030_STATEFLAG1_SUBACCESS0 | MMU030_STATEFLAG1_SUBACCESS1 | MMU030_STATEFLAG1_SUBACCESS2 | MMU030_STATEFLAG1_SUBACCESS3);
}
uae_u16 REGPARAM2 mmu030_get_word_unaligned(uaecptr addr, uae_u32 fc, int flags)
{
- unalign_init(false, false);
- mmu030_data_buffer_out = (uae_u16)mmu030_get_generic(addr, fc, sz_byte, flags | MMU030_SSW_SIZE_W) << 8;
+ unalign_init(addr, false, false);
+ mmu030_data_buffer_out = mmu030_get_generic(addr, fc, sz_byte, flags | MMU030_SSW_SIZE_W) << 8;
unalign_set(0);
mmu030_data_buffer_out |= mmu030_get_generic(addr + 1, fc, sz_byte, flags | MMU030_SSW_SIZE_B);
unalign_clear();
uae_u32 REGPARAM2 mmu030_get_long_unaligned(uaecptr addr, uae_u32 fc, int flags)
{
if (likely(!(addr & 1))) {
- unalign_init(true, false);
- mmu030_data_buffer_out = (uae_u32)mmu030_get_generic(addr, fc, sz_word, flags | MMU030_SSW_SIZE_L) << 16;
+ unalign_init(addr, true, false);
+ mmu030_data_buffer_out = mmu030_get_generic(addr, fc, sz_word, flags | MMU030_SSW_SIZE_L) << 16;
unalign_set(0);
mmu030_data_buffer_out |= mmu030_get_generic(addr + 2, fc, sz_word, flags | MMU030_SSW_SIZE_W);
} else {
- unalign_init(true, true);
- mmu030_data_buffer_out = (uae_u32)mmu030_get_generic(addr, fc, sz_byte, flags | MMU030_SSW_SIZE_L) << 24;
+ unalign_init(addr, true, true);
+ mmu030_data_buffer_out = mmu030_get_generic(addr, fc, sz_byte, flags | MMU030_SSW_SIZE_L) << 24;
unalign_set(0);
mmu030_data_buffer_out |= mmu030_get_generic(addr + 1, fc, sz_word, flags | MMU030_SSW_SIZE_W) << 8;
unalign_set(1);
void REGPARAM2 mmu030_put_long_unaligned(uaecptr addr, uae_u32 val, uae_u32 fc, int flags)
{
if (likely(!(addr & 1))) {
- unalign_init(true, false);
+ unalign_init(addr, true, false);
mmu030_put_generic(addr, val >> 16, fc, sz_word, flags | MMU030_SSW_SIZE_L);
unalign_set(0);
mmu030_put_generic(addr + 2, val, fc, sz_word, flags | MMU030_SSW_SIZE_W);
} else {
- unalign_init(true, true);
+ unalign_init(addr, true, true);
mmu030_put_generic(addr, val >> 24, fc, sz_byte, flags | MMU030_SSW_SIZE_L);
unalign_set(0);
mmu030_put_generic(addr + 1, val >> 8, fc, sz_word, flags | MMU030_SSW_SIZE_W);
void REGPARAM2 mmu030_put_word_unaligned(uaecptr addr, uae_u16 val, uae_u32 fc, int flags)
{
- unalign_init(false, false);
+ unalign_init(addr, false, false);
mmu030_put_generic(addr, val >> 8, fc, sz_byte, flags | MMU030_SSW_SIZE_W);
unalign_set(0);
mmu030_put_generic(addr + 1, val, fc, sz_byte, flags | MMU030_SSW_SIZE_B);
#endif
#if MMU030_DEBUG
- write_log(_T("%08x %08x %08x %08x %08x %d %d %d %08x %08x\n"),
+ write_log(_T("%08x %08x %08x %08x %08x %d %d %d %08x %08x %04x\n"),
mmu030_state[1], mmu030_state[2], mmu030_disp_store[0], mmu030_disp_store[1],
- addr, read, size, fc, mmu030_data_buffer_out, mmu030_ad[idxsize].val);
+ addr, read, size, fc, mmu030_data_buffer_out, mmu030_ad[idxsize].val, ssw);
#endif
if (read) {