This commit is contained in:
Jordan Woyak 2025-11-15 10:50:48 -05:00 committed by GitHub
commit ad142f2265
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 22 additions and 19 deletions

View File

@ -11,6 +11,7 @@
#include "Common/CommonTypes.h"
#include "Common/Logging/Log.h"
#include "Common/MsgHandler.h"
#include "Common/Swap.h"
#include "Core/HW/SI/SI_DeviceDanceMat.h"
#include "Core/HW/SI/SI_DeviceGBA.h"
#ifdef HAS_LIBMGBA
@ -87,6 +88,15 @@ void ISIDevice::OnEvent(u64 userdata, s64 cycles_late)
{
}
int ISIDevice::CreateStatusResponse(u32 si_device_id, u8* buffer)
{
constexpr int RESPONSE_LENGTH = 3;
Common::BigEndianValue<u32> id(si_device_id);
std::memcpy(buffer, &id, RESPONSE_LENGTH);
return RESPONSE_LENGTH;
}
int SIDevice_GetGBATransferTime(const SystemTimers::SystemTimersManager& timers,
EBufferCommands cmd)
{

View File

@ -123,7 +123,12 @@ public:
SIDevices GetDeviceType() const;
// Run the SI Buffer
// Return value:
// positive: The response length.
// 0: Response not ready, we will try again `TransferInterval()` cycles later.
// -1: No response.
virtual int RunBuffer(u8* buffer, int request_length);
virtual int TransferInterval();
virtual DataResponse GetData(u32& hi, u32& low) = 0;
@ -138,6 +143,9 @@ public:
virtual void OnEvent(u64 userdata, s64 cycles_late);
protected:
// Only the three high bytes of `si_device_id` are used.
static int CreateStatusResponse(u32 si_device_id, u8* buffer);
Core::System& m_system;
int m_device_number;

View File

@ -3,10 +3,7 @@
#include "Core/HW/SI/SI_DeviceDanceMat.h"
#include <cstring>
#include "Common/CommonTypes.h"
#include "Common/Swap.h"
#include "InputCommon/GCPadStatus.h"
namespace SerialInterface
@ -22,11 +19,7 @@ int CSIDevice_DanceMat::RunBuffer(u8* buffer, int request_length)
const auto command = static_cast<EBufferCommands>(buffer[0]);
if (command == EBufferCommands::CMD_STATUS)
{
ISIDevice::RunBuffer(buffer, request_length);
const u32 id = Common::swap32(SI_DANCEMAT);
std::memcpy(buffer, &id, sizeof(id));
return sizeof(id);
return CreateStatusResponse(SI_DANCEMAT, buffer);
}
return CSIDevice_GCController::RunBuffer(buffer, request_length);
}

View File

@ -10,7 +10,6 @@
#include "Common/ChunkFile.h"
#include "Common/CommonTypes.h"
#include "Common/Logging/Log.h"
#include "Common/Swap.h"
#include "Core/Core.h"
#include "Core/CoreTiming.h"
#include "Core/HW/GBACore.h"

View File

@ -57,9 +57,7 @@ int CSIDevice_GCController::RunBuffer(u8* buffer, int request_length)
case EBufferCommands::CMD_STATUS:
case EBufferCommands::CMD_RESET:
{
const u32 id = Common::swap32(SI_GC_CONTROLLER);
std::memcpy(buffer, &id, sizeof(id));
return sizeof(id);
return CreateStatusResponse(SI_GC_CONTROLLER, buffer);
}
case EBufferCommands::CMD_DIRECT:

View File

@ -34,9 +34,7 @@ int CSIDevice_GCSteeringWheel::RunBuffer(u8* buffer, int request_length)
case EBufferCommands::CMD_STATUS:
case EBufferCommands::CMD_RESET:
{
const u32 id = Common::swap32(SI_GC_STEERING);
std::memcpy(buffer, &id, sizeof(id));
return sizeof(id);
return CreateStatusResponse(SI_GC_STEERING, buffer);
}
default:
return CSIDevice_GCController::RunBuffer(buffer, request_length);

View File

@ -9,7 +9,6 @@
#include "Common/ChunkFile.h"
#include "Common/CommonTypes.h"
#include "Common/Logging/Log.h"
#include "Common/Swap.h"
#include "Core/HW/GCKeyboard.h"
#include "InputCommon/KeyboardStatus.h"
@ -35,9 +34,7 @@ int CSIDevice_Keyboard::RunBuffer(u8* buffer, int request_length)
case EBufferCommands::CMD_STATUS:
case EBufferCommands::CMD_RESET:
{
const u32 id = Common::swap32(SI_GC_KEYBOARD);
std::memcpy(buffer, &id, sizeof(id));
return sizeof(id);
return CreateStatusResponse(SI_GC_KEYBOARD, buffer);
}
case EBufferCommands::CMD_DIRECT_KB: