Annotation of hatari/src/cpu/cpummu.h, revision 1.1.1.4

1.1.1.2   root        1: /*
                      2:  * cpummu.h - MMU emulation
                      3:  *
                      4:  * Copyright (c) 2001-2004 Milan Jurik of ARAnyM dev team (see AUTHORS)
1.1.1.4 ! root        5:  * 
1.1.1.2   root        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: 
1.1.1.4 ! root       26: 
1.1.1.2   root       27: #ifndef CPUMMU_H
                     28: #define CPUMMU_H
                     29: 
1.1.1.3   root       30: #include "mmu_common.h"
1.1.1.2   root       31: 
                     32: #ifndef FULLMMU
                     33: #define FULLMMU
                     34: #endif
                     35: 
                     36: #define DUNUSED(x)
                     37: #define D
                     38: #if DEBUG
                     39: #define bug write_log
                     40: #else
                     41: #define bug
                     42: #endif
                     43: 
                     44: static __inline void flush_internals (void) { }
                     45: 
1.1.1.4 ! root       46: extern int mmu060_state;
        !            47: 
        !            48: extern int mmu040_movem;
        !            49: extern uaecptr mmu040_movem_ea;
        !            50: extern uae_u32 mmu040_move16[4];
        !            51: 
        !            52: extern bool mmu_pagesize_8k;
        !            53: extern uae_u16 mmu_opcode;
        !            54: extern bool mmu_restart;
        !            55: extern bool mmu_ttr_enabled;
        !            56: 
1.1.1.2   root       57: //typedef uae_u8 flagtype;
                     58: 
                     59: //static m68k_exception except;
                     60: 
                     61: struct xttrx {
                     62:     uae_u32 log_addr_base : 8;
                     63:     uae_u32 log_addr_mask : 8;
                     64:     uae_u32 enable : 1;
                     65:     uae_u32 s_field : 2;
                     66:     uae_u32 : 3;
                     67:     uae_u32 usr1 : 1;
                     68:     uae_u32 usr0 : 1;
                     69:     uae_u32 : 1;
                     70:     uae_u32 cmode : 2;
                     71:     uae_u32 : 2;
                     72:     uae_u32 write : 1;
                     73:     uae_u32 : 2;
                     74: };
                     75: 
                     76: struct mmusr_t {
                     77:    uae_u32 phys_addr : 20;
                     78:    uae_u32 bus_err : 1;
                     79:    uae_u32 global : 1;
                     80:    uae_u32 usr1 : 1;
                     81:    uae_u32 usr0 : 1;
                     82:    uae_u32 super : 1;
                     83:    uae_u32 cmode : 2;
                     84:    uae_u32 modif : 1;
                     85:    uae_u32 : 1;
                     86:    uae_u32 write : 1;
                     87:    uae_u32 ttrhit : 1;
                     88:    uae_u32 resident : 1;
                     89: };
                     90: 
                     91: struct log_addr4 {
                     92:    uae_u32 rif : 7;
                     93:    uae_u32 pif : 7;
                     94:    uae_u32 paif : 6;
                     95:    uae_u32 poff : 12;
                     96: };
                     97: 
                     98: struct log_addr8 {
                     99:   uae_u32 rif : 7;
                    100:   uae_u32 pif : 7;
                    101:   uae_u32 paif : 5;
                    102:   uae_u32 poff : 13;
                    103: };
                    104: 
                    105: #define MMU_TEST_PTEST                                 1
                    106: #define MMU_TEST_VERBOSE                               2
                    107: #define MMU_TEST_FORCE_TABLE_SEARCH            4
                    108: #define MMU_TEST_NO_BUSERR                             8
                    109: 
1.1.1.4 ! root      110: extern void mmu_dump_atc(void);
1.1.1.2   root      111: extern void mmu_dump_tables(void);
                    112: 
                    113: #define MMU_TTR_LOGICAL_BASE                           0xff000000
                    114: #define MMU_TTR_LOGICAL_MASK                           0x00ff0000
                    115: #define MMU_TTR_BIT_ENABLED                                    (1 << 15)
                    116: #define MMU_TTR_BIT_SFIELD_ENABLED                     (1 << 14)
                    117: #define MMU_TTR_BIT_SFIELD_SUPER                       (1 << 13)
                    118: #define MMU_TTR_SFIELD_SHIFT                           13
                    119: #define MMU_TTR_UX_MASK                                                ((1 << 9) | (1 << 8))
                    120: #define MMU_TTR_UX_SHIFT                                       8
                    121: #define MMU_TTR_CACHE_MASK                                     ((1 << 6) | (1 << 5))
                    122: #define MMU_TTR_CACHE_SHIFT                                    5
                    123: #define MMU_TTR_BIT_WRITE_PROTECT                      (1 << 2)
                    124: 
                    125: #define MMU_UDT_MASK   3
                    126: #define MMU_PDT_MASK   3
                    127: 
                    128: #define MMU_DES_WP                     4
                    129: #define MMU_DES_USED           8
                    130: 
                    131: /* page descriptors only */
                    132: #define MMU_DES_MODIFIED       16
                    133: #define MMU_DES_SUPER          (1 << 7)
                    134: #define MMU_DES_GLOBAL         (1 << 10)
                    135: 
                    136: #define MMU_ROOT_PTR_ADDR_MASK                 0xfffffe00
                    137: #define MMU_PTR_PAGE_ADDR_MASK_8               0xffffff80
                    138: #define MMU_PTR_PAGE_ADDR_MASK_4               0xffffff00
                    139: 
                    140: #define MMU_PAGE_INDIRECT_MASK                 0xfffffffc
                    141: #define MMU_PAGE_ADDR_MASK_8                   0xffffe000
                    142: #define MMU_PAGE_ADDR_MASK_4                   0xfffff000
                    143: #define MMU_PAGE_UR_MASK_8                             ((1 << 12) | (1 << 11))
                    144: #define MMU_PAGE_UR_MASK_4                             (1 << 11)
                    145: #define MMU_PAGE_UR_SHIFT                              11
                    146: 
                    147: #define MMU_MMUSR_ADDR_MASK                            0xfffff000
                    148: #define MMU_MMUSR_B                                            (1 << 11)
                    149: #define MMU_MMUSR_G                                            (1 << 10)
                    150: #define MMU_MMUSR_U1                                   (1 << 9)
                    151: #define MMU_MMUSR_U0                                   (1 << 8)
                    152: #define MMU_MMUSR_Ux                                   (MMU_MMUSR_U1 | MMU_MMUSR_U0)
                    153: #define MMU_MMUSR_S                                            (1 << 7)
                    154: #define MMU_MMUSR_CM                                   ((1 << 6) | ( 1 << 5))
                    155: #define MMU_MMUSR_M                                            (1 << 4)
                    156: #define MMU_MMUSR_W                                            (1 << 2)
                    157: #define MMU_MMUSR_T                                            (1 << 1)
                    158: #define MMU_MMUSR_R                                            (1 << 0)
                    159: 
                    160: #define TTR_I0 4
                    161: #define TTR_I1 5
                    162: #define TTR_D0 6
                    163: #define TTR_D1 7
                    164: 
                    165: #define TTR_NO_MATCH   0
                    166: #define TTR_NO_WRITE   1
                    167: #define TTR_OK_MATCH   2
                    168: 
                    169: struct mmu_atc_line {
1.1.1.4 ! root      170:        uaecptr tag; // tag is 16 or 17 bits S+logical
        !           171:        unsigned valid : 1;
1.1.1.2   root      172:        unsigned global : 1;
                    173:        unsigned modified : 1;
                    174:        unsigned write_protect : 1;
1.1.1.4 ! root      175:        uaecptr phys; // phys base address
1.1.1.2   root      176: };
                    177: 
                    178: /*
1.1.1.4 ! root      179:  * 68040 ATC is a 4 way 16 slot associative address translation cache
        !           180:  * the 68040 has a DATA and an INSTRUCTION ATC.
        !           181:  * an ATC lookup may result in : a hit, a miss and a modified state.
        !           182:  * the 68060 can disable ATC allocation
        !           183:  * we must take care of 8k and 4k page size, index position is relative to page size
1.1.1.2   root      184:  */
                    185: 
