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