diff --git a/Core/GbCpu.cpp b/Core/GbCpu.cpp index 88b6ca4..df14b97 100644 --- a/Core/GbCpu.cpp +++ b/Core/GbCpu.cpp @@ -366,7 +366,7 @@ void GbCpu::HalfCycle() uint8_t GbCpu::ReadOpCode() { HalfCycle(); - uint8_t value = _memoryManager->Read(_state.PC, MemoryOperationType::ExecOpCode); + uint8_t value = _memoryManager->Read(_state.PC); HalfCycle(); _state.PC++; return value; @@ -375,7 +375,7 @@ uint8_t GbCpu::ReadOpCode() uint8_t GbCpu::ReadCode() { HalfCycle(); - uint8_t value = _memoryManager->Read(_state.PC, MemoryOperationType::ExecOperand); + uint8_t value = _memoryManager->Read(_state.PC); HalfCycle(); _state.PC++; return value; @@ -391,7 +391,7 @@ uint16_t GbCpu::ReadCodeWord() uint8_t GbCpu::Read(uint16_t addr) { HalfCycle(); - uint8_t value = _memoryManager->Read(addr, MemoryOperationType::Read); + uint8_t value = _memoryManager->Read(addr); HalfCycle(); return value; } diff --git a/Core/GbDmaController.cpp b/Core/GbDmaController.cpp index f989232..874b2d1 100644 --- a/Core/GbDmaController.cpp +++ b/Core/GbDmaController.cpp @@ -117,11 +117,11 @@ void GbDmaController::ProcessDmaBlock() //2 or 4 cycles per byte transfered (2x more cycles in high speed mode - effective speed is the same in both modes _memoryManager->Exec(); - uint8_t value = _memoryManager->Read(_state.CgbDmaSource + i, MemoryOperationType::DmaRead); + uint8_t value = _memoryManager->Read(_state.CgbDmaSource + i); if(_memoryManager->IsHighSpeed()) { _memoryManager->Exec(); } - _memoryManager->Write(dst, value); + _memoryManager->Write(dst, value); } //Source/Dest/Length are all modified by the DMA process and keep their last value after DMA completes diff --git a/Core/GbMemoryManager.cpp b/Core/GbMemoryManager.cpp index 9559a78..63d232f 100644 --- a/Core/GbMemoryManager.cpp +++ b/Core/GbMemoryManager.cpp @@ -139,7 +139,8 @@ void GbMemoryManager::Unmap(uint16_t start, uint16_t end) } } -uint8_t GbMemoryManager::Read(uint16_t addr, MemoryOperationType opType) +template +uint8_t GbMemoryManager::Read(uint16_t addr) { uint8_t value = 0; if(_state.IsReadRegister[addr >> 8]) { @@ -174,9 +175,10 @@ uint8_t GbMemoryManager::ReadDma(uint16_t addr) return value; } +template void GbMemoryManager::Write(uint16_t addr, uint8_t value) { - _console->ProcessMemoryWrite(addr, value, MemoryOperationType::Write); + _console->ProcessMemoryWrite(addr, value, type); if(_state.IsWriteRegister[addr >> 8]) { WriteRegister(addr, value); } else if(_writes[addr >> 8]) { @@ -458,3 +460,10 @@ void GbMemoryManager::Serialize(Serializer& s) RefreshMappings(); } } + +template uint8_t GbMemoryManager::Read(uint16_t addr); +template uint8_t GbMemoryManager::Read(uint16_t addr); +template uint8_t GbMemoryManager::Read(uint16_t addr); +template uint8_t GbMemoryManager::Read(uint16_t addr); +template void GbMemoryManager::Write(uint16_t addr, uint8_t value); +template void GbMemoryManager::Write(uint16_t addr, uint8_t value); \ No newline at end of file diff --git a/Core/GbMemoryManager.h b/Core/GbMemoryManager.h index 6baa2b5..2fdf493 100644 --- a/Core/GbMemoryManager.h +++ b/Core/GbMemoryManager.h @@ -14,6 +14,8 @@ class EmuSettings; class Console; class ControlManager; +enum class MemoryOperationType; + class GbMemoryManager : public ISerializable { private: @@ -48,10 +50,14 @@ public: void Exec(); - uint8_t Read(uint16_t addr, MemoryOperationType opType); + template + uint8_t Read(uint16_t addr); + bool IsOamDmaRunning(); void WriteDma(uint16_t addr, uint8_t value); uint8_t ReadDma(uint16_t addr); + + template void Write(uint16_t addr, uint8_t value); uint8_t ReadRegister(uint16_t addr); diff --git a/UI/Debugger/EventViewer/ctrlEventViewerPpuView.cs b/UI/Debugger/EventViewer/ctrlEventViewerPpuView.cs index ae30fb8..7869b0c 100644 --- a/UI/Debugger/EventViewer/ctrlEventViewerPpuView.cs +++ b/UI/Debugger/EventViewer/ctrlEventViewerPpuView.cs @@ -234,7 +234,7 @@ namespace Mesen.GUI.Debugger switch(evt.Type) { case DebugEventType.Register: bool isWrite = evt.Operation.Type == MemoryOperationType.Write || evt.Operation.Type == MemoryOperationType.DmaWrite; - bool isDma = evt.Operation.Type == MemoryOperationType.DmaWrite|| evt.Operation.Type == MemoryOperationType.DmaRead; + bool isDma = evt.Operation.Type == MemoryOperationType.DmaWrite || evt.Operation.Type == MemoryOperationType.DmaRead; CodeLabel label = LabelManager.GetLabel(new AddressInfo() { Address = (int)evt.Operation.Address, Type = SnesMemoryType.CpuMemory }); string registerText = "$" + evt.Operation.Address.ToString("X4"); @@ -245,7 +245,7 @@ namespace Mesen.GUI.Debugger values["Register"] = registerText + (isWrite ? " (Write)" : " (Read)") + (isDma ? " (DMA)" : ""); values["Value"] = "$" + evt.Operation.Value.ToString("X2"); - if(isDma) { + if(isDma && !_isGameboy) { bool indirectHdma = false; values["Channel"] = (evt.DmaChannel & 0x07).ToString();