aboutsummaryrefslogtreecommitdiff
path: root/src/DSi_NWifi.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/DSi_NWifi.cpp')
-rw-r--r--src/DSi_NWifi.cpp214
1 files changed, 196 insertions, 18 deletions
diff --git a/src/DSi_NWifi.cpp b/src/DSi_NWifi.cpp
index 5236551..e0591fb 100644
--- a/src/DSi_NWifi.cpp
+++ b/src/DSi_NWifi.cpp
@@ -114,11 +114,20 @@ DSi_NWifi::DSi_NWifi(DSi_SDHost* host) : DSi_SDDevice(host)
{
TransferCmd = 0xFFFFFFFF;
RemSize = 0;
+
+ WindowData = 0;
+ WindowReadAddr = 0;
+ WindowWriteAddr = 0;
+
+ // TODO: check the actual mailbox size (presumably 0x200)
+ for (int i = 0; i < 8; i++)
+ Mailbox[i] = new FIFO<u8>(0x200);
}
DSi_NWifi::~DSi_NWifi()
{
- //
+ for (int i = 0; i < 8; i++)
+ delete Mailbox[i];
}
@@ -165,9 +174,54 @@ void DSi_NWifi::F0_Write(u32 addr, u8 val)
u8 DSi_NWifi::F1_Read(u32 addr)
-{
- switch (addr)
+{printf("F1 READ %05X\n", addr);
+ if (addr < 0x100)
+ {
+ return Mailbox[4]->Read();
+ }
+ else if (addr < 0x200)
+ {
+ return Mailbox[5]->Read();
+ }
+ else if (addr < 0x300)
+ {
+ return Mailbox[6]->Read();
+ }
+ else if (addr < 0x400)
+ {
+ return Mailbox[7]->Read();
+ }
+ else if (addr < 0x800)
+ {
+ switch (addr)
+ {
+ case 0x00450: return 1; // HAX!!
+
+ case 0x00474: return WindowData & 0xFF;
+ case 0x00475: return (WindowData >> 8) & 0xFF;
+ case 0x00476: return (WindowData >> 16) & 0xFF;
+ case 0x00477: return WindowData >> 24;
+ }
+ }
+ else if (addr < 0x1000)
+ {
+ return Mailbox[4]->Read();
+ }
+ else if (addr < 0x1800)
+ {
+ return Mailbox[5]->Read();
+ }
+ else if (addr < 0x2000)
+ {
+ return Mailbox[6]->Read();
+ }
+ else if (addr < 0x2800)
+ {
+ return Mailbox[7]->Read();
+ }
+ else
{
+ return Mailbox[4]->Read();
}
printf("NWIFI: unknown func1 read %05X\n", addr);
@@ -175,7 +229,91 @@ u8 DSi_NWifi::F1_Read(u32 addr)
}
void DSi_NWifi::F1_Write(u32 addr, u8 val)
-{
+{printf("F1 WRITE %05X %02X\n", addr, val);
+ if (addr < 0x100)
+ {
+ if (Mailbox[0]->IsFull()) printf("!!! NWIFI: MBOX0 FULL\n");
+ Mailbox[0]->Write(val);
+ if (addr == 0xFF) BMI_Command();
+ return;
+ }
+ else if (addr < 0x200)
+ {
+ if (Mailbox[1]->IsFull()) printf("!!! NWIFI: MBOX1 FULL\n");
+ Mailbox[1]->Write(val);
+ return;
+ }
+ else if (addr < 0x300)
+ {
+ if (Mailbox[2]->IsFull()) printf("!!! NWIFI: MBOX2 FULL\n");
+ Mailbox[2]->Write(val);
+ return;
+ }
+ else if (addr < 0x400)
+ {
+ if (Mailbox[3]->IsFull()) printf("!!! NWIFI: MBOX3 FULL\n");
+ Mailbox[3]->Write(val);
+ return;
+ }
+ else if (addr < 0x800)
+ {
+ switch (addr)
+ {
+ case 0x00474: WindowData = (WindowData & 0xFFFFFF00) | val; return;
+ case 0x00475: WindowData = (WindowData & 0xFFFF00FF) | (val << 8); return;
+ case 0x00476: WindowData = (WindowData & 0xFF00FFFF) | (val << 16); return;
+ case 0x00477: WindowData = (WindowData & 0x00FFFFFF) | (val << 24); return;
+
+ case 0x00478:
+ WindowWriteAddr = (WindowWriteAddr & 0xFFFFFF00) | val;
+ WindowWrite();
+ return;
+ case 0x00479: WindowWriteAddr = (WindowWriteAddr & 0xFFFF00FF) | (val << 8); return;
+ case 0x0047A: WindowWriteAddr = (WindowWriteAddr & 0xFF00FFFF) | (val << 16); return;
+ case 0x0047B: WindowWriteAddr = (WindowWriteAddr & 0x00FFFFFF) | (val << 24); return;
+
+ case 0x0047C:
+ WindowReadAddr = (WindowReadAddr & 0xFFFFFF00) | val;
+ WindowRead();
+ return;
+ case 0x0047D: WindowReadAddr = (WindowReadAddr & 0xFFFF00FF) | (val << 8); return;
+ case 0x0047E: WindowReadAddr = (WindowReadAddr & 0xFF00FFFF) | (val << 16); return;
+ case 0x0047F: WindowReadAddr = (WindowReadAddr & 0x00FFFFFF) | (val << 24); return;
+ }
+ }
+ else if (addr < 0x1000)
+ {
+ if (Mailbox[0]->IsFull()) printf("!!! NWIFI: MBOX0 FULL\n");
+ Mailbox[0]->Write(val);
+ if (addr == 0xFFF) BMI_Command();
+ return;
+ }
+ else if (addr < 0x1800)
+ {
+ if (Mailbox[1]->IsFull()) printf("!!! NWIFI: MBOX1 FULL\n");
+ Mailbox[1]->Write(val);
+ return;
+ }
+ else if (addr < 0x2000)
+ {
+ if (Mailbox[2]->IsFull()) printf("!!! NWIFI: MBOX2 FULL\n");
+ Mailbox[2]->Write(val);
+ return;
+ }
+ else if (addr < 0x2800)
+ {
+ if (Mailbox[3]->IsFull()) printf("!!! NWIFI: MBOX3 FULL\n");
+ Mailbox[3]->Write(val);
+ return;
+ }
+ else
+ {
+ if (Mailbox[0]->IsFull()) printf("!!! NWIFI: MBOX0 FULL\n");
+ Mailbox[0]->Write(val);
+ if (addr == 0x3FFF) BMI_Command(); // CHECKME
+ return;
+ }
+
printf("NWIFI: unknown func1 write %05X %02X\n", addr, val);
}
@@ -185,6 +323,7 @@ u8 DSi_NWifi::SDIO_Read(u32 func, u32 addr)
switch (func)
{
case 0: return F0_Read(addr);
+ case 1: return F1_Read(addr);
}
printf("NWIFI: unknown SDIO read %d %05X\n", func, addr);
@@ -196,6 +335,7 @@ void DSi_NWifi::SDIO_Write(u32 func, u32 addr, u8 val)
switch (func)
{
case 0: return F0_Write(addr, val);
+ case 1: return F1_Write(addr, val);
}
printf("NWIFI: unknown SDIO write %d %05X %02X\n", func, addr, val);
@@ -203,7 +343,7 @@ void DSi_NWifi::SDIO_Write(u32 func, u32 addr, u8 val)
void DSi_NWifi::SendCMD(u8 cmd, u32 param)
-{
+{printf("NWIFI CMD %d %08X %08X\n", cmd, param, NDS::GetPC(1));
switch (cmd)
{
case 52: // IO_RW_DIRECT
@@ -315,24 +455,62 @@ void DSi_NWifi::WriteBlock()
u32 len = (TransferCmd & (1<<27)) ? 0x200 : RemSize;
u8 data[0x200];
- Host->ReceiveData(data, len);
-
- for (u32 i = 0; i < len; i++)
+ if (Host->ReceiveData(data, len))
{
- SDIO_Write(func, TransferAddr, data[i]);
- if (TransferCmd & (1<<26))
+ for (u32 i = 0; i < len; i++)
{
- TransferAddr++;
- TransferAddr &= 0x1FFFF; // checkme
+ SDIO_Write(func, TransferAddr, data[i]);
+ if (TransferCmd & (1<<26))
+ {
+ TransferAddr++;
+ TransferAddr &= 0x1FFFF; // checkme
+ }
}
- }
- if (RemSize > 0)
- {
- RemSize -= len;
- if (RemSize == 0)
+ if (RemSize > 0)
{
- // TODO?
+ RemSize -= len;
+ if (RemSize == 0)
+ {
+ // TODO?
+ }
}
}
}
+
+
+void DSi_NWifi::BMI_Command()
+{
+ // HLE command handling stub
+ u32 cmd = MB_Read32(0);
+ printf("BMI: cmd %08X\n", cmd);
+
+ switch (cmd)
+ {
+ case 0x08: // BMI_GET_TARGET_ID
+ MB_Write32(4, 0xFFFFFFFF);
+ MB_Write32(4, 0x0000000C);
+ MB_Write32(4, 0x20000118);
+ MB_Write32(4, 0x00000002);
+ return;
+ }
+}
+
+
+void DSi_NWifi::WindowRead()
+{
+ printf("NWifi: window read %08X\n", WindowReadAddr);
+
+ switch (WindowReadAddr)
+ {
+ case 0x40EC: WindowData = 0x02000001; return;
+
+ // SOC_RESET_CAUSE
+ case 0x40C0: WindowData = 2; return;
+ }
+}
+
+void DSi_NWifi::WindowWrite()
+{
+ printf("NWifi: window write %08X %08X\n", WindowWriteAddr, WindowData);
+}