make it work
This commit is contained in:
parent
53cc0378b1
commit
cacaf0ec7c
65
src/CP15.cpp
65
src/CP15.cpp
|
@ -379,7 +379,6 @@ u32 ARMv5::ICacheLookup(const u32 addr)
|
||||||
{
|
{
|
||||||
if ((ICacheTags[id+set] & ~(CACHE_FLAG_DIRTY_MASK | CACHE_FLAG_SET_MASK)) == (tag | CACHE_FLAG_VALID))
|
if ((ICacheTags[id+set] & ~(CACHE_FLAG_DIRTY_MASK | CACHE_FLAG_SET_MASK)) == (tag | CACHE_FLAG_VALID))
|
||||||
{
|
{
|
||||||
CodeCycles = 1;
|
|
||||||
u32 *cacheLine = (u32 *)&ICache[(id+set) << ICACHE_LINELENGTH_LOG2];
|
u32 *cacheLine = (u32 *)&ICache[(id+set) << ICACHE_LINELENGTH_LOG2];
|
||||||
if (CP15BISTTestStateRegister & CP15_BIST_TR_DISABLE_ICACHE_STREAMING) [[unlikely]]
|
if (CP15BISTTestStateRegister & CP15_BIST_TR_DISABLE_ICACHE_STREAMING) [[unlikely]]
|
||||||
{
|
{
|
||||||
|
@ -395,6 +394,9 @@ u32 ARMv5::ICacheLookup(const u32 addr)
|
||||||
return NDS.ARM9Read32(addr & ~3);
|
return NDS.ARM9Read32(addr & ~3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
NDS.ARM9Timestamp += 1;
|
||||||
|
if (NDS.ARM9Timestamp < TimestampActual) NDS.ARM9Timestamp = TimestampActual;
|
||||||
|
DataRegion = Mem9_Null;
|
||||||
return cacheLine[(addr & (ICACHE_LINELENGTH -1)) >> 2];
|
return cacheLine[(addr & (ICACHE_LINELENGTH -1)) >> 2];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -460,7 +462,20 @@ u32 ARMv5::ICacheLookup(const u32 addr)
|
||||||
// ouch :/
|
// ouch :/
|
||||||
//printf("cache miss %08X: %d/%d\n", addr, NDS::ARM9MemTimings[addr >> 14][2], NDS::ARM9MemTimings[addr >> 14][3]);
|
//printf("cache miss %08X: %d/%d\n", addr, NDS::ARM9MemTimings[addr >> 14][2], NDS::ARM9MemTimings[addr >> 14][3]);
|
||||||
// first N32 remaining S32
|
// first N32 remaining S32
|
||||||
CodeCycles = (NDS.ARM9MemTimings[tag >> 14][2] + (NDS.ARM9MemTimings[tag >> 14][3] * ((DCACHE_LINELENGTH / 4) - 1))) << NDS.ARM9ClockShift;
|
|
||||||
|
NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
|
||||||
|
|
||||||
|
if ((addr >> 24) == 0x02)
|
||||||
|
{
|
||||||
|
if (NDS.ARM9Timestamp < MainRAMTimestamp) NDS.ARM9Timestamp = MainRAMTimestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
|
||||||
|
}
|
||||||
|
else if (NDS.ARM9Regions[addr>>14] == DataRegion && Store) NDS.ARM9Timestamp += (1<<NDS.ARM9ClockShift);
|
||||||
|
|
||||||
|
NDS.ARM9Timestamp += CodeCycles;
|
||||||
|
if (NDS.ARM9Timestamp < TimestampActual) NDS.ARM9Timestamp = TimestampActual;
|
||||||
|
|
||||||
|
CodeCycles = ((NDS.ARM9MemTimings[tag >> 14][2] + (NDS.ARM9MemTimings[tag >> 14][3] * ((DCACHE_LINELENGTH / 4) - 1)) - 1) << NDS.ARM9ClockShift) + 1;
|
||||||
|
DataRegion = Mem9_Null;
|
||||||
return ptr[(addr & (ICACHE_LINELENGTH-1)) >> 2];
|
return ptr[(addr & (ICACHE_LINELENGTH-1)) >> 2];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -513,7 +528,6 @@ u32 ARMv5::DCacheLookup(const u32 addr)
|
||||||
{
|
{
|
||||||
if ((DCacheTags[id+set] & ~(CACHE_FLAG_DIRTY_MASK | CACHE_FLAG_SET_MASK)) == (tag | CACHE_FLAG_VALID))
|
if ((DCacheTags[id+set] & ~(CACHE_FLAG_DIRTY_MASK | CACHE_FLAG_SET_MASK)) == (tag | CACHE_FLAG_VALID))
|
||||||
{
|
{
|
||||||
DataCycles = 1;
|
|
||||||
u32 *cacheLine = (u32 *)&DCache[(id+set) << DCACHE_LINELENGTH_LOG2];
|
u32 *cacheLine = (u32 *)&DCache[(id+set) << DCACHE_LINELENGTH_LOG2];
|
||||||
if (CP15BISTTestStateRegister & CP15_BIST_TR_DISABLE_DCACHE_STREAMING) [[unlikely]]
|
if (CP15BISTTestStateRegister & CP15_BIST_TR_DISABLE_DCACHE_STREAMING) [[unlikely]]
|
||||||
{
|
{
|
||||||
|
@ -533,6 +547,8 @@ u32 ARMv5::DCacheLookup(const u32 addr)
|
||||||
return BusRead32(addr & ~3);
|
return BusRead32(addr & ~3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
DataCycles += 1;
|
||||||
|
DataRegion = Mem9_DCache;
|
||||||
//Log(LogLevel::Debug, "DCache hit at %08lx returned %08x from set %i, line %i\n", addr, cacheLine[(addr & (ICACHE_LINELENGTH -1)) >> 2], set, id>>2);
|
//Log(LogLevel::Debug, "DCache hit at %08lx returned %08x from set %i, line %i\n", addr, cacheLine[(addr & (ICACHE_LINELENGTH -1)) >> 2], set, id>>2);
|
||||||
return cacheLine[(addr & (ICACHE_LINELENGTH -1)) >> 2];
|
return cacheLine[(addr & (ICACHE_LINELENGTH -1)) >> 2];
|
||||||
}
|
}
|
||||||
|
@ -615,7 +631,20 @@ u32 ARMv5::DCacheLookup(const u32 addr)
|
||||||
// ouch :/
|
// ouch :/
|
||||||
//printf("cache miss %08X: %d/%d\n", addr, NDS::ARM9MemTimings[addr >> 14][2], NDS::ARM9MemTimings[addr >> 14][3]);
|
//printf("cache miss %08X: %d/%d\n", addr, NDS::ARM9MemTimings[addr >> 14][2], NDS::ARM9MemTimings[addr >> 14][3]);
|
||||||
// first N32 remaining S32
|
// first N32 remaining S32
|
||||||
DataCycles += (NDS.ARM9MemTimings[tag >> 14][2] + (NDS.ARM9MemTimings[tag >> 14][3] * ((DCACHE_LINELENGTH / 4) - 1))) << NDS.ARM9ClockShift;
|
NDS.ARM9Timestamp = NDS.ARM9Timestamp + ((1<<NDS.ARM9ClockShift)-1) & ~((1<<NDS.ARM9ClockShift)-1);
|
||||||
|
|
||||||
|
DataCycles = MemTimings[addr >> 12][2];
|
||||||
|
|
||||||
|
if ((addr >> 24) == 0x02)
|
||||||
|
{
|
||||||
|
if (NDS.ARM9Timestamp < MainRAMTimestamp) NDS.ARM9Timestamp = MainRAMTimestamp;
|
||||||
|
MainRAMTimestamp = NDS.ARM9Timestamp + DataCycles;
|
||||||
|
DataRegion = Mem9_MainRAM;
|
||||||
|
}
|
||||||
|
else DataRegion = NDS.ARM9Regions[addr>>14];
|
||||||
|
|
||||||
|
NDS.ARM9Timestamp += ((NDS.ARM9MemTimings[tag >> 14][2] + (NDS.ARM9MemTimings[tag >> 14][3] * ((DCACHE_LINELENGTH / 4) - 2)) - 1) << NDS.ARM9ClockShift) + 1;
|
||||||
|
DataCycles = NDS.ARM9MemTimings[tag>>14][3] << NDS.ARM9ClockShift;
|
||||||
return ptr[(addr & (DCACHE_LINELENGTH-1)) >> 2];
|
return ptr[(addr & (DCACHE_LINELENGTH-1)) >> 2];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -632,7 +661,8 @@ bool ARMv5::DCacheWrite32(const u32 addr, const u32 val)
|
||||||
{
|
{
|
||||||
u32 *cacheLine = (u32 *)&DCache[(id+set) << DCACHE_LINELENGTH_LOG2];
|
u32 *cacheLine = (u32 *)&DCache[(id+set) << DCACHE_LINELENGTH_LOG2];
|
||||||
cacheLine[(addr & (DCACHE_LINELENGTH-1)) >> 2] = val;
|
cacheLine[(addr & (DCACHE_LINELENGTH-1)) >> 2] = val;
|
||||||
DataCycles = 1;
|
DataCycles += 1;
|
||||||
|
DataRegion = Mem9_DCache;
|
||||||
#if !DISABLE_CACHEWRITEBACK
|
#if !DISABLE_CACHEWRITEBACK
|
||||||
if (PU_Map[addr >> CP15_MAP_ENTRYSIZE_LOG2] & CP15_MAP_DCACHEWRITEBACK)
|
if (PU_Map[addr >> CP15_MAP_ENTRYSIZE_LOG2] & CP15_MAP_DCACHEWRITEBACK)
|
||||||
{
|
{
|
||||||
|
@ -667,6 +697,7 @@ bool ARMv5::DCacheWrite16(const u32 addr, const u16 val)
|
||||||
u16 *cacheLine = (u16 *)&DCache[(id+set) << DCACHE_LINELENGTH_LOG2];
|
u16 *cacheLine = (u16 *)&DCache[(id+set) << DCACHE_LINELENGTH_LOG2];
|
||||||
cacheLine[(addr & (DCACHE_LINELENGTH-1)) >> 1] = val;
|
cacheLine[(addr & (DCACHE_LINELENGTH-1)) >> 1] = val;
|
||||||
DataCycles = 1;
|
DataCycles = 1;
|
||||||
|
DataRegion = Mem9_DCache;
|
||||||
#if !DISABLE_CACHEWRITEBACK
|
#if !DISABLE_CACHEWRITEBACK
|
||||||
if (PU_Map[addr >> CP15_MAP_ENTRYSIZE_LOG2] & CP15_MAP_DCACHEWRITEBACK)
|
if (PU_Map[addr >> CP15_MAP_ENTRYSIZE_LOG2] & CP15_MAP_DCACHEWRITEBACK)
|
||||||
{
|
{
|
||||||
|
@ -702,6 +733,7 @@ bool ARMv5::DCacheWrite8(const u32 addr, const u8 val)
|
||||||
u8 *cacheLine = &DCache[(id+set) << DCACHE_LINELENGTH_LOG2];
|
u8 *cacheLine = &DCache[(id+set) << DCACHE_LINELENGTH_LOG2];
|
||||||
cacheLine[addr & (DCACHE_LINELENGTH-1)] = val;
|
cacheLine[addr & (DCACHE_LINELENGTH-1)] = val;
|
||||||
DataCycles = 1;
|
DataCycles = 1;
|
||||||
|
DataRegion = Mem9_DCache;
|
||||||
#if !DISABLE_CACHEWRITEBACK
|
#if !DISABLE_CACHEWRITEBACK
|
||||||
if (PU_Map[addr >> CP15_MAP_ENTRYSIZE_LOG2] & CP15_MAP_DCACHEWRITEBACK)
|
if (PU_Map[addr >> CP15_MAP_ENTRYSIZE_LOG2] & CP15_MAP_DCACHEWRITEBACK)
|
||||||
{
|
{
|
||||||
|
@ -1562,9 +1594,6 @@ u32 ARMv5::CP15Read(const u32 id) const
|
||||||
// TCM are handled here.
|
// TCM are handled here.
|
||||||
// TODO: later on, handle PU
|
// TODO: later on, handle PU
|
||||||
|
|
||||||
u32 ARMv5::CodeRead32(const u32 addr, bool const branch)
|
|
||||||
{
|
|
||||||
|
|
||||||
u32 ARMv5::CodeRead32(u32 addr, bool branch)
|
u32 ARMv5::CodeRead32(u32 addr, bool branch)
|
||||||
{
|
{
|
||||||
// prefetch abort
|
// prefetch abort
|
||||||
|
@ -1650,8 +1679,9 @@ bool ARMv5::DataRead8(u32 addr, u32* val)
|
||||||
{
|
{
|
||||||
if (IsAddressDCachable(addr))
|
if (IsAddressDCachable(addr))
|
||||||
{
|
{
|
||||||
|
DataCycles = 0;
|
||||||
*val = (DCacheLookup(addr) >> (8 * (addr & 3))) & 0xff;
|
*val = (DCacheLookup(addr) >> (8 * (addr & 3))) & 0xff;
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1708,8 +1738,9 @@ bool ARMv5::DataRead16(u32 addr, u32* val)
|
||||||
{
|
{
|
||||||
if (IsAddressDCachable(addr))
|
if (IsAddressDCachable(addr))
|
||||||
{
|
{
|
||||||
|
DataCycles = 0;
|
||||||
*val = (DCacheLookup(addr) >> (8* (addr & 2))) & 0xffff;
|
*val = (DCacheLookup(addr) >> (8* (addr & 2))) & 0xffff;
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1769,8 +1800,9 @@ bool ARMv5::DataRead32(u32 addr, u32* val)
|
||||||
{
|
{
|
||||||
if (IsAddressDCachable(addr))
|
if (IsAddressDCachable(addr))
|
||||||
{
|
{
|
||||||
|
DataCycles = 0;
|
||||||
*val = DCacheLookup(addr);
|
*val = DCacheLookup(addr);
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1828,7 +1860,7 @@ bool ARMv5::DataRead32S(u32 addr, u32* val)
|
||||||
if (IsAddressDCachable(addr))
|
if (IsAddressDCachable(addr))
|
||||||
{
|
{
|
||||||
*val = DCacheLookup(addr);
|
*val = DCacheLookup(addr);
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1886,7 +1918,7 @@ bool ARMv5::DataWrite8(u32 addr, u8 val)
|
||||||
if (IsAddressDCachable(addr))
|
if (IsAddressDCachable(addr))
|
||||||
{
|
{
|
||||||
if (DCacheWrite8(addr, val))
|
if (DCacheWrite8(addr, val))
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1946,7 +1978,7 @@ bool ARMv5::DataWrite16(u32 addr, u16 val)
|
||||||
if (IsAddressDCachable(addr))
|
if (IsAddressDCachable(addr))
|
||||||
{
|
{
|
||||||
if (DCacheWrite16(addr, val))
|
if (DCacheWrite16(addr, val))
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2006,8 +2038,9 @@ bool ARMv5::DataWrite32(u32 addr, u32 val)
|
||||||
{
|
{
|
||||||
if (IsAddressDCachable(addr))
|
if (IsAddressDCachable(addr))
|
||||||
{
|
{
|
||||||
|
DataCycles = 0;
|
||||||
if (DCacheWrite32(addr, val))
|
if (DCacheWrite32(addr, val))
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2067,7 +2100,7 @@ bool ARMv5::DataWrite32S(u32 addr, u32 val, bool dataabort)
|
||||||
if (IsAddressDCachable(addr))
|
if (IsAddressDCachable(addr))
|
||||||
{
|
{
|
||||||
if (DCacheWrite32(addr, val))
|
if (DCacheWrite32(addr, val))
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -192,6 +192,7 @@ enum
|
||||||
Mem9_VRAM = 0x00000100,
|
Mem9_VRAM = 0x00000100,
|
||||||
Mem9_GBAROM = 0x00020000,
|
Mem9_GBAROM = 0x00020000,
|
||||||
Mem9_GBARAM = 0x00040000,
|
Mem9_GBARAM = 0x00040000,
|
||||||
|
Mem9_DCache = 0x40000000,
|
||||||
Mem9_Null = 0x80000000,
|
Mem9_Null = 0x80000000,
|
||||||
|
|
||||||
Mem7_BIOS = 0x00000001,
|
Mem7_BIOS = 0x00000001,
|
||||||
|
|
Loading…
Reference in New Issue