Honouring read/write flags in AVR8 TDFs

This commit is contained in:
Nav
2021-08-30 22:32:40 +01:00
parent df1f3958c0
commit d79977317d
4 changed files with 30 additions and 3 deletions

View File

@@ -64,8 +64,10 @@ void Avr8::loadTargetRegisterDescriptors() {
generalPurposeRegisterDescriptor.startAddress = gpRegisterStartAddress + i;
generalPurposeRegisterDescriptor.size = 1;
generalPurposeRegisterDescriptor.type = TargetRegisterType::GENERAL_PURPOSE_REGISTER;
generalPurposeRegisterDescriptor.name = "R" + std::to_string(i);
generalPurposeRegisterDescriptor.groupName = "General Purpose CPU Registers";
generalPurposeRegisterDescriptor.name = "r" + std::to_string(i);
generalPurposeRegisterDescriptor.groupName = "general purpose cpu";
generalPurposeRegisterDescriptor.readable = true;
generalPurposeRegisterDescriptor.writable = true;
this->targetRegisterDescriptorsByType[generalPurposeRegisterDescriptor.type].insert(
generalPurposeRegisterDescriptor
@@ -85,6 +87,8 @@ void Avr8::loadTargetRegisterDescriptors() {
stackPointerRegisterDescriptor.name = "SP";
stackPointerRegisterDescriptor.groupName = "CPU";
stackPointerRegisterDescriptor.description = "Stack Pointer Register";
stackPointerRegisterDescriptor.readable = true;
stackPointerRegisterDescriptor.writable = true;
auto statusRegisterDescriptor = TargetRegisterDescriptor();
statusRegisterDescriptor.type = TargetRegisterType::STATUS_REGISTER;
@@ -93,6 +97,8 @@ void Avr8::loadTargetRegisterDescriptors() {
statusRegisterDescriptor.name = "SREG";
statusRegisterDescriptor.groupName = "CPU";
statusRegisterDescriptor.description = "Status Register";
statusRegisterDescriptor.readable = true;
statusRegisterDescriptor.writable = true;
auto programCounterRegisterDescriptor = TargetRegisterDescriptor();
programCounterRegisterDescriptor.type = TargetRegisterType::PROGRAM_COUNTER;
@@ -100,6 +106,8 @@ void Avr8::loadTargetRegisterDescriptors() {
programCounterRegisterDescriptor.name = "PC";
programCounterRegisterDescriptor.groupName = "CPU";
programCounterRegisterDescriptor.description = "Program Counter";
programCounterRegisterDescriptor.readable = true;
programCounterRegisterDescriptor.writable = true;
this->targetRegisterDescriptorsByType[stackPointerRegisterDescriptor.type].insert(
stackPointerRegisterDescriptor

View File

@@ -495,7 +495,21 @@ void TargetDescriptionFile::loadTargetRegisterDescriptors() {
registerDescriptor.description = moduleRegister.caption;
}
this->targetRegisterDescriptorsByType[registerDescriptor.type].emplace_back(registerDescriptor);
if (moduleRegister.readWriteAccess.has_value()) {
auto& readWriteAccess = moduleRegister.readWriteAccess.value();
registerDescriptor.readable = readWriteAccess.find('r') != std::string::npos;
registerDescriptor.writable = readWriteAccess.find('w') != std::string::npos;
} else {
/*
* If the TDF doesn't specify the OCD read/write access for a register, we assume both
* are permitted.
*/
registerDescriptor.readable = true;
registerDescriptor.writable = true;
}
this->targetRegisterDescriptorsByType[registerDescriptor.type].insert(registerDescriptor);
}
}
}

View File

@@ -13,6 +13,7 @@ namespace Bloom::Targets::TargetDescription
std::optional<std::string> caption;
std::uint16_t offset;
std::uint16_t size;
std::optional<std::string> readWriteAccess;
};
struct RegisterGroup

View File

@@ -219,6 +219,10 @@ Register TargetDescriptionFile::generateRegisterFromXml(const QDomElement& xmlEl
reg.caption = xmlElement.attribute("caption").toStdString();
}
if (xmlElement.hasAttribute("ocd-rw")) {
reg.readWriteAccess = xmlElement.attribute("ocd-rw").toLower().toStdString();
}
bool conversionStatus;
reg.size = xmlElement.attribute("size").toUShort(nullptr, 10);
reg.offset = xmlElement.attribute("offset").toUShort(&conversionStatus, 16);