attempt at making the connection process smoother for weird games

This commit is contained in:
Arisotura 2022-08-28 16:41:53 +02:00
parent 22d9f3edad
commit fb73b80674
5 changed files with 51 additions and 17 deletions

View File

@ -156,6 +156,8 @@ void WriteGBASave(const u8* savedata, u32 savelen, u32 writeoffset, u32 writelen
// packet type: DS-style TX header (12 bytes) + original 802.11 frame // packet type: DS-style TX header (12 bytes) + original 802.11 frame
bool MP_Init(); bool MP_Init();
void MP_DeInit(); void MP_DeInit();
void MP_Begin();
void MP_End();
int MP_SendPacket(u8* data, int len, u64 timestamp); int MP_SendPacket(u8* data, int len, u64 timestamp);
int MP_RecvPacket(u8* data, u64* timestamp); int MP_RecvPacket(u8* data, u64* timestamp);
int MP_SendCmd(u8* data, int len, u64 timestamp); int MP_SendCmd(u8* data, int len, u64 timestamp);

View File

@ -225,6 +225,9 @@ void Reset()
memset(&IOPORT(0x018), 0xFF, 6); memset(&IOPORT(0x018), 0xFF, 6);
memset(&IOPORT(0x020), 0xFF, 6); memset(&IOPORT(0x020), 0xFF, 6);
// TODO: find out what the initial values are
IOPORT(W_PowerUS) = 0x0001;
USTimestamp = 0; USTimestamp = 0;
RXTimestamp = 0; RXTimestamp = 0;
@ -1183,7 +1186,7 @@ bool CheckRX(int type) // 0=regular 1=MP replies 2=MP host frames
framelen = *(u16*)&RXBuffer[10]; framelen = *(u16*)&RXBuffer[10];
if (framelen != rxlen-12) if (framelen != rxlen-12)
{ {
printf("bad frame length\n"); printf("bad frame length %d/%d\n", framelen, rxlen-12);
continue; continue;
} }
framelen -= 4; framelen -= 4;
@ -1907,11 +1910,13 @@ void Write(u32 addr, u16 val)
Platform::LAN_Init(); Platform::LAN_Init();
LANInited = true; LANInited = true;
} }
Platform::MP_Begin();
} }
else if (!(IOPORT(W_PowerUS) & 0x0001) && (val & 0x0001)) else if (!(IOPORT(W_PowerUS) & 0x0001) && (val & 0x0001))
{ {
printf("WIFI OFF\n"); printf("WIFI OFF\n");
NDS::CancelEvent(NDS::Event_Wifi); NDS::CancelEvent(NDS::Event_Wifi);
Platform::MP_End();
} }
break; break;
case W_PowerUnk: case W_PowerUnk:
@ -2087,17 +2092,6 @@ void Write(u32 addr, u16 val)
case 0x268: case 0x268:
return; return;
case 0xD0:
printf("RXFILTER=%04X\n", val);
break;
case 0x94:
/*{
u32 pc = NDS::GetPC(1);
if (pc != 0x027F027C && pc != 0x027EBBD4)
printf("SET REPLY1 TO %04X, %08X\n", val, pc);
}*/
break;
default: default:
//printf("WIFI unk: write %08X %04X\n", addr, val); //printf("WIFI unk: write %08X %04X\n", addr, val);
break; break;

View File

