Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
hrydgard
GitHub Repository: hrydgard/ppsspp
Path: blob/master/Core/MIPS/MIPSAsm.cpp
5688 views
1
#include <cstdarg>
2
#include <cstring>
3
#include <memory>
4
#include <string_view>
5
#include <vector>
6
7
#include "Common/CommonTypes.h"
8
#include "ext/armips/Core/Assembler.h"
9
#include "ext/armips/Core/FileManager.h"
10
#include "Core/Debugger/SymbolMap.h"
11
#include "Core/MemMapHelpers.h"
12
#include "Core/MIPS/MIPSAsm.h"
13
14
class PspAssemblerFile : public AssemblerFile {
15
public:
16
PspAssemblerFile() {
17
address = 0;
18
}
19
20
bool open(bool onlyCheck) override{ return true; };
21
void close() override { };
22
bool isOpen() override { return true; };
23
bool write(void *data, size_t length) override {
24
if (!Memory::IsValidAddress((u32)(address+length-1)))
25
return false;
26
27
Memory::Memcpy((u32)address, data, (u32)length, "Debugger");
28
29
// In case this is a delay slot or combined instruction, clear cache above it too.
30
mipsr4k.InvalidateICache((u32)(address - 4), (int)length + 4);
31
32
address += length;
33
return true;
34
}
35
int64_t getVirtualAddress() override { return address; };
36
int64_t getPhysicalAddress() override { return getVirtualAddress(); };
37
int64_t getHeaderSize() override { return 0; }
38
bool seekVirtual(int64_t virtualAddress) override {
39
if (!Memory::IsValidAddress(virtualAddress))
40
return false;
41
address = virtualAddress;
42
return true;
43
}
44
bool seekPhysical(int64_t physicalAddress) override { return seekVirtual(physicalAddress); }
45
const fs::path &getFileName() override { return dummyFilename_; }
46
private:
47
u64 address;
48
fs::path dummyFilename_;
49
};
50
51
bool MipsAssembleOpcode(std::string_view line, DebugInterface *cpu, u32 address, std::string *error) {
52
std::vector<std::string> errors;
53
54
char str[64];
55
snprintf(str, 64, ".psp\n.org 0x%08X\n", address);
56
57
ArmipsArguments args;
58
args.mode = ArmipsMode::MEMORY;
59
args.content = str + std::string(line);
60
args.silent = true;
61
args.memoryFile.reset(new PspAssemblerFile());
62
args.errorsResult = &errors;
63
64
if (g_symbolMap) {
65
g_symbolMap->GetLabels(args.labels);
66
}
67
68
error->clear();
69
if (!runArmips(args)) {
70
for (size_t i = 0; i < errors.size(); i++) {
71
(*error) += errors[i];
72
if (i != errors.size() - 1)
73
error->push_back('\n');
74
}
75
76
return false;
77
}
78
79
return true;
80
}
81
82