1.1.1.4 ! root      186: #define ATC_WAYS 4
        !           187: #define ATC_SLOTS 16
        !           188: #define ATC_TYPE 2
        !           189: 
        !           190: extern uae_u32 mmu_is_super;
        !           191: extern uae_u32 mmu_tagmask, mmu_pagemask;
        !           192: extern struct mmu_atc_line mmu_atc_array[ATC_TYPE][ATC_WAYS][ATC_SLOTS];
1.1.1.2   root      193: 
1.1.1.4 ! root      194: /* Last matched ATC index, next lookup starts from this index as an optimization */
        !           195: extern int mmu_atc_ways;
1.1.1.2   root      196: 
                    197: /*
1.1.1.4 ! root      198:  * mmu access is a 4 step process:
        !           199:  * if mmu is not enabled just read physical
        !           200:  * check transparent region, if transparent, read physical
        !           201:  * check ATC (address translation cache), read immediatly if HIT
        !           202:  * read from mmu with the long path (and allocate ATC entry if needed)
1.1.1.2   root      203:  */
                    204: static ALWAYS_INLINE bool mmu_lookup(uaecptr addr, bool data, bool write,
                    205:                                                                          struct mmu_atc_line **cl)
                    206: {
1.1.1.4 ! root      207:        int way, i, index;
        !           208:        static int way_miss=0;
        !           209: 
        !           210:        uae_u32 tag = (mmu_is_super | (addr >> 1)) & mmu_tagmask;
        !           211:        if (mmu_pagesize_8k)
        !           212:                index=(addr & 0x0001E000)>>13;
        !           213:        else
        !           214:                index=(addr & 0x0000F000)>>12;
        !           215:        for (i = 0; i < ATC_WAYS; i++) {
        !           216:                way = mmu_atc_ways;
        !           217:                // if we have this 
        !           218:                if ((tag == mmu_atc_array[data][way][index].tag) && (mmu_atc_array[data][way][index].valid)) {
        !           219:                        *cl=&mmu_atc_array[data][way][index];
        !           220:                        // if first write to this take slow path (but modify this slot)
        !           221:                        if ((!mmu_atc_array[data][way][index].modified & write) || (mmu_atc_array[data][way][index].write_protect & write))
        !           222:                                return false; 
        !           223:                        return true;
        !           224:                }
        !           225:                mmu_atc_ways++;
        !           226:                mmu_atc_ways %= ATC_WAYS;
        !           227:        }
        !           228:        // we select a random way to void
        !           229:        *cl=&mmu_atc_array[data][way_miss%ATC_WAYS][index];
        !           230:        (*cl)->tag = tag;
        !           231:        way_miss++;
        !           232:        return false;
1.1.1.2   root      233: }
                    234: 
                    235: /*
                    236:  */
                    237: static ALWAYS_INLINE bool mmu_user_lookup(uaecptr addr, bool super, bool data,
                    238:                                                                                   bool write, struct mmu_atc_line **cl)
                    239: {
1.1.1.4 ! root      240:        int way, i, index;
        !           241:        static int way_miss=0;
        !           242: 
        !           243:        uae_u32 tag = ((super ? 0x80000000 : 0x00000000) | (addr >> 1)) & mmu_tagmask;
        !           244:        if (mmu_pagesize_8k)
        !           245:                index=(addr & 0x0001E000)>>13;
        !           246:        else
        !           247:                index=(addr & 0x0000F000)>>12;
        !           248:        for (i = 0; i < ATC_WAYS; i++) {
        !           249:                way = mmu_atc_ways;
        !           250:                // if we have this 
        !           251:                if ((tag == mmu_atc_array[data][way][index].tag) && (mmu_atc_array[data][way][index].valid)) {
        !           252:                        *cl=&mmu_atc_array[data][way][index];
        !           253:                        // if first write to this take slow path (but modify this slot)
        !           254:                        if ((!mmu_atc_array[data][way][index].modified & write) || (mmu_atc_array[data][way][index].write_protect & write))
        !           255:                                return false; 
        !           256:                        return true;
        !           257:                }
        !           258:                mmu_atc_ways++;
        !           259:                mmu_atc_ways %= ATC_WAYS;
        !           260:        }
        !           261:        // we select a random way to void
        !           262:        *cl=&mmu_atc_array[data][way_miss%ATC_WAYS][index];
        !           263:        (*cl)->tag = tag;
        !           264:        way_miss++;
        !           265:        return false;
        !           266: }
        !           267: 
        !           268: /* check if an address matches a ttr */
        !           269: STATIC_INLINE int mmu_do_match_ttr(uae_u32 ttr, uaecptr addr, bool super)
        !           270: {
        !           271:        if (ttr & MMU_TTR_BIT_ENABLED)  {       /* TTR enabled */
        !           272:                uae_u8 msb, mask;
        !           273: 
        !           274:                msb = ((addr ^ ttr) & MMU_TTR_LOGICAL_BASE) >> 24;
        !           275:                mask = (ttr & MMU_TTR_LOGICAL_MASK) >> 16;
        !           276: 
        !           277:                if (!(msb & ~mask)) {
        !           278: 
        !           279:                        if ((ttr & MMU_TTR_BIT_SFIELD_ENABLED) == 0) {
        !           280:                                if (((ttr & MMU_TTR_BIT_SFIELD_SUPER) == 0) != (super == 0)) {
        !           281:                                        return TTR_NO_MATCH;
        !           282:                                }
        !           283:                        }
        !           284: 
        !           285:                        return (ttr & MMU_TTR_BIT_WRITE_PROTECT) ? TTR_NO_WRITE : TTR_OK_MATCH;
        !           286:                }
        !           287:        }
        !           288:        return TTR_NO_MATCH;
        !           289: }
        !           290: 
        !           291: STATIC_INLINE int mmu_match_ttr(uaecptr addr, bool super, bool data, bool rmw)
        !           292: {
        !           293:        int res;
        !           294: 
        !           295:        if (!mmu_ttr_enabled)
        !           296:                return TTR_NO_MATCH;
        !           297:        if (data) {
        !           298:                res = mmu_do_match_ttr(regs.dtt0, addr, super);
        !           299:                if (res == TTR_NO_MATCH)
        !           300:                        res = mmu_do_match_ttr(regs.dtt1, addr, super);
        !           301:        } else {
        !           302:                res = mmu_do_match_ttr(regs.itt0, addr, super);
        !           303:                if (res == TTR_NO_MATCH)
        !           304:                        res = mmu_do_match_ttr(regs.itt1, addr, super);
        !           305:        }
        !           306:        return res;
        !           307: }
        !           308: extern void mmu_bus_error_ttr_write_fault(uaecptr addr, bool super, bool data, uae_u32 val, int size, bool rmw);
        !           309: STATIC_INLINE int mmu_match_ttr_write(uaecptr addr, bool super, bool data,  uae_u32 val, int size, bool rmw)
        !           310: {
        !           311:        if (!mmu_ttr_enabled)
        !           312:                return TTR_NO_MATCH;
        !           313:        int res = mmu_match_ttr(addr, super, data, rmw);
        !           314:        if (res == TTR_NO_WRITE)
        !           315:                mmu_bus_error_ttr_write_fault(addr, super, data, val, size, rmw);
        !           316:        return res;
        !           317: }
        !           318: 
        !           319: extern void mmu_tt_modified (void);
        !           320: 
        !           321: extern uae_u32 REGPARAM3 mmu060_get_rmw_bitfield (uae_u32 src, uae_u32 bdata[2], uae_s32 offset, int width) REGPARAM;
        !           322: extern void REGPARAM3 mmu060_put_rmw_bitfield (uae_u32 dst, uae_u32 bdata[2], uae_u32 val, uae_s32 offset, int width) REGPARAM;
        !           323: 
        !           324: extern uae_u16 REGPARAM3 mmu_get_word_unaligned(uaecptr addr, bool data, bool rmw) REGPARAM;
        !           325: extern uae_u32 REGPARAM3 mmu_get_long_unaligned(uaecptr addr, bool data, bool rmw) REGPARAM;
        !           326: extern uae_u16 REGPARAM2 mmu_get_lrmw_word_unaligned(uaecptr addr) REGPARAM;
        !           327: extern uae_u32 REGPARAM2 mmu_get_lrmw_long_unaligned(uaecptr addr) REGPARAM;
