|
|
1.1 ! root 1: ! 2: STATIC_INLINE uae_u32 get_word_prefetch (int o) ! 3: { ! 4: uae_u32 v = regs.irc; ! 5: regs.irc = get_wordi (m68k_getpc () + o); ! 6: return v; ! 7: } ! 8: STATIC_INLINE uae_u32 get_long_prefetch (int o) ! 9: { ! 10: uae_u32 v = get_word_prefetch (o) << 16; ! 11: v |= get_word_prefetch (o + 2); ! 12: return v; ! 13: } ! 14: ! 15: #ifdef CPUEMU_20 ! 16: ! 17: STATIC_INLINE void checkcycles_ce020 (void) ! 18: { ! 19: regs.ce020memcycles = 0; ! 20: } ! 21: ! 22: STATIC_INLINE uae_u32 mem_access_delay_long_read_ce020 (uaecptr addr) ! 23: { ! 24: checkcycles_ce020 (); ! 25: return get_long (addr); ! 26: } ! 27: ! 28: STATIC_INLINE uae_u32 mem_access_delay_longi_read_ce020 (uaecptr addr) ! 29: { ! 30: checkcycles_ce020 (); ! 31: return get_longi (addr); ! 32: } ! 33: ! 34: STATIC_INLINE uae_u32 mem_access_delay_word_read_ce020 (uaecptr addr) ! 35: { ! 36: checkcycles_ce020 (); ! 37: return get_word (addr); ! 38: } ! 39: ! 40: STATIC_INLINE uae_u32 mem_access_delay_wordi_read_ce020 (uaecptr addr) ! 41: { ! 42: checkcycles_ce020 (); ! 43: return get_wordi (addr); ! 44: } ! 45: ! 46: STATIC_INLINE uae_u32 mem_access_delay_byte_read_ce020 (uaecptr addr) ! 47: { ! 48: checkcycles_ce020 (); ! 49: return get_byte (addr); ! 50: } ! 51: ! 52: STATIC_INLINE void mem_access_delay_byte_write_ce020 (uaecptr addr, uae_u32 v) ! 53: { ! 54: checkcycles_ce020 (); ! 55: put_byte (addr, v); ! 56: } ! 57: ! 58: STATIC_INLINE void mem_access_delay_word_write_ce020 (uaecptr addr, uae_u32 v) ! 59: { ! 60: checkcycles_ce020 (); ! 61: put_word (addr, v); ! 62: } ! 63: ! 64: STATIC_INLINE void mem_access_delay_long_write_ce020 (uaecptr addr, uae_u32 v) ! 65: { ! 66: checkcycles_ce020 (); ! 67: put_long (addr, v); ! 68: } ! 69: ! 70: STATIC_INLINE uae_u32 get_long_ce020 (uaecptr addr) ! 71: { ! 72: return mem_access_delay_long_read_ce020 (addr); ! 73: } ! 74: STATIC_INLINE uae_u32 get_word_ce020 (uaecptr addr) ! 75: { ! 76: return mem_access_delay_word_read_ce020 (addr); ! 77: } ! 78: STATIC_INLINE uae_u32 get_byte_ce020 (uaecptr addr) ! 79: { ! 80: return mem_access_delay_byte_read_ce020 (addr); ! 81: } ! 82: ! 83: STATIC_INLINE void put_long_ce020 (uaecptr addr, uae_u32 v) ! 84: { ! 85: mem_access_delay_long_write_ce020 (addr, v); ! 86: } ! 87: STATIC_INLINE void put_word_ce020 (uaecptr addr, uae_u32 v) ! 88: { ! 89: mem_access_delay_word_write_ce020 (addr, v); ! 90: } ! 91: STATIC_INLINE void put_byte_ce020 (uaecptr addr, uae_u32 v) ! 92: { ! 93: mem_access_delay_byte_write_ce020 (addr, v); ! 94: } ! 95: ! 96: uae_u32 get_word_ce020_prefetch (int); ! 97: ! 98: STATIC_INLINE uae_u32 get_long_ce020_prefetch (int o) ! 99: { ! 100: uae_u32 v; ! 101: v = get_word_ce020_prefetch (o) << 16; ! 102: v |= get_word_ce020_prefetch (o + 2); ! 103: return v; ! 104: } ! 105: ! 106: STATIC_INLINE uae_u32 next_iword_020ce (void) ! 107: { ! 108: uae_u32 r = get_word_ce020_prefetch (0); ! 109: m68k_incpc (2); ! 110: return r; ! 111: } ! 112: STATIC_INLINE uae_u32 next_ilong_020ce (void) ! 113: { ! 114: uae_u32 r = get_long_ce020_prefetch (0); ! 115: m68k_incpc (4); ! 116: return r; ! 117: } ! 118: ! 119: STATIC_INLINE void m68k_do_bsr_ce020 (uaecptr oldpc, uae_s32 offset) ! 120: { ! 121: m68k_areg (regs, 7) -= 4; ! 122: put_long_ce020 (m68k_areg (regs, 7), oldpc); ! 123: m68k_incpc (offset); ! 124: } ! 125: STATIC_INLINE void m68k_do_rts_ce020 (void) ! 126: { ! 127: m68k_setpc (get_long_ce020 (m68k_areg (regs, 7))); ! 128: m68k_areg (regs, 7) += 4; ! 129: } ! 130: #endif ! 131: ! 132: #ifdef CPUEMU_21 ! 133: ! 134: uae_u32 get_word_ce030_prefetch (int); ! 135: void write_dcache030 (uaecptr, uae_u32, int); ! 136: uae_u32 read_dcache030 (uaecptr, int); ! 137: ! 138: STATIC_INLINE void put_long_ce030 (uaecptr addr, uae_u32 v) ! 139: { ! 140: write_dcache030 (addr, v, 2); ! 141: mem_access_delay_long_write_ce020 (addr, v); ! 142: } ! 143: STATIC_INLINE void put_word_ce030 (uaecptr addr, uae_u32 v) ! 144: { ! 145: write_dcache030 (addr, v, 1); ! 146: mem_access_delay_word_write_ce020 (addr, v); ! 147: } ! 148: STATIC_INLINE void put_byte_ce030 (uaecptr addr, uae_u32 v) ! 149: { ! 150: write_dcache030 (addr, v, 0); ! 151: mem_access_delay_byte_write_ce020 (addr, v); ! 152: } ! 153: STATIC_INLINE uae_u32 get_long_ce030 (uaecptr addr) ! 154: { ! 155: return read_dcache030 (addr, 2); ! 156: } ! 157: STATIC_INLINE uae_u32 get_word_ce030 (uaecptr addr) ! 158: { ! 159: return read_dcache030 (addr, 1); ! 160: } ! 161: STATIC_INLINE uae_u32 get_byte_ce030 (uaecptr addr) ! 162: { ! 163: return read_dcache030 (addr, 0); ! 164: } ! 165: ! 166: STATIC_INLINE uae_u32 get_long_ce030_prefetch (int o) ! 167: { ! 168: uae_u32 v; ! 169: v = get_word_ce030_prefetch (o) << 16; ! 170: v |= get_word_ce030_prefetch (o + 2); ! 171: return v; ! 172: } ! 173: ! 174: STATIC_INLINE uae_u32 next_iword_030ce (void) ! 175: { ! 176: uae_u32 r = get_word_ce030_prefetch (0); ! 177: m68k_incpc (2); ! 178: return r; ! 179: } ! 180: STATIC_INLINE uae_u32 next_ilong_030ce (void) ! 181: { ! 182: uae_u32 r = get_long_ce030_prefetch (0); ! 183: m68k_incpc (4); ! 184: return r; ! 185: } ! 186: ! 187: STATIC_INLINE void m68k_do_bsr_ce030 (uaecptr oldpc, uae_s32 offset) ! 188: { ! 189: m68k_areg (regs, 7) -= 4; ! 190: put_long_ce030 (m68k_areg (regs, 7), oldpc); ! 191: m68k_incpc (offset); ! 192: } ! 193: STATIC_INLINE void m68k_do_rts_ce030 (void) ! 194: { ! 195: m68k_setpc (get_long_ce030 (m68k_areg (regs, 7))); ! 196: m68k_areg (regs, 7) += 4; ! 197: } ! 198: #endif ! 199: ! 200: #ifdef CPUEMU_12 ! 201: ! 202: STATIC_INLINE void ipl_fetch (void) ! 203: { ! 204: regs.ipl = regs.ipl_pin; ! 205: } ! 206: ! 207: STATIC_INLINE uae_u32 mem_access_delay_word_read (uaecptr addr) ! 208: { ! 209: return get_word (addr); ! 210: } ! 211: STATIC_INLINE uae_u32 mem_access_delay_wordi_read (uaecptr addr) ! 212: { ! 213: return get_wordi (addr); ! 214: } ! 215: ! 216: STATIC_INLINE uae_u32 mem_access_delay_byte_read (uaecptr addr) ! 217: { ! 218: return get_byte (addr); ! 219: } ! 220: STATIC_INLINE void mem_access_delay_byte_write (uaecptr addr, uae_u32 v) ! 221: { ! 222: put_byte (addr, v); ! 223: } ! 224: STATIC_INLINE void mem_access_delay_word_write (uaecptr addr, uae_u32 v) ! 225: { ! 226: put_word (addr, v); ! 227: } ! 228: ! 229: STATIC_INLINE uae_u32 get_long_ce (uaecptr addr) ! 230: { ! 231: uae_u32 v = mem_access_delay_word_read (addr) << 16; ! 232: v |= mem_access_delay_word_read (addr + 2); ! 233: return v; ! 234: } ! 235: STATIC_INLINE uae_u32 get_word_ce (uaecptr addr) ! 236: { ! 237: return mem_access_delay_word_read (addr); ! 238: } ! 239: STATIC_INLINE uae_u32 get_wordi_ce (uaecptr addr) ! 240: { ! 241: return mem_access_delay_wordi_read (addr); ! 242: } ! 243: STATIC_INLINE uae_u32 get_byte_ce (uaecptr addr) ! 244: { ! 245: return mem_access_delay_byte_read (addr); ! 246: } ! 247: STATIC_INLINE uae_u32 get_word_ce_prefetch (int o) ! 248: { ! 249: uae_u32 v = regs.irc; ! 250: regs.irc = get_wordi_ce (m68k_getpc () + o); ! 251: return v; ! 252: } ! 253: ! 254: STATIC_INLINE void put_long_ce (uaecptr addr, uae_u32 v) ! 255: { ! 256: mem_access_delay_word_write (addr, v >> 16); ! 257: mem_access_delay_word_write (addr + 2, v); ! 258: } ! 259: STATIC_INLINE void put_word_ce (uaecptr addr, uae_u32 v) ! 260: { ! 261: mem_access_delay_word_write (addr, v); ! 262: } ! 263: STATIC_INLINE void put_byte_ce (uaecptr addr, uae_u32 v) ! 264: { ! 265: mem_access_delay_byte_write (addr, v); ! 266: } ! 267: ! 268: STATIC_INLINE void m68k_do_rts_ce (void) ! 269: { ! 270: uaecptr pc; ! 271: pc = get_word_ce (m68k_areg (regs, 7)) << 16; ! 272: pc |= get_word_ce (m68k_areg (regs, 7) + 2); ! 273: m68k_areg (regs, 7) += 4; ! 274: if (pc & 1) ! 275: exception3 (0x4e75, m68k_getpc ()); ! 276: else ! 277: m68k_setpc (pc); ! 278: } ! 279: ! 280: STATIC_INLINE void m68k_do_bsr_ce (uaecptr oldpc, uae_s32 offset) ! 281: { ! 282: m68k_areg (regs, 7) -= 4; ! 283: put_word_ce (m68k_areg (regs, 7), oldpc >> 16); ! 284: put_word_ce (m68k_areg (regs, 7) + 2, oldpc); ! 285: m68k_incpc (offset); ! 286: } ! 287: ! 288: STATIC_INLINE void m68k_do_jsr_ce (uaecptr oldpc, uaecptr dest) ! 289: { ! 290: m68k_areg (regs, 7) -= 4; ! 291: put_word_ce (m68k_areg (regs, 7), oldpc >> 16); ! 292: put_word_ce (m68k_areg (regs, 7) + 2, oldpc); ! 293: m68k_setpc (dest); ! 294: } ! 295: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.