CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
Path: blob/master/Core/MIPS/MIPSAsm.cpp
Views: 1401
#include <cstdarg>1#include <cstring>2#include <memory>3#ifndef NO_ARMIPS4#include <string_view>5#endif6#include <vector>78#include "Common/CommonTypes.h"9#ifndef NO_ARMIPS10#include "ext/armips/Core/Assembler.h"11#include "ext/armips/Core/FileManager.h"12#endif1314#include "Common/Data/Encoding/Utf8.h"15#include "Core/Debugger/SymbolMap.h"16#include "Core/MemMapHelpers.h"17#include "Core/MIPS/JitCommon/JitCommon.h"18#include "Core/MIPS/MIPSAsm.h"1920namespace MIPSAsm21{22static std::string errorText;2324std::string GetAssembleError()25{26return errorText;27}2829#ifndef NO_ARMIPS30class PspAssemblerFile: public AssemblerFile31{32public:33PspAssemblerFile() {34address = 0;35}3637bool open(bool onlyCheck) override{ return true; };38void close() override { };39bool isOpen() override { return true; };40bool write(void* data, size_t length) override {41if (!Memory::IsValidAddress((u32)(address+length-1)))42return false;4344Memory::Memcpy((u32)address, data, (u32)length, "Debugger");4546// In case this is a delay slot or combined instruction, clear cache above it too.47mipsr4k.InvalidateICache((u32)(address - 4), (int)length + 4);4849address += length;50return true;51}52int64_t getVirtualAddress() override { return address; };53int64_t getPhysicalAddress() override { return getVirtualAddress(); };54int64_t getHeaderSize() override { return 0; }55bool seekVirtual(int64_t virtualAddress) override {56if (!Memory::IsValidAddress(virtualAddress))57return false;58address = virtualAddress;59return true;60}61bool seekPhysical(int64_t physicalAddress) override { return seekVirtual(physicalAddress); }62const fs::path &getFileName() override { return dummyFilename_; }63private:64u64 address;65fs::path dummyFilename_;66};6768bool MipsAssembleOpcode(const char *line, DebugInterface *cpu, u32 address) {69std::vector<std::string> errors;7071char str[64];72snprintf(str, 64, ".psp\n.org 0x%08X\n", address);7374ArmipsArguments args;75args.mode = ArmipsMode::MEMORY;76args.content = str + std::string(line);77args.silent = true;78args.memoryFile.reset(new PspAssemblerFile());79args.errorsResult = &errors;8081if (g_symbolMap) {82g_symbolMap->GetLabels(args.labels);83}8485errorText.clear();86if (!runArmips(args))87{88for (size_t i = 0; i < errors.size(); i++)89{90errorText += errors[i];91if (i != errors.size() - 1)92errorText += "\n";93}9495return false;96}9798return true;99}100#else101bool MipsAssembleOpcode(const char *line, DebugInterface *cpu, u32 address) {102errorText = "Built without armips, cannot assemble";103return false;104}105#endif106107} // namespace108109110