1.1.1.2   root      328: 
1.1.1.4 ! root      329: extern uae_u32 REGPARAM3 mmu_get_ilong_unaligned(uaecptr addr) REGPARAM;
1.1.1.2   root      330: 
                    331: extern uae_u8 REGPARAM3 mmu_get_byte_slow(uaecptr addr, bool super, bool data,
1.1.1.4 ! root      332:                                                                                  int size, bool rmw, struct mmu_atc_line *cl) REGPARAM;
1.1.1.2   root      333: extern uae_u16 REGPARAM3 mmu_get_word_slow(uaecptr addr, bool super, bool data,
1.1.1.4 ! root      334:                                                                                   int size, bool rmw, struct mmu_atc_line *cl) REGPARAM;
1.1.1.2   root      335: extern uae_u32 REGPARAM3 mmu_get_long_slow(uaecptr addr, bool super, bool data,
1.1.1.4 ! root      336:                                                                                   int size, bool rmw, struct mmu_atc_line *cl) REGPARAM;
        !           337: 
        !           338: extern uae_u16 REGPARAM3 mmu_get_iword_slow(uaecptr addr, bool super,
        !           339:                                                                                   int size, struct mmu_atc_line *cl) REGPARAM;
        !           340: extern uae_u32 REGPARAM3 mmu_get_ilong_slow(uaecptr addr, bool super,
1.1.1.2   root      341:                                                                                   int size, struct mmu_atc_line *cl) REGPARAM;
                    342: 
1.1.1.4 ! root      343: extern void REGPARAM3 mmu_put_word_unaligned(uaecptr addr, uae_u16 val, bool data, bool rmw) REGPARAM;
        !           344: extern void REGPARAM3 mmu_put_long_unaligned(uaecptr addr, uae_u32 val, bool data, bool rmw) REGPARAM;
1.1.1.2   root      345: 
                    346: extern void REGPARAM3 mmu_put_byte_slow(uaecptr addr, uae_u8 val, bool super, bool data,
1.1.1.4 ! root      347:                                                                                int size, bool rmw, struct mmu_atc_line *cl) REGPARAM;
1.1.1.2   root      348: extern void REGPARAM3 mmu_put_word_slow(uaecptr addr, uae_u16 val, bool super, bool data,
1.1.1.4 ! root      349:                                                                                int size, bool rmw, struct mmu_atc_line *cl) REGPARAM;
1.1.1.2   root      350: extern void REGPARAM3 mmu_put_long_slow(uaecptr addr, uae_u32 val, bool super, bool data,
1.1.1.4 ! root      351:                                                                                int size, bool rmw, struct mmu_atc_line *cl) REGPARAM;
1.1.1.2   root      352: 
                    353: extern void mmu_make_transparent_region(uaecptr baseaddr, uae_u32 size, int datamode);
                    354: 
                    355: #define FC_DATA                (regs.s ? 5 : 1)
                    356: #define FC_INST                (regs.s ? 6 : 2)
                    357: 
                    358: extern uaecptr REGPARAM3 mmu_translate(uaecptr addr, bool super, bool data, bool write) REGPARAM;
1.1.1.4 ! root      359: extern void mmu_bus_error(uaecptr addr, int fc, bool write, int size, bool rmw, uae_u32 status, bool nonmmu);
1.1.1.2   root      360: 
                    361: extern uae_u32 REGPARAM3 sfc_get_long(uaecptr addr) REGPARAM;
                    362: extern uae_u16 REGPARAM3 sfc_get_word(uaecptr addr) REGPARAM;
                    363: extern uae_u8 REGPARAM3 sfc_get_byte(uaecptr addr) REGPARAM;
                    364: extern void REGPARAM3 dfc_put_long(uaecptr addr, uae_u32 val) REGPARAM;
                    365: extern void REGPARAM3 dfc_put_word(uaecptr addr, uae_u16 val) REGPARAM;
                    366: extern void REGPARAM3 dfc_put_byte(uaecptr addr, uae_u8 val) REGPARAM;
                    367: 
