diff --git a/Core/CPU.h b/Core/CPU.h index eca49264..d8c42a06 100644 --- a/Core/CPU.h +++ b/Core/CPU.h @@ -90,7 +90,7 @@ private: void DummyRead() { - MemoryRead(_state.PC, MemoryOperationType::ExecOperand); + MemoryRead(_state.PC, MemoryOperationType::Read); } uint8_t ReadByte() diff --git a/Core/Disassembler.cpp b/Core/Disassembler.cpp index a82c7214..af045fa4 100644 --- a/Core/Disassembler.cpp +++ b/Core/Disassembler.cpp @@ -104,18 +104,21 @@ uint32_t Disassembler::BuildCache(uint32_t absoluteAddr, uint16_t memoryAddr) } return memoryAddr; } else { - while(!_disassembleCache[absoluteAddr]) { - shared_ptr disInfo(new DisassemblyInfo(&_prgROM[absoluteAddr])); - _disassembleCache[absoluteAddr] = disInfo; + if(!_disassembleCache[absoluteAddr]) { + while(absoluteAddr < _prgSize && !_disassembleCache[absoluteAddr]) { + shared_ptr disInfo(new DisassemblyInfo(&_prgROM[absoluteAddr])); + _disassembleCache[absoluteAddr] = disInfo; - uint8_t opCode = _prgROM[absoluteAddr]; - if(opCode == 0x10 || opCode == 0x20 || opCode == 0x30 || opCode == 0x40 || opCode == 0x50 || opCode == 0x60 || opCode == 0x70 || opCode == 0x90 || opCode == 0xB0 || opCode == 0xD0 || opCode == 0xF0 || opCode == 0x4C || opCode == 0x6C) { - //Hit a jump/return instruction, can't assume that what follows is actual code, stop disassembling - break; + uint8_t opCode = _prgROM[absoluteAddr]; + absoluteAddr += disInfo->GetSize(); + if(opCode == 0x10 || opCode == 0x20 || opCode == 0x30 || opCode == 0x40 || opCode == 0x50 || opCode == 0x60 || opCode == 0x70 || opCode == 0x90 || opCode == 0xB0 || opCode == 0xD0 || opCode == 0xF0 || opCode == 0x4C || opCode == 0x6C) { + //Hit a jump/return instruction, can't assume that what follows is actual code, stop disassembling + break; + } } - absoluteAddr += disInfo->GetSize(); + } else { + absoluteAddr += _disassembleCache[absoluteAddr]->GetSize(); } - absoluteAddr += _disassembleCache[absoluteAddr]->GetSize(); return absoluteAddr; } }