Updated target register interface with more generic register access & manipulation functions

This commit is contained in:
Nav
2021-08-07 17:28:54 +01:00
parent 7ebc447344
commit f4da255b75
6 changed files with 142 additions and 246 deletions

View File

@@ -267,20 +267,10 @@ void Avr8::clearAllBreakpoints() {
this->avr8Interface->clearAllBreakpoints();
}
TargetRegisters Avr8::readGeneralPurposeRegisters(std::set<std::size_t> registerIds) {
return this->avr8Interface->readGeneralPurposeRegisters(registerIds);
}
void Avr8::writeRegisters(const TargetRegisters& registers) {
TargetRegisters gpRegisters;
for (const auto& targetRegister : registers) {
if (targetRegister.descriptor.type == TargetRegisterType::GENERAL_PURPOSE_REGISTER
&& targetRegister.descriptor.id.has_value()) {
gpRegisters.push_back(targetRegister);
} else if (targetRegister.descriptor.type == TargetRegisterType::PROGRAM_COUNTER) {
auto programCounterBytes = targetRegister.value;
void Avr8::writeRegisters(TargetRegisters registers) {
for (auto registerIt = registers.begin(); registerIt != registers.end();) {
if (registerIt->descriptor.type == TargetRegisterType::PROGRAM_COUNTER) {
auto programCounterBytes = registerIt->value;
if (programCounterBytes.size() < 4) {
// All PC register values should be at least 4 bytes in size
@@ -294,41 +284,37 @@ void Avr8::writeRegisters(const TargetRegisters& registers) {
| programCounterBytes[3]
));
} else if (targetRegister.descriptor.type == TargetRegisterType::STATUS_REGISTER) {
this->avr8Interface->setStatusRegister(targetRegister);
registerIt = registers.erase(registerIt);
} else if (targetRegister.descriptor.type == TargetRegisterType::STACK_POINTER) {
this->avr8Interface->setStackPointerRegister(targetRegister);
} else {
registerIt++;
}
}
if (!gpRegisters.empty()) {
this->avr8Interface->writeGeneralPurposeRegisters(gpRegisters);
if (!registers.empty()) {
this->avr8Interface->writeRegisters(registers);
}
}
TargetRegisters Avr8::readRegisters(const TargetRegisterDescriptors& descriptors) {
TargetRegisters Avr8::readRegisters(TargetRegisterDescriptors descriptors) {
TargetRegisters registers;
std::set<std::size_t> gpRegisterIds;
for (const auto& descriptor : descriptors) {
if (descriptor.type == TargetRegisterType::GENERAL_PURPOSE_REGISTER && descriptor.id.has_value()) {
gpRegisterIds.insert(descriptor.id.value());
for (auto registerDescriptorIt = descriptors.begin(); registerDescriptorIt != descriptors.end();) {
auto& descriptor = *registerDescriptorIt;
} else if (descriptor.type == TargetRegisterType::PROGRAM_COUNTER) {
if (descriptor.type == TargetRegisterType::PROGRAM_COUNTER) {
registers.push_back(this->getProgramCounterRegister());
} else if (descriptor.type == TargetRegisterType::STATUS_REGISTER) {
registers.push_back(this->getStatusRegister());
registerDescriptorIt = descriptors.erase(registerDescriptorIt);
} else if (descriptor.type == TargetRegisterType::STACK_POINTER) {
registers.push_back(this->getStackPointerRegister());
} else {
registerDescriptorIt++;
}
}
if (!gpRegisterIds.empty()) {
auto gpRegisters = this->readGeneralPurposeRegisters(gpRegisterIds);
registers.insert(registers.end(), gpRegisters.begin(), gpRegisters.end());
if (!descriptors.empty()) {
auto otherRegisters = this->avr8Interface->readRegisters(descriptors);
registers.insert(registers.end(), otherRegisters.begin(), otherRegisters.end());
}
return registers;
@@ -361,14 +347,6 @@ TargetRegister Avr8::getProgramCounterRegister() {
});
}
TargetRegister Avr8::getStackPointerRegister() {
return this->avr8Interface->getStackPointerRegister();
}
TargetRegister Avr8::getStatusRegister() {
return this->avr8Interface->getStatusRegister();
}
void Avr8::setProgramCounter(std::uint32_t programCounter) {
this->avr8Interface->setProgramCounter(programCounter);
}

View File

@@ -124,9 +124,8 @@ namespace Bloom::Targets::Microchip::Avr::Avr8Bit
void removeBreakpoint(std::uint32_t address) override;
void clearAllBreakpoints() override;
TargetRegisters readGeneralPurposeRegisters(std::set<std::size_t> registerIds) override;
void writeRegisters(const TargetRegisters& registers) override;
TargetRegisters readRegisters(const TargetRegisterDescriptors& descriptors) override;
void writeRegisters(TargetRegisters registers) override;
TargetRegisters readRegisters(TargetRegisterDescriptors descriptors) override;
TargetMemoryBuffer readMemory(
TargetMemoryType memoryType,
@@ -142,12 +141,9 @@ namespace Bloom::Targets::Microchip::Avr::Avr8Bit
TargetState getState() override;
std::uint32_t getProgramCounter() override;
TargetRegister getProgramCounterRegister() override;
TargetRegister getProgramCounterRegister();
void setProgramCounter(std::uint32_t programCounter) override;
TargetRegister getStackPointerRegister() override;
TargetRegister getStatusRegister() override;
std::map<int, TargetPinState> getPinStates(int variantId) override;
void setPinState(
int variantId,