1.1.1.4 ! root      368: #define sfc040_get_long sfc_get_long
        !           369: #define sfc040_get_word sfc_get_word
        !           370: #define sfc040_get_byte sfc_get_byte
        !           371: #define dfc040_put_long dfc_put_long
        !           372: #define dfc040_put_word dfc_put_word
        !           373: #define dfc040_put_byte dfc_put_byte
        !           374: 
        !           375: #define sfc060_get_long sfc_get_long
        !           376: #define sfc060_get_word sfc_get_word
        !           377: #define sfc060_get_byte sfc_get_byte
        !           378: #define dfc060_put_long dfc_put_long
        !           379: #define dfc060_put_word dfc_put_word
        !           380: #define dfc060_put_byte dfc_put_byte
        !           381: 
        !           382: extern void uae_mmu_put_lrmw (uaecptr addr, uae_u32 v, int size, int type);
        !           383: extern uae_u32 uae_mmu_get_lrmw (uaecptr addr, int size, int type);
1.1.1.2   root      384: 
                    385: extern void REGPARAM3 mmu_flush_atc(uaecptr addr, bool super, bool global) REGPARAM;
                    386: extern void REGPARAM3 mmu_flush_atc_all(bool global) REGPARAM;
                    387: extern void REGPARAM3 mmu_op_real(uae_u32 opcode, uae_u16 extra) REGPARAM;
                    388: 
                    389: extern void REGPARAM3 mmu_reset(void) REGPARAM;
1.1.1.4 ! root      390: extern void REGPARAM3 mmu_set_funcs(void) REGPARAM;
1.1.1.2   root      391: extern void REGPARAM3 mmu_set_tc(uae_u16 tc) REGPARAM;
                    392: extern void REGPARAM3 mmu_set_super(bool super) REGPARAM;
                    393: 
                    394: static ALWAYS_INLINE uaecptr mmu_get_real_address(uaecptr addr, struct mmu_atc_line *cl)
                    395: {
1.1.1.4 ! root      396:     return cl->phys | (addr & mmu_pagemask);
1.1.1.2   root      397: }
                    398: 
1.1.1.4 ! root      399: extern void mmu_get_move16(uaecptr addr, uae_u32 *v, bool data, int size);
        !           400: extern void mmu_put_move16(uaecptr addr, uae_u32 *val, bool data, int size);
        !           401: 
        !           402: static ALWAYS_INLINE uae_u32 mmu_get_long(uaecptr addr, bool data, int size, bool rmw)
1.1.1.2   root      403: {
                    404:        struct mmu_atc_line *cl;
                    405: 
1.1.1.4 ! root      406:        //                                       addr,super,data
        !           407:        if ((!regs.mmu_enabled) || (mmu_match_ttr(addr,regs.s != 0,data,rmw)!=TTR_NO_MATCH))
        !           408:                return x_phys_get_long(addr);
1.1.1.2   root      409:        if (likely(mmu_lookup(addr, data, false, &cl)))
1.1.1.4 ! root      410:                return x_phys_get_long(mmu_get_real_address(addr, cl));
        !           411:        return mmu_get_long_slow(addr, regs.s != 0, data, size, rmw, cl);
1.1.1.2   root      412: }
                    413: 
1.1.1.4 ! root      414: static ALWAYS_INLINE uae_u32 mmu_get_ilong(uaecptr addr, int size)
1.1.1.2   root      415: {
                    416:        struct mmu_atc_line *cl;
                    417: 
1.1.1.4 ! root      418:        //                                       addr,super,data
        !           419:        if ((!regs.mmu_enabled) || (mmu_match_ttr(addr, regs.s != 0, false, false) != TTR_NO_MATCH))
        !           420:                return x_phys_get_ilong(addr);
        !           421:        if (likely(mmu_lookup(addr, false, false, &cl)))
        !           422:                return x_phys_get_ilong(mmu_get_real_address(addr, cl));
        !           423:        return mmu_get_ilong_slow(addr, regs.s != 0, size, cl);
1.1.1.2   root      424: }
                    425: 
1.1.1.4 ! root      426: static ALWAYS_INLINE uae_u16 mmu_get_word(uaecptr addr, bool data, int size, bool rmw)
1.1.1.2   root      427: {
                    428:        struct mmu_atc_line *cl;
                    429: 
1.1.1.4 ! root      430:        //                                       addr,super,data
        !           431:        if ((!regs.mmu_enabled) || (mmu_match_ttr(addr,regs.s != 0,data,rmw)!=TTR_NO_MATCH))
        !           432:                return x_phys_get_word(addr);
1.1.1.2   root      433:        if (likely(mmu_lookup(addr, data, false, &cl)))
1.1.1.4 ! root      434:                return x_phys_get_word(mmu_get_real_address(addr, cl));
        !           435:        return mmu_get_word_slow(addr, regs.s != 0, data, size, rmw, cl);
1.1.1.2   root      436: }
                    437: 
1.1.1.4 ! root      438: static ALWAYS_INLINE uae_u16 mmu_get_iword(uaecptr addr, int size)
        !           439: {
        !           440:        struct mmu_atc_line *cl;
        !           441: 
        !           442:        //                                       addr,super,data
        !           443:        if ((!regs.mmu_enabled) || (mmu_match_ttr(addr, regs.s != 0, false, false) != TTR_NO_MATCH))
        !           444:                return x_phys_get_iword(addr);
        !           445:        if (likely(mmu_lookup(addr, false, false, &cl)))
        !           446:                return x_phys_get_iword(mmu_get_real_address(addr, cl));
        !           447:        return mmu_get_iword_slow(addr, regs.s != 0, size, cl);
        !           448: }
        !           449: 
        !           450: static ALWAYS_INLINE uae_u8 mmu_get_byte(uaecptr addr, bool data, int size, bool rmw)
        !           451: {
        !           452:        struct mmu_atc_line *cl;
        !           453: 
        !           454:        //                                       addr,super,data
        !           455:        if ((!regs.mmu_enabled) || (mmu_match_ttr(addr,regs.s != 0,data,rmw)!=TTR_NO_MATCH))
        !           456:                return x_phys_get_byte(addr);
        !           457:        if (likely(mmu_lookup(addr, data, false, &cl)))
        !           458:                return x_phys_get_byte(mmu_get_real_address(addr, cl));
        !           459:        return mmu_get_byte_slow(addr, regs.s != 0, data, size, rmw, cl);
        !           460: }
