aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ARM.cpp3
-rw-r--r--src/GPU3D.cpp1
-rw-r--r--src/NDS.cpp8
-rw-r--r--src/SPU.cpp6
-rw-r--r--src/Wifi.cpp48
5 files changed, 66 insertions, 0 deletions
diff --git a/src/ARM.cpp b/src/ARM.cpp
index bbfb7f7..a7809f5 100644
--- a/src/ARM.cpp
+++ b/src/ARM.cpp
@@ -174,6 +174,9 @@ 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/GPU3D.cpp b/src/GPU3D.cpp
index de2916c..0f700d9 100644
--- a/src/GPU3D.cpp
+++ b/src/GPU3D.cpp
@@ -1001,6 +1001,7 @@ s32 CalculateLighting()
// according to some hardware tests
// * diffuse level is saturated to 255
// * shininess level mirrors back to 0 and is ANDed with 0xFF, that before being squared
+ // TODO: check how it behaves when the computed shininess is >=0x200
s32 difflevel = (-(LightDirection[i][0]*normaltrans[0] +
LightDirection[i][1]*normaltrans[1] +
diff --git a/src/NDS.cpp b/src/NDS.cpp
index 6f878ee..5eb8657 100644
--- a/src/NDS.cpp
+++ b/src/NDS.cpp
@@ -837,6 +837,14 @@ void debug(u32 param)
fwrite(&val, 4, 1, shit);
}
fclose(shit);*/
+ /*FILE*
+ shit = fopen("debug/pictochat7.bin", "wb");
+ for (u32 i = 0x037F0000; i < 0x03810000; i+=4)
+ {
+ u32 val = ARM7Read32(i);
+ fwrite(&val, 4, 1, shit);
+ }
+ fclose(shit);*/
}
diff --git a/src/SPU.cpp b/src/SPU.cpp
index 002cde6..5c4a347 100644
--- a/src/SPU.cpp
+++ b/src/SPU.cpp
@@ -22,6 +22,12 @@
#include "SPU.h"
+// SPU TODO
+// * loop mode 3, what does it do?
+// * the FIFO, whatever it is. GBAtek mentions it but gives no details.
+// * consider mixing every sample instead of every 16?
+
+
namespace SPU
{
diff --git a/src/Wifi.cpp b/src/Wifi.cpp
index 37039c5..d454dd0 100644
--- a/src/Wifi.cpp
+++ b/src/Wifi.cpp
@@ -48,6 +48,32 @@ u16 RFData2;
u32 RFRegs[0x40];
+// multiplayer host TX sequence:
+// 1. preamble
+// 2. IRQ7
+// 3. send data
+// 4. wait for client replies (duration: 112 + ((10 * CMD_REPLYTIME) * numclients))
+// 5. IRQ7
+// 6. send ack (16 bytes)
+// 7. IRQ12 (and optional IRQ1)
+//
+// RFSTATUS values:
+// 0 = initial
+// 1 = RX????
+// 2 = switching from RX to TX
+// 3 = TX
+// 4 = switching from TX to RX
+// 5 = MP host data sent, waiting for replies (RFPINS=0x0084)
+// 6 = RX
+// 7 = ??
+// 8 = MP host sending ack (RFPINS=0x0046)
+// 9 = idle
+
+
+// wifi TODO:
+// * work out how power saving works, there are oddities
+
+
void Reset()
{
memset(RAM, 0, 0x2000);
@@ -131,6 +157,13 @@ void SetIRQ14(bool forced)
IOPORT(W_TXReqRead) &= 0xFFF2; // todo, eventually?
// TODO: actually send beacon
+ if (IOPORT(W_TXSlotBeacon) & 0x8000)
+ {
+ printf("SEND BEACON\n");
+ /*FILE* f = fopen("beacon.bin", "wb");
+ fwrite(RAM, 0x2000, 1, f);
+ fclose(f);*/
+ }
if (IOPORT(W_ListenCount) == 0)
IOPORT(W_ListenCount) = IOPORT(W_ListenInterval);
@@ -460,6 +493,21 @@ void Write(u32 addr, u16 val)
break;
+ case W_RXCnt:
+ if (val & 0x0001)
+ {
+ IOPORT(W_RXBufWriteCursor) = IOPORT(W_RXBufWriteAddr);
+ }
+ if (val & 0x0080)
+ {
+ IOPORT(W_TXSlotReply2) = IOPORT(W_TXSlotReply1);
+ IOPORT(W_TXSlotReply1) = 0;
+ }
+ val &= 0xFF0E;
+ if (val & 0x7FFF) printf("wifi: unknown RXCNT bits set %04X\n", val);
+ break;
+
+
case W_TXBufDataWrite:
{
u32 wraddr = IOPORT(W_TXBufWriteAddr) & 0x1FFE;