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