diff --git a/Core/BaseMapper.cpp b/Core/BaseMapper.cpp index 9b5f9f1a..c27e6987 100644 --- a/Core/BaseMapper.cpp +++ b/Core/BaseMapper.cpp @@ -803,9 +803,12 @@ uint8_t BaseMapper::InternalReadVRAM(uint16_t addr) return _vramOpenBusValue >= 0 ? _vramOpenBusValue : addr; } -uint8_t BaseMapper::DebugReadVRAM(uint16_t addr) +uint8_t BaseMapper::DebugReadVRAM(uint16_t addr, bool disableSideEffects) { ProcessVramAccess(addr); + if(!disableSideEffects) { + NotifyVRAMAddressChange(addr); + } return InternalReadVRAM(addr); } @@ -814,9 +817,13 @@ uint8_t BaseMapper::MapperReadVRAM(uint16_t addr, MemoryOperationType operationT return InternalReadVRAM(addr); } -void BaseMapper::InternalWriteVRAM(uint16_t addr, uint8_t value) +void BaseMapper::DebugWriteVRAM(uint16_t addr, uint8_t value, bool disableSideEffects) { - if(_chrPages[addr >> 8]) { + ProcessVramAccess(addr); + if(!disableSideEffects) { + NotifyVRAMAddressChange(addr); + } + if(_chrPageAccessType[addr >> 8] & MemoryAccessType::Write) { _chrPages[addr >> 8][(uint8_t)addr] = value; } } diff --git a/Core/BaseMapper.h b/Core/BaseMapper.h index 0377e1c1..f1886387 100644 --- a/Core/BaseMapper.h +++ b/Core/BaseMapper.h @@ -186,11 +186,11 @@ public: return value; } - void InternalWriteVRAM(uint16_t addr, uint8_t value); + void DebugWriteVRAM(uint16_t addr, uint8_t value, bool disableSideEffects = true); void WriteVRAM(uint16_t addr, uint8_t value); __forceinline void ProcessVramAccess(uint16_t &addr); - uint8_t DebugReadVRAM(uint16_t addr); + uint8_t DebugReadVRAM(uint16_t addr, bool disableSideEffects = true); static void InitializeRam(void* data, uint32_t length); diff --git a/Core/LuaApi.cpp b/Core/LuaApi.cpp index a16aade4..2e6a489c 100644 --- a/Core/LuaApi.cpp +++ b/Core/LuaApi.cpp @@ -57,12 +57,8 @@ int LuaApi::GetLibrary(lua_State *lua) static const luaL_Reg apilib[] = { { "read", LuaApi::ReadMemory }, { "write", LuaApi::WriteMemory }, - { "debugRead", LuaApi::DebugReadMemory }, - { "debugWrite", LuaApi::DebugWriteMemory }, { "readWord", LuaApi::ReadMemoryWord }, { "writeWord", LuaApi::WriteMemoryWord }, - { "debugReadWord", LuaApi::DebugReadMemoryWord }, - { "debugWriteWord", LuaApi::DebugWriteMemoryWord }, { "revertPrgChrChanges", LuaApi::RevertPrgChrChanges }, { "addMemoryCallback", LuaApi::RegisterMemoryCallback }, { "removeMemoryCallback", LuaApi::UnregisterMemoryCallback }, @@ -114,6 +110,8 @@ int LuaApi::GetLibrary(lua_State *lua) lua_pushintvalue(chrRam, DebugMemoryType::ChrRam); lua_pushintvalue(workRam, DebugMemoryType::WorkRam); lua_pushintvalue(saveRam, DebugMemoryType::SaveRam); + lua_pushintvalue(cpuDebug, DebugMemoryType::CpuMemory | 0x100); + lua_pushintvalue(ppuDebug, DebugMemoryType::PpuMemory | 0x100); lua_settable(lua, -3); lua_pushliteral(lua, "memCallbackType"); @@ -150,11 +148,13 @@ int LuaApi::ReadMemory(lua_State *lua) LuaCallHelper l(lua); l.ForceParamCount(3); bool returnSignedValue = l.ReadBool(); - DebugMemoryType type = (DebugMemoryType)l.ReadInteger(); + int type = l.ReadInteger(); + bool disableSideEffects = (type & 0x100) == 0x100; + DebugMemoryType memType = (DebugMemoryType)(type & 0xFF); int address = l.ReadInteger(); checkminparams(2); errorCond(address < 0, "address must be >= 0"); - uint8_t value = _memoryDumper->GetMemoryValue(type, address, false); + uint8_t value = _memoryDumper->GetMemoryValue(memType, address, disableSideEffects); l.Return(returnSignedValue ? (int8_t)value : value); return l.ReturnCount(); } @@ -162,40 +162,15 @@ int LuaApi::ReadMemory(lua_State *lua) int LuaApi::WriteMemory(lua_State *lua) { LuaCallHelper l(lua); - DebugMemoryType type = (DebugMemoryType)l.ReadInteger(); + int type = l.ReadInteger(); + bool disableSideEffects = (type & 0x100) == 0x100; + DebugMemoryType memType = (DebugMemoryType)(type & 0xFF); int value = l.ReadInteger(); int address = l.ReadInteger(); checkparams(); errorCond(value > 255 || value < -128, "value out of range"); errorCond(address < 0, "address must be >= 0"); - _memoryDumper->SetMemoryValue(type, address, value, false, false); - return l.ReturnCount(); -} - -int LuaApi::DebugReadMemory(lua_State *lua) -{ - LuaCallHelper l(lua); - l.ForceParamCount(3); - bool returnSignedValue = l.ReadBool(); - DebugMemoryType type = (DebugMemoryType)l.ReadInteger(); - int address = l.ReadInteger(); - checkminparams(2); - errorCond(address < 0, "address must be >= 0"); - uint8_t value = _memoryDumper->GetMemoryValue(type, address, true); - l.Return(returnSignedValue ? (int8_t)value : value); - return l.ReturnCount(); -} - -int LuaApi::DebugWriteMemory(lua_State *lua) -{ - LuaCallHelper l(lua); - DebugMemoryType type = (DebugMemoryType)l.ReadInteger(); - int value = l.ReadInteger(); - int address = l.ReadInteger(); - checkparams(); - errorCond(value > 255 || value < -128, "value out of range"); - errorCond(address < 0, "address must be >= 0"); - _memoryDumper->SetMemoryValue(type, address, value, false, true); + _memoryDumper->SetMemoryValue(memType, address, value, false, disableSideEffects); return l.ReturnCount(); } @@ -204,11 +179,13 @@ int LuaApi::ReadMemoryWord(lua_State *lua) LuaCallHelper l(lua); l.ForceParamCount(3); bool returnSignedValue = l.ReadBool(); - DebugMemoryType type = (DebugMemoryType)l.ReadInteger(); + int type = l.ReadInteger(); + bool disableSideEffects = (type & 0x100) == 0x100; + DebugMemoryType memType = (DebugMemoryType)(type & 0xFF); int address = l.ReadInteger(); checkminparams(2); errorCond(address < 0, "address must be >= 0"); - uint16_t value = _memoryDumper->GetMemoryValueWord(type, address, false); + uint16_t value = _memoryDumper->GetMemoryValueWord(memType, address, disableSideEffects); l.Return(returnSignedValue ? (int16_t)value : value); return l.ReturnCount(); } @@ -216,40 +193,15 @@ int LuaApi::ReadMemoryWord(lua_State *lua) int LuaApi::WriteMemoryWord(lua_State *lua) { LuaCallHelper l(lua); - DebugMemoryType type = (DebugMemoryType)l.ReadInteger(); + int type = l.ReadInteger(); + bool disableSideEffects = (type & 0x100) == 0x100; + DebugMemoryType memType = (DebugMemoryType)(type & 0xFF); int value = l.ReadInteger(); int address = l.ReadInteger(); checkparams(); errorCond(value > 65535 || value < -32768, "value out of range"); errorCond(address < 0, "address must be >= 0"); - _memoryDumper->SetMemoryValueWord(type, address, value, false, false); - return l.ReturnCount(); -} - -int LuaApi::DebugReadMemoryWord(lua_State *lua) -{ - LuaCallHelper l(lua); - l.ForceParamCount(3); - bool returnSignedValue = l.ReadBool(); - DebugMemoryType type = (DebugMemoryType)l.ReadInteger(); - int address = l.ReadInteger(); - checkminparams(2); - errorCond(address < 0, "address must be >= 0"); - uint16_t value = _memoryDumper->GetMemoryValueWord(type, address, true); - l.Return(returnSignedValue ? (int16_t)value : value); - return l.ReturnCount(); -} - -int LuaApi::DebugWriteMemoryWord(lua_State *lua) -{ - LuaCallHelper l(lua); - DebugMemoryType type = (DebugMemoryType)l.ReadInteger(); - int value = l.ReadInteger(); - int address = l.ReadInteger(); - checkparams(); - errorCond(value > 65535 || value < -32768, "value out of range"); - errorCond(address < 0, "address must be >= 0"); - _memoryDumper->SetMemoryValueWord(type, address, value, false, true); + _memoryDumper->SetMemoryValueWord(memType, address, value, false, disableSideEffects); return l.ReturnCount(); } diff --git a/Core/MemoryDumper.cpp b/Core/MemoryDumper.cpp index a4770fc3..b3d1718d 100644 --- a/Core/MemoryDumper.cpp +++ b/Core/MemoryDumper.cpp @@ -146,27 +146,26 @@ void MemoryDumper::SetMemoryValue(DebugMemoryType memoryType, uint32_t address, } break; - case DebugMemoryType::InternalRam: _memoryManager->DebugWrite(address, value, disableSideEffects); break; - + case DebugMemoryType::PpuMemory: _mapper->DebugWriteVRAM(address, value, disableSideEffects); break; case DebugMemoryType::PaletteMemory: _ppu->WritePaletteRAM(address, value); break; case DebugMemoryType::SpriteMemory: _ppu->GetSpriteRam()[address] = value; break; case DebugMemoryType::SecondarySpriteMemory: _ppu->GetSecondarySpriteRam()[address] = value; break; - case DebugMemoryType::PpuMemory: _mapper->InternalWriteVRAM(address, value); break; - - case DebugMemoryType::ChrRam: - case DebugMemoryType::WorkRam: - case DebugMemoryType::SaveRam: - case DebugMemoryType::ChrRom: - _mapper->SetMemoryValue(memoryType, address, value); - break; - case DebugMemoryType::PrgRom: _mapper->SetMemoryValue(memoryType, address, value); if(!preventRebuildCache) { _disassembler->RebuildPrgRomCache(address, 1); } break; + + case DebugMemoryType::ChrRom: + case DebugMemoryType::ChrRam: + case DebugMemoryType::WorkRam: + case DebugMemoryType::SaveRam: + _mapper->SetMemoryValue(memoryType, address, value); + break; + + case DebugMemoryType::InternalRam: _memoryManager->DebugWrite(address, value); break; } } @@ -201,20 +200,19 @@ uint8_t MemoryDumper::GetMemoryValue(DebugMemoryType memoryType, uint32_t addres } break; - case DebugMemoryType::InternalRam: return _memoryManager->DebugRead(address, disableSideEffects); - + case DebugMemoryType::PpuMemory: return _mapper->DebugReadVRAM(address, disableSideEffects); case DebugMemoryType::PaletteMemory: return _ppu->ReadPaletteRAM(address); case DebugMemoryType::SpriteMemory: return _ppu->GetSpriteRam()[address]; case DebugMemoryType::SecondarySpriteMemory: return _ppu->GetSecondarySpriteRam()[address]; - case DebugMemoryType::PpuMemory: return _mapper->InternalReadVRAM(address); - + case DebugMemoryType::PrgRom: + case DebugMemoryType::ChrRom: case DebugMemoryType::ChrRam: case DebugMemoryType::WorkRam: case DebugMemoryType::SaveRam: - case DebugMemoryType::PrgRom: - case DebugMemoryType::ChrRom: return _mapper->GetMemoryValue(memoryType, address); + + case DebugMemoryType::InternalRam: return _memoryManager->DebugRead(address); } return 0;