From a36f9492cca6ae44eb6ca33d29900f78b5b372bf Mon Sep 17 00:00:00 2001
From: bunnei <ericbunnie@gmail.com>
Date: Mon, 31 Mar 2014 21:05:51 -0400
Subject: [PATCH] added support for reading/writing to stack mem

---
 src/core/src/mem_map.cpp       | 34 ++++++++++++++++++++--------------
 src/core/src/mem_map.h         | 12 ++++++++++--
 src/core/src/mem_map_funcs.cpp | 11 ++++++++++-
 3 files changed, 40 insertions(+), 17 deletions(-)

diff --git a/src/core/src/mem_map.cpp b/src/core/src/mem_map.cpp
index 6d57b550a..975a0cf08 100644
--- a/src/core/src/mem_map.cpp
+++ b/src/core/src/mem_map.cpp
@@ -37,26 +37,32 @@ u8*	g_base			= NULL;		///< The base pointer to the auto-mirrored arena.
 
 MemArena g_arena;				///< The MemArena class
 
-u8* g_bootrom			= NULL;		///< Bootrom memory (super secret code/data @ 0x8000) pointer
-u8* g_fcram				= NULL;		///< Main memory (FCRAM) pointer
-u8* g_vram				= NULL;		///< Video memory (VRAM) pointer
+u8* g_bootrom			    = NULL;     ///< Bootrom memory (super secret code/data @ 0x8000) pointer
+u8* g_fcram				    = NULL;	    ///< Main memory (FCRAM) pointer
+u8* g_vram				    = NULL;	    ///< Video memory (VRAM) pointer
+u8* g_scratchpad            = NULL;     ///< [Hack] Seperate mem for stack space because I don't know where this goes
 
-u8* g_physical_bootrom	= NULL;		///< Bootrom physical memory (super secret code/data @ 0x8000)
-u8* g_uncached_bootrom	= NULL;
+u8* g_physical_bootrom	    = NULL;	    ///< Bootrom physical memory (super secret code/data @ 0x8000)
+u8* g_uncached_bootrom	    = NULL;
+
+u8* g_physical_fcram	    = NULL;	    ///< Main physical memory (FCRAM)
+u8* g_physical_vram		    = NULL;	    ///< Video physical memory (VRAM)
+u8* g_physical_scratchpad   = NULL;     ///< Scratchpad memory used for main thread stack
 
