diff --git a/src/Targets/Microchip/AVR/AVR8/Avr8.cpp b/src/Targets/Microchip/AVR/AVR8/Avr8.cpp index 5bfc0d6e..4c20f6ad 100644 --- a/src/Targets/Microchip/AVR/AVR8/Avr8.cpp +++ b/src/Targets/Microchip/AVR/AVR8/Avr8.cpp @@ -254,6 +254,19 @@ void Avr8::setProgramCounter(std::uint32_t programCounter) { this->avr8Interface->setProgramCounter(programCounter); } +std::uint32_t Avr8::getStackPointer() { + const auto stackPointerRegister = this->readRegisters( + {this->targetRegisterDescriptorsByType.at(TargetRegisterType::STACK_POINTER)} + ).front(); + + std::uint32_t stackPointer = 0; + for (std::size_t i = 0; i < stackPointerRegister.size() && i < 4; i++) { + stackPointer = (stackPointer << (8 * i)) | stackPointerRegister.value[i]; + } + + return stackPointer; +} + std::map Avr8::getPinStates(int variantId) { if (!this->targetVariantsById.contains(variantId)) { throw Exception("Invalid target variant ID"); diff --git a/src/Targets/Microchip/AVR/AVR8/Avr8.hpp b/src/Targets/Microchip/AVR/AVR8/Avr8.hpp index 0183cc26..0605c4d2 100644 --- a/src/Targets/Microchip/AVR/AVR8/Avr8.hpp +++ b/src/Targets/Microchip/AVR/AVR8/Avr8.hpp @@ -109,6 +109,8 @@ namespace Bloom::Targets::Microchip::Avr::Avr8Bit TargetRegister getProgramCounterRegister(); void setProgramCounter(std::uint32_t programCounter) override; + std::uint32_t getStackPointer() override; + std::map getPinStates(int variantId) override; void setPinState( const TargetPinDescriptor& pinDescriptor, diff --git a/src/Targets/Target.hpp b/src/Targets/Target.hpp index ba292be2..fa7d56a1 100644 --- a/src/Targets/Target.hpp +++ b/src/Targets/Target.hpp @@ -275,6 +275,13 @@ namespace Bloom::Targets */ virtual void setProgramCounter(std::uint32_t programCounter) = 0; + /** + * Should fetch the current stack pointer value. + * + * @return + */ + virtual std::uint32_t getStackPointer() = 0; + /** * Should get the current pin states for each pin on the target, mapped by pin number *