@ -42,7 +42,8 @@ u8 PacketBuffer[2048];
struct MPQueueHeader struct MPQueueHeader
{ {
u16 NumInstances; u16 NumInstances;
u16 InstanceBitmask; u16 InstanceBitmask; // bitmask of all instances present
u16 ConnectedBitmask; // bitmask of which instances are ready to send/receive packets
u32 PacketWriteOffset; u32 PacketWriteOffset;
u32 ReplyWriteOffset; u32 ReplyWriteOffset;
u16 MPHostInstanceID; // instance ID from which the last CMD frame was sent u16 MPHostInstanceID; // instance ID from which the last CMD frame was sent
@ -74,7 +75,7 @@ u32 ReplyReadOffset;
const u32 kQueueSize = 0x20000; const u32 kQueueSize = 0x20000;
const u32 kMaxFrameSize = 0x800; const u32 kMaxFrameSize = 0x800;
const u32 kPacketStart = 0x00010; const u32 kPacketStart = sizeof(MPQueueHeader);
const u32 kReplyStart = kQueueSize / 2; const u32 kReplyStart = kQueueSize / 2;
const u32 kPacketEnd = kReplyStart; const u32 kPacketEnd = kReplyStart;
const u32 kReplyEnd = kQueueSize; const u32 kReplyEnd = kQueueSize;
@ -209,6 +210,7 @@ bool Init()
{ {
InstanceID = i; InstanceID = i;
header->InstanceBitmask |= (1<<i); header->InstanceBitmask |= (1<<i);
//header->ConnectedBitmask |= (1 << i);
break; break;
} }
} }
@ -238,7 +240,9 @@ void DeInit()
{ {
MPQueue->lock(); MPQueue->lock();
MPQueueHeader* header = (MPQueueHeader*)MPQueue->data(); MPQueueHeader* header = (MPQueueHeader*)MPQueue->data();
header->ConnectedBitmask &= ~(1 << InstanceID);
header->InstanceBitmask &= ~(1 << InstanceID); header->InstanceBitmask &= ~(1 << InstanceID);
header->NumInstances--;
MPQueue->unlock(); MPQueue->unlock();
SemPoolDeinit(); SemPoolDeinit();
@ -247,6 +251,28 @@ void DeInit()
delete MPQueue; delete MPQueue;
} }
void Begin()
{
MPQueue->lock();
MPQueueHeader* header = (MPQueueHeader*)MPQueue->data();
PacketReadOffset = header->PacketWriteOffset;
ReplyReadOffset = header->ReplyWriteOffset;
SemReset(InstanceID);
SemReset(16+InstanceID);
header->ConnectedBitmask |= (1 << InstanceID);
MPQueue->unlock();
}
void End()
{
MPQueue->lock();
MPQueueHeader* header = (MPQueueHeader*)MPQueue->data();
//SemReset(InstanceID);
//SemReset(16+InstanceID);
header->ConnectedBitmask &= ~(1 << InstanceID);
MPQueue->unlock();
}
void FIFORead(int fifo, void* buf, int len) void FIFORead(int fifo, void* buf, int len)
{ {
u8* data = (u8*)MPQueue->data(); u8* data = (u8*)MPQueue->data();
@ -324,7 +350,7 @@ int SendPacketGeneric(u32 type, u8* packet, int len, u64 timestamp)
u8* data = (u8*)MPQueue->data(); u8* data = (u8*)MPQueue->data();
MPQueueHeader* header = (MPQueueHeader*)&data[0]; MPQueueHeader* header = (MPQueueHeader*)&data[0];
u16 mask = header->InstanceBitmask; u16 mask = header->ConnectedBitmask;
// TODO: check if the FIFO is full! // TODO: check if the FIFO is full!
@ -457,7 +483,7 @@ int RecvHostPacket(u8* packet, u64* timestamp)
MPQueue->lock(); MPQueue->lock();
u8* data = (u8*)MPQueue->data(); u8* data = (u8*)MPQueue->data();
MPQueueHeader* header = (MPQueueHeader*)&data[0]; MPQueueHeader* header = (MPQueueHeader*)&data[0];
u16 curinstmask = header->InstanceBitmask; u16 curinstmask = header->ConnectedBitmask;
MPQueue->unlock(); MPQueue->unlock();
if (!(curinstmask & (1 << LastHostID))) if (!(curinstmask & (1 << LastHostID)))
@ -477,7 +503,7 @@ u16 RecvReplies(u8* packets, u64 timestamp, u16 aidmask)
MPQueue->lock(); MPQueue->lock();
u8* data = (u8*)MPQueue->data(); u8* data = (u8*)MPQueue->data();
MPQueueHeader* header = (MPQueueHeader*)&data[0]; MPQueueHeader* header = (MPQueueHeader*)&data[0];
curinstmask = header->InstanceBitmask; curinstmask = header->ConnectedBitmask;
MPQueue->unlock(); MPQueue->unlock();
} }

View File

@ -26,6 +26,8 @@ namespace LocalMP
bool Init(); bool Init();
void DeInit(); void DeInit();
void Begin();
void End();
int SendPacket(u8* data, int len, u64 timestamp); int SendPacket(u8* data, int len, u64 timestamp);
int RecvPacket(u8* data, u64* timestamp); int RecvPacket(u8* data, u64* timestamp);
int SendCmd(u8* data, int len, u64 timestamp); int SendCmd(u8* data, int len, u64 timestamp);

View File

@ -369,6 +369,16 @@ void MP_DeInit()
return LocalMP::DeInit(); return LocalMP::DeInit();
} }
void MP_Begin()
{
return LocalMP::Begin();
}
void MP_End()
{
return LocalMP::End();
}
int MP_SendPacket(u8* data, int len, u64 timestamp) int MP_SendPacket(u8* data, int len, u64 timestamp)
{ {
return LocalMP::SendPacket(data, len, timestamp); return LocalMP::SendPacket(data, len, timestamp);