mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-27 00:00:07 -06:00
here have more shitty code
This commit is contained in:
@ -30,6 +30,29 @@ namespace IPC
|
|||||||
QSharedMemory* Buffer = nullptr;
|
QSharedMemory* Buffer = nullptr;
|
||||||
int InstanceID;
|
int InstanceID;
|
||||||
|
|
||||||
|
struct BufferHeader
|
||||||
|
{
|
||||||
|
u16 NumInstances;
|
||||||
|
u16 InstanceBitmask; // bitmask of all instances present
|
||||||
|
u32 CommandWriteOffset;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CommandHeader
|
||||||
|
{
|
||||||
|
u32 Magic;
|
||||||
|
u16 SenderID;
|
||||||
|
u16 Recipients;
|
||||||
|
u16 Command;
|
||||||
|
u16 Length;
|
||||||
|
};
|
||||||
|
|
||||||
|
u32 CommandReadOffset;
|
||||||
|
|
||||||
|
const u32 kBufferSize = 0x4000;
|
||||||
|
const u32 kMaxCommandSize = 0x800;
|
||||||
|
const u32 kCommandStart = sizeof(BufferHeader);
|
||||||
|
const u32 kCommandEnd = kBufferSize;
|
||||||
|
|
||||||
|
|
||||||
void Init()
|
void Init()
|
||||||
{
|
{
|
||||||
@ -40,7 +63,7 @@ void Init()
|
|||||||
if (!Buffer->attach())
|
if (!Buffer->attach())
|
||||||
{
|
{
|
||||||
printf("IPC sharedmem doesn't exist. creating\n");
|
printf("IPC sharedmem doesn't exist. creating\n");
|
||||||
if (!Buffer->create(1024))
|
if (!Buffer->create(kBufferSize))
|
||||||
{
|
{
|
||||||
printf("IPC sharedmem create failed :(\n");
|
printf("IPC sharedmem create failed :(\n");
|
||||||
delete Buffer;
|
delete Buffer;
|
||||||
@ -55,13 +78,15 @@ void Init()
|
|||||||
|
|
||||||
Buffer->lock();
|
Buffer->lock();
|
||||||
u8* data = (u8*)Buffer->data();
|
u8* data = (u8*)Buffer->data();
|
||||||
u16 mask = *(u16*)&data[0];
|
BufferHeader* header = (BufferHeader*)&data[0];
|
||||||
|
u16 mask = header->InstanceBitmask;
|
||||||
for (int i = 0; i < 16; i++)
|
for (int i = 0; i < 16; i++)
|
||||||
{
|
{
|
||||||
if (!(mask & (1<<i)))
|
if (!(mask & (1<<i)))
|
||||||
{
|
{
|
||||||
InstanceID = i;
|
InstanceID = i;
|
||||||
*(u16*)&data[0] |= (1<<i);
|
header->InstanceBitmask |= (1<<i);
|
||||||
|
header->NumInstances++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -76,7 +101,9 @@ void DeInit()
|
|||||||
{
|
{
|
||||||
Buffer->lock();
|
Buffer->lock();
|
||||||
u8* data = (u8*)Buffer->data();
|
u8* data = (u8*)Buffer->data();
|
||||||
*(u16*)&data[0] &= ~(1<<InstanceID);
|
BufferHeader* header = (BufferHeader*)&data[0];
|
||||||
|
header->InstanceBitmask &= ~(1<<InstanceID);
|
||||||
|
header->NumInstances--;
|
||||||
Buffer->unlock();
|
Buffer->unlock();
|
||||||
|
|
||||||
Buffer->detach();
|
Buffer->detach();
|
||||||
@ -85,4 +112,58 @@ void DeInit()
|
|||||||
Buffer = nullptr;
|
Buffer = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FIFORead(void* buf, int len)
|
||||||
|
{
|
||||||
|
u8* data = (u8*)Buffer->data();
|
||||||
|
|
||||||
|
u32 offset, start, end;
|
||||||
|
|
||||||
|
offset = CommandReadOffset;
|
||||||
|
start = kCommandStart;
|
||||||
|
end = kCommandEnd;
|
||||||
|
|
||||||
|
if ((offset + len) >= end)
|
||||||
|
{
|
||||||
|
u32 part1 = end - offset;
|
||||||
|
memcpy(buf, &data[offset], part1);
|
||||||
|
memcpy(&((u8*)buf)[part1], &data[start], len - part1);
|
||||||
|
offset = start + len - part1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memcpy(buf, &data[offset], len);
|
||||||
|
offset += len;
|
||||||
|
}
|
||||||
|
|
||||||
|
CommandReadOffset = offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FIFOWrite(void* buf, int len)
|
||||||
|
{
|
||||||
|
u8* data = (u8*)Buffer->data();
|
||||||
|
BufferHeader* header = (BufferHeader*)&data[0];
|
||||||
|
|
||||||
|
u32 offset, start, end;
|
||||||
|
|
||||||
|
offset = header->CommandWriteOffset;
|
||||||
|
start = kCommandStart;
|
||||||
|
end = kCommandEnd;
|
||||||
|
|
||||||
|
if ((offset + len) >= end)
|
||||||
|
{
|
||||||
|
u32 part1 = end - offset;
|
||||||
|
memcpy(&data[offset], buf, part1);
|
||||||
|
memcpy(&data[start], &((u8*)buf)[part1], len - part1);
|
||||||
|
offset = start + len - part1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memcpy(&data[offset], buf, len);
|
||||||
|
offset += len;
|
||||||
|
}
|
||||||
|
|
||||||
|
header->CommandWriteOffset = offset;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -67,15 +67,6 @@ struct MPPacketHeader
|
|||||||
u64 Timestamp;
|
u64 Timestamp;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct MPSync
|
|
||||||
{
|
|
||||||
u32 Magic;
|
|
||||||
u32 SenderID;
|
|
||||||
u16 ClientMask;
|
|
||||||
u16 Type;
|
|
||||||
u64 Timestamp;
|
|
||||||
};
|
|
||||||
|
|
||||||
QSharedMemory* MPQueue;
|
QSharedMemory* MPQueue;
|
||||||
int InstanceID;
|
int InstanceID;
|
||||||
u32 PacketReadOffset;
|
u32 PacketReadOffset;
|
||||||
|
Reference in New Issue
Block a user