From cbe5780837c63d46a0fc83d50102625bf5009959 Mon Sep 17 00:00:00 2001
From: StapleButter <thetotalworm@gmail.com>
Date: Thu, 18 Oct 2018 02:54:48 +0200
Subject: SPI done

---
 src/NDS.cpp |  2 +-
 src/SPI.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/SPI.h   |  3 +++
 3 files changed, 56 insertions(+), 1 deletion(-)

(limited to 'src')

diff --git a/src/NDS.cpp b/src/NDS.cpp
index 1a1714a..d2551dc 100644
--- a/src/NDS.cpp
+++ b/src/NDS.cpp
@@ -512,7 +512,7 @@ bool DoSavestate(Savestate* file)
     NDSCart::DoSavestate(file);
     GPU::DoSavestate(file);
     SPU::DoSavestate(file);
-    // SPI
+    SPI::DoSavestate(file);
     // RTC
     // wifi
 
diff --git a/src/SPI.cpp b/src/SPI.cpp
index 98f5903..3ffb20f 100644
--- a/src/SPI.cpp
+++ b/src/SPI.cpp
@@ -193,6 +193,22 @@ void Reset()
     StatusReg = 0x00;
 }
 
+void DoSavestate(Savestate* file)
+{
+    file->Section("SPFW");
+
+    // CHECKME/TODO: trust the firmware to stay the same?????
+    // embedding the whole firmware in the savestate would be derpo tho??
+
+    file->Var32(&Hold);
+    file->Var8(&CurCmd);
+    file->Var32(&DataPos);
+    file->Var8(&Data);
+
+    file->Var8(&StatusReg);
+    file->Var32(&Addr);
+}
+
 void SetupDirectBoot()
 {
     NDS::ARM9Write32(0x027FF864, 0);
@@ -360,6 +376,19 @@ void Reset()
     RegMasks[4] = 0x0F;
 }
 
+void DoSavestate(Savestate* file)
+{
+    file->Section("SPPW");
+
+    file->Var32(&Hold);
+    file->Var32(&DataPos);
+    file->Var8(&Index);
+    file->Var8(&Data);
+
+    file->VarArray(Registers, 8);
+    file->VarArray(RegMasks, 8); // is that needed??
+}
+
 u8 Read()
 {
     return Data;
@@ -441,6 +470,17 @@ void Reset()
     ConvResult = 0;
 }
 
+void DoSavestate(Savestate* file)
+{
+    file->Section("SPTS");
+
+    file->Var32(&DataPos);
+    file->Var8(&ControlByte);
+    file->Var8(&Data);
+
+    file->Var16(&ConvResult);
+}
+
 void SetTouchCoords(u16 x, u16 y)
 {
     // scr.x = (adc.x-adc.x1) * (scr.x2-scr.x1) / (adc.x2-adc.x1) + (scr.x1-1)
@@ -526,6 +566,18 @@ void Reset()
     SPI_TSC::Reset();
 }
 
+void DoSavestate(Savestate* file)
+{
+    file->Section("SPIG");
+
+    file->Var16(&Cnt);
+    file->Var32(&CurDevice);
+
+    SPI_Firmware::DoSavestate(file);
+    SPI_Powerman::DoSavestate(file);
+    SPI_TSC::DoSavestate(file);
+}
+
 
 void WriteCnt(u16 val)
 {
diff --git a/src/SPI.h b/src/SPI.h
index 04e9471..f2f8e0a 100644
--- a/src/SPI.h
+++ b/src/SPI.h
@@ -19,6 +19,8 @@
 #ifndef SPI_H
 #define SPI_H
 
+#include "Savestate.h"
+
 namespace SPI_Firmware
 {
 
@@ -45,6 +47,7 @@ extern u16 Cnt;
 bool Init();
 void DeInit();
 void Reset();
+void DoSavestate(Savestate* file);
 
 u16 ReadCnt();
 void WriteCnt(u16 val);
-- 
cgit v1.2.3