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

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

unix.superglobalmegacorp.com

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