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

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