1.1.1.2   root      461: 
1.1.1.4 ! root      462: static ALWAYS_INLINE void mmu_put_long(uaecptr addr, uae_u32 val, bool data, int size, bool rmw)
1.1.1.2   root      463: {
                    464:        struct mmu_atc_line *cl;
                    465: 
1.1.1.4 ! root      466:        //                                        addr,super,data
        !           467:        if ((!regs.mmu_enabled) || mmu_match_ttr_write(addr,regs.s != 0,data,val,size,rmw)==TTR_OK_MATCH) {
        !           468:                x_phys_put_long(addr,val);
        !           469:                return;
        !           470:        }
1.1.1.2   root      471:        if (likely(mmu_lookup(addr, data, true, &cl)))
1.1.1.4 ! root      472:                x_phys_put_long(mmu_get_real_address(addr, cl), val);
1.1.1.2   root      473:        else
1.1.1.4 ! root      474:                mmu_put_long_slow(addr, val, regs.s != 0, data, size, rmw, cl);
1.1.1.2   root      475: }
                    476: 
1.1.1.4 ! root      477: static ALWAYS_INLINE void mmu_put_word(uaecptr addr, uae_u16 val, bool data, int size, bool rmw)
1.1.1.2   root      478: {
                    479:        struct mmu_atc_line *cl;
                    480: 
1.1.1.4 ! root      481:        //                                        addr,super,data
        !           482:        if ((!regs.mmu_enabled) || (mmu_match_ttr_write(addr,regs.s != 0,data,val,size,rmw)==TTR_OK_MATCH)) {
        !           483:                x_phys_put_word(addr,val);
        !           484:                return;
        !           485:        }
1.1.1.2   root      486:        if (likely(mmu_lookup(addr, data, true, &cl)))
1.1.1.4 ! root      487:                x_phys_put_word(mmu_get_real_address(addr, cl), val);
1.1.1.2   root      488:        else
1.1.1.4 ! root      489:                mmu_put_word_slow(addr, val, regs.s != 0, data, size, rmw, cl);
1.1.1.2   root      490: }
                    491: 
1.1.1.4 ! root      492: static ALWAYS_INLINE void mmu_put_byte(uaecptr addr, uae_u8 val, bool data, int size, bool rmw)
1.1.1.2   root      493: {
                    494:        struct mmu_atc_line *cl;
                    495: 
1.1.1.4 ! root      496:        //                                        addr,super,data
        !           497:        if ((!regs.mmu_enabled) || (mmu_match_ttr_write(addr,regs.s != 0,data,val,size,rmw)==TTR_OK_MATCH)) {
        !           498:                x_phys_put_byte(addr,val);
        !           499:                return;
        !           500:        }
1.1.1.2   root      501:        if (likely(mmu_lookup(addr, data, true, &cl)))
1.1.1.4 ! root      502:                x_phys_put_byte(mmu_get_real_address(addr, cl), val);
1.1.1.2   root      503:        else
1.1.1.4 ! root      504:                mmu_put_byte_slow(addr, val, regs.s != 0, data, size, rmw, cl);
1.1.1.2   root      505: }
                    506: 
1.1.1.4 ! root      507: static ALWAYS_INLINE uae_u32 mmu_get_user_long(uaecptr addr, bool super, bool data, bool write, int size)
1.1.1.2   root      508: {
                    509:        struct mmu_atc_line *cl;
                    510: 
1.1.1.4 ! root      511:        //                                       addr,super,data
        !           512:        if ((!regs.mmu_enabled) || (mmu_match_ttr(addr,super,data,false)!=TTR_NO_MATCH))
        !           513:                return x_phys_get_long(addr);
        !           514:        if (likely(mmu_user_lookup(addr, super, data, write, &cl)))
        !           515:                return x_phys_get_long(mmu_get_real_address(addr, cl));
        !           516:        return mmu_get_long_slow(addr, super, data, size, false, cl);
1.1.1.2   root      517: }
                    518: 
1.1.1.4 ! root      519: static ALWAYS_INLINE uae_u16 mmu_get_user_word(uaecptr addr, bool super, bool data, bool write, int size)
1.1.1.2   root      520: {
                    521:        struct mmu_atc_line *cl;
                    522: 
1.1.1.4 ! root      523:        //                                       addr,super,data
        !           524:        if ((!regs.mmu_enabled) || (mmu_match_ttr(addr,super,data,false)!=TTR_NO_MATCH))
        !           525:                return x_phys_get_word(addr);
        !           526:        if (likely(mmu_user_lookup(addr, super, data, write, &cl)))
        !           527:                return x_phys_get_word(mmu_get_real_address(addr, cl));
        !           528:        return mmu_get_word_slow(addr, super, data, size, false, cl);
1.1.1.2   root      529: }
                    530: 
1.1.1.4 ! root      531: static ALWAYS_INLINE uae_u8 mmu_get_user_byte(uaecptr addr, bool super, bool data, bool write, int size)
1.1.1.2   root      532: {
                    533:        struct mmu_atc_line *cl;
                    534: 
1.1.1.4 ! root      535:        //                                       addr,super,data
        !           536:        if ((!regs.mmu_enabled) || (mmu_match_ttr(addr,super,data,false)!=TTR_NO_MATCH))
        !           537:                return x_phys_get_byte(addr);
        !           538:        if (likely(mmu_user_lookup(addr, super, data, write, &cl)))
        !           539:                return x_phys_get_byte(mmu_get_real_address(addr, cl));
        !           540:        return mmu_get_byte_slow(addr, super, data, size, false, cl);
1.1.1.2   root      541: }
                    542: 
                    543: static ALWAYS_INLINE void mmu_put_user_long(uaecptr addr, uae_u32 val, bool super, bool data, int size)
                    544: {
                    545:        struct mmu_atc_line *cl;
                    546: 
1.1.1.4 ! root      547:        //                                        addr,super,data
        !           548:        if ((!regs.mmu_enabled) || (mmu_match_ttr(addr,super,data,false)==TTR_OK_MATCH)) {
        !           549:                x_phys_put_long(addr,val);
        !           550:                return;
        !           551:        }
1.1.1.2   root      552:        if (likely(mmu_user_lookup(addr, super, data, true, &cl)))
1.1.1.4 ! root      553:                x_phys_put_long(mmu_get_real_address(addr, cl), val);
1.1.1.2   root      554:        else
1.1.1.4 ! root      555:                mmu_put_long_slow(addr, val, super, data, size, false, cl);
1.1.1.2   root      556: }
                    557: 
                    558: static ALWAYS_INLINE void mmu_put_user_word(uaecptr addr, uae_u16 val, bool super, bool data, int size)
                    559: {
                    560:        struct mmu_atc_line *cl;
                    561: 
1.1.1.4 ! root      562:        //                                        addr,super,data
        !           563:        if ((!regs.mmu_enabled) || (mmu_match_ttr(addr,super,data,false)==TTR_OK_MATCH)) {
        !           564:                x_phys_put_word(addr,val);
        !           565:                return;
        !           566:        }
1.1.1.2   root      567:        if (likely(mmu_user_lookup(addr, super, data, true, &cl)))
1.1.1.4 ! root      568:                x_phys_put_word(mmu_get_real_address(addr, cl), val);
1.1.1.2   root      569:        else
1.1.1.4 ! root      570:                mmu_put_word_slow(addr, val, super, data, size, false, cl);
1.1.1.2   root      571: }
                    572: 
                    573: static ALWAYS_INLINE void mmu_put_user_byte(uaecptr addr, uae_u8 val, bool super, bool data, int size)
                    574: {
                    575:        struct mmu_atc_line *cl;
                    576: 
1.1.1.4 ! root      577:        //                                        addr,super,data
        !           578:        if ((!regs.mmu_enabled) || (mmu_match_ttr(addr,super,data,false)==TTR_OK_MATCH)) {
        !           579:                x_phys_put_byte(addr,val);
        !           580:                return;
        !           581:        }
1.1.1.2   root      582:        if (likely(mmu_user_lookup(addr, super, data, true, &cl)))
1.1.1.4 ! root      583:                x_phys_put_byte(mmu_get_real_address(addr, cl), val);
1.1.1.2   root      584:        else
1.1.1.4 ! root      585:                mmu_put_byte_slow(addr, val, super, data, size, false, cl);
1.1.1.2   root      586: }
                    587: 
                    588: 
                    589: static ALWAYS_INLINE void HWput_l(uaecptr addr, uae_u32 l)
                    590: {
                    591:     put_long (addr, l);
                    592: }
                    593: static ALWAYS_INLINE void HWput_w(uaecptr addr, uae_u32 w)
                    594: {
                    595:     put_word (addr, w);
                    596: }
                    597: static ALWAYS_INLINE void HWput_b(uaecptr addr, uae_u32 b)
                    598: {
                    599:     put_byte (addr, b);
                    600: }
                    601: static ALWAYS_INLINE uae_u32 HWget_l(uaecptr addr)
                    602: {
                    603:     return get_long (addr);
                    604: }
                    605: static ALWAYS_INLINE uae_u32 HWget_w(uaecptr addr)
                    606: {
                    607:     return get_word (addr);
                    608: }
                    609: static ALWAYS_INLINE uae_u32 HWget_b(uaecptr addr)
                    610: {
                    611:     return get_byte (addr);
                    612: }
                    613: 