-u8* g_physical_fcram	= NULL;		///< Main physical memory (FCRAM)
-u8* g_physical_vram		= NULL;		///< Video physical memory (VRAM)
 
 // We don't declare the IO region in here since its handled by other means.
 static MemoryView g_views[] =
 {
-	{&g_bootrom,	&g_physical_bootrom,	0x00000000, MEM_BOOTROM_SIZE,		0},
-	{NULL,			&g_uncached_bootrom,	0x00010000, MEM_BOOTROM_SIZE,		MV_MIRROR_PREVIOUS},
-//	//{NULL,				NULL,					0x17E00000, MEM_MPCORE_PRIV_SIZE,	0},
-	{&g_vram,		&g_physical_vram,		0x18000000, MEM_VRAM_SIZE,			0},
-//	//{NULL,				NULL,					0x1FF00000, MEM_DSP_SIZE,			0},
-//	//{NULL,				NULL,					0x1FF80000, MEM_AXI_WRAM_SIZE,		0},
-	{&g_fcram,		&g_physical_fcram,		0x20000000, MEM_FCRAM_SIZE,			MV_IS_PRIMARY_RAM},
+    {&g_scratchpad, &g_physical_scratchpad, 0x00000000,             MEM_SCRATCHPAD_SIZE,    0 },
+//  {&g_bootrom,	&g_physical_bootrom,	0x00000000,             MEM_BOOTROM_SIZE,		0},
+//  {NULL,			&g_uncached_bootrom,	0x00010000,             MEM_BOOTROM_SIZE,		MV_MIRROR_PREVIOUS},
+//	{NULL,				NULL,					0x17E00000, MEM_MPCORE_PRIV_SIZE,	0},
+	{&g_vram,		&g_physical_vram,		MEM_VRAM_VADDR,          MEM_VRAM_SIZE,			MV_IS_PRIMARY_RAM},
+//	{NULL,				NULL,					0x1FF00000, MEM_DSP_SIZE,			0},
+//	{NULL,				NULL,					0x1FF80000, MEM_AXI_WRAM_SIZE,		0},
+   
+	{&g_fcram,		&g_physical_fcram,		MEM_FCRAM_VADDR,        MEM_FCRAM_SIZE,			MV_IS_PRIMARY_RAM},
+    
 };
 
 /*static MemoryView views[] =
diff --git a/src/core/src/mem_map.h b/src/core/src/mem_map.h
index 55f02e285..c72e722df 100644
--- a/src/core/src/mem_map.h
+++ b/src/core/src/mem_map.h
@@ -37,10 +37,17 @@
 #define MEM_VRAM_SIZE			0x00600000	///< VRAM size
 #define MEM_DSP_SIZE			0x00080000	///< DSP memory size
 #define MEM_AXI_WRAM_SIZE		0x00080000	///< AXI WRAM size
-#define MEM_FCRAM_SIZE			0x08000000	///< FCRAM size
+#define MEM_FCRAM_SIZE			0x08000000	///< FCRAM size... Really 0x07E00000, but power of 2
+                                            //      works much better
+#define MEM_SCRATCHPAD_SIZE     0x00004000  ///< Typical stack size - TODO: Read from exheader
 
 #define MEM_VRAM_MASK			0x007FFFFF
-#define MEM_FCRAM_MASK			(MEM_FCRAM_SIZE - 1)	///< FCRAm mask
+#define MEM_FCRAM_MASK			(MEM_FCRAM_SIZE - 1)	            ///< FCRAM mask
+#define MEM_SCRATCHPAD_MASK     (MEM_SCRATCHPAD_SIZE - 1)           ///< Scratchpad memory mask
+
+#define MEM_FCRAM_VADDR         0x08000000
+#define MEM_VRAM_VADDR          0x1F000000
+#define MEM_SCRATCHPAD_VADDR    (0x10000000 - MEM_SCRATCHPAD_SIZE)  ///< Scratchpad virtual address
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -60,6 +67,7 @@ extern u8 *g_base;
 // 32-bit: Same as the corresponding physical/virtual pointers.
 extern u8* g_fcram;			///< Main memory
 extern u8* g_vram;			///< Video memory (VRAM)
+extern u8* g_scratchpad;    ///< Stack memory
 
 void Init();
 void Shutdown();
diff --git a/src/core/src/mem_map_funcs.cpp b/src/core/src/mem_map_funcs.cpp
index f00d10f87..c8436b2a4 100644
--- a/src/core/src/mem_map_funcs.cpp
+++ b/src/core/src/mem_map_funcs.cpp
@@ -38,7 +38,11 @@ inline void ReadFromHardware(T &var, const u32 addr)
 
 	if ((addr & 0x3E000000) == 0x08000000) {
 		var = *((const T*)&g_fcram[addr & MEM_FCRAM_MASK]);
-	}
+
+	// Scratchpad memory
+    } else if (addr > MEM_SCRATCHPAD_VADDR && addr <= (MEM_SCRATCHPAD_VADDR + MEM_SCRATCHPAD_SIZE)) {
+        var = *((const T*)&g_scratchpad[addr & MEM_SCRATCHPAD_MASK]);
+    }
 	/*else if ((addr & 0x3F800000) == 0x04000000) {
 		var = *((const T*)&m_pVRAM[addr & VRAM_MASK]);
 	}*/
@@ -61,6 +65,11 @@ inline void WriteToHardware(u32 addr, const T data) {
 		// exheader "special memory" flag is set, however this address can be arbitrary.
 		*(T*)&g_fcram[addr & MEM_FCRAM_MASK] = data;
 		NOTICE_LOG(MEMMAP, "Test2");
+
+    // Scratchpad memory
+    } else if (addr > MEM_SCRATCHPAD_VADDR && addr <= (MEM_SCRATCHPAD_VADDR + MEM_SCRATCHPAD_SIZE)) {
+        *(T*)&g_scratchpad[addr & MEM_SCRATCHPAD_MASK] = data;
+
 	// Heap mapped by ControlMemory:
 	} else if ((addr & 0x3E000000) == 0x08000000) {
 		// TODO(ShizZy): Writes to this virtual address should be put in physical memory at FCRAM + GSP