mirror of
https://github.com/wheremyfoodat/Panda3DS.git
synced 2025-06-03 12:27:21 +12:00
Finish ELF loading, running actual code now
This commit is contained in:
parent
51689af51f
commit
275c6dfd0c
7 changed files with 135 additions and 59 deletions
|
@ -8,21 +8,18 @@
|
|||
class MyEnvironment final : public Dynarmic::A32::UserCallbacks {
|
||||
public:
|
||||
u64 ticks_left = 0;
|
||||
std::array<u8, 2048> memory{};
|
||||
Memory& mem;
|
||||
|
||||
u8 MemoryRead8(u32 vaddr) override {
|
||||
if (vaddr >= memory.size()) {
|
||||
return 0;
|
||||
}
|
||||
return memory[vaddr];
|
||||
return mem.read8(vaddr);
|
||||
}
|
||||
|
||||
u16 MemoryRead16(u32 vaddr) override {
|
||||
return u16(MemoryRead8(vaddr)) | u16(MemoryRead8(vaddr + 1)) << 8;
|
||||
return mem.read16(vaddr);
|
||||
}
|
||||
|
||||
u32 MemoryRead32(u32 vaddr) override {
|
||||
return u32(MemoryRead16(vaddr)) | u32(MemoryRead16(vaddr + 2)) << 16;
|
||||
return mem.read32(vaddr);
|
||||
}
|
||||
|
||||
u64 MemoryRead64(u32 vaddr) override {
|
||||
|
@ -30,20 +27,15 @@ public:
|
|||
}
|
||||
|
||||
void MemoryWrite8(u32 vaddr, u8 value) override {
|
||||
if (vaddr >= memory.size()) {
|
||||
return;
|
||||
}
|
||||
memory[vaddr] = value;
|
||||
mem.write8(vaddr, value);
|
||||
}
|
||||
|
||||
void MemoryWrite16(u32 vaddr, u16 value) override {
|
||||
MemoryWrite8(vaddr, u8(value));
|
||||
MemoryWrite8(vaddr + 1, u8(value >> 8));
|
||||
mem.write16(vaddr, value);
|
||||
}
|
||||
|
||||
void MemoryWrite32(u32 vaddr, u32 value) override {
|
||||
MemoryWrite16(vaddr, u16(value));
|
||||
MemoryWrite16(vaddr + 2, u16(value >> 16));
|
||||
mem.write32(vaddr, value);
|
||||
}
|
||||
|
||||
void MemoryWrite64(u32 vaddr, u64 value) override {
|
||||
|
@ -75,6 +67,8 @@ public:
|
|||
u64 GetTicksRemaining() override {
|
||||
return ticks_left;
|
||||
}
|
||||
|
||||
MyEnvironment(Memory& mem) : mem(mem) {}
|
||||
};
|
||||
|
||||
class CPU {
|
||||
|
@ -105,4 +99,10 @@ public:
|
|||
u32 getCPSR() {
|
||||
return jit.Cpsr();
|
||||
}
|
||||
|
||||
void runFrame() {
|
||||
env.ticks_left = 268111856 / 60;
|
||||
const auto exitReason = jit.Run();
|
||||
Helpers::panic("Exit reason: %d", (u32)exitReason);
|
||||
}
|
||||
};
|
|
@ -4,6 +4,18 @@
|
|||
#include <vector>
|
||||
#include "helpers.hpp"
|
||||
|
||||
namespace VirtualAddrs {
|
||||
enum : u32 {
|
||||
ExecutableStart = 0x00100000,
|
||||
MaxExeSize = 0x03F00000,
|
||||
ExecutableEnd = 0x00100000 + 0x03F00000,
|
||||
|
||||
// Stack for main ARM11 thread.
|
||||
// Typically 0x4000 bytes
|
||||
StackTop = 0x10000000
|
||||
};
|
||||
}
|
||||
|
||||
class Memory {
|
||||
u8* fcram;
|
||||
|
||||
|
@ -12,11 +24,19 @@ class Memory {
|
|||
static constexpr u32 pageShift = 12;
|
||||
static constexpr u32 pageSize = 1 << pageShift;
|
||||
static constexpr u32 pageMask = pageSize - 1;
|
||||
static constexpr u32 totalPageCount = 1 << (32 - pageShift);
|
||||
|
||||
public:
|
||||
Memory();
|
||||
void* getReadPointer(u32 address);
|
||||
void* getWritePointer(u32 address);
|
||||
|
||||
std::optional<u32> loadELF(std::filesystem::path& path);
|
||||
|
||||
u8 read8(u32 vaddr);
|
||||
u16 read16(u32 vaddr);
|
||||
u32 read32(u32 vaddr);
|
||||
|
||||
void write8(u32 vaddr, u8 value);
|
||||
void write16(u32 vaddr, u16 value);
|
||||
void write32(u32 vaddr, u32 value);
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue