diff options
Diffstat (limited to 'src/Wifi.cpp')
-rw-r--r-- | src/Wifi.cpp | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/src/Wifi.cpp b/src/Wifi.cpp new file mode 100644 index 0000000..0f1c239 --- /dev/null +++ b/src/Wifi.cpp @@ -0,0 +1,120 @@ +/* + Copyright 2016-2017 StapleButter + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include <stdio.h> +#include <string.h> +#include "NDS.h" +#include "Wifi.h" + + +namespace Wifi +{ + +u16 BBCnt; +u8 BBWrite; +u8 BBRegs[0x100]; +u8 BBRegsRO[0x100]; + + +void Reset() +{ + BBCnt = 0; + BBWrite = 0; + memset(BBRegs, 0, 0x100); + memset(BBRegsRO, 0, 0x100); + + #define BBREG_FIXED(id, val) BBRegs[id] = val; BBRegsRO[id] = 1; + BBREG_FIXED(0x00, 0x6D); + BBREG_FIXED(0x0D, 0x00); + BBREG_FIXED(0x0E, 0x00); + BBREG_FIXED(0x0F, 0x00); + BBREG_FIXED(0x10, 0x00); + BBREG_FIXED(0x11, 0x00); + BBREG_FIXED(0x12, 0x00); + BBREG_FIXED(0x16, 0x00); + BBREG_FIXED(0x17, 0x00); + BBREG_FIXED(0x18, 0x00); + BBREG_FIXED(0x19, 0x00); + BBREG_FIXED(0x1A, 0x00); + BBREG_FIXED(0x27, 0x00); + BBREG_FIXED(0x4D, 0x00); // 00 or BF + BBREG_FIXED(0x5D, 0x01); + BBREG_FIXED(0x5E, 0x00); + BBREG_FIXED(0x5F, 0x00); + BBREG_FIXED(0x60, 0x00); + BBREG_FIXED(0x61, 0x00); + BBREG_FIXED(0x64, 0xFF); // FF or 3F + BBREG_FIXED(0x66, 0x00); + for (int i = 0x69; i < 0x100; i++) + { + BBREG_FIXED(i, 0x00); + } + #undef BBREG_FIXED +} + + +u16 Read(u32 addr) +{ + addr &= 0x7FFF; + + switch (addr) + { + case 0x158: + return BBCnt; + + case 0x15C: + if ((BBCnt & 0xF000) != 0x6000) + { + printf("WIFI: bad BB read, CNT=%04X\n", BBCnt); + return 0; + } + return BBRegs[BBCnt & 0xFF]; + + case 0x15E: + return 0; // cheap + } + + printf("WIFI: unknown read %08X\n", addr); + return 0; +} + +void Write(u32 addr, u16 val) +{ + addr &= 0x7FFF; + + switch (addr) + { + case 0x158: + BBCnt = val; + if ((BBCnt & 0xF000) == 0x5000) + { + u32 regid = BBCnt & 0xFF; + if (!BBRegsRO[regid]) + BBRegs[regid] = val & 0xFF; + } + return; + + case 0x15A: + BBWrite = val; + return; + } + + printf("WIFI: unknown write %08X %04X\n", addr, val); +} + +} |