mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-23 06:10:03 -06:00
DMA timing renovation (#1207)
* make timers usable for measurement shito without being assfuckingly unreliable * bürp * Arisotura can you ever clean up your goddamn code also regroup the timer code instead of having it split weirdly * make the set-timing functions a tad less hacky * congrats Arisotura you made an ass-enum * add timing region tables, and separate timings for ARM9 DMA (exempt of 3c penalty) * temp work on DMA timings, not finished also, did you know? 'increment/reload' is also a thing for the source address * begin work * add some of the GBA slot/wifi timings * complete it, I guess * make some progress * getting somewhere * sdsdfs * see, Arisotura, was it that hard? blarg.
This commit is contained in:
30
src/CP15.cpp
30
src/CP15.cpp
@ -225,7 +225,8 @@ void ARMv5::UpdatePURegion(u32 n)
|
||||
usermask |= 0x40;
|
||||
}
|
||||
|
||||
//printf("PU region %d: %08X-%08X, user=%02X priv=%02X\n", n, start<<12, end<<12, usermask, privmask);
|
||||
printf("PU region %d: %08X-%08X, user=%02X priv=%02X\n", n, start<<12, end<<12, usermask, privmask);
|
||||
printf("%08X/%08X\n", PU_DataRW, PU_CodeRW);
|
||||
|
||||
for (u32 i = start; i < end; i++)
|
||||
{
|
||||
@ -233,7 +234,7 @@ void ARMv5::UpdatePURegion(u32 n)
|
||||
PU_PrivMap[i] = privmask;
|
||||
}
|
||||
|
||||
UpdateRegionTimings(start<<12, end<<12);
|
||||
UpdateRegionTimings(start, end);
|
||||
}
|
||||
|
||||
void ARMv5::UpdatePURegions(bool update_all)
|
||||
@ -249,7 +250,7 @@ void ARMv5::UpdatePURegions(bool update_all)
|
||||
memset(PU_UserMap, mask, 0x100000);
|
||||
memset(PU_PrivMap, mask, 0x100000);
|
||||
|
||||
UpdateRegionTimings(0x00000000, 0xFFFFFFFF);
|
||||
UpdateRegionTimings(0x00000, 0x100000);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -266,16 +267,11 @@ void ARMv5::UpdatePURegions(bool update_all)
|
||||
|
||||
// TODO: this is way unoptimized
|
||||
// should be okay unless the game keeps changing shit, tho
|
||||
if (update_all) UpdateRegionTimings(0x00000000, 0xFFFFFFFF);
|
||||
if (update_all) UpdateRegionTimings(0x00000, 0x100000);
|
||||
}
|
||||
|
||||
void ARMv5::UpdateRegionTimings(u32 addrstart, u32 addrend)
|
||||
{
|
||||
addrstart >>= 12;
|
||||
addrend >>= 12;
|
||||
|
||||
if (addrend == 0xFFFFF) addrend++;
|
||||
|
||||
for (u32 i = addrstart; i < addrend; i++)
|
||||
{
|
||||
u8 pu = PU_Map[i];
|
||||
@ -420,7 +416,7 @@ void ARMv5::ICacheInvalidateAll()
|
||||
|
||||
void ARMv5::CP15Write(u32 id, u32 val)
|
||||
{
|
||||
//printf("CP15 write op %03X %08X %08X\n", id, val, R[15]);
|
||||
//if(id!=0x704)printf("CP15 write op %03X %08X %08X\n", id, val, R[15]);
|
||||
|
||||
switch (id)
|
||||
{
|
||||
@ -520,7 +516,7 @@ void ARMv5::CP15Write(u32 id, u32 val)
|
||||
return;
|
||||
|
||||
case 0x502: // data permissions
|
||||
{
|
||||
{printf("SET DATAPERM %08X (%08X %08X)\n", val,PU_DataRW,PU_DataRW ^ val);
|
||||
u32 diff = PU_DataRW ^ val;
|
||||
PU_DataRW = val;
|
||||
for (u32 i = 0; i < 8; i++)
|
||||
@ -814,6 +810,12 @@ void ARMv5::DataRead16(u32 addr, u32* val)
|
||||
|
||||
void ARMv5::DataRead32(u32 addr, u32* val)
|
||||
{
|
||||
/*if (!(PU_Map[addr>>12] & 0x01))
|
||||
{printf("addr %08X very bad\n", addr);
|
||||
DataAbort();
|
||||
return;
|
||||
}*/
|
||||
|
||||
DataRegion = addr;
|
||||
|
||||
addr &= ~3;
|
||||
@ -908,6 +910,12 @@ void ARMv5::DataWrite16(u32 addr, u16 val)
|
||||
|
||||
void ARMv5::DataWrite32(u32 addr, u32 val)
|
||||
{
|
||||
/*if (!(PU_Map[addr>>12] & 0x02))
|
||||
{printf("addr %08X wr very bad\n", addr);
|
||||
DataAbort();
|
||||
return;
|
||||
}*/
|
||||
|
||||
DataRegion = addr;
|
||||
|
||||
addr &= ~3;
|
||||
|
Reference in New Issue
Block a user