|
|
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: if (regs.ce020memcycles > 0) ! 20: do_cycles_ce (regs.ce020memcycles); ! 21: regs.ce020memcycles = 0; ! 22: } ! 23: ! 24: STATIC_INLINE uae_u32 mem_access_delay_long_read_ce020 (uaecptr addr) ! 25: { ! 26: checkcycles_ce020 (); ! 27: switch (ce_banktype[addr >> 16]) ! 28: { ! 29: case CE_MEMBANK_CHIP: ! 30: if ((addr & 3) != 0) { ! 31: uae_u32 v; ! 32: v = wait_cpu_cycle_read_ce020 (addr + 0, 1) << 16; ! 33: v |= wait_cpu_cycle_read_ce020 (addr + 2, 1) << 0; ! 34: return v; ! 35: } else { ! 36: return wait_cpu_cycle_read_ce020 (addr, -1); ! 37: } ! 38: case CE_MEMBANK_FAST: ! 39: if ((addr & 3) != 0) ! 40: do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE); ! 41: else ! 42: do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE); ! 43: break; ! 44: case CE_MEMBANK_FAST16BIT: ! 45: do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE); ! 46: break; ! 47: } ! 48: return get_long (addr); ! 49: } ! 50: ! 51: STATIC_INLINE uae_u32 mem_access_delay_longi_read_ce020 (uaecptr addr) ! 52: { ! 53: checkcycles_ce020 (); ! 54: switch (ce_banktype[addr >> 16]) ! 55: { ! 56: case CE_MEMBANK_CHIP: ! 57: if ((addr & 3) != 0) { ! 58: uae_u32 v; ! 59: v = wait_cpu_cycle_read_ce020 (addr + 0, 1) << 16; ! 60: v |= wait_cpu_cycle_read_ce020 (addr + 2, 1) << 0; ! 61: return v; ! 62: } else { ! 63: return wait_cpu_cycle_read_ce020 (addr, -1); ! 64: } ! 65: case CE_MEMBANK_FAST: ! 66: if ((addr & 3) != 0) ! 67: do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE); ! 68: else ! 69: do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE); ! 70: break; ! 71: case CE_MEMBANK_FAST16BIT: ! 72: do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE); ! 73: break; ! 74: } ! 75: return get_longi (addr); ! 76: } ! 77: ! 78: STATIC_INLINE uae_u32 mem_access_delay_word_read_ce020 (uaecptr addr) ! 79: { ! 80: checkcycles_ce020 (); ! 81: switch (ce_banktype[addr >> 16]) ! 82: { ! 83: case CE_MEMBANK_CHIP: ! 84: if ((addr & 3) == 3) { ! 85: uae_u16 v; ! 86: v = wait_cpu_cycle_read_ce020 (addr + 0, 0) << 8; ! 87: v |= wait_cpu_cycle_read_ce020 (addr + 1, 0) << 0; ! 88: return v; ! 89: } else { ! 90: return wait_cpu_cycle_read_ce020 (addr, 1); ! 91: } ! 92: case CE_MEMBANK_FAST: ! 93: case CE_MEMBANK_FAST16BIT: ! 94: if ((addr & 3) == 3) ! 95: do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE); ! 96: else ! 97: do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE); ! 98: break; ! 99: } ! 100: return get_word (addr); ! 101: } ! 102: ! 103: STATIC_INLINE uae_u32 mem_access_delay_wordi_read_ce020 (uaecptr addr) ! 104: { ! 105: checkcycles_ce020 (); ! 106: switch (ce_banktype[addr >> 16]) ! 107: { ! 108: case CE_MEMBANK_CHIP: ! 109: return wait_cpu_cycle_read_ce020 (addr, 1); ! 110: case CE_MEMBANK_FAST: ! 111: case CE_MEMBANK_FAST16BIT: ! 112: do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE); ! 113: break; ! 114: } ! 115: return get_wordi (addr); ! 116: } ! 117: ! 118: STATIC_INLINE uae_u32 mem_access_delay_byte_read_ce020 (uaecptr addr) ! 119: { ! 120: checkcycles_ce020 (); ! 121: switch (ce_banktype[addr >> 16]) ! 122: { ! 123: case CE_MEMBANK_CHIP: ! 124: return wait_cpu_cycle_read_ce020 (addr, 0); ! 125: case CE_MEMBANK_FAST: ! 126: case CE_MEMBANK_FAST16BIT: ! 127: do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE); ! 128: break; ! 129: ! 130: } ! 131: return get_byte (addr); ! 132: } ! 133: ! 134: STATIC_INLINE void mem_access_delay_byte_write_ce020 (uaecptr addr, uae_u32 v) ! 135: { ! 136: checkcycles_ce020 (); ! 137: switch (ce_banktype[addr >> 16]) ! 138: { ! 139: case CE_MEMBANK_CHIP: ! 140: wait_cpu_cycle_write_ce020 (addr, 0, v); ! 141: return; ! 142: case CE_MEMBANK_FAST: ! 143: case CE_MEMBANK_FAST16BIT: ! 144: do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE); ! 145: break; ! 146: } ! 147: put_byte (addr, v); ! 148: } ! 149: ! 150: STATIC_INLINE void mem_access_delay_word_write_ce020 (uaecptr addr, uae_u32 v) ! 151: { ! 152: checkcycles_ce020 (); ! 153: switch (ce_banktype[addr >> 16]) ! 154: { ! 155: case CE_MEMBANK_CHIP: ! 156: if ((addr & 3) == 3) { ! 157: wait_cpu_cycle_write_ce020 (addr + 0, 0, (v >> 8) & 0xff); ! 158: wait_cpu_cycle_write_ce020 (addr + 1, 0, (v >> 0) & 0xff); ! 159: } else { ! 160: wait_cpu_cycle_write_ce020 (addr + 0, 1, v); ! 161: } ! 162: return; ! 163: break; ! 164: case CE_MEMBANK_FAST: ! 165: case CE_MEMBANK_FAST16BIT: ! 166: if ((addr & 3) == 3) ! 167: do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE); ! 168: else ! 169: do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE); ! 170: break; ! 171: } ! 172: put_word (addr, v); ! 173: } ! 174: ! 175: STATIC_INLINE void mem_access_delay_long_write_ce020 (uaecptr addr, uae_u32 v) ! 176: { ! 177: checkcycles_ce020 (); ! 178: switch (ce_banktype[addr >> 16]) ! 179: { ! 180: case CE_MEMBANK_CHIP: ! 181: if ((addr & 3) == 3) { ! 182: wait_cpu_cycle_write_ce020 (addr + 0, 1, (v >> 16) & 0xffff); ! 183: wait_cpu_cycle_write_ce020 (addr + 2, 1, (v >> 0) & 0xffff); ! 184: } else { ! 185: wait_cpu_cycle_write_ce020 (addr + 0, -1, v); ! 186: } ! 187: return; ! 188: break; ! 189: case CE_MEMBANK_FAST: ! 190: if ((addr & 3) != 0) ! 191: do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE); ! 192: else ! 193: do_cycles_ce020_mem (1 * CPU020_MEM_CYCLE); ! 194: break; ! 195: case CE_MEMBANK_FAST16BIT: ! 196: do_cycles_ce020_mem (2 * CPU020_MEM_CYCLE); ! 197: break; ! 198: } ! 199: put_long (addr, v); ! 200: } ! 201: ! 202: STATIC_INLINE uae_u32 get_long_ce020 (uaecptr addr) ! 203: { ! 204: return mem_access_delay_long_read_ce020 (addr); ! 205: } ! 206: STATIC_INLINE uae_u32 get_word_ce020 (uaecptr addr) ! 207: { ! 208: return mem_access_delay_word_read_ce020 (addr); ! 209: } ! 210: STATIC_INLINE uae_u32 get_byte_ce020 (uaecptr addr) ! 211: { ! 212: return mem_access_delay_byte_read_ce020 (addr); ! 213: } ! 214: ! 215: STATIC_INLINE void put_long_ce020 (uaecptr addr, uae_u32 v) ! 216: { ! 217: mem_access_delay_long_write_ce020 (addr, v); ! 218: } ! 219: STATIC_INLINE void put_word_ce020 (uaecptr addr, uae_u32 v) ! 220: { ! 221: mem_access_delay_word_write_ce020 (addr, v); ! 222: } ! 223: STATIC_INLINE void put_byte_ce020 (uaecptr addr, uae_u32 v) ! 224: { ! 225: mem_access_delay_byte_write_ce020 (addr, v); ! 226: } ! 227: ! 228: extern uae_u32 get_word_ce020_prefetch (int); ! 229: ! 230: STATIC_INLINE uae_u32 get_long_ce020_prefetch (int o) ! 231: { ! 232: uae_u32 v; ! 233: v = get_word_ce020_prefetch (o) << 16; ! 234: v |= get_word_ce020_prefetch (o + 2); ! 235: return v; ! 236: } ! 237: ! 238: STATIC_INLINE uae_u32 next_iword_020ce (void) ! 239: { ! 240: uae_u32 r = get_word_ce020_prefetch (0); ! 241: m68k_incpc (2); ! 242: return r; ! 243: } ! 244: STATIC_INLINE uae_u32 next_ilong_020ce (void) ! 245: { ! 246: uae_u32 r = get_long_ce020_prefetch (0); ! 247: m68k_incpc (4); ! 248: return r; ! 249: } ! 250: ! 251: STATIC_INLINE void m68k_do_bsr_ce020 (uaecptr oldpc, uae_s32 offset) ! 252: { ! 253: m68k_areg (regs, 7) -= 4; ! 254: put_long_ce020 (m68k_areg (regs, 7), oldpc); ! 255: m68k_incpc (offset); ! 256: } ! 257: STATIC_INLINE void m68k_do_rts_ce020 (void) ! 258: { ! 259: m68k_setpc (get_long_ce020 (m68k_areg (regs, 7))); ! 260: m68k_areg (regs, 7) += 4; ! 261: } ! 262: #endif ! 263: ! 264: #ifdef CPUEMU_21 ! 265: ! 266: extern uae_u32 get_word_ce030_prefetch (int); ! 267: extern void write_dcache030 (uaecptr, uae_u32, int); ! 268: extern uae_u32 read_dcache030 (uaecptr, int); ! 269: ! 270: STATIC_INLINE void put_long_ce030 (uaecptr addr, uae_u32 v) ! 271: { ! 272: write_dcache030 (addr, v, 2); ! 273: mem_access_delay_long_write_ce020 (addr, v); ! 274: } ! 275: STATIC_INLINE void put_word_ce030 (uaecptr addr, uae_u32 v) ! 276: { ! 277: write_dcache030 (addr, v, 1); ! 278: mem_access_delay_word_write_ce020 (addr, v); ! 279: } ! 280: STATIC_INLINE void put_byte_ce030 (uaecptr addr, uae_u32 v) ! 281: { ! 282: write_dcache030 (addr, v, 0); ! 283: mem_access_delay_byte_write_ce020 (addr, v); ! 284: } ! 285: STATIC_INLINE uae_u32 get_long_ce030 (uaecptr addr) ! 286: { ! 287: return read_dcache030 (addr, 2); ! 288: } ! 289: STATIC_INLINE uae_u32 get_word_ce030 (uaecptr addr) ! 290: { ! 291: return read_dcache030 (addr, 1); ! 292: } ! 293: STATIC_INLINE uae_u32 get_byte_ce030 (uaecptr addr) ! 294: { ! 295: return read_dcache030 (addr, 0); ! 296: } ! 297: ! 298: STATIC_INLINE uae_u32 get_long_ce030_prefetch (int o) ! 299: { ! 300: uae_u32 v; ! 301: v = get_word_ce030_prefetch (o) << 16; ! 302: v |= get_word_ce030_prefetch (o + 2); ! 303: return v; ! 304: } ! 305: ! 306: STATIC_INLINE uae_u32 next_iword_030ce (void) ! 307: { ! 308: uae_u32 r = get_word_ce030_prefetch (0); ! 309: m68k_incpc (2); ! 310: return r; ! 311: } ! 312: STATIC_INLINE uae_u32 next_ilong_030ce (void) ! 313: { ! 314: uae_u32 r = get_long_ce030_prefetch (0); ! 315: m68k_incpc (4); ! 316: return r; ! 317: } ! 318: ! 319: STATIC_INLINE void m68k_do_bsr_ce030 (uaecptr oldpc, uae_s32 offset) ! 320: { ! 321: m68k_areg (regs, 7) -= 4; ! 322: put_long_ce030 (m68k_areg (regs, 7), oldpc); ! 323: m68k_incpc (offset); ! 324: } ! 325: STATIC_INLINE void m68k_do_rts_ce030 (void) ! 326: { ! 327: m68k_setpc (get_long_ce030 (m68k_areg (regs, 7))); ! 328: m68k_areg (regs, 7) += 4; ! 329: } ! 330: #endif ! 331: ! 332: #ifdef CPUEMU_12 ! 333: ! 334: STATIC_INLINE void ipl_fetch (void) ! 335: { ! 336: regs.ipl = regs.ipl_pin; ! 337: } ! 338: ! 339: STATIC_INLINE uae_u32 mem_access_delay_word_read (uaecptr addr) ! 340: { ! 341: switch (ce_banktype[addr >> 16]) ! 342: { ! 343: case CE_MEMBANK_CHIP: ! 344: return wait_cpu_cycle_read (addr, 1); ! 345: case CE_MEMBANK_FAST: ! 346: case CE_MEMBANK_FAST16BIT: ! 347: do_cycles_ce000 (4); ! 348: break; ! 349: } ! 350: return get_word (addr); ! 351: } ! 352: STATIC_INLINE uae_u32 mem_access_delay_wordi_read (uaecptr addr) ! 353: { ! 354: switch (ce_banktype[addr >> 16]) ! 355: { ! 356: case CE_MEMBANK_CHIP: ! 357: return wait_cpu_cycle_read (addr, 1); ! 358: case CE_MEMBANK_FAST: ! 359: case CE_MEMBANK_FAST16BIT: ! 360: do_cycles_ce000 (4); ! 361: break; ! 362: } ! 363: return get_wordi (addr); ! 364: } ! 365: ! 366: STATIC_INLINE uae_u32 mem_access_delay_byte_read (uaecptr addr) ! 367: { ! 368: switch (ce_banktype[addr >> 16]) ! 369: { ! 370: case CE_MEMBANK_CHIP: ! 371: return wait_cpu_cycle_read (addr, 0); ! 372: case CE_MEMBANK_FAST: ! 373: case CE_MEMBANK_FAST16BIT: ! 374: do_cycles_ce000 (4); ! 375: break; ! 376: ! 377: } ! 378: return get_byte (addr); ! 379: } ! 380: STATIC_INLINE void mem_access_delay_byte_write (uaecptr addr, uae_u32 v) ! 381: { ! 382: switch (ce_banktype[addr >> 16]) ! 383: { ! 384: case CE_MEMBANK_CHIP: ! 385: wait_cpu_cycle_write (addr, 0, v); ! 386: return; ! 387: case CE_MEMBANK_FAST: ! 388: case CE_MEMBANK_FAST16BIT: ! 389: do_cycles_ce000 (4); ! 390: break; ! 391: } ! 392: put_byte (addr, v); ! 393: } ! 394: STATIC_INLINE void mem_access_delay_word_write (uaecptr addr, uae_u32 v) ! 395: { ! 396: switch (ce_banktype[addr >> 16]) ! 397: { ! 398: case CE_MEMBANK_CHIP: ! 399: wait_cpu_cycle_write (addr, 1, v); ! 400: return; ! 401: break; ! 402: case CE_MEMBANK_FAST: ! 403: case CE_MEMBANK_FAST16BIT: ! 404: do_cycles_ce000 (4); ! 405: break; ! 406: } ! 407: put_word (addr, v); ! 408: } ! 409: ! 410: STATIC_INLINE uae_u32 get_long_ce (uaecptr addr) ! 411: { ! 412: uae_u32 v = mem_access_delay_word_read (addr) << 16; ! 413: v |= mem_access_delay_word_read (addr + 2); ! 414: return v; ! 415: } ! 416: STATIC_INLINE uae_u32 get_word_ce (uaecptr addr) ! 417: { ! 418: return mem_access_delay_word_read (addr); ! 419: } ! 420: STATIC_INLINE uae_u32 get_wordi_ce (uaecptr addr) ! 421: { ! 422: return mem_access_delay_wordi_read (addr); ! 423: } ! 424: STATIC_INLINE uae_u32 get_byte_ce (uaecptr addr) ! 425: { ! 426: return mem_access_delay_byte_read (addr); ! 427: } ! 428: STATIC_INLINE uae_u32 get_word_ce_prefetch (int o) ! 429: { ! 430: uae_u32 v = regs.irc; ! 431: regs.irc = get_wordi_ce (m68k_getpc () + o); ! 432: return v; ! 433: } ! 434: ! 435: STATIC_INLINE void put_long_ce (uaecptr addr, uae_u32 v) ! 436: { ! 437: mem_access_delay_word_write (addr, v >> 16); ! 438: mem_access_delay_word_write (addr + 2, v); ! 439: } ! 440: STATIC_INLINE void put_word_ce (uaecptr addr, uae_u32 v) ! 441: { ! 442: mem_access_delay_word_write (addr, v); ! 443: } ! 444: STATIC_INLINE void put_byte_ce (uaecptr addr, uae_u32 v) ! 445: { ! 446: mem_access_delay_byte_write (addr, v); ! 447: } ! 448: ! 449: STATIC_INLINE void m68k_do_rts_ce (void) ! 450: { ! 451: uaecptr pc; ! 452: pc = get_word_ce (m68k_areg (regs, 7)) << 16; ! 453: pc |= get_word_ce (m68k_areg (regs, 7) + 2); ! 454: m68k_areg (regs, 7) += 4; ! 455: if (pc & 1) ! 456: exception3 (0x4e75, m68k_getpc (), pc); ! 457: else ! 458: m68k_setpc (pc); ! 459: } ! 460: ! 461: STATIC_INLINE void m68k_do_bsr_ce (uaecptr oldpc, uae_s32 offset) ! 462: { ! 463: m68k_areg (regs, 7) -= 4; ! 464: put_word_ce (m68k_areg (regs, 7), oldpc >> 16); ! 465: put_word_ce (m68k_areg (regs, 7) + 2, oldpc); ! 466: m68k_incpc (offset); ! 467: } ! 468: ! 469: STATIC_INLINE void m68k_do_jsr_ce (uaecptr oldpc, uaecptr dest) ! 470: { ! 471: m68k_areg (regs, 7) -= 4; ! 472: put_word_ce (m68k_areg (regs, 7), oldpc >> 16); ! 473: put_word_ce (m68k_areg (regs, 7) + 2, oldpc); ! 474: m68k_setpc (dest); ! 475: } ! 476: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.