2015-07-31 14:06:45 -04:00
|
|
|
#include <string.h>
|
2015-04-20 01:46:41 -04:00
|
|
|
#include <memory>
|
2007-12-17 04:08:46 +00:00
|
|
|
#include "RegisterStateFile.h"
|
|
|
|
#include "xml/Node.h"
|
|
|
|
#include "xml/Writer.h"
|
|
|
|
#include "xml/Parser.h"
|
|
|
|
#include "lexical_cast_ex.h"
|
|
|
|
|
2012-09-04 23:53:34 +00:00
|
|
|
CRegisterStateFile::CRegisterStateFile(const char* name)
|
2018-04-30 21:01:23 +01:00
|
|
|
: CZipFile(name)
|
2007-12-17 04:08:46 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2012-09-04 23:53:34 +00:00
|
|
|
CRegisterStateFile::CRegisterStateFile(Framework::CStream& stream)
|
2018-04-30 21:01:23 +01:00
|
|
|
: CZipFile("")
|
2007-12-17 04:08:46 +00:00
|
|
|
{
|
2012-09-04 23:53:34 +00:00
|
|
|
Read(stream);
|
2007-12-17 04:08:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
CRegisterStateFile::~CRegisterStateFile()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2012-09-04 23:53:34 +00:00
|
|
|
void CRegisterStateFile::Read(Framework::CStream& stream)
|
2007-12-17 04:08:46 +00:00
|
|
|
{
|
2012-09-04 23:53:34 +00:00
|
|
|
m_registers.clear();
|
|
|
|
auto rootNode = std::unique_ptr<Framework::Xml::CNode>(Framework::Xml::CParser::ParseDocument(stream));
|
|
|
|
auto registerList = rootNode->SelectNodes("RegisterFile/Register");
|
|
|
|
for(Framework::Xml::CNode::NodeIterator nodeIterator(registerList.begin());
|
2018-04-30 21:01:23 +01:00
|
|
|
nodeIterator != registerList.end(); nodeIterator++)
|
2012-09-04 23:53:34 +00:00
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
auto node(*nodeIterator);
|
|
|
|
const char* namePtr = node->GetAttribute("Name");
|
|
|
|
const char* valuePtr = node->GetAttribute("Value");
|
|
|
|
if(namePtr == NULL || valuePtr == NULL) continue;
|
|
|
|
std::string valueString(valuePtr);
|
|
|
|
uint128 value;
|
|
|
|
memset(&value, 0, sizeof(uint128));
|
|
|
|
for(unsigned int i = 0; i < 4; i++)
|
|
|
|
{
|
|
|
|
if(valueString.length() == 0) break;
|
|
|
|
int start = std::max<int>(0, static_cast<int>(valueString.length()) - 8);
|
|
|
|
std::string subString(valueString.begin() + start, valueString.end());
|
|
|
|
value.nV[i] = lexical_cast_hex<std::string>(subString);
|
|
|
|
valueString = std::string(valueString.begin(), valueString.begin() + start);
|
|
|
|
}
|
|
|
|
m_registers[namePtr] = Register(4, value);
|
|
|
|
}
|
|
|
|
catch(...)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
}
|
2007-12-17 04:08:46 +00:00
|
|
|
}
|
|
|
|
|
2012-09-04 23:53:34 +00:00
|
|
|
void CRegisterStateFile::Write(Framework::CStream& stream)
|
2007-12-17 04:08:46 +00:00
|
|
|
{
|
2012-09-04 23:53:34 +00:00
|
|
|
auto rootNode = new Framework::Xml::CNode("RegisterFile", true);
|
|
|
|
for(auto registerIterator(m_registers.begin());
|
2018-04-30 21:01:23 +01:00
|
|
|
registerIterator != m_registers.end(); registerIterator++)
|
2012-09-04 23:53:34 +00:00
|
|
|
{
|
|
|
|
const Register& reg(registerIterator->second);
|
|
|
|
auto registerNode = new Framework::Xml::CNode("Register", true);
|
|
|
|
std::string valueString;
|
|
|
|
for(unsigned int i = 0; i < reg.first; i++)
|
|
|
|
{
|
|
|
|
valueString = lexical_cast_hex<std::string>(reg.second.nV[i], 8) + valueString;
|
|
|
|
}
|
|
|
|
registerNode->InsertAttribute("Name", registerIterator->first.c_str());
|
|
|
|
registerNode->InsertAttribute("Value", valueString.c_str());
|
|
|
|
rootNode->InsertNode(registerNode);
|
|
|
|
}
|
2013-01-29 05:46:29 +00:00
|
|
|
Framework::Xml::CWriter::WriteDocument(stream, rootNode);
|
2012-09-04 23:53:34 +00:00
|
|
|
delete rootNode;
|
2007-12-17 04:08:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void CRegisterStateFile::SetRegister32(const char* name, uint32 value)
|
|
|
|
{
|
2012-09-04 23:53:34 +00:00
|
|
|
uint128 longValue;
|
|
|
|
longValue.nD0 = value;
|
|
|
|
longValue.nD1 = 0;
|
|
|
|
m_registers[name] = Register(1, longValue);
|
2007-12-17 04:08:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void CRegisterStateFile::SetRegister64(const char* name, uint64 value)
|
|
|
|
{
|
2012-09-04 23:53:34 +00:00
|
|
|
uint128 longValue;
|
|
|
|
longValue.nD0 = value;
|
|
|
|
longValue.nD1 = 0;
|
|
|
|
m_registers[name] = Register(2, longValue);
|
2007-12-17 04:08:46 +00:00
|
|
|
}
|
|
|
|
|
2017-09-10 00:43:21 -04:00
|
|
|
void CRegisterStateFile::SetRegister128(const char* name, uint128 value)
|
|
|
|
{
|
|
|
|
m_registers[name] = Register(4, value);
|
|
|
|
}
|
|
|
|
|
2012-09-04 23:53:34 +00:00
|
|
|
uint32 CRegisterStateFile::GetRegister32(const char* name) const
|
2007-12-17 04:08:46 +00:00
|
|
|
{
|
2012-09-04 23:53:34 +00:00
|
|
|
auto registerIterator(m_registers.find(name));
|
|
|
|
if(registerIterator == m_registers.end()) return 0;
|
|
|
|
return registerIterator->second.second.nV0;
|
2007-12-17 04:08:46 +00:00
|
|
|
}
|
|
|
|
|
2012-09-04 23:53:34 +00:00
|
|
|
uint64 CRegisterStateFile::GetRegister64(const char* name) const
|
2007-12-17 04:08:46 +00:00
|
|
|
{
|
2012-09-04 23:53:34 +00:00
|
|
|
auto registerIterator(m_registers.find(name));
|
|
|
|
if(registerIterator == m_registers.end()) return 0;
|
|
|
|
return registerIterator->second.second.nD0;
|
2007-12-17 04:08:46 +00:00
|
|
|
}
|
2017-09-10 00:43:21 -04:00
|
|
|
|
|
|
|
uint128 CRegisterStateFile::GetRegister128(const char* name) const
|
|
|
|
{
|
|
|
|
auto registerIterator(m_registers.find(name));
|
|
|
|
if(registerIterator == m_registers.end())
|
|
|
|
{
|
|
|
|
uint128 zero = {};
|
|
|
|
return zero;
|
|
|
|
}
|
|
|
|
return registerIterator->second.second;
|
|
|
|
}
|