UCodes: Eliminate unnecessary includes in header

This commit is contained in:
Lioncash 2017-01-28 05:27:17 -05:00
parent 3cda4e1d9c
commit 9f8177c9ac
16 changed files with 271 additions and 203 deletions

View File

@ -3,6 +3,7 @@
// Refer to the license.txt file included. // Refer to the license.txt file included.
#include "Core/HW/DSPHLE/UCodes/AX.h" #include "Core/HW/DSPHLE/UCodes/AX.h"
#include "Common/ChunkFile.h" #include "Common/ChunkFile.h"
#include "Common/CommonFuncs.h" #include "Common/CommonFuncs.h"
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
@ -10,6 +11,8 @@
#include "Common/Logging/Log.h" #include "Common/Logging/Log.h"
#include "Common/MathUtil.h" #include "Common/MathUtil.h"
#include "Core/HW/DSP.h" #include "Core/HW/DSP.h"
#include "Core/HW/DSPHLE/DSPHLE.h"
#include "Core/HW/DSPHLE/MailHandler.h"
#include "Core/HW/DSPHLE/UCodes/AXStructs.h" #include "Core/HW/DSPHLE/UCodes/AXStructs.h"
#define AX_GC #define AX_GC

View File

@ -19,6 +19,8 @@ namespace DSP
{ {
namespace HLE namespace HLE
{ {
class DSPHLE;
// We can't directly use the mixer_control field from the PB because it does // We can't directly use the mixer_control field from the PB because it does
// not mean the same in all AX versions. The AX UCode converts the // not mean the same in all AX versions. The AX UCode converts the
// mixer_control value to an AXMixControl bitfield. // mixer_control value to an AXMixControl bitfield.

View File

@ -5,12 +5,15 @@
#define AX_WII // Used in AXVoice. #define AX_WII // Used in AXVoice.
#include "Core/HW/DSPHLE/UCodes/AXWii.h" #include "Core/HW/DSPHLE/UCodes/AXWii.h"
#include "Common/ChunkFile.h" #include "Common/ChunkFile.h"
#include "Common/CommonFuncs.h" #include "Common/CommonFuncs.h"
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
#include "Common/Logging/Log.h" #include "Common/Logging/Log.h"
#include "Common/MathUtil.h" #include "Common/MathUtil.h"
#include "Common/StringUtil.h" #include "Common/StringUtil.h"
#include "Core/HW/DSPHLE/DSPHLE.h"
#include "Core/HW/DSPHLE/MailHandler.h"
#include "Core/HW/DSPHLE/UCodes/AXStructs.h" #include "Core/HW/DSPHLE/UCodes/AXStructs.h"
#include "Core/HW/DSPHLE/UCodes/AXVoice.h" #include "Core/HW/DSPHLE/UCodes/AXVoice.h"
#include "Core/HW/DSPHLE/UCodes/UCodes.h" #include "Core/HW/DSPHLE/UCodes/UCodes.h"

View File

@ -4,6 +4,7 @@
#pragma once #pragma once
#include "Common/CommonTypes.h"
#include "Core/HW/DSPHLE/UCodes/AX.h" #include "Core/HW/DSPHLE/UCodes/AX.h"
namespace DSP namespace DSP
@ -11,6 +12,7 @@ namespace DSP
namespace HLE namespace HLE
{ {
struct AXPBWii; struct AXPBWii;
class DSPHLE;
class AXWiiUCode : public AXUCode class AXWiiUCode : public AXUCode
{ {

View File

@ -3,6 +3,7 @@
// Refer to the license.txt file included. // Refer to the license.txt file included.
#include "Core/HW/DSPHLE/UCodes/CARD.h" #include "Core/HW/DSPHLE/UCodes/CARD.h"
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
#include "Common/Logging/Log.h" #include "Common/Logging/Log.h"
#include "Core/HW/DSP.h" #include "Core/HW/DSP.h"

View File

@ -4,12 +4,15 @@
#pragma once #pragma once
#include "Common/CommonTypes.h"
#include "Core/HW/DSPHLE/UCodes/UCodes.h" #include "Core/HW/DSPHLE/UCodes/UCodes.h"
namespace DSP namespace DSP
{ {
namespace HLE namespace HLE
{ {
class DSPHLE;
class CARDUCode : public UCodeInterface class CARDUCode : public UCodeInterface
{ {
public: public:

View File

@ -3,11 +3,14 @@
// Refer to the license.txt file included. // Refer to the license.txt file included.
#include "Core/HW/DSPHLE/UCodes/GBA.h" #include "Core/HW/DSPHLE/UCodes/GBA.h"
#include "Common/Align.h" #include "Common/Align.h"
#include "Common/CommonFuncs.h" #include "Common/CommonFuncs.h"
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
#include "Common/Logging/Log.h" #include "Common/Logging/Log.h"
#include "Core/HW/DSP.h" #include "Core/HW/DSP.h"
#include "Core/HW/DSPHLE/DSPHLE.h"
#include "Core/HW/DSPHLE/MailHandler.h"
#include "Core/HW/DSPHLE/UCodes/UCodes.h" #include "Core/HW/DSPHLE/UCodes/UCodes.h"
namespace DSP namespace DSP

View File

@ -4,12 +4,15 @@
#pragma once #pragma once
#include "Common/CommonTypes.h"
#include "Core/HW/DSPHLE/UCodes/UCodes.h" #include "Core/HW/DSPHLE/UCodes/UCodes.h"
namespace DSP namespace DSP
{ {
namespace HLE namespace HLE
{ {
class DSPHLE;
// Computes two 32 bit integers to be returned to the game, based on the // Computes two 32 bit integers to be returned to the game, based on the
// provided crypto parameters at the provided MRAM address. The integers are // provided crypto parameters at the provided MRAM address. The integers are
// written back to RAM at the dest address provided in the crypto parameters. // written back to RAM at the dest address provided in the crypto parameters.

View File

@ -3,8 +3,11 @@
// Refer to the license.txt file included. // Refer to the license.txt file included.
#include "Core/HW/DSPHLE/UCodes/INIT.h" #include "Core/HW/DSPHLE/UCodes/INIT.h"
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
#include "Common/Logging/Log.h" #include "Common/Logging/Log.h"
#include "Core/HW/DSPHLE/DSPHLE.h"
#include "Core/HW/DSPHLE/MailHandler.h"
#include "Core/HW/DSPHLE/UCodes/UCodes.h" #include "Core/HW/DSPHLE/UCodes/UCodes.h"
namespace DSP namespace DSP

View File

@ -4,12 +4,15 @@
#pragma once #pragma once
#include "Common/CommonTypes.h"
#include "Core/HW/DSPHLE/UCodes/UCodes.h" #include "Core/HW/DSPHLE/UCodes/UCodes.h"
namespace DSP namespace DSP
{ {
namespace HLE namespace HLE
{ {
class DSPHLE;
class INITUCode : public UCodeInterface class INITUCode : public UCodeInterface
{ {
public: public:

View File

@ -2,6 +2,8 @@
// Licensed under GPLv2+ // Licensed under GPLv2+
// Refer to the license.txt file included. // Refer to the license.txt file included.
#include "Core/HW/DSPHLE/UCodes/ROM.h"
#include <string> #include <string>
#ifdef _WIN32 #ifdef _WIN32
@ -15,7 +17,8 @@
#include "Common/Logging/Log.h" #include "Common/Logging/Log.h"
#include "Common/StringUtil.h" #include "Common/StringUtil.h"
#include "Core/ConfigManager.h" #include "Core/ConfigManager.h"
#include "Core/HW/DSPHLE/UCodes/ROM.h" #include "Core/HW/DSPHLE/DSPHLE.h"
#include "Core/HW/DSPHLE/MailHandler.h"
#include "Core/HW/DSPHLE/UCodes/UCodes.h" #include "Core/HW/DSPHLE/UCodes/UCodes.h"
namespace DSP namespace DSP

View File

@ -4,12 +4,15 @@
#pragma once #pragma once
#include "Common/CommonTypes.h"
#include "Core/HW/DSPHLE/UCodes/UCodes.h" #include "Core/HW/DSPHLE/UCodes/UCodes.h"
namespace DSP namespace DSP
{ {
namespace HLE namespace HLE
{ {
class DSPHLE;
class ROMUCode : public UCodeInterface class ROMUCode : public UCodeInterface
{ {
public: public:

View File

@ -2,6 +2,9 @@
// Licensed under GPLv2+ // Licensed under GPLv2+
// Refer to the license.txt file included. // Refer to the license.txt file included.
#include "Core/HW/DSPHLE/UCodes/UCodes.h"
#include <cstring>
#include <string> #include <string>
#ifdef _WIN32 #ifdef _WIN32
@ -9,110 +12,123 @@
#endif #endif
#include "Common/ChunkFile.h" #include "Common/ChunkFile.h"
#include "Common/CommonFuncs.h"
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
#include "Common/FileUtil.h" #include "Common/FileUtil.h"
#include "Common/Hash.h" #include "Common/Hash.h"
#include "Common/Logging/Log.h" #include "Common/Logging/Log.h"
#include "Common/StringUtil.h" #include "Common/StringUtil.h"
#include "Core/ConfigManager.h" #include "Core/ConfigManager.h"
#include "Core/HW/DSPHLE/DSPHLE.h"
#include "Core/HW/DSPHLE/UCodes/AX.h" #include "Core/HW/DSPHLE/UCodes/AX.h"
#include "Core/HW/DSPHLE/UCodes/AXWii.h" #include "Core/HW/DSPHLE/UCodes/AXWii.h"
#include "Core/HW/DSPHLE/UCodes/CARD.h" #include "Core/HW/DSPHLE/UCodes/CARD.h"
#include "Core/HW/DSPHLE/UCodes/GBA.h" #include "Core/HW/DSPHLE/UCodes/GBA.h"
#include "Core/HW/DSPHLE/UCodes/INIT.h" #include "Core/HW/DSPHLE/UCodes/INIT.h"
#include "Core/HW/DSPHLE/UCodes/ROM.h" #include "Core/HW/DSPHLE/UCodes/ROM.h"
#include "Core/HW/DSPHLE/UCodes/UCodes.h"
#include "Core/HW/DSPHLE/UCodes/Zelda.h" #include "Core/HW/DSPHLE/UCodes/Zelda.h"
#include "Core/HW/Memmap.h"
namespace DSP namespace DSP
{ {
namespace HLE namespace HLE
{ {
UCodeInterface* UCodeFactory(u32 crc, DSPHLE* dsphle, bool wii) constexpr bool ExramRead(u32 address)
{ {
switch (crc) return (address & 0x10000000) != 0;
{
case UCODE_ROM:
INFO_LOG(DSPHLE, "Switching to ROM ucode");
return new ROMUCode(dsphle, crc);
case UCODE_INIT_AUDIO_SYSTEM:
INFO_LOG(DSPHLE, "Switching to INIT ucode");
return new INITUCode(dsphle, crc);
case 0x65d6cc6f: // CARD
INFO_LOG(DSPHLE, "Switching to CARD ucode");
return new CARDUCode(dsphle, crc);
case 0xdd7e72d5:
INFO_LOG(DSPHLE, "Switching to GBA ucode");
return new GBAUCode(dsphle, crc);
case 0x3ad3b7ac: // Naruto 3, Paper Mario - The Thousand Year Door
case 0x3daf59b9: // Alien Hominid
case 0x4e8a8b21: // spdemo, Crazy Taxi, 18 Wheeler, Disney, Monkeyball 1/2, Cubivore, Nintendo
// Puzzle Collection, Wario,
// Capcom vs. SNK 2, Naruto 2, Lost Kingdoms, Star Fox, Mario Party 4, Mortal Kombat,
// Smugglers Run Warzone, Smash Brothers, Sonic Mega Collection, ZooCube
// nddemo, Star Fox
case 0x07f88145: // bustamove, Ikaruga, F-Zero GX, Robotech Battle Cry, Star Soldier, Soul
// Calibur 2,
// Zelda:OOT, Tony Hawk, Viewtiful Joe
case 0xe2136399: // Billy Hatcher, Dragon Ball Z, Mario Party 5, TMNT, 1080° Avalanche
case 0x3389a79e: // MP1/MP2 Wii (Metroid Prime Trilogy)
INFO_LOG(DSPHLE, "CRC %08x: AX ucode chosen", crc);
return new AXUCode(dsphle, crc);
case 0x86840740: // Zelda WW - US
case 0x6ca33a6d: // Zelda TP GC - US
case 0xd643001f: // Super Mario Galaxy - US
case 0x6ba3b3ea: // GC IPL - PAL
case 0x24b22038: // GC IPL - US
case 0x2fcdf1ec: // Zelda FSA - US
case 0x4be6a5cb: // Pikmin 1 GC - US
case 0x267fd05a: // Pikmin 1 GC - PAL
case 0x42f64ac4: // Luigi's Mansion - US
case 0x56d36052: // Super Mario Sunshine - US
case 0x6c3f6f94: // Zelda TP Wii - US
case 0xb7eb9a9c: // Pikmin 1 New Play Control Wii - US
case 0xeaeb38cc: // Pikmin 2 New Play Control Wii - US
return new ZeldaUCode(dsphle, crc);
case 0x2ea36ce6: // Some Wii demos
case 0x5ef56da3: // AX demo
case 0x347112ba: // Raving Rabbids
case 0xfa450138: // Wii Sports - PAL
case 0xadbc06bd: // Elebits
case 0x4cc52064: // Bleach: Versus Crusade
case 0xd9c4bf34: // WiiMenu
INFO_LOG(DSPHLE, "CRC %08x: Wii - AXWii chosen", crc);
return new AXWiiUCode(dsphle, crc);
default:
if (wii)
{
PanicAlertT("This title might be incompatible with DSP HLE emulation. Try using LLE if this "
"is homebrew.\n\n"
"Unknown ucode (CRC = %08x) - forcing AXWii.",
crc);
return new AXWiiUCode(dsphle, crc);
}
else
{
PanicAlertT("This title might be incompatible with DSP HLE emulation. Try using LLE if this "
"is homebrew.\n\n"
"DSPHLE: Unknown ucode (CRC = %08x) - forcing AX.",
crc);
return new AXUCode(dsphle, crc);
}
case UCODE_NULL:
break;
}
return nullptr;
} }
u8 HLEMemory_Read_U8(u32 address)
{
if (ExramRead(address))
return Memory::m_pEXRAM[address & Memory::EXRAM_MASK];
return Memory::m_pRAM[address & Memory::RAM_MASK];
}
void HLEMemory_Write_U8(u32 address, u8 value)
{
if (ExramRead(address))
Memory::m_pEXRAM[address & Memory::EXRAM_MASK] = value;
else
Memory::m_pRAM[address & Memory::RAM_MASK] = value;
}
u16 HLEMemory_Read_U16LE(u32 address)
{
u16 value;
if (ExramRead(address))
std::memcpy(&value, &Memory::m_pEXRAM[address & Memory::EXRAM_MASK], sizeof(u16));
else
std::memcpy(&value, &Memory::m_pRAM[address & Memory::RAM_MASK], sizeof(u16));
return value;
}
u16 HLEMemory_Read_U16(u32 address)
{
return Common::swap16(HLEMemory_Read_U16LE(address));
}
void HLEMemory_Write_U16LE(u32 address, u16 value)
{
if (ExramRead(address))
std::memcpy(&Memory::m_pEXRAM[address & Memory::EXRAM_MASK], &value, sizeof(u16));
else
std::memcpy(&Memory::m_pRAM[address & Memory::RAM_MASK], &value, sizeof(u16));
}
void HLEMemory_Write_U16(u32 address, u16 value)
{
HLEMemory_Write_U16LE(address, Common::swap16(value));
}
u32 HLEMemory_Read_U32LE(u32 address)
{
u32 value;
if (ExramRead(address))
std::memcpy(&value, &Memory::m_pEXRAM[address & Memory::EXRAM_MASK], sizeof(u32));
else
std::memcpy(&value, &Memory::m_pRAM[address & Memory::RAM_MASK], sizeof(u32));
return value;
}
u32 HLEMemory_Read_U32(u32 address)
{
return Common::swap32(HLEMemory_Read_U32LE(address));
}
void HLEMemory_Write_U32LE(u32 address, u32 value)
{
if (ExramRead(address))
std::memcpy(&Memory::m_pEXRAM[address & Memory::EXRAM_MASK], &value, sizeof(u32));
else
std::memcpy(&Memory::m_pRAM[address & Memory::RAM_MASK], &value, sizeof(u32));
}
void HLEMemory_Write_U32(u32 address, u32 value)
{
HLEMemory_Write_U32LE(address, Common::swap32(value));
}
void* HLEMemory_Get_Pointer(u32 address)
{
if (ExramRead(address))
return &Memory::m_pEXRAM[address & Memory::EXRAM_MASK];
return &Memory::m_pRAM[address & Memory::RAM_MASK];
}
UCodeInterface::UCodeInterface(DSPHLE* dsphle, u32 crc)
: m_mail_handler(dsphle->AccessMailHandler()), m_dsphle(dsphle), m_crc(crc)
{
}
UCodeInterface::~UCodeInterface() = default;
bool UCodeInterface::NeedsResumeMail() bool UCodeInterface::NeedsResumeMail()
{ {
if (m_needs_resume_mail) if (m_needs_resume_mail)
@ -210,5 +226,90 @@ void UCodeInterface::DoStateShared(PointerWrap& p)
p.Do(m_next_ucode_steps); p.Do(m_next_ucode_steps);
p.Do(m_needs_resume_mail); p.Do(m_needs_resume_mail);
} }
UCodeInterface* UCodeFactory(u32 crc, DSPHLE* dsphle, bool wii)
{
switch (crc)
{
case UCODE_ROM:
INFO_LOG(DSPHLE, "Switching to ROM ucode");
return new ROMUCode(dsphle, crc);
case UCODE_INIT_AUDIO_SYSTEM:
INFO_LOG(DSPHLE, "Switching to INIT ucode");
return new INITUCode(dsphle, crc);
case 0x65d6cc6f: // CARD
INFO_LOG(DSPHLE, "Switching to CARD ucode");
return new CARDUCode(dsphle, crc);
case 0xdd7e72d5:
INFO_LOG(DSPHLE, "Switching to GBA ucode");
return new GBAUCode(dsphle, crc);
case 0x3ad3b7ac: // Naruto 3, Paper Mario - The Thousand Year Door
case 0x3daf59b9: // Alien Hominid
case 0x4e8a8b21: // spdemo, Crazy Taxi, 18 Wheeler, Disney, Monkeyball 1/2, Cubivore, Nintendo
// Puzzle Collection, Wario,
// Capcom vs. SNK 2, Naruto 2, Lost Kingdoms, Star Fox, Mario Party 4, Mortal Kombat,
// Smugglers Run Warzone, Smash Brothers, Sonic Mega Collection, ZooCube
// nddemo, Star Fox
case 0x07f88145: // bustamove, Ikaruga, F-Zero GX, Robotech Battle Cry, Star Soldier, Soul
// Calibur 2,
// Zelda:OOT, Tony Hawk, Viewtiful Joe
case 0xe2136399: // Billy Hatcher, Dragon Ball Z, Mario Party 5, TMNT, 1080° Avalanche
case 0x3389a79e: // MP1/MP2 Wii (Metroid Prime Trilogy)
INFO_LOG(DSPHLE, "CRC %08x: AX ucode chosen", crc);
return new AXUCode(dsphle, crc);
case 0x86840740: // Zelda WW - US
case 0x6ca33a6d: // Zelda TP GC - US
case 0xd643001f: // Super Mario Galaxy - US
case 0x6ba3b3ea: // GC IPL - PAL
case 0x24b22038: // GC IPL - US
case 0x2fcdf1ec: // Zelda FSA - US
case 0x4be6a5cb: // Pikmin 1 GC - US
case 0x267fd05a: // Pikmin 1 GC - PAL
case 0x42f64ac4: // Luigi's Mansion - US
case 0x56d36052: // Super Mario Sunshine - US
case 0x6c3f6f94: // Zelda TP Wii - US
case 0xb7eb9a9c: // Pikmin 1 New Play Control Wii - US
case 0xeaeb38cc: // Pikmin 2 New Play Control Wii - US
return new ZeldaUCode(dsphle, crc);
case 0x2ea36ce6: // Some Wii demos
case 0x5ef56da3: // AX demo
case 0x347112ba: // Raving Rabbids
case 0xfa450138: // Wii Sports - PAL
case 0xadbc06bd: // Elebits
case 0x4cc52064: // Bleach: Versus Crusade
case 0xd9c4bf34: // WiiMenu
INFO_LOG(DSPHLE, "CRC %08x: Wii - AXWii chosen", crc);
return new AXWiiUCode(dsphle, crc);
default:
if (wii)
{
PanicAlertT("This title might be incompatible with DSP HLE emulation. Try using LLE if this "
"is homebrew.\n\n"
"Unknown ucode (CRC = %08x) - forcing AXWii.",
crc);
return new AXWiiUCode(dsphle, crc);
}
else
{
PanicAlertT("This title might be incompatible with DSP HLE emulation. Try using LLE if this "
"is homebrew.\n\n"
"DSPHLE: Unknown ucode (CRC = %08x) - forcing AX.",
crc);
return new AXUCode(dsphle, crc);
}
case UCODE_NULL:
break;
}
return nullptr;
}
} // namespace HLE } // namespace HLE
} // namespace DSP } // namespace DSP

View File

@ -7,8 +7,6 @@
#include <cstring> #include <cstring>
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
#include "Core/HW/DSPHLE/DSPHLE.h"
#include "Core/HW/Memmap.h"
class PointerWrap; class PointerWrap;
@ -17,111 +15,35 @@ namespace DSP
namespace HLE namespace HLE
{ {
class CMailHandler; class CMailHandler;
class DSPHLE;
#define UCODE_ROM 0x00000000 #define UCODE_ROM 0x00000000
#define UCODE_INIT_AUDIO_SYSTEM 0x00000001 #define UCODE_INIT_AUDIO_SYSTEM 0x00000001
#define UCODE_NULL 0xFFFFFFFF #define UCODE_NULL 0xFFFFFFFF
constexpr bool ExramRead(u32 address) u8 HLEMemory_Read_U8(u32 address);
{ void HLEMemory_Write_U8(u32 address, u8 value);
return (address & 0x10000000) != 0;
}
inline u8 HLEMemory_Read_U8(u32 address) u16 HLEMemory_Read_U16LE(u32 address);
{ u16 HLEMemory_Read_U16(u32 address);
if (ExramRead(address))
return Memory::m_pEXRAM[address & Memory::EXRAM_MASK];
else
return Memory::m_pRAM[address & Memory::RAM_MASK];
}
inline void HLEMemory_Write_U8(u32 address, u8 value) void HLEMemory_Write_U16LE(u32 address, u16 value);
{ void HLEMemory_Write_U16(u32 address, u16 value);
if (ExramRead(address))
Memory::m_pEXRAM[address & Memory::EXRAM_MASK] = value;
else
Memory::m_pRAM[address & Memory::RAM_MASK] = value;
}
inline u16 HLEMemory_Read_U16LE(u32 address) u32 HLEMemory_Read_U32LE(u32 address);
{ u32 HLEMemory_Read_U32(u32 address);
u16 value;
if (ExramRead(address)) void HLEMemory_Write_U32LE(u32 address, u32 value);
std::memcpy(&value, &Memory::m_pEXRAM[address & Memory::EXRAM_MASK], sizeof(u16)); void HLEMemory_Write_U32(u32 address, u32 value);
else
std::memcpy(&value, &Memory::m_pRAM[address & Memory::RAM_MASK], sizeof(u16));
return value; void* HLEMemory_Get_Pointer(u32 address);
}
inline u16 HLEMemory_Read_U16(u32 address)
{
return Common::swap16(HLEMemory_Read_U16LE(address));
}
inline void HLEMemory_Write_U16LE(u32 address, u16 value)
{
if (ExramRead(address))
std::memcpy(&Memory::m_pEXRAM[address & Memory::EXRAM_MASK], &value, sizeof(u16));
else
std::memcpy(&Memory::m_pRAM[address & Memory::RAM_MASK], &value, sizeof(u16));
}
inline void HLEMemory_Write_U16(u32 address, u16 value)
{
HLEMemory_Write_U16LE(address, Common::swap16(value));
}
inline u32 HLEMemory_Read_U32LE(u32 address)
{
u32 value;
if (ExramRead(address))
std::memcpy(&value, &Memory::m_pEXRAM[address & Memory::EXRAM_MASK], sizeof(u32));
else
std::memcpy(&value, &Memory::m_pRAM[address & Memory::RAM_MASK], sizeof(u32));
return value;
}
inline u32 HLEMemory_Read_U32(u32 address)
{
return Common::swap32(HLEMemory_Read_U32LE(address));
}
inline void HLEMemory_Write_U32LE(u32 address, u32 value)
{
if (ExramRead(address))
std::memcpy(&Memory::m_pEXRAM[address & Memory::EXRAM_MASK], &value, sizeof(u32));
else
std::memcpy(&Memory::m_pRAM[address & Memory::RAM_MASK], &value, sizeof(u32));
}
inline void HLEMemory_Write_U32(u32 address, u32 value)
{
HLEMemory_Write_U32LE(address, Common::swap32(value));
}
inline void* HLEMemory_Get_Pointer(u32 address)
{
if (ExramRead(address))
return &Memory::m_pEXRAM[address & Memory::EXRAM_MASK];
else
return &Memory::m_pRAM[address & Memory::RAM_MASK];
}
class UCodeInterface class UCodeInterface
{ {
public: public:
UCodeInterface(DSPHLE* dsphle, u32 crc) UCodeInterface(DSPHLE* dsphle, u32 crc);
: m_mail_handler(dsphle->AccessMailHandler()), m_upload_setup_in_progress(false), virtual ~UCodeInterface();
m_dsphle(dsphle), m_crc(crc), m_next_ucode(), m_next_ucode_steps(0),
m_needs_resume_mail(false)
{
}
virtual ~UCodeInterface() {}
virtual void Initialize() = 0; virtual void Initialize() = 0;
virtual void HandleMail(u32 mail) = 0; virtual void HandleMail(u32 mail) = 0;
virtual void Update() = 0; virtual void Update() = 0;
@ -152,7 +74,7 @@ protected:
// UCode is forwarding mails to PrepareBootUCode // UCode is forwarding mails to PrepareBootUCode
// UCode only needs to set this to true, UCodeInterface will set to false when done! // UCode only needs to set this to true, UCodeInterface will set to false when done!
bool m_upload_setup_in_progress; bool m_upload_setup_in_progress = false;
// Need a pointer back to DSPHLE to switch ucodes. // Need a pointer back to DSPHLE to switch ucodes.
DSPHLE* m_dsphle; DSPHLE* m_dsphle;
@ -175,10 +97,10 @@ private:
u16 dram_size; u16 dram_size;
u16 dram_dest; u16 dram_dest;
}; };
NextUCodeInfo m_next_ucode; NextUCodeInfo m_next_ucode{};
int m_next_ucode_steps; int m_next_ucode_steps = 0;
bool m_needs_resume_mail; bool m_needs_resume_mail = false;
}; };
UCodeInterface* UCodeFactory(u32 crc, DSPHLE* dsphle, bool wii); UCodeInterface* UCodeFactory(u32 crc, DSPHLE* dsphle, bool wii);

View File

@ -2,16 +2,19 @@
// Licensed under GPLv2+ // Licensed under GPLv2+
// Refer to the license.txt file included. // Refer to the license.txt file included.
#include "Core/HW/DSPHLE/UCodes/Zelda.h"
#include <array> #include <array>
#include "Common/ChunkFile.h" #include "Common/ChunkFile.h"
#include "Common/CommonFuncs.h" #include "Common/CommonFuncs.h"
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
#include "Common/Logging/Log.h" #include "Common/Logging/Log.h"
#include "Core/HW/DSP.h"
#include "Core/HW/DSPHLE/DSPHLE.h"
#include "Core/HW/DSPHLE/MailHandler.h" #include "Core/HW/DSPHLE/MailHandler.h"
#include "Core/HW/DSPHLE/UCodes/GBA.h" #include "Core/HW/DSPHLE/UCodes/GBA.h"
#include "Core/HW/DSPHLE/UCodes/UCodes.h" #include "Core/HW/DSPHLE/UCodes/UCodes.h"
#include "Core/HW/DSPHLE/UCodes/Zelda.h"
namespace DSP namespace DSP
{ {
@ -372,6 +375,31 @@ void ZeldaUCode::HandleMailLight(u32 mail)
} }
} }
void ZeldaUCode::SetMailState(MailState new_state)
{
// WARN_LOG(DSPHLE, "MailState %d -> %d", m_mail_current_state, new_state);
m_mail_current_state = new_state;
}
u32 ZeldaUCode::Read32()
{
if (m_read_offset == m_write_offset)
{
ERROR_LOG(DSPHLE, "Reading too many command params");
return 0;
}
u32 res = m_cmd_buffer[m_read_offset];
m_read_offset = (m_read_offset + 1) % (sizeof(m_cmd_buffer) / sizeof(u32));
return res;
}
void ZeldaUCode::Write32(u32 val)
{
m_cmd_buffer[m_write_offset] = val;
m_write_offset = (m_write_offset + 1) % (sizeof(m_cmd_buffer) / sizeof(u32));
}
void ZeldaUCode::RunPendingCommands() void ZeldaUCode::RunPendingCommands()
{ {
if (RenderingInProgress() || !m_cmd_can_execute) if (RenderingInProgress() || !m_cmd_can_execute)

View File

@ -4,6 +4,8 @@
#pragma once #pragma once
#include <array>
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
#include "Common/MathUtil.h" #include "Common/MathUtil.h"
#include "Core/HW/DSPHLE/UCodes/UCodes.h" #include "Core/HW/DSPHLE/UCodes/UCodes.h"
@ -12,6 +14,8 @@ namespace DSP
{ {
namespace HLE namespace HLE
{ {
class DSPHLE;
class ZeldaAudioRenderer class ZeldaAudioRenderer
{ {
public: public:
@ -226,11 +230,7 @@ private:
// Utility function to set the current state. Useful for debugging and // Utility function to set the current state. Useful for debugging and
// logging as a hook point. // logging as a hook point.
void SetMailState(MailState new_state) void SetMailState(MailState new_state);
{
// WARN_LOG(DSPHLE, "MailState %d -> %d", m_mail_current_state, new_state);
m_mail_current_state = new_state;
}
// Voice synchronization / audio rendering flow control. When rendering an // Voice synchronization / audio rendering flow control. When rendering an
// audio frame, only voices up to max_voice_id will be rendered until a // audio frame, only voices up to max_voice_id will be rendered until a
@ -251,25 +251,10 @@ private:
bool m_cmd_can_execute = true; bool m_cmd_can_execute = true;
// Reads a 32 bit value from the command buffer. Advances the read pointer. // Reads a 32 bit value from the command buffer. Advances the read pointer.
u32 Read32() u32 Read32();
{
if (m_read_offset == m_write_offset)
{
ERROR_LOG(DSPHLE, "Reading too many command params");
return 0;
}
u32 res = m_cmd_buffer[m_read_offset];
m_read_offset = (m_read_offset + 1) % (sizeof(m_cmd_buffer) / sizeof(u32));
return res;
}
// Writes a 32 bit value to the command buffer. Advances the write pointer. // Writes a 32 bit value to the command buffer. Advances the write pointer.
void Write32(u32 val) void Write32(u32 val);
{
m_cmd_buffer[m_write_offset] = val;
m_write_offset = (m_write_offset + 1) % (sizeof(m_cmd_buffer) / sizeof(u32));
}
// Tries to run as many commands as possible until either the command // Tries to run as many commands as possible until either the command
// buffer is empty (pending_commands == 0) or we reached a long lived // buffer is empty (pending_commands == 0) or we reached a long lived