2
#include "Commands/CDirectiveArea.h"
3
#include "Core/Common.h"
4
#include "Core/FileManager.h"
7
CDirectiveArea::CDirectiveArea(Expression& size)
10
this->contentSize = 0;
13
this->sizeExpression = size;
14
this->content = nullptr;
17
CDirectiveArea::~CDirectiveArea()
22
void CDirectiveArea::setFillExpression(Expression& exp)
27
bool CDirectiveArea::Validate()
29
size_t oldAreaSize = areaSize;
30
size_t oldContentSize = contentSize;
32
position = g_fileManager->getVirtualAddress();
34
if (sizeExpression.evaluateInteger(areaSize) == false)
36
Logger::queueError(Logger::Error,L"Invalid size expression");
40
if (fillExpression.isLoaded())
42
if (fillExpression.evaluateInteger(fillValue) == false)
44
Logger::queueError(Logger::Error,L"Invalid fill expression");
49
content->applyFileInfo();
50
bool result = content->Validate();
51
contentSize = g_fileManager->getVirtualAddress()-position;
53
// restore info of this command
56
if (areaSize < contentSize)
58
Logger::queueError(Logger::Error,L"Area overflowed");
61
if (fillExpression.isLoaded())
62
g_fileManager->advanceMemory(areaSize-contentSize);
64
if (areaSize != oldAreaSize || contentSize != oldContentSize)
70
void CDirectiveArea::Encode() const
74
if (fillExpression.isLoaded())
76
unsigned char buffer[64];
77
memset(buffer,fillValue,64);
79
size_t writeSize = areaSize-contentSize;
82
size_t part = std::min<size_t>(64,writeSize);
83
g_fileManager->write(buffer,part);
89
void CDirectiveArea::writeTempData(TempData& tempData) const
91
tempData.writeLine(position,formatString(L".area 0x%08X",areaSize));
92
content->applyFileInfo();
93
content->writeTempData(tempData);
95
if (fillExpression.isLoaded())
97
std::wstring fillString = formatString(L".fill 0x%08X,0x%02X",areaSize-contentSize,fillValue);
98
tempData.writeLine(position+contentSize,fillString);
99
tempData.writeLine(position+areaSize,L".endarea");
101
tempData.writeLine(position+contentSize,L".endarea");
105
void CDirectiveArea::writeSymData(SymbolData& symData) const
107
content->writeSymData(symData);
109
if (fillExpression.isLoaded())
110
symData.addData(position+contentSize,areaSize-contentSize,SymbolData::Data8);