Play-/Source/iop/Iop_LibSd.cpp

332 lines
8.9 KiB
C++
Raw Permalink Normal View History

#include "Iop_LibSd.h"
2025-03-11 12:48:26 -04:00
#include "Log.h"
2015-06-01 22:39:02 -04:00
#include "string_format.h"
//Not an actual implementation of the LIBSD module
//It is only used for debugging purposes (ie.: function names)
using namespace Iop;
2018-04-30 21:01:23 +01:00
#define FUNCTION_INIT "Init"
#define FUNCTION_SETPARAM "SetParam"
#define FUNCTION_GETPARAM "GetParam"
#define FUNCTION_SETSWITCH "SetSwitch"
#define FUNCTION_GETSWITCH "GetSwitch"
#define FUNCTION_SETADDR "SetAddr"
#define FUNCTION_GETADDR "GetAddr"
#define FUNCTION_SETCOREATTR "SetCoreAttr"
2021-05-25 17:11:44 -04:00
#define FUNCTION_PROCBATCH "ProcBatch"
2018-04-30 21:01:23 +01:00
#define FUNCTION_VOICETRANS "VoiceTrans"
#define FUNCTION_BLOCKTRANS "BlockTrans"
#define FUNCTION_VOICETRANSSTATUS "VoiceTransStatus"
#define FUNCTION_BLOCKTRANSSTATUS "BlockTransStatus"
#define FUNCTION_SETTRANSCALLBACK "SetTransCallback"
2020-10-03 15:20:59 -04:00
#define FUNCTION_SETEFFECTATTR "SetEffectAttr"
2018-04-30 21:01:23 +01:00
#define FUNCTION_SETTRANSINTRHANDLER "SetTransIntrHandler"
#define FUNCTION_SETSPU2INTRHANDLER "SetSpu2IntrHandler"
2015-03-29 23:57:21 -04:00
#define LOG_NAME "iop_libsd"
std::string CLibSd::GetId() const
{
return "libsd";
}
std::string CLibSd::GetFunctionName(unsigned int functionId) const
{
switch(functionId)
{
2015-05-21 00:11:32 -04:00
case 4:
return FUNCTION_INIT;
break;
case 5:
return FUNCTION_SETPARAM;
break;
2016-10-02 16:38:10 -04:00
case 6:
return FUNCTION_GETPARAM;
break;
case 7:
return FUNCTION_SETSWITCH;
break;
2015-06-01 22:39:02 -04:00
case 8:
return FUNCTION_GETSWITCH;
break;
case 9:
return FUNCTION_SETADDR;
break;
case 10:
return FUNCTION_GETADDR;
break;
case 11:
return FUNCTION_SETCOREATTR;
break;
2021-05-25 17:11:44 -04:00
case 15:
return FUNCTION_PROCBATCH;
break;
2015-03-29 23:57:21 -04:00
case 17:
return FUNCTION_VOICETRANS;
break;
2015-05-21 00:11:32 -04:00
case 18:
return FUNCTION_BLOCKTRANS;
break;
2015-03-29 23:57:21 -04:00
case 19:
return FUNCTION_VOICETRANSSTATUS;
break;
2015-05-21 00:11:32 -04:00
case 20:
return FUNCTION_BLOCKTRANSSTATUS;
break;
2016-12-17 17:24:35 -05:00
case 21:
return FUNCTION_SETTRANSCALLBACK;
break;
2020-10-03 15:20:59 -04:00
case 23:
return FUNCTION_SETEFFECTATTR;
break;
2015-03-29 23:57:21 -04:00
case 26:
return FUNCTION_SETTRANSINTRHANDLER;
break;
case 27:
return FUNCTION_SETSPU2INTRHANDLER;
break;
default:
return "unknown";
break;
}
}
void CLibSd::Invoke(CMIPS&, unsigned int)
{
}
2015-03-29 23:57:21 -04:00
2022-05-10 09:45:23 -04:00
static std::string DecodeAddress(uint16 addressId)
{
std::string result;
2023-09-05 16:05:26 -04:00
bool voiceAddress = false;
2022-05-10 09:45:23 -04:00
switch(addressId >> 8)
{
2023-09-05 16:05:26 -04:00
case 0x1F:
result = "IRQA";
break;
2023-08-27 21:56:20 -04:00
case 0x20:
result = "SSA";
2023-09-05 16:05:26 -04:00
voiceAddress = true;
break;
case 0x21:
result = "LSAX";
voiceAddress = true;
2023-08-27 21:56:20 -04:00
break;
2022-05-10 09:45:23 -04:00
case 0x22:
result = "NAX";
2023-09-05 16:05:26 -04:00
voiceAddress = true;
2022-05-10 09:45:23 -04:00
break;
default:
result = string_format("unknown (0x%02X)", addressId >> 8);
break;
}
2023-09-05 16:05:26 -04:00
if(voiceAddress)
{
result += string_format(", CORE%d, VOICE%d", addressId & 1, (addressId & 0x3E) >> 1);
}
else
{
result += string_format(", CORE%d", addressId & 1);
}
2022-05-10 09:45:23 -04:00
return result;
}
static std::string DecodeParam(uint16 paramId)
2021-07-29 14:16:43 -04:00
{
std::string result;
2023-05-19 12:05:46 -04:00
uint16 paramIdx = (paramId >> 8);
bool voiceParam = (paramIdx < 8);
switch(paramIdx)
2021-07-29 14:16:43 -04:00
{
2022-05-10 09:45:23 -04:00
case 0x00:
result = "VOLL";
break;
case 0x01:
result = "VOLR";
break;
2023-07-28 19:37:58 -04:00
case 0x02:
result = "PITCH";
break;
2023-09-28 13:46:44 -04:00
case 0x03:
result = "ADSR1";
break;
case 0x04:
result = "ADSR2";
break;
2022-05-10 09:45:23 -04:00
case 0x05:
result = "ENVX";
break;
2021-07-29 14:16:43 -04:00
case 0x06:
result = "VOLXL";
break;
case 0x07:
result = "VOLXR";
break;
2023-05-19 12:05:46 -04:00
case 0x08:
result = "MMIX";
break;
case 0x09:
result = "MVOLL";
break;
case 0x0A:
result = "MVOLR";
break;
case 0x0B:
result = "EVOLL";
break;
case 0x0C:
result = "EVOLR";
break;
case 0x0D:
result = "AVOLL";
break;
case 0x0E:
result = "AVOLR";
break;
2024-09-03 17:33:33 -04:00
case 0x0F:
result = "BVOLL";
break;
case 0x10:
result = "BVOLR";
break;
2021-07-29 14:16:43 -04:00
default:
2023-05-19 12:05:46 -04:00
result = string_format("unknown (0x%02X)", paramIdx);
2021-07-29 14:16:43 -04:00
break;
}
2023-05-19 12:05:46 -04:00
if(voiceParam)
{
result += string_format(", CORE%d, VOICE%d", paramId & 1, (paramId & 0x3E) >> 1);
}
else
{
result += string_format(", CORE%d", paramId & 1);
}
2021-07-29 14:16:43 -04:00
return result;
}
2022-05-10 09:45:23 -04:00
static std::string DecodeSwitch(uint16 switchId)
2015-06-01 22:39:02 -04:00
{
std::string result;
switch(switchId >> 8)
{
2023-09-28 13:46:44 -04:00
case 0x13:
result = "PMON";
break;
case 0x14:
result = "NON";
break;
2015-06-01 22:39:02 -04:00
case 0x15:
result = "KON";
break;
case 0x16:
result = "KOFF";
2015-06-01 22:39:02 -04:00
break;
case 0x17:
result = "ENDX";
break;
case 0x18:
result = "VMIXL";
break;
case 0x19:
result = "VMIXEL";
break;
case 0x1A:
result = "VMIXR";
break;
case 0x1B:
result = "VMIXER";
break;
2015-06-01 22:39:02 -04:00
default:
result = string_format("unknown (0x%02X)", switchId >> 8);
2015-06-01 22:39:02 -04:00
break;
}
result += string_format(", CORE%d", switchId & 1);
return result;
}
2015-03-29 23:57:21 -04:00
void CLibSd::TraceCall(CMIPS& context, unsigned int functionId)
{
switch(functionId)
{
case 4:
2018-04-30 21:01:23 +01:00
CLog::GetInstance().Print(LOG_NAME, FUNCTION_INIT "(flag = %d);\r\n",
context.m_State.nGPR[CMIPS::A0].nV0);
2015-03-29 23:57:21 -04:00
break;
case 5:
2021-07-29 14:16:43 -04:00
CLog::GetInstance().Print(LOG_NAME, FUNCTION_SETPARAM "(entry = 0x%04X, value = 0x%04X); //(%s)\r\n",
context.m_State.nGPR[CMIPS::A0].nV0, context.m_State.nGPR[CMIPS::A1].nV0,
DecodeParam(static_cast<uint16>(context.m_State.nGPR[CMIPS::A0].nV0)).c_str());
2015-03-29 23:57:21 -04:00
break;
2016-10-02 16:38:10 -04:00
case 6:
2021-07-29 14:16:43 -04:00
CLog::GetInstance().Print(LOG_NAME, FUNCTION_GETPARAM "(entry = 0x%04X); //(%s)\r\n",
context.m_State.nGPR[CMIPS::A0].nV0,
DecodeParam(static_cast<uint16>(context.m_State.nGPR[CMIPS::A0].nV0)).c_str());
2016-10-02 16:38:10 -04:00
break;
2015-03-29 23:57:21 -04:00
case 7:
CLog::GetInstance().Print(LOG_NAME, FUNCTION_SETSWITCH "(entry = 0x%04X, value = 0x%08X); //(%s)\r\n",
2018-04-30 21:01:23 +01:00
context.m_State.nGPR[CMIPS::A0].nV0, context.m_State.nGPR[CMIPS::A1].nV0,
DecodeSwitch(static_cast<uint16>(context.m_State.nGPR[CMIPS::A0].nV0)).c_str());
2015-06-01 22:39:02 -04:00
break;
case 8:
2018-04-30 21:01:23 +01:00
CLog::GetInstance().Print(LOG_NAME, FUNCTION_GETSWITCH "(entry = 0x%04X); //(%s)\r\n",
context.m_State.nGPR[CMIPS::A0].nV0,
DecodeSwitch(static_cast<uint16>(context.m_State.nGPR[CMIPS::A0].nV0)).c_str());
2015-03-29 23:57:21 -04:00
break;
case 9:
2023-08-27 21:56:20 -04:00
CLog::GetInstance().Print(LOG_NAME, FUNCTION_SETADDR "(entry = 0x%04X, value = 0x%08X); //(%s)\r\n",
context.m_State.nGPR[CMIPS::A0].nV0, context.m_State.nGPR[CMIPS::A1].nV0,
DecodeAddress(static_cast<uint16>(context.m_State.nGPR[CMIPS::A0].nV0)).c_str());
2015-03-29 23:57:21 -04:00
break;
case 10:
2022-05-10 09:45:23 -04:00
CLog::GetInstance().Print(LOG_NAME, FUNCTION_GETADDR "(entry = 0x%04X); //(%s)\r\n",
context.m_State.nGPR[CMIPS::A0].nV0,
DecodeAddress(static_cast<uint16>(context.m_State.nGPR[CMIPS::A0].nV0)).c_str());
2015-03-29 23:57:21 -04:00
break;
2015-05-21 00:11:32 -04:00
case 11:
CLog::GetInstance().Print(LOG_NAME, FUNCTION_SETCOREATTR "(entry = 0x%04X, value = 0x%04X);\r\n",
2018-04-30 21:01:23 +01:00
context.m_State.nGPR[CMIPS::A0].nV0, context.m_State.nGPR[CMIPS::A1].nV0);
2015-05-21 00:11:32 -04:00
break;
2015-03-29 23:57:21 -04:00
case 17:
CLog::GetInstance().Print(LOG_NAME, FUNCTION_VOICETRANS "(channel = 0x%04X, mode = 0x%04X, maddr = 0x%08X, saddr = 0x%08X, size = 0x%08X);\r\n",
2018-04-30 21:01:23 +01:00
context.m_State.nGPR[CMIPS::A0].nV0, context.m_State.nGPR[CMIPS::A1].nV0,
context.m_State.nGPR[CMIPS::A2].nV0, context.m_State.nGPR[CMIPS::A3].nV0,
context.m_pMemoryMap->GetWord(context.m_State.nGPR[CMIPS::SP].nV0 + 0x10));
2015-03-29 23:57:21 -04:00
break;
case 18:
CLog::GetInstance().Print(LOG_NAME, FUNCTION_BLOCKTRANS "(channel = 0x%04X, mode = 0x%04X, maddr = 0x%08X, size = 0x%08X);\r\n",
2018-04-30 21:01:23 +01:00
context.m_State.nGPR[CMIPS::A0].nV0, context.m_State.nGPR[CMIPS::A1].nV0,
context.m_State.nGPR[CMIPS::A2].nV0, context.m_State.nGPR[CMIPS::A3].nV0);
2015-03-29 23:57:21 -04:00
break;
case 19:
CLog::GetInstance().Print(LOG_NAME, FUNCTION_VOICETRANSSTATUS "(channel = 0x%04X, flag = 0x%04X);\r\n",
2018-04-30 21:01:23 +01:00
context.m_State.nGPR[CMIPS::A0].nV0, context.m_State.nGPR[CMIPS::A1].nV0);
2015-03-29 23:57:21 -04:00
break;
case 20:
CLog::GetInstance().Print(LOG_NAME, FUNCTION_BLOCKTRANSSTATUS "(channel = 0x%04X, flag = 0x%04X);\r\n",
2018-04-30 21:01:23 +01:00
context.m_State.nGPR[CMIPS::A0].nV0, context.m_State.nGPR[CMIPS::A1].nV0);
2015-03-29 23:57:21 -04:00
break;
2016-12-17 17:24:35 -05:00
case 21:
CLog::GetInstance().Print(LOG_NAME, FUNCTION_SETTRANSCALLBACK "(channel = 0x%04X, function = 0x%08X);\r\n",
2018-04-30 21:01:23 +01:00
context.m_State.nGPR[CMIPS::A0].nV0, context.m_State.nGPR[CMIPS::A1].nV0);
2016-12-17 17:24:35 -05:00
break;
2020-10-03 15:20:59 -04:00
case 23:
CLog::GetInstance().Print(LOG_NAME, FUNCTION_SETEFFECTATTR "(core = 0x%04X, attr = 0x%08X);\r\n",
context.m_State.nGPR[CMIPS::A0].nV0, context.m_State.nGPR[CMIPS::A1].nV0);
break;
2015-03-29 23:57:21 -04:00
case 26:
CLog::GetInstance().Print(LOG_NAME, FUNCTION_SETTRANSINTRHANDLER "(channel = 0x%04X, function = 0x%08X, arg = 0x%08X);\r\n",
2018-04-30 21:01:23 +01:00
context.m_State.nGPR[CMIPS::A0].nV0, context.m_State.nGPR[CMIPS::A1].nV0,
context.m_State.nGPR[CMIPS::A2].nV0);
2015-03-29 23:57:21 -04:00
break;
2015-05-21 00:49:42 -04:00
case 27:
CLog::GetInstance().Print(LOG_NAME, FUNCTION_SETSPU2INTRHANDLER "(function = 0x%08X, arg = 0x%08X);\r\n",
2018-04-30 21:01:23 +01:00
context.m_State.nGPR[CMIPS::A0].nV0, context.m_State.nGPR[CMIPS::A1].nV0);
2015-05-21 00:49:42 -04:00
break;
2015-03-29 23:57:21 -04:00
default:
CLog::GetInstance().Print(LOG_NAME, "unknownlibsd(%d);\r\n", functionId);
break;
}
}