From 0c24165d926b73bbad5da30fbe7432fde0601318 Mon Sep 17 00:00:00 2001 From: Ian Brown Date: Tue, 15 Jan 2019 21:31:17 +0000 Subject: [PATCH] implement QueryTotalFreeMemSize() --- Source/iop/Iop_Sysmem.cpp | 27 +++++++++++++++++++++++++++ Source/iop/Iop_Sysmem.h | 1 + 2 files changed, 28 insertions(+) diff --git a/Source/iop/Iop_Sysmem.cpp b/Source/iop/Iop_Sysmem.cpp index 079068d6..6c5c82cb 100644 --- a/Source/iop/Iop_Sysmem.cpp +++ b/Source/iop/Iop_Sysmem.cpp @@ -11,6 +11,7 @@ using namespace Iop; #define FUNCTION_PRINTF "printf" #define FUNCTION_QUERYMEMSIZE "QueryMemSize" #define FUNCTION_QUERYMAXFREEMEMSIZE "QueryMaxFreeMemSize" +#define FUNCTION_QUERYTOTALFREEMEMSIZE "QueryTotalFreeMemSize" #define MIN_BLOCK_SIZE 0x100 @@ -59,6 +60,9 @@ std::string CSysmem::GetFunctionName(unsigned int functionId) const case 7: return FUNCTION_QUERYMAXFREEMEMSIZE; break; + case 8: + return FUNCTION_QUERYTOTALFREEMEMSIZE; + break; case 14: return FUNCTION_PRINTF; break; @@ -88,6 +92,9 @@ void CSysmem::Invoke(CMIPS& context, unsigned int functionId) case 7: context.m_State.nGPR[CMIPS::V0].nD0 = QueryMaxFreeMemSize(); break; + case 8: + context.m_State.nGPR[CMIPS::V0].nD0 = QueryTotalFreeMemSize(); + break; case 14: m_stdio.__printf(context); break; @@ -124,6 +131,9 @@ bool CSysmem::Invoke(uint32 method, uint32* args, uint32 argsSize, uint32* ret, case 0x07: ret[0] = QueryMaxFreeMemSize(); break; + case 0x08: + ret[0] = QueryTotalFreeMemSize(); + break; default: CLog::GetInstance().Print(LOG_NAME, "Unknown method invoked (0x%08X).\r\n", method); break; @@ -131,6 +141,23 @@ bool CSysmem::Invoke(uint32 method, uint32* args, uint32 argsSize, uint32* ret, return true; } +uint32 CSysmem::QueryTotalFreeMemSize() +{ + uint32 totalSize = 0; + uint32 begin = 0; + auto nextBlockId = &m_headBlockId; + auto nextBlock = m_blocks[*nextBlockId]; + while(nextBlock != nullptr) + { + uint32 end = nextBlock->address; + totalSize += (end - begin); + begin = nextBlock->address + nextBlock->size; + nextBlockId = &nextBlock->nextBlockId; + nextBlock = m_blocks[*nextBlockId]; + } + return totalSize; +} + uint32 CSysmem::QueryMaxFreeMemSize() { uint32 maxSize = 0; diff --git a/Source/iop/Iop_Sysmem.h b/Source/iop/Iop_Sysmem.h index 117f8c0d..3714236e 100644 --- a/Source/iop/Iop_Sysmem.h +++ b/Source/iop/Iop_Sysmem.h @@ -39,6 +39,7 @@ namespace Iop uint32 SifFreeMemory(uint32); uint32 QueryMaxFreeMemSize(); + uint32 QueryTotalFreeMemSize(); uint8* m_iopRam = nullptr; BlockListType& m_blocks;