aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ARM.cpp3
-rw-r--r--src/NDS.cpp4
-rw-r--r--src/Wifi.cpp82
3 files changed, 41 insertions, 48 deletions
diff --git a/src/ARM.cpp b/src/ARM.cpp
index a7809f5..bbfb7f7 100644
--- a/src/ARM.cpp
+++ b/src/ARM.cpp
@@ -174,9 +174,6 @@ void ARM::JumpTo(u32 addr, bool restorecpsr)
// aging cart debug crap
//if (addr == 0x0201764C) printf("capture test %d: R1=%08X\n", R[6], R[1]);
//if (addr == 0x020175D8) printf("capture test %d: res=%08X\n", R[6], R[0]);
- /*if (addr==0x037FBD49) printf("zog! %08X\n", R[15]);
- if (addr==0x037FBD4C) printf("zog2 %08X\n", R[15]);
- if (R[15]==0x037FBD54) printf("zog jump to %08X %08X\n", addr, CodeRead32(addr));*/
if (addr & 0x1)
{
diff --git a/src/NDS.cpp b/src/NDS.cpp
index b4f006d..69e7374 100644
--- a/src/NDS.cpp
+++ b/src/NDS.cpp
@@ -1856,7 +1856,7 @@ void ARM9IOWrite32(u32 addr, u32 val)
case 0x04000188:
if (IPCFIFOCnt9 & 0x8000)
- {if((val&0x1F)==0xA)printf("ARM9->ARM7: %08X --- %08X -- %04X\n", val, val>>6, ARM7Read16(val>>6));
+ {
if (IPCFIFO9->IsFull())
IPCFIFOCnt9 |= 0x4000;
else
@@ -2386,7 +2386,7 @@ void ARM7IOWrite32(u32 addr, u32 val)
case 0x04000188:
if (IPCFIFOCnt7 & 0x8000)
- {if((val&0x1F)==0xA)printf("ARM7->ARM9: %08X --- %08X -- %04X\n", val, val>>6, ARM7Read16(val>>6));
+ {
if (IPCFIFO7->IsFull())
IPCFIFOCnt7 |= 0x4000;
else
diff --git a/src/Wifi.cpp b/src/Wifi.cpp
index d479cd8..583bfbc 100644
--- a/src/Wifi.cpp
+++ b/src/Wifi.cpp
@@ -27,6 +27,9 @@
namespace Wifi
{
+//#define WIFI_LOG printf
+#define WIFI_LOG(...) {}
+
u8 RAM[0x2000];
u16 IO[0x1000>>1];
@@ -112,7 +115,9 @@ bool MPInited;
// wifi TODO:
-// * work out how power saving works, there are oddities
+// * power saving
+// * RXSTAT, multiplay reply errors
+// * TX errors (if applicable)
bool Init()
@@ -303,10 +308,6 @@ void StartTX_LocN(int nslot, int loc)
slot->CurPhase = 0;
slot->CurPhaseTime = PreambleLen(slot->Rate);
-
- //int txlen = Platform::MP_SendPacket(&RAM[slot->Addr], 12 + slot->Length);
- //printf("wifi: sent %d/%d bytes of loc%d packet. framectl=%04X\n",
- // txlen, 12+slot->Length, loc, *(u16*)&RAM[slot->Addr + 0xC]);
}
void StartTX_Cmd()
@@ -326,10 +327,6 @@ void StartTX_Cmd()
slot->CurPhase = 0;
slot->CurPhaseTime = PreambleLen(slot->Rate);
-
- //int txlen = Platform::MP_SendPacket(&RAM[slot->Addr], 12 + slot->Length);
- //printf("wifi: sent %d/%d bytes of cmd packet. clients=%04X\n", txlen, 12+slot->Length, *(u16*)&RAM[slot->Addr + 0xC + 26]);
-//printf("%08X%08X | %04X %04X\n", (u32)(USCounter>>32), (u32)USCounter, slot->Addr, *(u16*)&RAM[slot->Addr + 0xC]);
}
void StartTX_Beacon()
@@ -346,14 +343,6 @@ void StartTX_Beacon()
slot->CurPhase = 0;
slot->CurPhaseTime = PreambleLen(slot->Rate);
- u64 oldval = *(u64*)&RAM[slot->Addr + 0xC + 24];
- *(u64*)&RAM[slot->Addr + 0xC + 24] = USCounter;
-
- //int txlen = Platform::MP_SendPacket(&RAM[slot->Addr], 12 + slot->Length);
- //printf("wifi: sent %d/%d bytes of beacon packet\n", txlen, 12+slot->Length);
-
- //*(u64*)&RAM[slot->Addr + 0xC + 24] = oldval;
-
IOPORT(W_TXBusy) |= 0x0010;
}
@@ -405,11 +394,16 @@ void SendMPReply(u16 clienttime, u16 clientmask)
// mark the last packet as success. dunno what the MSB is, it changes.
if (IOPORT(W_TXSlotReply2) & 0x8000)
- *(u16*)&RAM[slot->Addr] = 0x1201;
+ *(u16*)&RAM[slot->Addr] = 0x0001;
IOPORT(W_TXSlotReply2) = IOPORT(W_TXSlotReply1);
IOPORT(W_TXSlotReply1) = 0;
+ // this seems to be set upon IRQ0
+ // TODO: how does it behave if the packet addr is changed before it gets sent?
+ slot->Addr = (IOPORT(W_TXSlotReply2) & 0x0FFF) << 1;
+ *(u16*)&RAM[slot->Addr + 0x4] = 0x0001;
+
u16 clientnum = 0;
for (int i = 1; i < IOPORT(W_AIDLow); i++)
{
@@ -450,7 +444,7 @@ void SendMPDefaultReply()
*(u32*)&reply[0xC + 0x18] = 0;
int txlen = Platform::MP_SendPacket(reply, 12+28);
- printf("wifi: sent %d/40 bytes of MP default reply\n", txlen);
+ WIFI_LOG("wifi: sent %d/40 bytes of MP default reply\n", txlen);
}
void SendMPAck()
@@ -480,7 +474,7 @@ void SendMPAck()
*(u32*)&ack[0xC + 0x1C] = 0;
int txlen = Platform::MP_SendPacket(ack, 12+32);
- printf("wifi: sent %d/44 bytes of MP ack, %d %d\n", txlen, ComStatus, RXTime);
+ WIFI_LOG("wifi: sent %d/44 bytes of MP ack, %d %d\n", txlen, ComStatus, RXTime);
}
u32 NumClients(u16 bitmask)
@@ -512,10 +506,12 @@ bool ProcessTX(TXSlot* slot, int num)
{
if (CheckRX(true))
{
- printf("wifi: got MP reply! still %d to go\n", MPNumReplies-1);
ComStatus |= 0x1;
}
+ // TODO: properly handle reply errors
+ // also, if the reply is too big to fit within its window, what happens?
+
MPReplyTimer = 10 + IOPORT(W_CmdReplyTime);
MPNumReplies--;
}
@@ -581,22 +577,35 @@ bool ProcessTX(TXSlot* slot, int num)
slot->CurPhase = 1;
slot->CurPhaseTime = len;
+ u64 oldts;
+ if (num == 4)
+ {
+ // beacon timestamp
+ oldts = *(u64*)&RAM[slot->Addr + 0xC + 24];
+ *(u64*)&RAM[slot->Addr + 0xC + 24] = USCounter;
+ }
+
*(u16*)&RAM[slot->Addr + 0xC + 22] = IOPORT(W_TXSeqNo) << 4;
IOPORT(W_TXSeqNo) = (IOPORT(W_TXSeqNo) + 1) & 0x0FFF;
// set TX addr
- // TODO: what does this say when sending a MP ack?? I don't think that packet is stored in RAM
IOPORT(W_RXTXAddr) = slot->Addr >> 1;
int txlen = Platform::MP_SendPacket(&RAM[slot->Addr], 12 + slot->Length);
- if (num != 4) printf("wifi: sent %d/%d bytes of slot%d packet, addr=%04X, framectl=%04X, %04X %04X\n",
- txlen, slot->Length+12, num, slot->Addr, *(u16*)&RAM[slot->Addr + 0xC], *(u16*)&RAM[slot->Addr + 0x24], *(u16*)&RAM[slot->Addr + 0x26]);
+ WIFI_LOG("wifi: sent %d/%d bytes of slot%d packet, addr=%04X, framectl=%04X, %04X %04X\n",
+ txlen, slot->Length+12, num, slot->Addr, *(u16*)&RAM[slot->Addr + 0xC],
+ *(u16*)&RAM[slot->Addr + 0x24], *(u16*)&RAM[slot->Addr + 0x26]);
+
+ if (num == 4)
+ {
+ *(u64*)&RAM[slot->Addr + 0xC + 24] = oldts;
+ }
}
break;
case 1: // transmit done
{
- // checkme
+ // for the MP reply slot, this is set later
if (num != 5)
*(u16*)&RAM[slot->Addr] = 0x0001;
RAM[slot->Addr + 5] = 0;
@@ -822,9 +831,8 @@ bool CheckRX(bool block)
break;
}
- //if (framectl != 0x0080 && framectl != 0x0228)
- printf("wifi: received packet FC:%04X SN:%04X CL:%04X RXT:%d CMT:%d\n",
- framectl, *(u16*)&RXBuffer[12+4+6+6+6], *(u16*)&RXBuffer[12+4+6+6+6+2+2], framelen*4, IOPORT(W_CmdReplyTime));
+ WIFI_LOG("wifi: received packet FC:%04X SN:%04X CL:%04X RXT:%d CMT:%d\n",
+ framectl, *(u16*)&RXBuffer[12+4+6+6+6], *(u16*)&RXBuffer[12+4+6+6+6+2+2], framelen*4, IOPORT(W_CmdReplyTime));
// make RX header
@@ -883,9 +891,6 @@ void MSTimer()
IOPORT(W_BeaconCount2)--;
if (IOPORT(W_BeaconCount2) == 0) SetIRQ13();
}
-
- //if (!IOPORT(W_TXBusy))
- // CheckRX(false);
}
void USTimer(u32 param)
@@ -902,8 +907,6 @@ void USTimer(u32 param)
}
if (!uspart) MSTimer();
-
- //if (!(uspart & 0x1FF)) CheckRX(false);
}
if (IOPORT(W_CmdCountCnt) & 0x0001)
@@ -972,7 +975,7 @@ void USTimer(u32 param)
{
u16 addr = IOPORT(W_RXTXAddr) << 1;
*(u16*)&RAM[addr] = *(u16*)&RXBuffer[RXBufferPtr];
-//printf("RX: addr=%04X, time=%d\n", addr, RXTime);
+
IncrementRXAddr(addr);
RXBufferPtr += 2;
@@ -993,7 +996,7 @@ void USTimer(u32 param)
SetIRQ(0);
SetStatus(1);
- printf("wifi: finished receiving packet %04X\n", *(u16*)&RXBuffer[12]);
+ WIFI_LOG("wifi: finished receiving packet %04X\n", *(u16*)&RXBuffer[12]);
ComStatus &= ~0x1;
RXCounter = 0;
@@ -1075,7 +1078,7 @@ u16 Read(u32 addr)
addr &= 0x7FFE;
//printf("WIFI: read %08X\n", addr);
if (addr >= 0x4000 && addr < 0x6000)
- {if (addr>=0x5F60 && addr<0x5F80) printf("wifi: read mysterious RAM shit %04X\n", addr);
+ {
return *(u16*)&RAM[addr & 0x1FFE];
}
if (addr >= 0x2000 && addr < 0x4000)
@@ -1331,11 +1334,9 @@ void Write(u32 addr, u16 val)
if (val & 0x0001)
{
IOPORT(W_RXBufWriteCursor) = IOPORT(W_RXBufWriteAddr);
- printf("wifi: force WRCSR to %04X\n", IOPORT(W_RXBufWriteCursor));
}
if (val & 0x0080)
{
- printf("wifi: latching shit\n");
IOPORT(W_TXSlotReply2) = IOPORT(W_TXSlotReply1);
IOPORT(W_TXSlotReply1) = 0;
}
@@ -1427,11 +1428,6 @@ void Write(u32 addr, u16 val)
FireTX();
return;
- case 0x094:
- printf("wifi: trying to send packet. %08X=%04X. TXREQ=%04X.\n",
- addr, val, IOPORT(W_TXReqRead));
- break;
-
case 0x228:
case 0x244:
printf("wifi: write port%03X %04X\n", addr, val);