attempt at making the connection process smoother for weird games
This commit is contained in:
parent
22d9f3edad
commit
fb73b80674
|
@ -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);
|
||||||
|
|
18
src/Wifi.cpp
18
src/Wifi.cpp
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue