Annotation of previous_trunk/src/cpu/cpummu.h, revision 1.1.1.1

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 */

unix.superglobalmegacorp.com

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