Debugger: Added missing effective addresses on some instructions

This commit is contained in:
Sour 2019-07-16 20:38:19 -04:00
parent c96e37145f
commit 778da40740
2 changed files with 45 additions and 2 deletions

View file

@ -105,8 +105,7 @@ uint32_t CpuDisUtils::GetOperandAddress(DisassemblyInfo &info, uint32_t memoryAd
int32_t CpuDisUtils::GetEffectiveAddress(DisassemblyInfo &info, Console *console, CpuState &state)
{
AddrMode addrMode = CpuDisUtils::OpMode[info.GetOpCode()];
if(addrMode != AddrMode::Rel && addrMode != AddrMode::RelLng && addrMode > AddrMode::ImmM && info.GetOpSize() < 4) {
if(HasEffectiveAddress(CpuDisUtils::OpMode[info.GetOpCode()])) {
DummyCpu cpu(console);
state.PS &= ~(ProcFlags::IndexMode8 | ProcFlags::MemoryMode8);
state.PS |= info.GetFlags();
@ -117,6 +116,48 @@ int32_t CpuDisUtils::GetEffectiveAddress(DisassemblyInfo &info, Console *console
return -1;
}
bool CpuDisUtils::HasEffectiveAddress(AddrMode addrMode)
{
switch(addrMode) {
case AddrMode::Acc:
case AddrMode::Imp:
case AddrMode::Stk:
case AddrMode::Sig8:
case AddrMode::Imm8:
case AddrMode::Rel:
case AddrMode::RelLng:
case AddrMode::Imm16:
case AddrMode::BlkMov:
case AddrMode::AbsLngJmp:
case AddrMode::AbsLng:
case AddrMode::ImmX:
case AddrMode::ImmM:
case AddrMode::AbsJmp:
return false;
case AddrMode::DirIdxIndX:
case AddrMode::DirIdxX:
case AddrMode::DirIdxY:
case AddrMode::DirIndIdxY:
case AddrMode::DirIndLngIdxY:
case AddrMode::DirIndLng:
case AddrMode::DirInd:
case AddrMode::Dir:
case AddrMode::StkRel:
case AddrMode::StkRelIndIdxY:
case AddrMode::Abs:
case AddrMode::AbsIdxXInd:
case AddrMode::AbsIdxX:
case AddrMode::AbsIdxY:
case AddrMode::AbsLngIdxX:
case AddrMode::AbsInd:
case AddrMode::AbsIndLng:
return true;
}
throw std::runtime_error("Invalid mode");
}
uint8_t CpuDisUtils::GetOpSize(AddrMode addrMode, uint8_t flags)
{
switch(addrMode) {

View file

@ -15,6 +15,8 @@ private:
static uint32_t GetOperandAddress(DisassemblyInfo &info, uint32_t memoryAddr);
static uint8_t GetOpSize(AddrMode addrMode, uint8_t flags);
static bool HasEffectiveAddress(AddrMode addrMode);
public:
static void GetDisassembly(DisassemblyInfo &info, string &out, uint32_t memoryAddr, LabelManager* labelManager);
static uint8_t GetOpSize(uint8_t opCode, uint8_t flags);