From fb73b806749951a4f2853174c7736eccdae45127 Mon Sep 17 00:00:00 2001 From: Arisotura Date: Sun, 28 Aug 2022 16:41:53 +0200 Subject: [PATCH] attempt at making the connection process smoother for weird games --- src/Platform.h | 2 ++ src/Wifi.cpp | 18 ++++++---------- src/frontend/qt_sdl/LocalMP.cpp | 36 +++++++++++++++++++++++++++----- src/frontend/qt_sdl/LocalMP.h | 2 ++ src/frontend/qt_sdl/Platform.cpp | 10 +++++++++ 5 files changed, 51 insertions(+), 17 deletions(-) diff --git a/src/Platform.h b/src/Platform.h index 6d7eaeb3..c502e10b 100644 --- a/src/Platform.h +++ b/src/Platform.h @@ -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 bool MP_Init(); void MP_DeInit(); +void MP_Begin(); +void MP_End(); int MP_SendPacket(u8* data, int len, u64 timestamp); int MP_RecvPacket(u8* data, u64* timestamp); int MP_SendCmd(u8* data, int len, u64 timestamp); diff --git a/src/Wifi.cpp b/src/Wifi.cpp index 9c9d1c68..b98f5658 100644 --- a/src/Wifi.cpp +++ b/src/Wifi.cpp @@ -225,6 +225,9 @@ void Reset() memset(&IOPORT(0x018), 0xFF, 6); memset(&IOPORT(0x020), 0xFF, 6); + // TODO: find out what the initial values are + IOPORT(W_PowerUS) = 0x0001; + USTimestamp = 0; RXTimestamp = 0; @@ -1183,7 +1186,7 @@ bool CheckRX(int type) // 0=regular 1=MP replies 2=MP host frames framelen = *(u16*)&RXBuffer[10]; if (framelen != rxlen-12) { - printf("bad frame length\n"); + printf("bad frame length %d/%d\n", framelen, rxlen-12); continue; } framelen -= 4; @@ -1907,11 +1910,13 @@ void Write(u32 addr, u16 val) Platform::LAN_Init(); LANInited = true; } + Platform::MP_Begin(); } else if (!(IOPORT(W_PowerUS) & 0x0001) && (val & 0x0001)) { printf("WIFI OFF\n"); NDS::CancelEvent(NDS::Event_Wifi); + Platform::MP_End(); } break; case W_PowerUnk: @@ -2087,17 +2092,6 @@ void Write(u32 addr, u16 val) case 0x268: 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: //printf("WIFI unk: write %08X %04X\n", addr, val); break; diff --git a/src/frontend/qt_sdl/LocalMP.cpp b/src/frontend/qt_sdl/LocalMP.cpp index 24a54835..0ef7aca3 100644 --- a/src/frontend/qt_sdl/LocalMP.cpp +++ b/src/frontend/qt_sdl/LocalMP.cpp @@ -42,7 +42,8 @@ u8 PacketBuffer[2048]; struct MPQueueHeader { 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 ReplyWriteOffset; u16 MPHostInstanceID; // instance ID from which the last CMD frame was sent @@ -74,7 +75,7 @@ u32 ReplyReadOffset; const u32 kQueueSize = 0x20000; const u32 kMaxFrameSize = 0x800; -const u32 kPacketStart = 0x00010; +const u32 kPacketStart = sizeof(MPQueueHeader); const u32 kReplyStart = kQueueSize / 2; const u32 kPacketEnd = kReplyStart; const u32 kReplyEnd = kQueueSize; @@ -209,6 +210,7 @@ bool Init() { InstanceID = i; header->InstanceBitmask |= (1<ConnectedBitmask |= (1 << i); break; } } @@ -238,7 +240,9 @@ void DeInit() { MPQueue->lock(); MPQueueHeader* header = (MPQueueHeader*)MPQueue->data(); + header->ConnectedBitmask &= ~(1 << InstanceID); header->InstanceBitmask &= ~(1 << InstanceID); + header->NumInstances--; MPQueue->unlock(); SemPoolDeinit(); @@ -247,6 +251,28 @@ void DeInit() 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) { u8* data = (u8*)MPQueue->data(); @@ -324,7 +350,7 @@ int SendPacketGeneric(u32 type, u8* packet, int len, u64 timestamp) u8* data = (u8*)MPQueue->data(); MPQueueHeader* header = (MPQueueHeader*)&data[0]; - u16 mask = header->InstanceBitmask; + u16 mask = header->ConnectedBitmask; // TODO: check if the FIFO is full! @@ -457,7 +483,7 @@ int RecvHostPacket(u8* packet, u64* timestamp) MPQueue->lock(); u8* data = (u8*)MPQueue->data(); MPQueueHeader* header = (MPQueueHeader*)&data[0]; - u16 curinstmask = header->InstanceBitmask; + u16 curinstmask = header->ConnectedBitmask; MPQueue->unlock(); if (!(curinstmask & (1 << LastHostID))) @@ -477,7 +503,7 @@ u16 RecvReplies(u8* packets, u64 timestamp, u16 aidmask) MPQueue->lock(); u8* data = (u8*)MPQueue->data(); MPQueueHeader* header = (MPQueueHeader*)&data[0]; - curinstmask = header->InstanceBitmask; + curinstmask = header->ConnectedBitmask; MPQueue->unlock(); } diff --git a/src/frontend/qt_sdl/LocalMP.h b/src/frontend/qt_sdl/LocalMP.h index f152400a..d186d214 100644 --- a/src/frontend/qt_sdl/LocalMP.h +++ b/src/frontend/qt_sdl/LocalMP.h @@ -26,6 +26,8 @@ namespace LocalMP bool Init(); void DeInit(); +void Begin(); +void End(); int SendPacket(u8* data, int len, u64 timestamp); int RecvPacket(u8* data, u64* timestamp); int SendCmd(u8* data, int len, u64 timestamp); diff --git a/src/frontend/qt_sdl/Platform.cpp b/src/frontend/qt_sdl/Platform.cpp index d47402a8..63f5a147 100644 --- a/src/frontend/qt_sdl/Platform.cpp +++ b/src/frontend/qt_sdl/Platform.cpp @@ -369,6 +369,16 @@ void MP_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) { return LocalMP::SendPacket(data, len, timestamp);