From a7c1e0d0d7254963e129154321f389d85ac8dd42 Mon Sep 17 00:00:00 2001 From: Pierre Bourdon Date: Sat, 25 Jan 2014 21:13:50 +0100 Subject: [PATCH] MMIO: Port the AI MMIOs to the new interface. --- Source/Core/Core/HW/AudioInterface.cpp | 96 ++++++++++---------------- Source/Core/Core/HW/AudioInterface.h | 3 + Source/Core/Core/HW/Memmap.cpp | 3 + 3 files changed, 44 insertions(+), 58 deletions(-) diff --git a/Source/Core/Core/HW/AudioInterface.cpp b/Source/Core/Core/HW/AudioInterface.cpp index 70a4dd099c..796bac4ecf 100644 --- a/Source/Core/Core/HW/AudioInterface.cpp +++ b/Source/Core/Core/HW/AudioInterface.cpp @@ -62,6 +62,7 @@ This file mainly deals with the [Drive I/F], however [AIDFR] controls #include "../PowerPC/PowerPC.h" #include "../CoreTiming.h" #include "SystemTimers.h" +#include "MMIO.h" namespace AudioInterface { @@ -170,43 +171,12 @@ void Shutdown() { } -void Read32(u32& _rReturnValue, const u32 _Address) +void RegisterMMIO(MMIO::Mapping* mmio, u32 base) { - switch (_Address & 0xFFFF) - { - case AI_CONTROL_REGISTER: - _rReturnValue = m_Control.hex; - break; - - case AI_VOLUME_REGISTER: - _rReturnValue = m_Volume.hex; - break; - - case AI_SAMPLE_COUNTER: - Update(0, 0); - _rReturnValue = m_SampleCounter; - break; - - case AI_INTERRUPT_TIMING: - _rReturnValue = m_InterruptTiming; - break; - - default: - ERROR_LOG(AUDIO_INTERFACE, "Unknown read 0x%08x", _Address); - _dbg_assert_msg_(AUDIO_INTERFACE, 0, "AudioInterface - Read from 0x%08x", _Address); - _rReturnValue = 0; - return; - } - DEBUG_LOG(AUDIO_INTERFACE, "r32 %08x %08x", _Address, _rReturnValue); -} - -void Write32(const u32 _Value, const u32 _Address) -{ - switch (_Address & 0xFFFF) - { - case AI_CONTROL_REGISTER: - { - AICR tmpAICtrl(_Value); + mmio->Register(base | AI_CONTROL_REGISTER, + MMIO::DirectRead(&m_Control.hex), + MMIO::ComplexWrite([](u32, u32 val) { + AICR tmpAICtrl(val); m_Control.AIINTMSK = tmpAICtrl.AIINTMSK; m_Control.AIINTVLD = tmpAICtrl.AIINTVLD; @@ -260,32 +230,42 @@ void Write32(const u32 _Value, const u32 _Address) } UpdateInterrupts(); - } - break; + }) + ); - case AI_VOLUME_REGISTER: - m_Volume.hex = _Value; - DEBUG_LOG(AUDIO_INTERFACE, "Set volume: left(%02x) right(%02x)", m_Volume.left, m_Volume.right); - break; + mmio->Register(base | AI_VOLUME_REGISTER, + MMIO::DirectRead(&m_Volume.hex), + MMIO::DirectWrite(&m_Volume.hex) + ); - case AI_SAMPLE_COUNTER: - // Why was this commented out? Does something do this? - _dbg_assert_msg_(AUDIO_INTERFACE, 0, "AIS - sample counter is read only"); - m_SampleCounter = _Value; - break; + mmio->Register(base | AI_SAMPLE_COUNTER, + MMIO::ComplexRead([](u32) { + Update(0, 0); + return m_SampleCounter; + }), + MMIO::DirectWrite(&m_SampleCounter) + ); - case AI_INTERRUPT_TIMING: - m_InterruptTiming = _Value; - CoreTiming::RemoveEvent(et_AI); - CoreTiming::ScheduleEvent(((int)GetAIPeriod() / 2), et_AI); - DEBUG_LOG(AUDIO_INTERFACE, "Set interrupt: %08x samples", m_InterruptTiming); - break; + mmio->Register(base | AI_INTERRUPT_TIMING, + MMIO::DirectRead(&m_InterruptTiming), + MMIO::ComplexWrite([](u32, u32 val) { + m_InterruptTiming = val; + CoreTiming::RemoveEvent(et_AI); + CoreTiming::ScheduleEvent(((int)GetAIPeriod() / 2), et_AI); + }) + ); +} - default: - ERROR_LOG(AUDIO_INTERFACE, "Unknown write %08x @ %08x", _Value, _Address); - _dbg_assert_msg_(AUDIO_INTERFACE,0,"AIS - Write %08x to %08x", _Value, _Address); - break; - } +void Read32(u32& _rReturnValue, const u32 _Address) +{ + // HACK: Remove this function when the new MMIO interface is used. + Memory::mmio_mapping->Read(_Address, _rReturnValue); +} + +void Write32(const u32 _Value, const u32 _Address) +{ + // HACK: Remove this function when the new MMIO interface is used. + Memory::mmio_mapping->Write(_Address, _Value); } static void UpdateInterrupts() diff --git a/Source/Core/Core/HW/AudioInterface.h b/Source/Core/Core/HW/AudioInterface.h index 25086b3df4..8bb09b78ae 100644 --- a/Source/Core/Core/HW/AudioInterface.h +++ b/Source/Core/Core/HW/AudioInterface.h @@ -9,6 +9,7 @@ #include "CommonTypes.h" class PointerWrap; +namespace MMIO { class Mapping; } namespace AudioInterface { @@ -17,6 +18,8 @@ void Init(); void Shutdown(); void DoState(PointerWrap &p); +void RegisterMMIO(MMIO::Mapping* mmio, u32 base); + void Update(u64 userdata, int cyclesLate); // Called by DSP emulator diff --git a/Source/Core/Core/HW/Memmap.cpp b/Source/Core/Core/HW/Memmap.cpp index f510ecb9ca..9e84ca5645 100644 --- a/Source/Core/Core/HW/Memmap.cpp +++ b/Source/Core/Core/HW/Memmap.cpp @@ -316,6 +316,7 @@ void InitMMIO(MMIO::Mapping* mmio) DSP::RegisterMMIO(mmio, 0xCC005000); DVDInterface::RegisterMMIO(mmio, 0xCC006000); SerialInterface::RegisterMMIO(mmio, 0xCC006400); + AudioInterface::RegisterMMIO(mmio, 0xCC006C00); } void InitMMIOWii(MMIO::Mapping* mmio) @@ -328,6 +329,8 @@ void InitMMIOWii(MMIO::Mapping* mmio) DVDInterface::RegisterMMIO(mmio, 0xCD006000); SerialInterface::RegisterMMIO(mmio, 0xCC006400); SerialInterface::RegisterMMIO(mmio, 0xCD006400); + AudioInterface::RegisterMMIO(mmio, 0xCC006C00); + AudioInterface::RegisterMMIO(mmio, 0xCD006C00); } writeFn32 GetHWWriteFun32(const u32 _Address)