|
|
1.1 ! root 1: #ifndef CPUMMU030_H ! 2: #define CPUMMU030_H ! 3: ! 4: #include "mmu_common.h" ! 5: ! 6: void mmu_op30_pmove (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra); ! 7: void mmu_op30_ptest (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra); ! 8: void mmu_op30_pload (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra); ! 9: void mmu_op30_pflush (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra); ! 10: ! 11: uae_u32 mmu_op30_helper_get_fc(uae_u16 next); ! 12: ! 13: void mmu030_ptest_atc_search(uaecptr logical_addr, uae_u32 fc, bool write); ! 14: uae_u32 mmu030_ptest_table_search(uaecptr extra, uae_u32 fc, bool write, int level); ! 15: uae_u32 mmu030_table_search(uaecptr addr, uae_u32 fc, bool write, int level); ! 16: ! 17: ! 18: typedef struct { ! 19: uae_u32 addr_base; ! 20: uae_u32 addr_mask; ! 21: uae_u32 fc_base; ! 22: uae_u32 fc_mask; ! 23: } TT_info; ! 24: ! 25: TT_info mmu030_decode_tt(uae_u32 TT); ! 26: void mmu030_decode_tc(uae_u32 TC); ! 27: void mmu030_decode_rp(uae_u64 RP); ! 28: ! 29: int mmu030_logical_is_in_atc(uaecptr addr, uae_u32 fc, bool write); ! 30: void mmu030_atc_handle_history_bit(int entry_num); ! 31: ! 32: void mmu030_put_long_atc(uaecptr addr, uae_u32 val, int l); ! 33: void mmu030_put_word_atc(uaecptr addr, uae_u16 val, int l); ! 34: void mmu030_put_byte_atc(uaecptr addr, uae_u8 val, int l); ! 35: uae_u32 mmu030_get_long_atc(uaecptr addr, int l); ! 36: uae_u16 mmu030_get_word_atc(uaecptr addr, int l); ! 37: uae_u8 mmu030_get_byte_atc(uaecptr addr, int l); ! 38: ! 39: void mmu030_flush_atc_fc(uae_u32 fc_base, uae_u32 fc_mask); ! 40: void mmu030_flush_atc_page(uaecptr logical_addr); ! 41: void mmu030_flush_atc_page_fc(uaecptr logical_addr, uae_u32 fc_base, uae_u32 fc_mask); ! 42: void mmu030_flush_atc_all(void); ! 43: void mmu030_reset(int hardreset); ! 44: ! 45: int mmu030_match_ttr(uaecptr addr, uae_u32 fc, bool write); ! 46: int mmu030_do_match_ttr(uae_u32 tt, TT_info masks, uaecptr addr, uae_u32 fc, bool write); ! 47: ! 48: void mmu030_put_long(uaecptr addr, uae_u32 val, uae_u32 fc, int size); ! 49: void mmu030_put_word(uaecptr addr, uae_u16 val, uae_u32 fc, int size); ! 50: void mmu030_put_byte(uaecptr addr, uae_u8 val, uae_u32 fc, int size); ! 51: uae_u32 mmu030_get_long(uaecptr addr, uae_u32 fc, int size); ! 52: uae_u16 mmu030_get_word(uaecptr addr, uae_u32 fc, int size); ! 53: uae_u8 mmu030_get_byte(uaecptr addr, uae_u32 fc, int size); ! 54: ! 55: void mmu030_page_fault(uaecptr addr, bool read); ! 56: ! 57: extern uae_u16 REGPARAM3 mmu030_get_word_unaligned(uaecptr addr, uae_u32 fc) REGPARAM; ! 58: extern uae_u32 REGPARAM3 mmu030_get_long_unaligned(uaecptr addr, uae_u32 fc) REGPARAM; ! 59: extern void REGPARAM3 mmu030_put_word_unaligned(uaecptr addr, uae_u16 val, uae_u32 fc) REGPARAM; ! 60: extern void REGPARAM3 mmu030_put_long_unaligned(uaecptr addr, uae_u32 val, uae_u32 fc) REGPARAM; ! 61: ! 62: static ALWAYS_INLINE uae_u32 uae_mmu030_get_ilong(uaecptr addr) ! 63: { ! 64: uae_u32 fc = (regs.s ? 4 : 0) | 2; ! 65: ! 66: if (unlikely(is_unaligned(addr, 4))) ! 67: return mmu030_get_long_unaligned(addr, fc); ! 68: return mmu030_get_long(addr, fc, sz_long); ! 69: } ! 70: static ALWAYS_INLINE uae_u16 uae_mmu030_get_iword(uaecptr addr) ! 71: { ! 72: uae_u32 fc = (regs.s ? 4 : 0) | 2; ! 73: ! 74: if (unlikely(is_unaligned(addr, 2))) ! 75: return mmu030_get_word_unaligned(addr, fc); ! 76: return mmu030_get_word(addr, fc, sz_word); ! 77: } ! 78: static ALWAYS_INLINE uae_u16 uae_mmu030_get_ibyte(uaecptr addr) ! 79: { ! 80: uae_u32 fc = (regs.s ? 4 : 0) | 2; ! 81: ! 82: return mmu030_get_byte(addr, fc, sz_byte); ! 83: } ! 84: static ALWAYS_INLINE uae_u32 uae_mmu030_get_long(uaecptr addr) ! 85: { ! 86: uae_u32 fc = (regs.s ? 4 : 0) | 1; ! 87: ! 88: if (unlikely(is_unaligned(addr, 4))) ! 89: return mmu030_get_long_unaligned(addr, fc); ! 90: return mmu030_get_long(addr, fc, sz_long); ! 91: } ! 92: static ALWAYS_INLINE uae_u16 uae_mmu030_get_word(uaecptr addr) ! 93: { ! 94: uae_u32 fc = (regs.s ? 4 : 0) | 1; ! 95: ! 96: if (unlikely(is_unaligned(addr, 2))) ! 97: return mmu030_get_word_unaligned(addr, fc); ! 98: return mmu030_get_word(addr, fc, sz_word); ! 99: } ! 100: static ALWAYS_INLINE uae_u8 uae_mmu030_get_byte(uaecptr addr) ! 101: { ! 102: uae_u32 fc = (regs.s ? 4 : 0) | 1; ! 103: ! 104: return mmu030_get_byte(addr, fc, sz_byte); ! 105: } ! 106: static ALWAYS_INLINE void uae_mmu030_put_long(uaecptr addr, uae_u32 val) ! 107: { ! 108: uae_u32 fc = (regs.s ? 4 : 0) | 1; ! 109: ! 110: if (unlikely(is_unaligned(addr, 4))) ! 111: mmu030_put_long_unaligned(addr, val, fc); ! 112: else ! 113: mmu030_put_long(addr, val, fc, sz_long); ! 114: } ! 115: static ALWAYS_INLINE void uae_mmu030_put_word(uaecptr addr, uae_u16 val) ! 116: { ! 117: uae_u32 fc = (regs.s ? 4 : 0) | 1; ! 118: ! 119: if (unlikely(is_unaligned(addr, 2))) ! 120: mmu030_put_word_unaligned(addr, val, fc); ! 121: else ! 122: mmu030_put_word(addr, val, fc, sz_word); ! 123: } ! 124: static ALWAYS_INLINE void uae_mmu030_put_byte(uaecptr addr, uae_u8 val) ! 125: { ! 126: uae_u32 fc = (regs.s ? 4 : 0) | 1; ! 127: ! 128: mmu030_put_byte(addr, val, fc, sz_byte); ! 129: } ! 130: ! 131: static ALWAYS_INLINE uae_u32 sfc030_get_long(uaecptr addr) ! 132: { ! 133: uae_u32 fc = regs.sfc&7; ! 134: printf("sfc030_get_long: FC = %i\n",fc); ! 135: if (unlikely(is_unaligned(addr, 4))) ! 136: return mmu030_get_long_unaligned(addr, fc); ! 137: return mmu030_get_long(addr, fc, sz_long); ! 138: } ! 139: ! 140: static ALWAYS_INLINE uae_u16 sfc030_get_word(uaecptr addr) ! 141: { ! 142: uae_u32 fc = regs.sfc&7; ! 143: printf("sfc030_get_word: FC = %i\n",fc); ! 144: if (unlikely(is_unaligned(addr, 2))) ! 145: return mmu030_get_word_unaligned(addr, fc); ! 146: return mmu030_get_word(addr, fc, sz_word); ! 147: } ! 148: ! 149: static ALWAYS_INLINE uae_u8 sfc030_get_byte(uaecptr addr) ! 150: { ! 151: uae_u32 fc = regs.sfc&7; ! 152: printf("sfc030_get_byte: FC = %i\n",fc); ! 153: return mmu030_get_byte(addr, fc, sz_byte); ! 154: } ! 155: ! 156: static ALWAYS_INLINE void dfc030_put_long(uaecptr addr, uae_u32 val) ! 157: { ! 158: uae_u32 fc = regs.dfc&7; ! 159: printf("dfc030_put_long: FC = %i\n",fc); ! 160: if (unlikely(is_unaligned(addr, 4))) ! 161: mmu030_put_long_unaligned(addr, val, fc); ! 162: else ! 163: mmu030_put_long(addr, val, fc, sz_long); ! 164: } ! 165: ! 166: static ALWAYS_INLINE void dfc030_put_word(uaecptr addr, uae_u16 val) ! 167: { ! 168: uae_u32 fc = regs.dfc&7; ! 169: printf("dfc030_put_word: FC = %i\n",fc); ! 170: if (unlikely(is_unaligned(addr, 2))) ! 171: mmu030_put_word_unaligned(addr, val, fc); ! 172: else ! 173: mmu030_put_word(addr, val, fc, sz_word); ! 174: } ! 175: ! 176: static ALWAYS_INLINE void dfc030_put_byte(uaecptr addr, uae_u8 val) ! 177: { ! 178: uae_u32 fc = regs.dfc&7; ! 179: printf("dfc030_put_byte: FC = %i\n",fc); ! 180: mmu030_put_byte(addr, val, fc, sz_byte); ! 181: } ! 182: ! 183: STATIC_INLINE void put_byte_mmu030 (uaecptr addr, uae_u32 v) ! 184: { ! 185: uae_mmu030_put_byte (addr, v); ! 186: } ! 187: STATIC_INLINE void put_word_mmu030 (uaecptr addr, uae_u32 v) ! 188: { ! 189: uae_mmu030_put_word (addr, v); ! 190: } ! 191: STATIC_INLINE void put_long_mmu030 (uaecptr addr, uae_u32 v) ! 192: { ! 193: uae_mmu030_put_long (addr, v); ! 194: } ! 195: STATIC_INLINE uae_u32 get_byte_mmu030 (uaecptr addr) ! 196: { ! 197: return uae_mmu030_get_byte (addr); ! 198: } ! 199: STATIC_INLINE uae_u32 get_word_mmu030 (uaecptr addr) ! 200: { ! 201: return uae_mmu030_get_word (addr); ! 202: } ! 203: STATIC_INLINE uae_u32 get_long_mmu030 (uaecptr addr) ! 204: { ! 205: return uae_mmu030_get_long (addr); ! 206: } ! 207: STATIC_INLINE uae_u32 get_ibyte_mmu030 (int o) ! 208: { ! 209: uae_u32 pc = m68k_getpc () + o; ! 210: return uae_mmu030_get_iword (pc); ! 211: } ! 212: STATIC_INLINE uae_u32 get_iword_mmu030 (int o) ! 213: { ! 214: uae_u32 pc = m68k_getpc () + o; ! 215: return uae_mmu030_get_iword (pc); ! 216: } ! 217: STATIC_INLINE uae_u32 get_ilong_mmu030 (int o) ! 218: { ! 219: uae_u32 pc = m68k_getpc () + o; ! 220: return uae_mmu030_get_ilong (pc); ! 221: } ! 222: STATIC_INLINE uae_u32 next_iword_mmu030 (void) ! 223: { ! 224: uae_u32 pc = m68k_getpc (); ! 225: m68k_incpci (2); ! 226: return uae_mmu030_get_iword (pc); ! 227: } ! 228: STATIC_INLINE uae_u32 next_ilong_mmu030 (void) ! 229: { ! 230: uae_u32 pc = m68k_getpc (); ! 231: m68k_incpci (4); ! 232: return uae_mmu030_get_ilong (pc); ! 233: } ! 234: ! 235: extern void m68k_do_rts_mmu030 (void); ! 236: extern void m68k_do_rte_mmu030 (uaecptr a7); ! 237: extern void flush_mmu030 (uaecptr, int); ! 238: extern void m68k_do_bsr_mmu030 (uaecptr oldpc, uae_s32 offset); ! 239: ! 240: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.