1.1.1.4 ! root      614: static ALWAYS_INLINE uae_u32 uae_mmu040_get_ilong(uaecptr addr)
1.1.1.2   root      615: {
                    616:        if (unlikely(is_unaligned(addr, 4)))
1.1.1.4 ! root      617:                return mmu_get_ilong_unaligned(addr);
        !           618:        return mmu_get_ilong(addr, sz_long);
1.1.1.2   root      619: }
1.1.1.4 ! root      620: static ALWAYS_INLINE uae_u16 uae_mmu040_get_iword(uaecptr addr)
        !           621: {
        !           622:        return mmu_get_iword(addr, sz_word);
        !           623: }
        !           624: static ALWAYS_INLINE uae_u16 uae_mmu040_get_ibyte(uaecptr addr)
        !           625: {
        !           626:        return mmu_get_byte(addr, false, sz_byte, false);
        !           627: }
        !           628: static ALWAYS_INLINE uae_u32 uae_mmu040_get_long(uaecptr addr)
        !           629: {
        !           630:        if (unlikely(is_unaligned(addr, 4)))
        !           631:                return mmu_get_long_unaligned(addr, true, false);
        !           632:        return mmu_get_long(addr, true, sz_long, false);
        !           633: }
        !           634: static ALWAYS_INLINE uae_u16 uae_mmu040_get_word(uaecptr addr)
1.1.1.2   root      635: {
                    636:        if (unlikely(is_unaligned(addr, 2)))
1.1.1.4 ! root      637:                return mmu_get_word_unaligned(addr, true, false);
        !           638:        return mmu_get_word(addr, true, sz_word, false);
1.1.1.2   root      639: }
1.1.1.4 ! root      640: static ALWAYS_INLINE uae_u8 uae_mmu040_get_byte(uaecptr addr)
1.1.1.2   root      641: {
1.1.1.4 ! root      642:        return mmu_get_byte(addr, true, sz_byte, false);
1.1.1.2   root      643: }
1.1.1.4 ! root      644: 
        !           645: static ALWAYS_INLINE void uae_mmu040_put_word(uaecptr addr, uae_u16 val)
        !           646: {
        !           647:        if (unlikely(is_unaligned(addr, 2)))
        !           648:                mmu_put_word_unaligned(addr, val, true, false);
        !           649:        else
        !           650:                mmu_put_word(addr, val, true, sz_word, false);
        !           651: }
        !           652: static ALWAYS_INLINE void uae_mmu040_put_byte(uaecptr addr, uae_u8 val)
        !           653: {
        !           654:        mmu_put_byte(addr, val, true, sz_byte, false);
        !           655: }
        !           656: static ALWAYS_INLINE void uae_mmu040_put_long(uaecptr addr, uae_u32 val)
1.1.1.2   root      657: {
                    658:        if (unlikely(is_unaligned(addr, 4)))
1.1.1.4 ! root      659:                mmu_put_long_unaligned(addr, val, true, false);
        !           660:        else
        !           661:                mmu_put_long(addr, val, true, sz_long, false);
1.1.1.2   root      662: }
1.1.1.4 ! root      663: 
        !           664: 
        !           665: static ALWAYS_INLINE uae_u32 uae_mmu060_get_ilong(uaecptr addr)
        !           666: {
        !           667:        if (unlikely(is_unaligned(addr, 4)))
        !           668:                return mmu_get_ilong_unaligned(addr);
        !           669:        return mmu_get_ilong(addr, sz_long);
        !           670: }
        !           671: static ALWAYS_INLINE uae_u16 uae_mmu060_get_iword(uaecptr addr)
        !           672: {
        !           673:        return mmu_get_iword(addr, sz_word);
        !           674: }
        !           675: static ALWAYS_INLINE uae_u16 uae_mmu060_get_ibyte(uaecptr addr)
        !           676: {
        !           677:        return mmu_get_byte(addr, false, sz_byte, false);
        !           678: }
        !           679: static ALWAYS_INLINE uae_u32 uae_mmu060_get_long(uaecptr addr, bool rmw)
        !           680: {
        !           681:        if (unlikely(is_unaligned(addr, 4)))
        !           682:                return mmu_get_long_unaligned(addr, true, rmw);
        !           683:        return mmu_get_long(addr, true, sz_long, rmw);
        !           684: }
        !           685: static ALWAYS_INLINE uae_u16 uae_mmu060_get_word(uaecptr addr, bool rmw)
