|
|
1.1.1.3 root 1: #ifndef UAE_CPUMMU030_H
2: #define UAE_CPUMMU030_H
3:
1.1.1.5 ! root 4: #define MMU030_DEBUG 0
! 5:
1.1.1.3 root 6: #include "uae/types.h"
1.1 root 7:
8: #include "mmu_common.h"
9:
1.1.1.4 root 10: #define MMU_DPAGECACHE030 1
11: #define MMU_IPAGECACHE030 1
12:
1.1.1.2 root 13: extern uae_u64 srp_030, crp_030;
14: extern uae_u32 tt0_030, tt1_030, tc_030;
15: extern uae_u16 mmusr_030;
16:
1.1.1.5 ! root 17: #define MAX_MMU030_ACCESS 9
1.1.1.2 root 18: extern uae_u32 mm030_stageb_address;
19: extern int mmu030_idx;
20: extern bool mmu030_retry;
21: extern int mmu030_opcode, mmu030_opcode_stageb;
22: extern int mmu030_fake_prefetch;
23: extern uaecptr mmu030_fake_prefetch_addr;
24: extern uae_u16 mmu030_state[3];
1.1.1.5 ! root 25: extern uae_u32 mmu030_data_buffer_out;
1.1.1.2 root 26: extern uae_u32 mmu030_disp_store[2];
27: extern uae_u32 mmu030_fmovem_store[2];
1.1.1.4 root 28: extern uae_u8 mmu030_cache_state, mmu030_cache_state_default;
1.1.1.2 root 29:
30: #define MMU030_STATEFLAG1_FMOVEM 0x2000
31: #define MMU030_STATEFLAG1_MOVEM1 0x4000
32: #define MMU030_STATEFLAG1_MOVEM2 0x8000
1.1.1.5 ! root 33:
1.1.1.2 root 34: #define MMU030_STATEFLAG1_DISP0 0x0001
35: #define MMU030_STATEFLAG1_DISP1 0x0002
36:
1.1.1.5 ! root 37: #define MMU030_STATEFLAG1_LASTWRITE 0x0100
! 38:
! 39: #define MMU030_STATEFLAG1_SUBACCESS0 0x0004
! 40: #define MMU030_STATEFLAG1_SUBACCESS1 0x0008
! 41: #define MMU030_STATEFLAG1_SUBACCESS2 0x0010
! 42: #define MMU030_STATEFLAG1_SUBACCESS3 0x0020
! 43: #define MMU030_STATEFLAG1_SUBACCESSX 0x0040
! 44: #define MMU030_STATEFLAG1_SUBACCESSL 0x0080
! 45: #define MMU030_STATEFLAG1_SUBACCESS_SHIFT 2
! 46:
1.1.1.2 root 47: struct mmu030_access
48: {
49: bool done;
50: uae_u32 val;
51: };
1.1.1.5 ! root 52: extern struct mmu030_access mmu030_ad[MAX_MMU030_ACCESS + 1];
1.1.1.2 root 53:
54: void mmu030_page_fault(uaecptr addr, bool read, int flags, uae_u32 fc);
55:
56: bool mmu_op30_pmove (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra);
57: bool mmu_op30_ptest (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra);
58: bool mmu_op30_pflush (uaecptr pc, uae_u32 opcode, uae_u16 next, uaecptr extra);
1.1 root 59:
60: typedef struct {
61: uae_u32 addr_base;
62: uae_u32 addr_mask;
63: uae_u32 fc_base;
64: uae_u32 fc_mask;
65: } TT_info;
66:
1.1.1.4 root 67: bool mmu030_decode_tc(uae_u32 TC, bool);
1.1.1.2 root 68: bool mmu030_decode_rp(uae_u64 RP);
1.1 root 69:
70: void mmu030_flush_atc_all(void);
71: void mmu030_reset(int hardreset);
1.1.1.2 root 72: void mmu030_set_funcs(void);
73: uaecptr mmu030_translate(uaecptr addr, bool super, bool data, bool write);
1.1 root 74:
1.1.1.2 root 75: void mmu030_put_long(uaecptr addr, uae_u32 val, uae_u32 fc);
76: void mmu030_put_word(uaecptr addr, uae_u16 val, uae_u32 fc);
77: void mmu030_put_byte(uaecptr addr, uae_u8 val, uae_u32 fc);
78: uae_u32 mmu030_get_long(uaecptr addr, uae_u32 fc);
79: uae_u16 mmu030_get_word(uaecptr addr, uae_u32 fc);
80: uae_u8 mmu030_get_byte(uaecptr addr, uae_u32 fc);
81: uae_u32 mmu030_get_ilong(uaecptr addr, uae_u32 fc);
82: uae_u16 mmu030_get_iword(uaecptr addr, uae_u32 fc);
83:
84: uae_u32 uae_mmu030_get_lrmw(uaecptr addr, int size);
1.1.1.5 ! root 85: uae_u32 uae_mmu030_get_lrmw_fcx(uaecptr addr, int size, int fc);
1.1.1.2 root 86: void uae_mmu030_put_lrmw(uaecptr addr, uae_u32 val, int size);
1.1.1.5 ! root 87: void uae_mmu030_put_lrmw_fcx(uaecptr addr, uae_u32 val, int size, int fc);
1.1.1.2 root 88:
1.1.1.4 root 89: void mmu030_put_generic(uaecptr addr, uae_u32 val, uae_u32 fc, int size, int flags);
90: uae_u32 mmu030_get_generic(uaecptr addr, uae_u32 fc, int size, int flags);
1.1.1.2 root 91:
92: extern uae_u16 REGPARAM3 mmu030_get_word_unaligned(uaecptr addr, uae_u32 fc, int flags) REGPARAM;
93: extern uae_u32 REGPARAM3 mmu030_get_long_unaligned(uaecptr addr, uae_u32 fc, int flags) REGPARAM;
94: extern uae_u32 REGPARAM3 mmu030_get_ilong_unaligned(uaecptr addr, uae_u32 fc, int flags) REGPARAM;
95: extern uae_u16 REGPARAM3 mmu030_get_lrmw_word_unaligned(uaecptr addr, uae_u32 fc, int flags) REGPARAM;
96: extern uae_u32 REGPARAM3 mmu030_get_lrmw_long_unaligned(uaecptr addr, uae_u32 fc, int flags) REGPARAM;
97: extern void REGPARAM3 mmu030_put_word_unaligned(uaecptr addr, uae_u16 val, uae_u32 fc, int flags) REGPARAM;
98: extern void REGPARAM3 mmu030_put_long_unaligned(uaecptr addr, uae_u32 val, uae_u32 fc, int flags) REGPARAM;
1.1 root 99:
1.1.1.5 ! root 100: static ALWAYS_INLINE uae_u32 uae_mmu030_get_fc_code(void)
! 101: {
! 102: return (regs.s ? 4 : 0) | 2;
! 103: }
! 104:
! 105: static ALWAYS_INLINE uae_u32 uae_mmu030_get_fc_data(void)
! 106: {
! 107: return (regs.s ? 4 : 0) | 1;
! 108: }
! 109:
1.1 root 110: static ALWAYS_INLINE uae_u32 uae_mmu030_get_ilong(uaecptr addr)
111: {
1.1.1.5 ! root 112: uae_u32 fc = uae_mmu030_get_fc_code();
1.1 root 113:
1.1.1.5 ! root 114: if (unlikely(is_unaligned_bus(addr, 4)))
1.1.1.2 root 115: return mmu030_get_ilong_unaligned(addr, fc, 0);
116: return mmu030_get_ilong(addr, fc);
1.1 root 117: }
118: static ALWAYS_INLINE uae_u16 uae_mmu030_get_iword(uaecptr addr)
119: {
1.1.1.5 ! root 120: uae_u32 fc = uae_mmu030_get_fc_code();
! 121:
1.1.1.2 root 122: return mmu030_get_iword(addr, fc);
1.1 root 123: }
124: static ALWAYS_INLINE uae_u16 uae_mmu030_get_ibyte(uaecptr addr)
125: {
1.1.1.5 ! root 126: uae_u32 fc = uae_mmu030_get_fc_code();
1.1 root 127:
1.1.1.2 root 128: return mmu030_get_byte(addr, fc);
1.1 root 129: }
1.1.1.5 ! root 130:
1.1 root 131: static ALWAYS_INLINE uae_u32 uae_mmu030_get_long(uaecptr addr)
132: {
1.1.1.5 ! root 133: uae_u32 fc = uae_mmu030_get_fc_data();
1.1 root 134:
1.1.1.5 ! root 135: if (unlikely(is_unaligned_bus(addr, 4)))
1.1.1.2 root 136: return mmu030_get_long_unaligned(addr, fc, 0);
137: return mmu030_get_long(addr, fc);
1.1 root 138: }
1.1.1.4 root 139: static ALWAYS_INLINE uae_u32 uae_mmu030_get_word(uaecptr addr)
1.1 root 140: {
1.1.1.5 ! root 141: uae_u32 fc = uae_mmu030_get_fc_data();
1.1 root 142:
1.1.1.5 ! root 143: if (unlikely(is_unaligned_bus(addr, 2)))
1.1.1.2 root 144: return mmu030_get_word_unaligned(addr, fc, 0);
145: return mmu030_get_word(addr, fc);
1.1 root 146: }
1.1.1.4 root 147: static ALWAYS_INLINE uae_u32 uae_mmu030_get_byte(uaecptr addr)
1.1 root 148: {
1.1.1.5 ! root 149: uae_u32 fc = uae_mmu030_get_fc_data();
1.1 root 150:
1.1.1.2 root 151: return mmu030_get_byte(addr, fc);
1.1 root 152: }
1.1.1.5 ! root 153:
1.1 root 154: static ALWAYS_INLINE void uae_mmu030_put_long(uaecptr addr, uae_u32 val)
155: {
1.1.1.5 ! root 156: uae_u32 fc = uae_mmu030_get_fc_data();
! 157:
! 158: if (unlikely(is_unaligned_bus(addr, 4)))
1.1.1.2 root 159: mmu030_put_long_unaligned(addr, val, fc, 0);
1.1 root 160: else
1.1.1.2 root 161: mmu030_put_long(addr, val, fc);
1.1 root 162: }
1.1.1.4 root 163: static ALWAYS_INLINE void uae_mmu030_put_word(uaecptr addr, uae_u32 val)
1.1 root 164: {
1.1.1.5 ! root 165: uae_u32 fc = uae_mmu030_get_fc_data();
1.1 root 166:
1.1.1.5 ! root 167: if (unlikely(is_unaligned_bus(addr, 2)))
1.1.1.2 root 168: mmu030_put_word_unaligned(addr, val, fc, 0);
1.1 root 169: else
1.1.1.2 root 170: mmu030_put_word(addr, val, fc);
1.1 root 171: }
1.1.1.4 root 172: static ALWAYS_INLINE void uae_mmu030_put_byte(uaecptr addr, uae_u32 val)
1.1 root 173: {
1.1.1.5 ! root 174: uae_u32 fc = uae_mmu030_get_fc_data();
1.1 root 175:
1.1.1.2 root 176: mmu030_put_byte(addr, val, fc);
1.1 root 177: }
178:
1.1.1.4 root 179: static ALWAYS_INLINE uae_u32 uae_mmu030_get_ilong_fc(uaecptr addr)
180: {
1.1.1.5 ! root 181: if (unlikely(is_unaligned_bus(addr, 4)))
1.1.1.4 root 182: return mmu030_get_ilong_unaligned(addr, regs.fc030, 0);
183: return mmu030_get_ilong(addr, regs.fc030);
184: }
185: static ALWAYS_INLINE uae_u16 uae_mmu030_get_iword_fc(uaecptr addr)
186: {
187: return mmu030_get_iword(addr, regs.fc030);
188: }
189: static ALWAYS_INLINE uae_u16 uae_mmu030_get_ibyte_fc(uaecptr addr)
190: {
191: return mmu030_get_byte(addr, regs.fc030);
192: }
193: static ALWAYS_INLINE uae_u32 uae_mmu030_get_long_fc(uaecptr addr)
194: {
1.1.1.5 ! root 195: if (unlikely(is_unaligned_bus(addr, 4)))
1.1.1.4 root 196: return mmu030_get_long_unaligned(addr, regs.fc030, 0);
197: return mmu030_get_long(addr, regs.fc030);
198: }
199: static ALWAYS_INLINE uae_u32 uae_mmu030_get_word_fc(uaecptr addr)
200: {
1.1.1.5 ! root 201: if (unlikely(is_unaligned_bus(addr, 2)))
1.1.1.4 root 202: return mmu030_get_word_unaligned(addr, regs.fc030, 0);
203: return mmu030_get_word(addr, regs.fc030);
204: }
205: static ALWAYS_INLINE uae_u32 uae_mmu030_get_byte_fc(uaecptr addr)
206: {
207: return mmu030_get_byte(addr, regs.fc030);
208: }
209: static ALWAYS_INLINE void uae_mmu030_put_long_fc(uaecptr addr, uae_u32 val)
210: {
1.1.1.5 ! root 211: if (unlikely(is_unaligned_bus(addr, 4)))
1.1.1.4 root 212: mmu030_put_long_unaligned(addr, val, regs.fc030, 0);
213: else
214: mmu030_put_long(addr, val, regs.fc030);
215: }
216: static ALWAYS_INLINE void uae_mmu030_put_word_fc(uaecptr addr, uae_u32 val)
217: {
1.1.1.5 ! root 218: if (unlikely(is_unaligned_bus(addr, 2)))
1.1.1.4 root 219: mmu030_put_word_unaligned(addr, val, regs.fc030, 0);
220: else
221: mmu030_put_word(addr, val, regs.fc030);
222: }
223: static ALWAYS_INLINE void uae_mmu030_put_byte_fc(uaecptr addr, uae_u32 val)
224: {
225: mmu030_put_byte(addr, val, regs.fc030);
226: }
227: uae_u8 uae_mmu030_check_fc(uaecptr addr, bool write, uae_u32 size);
228:
1.1.1.5 ! root 229: static ALWAYS_INLINE uae_u32 uae_mmu030_get_long_fcx(uaecptr addr, int fc)
! 230: {
! 231: if (unlikely(is_unaligned_bus(addr, 4)))
! 232: return mmu030_get_long_unaligned(addr, fc, 0);
! 233: return mmu030_get_long(addr, fc);
! 234: }
! 235: static ALWAYS_INLINE uae_u32 uae_mmu030_get_word_fcx(uaecptr addr, int fc)
! 236: {
! 237: if (unlikely(is_unaligned_bus(addr, 2)))
! 238: return mmu030_get_word_unaligned(addr, fc, 0);
! 239: return mmu030_get_word(addr, fc);
! 240: }
! 241: static ALWAYS_INLINE uae_u32 uae_mmu030_get_byte_fcx(uaecptr addr, int fc)
! 242: {
! 243: return mmu030_get_byte(addr, fc);
! 244: }
! 245: static ALWAYS_INLINE void uae_mmu030_put_long_fcx(uaecptr addr, uae_u32 val, int fc)
! 246: {
! 247: if (unlikely(is_unaligned_bus(addr, 4)))
! 248: mmu030_put_long_unaligned(addr, val, fc, 0);
! 249: else
! 250: mmu030_put_long(addr, val, fc);
! 251: }
! 252: static ALWAYS_INLINE void uae_mmu030_put_word_fcx(uaecptr addr, uae_u32 val, int fc)
! 253: {
! 254: if (unlikely(is_unaligned_bus(addr, 2)))
! 255: mmu030_put_word_unaligned(addr, val, fc, 0);
! 256: else
! 257: mmu030_put_word(addr, val, fc);
! 258: }
! 259: static ALWAYS_INLINE void uae_mmu030_put_byte_fcx(uaecptr addr, uae_u32 val, int fc)
! 260: {
! 261: mmu030_put_byte(addr, val, fc);
! 262: }
! 263:
! 264:
1.1.1.4 root 265: #define ACCESS_CHECK_PUT \
266: if (!mmu030_ad[mmu030_idx].done) { \
1.1.1.5 ! root 267: mmu030_data_buffer_out = v; \
! 268: } else { \
1.1.1.4 root 269: mmu030_idx++; \
270: return; \
271: }
272:
273: #define ACCESS_CHECK_GET \
274: if (mmu030_ad[mmu030_idx].done) { \
275: v = mmu030_ad[mmu030_idx].val; \
276: mmu030_idx++; \
277: return v; \
278: }
279:
280: #define ACCESS_CHECK_GET_PC(pc) \
281: if (mmu030_ad[mmu030_idx].done) { \
282: v = mmu030_ad[mmu030_idx].val; \
283: mmu030_idx++; \
284: m68k_incpci (pc); \
285: return v; \
286: }
287:
288: #define ACCESS_EXIT_PUT \
1.1.1.5 ! root 289: mmu030_ad[mmu030_idx].val = mmu030_data_buffer_out; \
1.1.1.4 root 290: mmu030_ad[mmu030_idx].done = true; \
291: mmu030_idx++; \
292: mmu030_ad[mmu030_idx].done = false;
293:
294: #define ACCESS_EXIT_GET \
295: mmu030_ad[mmu030_idx].val = v; \
296: mmu030_ad[mmu030_idx].done = true; \
297: mmu030_idx++; \
298: mmu030_ad[mmu030_idx].done = false;
299:
300: // non-cache
301:
1.1 root 302: static ALWAYS_INLINE uae_u32 sfc030_get_long(uaecptr addr)
303: {
1.1.1.2 root 304: uae_u32 fc = regs.sfc;
305: #if MMUDEBUG > 2
306: write_log(_T("sfc030_get_long: FC = %i\n"),fc);
307: #endif
1.1.1.5 ! root 308: if (unlikely(is_unaligned_bus(addr, 4)))
1.1.1.2 root 309: return mmu030_get_long_unaligned(addr, fc, 0);
310: return mmu030_get_long(addr, fc);
1.1 root 311: }
312:
313: static ALWAYS_INLINE uae_u16 sfc030_get_word(uaecptr addr)
314: {
1.1.1.2 root 315: uae_u32 fc = regs.sfc;
316: #if MMUDEBUG > 2
317: write_log(_T("sfc030_get_word: FC = %i\n"),fc);
318: #endif
1.1.1.5 ! root 319: if (unlikely(is_unaligned_bus(addr, 2)))
1.1.1.2 root 320: return mmu030_get_word_unaligned(addr, fc, 0);
321: return mmu030_get_word(addr, fc);
1.1 root 322: }
323:
324: static ALWAYS_INLINE uae_u8 sfc030_get_byte(uaecptr addr)
325: {
1.1.1.2 root 326: uae_u32 fc = regs.sfc;
327: #if MMUDEBUG > 2
328: write_log(_T("sfc030_get_byte: FC = %i\n"),fc);
329: #endif
330: return mmu030_get_byte(addr, fc);
1.1 root 331: }
332:
333: static ALWAYS_INLINE void dfc030_put_long(uaecptr addr, uae_u32 val)
334: {
1.1.1.2 root 335: uae_u32 fc = regs.dfc;
336: #if MMUDEBUG > 2
337: write_log(_T("dfc030_put_long: %08X = %08X FC = %i\n"), addr, val, fc);
338: #endif
1.1.1.5 ! root 339: if (unlikely(is_unaligned_bus(addr, 4)))
1.1.1.2 root 340: mmu030_put_long_unaligned(addr, val, fc, 0);
1.1 root 341: else
1.1.1.2 root 342: mmu030_put_long(addr, val, fc);
1.1 root 343: }
344:
345: static ALWAYS_INLINE void dfc030_put_word(uaecptr addr, uae_u16 val)
346: {
1.1.1.2 root 347: uae_u32 fc = regs.dfc;
348: #if MMUDEBUG > 2
349: write_log(_T("dfc030_put_word: %08X = %04X FC = %i\n"), addr, val, fc);
350: #endif
1.1.1.5 ! root 351: if (unlikely(is_unaligned_bus(addr, 2)))
1.1.1.2 root 352: mmu030_put_word_unaligned(addr, val, fc, 0);
1.1 root 353: else
1.1.1.2 root 354: mmu030_put_word(addr, val, fc);
1.1 root 355: }
356:
357: static ALWAYS_INLINE void dfc030_put_byte(uaecptr addr, uae_u8 val)
358: {
1.1.1.2 root 359: uae_u32 fc = regs.dfc;
360: #if MMUDEBUG > 2
361: write_log(_T("dfc030_put_byte: %08X = %02X FC = %i\n"), addr, val, fc);
362: #endif
363: mmu030_put_byte(addr, val, fc);
1.1 root 364: }
365:
1.1.1.5 ! root 366: static ALWAYS_INLINE uae_u32 sfc030_get_long_state(uaecptr addr)
! 367: {
! 368: uae_u32 v;
! 369: ACCESS_CHECK_GET
! 370: v = sfc030_get_long(addr);
! 371: ACCESS_EXIT_GET
! 372: return v;
! 373: }
! 374: static ALWAYS_INLINE uae_u16 sfc030_get_word_state(uaecptr addr)
! 375: {
! 376: uae_u32 v;
! 377: ACCESS_CHECK_GET
! 378: v = sfc030_get_word(addr);
! 379: ACCESS_EXIT_GET
! 380: return v;
! 381: }
! 382: static ALWAYS_INLINE uae_u8 sfc030_get_byte_state(uaecptr addr)
! 383: {
! 384: uae_u32 v;
! 385: ACCESS_CHECK_GET
! 386: v = sfc030_get_byte(addr);
! 387: ACCESS_EXIT_GET
! 388: return v;
! 389: }
! 390:
! 391: static ALWAYS_INLINE void dfc030_put_long_state(uaecptr addr, uae_u32 v)
! 392: {
! 393: ACCESS_CHECK_PUT
! 394: dfc030_put_long(addr, v);
! 395: ACCESS_EXIT_PUT
! 396: }
! 397: static ALWAYS_INLINE void dfc030_put_word_state(uaecptr addr, uae_u32 v)
! 398: {
! 399: ACCESS_CHECK_PUT
! 400: dfc030_put_word(addr, v);
! 401: ACCESS_EXIT_PUT
! 402: }
! 403: static ALWAYS_INLINE void dfc030_put_byte_state(uaecptr addr, uae_u32 v)
! 404: {
! 405: ACCESS_CHECK_PUT
! 406: dfc030_put_byte(addr, v);
! 407: ACCESS_EXIT_PUT
! 408: }
! 409:
! 410:
1.1.1.4 root 411: uae_u32 REGPARAM3 get_disp_ea_020_mmu030 (uae_u32 base, int idx) REGPARAM;
1.1.1.2 root 412:
413: STATIC_INLINE void put_byte_mmu030_state (uaecptr addr, uae_u32 v)
1.1 root 414: {
1.1.1.2 root 415: ACCESS_CHECK_PUT
1.1 root 416: uae_mmu030_put_byte (addr, v);
1.1.1.2 root 417: ACCESS_EXIT_PUT
1.1 root 418: }
1.1.1.2 root 419: STATIC_INLINE void put_lrmw_byte_mmu030_state (uaecptr addr, uae_u32 v)
420: {
421: ACCESS_CHECK_PUT
422: uae_mmu030_put_lrmw (addr, v, sz_byte);
423: ACCESS_EXIT_PUT
424: }
425: STATIC_INLINE void put_word_mmu030_state (uaecptr addr, uae_u32 v)
1.1 root 426: {
1.1.1.2 root 427: ACCESS_CHECK_PUT
1.1 root 428: uae_mmu030_put_word (addr, v);
1.1.1.2 root 429: ACCESS_EXIT_PUT
1.1 root 430: }
1.1.1.2 root 431: STATIC_INLINE void put_lrmw_word_mmu030_state (uaecptr addr, uae_u32 v)
1.1 root 432: {
1.1.1.2 root 433: ACCESS_CHECK_PUT
434: uae_mmu030_put_lrmw (addr, v, sz_word);
435: ACCESS_EXIT_PUT
436: }
437: STATIC_INLINE void put_long_mmu030_state (uaecptr addr, uae_u32 v)
438: {
439: ACCESS_CHECK_PUT
1.1 root 440: uae_mmu030_put_long (addr, v);
1.1.1.2 root 441: ACCESS_EXIT_PUT
442: }
443: STATIC_INLINE void put_lrmw_long_mmu030_state (uaecptr addr, uae_u32 v)
444: {
445: ACCESS_CHECK_PUT
446: uae_mmu030_put_lrmw (addr, v, sz_long);
447: ACCESS_EXIT_PUT
448: }
449:
450: STATIC_INLINE uae_u32 get_byte_mmu030_state (uaecptr addr)
451: {
452: uae_u32 v;
453: ACCESS_CHECK_GET
454: v = uae_mmu030_get_byte (addr);
455: ACCESS_EXIT_GET
456: return v;
457: }
458: STATIC_INLINE uae_u32 get_lrmw_byte_mmu030_state (uaecptr addr)
459: {
460: uae_u32 v;
461: ACCESS_CHECK_GET
462: v = uae_mmu030_get_lrmw (addr, sz_byte);
463: ACCESS_EXIT_GET
464: return v;
465: }
466:
467: STATIC_INLINE uae_u32 get_word_mmu030_state (uaecptr addr)
468: {
469: uae_u32 v;
470: ACCESS_CHECK_GET
471: v = uae_mmu030_get_word (addr);
472: ACCESS_EXIT_GET
473: return v;
474: }
475: STATIC_INLINE uae_u32 get_lrmw_word_mmu030_state (uaecptr addr)
476: {
477: uae_u32 v;
478: ACCESS_CHECK_GET
479: v = uae_mmu030_get_lrmw (addr, sz_word);
480: ACCESS_EXIT_GET
481: return v;
482: }
483: STATIC_INLINE uae_u32 get_long_mmu030_state (uaecptr addr)
484: {
485: uae_u32 v;
486: ACCESS_CHECK_GET
487: v = uae_mmu030_get_long (addr);
488: ACCESS_EXIT_GET
489: return v;
490: }
491: STATIC_INLINE uae_u32 get_lrmw_long_mmu030_state (uaecptr addr)
492: {
493: uae_u32 v;
494: ACCESS_CHECK_GET
495: v = uae_mmu030_get_lrmw (addr, sz_long);
496: ACCESS_EXIT_GET
497: return v;
498: }
499:
500: STATIC_INLINE uae_u32 get_ibyte_mmu030_state (int o)
501: {
502: uae_u32 v;
503: uae_u32 addr = m68k_getpci () + o;
504: ACCESS_CHECK_GET
505: v = uae_mmu030_get_iword (addr);
506: ACCESS_EXIT_GET
507: return v;
508: }
509: STATIC_INLINE uae_u32 get_iword_mmu030_state (int o)
510: {
511: uae_u32 v;
512: uae_u32 addr = m68k_getpci () + o;
513: ACCESS_CHECK_GET
514: v = uae_mmu030_get_iword (addr);
515: ACCESS_EXIT_GET
516: return v;
517: }
518: STATIC_INLINE uae_u32 get_ilong_mmu030_state (int o)
519: {
520: uae_u32 v;
521: uae_u32 addr = m68k_getpci () + o;
522: ACCESS_CHECK_GET
523: v = uae_mmu030_get_ilong (addr);
524: ACCESS_EXIT_GET
525: return v;
526: }
527: STATIC_INLINE uae_u32 next_iword_mmu030_state (void)
528: {
529: uae_u32 v;
530: uae_u32 addr = m68k_getpci ();
531: ACCESS_CHECK_GET_PC(2);
532: v = uae_mmu030_get_iword (addr);
533: m68k_incpci (2);
534: ACCESS_EXIT_GET
535: return v;
536: }
537: STATIC_INLINE uae_u32 next_ilong_mmu030_state (void)
538: {
539: uae_u32 v;
540: uae_u32 addr = m68k_getpci ();
541: ACCESS_CHECK_GET_PC(4);
542: v = uae_mmu030_get_ilong (addr);
543: m68k_incpci (4);
544: ACCESS_EXIT_GET
545: return v;
1.1 root 546: }
1.1.1.2 root 547:
1.1 root 548: STATIC_INLINE uae_u32 get_byte_mmu030 (uaecptr addr)
549: {
1.1.1.2 root 550: return uae_mmu030_get_byte (addr);
1.1 root 551: }
552: STATIC_INLINE uae_u32 get_word_mmu030 (uaecptr addr)
553: {
1.1.1.2 root 554: return uae_mmu030_get_word (addr);
1.1 root 555: }
556: STATIC_INLINE uae_u32 get_long_mmu030 (uaecptr addr)
557: {
1.1.1.2 root 558: return uae_mmu030_get_long (addr);
559: }
560: STATIC_INLINE void put_byte_mmu030 (uaecptr addr, uae_u32 v)
561: {
562: uae_mmu030_put_byte (addr, v);
1.1 root 563: }
1.1.1.2 root 564: STATIC_INLINE void put_word_mmu030 (uaecptr addr, uae_u32 v)
565: {
566: uae_mmu030_put_word (addr, v);
567: }
568: STATIC_INLINE void put_long_mmu030 (uaecptr addr, uae_u32 v)
569: {
570: uae_mmu030_put_long (addr, v);
571: }
572:
1.1 root 573: STATIC_INLINE uae_u32 get_ibyte_mmu030 (int o)
574: {
1.1.1.2 root 575: uae_u32 pc = m68k_getpci () + o;
1.1 root 576: return uae_mmu030_get_iword (pc);
577: }
578: STATIC_INLINE uae_u32 get_iword_mmu030 (int o)
579: {
1.1.1.2 root 580: uae_u32 pc = m68k_getpci () + o;
1.1 root 581: return uae_mmu030_get_iword (pc);
582: }
583: STATIC_INLINE uae_u32 get_ilong_mmu030 (int o)
584: {
1.1.1.2 root 585: uae_u32 pc = m68k_getpci () + o;
1.1 root 586: return uae_mmu030_get_ilong (pc);
587: }
588: STATIC_INLINE uae_u32 next_iword_mmu030 (void)
589: {
1.1.1.2 root 590: uae_u32 v;
591: uae_u32 pc = m68k_getpci ();
592: v = uae_mmu030_get_iword (pc);
1.1 root 593: m68k_incpci (2);
1.1.1.2 root 594: return v;
1.1 root 595: }
596: STATIC_INLINE uae_u32 next_ilong_mmu030 (void)
597: {
1.1.1.2 root 598: uae_u32 v;
599: uae_u32 pc = m68k_getpci ();
600: v = uae_mmu030_get_ilong (pc);
1.1 root 601: m68k_incpci (4);
1.1.1.2 root 602: return v;
1.1 root 603: }
604:
1.1.1.5 ! root 605: STATIC_INLINE uae_u32 state_store_mmu030(uae_u32 v)
! 606: {
! 607: if (mmu030_ad[mmu030_idx].done) {
! 608: v = mmu030_ad[mmu030_idx].val;
! 609: mmu030_idx++;
! 610: } else {
! 611: mmu030_ad[mmu030_idx].val = v;
! 612: mmu030_ad[mmu030_idx].done = true;
! 613: mmu030_idx++;
! 614: mmu030_ad[mmu030_idx].done = false;
! 615: }
! 616: return v;
! 617: }
! 618:
1.1 root 619: extern void m68k_do_rts_mmu030 (void);
620: extern void m68k_do_rte_mmu030 (uaecptr a7);
621: extern void flush_mmu030 (uaecptr, int);
622: extern void m68k_do_bsr_mmu030 (uaecptr oldpc, uae_s32 offset);
623:
1.1.1.4 root 624: // more compatible + optional cache
625:
626: static ALWAYS_INLINE uae_u32 mmu030_get_fc_byte(uaecptr addr, uae_u32 fc)
627: {
628: return mmu030_get_byte(addr, fc);
629: }
630: static ALWAYS_INLINE uae_u32 mmu030_get_fc_word(uaecptr addr, uae_u32 fc)
631: {
632: return mmu030_get_word(addr, fc);
633: }
634: static ALWAYS_INLINE uae_u32 mmu030_get_fc_long(uaecptr addr, uae_u32 fc)
635: {
636: return mmu030_get_long(addr, fc);
637: }
638: static ALWAYS_INLINE void mmu030_put_fc_byte(uaecptr addr, uae_u32 val, uae_u32 fc)
639: {
640: mmu030_put_byte(addr, val, fc);
641: }
642: static ALWAYS_INLINE void mmu030_put_fc_word(uaecptr addr, uae_u32 val, uae_u32 fc)
643: {
644: mmu030_put_word(addr, val, fc);
645: }
646: static ALWAYS_INLINE void mmu030_put_fc_long(uaecptr addr, uae_u32 val, uae_u32 fc)
647: {
648: mmu030_put_long(addr, val, fc);
649: }
650:
651: static ALWAYS_INLINE uae_u32 sfc030c_get_long(uaecptr addr)
652: {
653: #if MMUDEBUG > 2
654: write_log(_T("sfc030_get_long: FC = %i\n"),fc);
655: #endif
656: return read_data_030_fc_lget(addr, regs.sfc);
657: }
658:
659: static ALWAYS_INLINE uae_u16 sfc030c_get_word(uaecptr addr)
660: {
661: #if MMUDEBUG > 2
662: write_log(_T("sfc030_get_word: FC = %i\n"),fc);
663: #endif
664: return read_data_030_fc_wget(addr, regs.sfc);
665: }
666:
667: static ALWAYS_INLINE uae_u8 sfc030c_get_byte(uaecptr addr)
668: {
669: #if MMUDEBUG > 2
670: write_log(_T("sfc030_get_byte: FC = %i\n"),fc);
671: #endif
672: return read_data_030_fc_bget(addr, regs.sfc);
673: }
674:
675: static ALWAYS_INLINE void dfc030c_put_long(uaecptr addr, uae_u32 val)
676: {
677: #if MMUDEBUG > 2
678: write_log(_T("dfc030_put_long: %08X = %08X FC = %i\n"), addr, val, fc);
679: #endif
680: write_data_030_fc_lput(addr, val, regs.dfc);
681: }
682:
683: static ALWAYS_INLINE void dfc030c_put_word(uaecptr addr, uae_u16 val)
684: {
685: #if MMUDEBUG > 2
686: write_log(_T("dfc030_put_word: %08X = %04X FC = %i\n"), addr, val, fc);
687: #endif
688: write_data_030_fc_wput(addr, val, regs.dfc);
689: }
690:
691: static ALWAYS_INLINE void dfc030c_put_byte(uaecptr addr, uae_u8 val)
692: {
693: #if MMUDEBUG > 2
694: write_log(_T("dfc030_put_byte: %08X = %02X FC = %i\n"), addr, val, fc);
695: #endif
696: write_data_030_fc_bput(addr, val, regs.dfc);
697: }
698:
1.1.1.5 ! root 699: static ALWAYS_INLINE uae_u32 sfc030c_get_long_state(uaecptr addr)
! 700: {
! 701: uae_u32 v;
! 702: ACCESS_CHECK_GET
! 703: v = sfc030c_get_long(addr);
! 704: ACCESS_EXIT_GET
! 705: return v;
! 706: }
! 707: static ALWAYS_INLINE uae_u16 sfc030c_get_word_state(uaecptr addr)
! 708: {
! 709: uae_u32 v;
! 710: ACCESS_CHECK_GET
! 711: v = sfc030c_get_word(addr);
! 712: ACCESS_EXIT_GET
! 713: return v;
! 714: }
! 715: static ALWAYS_INLINE uae_u8 sfc030c_get_byte_state(uaecptr addr)
! 716: {
! 717: uae_u32 v;
! 718: ACCESS_CHECK_GET
! 719: v = sfc030c_get_byte(addr);
! 720: ACCESS_EXIT_GET
! 721: return v;
! 722: }
! 723:
! 724: static ALWAYS_INLINE void dfc030c_put_long_state(uaecptr addr, uae_u32 v)
! 725: {
! 726: ACCESS_CHECK_PUT
! 727: dfc030c_put_long(addr, v);
! 728: ACCESS_EXIT_PUT
! 729: }
! 730: static ALWAYS_INLINE void dfc030c_put_word_state(uaecptr addr, uae_u32 v)
! 731: {
! 732: ACCESS_CHECK_PUT
! 733: dfc030c_put_word(addr, v);
! 734: ACCESS_EXIT_PUT
! 735: }
! 736: static ALWAYS_INLINE void dfc030c_put_byte_state(uaecptr addr, uae_u32 v)
! 737: {
! 738: ACCESS_CHECK_PUT
! 739: dfc030c_put_byte(addr, v);
! 740: ACCESS_EXIT_PUT
! 741: }
! 742:
1.1.1.4 root 743: uae_u32 REGPARAM3 get_disp_ea_020_mmu030c (uae_u32 base, int idx) REGPARAM;
744:
745: STATIC_INLINE void put_byte_mmu030c_state (uaecptr addr, uae_u32 v)
746: {
747: ACCESS_CHECK_PUT
748: write_data_030_bput(addr, v);
749: ACCESS_EXIT_PUT
750: }
751: STATIC_INLINE void put_lrmw_byte_mmu030c_state (uaecptr addr, uae_u32 v)
752: {
753: ACCESS_CHECK_PUT
754: write_dcache030_lrmw_mmu(addr, v, 0);
755: ACCESS_EXIT_PUT
756: }
757: STATIC_INLINE void put_word_mmu030c_state (uaecptr addr, uae_u32 v)
758: {
759: ACCESS_CHECK_PUT
760: write_data_030_wput(addr, v);
761: ACCESS_EXIT_PUT
762: }
763: STATIC_INLINE void put_lrmw_word_mmu030c_state (uaecptr addr, uae_u32 v)
764: {
765: ACCESS_CHECK_PUT
766: write_dcache030_lrmw_mmu(addr, v, 1);
767: ACCESS_EXIT_PUT
768: }
769: STATIC_INLINE void put_long_mmu030c_state (uaecptr addr, uae_u32 v)
770: {
771: ACCESS_CHECK_PUT
772: write_data_030_lput(addr, v);
773: ACCESS_EXIT_PUT
774: }
775: STATIC_INLINE void put_lrmw_long_mmu030c_state (uaecptr addr, uae_u32 v)
776: {
777: ACCESS_CHECK_PUT
778: write_dcache030_lrmw_mmu(addr, v, 2);
779: ACCESS_EXIT_PUT
780: }
781:
782: STATIC_INLINE uae_u32 get_byte_mmu030c_state (uaecptr addr)
783: {
784: uae_u32 v;
785: ACCESS_CHECK_GET
786: v = read_data_030_bget(addr);
787: ACCESS_EXIT_GET
788: return v;
789: }
790: STATIC_INLINE uae_u32 get_lrmw_byte_mmu030c_state (uaecptr addr)
791: {
792: uae_u32 v;
793: ACCESS_CHECK_GET
794: v = read_dcache030_lrmw_mmu(addr, 0);
795: ACCESS_EXIT_GET
796: return v;
797: }
798:
799: STATIC_INLINE uae_u32 get_word_mmu030c_state (uaecptr addr)
800: {
801: uae_u32 v;
802: ACCESS_CHECK_GET
803: v = read_data_030_wget(addr);
804: ACCESS_EXIT_GET
805: return v;
806: }
807: STATIC_INLINE uae_u32 get_lrmw_word_mmu030c_state (uaecptr addr)
808: {
809: uae_u32 v;
810: ACCESS_CHECK_GET
811: v = read_dcache030_lrmw_mmu(addr, 1);
812: ACCESS_EXIT_GET
813: return v;
814: }
815: STATIC_INLINE uae_u32 get_long_mmu030c_state (uaecptr addr)
816: {
817: uae_u32 v;
818: ACCESS_CHECK_GET
819: v = read_data_030_lget(addr);
820: ACCESS_EXIT_GET
821: return v;
822: }
823: STATIC_INLINE uae_u32 get_lrmw_long_mmu030c_state (uaecptr addr)
824: {
825: uae_u32 v;
826: ACCESS_CHECK_GET
827: v = read_dcache030_lrmw_mmu(addr, 2);
828: ACCESS_EXIT_GET
829: return v;
830: }
831:
832: STATIC_INLINE uae_u32 get_ibyte_mmu030c_state (int o)
833: {
834: uae_u32 v;
835: uae_u32 addr = m68k_getpci () + o;
836: ACCESS_CHECK_GET
837: v = get_word_icache030(addr);
838: ACCESS_EXIT_GET
839: return v;
840: }
841: uae_u32 get_word_030_prefetch(int o);
842: STATIC_INLINE uae_u32 get_iword_mmu030c_state (int o)
843: {
844: uae_u32 v;
845: ACCESS_CHECK_GET;
846: v = get_word_030_prefetch(o);
847: ACCESS_EXIT_GET
848: return v;
849: }
850: STATIC_INLINE uae_u32 get_ilong_mmu030c_state (int o)
851: {
852: uae_u32 v;
853: ACCESS_CHECK_GET;
854: v = get_word_030_prefetch(o + 0) << 16;
855: v |= get_word_030_prefetch(o + 2);
856: ACCESS_EXIT_GET
857: return v;
858: }
859: STATIC_INLINE uae_u32 get_iword_mmu030c_opcode_state(int o)
860: {
861: return get_iword_mmu030c_state(o);
862: }
863:
864:
865: STATIC_INLINE uae_u32 next_iword_mmu030c_state (void)
866: {
867: uae_u32 v;
868: ACCESS_CHECK_GET_PC(2);
869: v = get_word_030_prefetch(0);
870: m68k_incpci(2);
871: ACCESS_EXIT_GET
872: return v;
873: }
874: STATIC_INLINE uae_u32 next_ilong_mmu030c_state (void)
875: {
876: uae_u32 v;
877: ACCESS_CHECK_GET_PC(4);
878: v = get_word_030_prefetch(0) << 16;
879: v |= get_word_030_prefetch(2);
880: m68k_incpci (4);
881: ACCESS_EXIT_GET
882: return v;
883: }
884:
885: STATIC_INLINE uae_u32 get_word_mmu030c (uaecptr addr)
886: {
887: return read_data_030_wget(addr);
888: }
889: STATIC_INLINE uae_u32 get_long_mmu030c (uaecptr addr)
890: {
891: return read_data_030_lget(addr);
892: }
893: STATIC_INLINE void put_word_mmu030c (uaecptr addr, uae_u32 v)
894: {
895: write_data_030_wput(addr, v);
896: }
897: STATIC_INLINE void put_long_mmu030c (uaecptr addr, uae_u32 v)
898: {
899: write_data_030_lput(addr, v);
900: }
901:
902: extern void m68k_do_rts_mmu030c(void);
903: extern void m68k_do_rte_mmu030c(uaecptr a7);
904: extern void m68k_do_bsr_mmu030c(uaecptr oldpc, uae_s32 offset);
905:
1.1.1.3 root 906: #endif /* UAE_CPUMMU030_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.