#pragma once
#include <cstring>
#include "Common/CommonTypes.h"
#include "Common/StringUtils.h"
#include "Core/Debugger/MemBlockInfo.h"
#include "Core/MemMap.h"
#include "Core/MIPS/MIPS.h"
extern MIPSState *currentMIPS;
namespace Memory
{
inline void Memcpy(const u32 to_address, const void *from_data, const u32 len, const char *tag, size_t tagLen) {
u8 *to = GetPointerWriteRange(to_address, len);
if (to) {
memcpy(to, from_data, len);
if (!tag) {
tag = "Memcpy";
tagLen = sizeof("Memcpy") - 1;
}
NotifyMemInfo(MemBlockFlags::WRITE, to_address, len, tag, tagLen);
}
}
inline void Memcpy(void *to_data, const u32 from_address, const u32 len, const char *tag, size_t tagLen) {
const u8 *from = GetPointerRange(from_address, len);
if (from) {
memcpy(to_data, from, len);
if (!tag) {
tag = "Memcpy";
tagLen = sizeof("Memcpy") - 1;
}
NotifyMemInfo(MemBlockFlags::READ, from_address, len, tag, tagLen);
}
}
inline void Memcpy(const u32 to_address, const u32 from_address, const u32 len, const char *tag, size_t tagLen) {
u8 *to = GetPointerWriteRange(to_address, len);
if (!to)
return;
const u8 *from = GetPointerRange(from_address, len);
if (!from)
return;
memcpy(to, from, len);
if (MemBlockInfoDetailed(len)) {
if (!tag) {
NotifyMemInfoCopy(to_address, from_address, len, "Memcpy/");
} else {
NotifyMemInfo(MemBlockFlags::READ, from_address, len, tag, tagLen);
NotifyMemInfo(MemBlockFlags::WRITE, to_address, len, tag, tagLen);
}
}
}
template<size_t tagLen>
inline void Memcpy(const u32 to_address, const void *from_data, const u32 len, const char(&tag)[tagLen]) {
Memcpy(to_address, from_data, len, tag, tagLen);
}
template<size_t tagLen>
inline void Memcpy(void *to_data, const u32 from_address, const u32 len, const char(&tag)[tagLen]) {
Memcpy(to_data, from_address, len, tag, tagLen);
}
template<size_t tagLen>
inline void Memcpy(const u32 to_address, const u32 from_address, const u32 len, const char(&tag)[tagLen]) {
Memcpy(to_address, from_address, len, tag, tagLen);
}
inline void Memcpy(const u32 to_address, const void *from_data, const u32 len) {
Memcpy(to_address, from_data, len, nullptr, 0);
}
inline void Memcpy(void *to_data, const u32 from_address, const u32 len) {
Memcpy(to_data, from_address, len, nullptr, 0);
}
inline void Memcpy(const u32 to_address, const u32 from_address, const u32 len) {
Memcpy(to_address, from_address, len, nullptr, 0);
}
void Memset(const u32 _Address, const u8 _Data, const u32 _iLength, const char *tag = "Memset");
}