From 0303c74d7bf57b7971fbcc1b0650da87ab63d06a Mon Sep 17 00:00:00 2001 From: Arisotura Date: Tue, 20 Sep 2022 19:59:16 +0200 Subject: [PATCH] ensure all the wifi shit is properly savestated and reset. properly update timings for the wifi region when wifi is disabled. --- src/NDS.cpp | 50 +++++++++++++++++++++++-------- src/Wifi.cpp | 58 +++++++++++++++++++++++++++++------- src/frontend/qt_sdl/main.cpp | 3 ++ 3 files changed, 87 insertions(+), 24 deletions(-) diff --git a/src/NDS.cpp b/src/NDS.cpp index 3f0a84bb..d0d16745 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -176,6 +176,7 @@ bool RunningGame; void DivDone(u32 param); void SqrtDone(u32 param); void RunTimer(u32 tid, s32 cycles); +void UpdateWifiTimings(); void SetWifiWaitCnt(u16 val); void SetGBASlotTimings(); @@ -892,9 +893,7 @@ bool DoSavestate(Savestate* file) InitTimings(); SetGBASlotTimings(); - u16 tmp = WifiWaitCnt; - WifiWaitCnt = 0xFFFF; - SetWifiWaitCnt(tmp); // force timing table update + UpdateWifiTimings(); } for (int i = 0; i < 8; i++) @@ -918,6 +917,9 @@ bool DoSavestate(Savestate* file) if (!file->Saving) { GPU::SetPowerCnt(PowerControl9); + + SPU::SetPowerCnt(PowerControl7 & 0x0001); + Wifi::SetPowerCnt(PowerControl7 & 0x0002); } #ifdef JIT_ENABLED @@ -1342,15 +1344,29 @@ void MapSharedWRAM(u8 val) } +void UpdateWifiTimings() +{ + if (PowerControl7 & 0x0002) + { + const int ntimings[4] = {10, 8, 6, 18}; + u16 val = WifiWaitCnt; + + SetARM7RegionTimings(0x04800, 0x04808, Mem7_Wifi0, 16, ntimings[val & 0x3], (val & 0x4) ? 4 : 6); + SetARM7RegionTimings(0x04808, 0x04810, Mem7_Wifi1, 16, ntimings[(val>>3) & 0x3], (val & 0x20) ? 4 : 10); + } + else + { + SetARM7RegionTimings(0x04800, 0x04808, Mem7_Wifi0, 32, 1, 1); + SetARM7RegionTimings(0x04808, 0x04810, Mem7_Wifi1, 32, 1, 1); + } +} + void SetWifiWaitCnt(u16 val) { if (WifiWaitCnt == val) return; WifiWaitCnt = val; - - const int ntimings[4] = {10, 8, 6, 18}; - SetARM7RegionTimings(0x04800, 0x04808, Mem7_Wifi0, 16, ntimings[val & 0x3], (val & 0x4) ? 4 : 6); - SetARM7RegionTimings(0x04808, 0x04810, Mem7_Wifi1, 16, ntimings[(val>>3) & 0x3], (val & 0x20) ? 4 : 10); + UpdateWifiTimings(); } void SetGBASlotTimings() @@ -4188,9 +4204,13 @@ void ARM7IOWrite16(u32 addr, u16 val) return; case 0x04000304: - PowerControl7 = val & 0x0003; - SPU::SetPowerCnt(val & 0x0001); - Wifi::SetPowerCnt(val & 0x0002); + { + u16 change = PowerControl7 ^ val; + PowerControl7 = val & 0x0003; + SPU::SetPowerCnt(val & 0x0001); + Wifi::SetPowerCnt(val & 0x0002); + if (change & 0x0002) UpdateWifiTimings(); + } return; case 0x04000308: @@ -4314,9 +4334,13 @@ void ARM7IOWrite32(u32 addr, u32 val) case 0x04000214: IF[1] &= ~val; UpdateIRQ(1); return; case 0x04000304: - PowerControl7 = val & 0x0003; - SPU::SetPowerCnt(val & 0x0001); - Wifi::SetPowerCnt(val & 0x0002); + { + u16 change = PowerControl7 ^ val; + PowerControl7 = val & 0x0003; + SPU::SetPowerCnt(val & 0x0001); + Wifi::SetPowerCnt(val & 0x0002); + if (change & 0x0002) UpdateWifiTimings(); + } return; case 0x04000308: diff --git a/src/Wifi.cpp b/src/Wifi.cpp index 5b700e76..d5d0780d 100644 --- a/src/Wifi.cpp +++ b/src/Wifi.cpp @@ -65,15 +65,10 @@ bool BlockBeaconIRQ14; u32 CmdCounter; -u16 BBCnt; -u8 BBWrite; u8 BBRegs[0x100]; u8 BBRegsRO[0x100]; u8 RFVersion; -u16 RFCnt; -u16 RFData1; -u16 RFData2; u32 RFRegs[0x40]; struct TXSlot @@ -93,14 +88,12 @@ u8 RXBuffer[2048]; u32 RXBufferPtr; int RXTime; u32 RXHalfwordTimeMask; -u16 RXEndAddr; u32 ComStatus; // 0=waiting for packets 1=receiving 2=sending u32 TXCurSlot; u32 RXCounter; int MPReplyTimer; -u16 MPCurClient; u16 MPClientMask, MPClientFail; u8 MPClientReplies[15*1024]; @@ -241,7 +234,6 @@ void Reset() IOPORT(W_PowerUS) = 0x0001; USTimestamp = 0; - RXTimestamp = 0; USCounter = 0; USCompare = 0; @@ -251,16 +243,25 @@ void Reset() ComStatus = 0; TXCurSlot = -1; RXCounter = 0; - RXTimestamp = 0; + + memset(RXBuffer, 0, sizeof(RXBuffer)); + RXBufferPtr = 0; + RXTime = 0; + RXHalfwordTimeMask = 0xFFFFFFFF; MPReplyTimer = 0; MPClientMask = 0; MPClientFail = 0; + memset(MPClientReplies, 0, sizeof(MPClientReplies)); CmdCounter = 0; + USUntilPowerOn = 0; + ForcePowerOn = false; + IsMPClient = false; NextSync = 0; + RXTimestamp = 0; WifiAP::Reset(); } @@ -277,8 +278,13 @@ void DoSavestate(Savestate* file) file->VarArray(RAM, 0x2000); file->VarArray(IO, 0x1000); + file->Bool32(&Enabled); + file->Bool32(&PowerOn); + file->Var16(&Random); + file->Var32((u32*)&TimerError); + file->VarArray(BBRegs, 0x100); file->VarArray(BBRegsRO, 0x100); @@ -289,14 +295,44 @@ void DoSavestate(Savestate* file) file->Var64(&USCompare); file->Bool32(&BlockBeaconIRQ14); + file->Var32(&CmdCounter); + + file->Var64(&USTimestamp); + + for (int i = 0; i < 6; i++) + { + TXSlot* slot = &TXSlots[i]; + + file->Bool32(&slot->Valid); + file->Var16(&slot->Addr); + file->Var16(&slot->Length); + file->Var8(&slot->Rate); + file->Var8(&slot->CurPhase); + file->Var32((u32*)&slot->CurPhaseTime); + file->Var32(&slot->HalfwordTimeMask); + } + + file->VarArray(RXBuffer, sizeof(RXBuffer)); + file->Var32(&RXBufferPtr); + file->Var32((u32*)&RXTime); + file->Var32(&RXHalfwordTimeMask); + file->Var32(&ComStatus); file->Var32(&TXCurSlot); file->Var32(&RXCounter); file->Var32((u32*)&MPReplyTimer); - //file->Var32((u32*)&MPNumReplies); + file->Var16(&MPClientMask); + file->Var16(&MPClientFail); - file->Var32(&CmdCounter); + file->VarArray(MPClientReplies, sizeof(MPClientReplies)); + + file->Var32((u32*)&USUntilPowerOn); + file->Bool32(&ForcePowerOn); + + file->Bool32(&IsMPClient); + file->Var64(&NextSync); + file->Var64(&RXTimestamp); } diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp index 66481954..47d59843 100644 --- a/src/frontend/qt_sdl/main.cpp +++ b/src/frontend/qt_sdl/main.cpp @@ -1707,6 +1707,9 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) resize(Config::WindowWidth, Config::WindowHeight); + if (Config::FirmwareUsername == "Arisotura") + actMPNewInstance->setText("Fart"); + #ifdef Q_OS_MAC QPoint screenCenter = screen()->availableGeometry().center(); QRect frameGeo = frameGeometry();