--- previous/src/cpu/cpummu030.h 2018/04/24 19:30:18 1.1.1.2 +++ previous/src/cpu/cpummu030.h 2018/04/24 19:31:54 1.1.1.3 @@ -1,5 +1,5 @@ -#ifndef CPUMMU030_H -#define CPUMMU030_H +#ifndef UAE_CPUMMU030_H +#define UAE_CPUMMU030_H #include "mmu_common.h" @@ -12,6 +12,8 @@ extern uae_u32 mm030_stageb_address; extern int mmu030_idx; extern bool mmu030_retry; extern int mmu030_opcode, mmu030_opcode_stageb; +extern int mmu030_fake_prefetch; +extern uaecptr mmu030_fake_prefetch_addr; extern uae_u16 mmu030_state[3]; extern uae_u32 mmu030_data_buffer; extern uae_u32 mmu030_disp_store[2]; @@ -31,11 +33,12 @@ struct mmu030_access extern struct mmu030_access mmu030_ad[MAX_MMU030_ACCESS]; uae_u32 REGPARAM3 get_disp_ea_020_mmu030 (uae_u32 base, int idx) REGPARAM; +void mmu030_page_fault(uaecptr addr, bool read, int flags, uae_u32 fc); -void mmu_op30_pmove (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra); -void mmu_op30_ptest (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra); -void mmu_op30_pload (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra); -void mmu_op30_pflush (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra); +bool mmu_op30_pmove (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra); +bool mmu_op30_ptest (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra); +bool mmu_op30_pload (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra); +bool mmu_op30_pflush (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra); uae_u32 mmu_op30_helper_get_fc(uae_u16 next); @@ -52,8 +55,8 @@ typedef struct { } TT_info; TT_info mmu030_decode_tt(uae_u32 TT); -void mmu030_decode_tc(uae_u32 TC); -void mmu030_decode_rp(uae_u64 RP); +bool mmu030_decode_tc(uae_u32 TC); +bool mmu030_decode_rp(uae_u64 RP); int mmu030_logical_is_in_atc(uaecptr addr, uae_u32 fc, bool write); void mmu030_atc_handle_history_bit(int entry_num); @@ -65,16 +68,20 @@ uae_u32 mmu030_get_long_atc(uaecptr addr uae_u16 mmu030_get_word_atc(uaecptr addr, int l, uae_u32 fc); uae_u8 mmu030_get_byte_atc(uaecptr addr, int l, uae_u32 fc); +void mmu030_put_atc_generic(uaecptr addr, uae_u32 val, int l, uae_u32 fc, int size, int flags); +uae_u32 mmu030_get_atc_generic(uaecptr addr, int l, uae_u32 fc, int size, int flags, bool checkwrite); + void mmu030_flush_atc_fc(uae_u32 fc_base, uae_u32 fc_mask); void mmu030_flush_atc_page(uaecptr logical_addr); void mmu030_flush_atc_page_fc(uaecptr logical_addr, uae_u32 fc_base, uae_u32 fc_mask); void mmu030_flush_atc_all(void); void mmu030_reset(int hardreset); +void mmu030_set_funcs(void); uaecptr mmu030_translate(uaecptr addr, bool super, bool data, bool write); int mmu030_match_ttr(uaecptr addr, uae_u32 fc, bool write); int mmu030_match_ttr_access(uaecptr addr, uae_u32 fc, bool write); -int mmu030_match_lrmw_ttr(uaecptr addr, uae_u32 fc); +int mmu030_match_lrmw_ttr_access(uaecptr addr, uae_u32 fc); int mmu030_do_match_ttr(uae_u32 tt, TT_info masks, uaecptr addr, uae_u32 fc, bool write); int mmu030_do_match_lrmw_ttr(uae_u32 tt, TT_info masks, uaecptr addr, uae_u32 fc); @@ -84,14 +91,18 @@ void mmu030_put_byte(uaecptr addr, uae_u uae_u32 mmu030_get_long(uaecptr addr, uae_u32 fc); uae_u16 mmu030_get_word(uaecptr addr, uae_u32 fc); uae_u8 mmu030_get_byte(uaecptr addr, uae_u32 fc); +uae_u32 mmu030_get_ilong(uaecptr addr, uae_u32 fc); +uae_u16 mmu030_get_iword(uaecptr addr, uae_u32 fc); uae_u32 uae_mmu030_get_lrmw(uaecptr addr, int size); void uae_mmu030_put_lrmw(uaecptr addr, uae_u32 val, int size); +void mmu030_put_generic(uaecptr addr, uae_u32 val, uae_u32 fc, int size, int accesssize, int flags); uae_u32 mmu030_get_generic(uaecptr addr, uae_u32 fc, int size, int accesssize, int flags); extern uae_u16 REGPARAM3 mmu030_get_word_unaligned(uaecptr addr, uae_u32 fc, int flags) REGPARAM; extern uae_u32 REGPARAM3 mmu030_get_long_unaligned(uaecptr addr, uae_u32 fc, int flags) REGPARAM; +extern uae_u32 REGPARAM3 mmu030_get_ilong_unaligned(uaecptr addr, uae_u32 fc, int flags) REGPARAM; extern uae_u16 REGPARAM3 mmu030_get_lrmw_word_unaligned(uaecptr addr, uae_u32 fc, int flags) REGPARAM; extern uae_u32 REGPARAM3 mmu030_get_lrmw_long_unaligned(uaecptr addr, uae_u32 fc, int flags) REGPARAM; extern void REGPARAM3 mmu030_put_word_unaligned(uaecptr addr, uae_u16 val, uae_u32 fc, int flags) REGPARAM; @@ -102,16 +113,13 @@ static ALWAYS_INLINE uae_u32 uae_mmu030_ uae_u32 fc = (regs.s ? 4 : 0) | 2; if (unlikely(is_unaligned(addr, 4))) - return mmu030_get_long_unaligned(addr, fc, 0); - return mmu030_get_long(addr, fc); + return mmu030_get_ilong_unaligned(addr, fc, 0); + return mmu030_get_ilong(addr, fc); } static ALWAYS_INLINE uae_u16 uae_mmu030_get_iword(uaecptr addr) { uae_u32 fc = (regs.s ? 4 : 0) | 2; - - if (unlikely(is_unaligned(addr, 2))) - return mmu030_get_word_unaligned(addr, fc, 0); - return mmu030_get_word(addr, fc); + return mmu030_get_iword(addr, fc); } static ALWAYS_INLINE uae_u16 uae_mmu030_get_ibyte(uaecptr addr) { @@ -201,7 +209,7 @@ static ALWAYS_INLINE void dfc030_put_lon { uae_u32 fc = regs.dfc; #if MMUDEBUG > 2 - write_log(_T("dfc030_put_long: FC = %i\n"),fc); + write_log(_T("dfc030_put_long: %08X = %08X FC = %i\n"), addr, val, fc); #endif if (unlikely(is_unaligned(addr, 4))) mmu030_put_long_unaligned(addr, val, fc, 0); @@ -213,7 +221,7 @@ static ALWAYS_INLINE void dfc030_put_wor { uae_u32 fc = regs.dfc; #if MMUDEBUG > 2 - write_log(_T("dfc030_put_word: FC = %i\n"),fc); + write_log(_T("dfc030_put_word: %08X = %04X FC = %i\n"), addr, val, fc); #endif if (unlikely(is_unaligned(addr, 2))) mmu030_put_word_unaligned(addr, val, fc, 0); @@ -225,7 +233,7 @@ static ALWAYS_INLINE void dfc030_put_byt { uae_u32 fc = regs.dfc; #if MMUDEBUG > 2 - write_log(_T("dfc030_put_byte: FC = %i\n"),fc); + write_log(_T("dfc030_put_byte: %08X = %02X FC = %i\n"), addr, val, fc); #endif mmu030_put_byte(addr, val, fc); } @@ -354,7 +362,7 @@ STATIC_INLINE uae_u32 get_lrmw_long_mmu0 STATIC_INLINE uae_u32 get_ibyte_mmu030_state (int o) { uae_u32 v; - uae_u32 addr = m68k_getpc () + o; + uae_u32 addr = m68k_getpci () + o; ACCESS_CHECK_GET v = uae_mmu030_get_iword (addr); ACCESS_EXIT_GET @@ -363,7 +371,7 @@ STATIC_INLINE uae_u32 get_ibyte_mmu030_s STATIC_INLINE uae_u32 get_iword_mmu030_state (int o) { uae_u32 v; - uae_u32 addr = m68k_getpc () + o; + uae_u32 addr = m68k_getpci () + o; ACCESS_CHECK_GET v = uae_mmu030_get_iword (addr); ACCESS_EXIT_GET @@ -372,7 +380,7 @@ STATIC_INLINE uae_u32 get_iword_mmu030_s STATIC_INLINE uae_u32 get_ilong_mmu030_state (int o) { uae_u32 v; - uae_u32 addr = m68k_getpc () + o; + uae_u32 addr = m68k_getpci () + o; ACCESS_CHECK_GET v = uae_mmu030_get_ilong (addr); ACCESS_EXIT_GET @@ -381,7 +389,7 @@ STATIC_INLINE uae_u32 get_ilong_mmu030_s STATIC_INLINE uae_u32 next_iword_mmu030_state (void) { uae_u32 v; - uae_u32 addr = m68k_getpc (); + uae_u32 addr = m68k_getpci (); ACCESS_CHECK_GET_PC(2); v = uae_mmu030_get_iword (addr); m68k_incpci (2); @@ -391,7 +399,7 @@ STATIC_INLINE uae_u32 next_iword_mmu030_ STATIC_INLINE uae_u32 next_ilong_mmu030_state (void) { uae_u32 v; - uae_u32 addr = m68k_getpc (); + uae_u32 addr = m68k_getpci (); ACCESS_CHECK_GET_PC(4); v = uae_mmu030_get_ilong (addr); m68k_incpci (4); @@ -427,23 +435,23 @@ STATIC_INLINE void put_long_mmu030 (uaec STATIC_INLINE uae_u32 get_ibyte_mmu030 (int o) { - uae_u32 pc = m68k_getpc () + o; + uae_u32 pc = m68k_getpci () + o; return uae_mmu030_get_iword (pc); } STATIC_INLINE uae_u32 get_iword_mmu030 (int o) { - uae_u32 pc = m68k_getpc () + o; + uae_u32 pc = m68k_getpci () + o; return uae_mmu030_get_iword (pc); } STATIC_INLINE uae_u32 get_ilong_mmu030 (int o) { - uae_u32 pc = m68k_getpc () + o; + uae_u32 pc = m68k_getpci () + o; return uae_mmu030_get_ilong (pc); } STATIC_INLINE uae_u32 next_iword_mmu030 (void) { uae_u32 v; - uae_u32 pc = m68k_getpc (); + uae_u32 pc = m68k_getpci (); v = uae_mmu030_get_iword (pc); m68k_incpci (2); return v; @@ -451,7 +459,7 @@ STATIC_INLINE uae_u32 next_iword_mmu030 STATIC_INLINE uae_u32 next_ilong_mmu030 (void) { uae_u32 v; - uae_u32 pc = m68k_getpc (); + uae_u32 pc = m68k_getpci (); v = uae_mmu030_get_ilong (pc); m68k_incpci (4); return v; @@ -461,5 +469,5 @@ extern void m68k_do_rts_mmu030 (void); extern void m68k_do_rte_mmu030 (uaecptr a7); extern void flush_mmu030 (uaecptr, int); extern void m68k_do_bsr_mmu030 (uaecptr oldpc, uae_s32 offset); -extern void mmu030_page_fault(uaecptr addr, bool read, int flags, uae_u32 fc); -#endif + +#endif /* UAE_CPUMMU030_H */