1.1.1.2   root      686: {
                    687:        if (unlikely(is_unaligned(addr, 2)))
1.1.1.4 ! root      688:                return mmu_get_word_unaligned(addr, true, rmw);
        !           689:        return mmu_get_word(addr, true, sz_word, rmw);
        !           690: }
        !           691: static ALWAYS_INLINE uae_u8 uae_mmu060_get_byte(uaecptr addr, bool rmw)
        !           692: {
        !           693:        return mmu_get_byte(addr, true, sz_byte, rmw);
1.1.1.2   root      694: }
1.1.1.4 ! root      695: static ALWAYS_INLINE void uae_mmu_get_move16(uaecptr addr, uae_u32 *val)
1.1.1.2   root      696: {
1.1.1.4 ! root      697:        // move16 is always aligned
        !           698:        mmu_get_move16(addr, val, true, 16);
1.1.1.2   root      699: }
1.1.1.4 ! root      700: 
        !           701: static ALWAYS_INLINE void uae_mmu060_put_long(uaecptr addr, uae_u32 val, bool rmw)
1.1.1.2   root      702: {
                    703:        if (unlikely(is_unaligned(addr, 4)))
1.1.1.4 ! root      704:                mmu_put_long_unaligned(addr, val, true, rmw);
1.1.1.2   root      705:        else
1.1.1.4 ! root      706:                mmu_put_long(addr, val, true, sz_long, rmw);
1.1.1.2   root      707: }
1.1.1.4 ! root      708: static ALWAYS_INLINE void uae_mmu060_put_word(uaecptr addr, uae_u16 val, bool rmw)
1.1.1.2   root      709: {
                    710:        if (unlikely(is_unaligned(addr, 2)))
1.1.1.4 ! root      711:                mmu_put_word_unaligned(addr, val, true, rmw);
1.1.1.2   root      712:        else
1.1.1.4 ! root      713:                mmu_put_word(addr, val, true, sz_word, rmw);
        !           714: }
        !           715: static ALWAYS_INLINE void uae_mmu060_put_byte(uaecptr addr, uae_u8 val, bool rmw)
        !           716: {
        !           717:        mmu_put_byte(addr, val, true, sz_byte, rmw);
        !           718: }
        !           719: static ALWAYS_INLINE void uae_mmu_put_move16(uaecptr addr, uae_u32 *val)
        !           720: {
        !           721:        // move16 is always aligned
        !           722:        mmu_put_move16(addr, val, true, 16);
        !           723: }
        !           724: 
        !           725: // normal 040
        !           726: STATIC_INLINE void put_byte_mmu040 (uaecptr addr, uae_u32 v)
        !           727: {
        !           728:     uae_mmu040_put_byte (addr, v);
        !           729: }
        !           730: STATIC_INLINE void put_word_mmu040 (uaecptr addr, uae_u32 v)
        !           731: {
        !           732:     uae_mmu040_put_word (addr, v);
        !           733: }
        !           734: STATIC_INLINE void put_long_mmu040 (uaecptr addr, uae_u32 v)
        !           735: {
        !           736:     uae_mmu040_put_long (addr, v);
        !           737: }
        !           738: STATIC_INLINE uae_u32 get_byte_mmu040 (uaecptr addr)
        !           739: {
        !           740:     return uae_mmu040_get_byte (addr);
        !           741: }
        !           742: STATIC_INLINE uae_u32 get_word_mmu040 (uaecptr addr)
        !           743: {
        !           744:     return uae_mmu040_get_word (addr);
        !           745: }
        !           746: STATIC_INLINE uae_u32 get_long_mmu040 (uaecptr addr)
        !           747: {
        !           748:     return uae_mmu040_get_long (addr);
        !           749: }
        !           750: // normal 060
        !           751: STATIC_INLINE void put_byte_mmu060 (uaecptr addr, uae_u32 v)
        !           752: {
        !           753:     uae_mmu060_put_byte (addr, v, false);
        !           754: }
        !           755: STATIC_INLINE void put_word_mmu060 (uaecptr addr, uae_u32 v)
        !           756: {
        !           757:     uae_mmu060_put_word (addr, v, false);
        !           758: }
        !           759: STATIC_INLINE void put_long_mmu060 (uaecptr addr, uae_u32 v)
        !           760: {
        !           761:     uae_mmu060_put_long (addr, v, false);
        !           762: }
        !           763: STATIC_INLINE uae_u32 get_byte_mmu060 (uaecptr addr)
        !           764: {
        !           765:     return uae_mmu060_get_byte (addr, false);
1.1.1.2   root      766: }
1.1.1.4 ! root      767: STATIC_INLINE uae_u32 get_word_mmu060 (uaecptr addr)
1.1.1.2   root      768: {
1.1.1.4 ! root      769:     return uae_mmu060_get_word (addr, false);
        !           770: }
        !           771: STATIC_INLINE uae_u32 get_long_mmu060 (uaecptr addr)
        !           772: {
        !           773:     return uae_mmu060_get_long (addr, false);
1.1.1.2   root      774: }
                    775: 
1.1.1.4 ! root      776: STATIC_INLINE void get_move16_mmu (uaecptr addr, uae_u32 *v)
1.1.1.2   root      777: {
1.1.1.4 ! root      778:     uae_mmu_get_move16 (addr, v);
1.1.1.2   root      779: }
1.1.1.4 ! root      780: STATIC_INLINE void put_move16_mmu (uaecptr addr, uae_u32 *v)
1.1.1.2   root      781: {
1.1.1.4 ! root      782:     uae_mmu_put_move16 (addr, v);
1.1.1.2   root      783: }
1.1.1.4 ! root      784: 
        !           785: // locked rmw 060
        !           786: STATIC_INLINE void put_lrmw_byte_mmu060 (uaecptr addr, uae_u32 v)
