regs.prefetch020[i] = v >> 16;
regs.prefetch020_valid[i] = (v & 1) != 0;
}
- }
- } else {
- for (int i = 0; i < CPU_PIPELINE_MAX; i++) {
- regs.prefetch020[i] = restore_u16 ();
- regs.prefetch020_valid[i] = false;
+ } else {
+ // old
+ uae_u32 v = restore_u32();
+ regs.prefetch020[0] = v >> 16;
+ regs.prefetch020[1] = (uae_u16)v;
+ v = restore_u32();
+ regs.prefetch020[2] = v >> 16;
+ regs.prefetch020[3] = (uae_u16)v;
+ restore_u32();
+ restore_u32();
+ regs.prefetch020_valid[0] = true;
+ regs.prefetch020_valid[1] = true;
+ regs.prefetch020_valid[2] = true;
+ regs.prefetch020_valid[3] = true;
}
}
} else if (model == 68030) {
else
dstbak = dst = xmalloc (uae_u8, 10000);
- save_u32 (2 | 4 | 8);
+ save_u32 (2 | 4 | 16);
save_u16 (cputrace.opcode);
for (int i = 0; i < 16; i++)
save_u32 (cputrace.regs[i]);
save_u32 (cputrace.prefetch020addr);
save_u32 (cputrace.cacheholdingaddr020);
save_u32 (cputrace.cacheholdingdata020);
- for (int i = 0; i < CPU_PIPELINE_MAX; i++)
+ for (int i = 0; i < CPU_PIPELINE_MAX; i++) {
save_u16 (cputrace.prefetch020[i]);
- for (int i = 0; i < CPU_PIPELINE_MAX; i++)
+ }
+ for (int i = 0; i < CPU_PIPELINE_MAX; i++) {
save_u32 (cputrace.prefetch020[i]);
+ }
+ for (int i = 0; i < CPU_PIPELINE_MAX; i++) {
+ save_u8 (cputrace.prefetch030_valid[i]);
+ }
}
*len = dst - dstbak;
cputrace.prefetch020addr = restore_u32 ();
cputrace.cacheholdingaddr020 = restore_u32 ();
cputrace.cacheholdingdata020 = restore_u32 ();
- for (int i = 0; i < CPU_PIPELINE_MAX; i++)
+ for (int i = 0; i < CPU_PIPELINE_MAX; i++) {
cputrace.prefetch020[i] = restore_u16 ();
+ }
if (v & 8) {
- for (int i = 0; i < CPU_PIPELINE_MAX; i++)
- cputrace.prefetch020[i] = restore_u32 ();
+ uae_u32 v = restore_u32();
+ regs.prefetch020[0] = v >> 16;
+ regs.prefetch020[1] = (uae_u16)v;
+ v = restore_u32();
+ regs.prefetch020[2] = v >> 16;
+ regs.prefetch020[3] = (uae_u16)v;
+ restore_u32();
+ restore_u32();
+ regs.prefetch020_valid[0] = true;
+ regs.prefetch020_valid[1] = true;
+ regs.prefetch020_valid[2] = true;
+ regs.prefetch020_valid[3] = true;
+ }
+ if (v & 16) {
+ for (int i = 0; i < CPU_PIPELINE_MAX; i++) {
+ cputrace.prefetch030_valid[i] = restore_u8() != 0;
+ }
}
}
}
}
if (regs.cacr & 0x8000) {
+ uae_u8 cs = mmu_cache_state;
if (!(ce_cachable[addr >> 16] & CACHE_ENABLE_INS))
- mmu_cache_state = CACHE_DISABLE_MMU;
+ cs = CACHE_DISABLE_MMU;
index = (addr >> 4) & cacheisets04060mask;
tag = addr & cacheitag04060mask;
for (int i = 0; i < CACHELINES040; i++) {
if (c->valid[cache_lastline] && c->tag[cache_lastline] == tag) {
// cache hit
- if (!(mmu_cache_state & CACHE_ENABLE_INS) || (mmu_cache_state & CACHE_DISABLE_MMU)) {
+ if (!(cs & CACHE_ENABLE_INS) || (cs & CACHE_DISABLE_MMU)) {
c->valid[cache_lastline] = false;
goto end;
}
regs.prefetch040[2] = icache_fetch(addr2 + 8);
regs.prefetch040[3] = icache_fetch(addr2 + 12);
regs.prefetch020addr = addr2;
- if (!(mmu_cache_state & CACHE_ENABLE_INS) || (mmu_cache_state & CACHE_DISABLE_MMU))
+ if (!(cs & CACHE_ENABLE_INS) || (cs & CACHE_DISABLE_MMU))
goto end;
if (regs.cacr & 0x00004000) // 68060 NAI
goto end;
struct cache040 *c;
int line;
uae_u32 addr_o = addr;
+ uae_u8 cs = mmu_cache_state;
if (!(regs.cacr & 0x80000000))
goto nocache;
// Simple because 68040+ caches physical addresses (68030 caches logical addresses)
if (!(ce_cachable[addr >> 16] & CACHE_ENABLE_DATA))
- mmu_cache_state = CACHE_DISABLE_MMU;
+ cs = CACHE_DISABLE_MMU;
addr &= ~15;
index = (addr >> 4) & cachedsets04060mask;
// cache hit
dcachelinecnt++;
// Cache hit but MMU disabled: do not cache, push and invalidate possible existing line
- if (mmu_cache_state & CACHE_DISABLE_MMU) {
+ if (cs & CACHE_DISABLE_MMU) {
dcache040_push_line(index, line, false, true);
goto nocache;
}
}
// Cache miss
// 040+ always caches whole line
- if ((mmu_cache_state & CACHE_DISABLE_MMU) || !(mmu_cache_state & CACHE_ENABLE_DATA) || (mmu_cache_state & CACHE_DISABLE_ALLOCATE) || (regs.cacr & 0x400000000)) {
+ if ((cs & CACHE_DISABLE_MMU) || !(cs & CACHE_ENABLE_DATA) || (cs & CACHE_DISABLE_ALLOCATE) || (regs.cacr & 0x400000000)) {
nocache:
return fetch(addr_o);
}
struct cache040 *c;
int line;
uae_u32 addr_o = addr;
+ uae_u8 cs = mmu_cache_state;
val &= mask[size];
goto nocache;
if (!(ce_cachable[addr >> 16] & CACHE_ENABLE_DATA))
- mmu_cache_state = CACHE_DISABLE_MMU;
+ cs = CACHE_DISABLE_MMU;
addr &= ~15;
index = (addr >> 4) & cachedsets04060mask;
// cache hit
dcachelinecnt++;
// Cache hit but MMU disabled: do not cache, push and invalidate possible existing line
- if (mmu_cache_state & CACHE_DISABLE_MMU) {
+ if (cs & CACHE_DISABLE_MMU) {
dcache040_push_line(index, line, false, true);
goto nocache;
}
dcache040_update(addr_o, c, line, val, size);
// If not copyback mode: push modifications immediately (write-through)
- if (!(mmu_cache_state & CACHE_ENABLE_COPYBACK) || DISABLE_68040_COPYBACK) {
+ if (!(cs & CACHE_ENABLE_COPYBACK) || DISABLE_68040_COPYBACK) {
dcache040_push_line(index, line, true, false);
}
return;
// Cache miss
// 040+ always caches whole line
// Writes misses in write-through mode don't allocate new cache lines
- if (!(mmu_cache_state & CACHE_ENABLE_DATA) || (mmu_cache_state & CACHE_DISABLE_MMU) || (mmu_cache_state & CACHE_DISABLE_ALLOCATE) || !(mmu_cache_state & CACHE_ENABLE_COPYBACK) || (regs.cacr & 0x400000000)) {
+ if (!(cs & CACHE_ENABLE_DATA) || (cs & CACHE_DISABLE_MMU) || (cs & CACHE_DISABLE_ALLOCATE) || !(cs & CACHE_ENABLE_COPYBACK) || (regs.cacr & 0x400000000)) {
nocache:
store(addr_o, val);
return;