2015-06-11 01:22:24 -04:00
|
|
|
#pragma once
|
2008-10-21 22:33:11 +00:00
|
|
|
|
|
|
|
#include <string>
|
2008-10-24 22:14:40 +00:00
|
|
|
#include <functional>
|
|
|
|
#include "Types.h"
|
2008-11-24 02:08:50 +00:00
|
|
|
#include "Iop_SpuBase.h"
|
2008-10-21 22:33:11 +00:00
|
|
|
|
2008-11-06 23:48:40 +00:00
|
|
|
namespace Iop
|
2008-10-21 22:33:11 +00:00
|
|
|
{
|
|
|
|
namespace Spu2
|
|
|
|
{
|
2019-06-06 00:42:16 +01:00
|
|
|
class CCore
|
2008-10-21 22:33:11 +00:00
|
|
|
{
|
|
|
|
public:
|
2023-03-19 23:28:10 -04:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
DEFAULT_BASE_SAMPLING_RATE = 48000,
|
|
|
|
};
|
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
CCore(unsigned int, CSpuBase&);
|
2022-06-09 09:39:56 -04:00
|
|
|
virtual ~CCore() = default;
|
2008-10-21 22:33:11 +00:00
|
|
|
|
2019-06-06 00:42:16 +01:00
|
|
|
CCore(const CCore&) = delete;
|
|
|
|
CCore& operator=(const CCore&) = delete;
|
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
void Reset();
|
2023-03-19 23:28:10 -04:00
|
|
|
void SetBaseSamplingRate(uint32);
|
2008-10-24 22:14:40 +00:00
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
CSpuBase& GetSpuBase() const;
|
2015-02-08 17:18:41 -05:00
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
uint32 ReadRegister(uint32, uint32);
|
|
|
|
uint32 WriteRegister(uint32, uint32);
|
2008-10-29 01:42:35 +00:00
|
|
|
|
2008-10-21 22:33:11 +00:00
|
|
|
enum REGISTERS
|
|
|
|
{
|
2018-04-30 21:01:23 +01:00
|
|
|
VP_VOLL = 0x1F900000,
|
|
|
|
VP_VOLR = 0x1F900002,
|
|
|
|
VP_PITCH = 0x1F900004,
|
|
|
|
VP_ADSR1 = 0x1F900006,
|
|
|
|
VP_ADSR2 = 0x1F900008,
|
|
|
|
VP_ENVX = 0x1F90000A,
|
|
|
|
VP_VOLXL = 0x1F90000C,
|
|
|
|
VP_VOLXR = 0x1F90000E,
|
|
|
|
S_REG_BASE = 0x1F900180,
|
|
|
|
S_PMON_HI = 0x1F900180,
|
|
|
|
S_PMON_LO = 0x1F900182,
|
|
|
|
S_NON_HI = 0x1F900184,
|
|
|
|
S_NON_LO = 0x1F900186,
|
|
|
|
S_VMIXL_HI = 0x1F900188,
|
|
|
|
S_VMIXL_LO = 0x1F90018A,
|
|
|
|
S_VMIXEL_HI = 0x1F90018C,
|
|
|
|
S_VMIXEL_LO = 0x1F90018E,
|
|
|
|
S_VMIXR_HI = 0x1F900190,
|
|
|
|
S_VMIXR_LO = 0x1F900192,
|
|
|
|
S_VMIXER_HI = 0x1F900194,
|
|
|
|
S_VMIXER_LO = 0x1F900196,
|
|
|
|
P_MMIX = 0x1F900198,
|
|
|
|
CORE_ATTR = 0x1F90019A,
|
|
|
|
A_IRQA_HI = 0x1F90019C,
|
|
|
|
A_IRQA_LO = 0x1F90019E,
|
|
|
|
A_KON_HI = 0x1F9001A0,
|
|
|
|
A_KON_LO = 0x1F9001A2,
|
|
|
|
A_KOFF_HI = 0x1F9001A4,
|
|
|
|
A_KOFF_LO = 0x1F9001A6,
|
|
|
|
A_TSA_HI = 0x1F9001A8,
|
|
|
|
A_TSA_LO = 0x1F9001AA,
|
|
|
|
A_STD = 0x1F9001AC,
|
|
|
|
A_TS_MODE = 0x1F9001B0,
|
|
|
|
VA_REG_BASE = 0x1F9001C0,
|
|
|
|
VA_SSA_HI = 0x1F9001C0,
|
|
|
|
VA_SSA_LO = 0x1F9001C2,
|
|
|
|
VA_LSAX_HI = 0x1F9001C4,
|
|
|
|
VA_LSAX_LO = 0x1F9001C6,
|
|
|
|
VA_NAX_HI = 0x1F9001C8,
|
|
|
|
VA_NAX_LO = 0x1F9001CA,
|
|
|
|
R_REG_BASE = 0x1F9002E0,
|
|
|
|
RVB_A_REG_BASE = 0x1F9002E4, //Reverb Base
|
2024-06-10 11:57:31 -04:00
|
|
|
RVB_A_REG_END = 0x1F90033C,
|
2018-04-30 21:01:23 +01:00
|
|
|
A_ESA_HI = 0x1F9002E0,
|
|
|
|
A_ESA_LO = 0x1F9002E2,
|
|
|
|
A_EEA_HI = 0x1F90033C,
|
|
|
|
A_EEA_LO = 0x1F90033E,
|
|
|
|
S_ENDX_HI = 0x1F900340,
|
|
|
|
S_ENDX_LO = 0x1F900342,
|
|
|
|
STATX = 0x1F900344,
|
|
|
|
P_MVOLL = 0x1F900760, //Master volume
|
|
|
|
P_MVOLR = 0x1F900762,
|
|
|
|
P_EVOLL = 0x1F900764, //Effect volume
|
|
|
|
P_EVOLR = 0x1F900766,
|
|
|
|
P_BVOLL = 0x1F90076C, //Audio input volume
|
|
|
|
P_BVOLR = 0x1F90076E,
|
|
|
|
RVB_C_REG_BASE = 0x1F900774,
|
|
|
|
RVB_C_REG_END = 0x1F900788,
|
2008-10-21 22:33:11 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
private:
|
2008-10-24 22:14:40 +00:00
|
|
|
typedef uint32 (CCore::*RegisterAccessFunction)(unsigned int, uint32, uint32);
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
MAX_CHANNEL = 24,
|
|
|
|
};
|
|
|
|
|
|
|
|
struct REGISTER_DISPATCH_INFO
|
|
|
|
{
|
2018-04-30 21:01:23 +01:00
|
|
|
RegisterAccessFunction core;
|
|
|
|
RegisterAccessFunction channel;
|
2008-10-24 22:14:40 +00:00
|
|
|
};
|
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
uint32 ProcessRegisterAccess(const REGISTER_DISPATCH_INFO&, uint32, uint32);
|
2008-10-24 22:14:40 +00:00
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
uint32 ReadRegisterCore(unsigned int, uint32, uint32);
|
|
|
|
uint32 WriteRegisterCore(unsigned int, uint32, uint32);
|
2008-10-24 22:14:40 +00:00
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
uint32 ReadRegisterChannel(unsigned int, uint32, uint32);
|
|
|
|
uint32 WriteRegisterChannel(unsigned int, uint32, uint32);
|
2008-10-24 22:14:40 +00:00
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
void LogRead(uint32, uint32);
|
|
|
|
void LogWrite(uint32, uint32);
|
|
|
|
void LogChannelRead(unsigned int, uint32, uint32);
|
|
|
|
void LogChannelWrite(unsigned int, uint32, uint32);
|
2008-10-21 22:33:11 +00:00
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
uint16 GetAddressLo(uint32);
|
|
|
|
uint16 GetAddressHi(uint32);
|
|
|
|
uint32 SetAddressLo(uint32, uint16);
|
|
|
|
uint32 SetAddressHi(uint32, uint16);
|
2008-11-07 03:16:19 +00:00
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
REGISTER_DISPATCH_INFO m_readDispatch;
|
|
|
|
REGISTER_DISPATCH_INFO m_writeDispatch;
|
|
|
|
unsigned int m_coreId;
|
|
|
|
std::string m_logName;
|
2023-03-19 23:28:10 -04:00
|
|
|
uint32 m_baseSamplingRate = 0;
|
2018-04-30 21:01:23 +01:00
|
|
|
CSpuBase& m_spuBase;
|
2008-10-21 22:33:11 +00:00
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|