1.1.1.2   root      787: {
1.1.1.4 ! root      788:     uae_mmu_put_lrmw (addr, v, sz_byte, 1);
1.1.1.2   root      789: }
1.1.1.4 ! root      790: STATIC_INLINE void put_lrmw_word_mmu060 (uaecptr addr, uae_u32 v)
1.1.1.2   root      791: {
1.1.1.4 ! root      792:     uae_mmu_put_lrmw (addr, v, sz_word, 1);
1.1.1.2   root      793: }
1.1.1.4 ! root      794: STATIC_INLINE void put_lrmw_long_mmu060 (uaecptr addr, uae_u32 v)
1.1.1.2   root      795: {
1.1.1.4 ! root      796:     uae_mmu_put_lrmw (addr, v, sz_long, 1);
1.1.1.2   root      797: }
1.1.1.4 ! root      798: STATIC_INLINE uae_u32 get_lrmw_byte_mmu060 (uaecptr addr)
1.1.1.2   root      799: {
1.1.1.4 ! root      800:     return uae_mmu_get_lrmw (addr, sz_byte, 1);
1.1.1.2   root      801: }
1.1.1.4 ! root      802: STATIC_INLINE uae_u32 get_lrmw_word_mmu060 (uaecptr addr)
        !           803: {
        !           804:     return uae_mmu_get_lrmw (addr, sz_word, 1);
        !           805: }
        !           806: STATIC_INLINE uae_u32 get_lrmw_long_mmu060 (uaecptr addr)
        !           807: {
        !           808:     return uae_mmu_get_lrmw (addr, sz_long, 1);
        !           809: }
        !           810: // normal rmw 060
        !           811: STATIC_INLINE void put_rmw_byte_mmu060 (uaecptr addr, uae_u32 v)
        !           812: {
        !           813:     uae_mmu060_put_byte (addr, v, true);
        !           814: }
        !           815: STATIC_INLINE void put_rmw_word_mmu060 (uaecptr addr, uae_u32 v)
        !           816: {
        !           817:     uae_mmu060_put_word (addr, v, true);
        !           818: }
        !           819: STATIC_INLINE void put_rmw_long_mmu060 (uaecptr addr, uae_u32 v)
        !           820: {
        !           821:     uae_mmu060_put_long (addr, v, true);
        !           822: }
        !           823: STATIC_INLINE uae_u32 get_rmw_byte_mmu060 (uaecptr addr)
        !           824: {
        !           825:     return uae_mmu060_get_byte (addr, true);
        !           826: }
        !           827: STATIC_INLINE uae_u32 get_rmw_word_mmu060 (uaecptr addr)
        !           828: {
        !           829:     return uae_mmu060_get_word (addr, true);
        !           830: }
        !           831: STATIC_INLINE uae_u32 get_rmw_long_mmu060 (uaecptr addr)
        !           832: {
        !           833:     return uae_mmu060_get_long (addr, true);
        !           834: }
        !           835: // locked rmw 040
        !           836: STATIC_INLINE void put_lrmw_byte_mmu040 (uaecptr addr, uae_u32 v)
        !           837: {
        !           838:     uae_mmu_put_lrmw (addr, v, sz_byte, 0);
        !           839: }
        !           840: STATIC_INLINE void put_lrmw_word_mmu040 (uaecptr addr, uae_u32 v)
        !           841: {
        !           842:     uae_mmu_put_lrmw (addr, v, sz_word, 0);
        !           843: }
        !           844: STATIC_INLINE void put_lrmw_long_mmu040 (uaecptr addr, uae_u32 v)
        !           845: {
        !           846:     uae_mmu_put_lrmw (addr, v, sz_long, 0);
        !           847: }
        !           848: STATIC_INLINE uae_u32 get_lrmw_byte_mmu040 (uaecptr addr)
        !           849: {
        !           850:     return uae_mmu_get_lrmw (addr, sz_byte, 0);
        !           851: }
        !           852: STATIC_INLINE uae_u32 get_lrmw_word_mmu040 (uaecptr addr)
        !           853: {
        !           854:     return uae_mmu_get_lrmw (addr, sz_word, 0);
        !           855: }
        !           856: STATIC_INLINE uae_u32 get_lrmw_long_mmu040 (uaecptr addr)
        !           857: {
        !           858:     return uae_mmu_get_lrmw (addr, sz_long, 0);
        !           859: }
        !           860: 
        !           861: STATIC_INLINE uae_u32 get_ibyte_mmu040 (int o)
        !           862: {
        !           863:     uae_u32 pc = m68k_getpci () + o;
        !           864:     return uae_mmu040_get_iword (pc);
        !           865: }
        !           866: STATIC_INLINE uae_u32 get_iword_mmu040 (int o)
        !           867: {
        !           868:     uae_u32 pc = m68k_getpci () + o;
        !           869:     return uae_mmu040_get_iword (pc);
        !           870: }
        !           871: STATIC_INLINE uae_u32 get_ilong_mmu040 (int o)
        !           872: {
        !           873:     uae_u32 pc = m68k_getpci () + o;
        !           874:     return uae_mmu040_get_ilong (pc);
        !           875: }
        !           876: STATIC_INLINE uae_u32 next_iword_mmu040 (void)
        !           877: {
        !           878:     uae_u32 pc = m68k_getpci ();
        !           879:     m68k_incpci (2);
        !           880:     return uae_mmu040_get_iword (pc);
        !           881: }
        !           882: STATIC_INLINE uae_u32 next_ilong_mmu040 (void)
        !           883: {
        !           884:     uae_u32 pc = m68k_getpci ();
        !           885:     m68k_incpci (4);
        !           886:     return uae_mmu040_get_ilong (pc);
        !           887: }
        !           888: 
        !           889: STATIC_INLINE uae_u32 get_ibyte_mmu060 (int o)
1.1.1.2   root      890: {
1.1.1.4 ! root      891:     uae_u32 pc = m68k_getpci () + o;
        !           892:     return uae_mmu060_get_iword (pc);
1.1.1.2   root      893: }
1.1.1.4 ! root      894: STATIC_INLINE uae_u32 get_iword_mmu060 (int o)
1.1.1.2   root      895: {
1.1.1.4 ! root      896:     uae_u32 pc = m68k_getpci () + o;
        !           897:     return uae_mmu060_get_iword (pc);
1.1.1.2   root      898: }
1.1.1.4 ! root      899: STATIC_INLINE uae_u32 get_ilong_mmu060 (int o)
1.1.1.2   root      900: {
1.1.1.4 ! root      901:     uae_u32 pc = m68k_getpci () + o;
        !           902:     return uae_mmu060_get_ilong (pc);
1.1.1.2   root      903: }
1.1.1.4 ! root      904: STATIC_INLINE uae_u32 next_iword_mmu060 (void)
1.1.1.2   root      905: {
1.1.1.4 ! root      906:     uae_u32 pc = m68k_getpci ();
1.1.1.2   root      907:     m68k_incpci (2);
1.1.1.4 ! root      908:     return uae_mmu060_get_iword (pc);
1.1.1.2   root      909: }
1.1.1.4 ! root      910: STATIC_INLINE uae_u32 next_ilong_mmu060 (void)
1.1.1.2   root      911: {
1.1.1.4 ! root      912:     uae_u32 pc = m68k_getpci ();
1.1.1.2   root      913:     m68k_incpci (4);
1.1.1.4 ! root      914:     return uae_mmu060_get_ilong (pc);
1.1.1.2   root      915: }
                    916: 
1.1.1.4 ! root      917: extern void flush_mmu040 (uaecptr, int);
        !           918: extern void m68k_do_rts_mmu040 (void);
        !           919: extern void m68k_do_rte_mmu040 (uaecptr a7);
        !           920: extern void m68k_do_bsr_mmu040 (uaecptr oldpc, uae_s32 offset);
        !           921: 
        !           922: extern void flush_mmu060 (uaecptr, int);
        !           923: extern void m68k_do_rts_mmu060 (void);
        !           924: extern void m68k_do_rte_mmu060 (uaecptr a7);
        !           925: extern void m68k_do_bsr_mmu060 (uaecptr oldpc, uae_s32 offset);
1.1.1.2   root      926: 
                    927: #endif /* CPUMMU_H */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.