diff --git a/configure.py b/configure.py index 7826ed5b7..f4fdf5130 100644 --- a/configure.py +++ b/configure.py @@ -763,7 +763,7 @@ config.libs = [ Object(Matching, "JSystem/JKernel/JKRThread.cpp"), Object(Matching, "JSystem/JKernel/JKRAram.cpp"), Object(Matching, "JSystem/JKernel/JKRAramHeap.cpp"), - Object(NonMatching, "JSystem/JKernel/JKRAramBlock.cpp"), + Object(Matching, "JSystem/JKernel/JKRAramBlock.cpp"), Object(NonMatching, "JSystem/JKernel/JKRAramPiece.cpp"), Object(NonMatching, "JSystem/JKernel/JKRAramStream.cpp"), Object(Matching, "JSystem/JKernel/JKRFileLoader.cpp"), diff --git a/src/JSystem/JKernel/JKRAramBlock.cpp b/src/JSystem/JKernel/JKRAramBlock.cpp index 931d4d6e7..a5866ac90 100644 --- a/src/JSystem/JKernel/JKRAramBlock.cpp +++ b/src/JSystem/JKernel/JKRAramBlock.cpp @@ -4,24 +4,64 @@ // #include "JSystem/JKernel/JKRAramBlock.h" +#include "JSystem/JKernel/JKRAramHeap.h" +#include "JSystem/JKernel/JKRHeap.h" #include "dolphin/types.h" /* 802B59A4-802B5A18 .text __ct__12JKRAramBlockFUlUlUlUcb */ -JKRAramBlock::JKRAramBlock(unsigned long, unsigned long, unsigned long, unsigned char, bool) { - /* Nonmatching */ +JKRAramBlock::JKRAramBlock(u32 address, u32 size, u32 freeSize, u8 groupId, bool isTempMemory) : mBlockLink(this) { + mAddress = address; + mSize = size; + mFreeSize = freeSize; + mGroupId = groupId; + mIsTempMemory = isTempMemory; } /* 802B5A18-802B5AD4 .text __dt__12JKRAramBlockFv */ JKRAramBlock::~JKRAramBlock() { - /* Nonmatching */ + JSUList* list = mBlockLink.getSupervisor(); + JSULink* prev = mBlockLink.getPrev(); + + if (prev) { + JKRAramBlock* block = prev->getObject(); + block->mFreeSize = mSize + mFreeSize + block->mFreeSize; + list->remove(&mBlockLink); + } else { + mFreeSize = mFreeSize + mSize; + mSize = 0; + } } /* 802B5AD4-802B5B70 .text allocHead__12JKRAramBlockFUlUcP11JKRAramHeap */ -void JKRAramBlock::allocHead(unsigned long, unsigned char, JKRAramHeap*) { - /* Nonmatching */ +JKRAramBlock* JKRAramBlock::allocHead(u32 size, u8 groupId, JKRAramHeap* aramHeap) { + u32 address = mAddress; + u32 usedSize = mSize; + u32 nextAddress = address + usedSize; + u32 freeSize = mFreeSize; + u32 nextFreeSize = freeSize - size; + + JKRAramBlock* block = new (aramHeap->getMgrHeap(), 0) JKRAramBlock(nextAddress, size, nextFreeSize, groupId, false); + + mFreeSize = 0; + JSULink* next = mBlockLink.getNext(); + JSUList* list = mBlockLink.getSupervisor(); + list->insert(next, &block->mBlockLink); + return block; } /* 802B5B70-802B5C14 .text allocTail__12JKRAramBlockFUlUcP11JKRAramHeap */ -void JKRAramBlock::allocTail(unsigned long, unsigned char, JKRAramHeap*) { - /* Nonmatching */ +JKRAramBlock* JKRAramBlock::allocTail(u32 size, u8 groupId, JKRAramHeap* aramHeap) { + u32 freeSize = mFreeSize; + u32 address = mAddress; + u32 usedSize = mSize; + u32 endAddress = address + usedSize + freeSize; + u32 tailAddress = endAddress - size; + + JKRAramBlock* block = new (aramHeap->getMgrHeap(), 0) JKRAramBlock(tailAddress, size, 0, groupId, true); + + mFreeSize -= size; + JSULink* next = mBlockLink.getNext(); + JSUList* list = mBlockLink.getSupervisor(); + list->insert(next, &block->mBlockLink); + return block; }