|
|
1.1 ! root 1: /* ! 2: * cpummu.h - MMU emulation ! 3: * ! 4: * Copyright (c) 2001-2004 Milan Jurik of ARAnyM dev team (see AUTHORS) ! 5: * ! 6: * Inspired by UAE MMU patch ! 7: * ! 8: * This file is part of the ARAnyM project which builds a new and powerful ! 9: * TOS/FreeMiNT compatible virtual machine running on almost any hardware. ! 10: * ! 11: * ARAnyM is free software; you can redistribute it and/or modify ! 12: * it under the terms of the GNU General Public License as published by ! 13: * the Free Software Foundation; either version 2 of the License, or ! 14: * (at your option) any later version. ! 15: * ! 16: * ARAnyM is distributed in the hope that it will be useful, ! 17: * but WITHOUT ANY WARRANTY; without even the implied warranty of ! 18: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 19: * GNU General Public License for more details. ! 20: * ! 21: * You should have received a copy of the GNU General Public License ! 22: * along with ARAnyM; if not, write to the Free Software ! 23: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! 24: */ ! 25: ! 26: ! 27: #ifndef UAE_CPUMMU_H ! 28: #define UAE_CPUMMU_H ! 29: ! 30: //#include "uae/types.h" ! 31: ! 32: #include "mmu_common.h" ! 33: ! 34: #ifndef FULLMMU ! 35: #define FULLMMU ! 36: #endif ! 37: ! 38: #define DUNUSED(x) ! 39: #define D ! 40: #if DEBUG ! 41: #define bug write_log ! 42: #else ! 43: #define bug ! 44: #endif ! 45: ! 46: static __inline void flush_internals (void) { } ! 47: ! 48: extern int mmu060_state; ! 49: ! 50: extern int mmu040_movem; ! 51: extern uaecptr mmu040_movem_ea; ! 52: extern uae_u32 mmu040_move16[4]; ! 53: ! 54: extern bool mmu_pagesize_8k; ! 55: extern uae_u16 mmu_opcode; ! 56: extern bool mmu_restart; ! 57: extern bool mmu_ttr_enabled; ! 58: ! 59: //typedef uae_u8 flagtype; ! 60: ! 61: //static m68k_exception except; ! 62: ! 63: struct xttrx { ! 64: uae_u32 log_addr_base : 8; ! 65: uae_u32 log_addr_mask : 8; ! 66: uae_u32 enable : 1; ! 67: uae_u32 s_field : 2; ! 68: uae_u32 : 3; ! 69: uae_u32 usr1 : 1; ! 70: uae_u32 usr0 : 1; ! 71: uae_u32 : 1; ! 72: uae_u32 cmode : 2; ! 73: uae_u32 : 2; ! 74: uae_u32 write : 1; ! 75: uae_u32 : 2; ! 76: }; ! 77: ! 78: struct mmusr_t { ! 79: uae_u32 phys_addr : 20; ! 80: uae_u32 bus_err : 1; ! 81: uae_u32 global : 1; ! 82: uae_u32 usr1 : 1; ! 83: uae_u32 usr0 : 1; ! 84: uae_u32 super : 1; ! 85: uae_u32 cmode : 2; ! 86: uae_u32 modif : 1; ! 87: uae_u32 : 1; ! 88: uae_u32 write : 1; ! 89: uae_u32 ttrhit : 1; ! 90: uae_u32 resident : 1; ! 91: }; ! 92: ! 93: struct log_addr4 { ! 94: uae_u32 rif : 7; ! 95: uae_u32 pif : 7; ! 96: uae_u32 paif : 6; ! 97: uae_u32 poff : 12; ! 98: }; ! 99: ! 100: struct log_addr8 { ! 101: uae_u32 rif : 7; ! 102: uae_u32 pif : 7; ! 103: uae_u32 paif : 5; ! 104: uae_u32 poff : 13; ! 105: }; ! 106: ! 107: #define MMU_TEST_PTEST 1 ! 108: #define MMU_TEST_VERBOSE 2 ! 109: #define MMU_TEST_FORCE_TABLE_SEARCH 4 ! 110: #define MMU_TEST_NO_BUSERR 8 ! 111: ! 112: extern void mmu_dump_tables(void); ! 113: ! 114: #define MMU_TTR_LOGICAL_BASE 0xff000000 ! 115: #define MMU_TTR_LOGICAL_MASK 0x00ff0000 ! 116: #define MMU_TTR_BIT_ENABLED (1 << 15) ! 117: #define MMU_TTR_BIT_SFIELD_ENABLED (1 << 14) ! 118: #define MMU_TTR_BIT_SFIELD_SUPER (1 << 13) ! 119: #define MMU_TTR_SFIELD_SHIFT 13 ! 120: #define MMU_TTR_UX_MASK ((1 << 9) | (1 << 8)) ! 121: #define MMU_TTR_UX_SHIFT 8 ! 122: #define MMU_TTR_CACHE_MASK ((1 << 6) | (1 << 5)) ! 123: #define MMU_TTR_CACHE_SHIFT 5 ! 124: #define MMU_TTR_BIT_WRITE_PROTECT (1 << 2) ! 125: ! 126: #define MMU_UDT_MASK 3 ! 127: #define MMU_PDT_MASK 3 ! 128: ! 129: #define MMU_DES_WP 4 ! 130: #define MMU_DES_USED 8 ! 131: ! 132: /* page descriptors only */ ! 133: #define MMU_DES_MODIFIED 16 ! 134: #define MMU_DES_SUPER (1 << 7) ! 135: #define MMU_DES_GLOBAL (1 << 10) ! 136: ! 137: #define MMU_ROOT_PTR_ADDR_MASK 0xfffffe00 ! 138: #define MMU_PTR_PAGE_ADDR_MASK_8 0xffffff80 ! 139: #define MMU_PTR_PAGE_ADDR_MASK_4 0xffffff00 ! 140: ! 141: #define MMU_PAGE_INDIRECT_MASK 0xfffffffc ! 142: #define MMU_PAGE_ADDR_MASK_8 0xffffe000 ! 143: #define MMU_PAGE_ADDR_MASK_4 0xfffff000 ! 144: #define MMU_PAGE_UR_MASK_8 ((1 << 12) | (1 << 11)) ! 145: #define MMU_PAGE_UR_MASK_4 (1 << 11) ! 146: #define MMU_PAGE_UR_SHIFT 11 ! 147: ! 148: #define MMU_MMUSR_ADDR_MASK 0xfffff000 ! 149: #define MMU_MMUSR_B (1 << 11) ! 150: #define MMU_MMUSR_G (1 << 10) ! 151: #define MMU_MMUSR_U1 (1 << 9) ! 152: #define MMU_MMUSR_U0 (1 << 8) ! 153: #define MMU_MMUSR_Ux (MMU_MMUSR_U1 | MMU_MMUSR_U0) ! 154: #define MMU_MMUSR_S (1 << 7) ! 155: #define MMU_MMUSR_CM ((1 << 6) | ( 1 << 5)) ! 156: #define MMU_MMUSR_M (1 << 4) ! 157: #define MMU_MMUSR_W (1 << 2) ! 158: #define MMU_MMUSR_T (1 << 1) ! 159: #define MMU_MMUSR_R (1 << 0) ! 160: ! 161: #define TTR_I0 4 ! 162: #define TTR_I1 5 ! 163: #define TTR_D0 6 ! 164: #define TTR_D1 7 ! 165: ! 166: #define TTR_NO_MATCH 0 ! 167: #define TTR_NO_WRITE 1 ! 168: #define TTR_OK_MATCH 2 ! 169: ! 170: struct mmu_atc_line { ! 171: uaecptr tag; // tag is 16 or 17 bits S+logical ! 172: uae_u32 valid; ! 173: uae_u32 status; ! 174: uaecptr phys; // phys base address ! 175: }; ! 176: ! 177: /* ! 178: * 68040 ATC is a 4 way 16 slot associative address translation cache ! 179: * the 68040 has a DATA and an INSTRUCTION ATC. ! 180: * an ATC lookup may result in : a hit, a miss and a modified state. ! 181: * the 68060 can disable ATC allocation ! 182: * we must take care of 8k and 4k page size, index position is relative to page size ! 183: */ ! 184: ! 185: #define ATC_WAYS 4 ! 186: #define ATC_SLOTS 16 ! 187: #define ATC_TYPE 2 ! 188: ! 189: extern uae_u32 mmu_is_super; ! 190: extern uae_u32 mmu_tagmask, mmu_pagemask; ! 191: extern struct mmu_atc_line mmu_atc_array[ATC_TYPE][ATC_WAYS][ATC_SLOTS]; ! 192: ! 193: extern void mmu_tt_modified(void); ! 194: extern int mmu_do_match_ttr(uae_u32 ttr, uaecptr addr, bool super); ! 195: extern int mmu_match_ttr(uaecptr addr, bool super, bool data); ! 196: extern int mmu_match_ttr_write(uaecptr addr, bool super, bool data, uae_u32 val, int size, bool write); ! 197: extern uaecptr mmu_translate(uaecptr addr, uae_u32 val, bool super, bool data, bool write, int size); ! 198: ! 199: extern uae_u32 REGPARAM3 mmu060_get_rmw_bitfield (uae_u32 src, uae_u32 bdata[2], uae_s32 offset, int width) REGPARAM; ! 200: extern void REGPARAM3 mmu060_put_rmw_bitfield (uae_u32 dst, uae_u32 bdata[2], uae_u32 val, uae_s32 offset, int width) REGPARAM; ! 201: ! 202: extern uae_u16 REGPARAM3 mmu_get_word_unaligned(uaecptr addr) REGPARAM; ! 203: extern uae_u32 REGPARAM3 mmu_get_long_unaligned(uaecptr addr) REGPARAM; ! 204: ! 205: extern uae_u32 REGPARAM3 mmu_get_ilong_unaligned(uaecptr addr) REGPARAM; ! 206: ! 207: extern void REGPARAM3 mmu_put_word_unaligned(uaecptr addr, uae_u16 val) REGPARAM; ! 208: extern void REGPARAM3 mmu_put_long_unaligned(uaecptr addr, uae_u32 val) REGPARAM; ! 209: ! 210: extern void mmu_make_transparent_region(uaecptr baseaddr, uae_u32 size, int datamode); ! 211: ! 212: #define FC_DATA (regs.s ? 5 : 1) ! 213: #define FC_INST (regs.s ? 6 : 2) ! 214: ! 215: extern void mmu_bus_error(uaecptr addr, uae_u32 val, int fc, bool write, int size, bool nonmmu); ! 216: ! 217: extern uae_u32 REGPARAM3 sfc_get_long(uaecptr addr) REGPARAM; ! 218: extern uae_u16 REGPARAM3 sfc_get_word(uaecptr addr) REGPARAM; ! 219: extern uae_u8 REGPARAM3 sfc_get_byte(uaecptr addr) REGPARAM; ! 220: extern void REGPARAM3 dfc_put_long(uaecptr addr, uae_u32 val) REGPARAM; ! 221: extern void REGPARAM3 dfc_put_word(uaecptr addr, uae_u16 val) REGPARAM; ! 222: extern void REGPARAM3 dfc_put_byte(uaecptr addr, uae_u8 val) REGPARAM; ! 223: ! 224: #define sfc040_get_long sfc_get_long ! 225: #define sfc040_get_word sfc_get_word ! 226: #define sfc040_get_byte sfc_get_byte ! 227: #define dfc040_put_long dfc_put_long ! 228: #define dfc040_put_word dfc_put_word ! 229: #define dfc040_put_byte dfc_put_byte ! 230: ! 231: #define sfc060_get_long sfc_get_long ! 232: #define sfc060_get_word sfc_get_word ! 233: #define sfc060_get_byte sfc_get_byte ! 234: #define dfc060_put_long dfc_put_long ! 235: #define dfc060_put_word dfc_put_word ! 236: #define dfc060_put_byte dfc_put_byte ! 237: ! 238: extern void uae_mmu_put_lrmw (uaecptr addr, uae_u32 v, int size, int type); ! 239: extern uae_u32 uae_mmu_get_lrmw (uaecptr addr, int size, int type); ! 240: ! 241: extern void REGPARAM3 mmu_flush_atc(uaecptr addr, bool super, bool global) REGPARAM; ! 242: extern void REGPARAM3 mmu_flush_atc_all(bool global) REGPARAM; ! 243: extern void REGPARAM3 mmu_op_real(uae_u32 opcode, uae_u16 extra) REGPARAM; ! 244: ! 245: extern void REGPARAM3 mmu_reset(void) REGPARAM; ! 246: extern void REGPARAM3 mmu_set_funcs(void) REGPARAM; ! 247: extern void REGPARAM3 mmu_set_tc(uae_u16 tc) REGPARAM; ! 248: extern void REGPARAM3 mmu_set_super(bool super) REGPARAM; ! 249: ! 250: static ALWAYS_INLINE uaecptr mmu_get_real_address(uaecptr addr, struct mmu_atc_line *cl) ! 251: { ! 252: return cl->phys | (addr & mmu_pagemask); ! 253: } ! 254: ! 255: static ALWAYS_INLINE void mmu_get_move16(uaecptr addr, uae_u32 *v, int size) ! 256: { ! 257: int i; ! 258: bool super = regs.s != 0; ! 259: addr &= ~15; ! 260: ! 261: if (mmu_match_ttr(addr,super,true) == TTR_NO_MATCH && regs.mmu_enabled) { ! 262: addr = mmu_translate(addr, 0, super, true, false, size); ! 263: } ! 264: ! 265: for (i = 0; i < 4; i++) { ! 266: v[i] = phys_get_long(addr + i * 4); ! 267: } ! 268: } ! 269: ! 270: static ALWAYS_INLINE void mmu_put_move16(uaecptr addr, uae_u32 *v, int size) ! 271: { ! 272: int i; ! 273: bool super = regs.s != 0; ! 274: addr &= ~15; ! 275: ! 276: if (mmu_match_ttr_write(addr,super,true,v[0],size,false) == TTR_NO_MATCH && regs.mmu_enabled) { ! 277: addr = mmu_translate(addr, v[0], super, true, true, size); ! 278: } ! 279: ! 280: for (i = 0; i < 4; i++) { ! 281: phys_put_long(addr + i * 4, v[i]); ! 282: } ! 283: } ! 284: ! 285: static ALWAYS_INLINE uae_u32 mmu_get_ilong(uaecptr addr, int size) ! 286: { ! 287: if (mmu_match_ttr(addr,regs.s!=0,false) == TTR_NO_MATCH && regs.mmu_enabled) { ! 288: addr = mmu_translate(addr, 0, regs.s!=0, false, false, size); ! 289: } ! 290: return phys_get_long(addr); ! 291: } ! 292: ! 293: static ALWAYS_INLINE uae_u16 mmu_get_iword(uaecptr addr, int size) ! 294: { ! 295: if (mmu_match_ttr(addr,regs.s!=0,false) == TTR_NO_MATCH && regs.mmu_enabled) { ! 296: addr = mmu_translate(addr, 0, regs.s!=0, false, false, size); ! 297: } ! 298: return phys_get_word(addr); ! 299: } ! 300: ! 301: static ALWAYS_INLINE uae_u8 mmu_get_ibyte(uaecptr addr, int size) ! 302: { ! 303: if (mmu_match_ttr(addr,regs.s!=0,false) == TTR_NO_MATCH && regs.mmu_enabled) { ! 304: addr = mmu_translate(addr, 0, regs.s!=0, false, false, size); ! 305: } ! 306: return phys_get_byte(addr); ! 307: } ! 308: ! 309: static ALWAYS_INLINE uae_u32 mmu_get_long(uaecptr addr, int size) ! 310: { ! 311: if (mmu_match_ttr(addr,regs.s!=0,true) == TTR_NO_MATCH && regs.mmu_enabled) { ! 312: addr = mmu_translate(addr, 0, regs.s!=0, true, false, size); ! 313: } ! 314: return phys_get_long(addr); ! 315: } ! 316: ! 317: static ALWAYS_INLINE uae_u16 mmu_get_word(uaecptr addr, int size) ! 318: { ! 319: if (mmu_match_ttr(addr,regs.s!=0,true) == TTR_NO_MATCH && regs.mmu_enabled) { ! 320: addr = mmu_translate(addr, 0, regs.s!=0, true, false, size); ! 321: } ! 322: return phys_get_word(addr); ! 323: } ! 324: ! 325: static ALWAYS_INLINE uae_u8 mmu_get_byte(uaecptr addr, int size) ! 326: { ! 327: if (mmu_match_ttr(addr,regs.s!=0,true) == TTR_NO_MATCH && regs.mmu_enabled) { ! 328: addr = mmu_translate(addr, 0, regs.s!=0, true, false, size); ! 329: } ! 330: return phys_get_byte(addr); ! 331: } ! 332: ! 333: static ALWAYS_INLINE void mmu_put_long(uaecptr addr, uae_u32 val, int size) ! 334: { ! 335: if (mmu_match_ttr_write(addr,regs.s!=0,true,val,size,true) == TTR_NO_MATCH && regs.mmu_enabled) { ! 336: addr = mmu_translate(addr, val, regs.s!=0, true, true, size); ! 337: } ! 338: phys_put_long(addr, val); ! 339: } ! 340: ! 341: static ALWAYS_INLINE void mmu_put_word(uaecptr addr, uae_u16 val, int size) ! 342: { ! 343: if (mmu_match_ttr_write(addr,regs.s!=0,true,val,size,true) == TTR_NO_MATCH && regs.mmu_enabled) { ! 344: addr = mmu_translate(addr, val, regs.s!=0, true, true, size); ! 345: } ! 346: phys_put_word(addr, val); ! 347: } ! 348: ! 349: static ALWAYS_INLINE void mmu_put_byte(uaecptr addr, uae_u8 val, int size) ! 350: { ! 351: if (mmu_match_ttr_write(addr,regs.s!=0,true,val,size,true) == TTR_NO_MATCH && regs.mmu_enabled) { ! 352: addr = mmu_translate(addr, val, regs.s!=0, true, true, size); ! 353: } ! 354: phys_put_byte(addr, val); ! 355: } ! 356: ! 357: static ALWAYS_INLINE uae_u32 mmu_get_user_long(uaecptr addr, bool super, bool write, int size) ! 358: { ! 359: if (mmu_match_ttr_write(addr,super,true,0,size,write) == TTR_NO_MATCH && regs.mmu_enabled) { ! 360: addr = mmu_translate(addr, 0, super, true, write, size); ! 361: } ! 362: return phys_get_long(addr); ! 363: } ! 364: ! 365: static ALWAYS_INLINE uae_u16 mmu_get_user_word(uaecptr addr, bool super, bool write, int size) ! 366: { ! 367: if (mmu_match_ttr_write(addr,super,true,0,size,write) == TTR_NO_MATCH && regs.mmu_enabled) { ! 368: addr = mmu_translate(addr, 0, super, true, write, size); ! 369: } ! 370: return phys_get_word(addr); ! 371: } ! 372: ! 373: static ALWAYS_INLINE uae_u8 mmu_get_user_byte(uaecptr addr, bool super, bool write, int size) ! 374: { ! 375: if (mmu_match_ttr_write(addr,super,true,0,size,write) == TTR_NO_MATCH && regs.mmu_enabled) { ! 376: addr = mmu_translate(addr, 0, super, true, write, size); ! 377: } ! 378: return phys_get_byte(addr); ! 379: } ! 380: ! 381: static ALWAYS_INLINE void mmu_put_user_long(uaecptr addr, uae_u32 val, bool super, int size) ! 382: { ! 383: if (mmu_match_ttr_write(addr,super,true,val,size,true) == TTR_NO_MATCH && regs.mmu_enabled) { ! 384: addr = mmu_translate(addr, val, super, true, true, size); ! 385: } ! 386: phys_put_long(addr, val); ! 387: } ! 388: ! 389: static ALWAYS_INLINE void mmu_put_user_word(uaecptr addr, uae_u16 val, bool super, int size) ! 390: { ! 391: if (mmu_match_ttr_write(addr,super,true,val,size,true) == TTR_NO_MATCH && regs.mmu_enabled) { ! 392: addr = mmu_translate(addr, val, super, true, true, size); ! 393: } ! 394: phys_put_word(addr, val); ! 395: } ! 396: ! 397: static ALWAYS_INLINE void mmu_put_user_byte(uaecptr addr, uae_u8 val, bool super, int size) ! 398: { ! 399: if (mmu_match_ttr_write(addr,super,true,val,size,true) == TTR_NO_MATCH && regs.mmu_enabled) { ! 400: addr = mmu_translate(addr, val, super, true, true, size); ! 401: } ! 402: phys_put_byte(addr, val); ! 403: } ! 404: ! 405: ! 406: static ALWAYS_INLINE void HWput_l(uaecptr addr, uae_u32 l) ! 407: { ! 408: put_long (addr, l); ! 409: } ! 410: static ALWAYS_INLINE void HWput_w(uaecptr addr, uae_u32 w) ! 411: { ! 412: put_word (addr, w); ! 413: } ! 414: static ALWAYS_INLINE void HWput_b(uaecptr addr, uae_u32 b) ! 415: { ! 416: put_byte (addr, b); ! 417: } ! 418: static ALWAYS_INLINE uae_u32 HWget_l(uaecptr addr) ! 419: { ! 420: return get_long (addr); ! 421: } ! 422: static ALWAYS_INLINE uae_u32 HWget_w(uaecptr addr) ! 423: { ! 424: return get_word (addr); ! 425: } ! 426: static ALWAYS_INLINE uae_u32 HWget_b(uaecptr addr) ! 427: { ! 428: return get_byte (addr); ! 429: } ! 430: ! 431: static ALWAYS_INLINE uae_u32 uae_mmu040_get_ilong(uaecptr addr) ! 432: { ! 433: if (unlikely(is_unaligned(addr, 4))) ! 434: return mmu_get_ilong_unaligned(addr); ! 435: return mmu_get_ilong(addr, sz_long); ! 436: } ! 437: static ALWAYS_INLINE uae_u16 uae_mmu040_get_iword(uaecptr addr) ! 438: { ! 439: return mmu_get_iword(addr, sz_word); ! 440: } ! 441: static ALWAYS_INLINE uae_u16 uae_mmu040_get_ibyte(uaecptr addr) ! 442: { ! 443: return mmu_get_ibyte(addr, sz_byte); ! 444: } ! 445: static ALWAYS_INLINE uae_u32 uae_mmu040_get_long(uaecptr addr) ! 446: { ! 447: if (unlikely(is_unaligned(addr, 4))) ! 448: return mmu_get_long_unaligned(addr); ! 449: return mmu_get_long(addr, sz_long); ! 450: } ! 451: static ALWAYS_INLINE uae_u16 uae_mmu040_get_word(uaecptr addr) ! 452: { ! 453: if (unlikely(is_unaligned(addr, 2))) ! 454: return mmu_get_word_unaligned(addr); ! 455: return mmu_get_word(addr, sz_word); ! 456: } ! 457: static ALWAYS_INLINE uae_u8 uae_mmu040_get_byte(uaecptr addr) ! 458: { ! 459: return mmu_get_byte(addr, sz_byte); ! 460: } ! 461: ! 462: static ALWAYS_INLINE void uae_mmu040_put_word(uaecptr addr, uae_u16 val) ! 463: { ! 464: if (unlikely(is_unaligned(addr, 2))) ! 465: mmu_put_word_unaligned(addr, val); ! 466: else ! 467: mmu_put_word(addr, val, sz_word); ! 468: } ! 469: static ALWAYS_INLINE void uae_mmu040_put_byte(uaecptr addr, uae_u8 val) ! 470: { ! 471: mmu_put_byte(addr, val, sz_byte); ! 472: } ! 473: static ALWAYS_INLINE void uae_mmu040_put_long(uaecptr addr, uae_u32 val) ! 474: { ! 475: if (unlikely(is_unaligned(addr, 4))) ! 476: mmu_put_long_unaligned(addr, val); ! 477: else ! 478: mmu_put_long(addr, val, sz_long); ! 479: } ! 480: ! 481: ! 482: static ALWAYS_INLINE void uae_mmu_get_move16(uaecptr addr, uae_u32 *val) ! 483: { ! 484: // move16 is always aligned ! 485: mmu_get_move16(addr, val, 16); ! 486: } ! 487: static ALWAYS_INLINE void uae_mmu_put_move16(uaecptr addr, uae_u32 *val) ! 488: { ! 489: // move16 is always aligned ! 490: mmu_put_move16(addr, val, 16); ! 491: } ! 492: ! 493: // normal 040 ! 494: STATIC_INLINE void put_byte_mmu040 (uaecptr addr, uae_u32 v) ! 495: { ! 496: uae_mmu040_put_byte (addr, v); ! 497: } ! 498: STATIC_INLINE void put_word_mmu040 (uaecptr addr, uae_u32 v) ! 499: { ! 500: uae_mmu040_put_word (addr, v); ! 501: } ! 502: STATIC_INLINE void put_long_mmu040 (uaecptr addr, uae_u32 v) ! 503: { ! 504: uae_mmu040_put_long (addr, v); ! 505: } ! 506: STATIC_INLINE uae_u32 get_byte_mmu040 (uaecptr addr) ! 507: { ! 508: return uae_mmu040_get_byte (addr); ! 509: } ! 510: STATIC_INLINE uae_u32 get_word_mmu040 (uaecptr addr) ! 511: { ! 512: return uae_mmu040_get_word (addr); ! 513: } ! 514: STATIC_INLINE uae_u32 get_long_mmu040 (uaecptr addr) ! 515: { ! 516: return uae_mmu040_get_long (addr); ! 517: } ! 518: STATIC_INLINE void get_move16_mmu (uaecptr addr, uae_u32 *v) ! 519: { ! 520: uae_mmu_get_move16 (addr, v); ! 521: } ! 522: STATIC_INLINE void put_move16_mmu (uaecptr addr, uae_u32 *v) ! 523: { ! 524: uae_mmu_put_move16 (addr, v); ! 525: } ! 526: ! 527: // locked rmw 060 ! 528: STATIC_INLINE void put_lrmw_byte_mmu060 (uaecptr addr, uae_u32 v) ! 529: { ! 530: uae_mmu_put_lrmw (addr, v, sz_byte, 1); ! 531: } ! 532: STATIC_INLINE void put_lrmw_word_mmu060 (uaecptr addr, uae_u32 v) ! 533: { ! 534: uae_mmu_put_lrmw (addr, v, sz_word, 1); ! 535: } ! 536: STATIC_INLINE void put_lrmw_long_mmu060 (uaecptr addr, uae_u32 v) ! 537: { ! 538: uae_mmu_put_lrmw (addr, v, sz_long, 1); ! 539: } ! 540: STATIC_INLINE uae_u32 get_lrmw_byte_mmu060 (uaecptr addr) ! 541: { ! 542: return uae_mmu_get_lrmw (addr, sz_byte, 1); ! 543: } ! 544: STATIC_INLINE uae_u32 get_lrmw_word_mmu060 (uaecptr addr) ! 545: { ! 546: return uae_mmu_get_lrmw (addr, sz_word, 1); ! 547: } ! 548: STATIC_INLINE uae_u32 get_lrmw_long_mmu060 (uaecptr addr) ! 549: { ! 550: return uae_mmu_get_lrmw (addr, sz_long, 1); ! 551: } ! 552: ! 553: // locked rmw 040 ! 554: STATIC_INLINE void put_lrmw_byte_mmu040 (uaecptr addr, uae_u32 v) ! 555: { ! 556: uae_mmu_put_lrmw (addr, v, sz_byte, 0); ! 557: } ! 558: STATIC_INLINE void put_lrmw_word_mmu040 (uaecptr addr, uae_u32 v) ! 559: { ! 560: uae_mmu_put_lrmw (addr, v, sz_word, 0); ! 561: } ! 562: STATIC_INLINE void put_lrmw_long_mmu040 (uaecptr addr, uae_u32 v) ! 563: { ! 564: uae_mmu_put_lrmw (addr, v, sz_long, 0); ! 565: } ! 566: STATIC_INLINE uae_u32 get_lrmw_byte_mmu040 (uaecptr addr) ! 567: { ! 568: return uae_mmu_get_lrmw (addr, sz_byte, 0); ! 569: } ! 570: STATIC_INLINE uae_u32 get_lrmw_word_mmu040 (uaecptr addr) ! 571: { ! 572: return uae_mmu_get_lrmw (addr, sz_word, 0); ! 573: } ! 574: STATIC_INLINE uae_u32 get_lrmw_long_mmu040 (uaecptr addr) ! 575: { ! 576: return uae_mmu_get_lrmw (addr, sz_long, 0); ! 577: } ! 578: ! 579: STATIC_INLINE uae_u32 get_ibyte_mmu040 (int o) ! 580: { ! 581: uae_u32 pc = m68k_getpci () + o; ! 582: return uae_mmu040_get_iword (pc); ! 583: } ! 584: STATIC_INLINE uae_u32 get_iword_mmu040 (int o) ! 585: { ! 586: uae_u32 pc = m68k_getpci () + o; ! 587: return uae_mmu040_get_iword (pc); ! 588: } ! 589: STATIC_INLINE uae_u32 get_ilong_mmu040 (int o) ! 590: { ! 591: uae_u32 pc = m68k_getpci () + o; ! 592: return uae_mmu040_get_ilong (pc); ! 593: } ! 594: STATIC_INLINE uae_u32 next_iword_mmu040 (void) ! 595: { ! 596: uae_u32 pc = m68k_getpci (); ! 597: m68k_incpci (2); ! 598: return uae_mmu040_get_iword (pc); ! 599: } ! 600: STATIC_INLINE uae_u32 next_ilong_mmu040 (void) ! 601: { ! 602: uae_u32 pc = m68k_getpci (); ! 603: m68k_incpci (4); ! 604: return uae_mmu040_get_ilong (pc); ! 605: } ! 606: ! 607: extern void flush_mmu040 (uaecptr, int); ! 608: extern void m68k_do_rts_mmu040 (void); ! 609: extern void m68k_do_rte_mmu040 (uaecptr a7); ! 610: extern void m68k_do_bsr_mmu040 (uaecptr oldpc, uae_s32 offset); ! 611: ! 612: extern void flush_mmu060 (uaecptr, int); ! 613: extern void m68k_do_rts_mmu060 (void); ! 614: extern void m68k_do_rte_mmu060 (uaecptr a7); ! 615: extern void m68k_do_bsr_mmu060 (uaecptr oldpc, uae_s32 offset); ! 616: ! 617: #endif /* UAE_CPUMMU_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.