mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-12-16 04:09:39 +00:00
Fixed a bug caused by static usage of Core::System::GetInstance()
Removed unused headers Removed unneeded code Optimised code Added sanity checks Added SafeCopyFromEmu/SafeCopyToEmu Set Triforce buttons to be translatable
This commit is contained in:
parent
1ac4c03457
commit
5a87533e42
@ -53,7 +53,6 @@
|
||||
#include "Core/HLE/HLE.h"
|
||||
#include "Core/HW/CPU.h"
|
||||
#include "Core/HW/DSP.h"
|
||||
#include "Core/HW/DVD/AMMediaboard.h"
|
||||
#include "Core/HW/EXI/EXI.h"
|
||||
#include "Core/HW/GBAPad.h"
|
||||
#include "Core/HW/GCKeyboard.h"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -58,6 +58,15 @@ class CPUThreadGuard;
|
||||
class System;
|
||||
} // namespace Core
|
||||
|
||||
struct MediaBoardRanges
|
||||
{
|
||||
u32 start;
|
||||
u32 end;
|
||||
u8* buffer;
|
||||
size_t buffer_size;
|
||||
u32 base_offset;
|
||||
};
|
||||
|
||||
namespace AMMediaboard
|
||||
{
|
||||
|
||||
@ -154,9 +163,7 @@ enum MediaBoardAddress : u32
|
||||
|
||||
DIMMCommandVersion1 = 0x1F900000,
|
||||
DIMMCommandVersion2 = 0x84000000,
|
||||
DIMMCommandVersion2_1 = 0x84000020,
|
||||
DIMMCommandVersion2_2 = 0x89000000,
|
||||
DIMMCommandVersion2_2_1 = 0x89000200,
|
||||
DIMMCommandExecute1 = 0x84000040,
|
||||
DIMMCommandExecute2 = 0x88000000,
|
||||
|
||||
|
||||
@ -24,9 +24,6 @@
|
||||
#include "Core/HW/EXI/EXI_Device.h"
|
||||
#include "Core/HW/MMIO.h"
|
||||
#include "Core/HW/Memmap.h"
|
||||
#include "Core/HW/SI/SI.h"
|
||||
#include "Core/HW/SI/SI_Device.h"
|
||||
#include "Core/HW/WiimoteReal/WiimoteReal.h"
|
||||
#include "Core/Movie.h"
|
||||
#include "Core/PowerPC/PowerPC.h"
|
||||
#include "Core/System.h"
|
||||
@ -140,9 +137,7 @@ void CEXIBaseboard::DMAWrite(u32 addr, u32 size)
|
||||
NOTICE_LOG_FMT(SP1, "AM-BB: COMMAND: Backup DMA Write: {:08x} {:x}", addr, size);
|
||||
|
||||
m_backup.Seek(m_backup_offset, File::SeekOrigin::Begin);
|
||||
|
||||
m_backup.WriteBytes(memory.GetSpanForAddress(addr).data(), size);
|
||||
|
||||
m_backup.Flush();
|
||||
}
|
||||
|
||||
@ -154,9 +149,6 @@ void CEXIBaseboard::DMARead(u32 addr, u32 size)
|
||||
NOTICE_LOG_FMT(SP1, "AM-BB: COMMAND: Backup DMA Read: {:08x} {:x}", addr, size);
|
||||
|
||||
m_backup.Seek(m_backup_offset, File::SeekOrigin::Begin);
|
||||
|
||||
m_backup.Flush();
|
||||
|
||||
m_backup.ReadBytes(memory.GetSpanForAddress(addr).data(), size);
|
||||
}
|
||||
|
||||
@ -264,7 +256,6 @@ void CEXIBaseboard::TransferByte(u8& byte)
|
||||
{
|
||||
// 1 byte out
|
||||
case BackupRead:
|
||||
m_backup.Flush();
|
||||
m_backup.ReadBytes(&byte, 1);
|
||||
break;
|
||||
case DMAOffsetLengthSet:
|
||||
|
||||
@ -73,7 +73,7 @@ GCPad::GCPad(const unsigned int index) : m_index(index)
|
||||
groups.emplace_back(m_triforce = new ControllerEmu::Buttons(TRIFORCE_GROUP));
|
||||
for (const char* named_button : {TEST_BUTTON, SERVICE_BUTTON, COIN_BUTTON})
|
||||
{
|
||||
m_triforce->AddInput(Translatability::DoNotTranslate, named_button);
|
||||
m_triforce->AddInput(Translatability::Translate, named_button);
|
||||
}
|
||||
|
||||
// Microphone
|
||||
|
||||
@ -56,7 +56,7 @@ public:
|
||||
void RemoveEvent(int device_number);
|
||||
|
||||
void UpdateDevices();
|
||||
u32 GetInLength(void) const { return m_com_csr.INLNGTH; }
|
||||
u32 GetInLength() const { return m_com_csr.INLNGTH; }
|
||||
|
||||
void RemoveDevice(int device_number);
|
||||
void AddDevice(SIDevices device, int device_number);
|
||||
|
||||
@ -44,15 +44,15 @@ namespace SerialInterface
|
||||
|
||||
void JVSIOMessage::Start(int node)
|
||||
{
|
||||
m_last_start = m_ptr;
|
||||
const u8 hdr[3] = {0xE0, (u8)node, 0};
|
||||
m_csum = 0;
|
||||
AddData(hdr, 3, 1);
|
||||
m_last_start = m_pointer;
|
||||
const u8 header[3] = {0xE0, (u8)node, 0};
|
||||
m_checksum = 0;
|
||||
AddData(header, 3, 1);
|
||||
}
|
||||
|
||||
void JVSIOMessage::AddData(const u8* dst, size_t len, int sync = 0)
|
||||
{
|
||||
if (m_ptr + len >= 0x80)
|
||||
if (m_pointer + len >= sizeof(m_message))
|
||||
{
|
||||
PanicAlertFmt("JVSIOMessage overrun!");
|
||||
return;
|
||||
@ -63,16 +63,26 @@ void JVSIOMessage::AddData(const u8* dst, size_t len, int sync = 0)
|
||||
const u8 c = *dst++;
|
||||
if (!sync && ((c == 0xE0) || (c == 0xD0)))
|
||||
{
|
||||
m_msg[m_ptr++] = 0xD0;
|
||||
m_msg[m_ptr++] = c - 1;
|
||||
if (m_pointer + 2 > sizeof(m_message))
|
||||
{
|
||||
PanicAlertFmt("JVSIOMessage overrun!");
|
||||
break;
|
||||
}
|
||||
m_message[m_pointer++] = 0xD0;
|
||||
m_message[m_pointer++] = c - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_msg[m_ptr++] = c;
|
||||
if (m_pointer >= sizeof(m_message))
|
||||
{
|
||||
PanicAlertFmt("JVSIOMessage overrun!");
|
||||
break;
|
||||
}
|
||||
m_message[m_pointer++] = c;
|
||||
}
|
||||
|
||||
if (!sync)
|
||||
m_csum += c;
|
||||
m_checksum += c;
|
||||
sync = 0;
|
||||
}
|
||||
}
|
||||
@ -95,9 +105,16 @@ void JVSIOMessage::AddData(u32 n)
|
||||
|
||||
void JVSIOMessage::End()
|
||||
{
|
||||
const u32 len = m_ptr - m_last_start;
|
||||
m_msg[m_last_start + 2] = len - 2; // assuming len <0xD0
|
||||
AddData(m_csum + len - 2);
|
||||
const u32 len = m_pointer - m_last_start;
|
||||
if (m_last_start + 2 < sizeof(m_message) && len >= 3)
|
||||
{
|
||||
m_message[m_last_start + 2] = len - 2; // assuming len <0xD0
|
||||
AddData(m_checksum + len - 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
PanicAlertFmt("JVSIOMessage: Not enough space for checksum!");
|
||||
}
|
||||
}
|
||||
|
||||
static u8 CheckSumXOR(u8* data, u32 length)
|
||||
@ -2095,8 +2112,8 @@ int CSIDevice_AMBaseboard::RunBuffer(u8* buffer, int request_length)
|
||||
|
||||
data_out[data_offset++] = gcam_command;
|
||||
|
||||
const u8* buf = message.m_msg.data();
|
||||
const u32 len = message.m_ptr;
|
||||
const u8* buf = message.m_message.data();
|
||||
const u32 len = message.m_pointer;
|
||||
data_out[data_offset++] = len;
|
||||
|
||||
for (u32 i = 0; i < len; ++i)
|
||||
|
||||
@ -26,12 +26,12 @@ public:
|
||||
void AddData(u32 n);
|
||||
void End();
|
||||
|
||||
u32 m_ptr = 0;
|
||||
std::array<u8, 0x80> m_msg;
|
||||
u32 m_pointer = 0;
|
||||
std::array<u8, 0x80> m_message;
|
||||
|
||||
private:
|
||||
u32 m_last_start = 0;
|
||||
u32 m_csum = 0;
|
||||
u32 m_checksum = 0;
|
||||
};
|
||||
|
||||
// Triforce (GC-AM) baseboard
|
||||
|
||||
@ -31,41 +31,24 @@ std::string VolumeDisc::GetGameID(const Partition& partition) const
|
||||
|
||||
memcpy(id + 1, boot_id->game_id.data() + 2, 2);
|
||||
|
||||
switch (boot_id->region_flags)
|
||||
switch (GetCountry())
|
||||
{
|
||||
default:
|
||||
case 0x02: // JAPAN
|
||||
case Country::Japan:
|
||||
id[3] = 'J';
|
||||
break;
|
||||
case 0x08: // ASIA
|
||||
case Country::Taiwan:
|
||||
id[3] = 'W';
|
||||
break;
|
||||
case 0x0E: // USA
|
||||
case Country::USA:
|
||||
id[3] = 'E';
|
||||
break;
|
||||
case 0x0C: // EXPORT
|
||||
case Country::Europe:
|
||||
id[3] = 'P';
|
||||
break;
|
||||
}
|
||||
|
||||
// There only seem to be three different makers here,
|
||||
// so we can just check the first char to difference between them.
|
||||
//
|
||||
// NAMCO CORPORATION, SEGA CORPORATION and Hitmaker co,ltd.
|
||||
|
||||
switch (boot_id->manufacturer[0])
|
||||
{
|
||||
case 'N': // NAMCO CORPORATION
|
||||
id[4] = '8';
|
||||
id[5] = '2';
|
||||
break;
|
||||
default:
|
||||
case 'H': // Hitmaker co,ltd.
|
||||
case 'S': // SEGA CORPORATION
|
||||
id[4] = '6';
|
||||
id[5] = 'E';
|
||||
break;
|
||||
}
|
||||
memcpy(id + 4, GetMakerID().c_str(), 2);
|
||||
|
||||
return DecodeString(id);
|
||||
}
|
||||
@ -134,6 +117,11 @@ std::string VolumeDisc::GetMakerID(const Partition& partition) const
|
||||
{
|
||||
const BootID* boot_id = static_cast<const VolumeGC*>(this)->GetTriforceBootID();
|
||||
|
||||
// There only seem to be three different makers here,
|
||||
// so we can just check the first char to difference between them.
|
||||
//
|
||||
// NAMCO CORPORATION, SEGA CORPORATION and Hitmaker co,ltd.
|
||||
|
||||
switch (boot_id->manufacturer[0])
|
||||
{
|
||||
case 'S': // SEGA CORPORATION
|
||||
|
||||
Loading…
Reference in New Issue
Block a user