mirror of
https://github.com/wheremyfoodat/Panda3DS.git
synced 2025-04-17 19:21:30 +12:00
[Kernel] Implement GetSystemTick
This commit is contained in:
parent
5bcdf4d063
commit
cbefe3c2d0
4 changed files with 19 additions and 0 deletions
|
@ -13,6 +13,7 @@ class CPU;
|
||||||
class MyEnvironment final : public Dynarmic::A32::UserCallbacks {
|
class MyEnvironment final : public Dynarmic::A32::UserCallbacks {
|
||||||
public:
|
public:
|
||||||
u64 ticksLeft = 0;
|
u64 ticksLeft = 0;
|
||||||
|
u64 totalTicks = 0;
|
||||||
Memory& mem;
|
Memory& mem;
|
||||||
Kernel& kernel;
|
Kernel& kernel;
|
||||||
|
|
||||||
|
@ -80,6 +81,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddTicks(u64 ticks) override {
|
void AddTicks(u64 ticks) override {
|
||||||
|
totalTicks += ticks;
|
||||||
|
|
||||||
if (ticks > ticksLeft) {
|
if (ticks > ticksLeft) {
|
||||||
ticksLeft = 0;
|
ticksLeft = 0;
|
||||||
return;
|
return;
|
||||||
|
@ -148,6 +151,10 @@ public:
|
||||||
cp15->setTLSBase(value);
|
cp15->setTLSBase(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u64 getTicks() {
|
||||||
|
return env.totalTicks;
|
||||||
|
}
|
||||||
|
|
||||||
void runFrame() {
|
void runFrame() {
|
||||||
env.ticksLeft = 268111856 / 60;
|
env.ticksLeft = 268111856 / 60;
|
||||||
const auto exitReason = jit->Run();
|
const auto exitReason = jit->Run();
|
||||||
|
|
|
@ -92,6 +92,7 @@ class Kernel {
|
||||||
void getResourceLimit();
|
void getResourceLimit();
|
||||||
void getResourceLimitLimitValues();
|
void getResourceLimitLimitValues();
|
||||||
void getResourceLimitCurrentValues();
|
void getResourceLimitCurrentValues();
|
||||||
|
void getSystemTick();
|
||||||
void sendSyncRequest();
|
void sendSyncRequest();
|
||||||
void svcCloseHandle();
|
void svcCloseHandle();
|
||||||
void connectToPort();
|
void connectToPort();
|
||||||
|
|
|
@ -19,6 +19,7 @@ CPU::CPU(Memory& mem, Kernel& kernel) : mem(mem), env(mem, kernel, *this) {
|
||||||
void CPU::reset() {
|
void CPU::reset() {
|
||||||
setCPSR(CPSR::UserMode);
|
setCPSR(CPSR::UserMode);
|
||||||
setFPSCR(FPSCR::ThreadDefault);
|
setFPSCR(FPSCR::ThreadDefault);
|
||||||
|
env.totalTicks = 0;
|
||||||
|
|
||||||
cp15->reset();
|
cp15->reset();
|
||||||
cp15->setTLSBase(VirtualAddrs::TLSBase); // Set cp15 TLS pointer to the main thread's thread-local storage
|
cp15->setTLSBase(VirtualAddrs::TLSBase); // Set cp15 TLS pointer to the main thread's thread-local storage
|
||||||
|
|
|
@ -26,6 +26,7 @@ void Kernel::serviceSVC(u32 svc) {
|
||||||
case 0x22: arbitrateAddress(); break;
|
case 0x22: arbitrateAddress(); break;
|
||||||
case 0x23: svcCloseHandle(); break;
|
case 0x23: svcCloseHandle(); break;
|
||||||
case 0x24: waitSynchronization1(); break;
|
case 0x24: waitSynchronization1(); break;
|
||||||
|
case 0x28: getSystemTick(); break;
|
||||||
case 0x2D: connectToPort(); break;
|
case 0x2D: connectToPort(); break;
|
||||||
case 0x32: sendSyncRequest(); break;
|
case 0x32: sendSyncRequest(); break;
|
||||||
case 0x38: getResourceLimit(); break;
|
case 0x38: getResourceLimit(); break;
|
||||||
|
@ -108,6 +109,15 @@ void Kernel::svcCloseHandle() {
|
||||||
regs[0] = SVCResult::Success;
|
regs[0] = SVCResult::Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// u64 GetSystemTick()
|
||||||
|
void Kernel::getSystemTick() {
|
||||||
|
printf("GetSystemTick()\n");
|
||||||
|
|
||||||
|
u64 ticks = cpu.getTicks();
|
||||||
|
regs[0] = u32(ticks);
|
||||||
|
regs[1] = u32(ticks >> 32);
|
||||||
|
}
|
||||||
|
|
||||||
// Result OutputDebugString(const char* str, s32 size)
|
// Result OutputDebugString(const char* str, s32 size)
|
||||||
// TODO: Does this actually write an error code in r0 and is the above signature correct?
|
// TODO: Does this actually write an error code in r0 and is the above signature correct?
|
||||||
void Kernel::outputDebugString() {
|
void Kernel::outputDebugString() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue