Cemu/src/Cafe/HW/ACR/ACR.cpp
2022-08-22 22:21:23 +02:00

68 lines
1.8 KiB
C++

#include "Cafe/HW/MMU/MMU.h"
#include "Cafe/HW/Common/HwReg.h"
namespace HW_ACR
{
struct
{
HWREG::ACR_VI_ADDR viAddr;
HWREG::ACR_VI_CTRL viCtrl;
}g_acr;
/*
Is this some kind of VI emulation interface?
Pattern seen in Twilight Princess HD:
- If Hollywood hardware then read/write old 16bit GC VI register directly
- Otherwise these steps are performed:
VICONTROL |= 1
VIADDR = registerIndex
VIDATA = data
VICONTROL &= ~1
All the register accesses here are 32bit
*/
/* 0x0D00021C | Accesses VI register currently selected by VIADDR */
HWREG::ACR_VI_DATA ACR_VIDATA_R32(PAddr addr)
{
forceLogDebug_printf("ACR_VIDATA read with selected reg %08x", g_acr.viAddr.get_ADDR());
return HWREG::ACR_VI_DATA();
}
void ACR_VIDATA_W32(PAddr addr, HWREG::ACR_VI_DATA newValue)
{
forceLogDebug_printf("ACR_VIDATA write %08x with selected reg %08x", newValue.get_DATA(), g_acr.viAddr.get_ADDR());
}
/* 0x0D000224 | Controls the selected VI register? */
HWREG::ACR_VI_ADDR ACR_VIADDR_R32(PAddr addr)
{
return g_acr.viAddr;
}
void ACR_VIADDR_W32(PAddr addr, HWREG::ACR_VI_ADDR newValue)
{
g_acr.viAddr = newValue;
}
/* 0x0D000228 | Some kind of VI interface control? */
HWREG::ACR_VI_CTRL ACR_VICONTROL_R32(PAddr addr)
{
return g_acr.viCtrl;
}
void ACR_VICONTROL_W32(PAddr addr, HWREG::ACR_VI_CTRL newValue)
{
g_acr.viCtrl = newValue;
}
RunAtCemuBoot _initACR([]()
{
MMU::RegisterMMIO_32<HWREG::ACR_VI_DATA, ACR_VIDATA_R32, ACR_VIDATA_W32>(MMU::MMIOInterface::INTERFACE_0D000000, 0x21C);
MMU::RegisterMMIO_32<HWREG::ACR_VI_ADDR, ACR_VIADDR_R32, ACR_VIADDR_W32>(MMU::MMIOInterface::INTERFACE_0D000000, 0x224);
MMU::RegisterMMIO_32<HWREG::ACR_VI_CTRL, ACR_VICONTROL_R32, ACR_VICONTROL_W32>(MMU::MMIOInterface::INTERFACE_0D000000, 0x228);
// init
});
}