add nocashPrint type shit
This commit is contained in:
parent
d92c7e79df
commit
e7a4fe11ed
|
@ -1501,6 +1501,15 @@ void T_MOV_HIREG(ARM* cpu)
|
||||||
{
|
{
|
||||||
cpu->R[rd] = cpu->R[rs];
|
cpu->R[rd] = cpu->R[rs];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// nocash-style debugging hook
|
||||||
|
if ((cpu->CurInstr & 0xFFFF) == 0x46E4 && // mov r12, r12
|
||||||
|
(cpu->NextInstr[0] & 0xF800) == 0xE000 && // branch
|
||||||
|
(cpu->NextInstr[1] & 0xFFFF) == 0x6464)
|
||||||
|
{
|
||||||
|
u32 addr = cpu->R[15] + 2;
|
||||||
|
NDS::NocashPrint(cpu->Num, addr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
126
src/NDS.cpp
126
src/NDS.cpp
|
@ -71,6 +71,10 @@ u8 ARM7MemTimings[0x20000][4];
|
||||||
ARMv5* ARM9;
|
ARMv5* ARM9;
|
||||||
ARMv4* ARM7;
|
ARMv4* ARM7;
|
||||||
|
|
||||||
|
u32 NumFrames;
|
||||||
|
u64 SysClockCycles;
|
||||||
|
u64 LastSysClockCycles;
|
||||||
|
|
||||||
s32 CurIterationCycles;
|
s32 CurIterationCycles;
|
||||||
s32 ARM7Offset;
|
s32 ARM7Offset;
|
||||||
int CurCPU;
|
int CurCPU;
|
||||||
|
@ -387,6 +391,9 @@ void Reset()
|
||||||
dbg_CyclesTimer7 = 0;
|
dbg_CyclesTimer7 = 0;
|
||||||
#endif // DEBUG_CHECK_DESYNC
|
#endif // DEBUG_CHECK_DESYNC
|
||||||
|
|
||||||
|
SysClockCycles = 0;
|
||||||
|
LastSysClockCycles = 0;
|
||||||
|
|
||||||
f = melon_fopen_local("bios9.bin", "rb");
|
f = melon_fopen_local("bios9.bin", "rb");
|
||||||
if (!f)
|
if (!f)
|
||||||
{
|
{
|
||||||
|
@ -838,6 +845,9 @@ u32 RunFrame()
|
||||||
|
|
||||||
RunLooseTimers(1, ndscyclestorun);
|
RunLooseTimers(1, ndscyclestorun);
|
||||||
RunSystem(ndscyclestorun);
|
RunSystem(ndscyclestorun);
|
||||||
|
|
||||||
|
SysClockCycles += ndscyclestorun;
|
||||||
|
LastSysClockCycles += ndscyclestorun;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_CHECK_DESYNC
|
#ifdef DEBUG_CHECK_DESYNC
|
||||||
|
@ -849,6 +859,8 @@ u32 RunFrame()
|
||||||
dbg_CyclesTimer7-dbg_CyclesSys);
|
dbg_CyclesTimer7-dbg_CyclesSys);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
NumFrames++;
|
||||||
|
|
||||||
return GPU::TotalScanlines;
|
return GPU::TotalScanlines;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1095,6 +1107,120 @@ u32 GetPC(u32 cpu)
|
||||||
return cpu ? ARM7->R[15] : ARM9->R[15];
|
return cpu ? ARM7->R[15] : ARM9->R[15];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u64 GetSysClockCycles(int num)
|
||||||
|
{
|
||||||
|
u64 ret;
|
||||||
|
|
||||||
|
if (num == 0)
|
||||||
|
{
|
||||||
|
ret = SysClockCycles;
|
||||||
|
|
||||||
|
if (CurCPU == 1) ret += (ARM9->Cycles >> 1);
|
||||||
|
else if (CurCPU == 2) ret += ARM7->Cycles;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = LastSysClockCycles;
|
||||||
|
|
||||||
|
if (CurCPU == 1)
|
||||||
|
{
|
||||||
|
ret += (ARM9->Cycles >> 1);
|
||||||
|
LastSysClockCycles = -(ARM9->Cycles >> 1);
|
||||||
|
}
|
||||||
|
else if (CurCPU == 2)
|
||||||
|
{
|
||||||
|
ret += ARM7->Cycles;
|
||||||
|
LastSysClockCycles = -ARM7->Cycles;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NocashPrint(u32 ncpu, u32 addr)
|
||||||
|
{
|
||||||
|
// addr: u16 flags (TODO: research? libnds doesn't use those)
|
||||||
|
// addr+2: debug string
|
||||||
|
|
||||||
|
addr += 2;
|
||||||
|
|
||||||
|
ARM* cpu = ncpu ? (ARM*)ARM7 : (ARM*)ARM9;
|
||||||
|
u8 (*readfn)(u32) = ncpu ? NDS::ARM7Read8 : NDS::ARM9Read8;
|
||||||
|
|
||||||
|
char output[1024];
|
||||||
|
int ptr = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < 120 && ptr < 1023; )
|
||||||
|
{
|
||||||
|
char ch = readfn(addr++);
|
||||||
|
i++;
|
||||||
|
|
||||||
|
if (ch == '%')
|
||||||
|
{
|
||||||
|
char cmd[16]; int j;
|
||||||
|
for (j = 0; j < 15; )
|
||||||
|
{
|
||||||
|
char ch2 = readfn(addr++);
|
||||||
|
i++;
|
||||||
|
if (i >= 120) break;
|
||||||
|
if (ch2 == '%') break;
|
||||||
|
cmd[j++] = ch2;
|
||||||
|
}
|
||||||
|
cmd[j] = '\0';
|
||||||
|
|
||||||
|
char subs[64];
|
||||||
|
|
||||||
|
if (cmd[0] == 'r')
|
||||||
|
{
|
||||||
|
if (!strcmp(cmd, "r0")) sprintf(subs, "%08X", cpu->R[0]);
|
||||||
|
else if (!strcmp(cmd, "r1")) sprintf(subs, "%08X", cpu->R[1]);
|
||||||
|
else if (!strcmp(cmd, "r2")) sprintf(subs, "%08X", cpu->R[2]);
|
||||||
|
else if (!strcmp(cmd, "r3")) sprintf(subs, "%08X", cpu->R[3]);
|
||||||
|
else if (!strcmp(cmd, "r4")) sprintf(subs, "%08X", cpu->R[4]);
|
||||||
|
else if (!strcmp(cmd, "r5")) sprintf(subs, "%08X", cpu->R[5]);
|
||||||
|
else if (!strcmp(cmd, "r6")) sprintf(subs, "%08X", cpu->R[6]);
|
||||||
|
else if (!strcmp(cmd, "r7")) sprintf(subs, "%08X", cpu->R[7]);
|
||||||
|
else if (!strcmp(cmd, "r8")) sprintf(subs, "%08X", cpu->R[8]);
|
||||||
|
else if (!strcmp(cmd, "r9")) sprintf(subs, "%08X", cpu->R[9]);
|
||||||
|
else if (!strcmp(cmd, "r10")) sprintf(subs, "%08X", cpu->R[10]);
|
||||||
|
else if (!strcmp(cmd, "r11")) sprintf(subs, "%08X", cpu->R[11]);
|
||||||
|
else if (!strcmp(cmd, "r12")) sprintf(subs, "%08X", cpu->R[12]);
|
||||||
|
else if (!strcmp(cmd, "r13")) sprintf(subs, "%08X", cpu->R[13]);
|
||||||
|
else if (!strcmp(cmd, "r14")) sprintf(subs, "%08X", cpu->R[14]);
|
||||||
|
else if (!strcmp(cmd, "r15")) sprintf(subs, "%08X", cpu->R[15]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!strcmp(cmd, "sp")) sprintf(subs, "%08X", cpu->R[13]);
|
||||||
|
else if (!strcmp(cmd, "lr")) sprintf(subs, "%08X", cpu->R[14]);
|
||||||
|
else if (!strcmp(cmd, "pc")) sprintf(subs, "%08X", cpu->R[15]);
|
||||||
|
else if (!strcmp(cmd, "frame")) sprintf(subs, "%d", NumFrames);
|
||||||
|
else if (!strcmp(cmd, "scanline")) sprintf(subs, "%d", GPU::VCount);
|
||||||
|
else if (!strcmp(cmd, "totalclks")) sprintf(subs, "%lu", GetSysClockCycles(0));
|
||||||
|
else if (!strcmp(cmd, "lastclks")) sprintf(subs, "%lu", GetSysClockCycles(1));
|
||||||
|
else if (!strcmp(cmd, "zeroclks"))
|
||||||
|
{
|
||||||
|
sprintf(subs, "");
|
||||||
|
GetSysClockCycles(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int slen = strlen(subs);
|
||||||
|
if ((ptr+slen) > 1023) slen = 1023-ptr;
|
||||||
|
strncpy(&output[ptr], subs, slen);
|
||||||
|
ptr += slen;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
output[ptr++] = ch;
|
||||||
|
if (ch == '\0') break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
output[ptr] = '\0';
|
||||||
|
printf("%s", output);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void HandleTimerOverflow(u32 tid)
|
void HandleTimerOverflow(u32 tid)
|
||||||
|
|
|
@ -170,6 +170,7 @@ void GXFIFOStall();
|
||||||
void GXFIFOUnstall();
|
void GXFIFOUnstall();
|
||||||
|
|
||||||
u32 GetPC(u32 cpu);
|
u32 GetPC(u32 cpu);
|
||||||
|
void NocashPrint(u32 cpu, u32 addr);
|
||||||
|
|
||||||
bool DMAsInMode(u32 cpu, u32 mode);
|
bool DMAsInMode(u32 cpu, u32 mode);
|
||||||
bool DMAsRunning(u32 cpu);
|
bool DMAsRunning(u32 cpu);
|
||||||
|
|
Loading…
Reference in New Issue