Adhoc wifi notes
The Ultimate Goal
- Getting adhoc wifi working. AKA NSMB multiplayer, pictochat, and many others.
NSMB goes through the following sequence to connect two players together:
- Mario configures the wifi hardware as to send beacons every ~200ms. The beacons are 802.11 standard with extra data (tag DDh as GBATek puts it)
- Luigi receives the beacons and asks "Mario found - want to play?", let's assume the player says Yes
- Luigi associates with Mario, they exchange a few 802.11 standard authentication/association packets
- Mario sends a data frame every 1660µs. 478µs are given Luigi to reply.
- Luigi never replies for some reason. Connection fails.
Luigi does processing on the received data frame before it is fully received (aka between IRQ6 and IRQ0). Once it is fully received it's too late.
That's what we can call tight timing. :P
NSMB's wifi IRQ handler (pseudocode)
(located at 0x037F9504)
while (flags = IF & IE)
if (flags & 0x0080 /* TXSTART */) call 0x037FA528;
if (flags & 0x0040 /* RXSTART */) call 0x037FA5E4;
if (flags & 0x8000 /* PREBEACON */) call 0x037F95E8;
if (flags & 0x4000 /* BEACON */) call 0x037F9674;
if (flags & 0x2000 /* POSTBEACON */) call 0x037F9970;
if (flags & 0x0800 /* RFWAKEUP */) call 0x027EBC08;
if (flags & 0x0008 /* TXERR INC */) call 0x037F9A28;
if (flags & 0x0004 /* RXEVT INC */) call 0x037F9B54;
if (flags & 0x0001 /* RXEND */) call 0x037F9F88;
if (flags & 0x0030 /* TXERR/RXEVT HOVF */) call 0x037F99EC;
if (flags & 0x0002 /* TXEND */) call 0x037F9D18;
if (flags & 0x1000 /* IRQ12 */) call 0x037FA418;
/* clear wifi IRQ flag in main IF */
(edit: fucking mediawiki and its terrible way to handle linebreaks)