// // Generated By: dol2asm // Translation Unit: JKRExpHeap // #include "JSystem/JKernel/JKRExpHeap.h" #include "JSystem/JUtility/JUTException.h" #include "dol2asm.h" #include "dolphin/types.h" #include "global.h" // // Forward References: // extern "C" void createRoot__10JKRExpHeapFib(); extern "C" void create__10JKRExpHeapFUlP7JKRHeapb(); extern "C" void create__10JKRExpHeapFPvUlP7JKRHeapb(); extern "C" void do_destroy__10JKRExpHeapFv(); extern "C" void __ct__10JKRExpHeapFPvUlP7JKRHeapb(); extern "C" void __dt__10JKRExpHeapFv(); extern "C" void do_alloc__10JKRExpHeapFUli(); extern "C" void allocFromHead__10JKRExpHeapFUli(); extern "C" void allocFromHead__10JKRExpHeapFUl(); extern "C" void allocFromTail__10JKRExpHeapFUli(); extern "C" void allocFromTail__10JKRExpHeapFUl(); extern "C" void do_free__10JKRExpHeapFPv(); extern "C" void do_freeAll__10JKRExpHeapFv(); extern "C" void do_freeTail__10JKRExpHeapFv(); extern "C" void do_fillFreeArea__10JKRExpHeapFv(); extern "C" void do_changeGroupID__10JKRExpHeapFUc(); extern "C" void do_resize__10JKRExpHeapFPvUl(); extern "C" void do_getSize__10JKRExpHeapFPv(); extern "C" void do_getFreeSize__10JKRExpHeapFv(); extern "C" void do_getMaxFreeBlock__10JKRExpHeapFv(); extern "C" void do_getTotalFreeSize__10JKRExpHeapFv(); extern "C" void getUsedSize__10JKRExpHeapCFUc(); extern "C" void getTotalUsedSize__10JKRExpHeapCFv(); extern "C" void appendUsedList__10JKRExpHeapFPQ210JKRExpHeap9CMemBlock(); extern "C" void setFreeBlock__10JKRExpHeapFPQ210JKRExpHeap9CMemBlockPQ210JKRExpHeap9CMemBlockPQ210JKRExpHeap9CMemBlock(); extern "C" void removeFreeBlock__10JKRExpHeapFPQ210JKRExpHeap9CMemBlock(); extern "C" void removeUsedBlock__10JKRExpHeapFPQ210JKRExpHeap9CMemBlock(); extern "C" void recycleFreeBlock__10JKRExpHeapFPQ210JKRExpHeap9CMemBlock(); extern "C" void joinTwoBlocks__10JKRExpHeapFPQ210JKRExpHeap9CMemBlock(); extern "C" void check__10JKRExpHeapFv(); extern "C" void dump__10JKRExpHeapFv(); extern "C" void dump_sort__10JKRExpHeapFv(); extern "C" void initiate__Q210JKRExpHeap9CMemBlockFPQ210JKRExpHeap9CMemBlockPQ210JKRExpHeap9CMemBlockUlUcUc(); extern "C" void allocFore__Q210JKRExpHeap9CMemBlockFUlUcUcUcUc(); extern "C" void allocBack__Q210JKRExpHeap9CMemBlockFUlUcUcUcUc(); extern "C" void free__Q210JKRExpHeap9CMemBlockFP10JKRExpHeap(); extern "C" void getHeapBlock__Q210JKRExpHeap9CMemBlockFPv(); extern "C" void state_register__10JKRExpHeapCFPQ27JKRHeap6TStateUl(); extern "C" void state_compare__10JKRExpHeapCFRCQ27JKRHeap6TStateRCQ27JKRHeap6TState(); extern "C" void getHeapType__10JKRExpHeapFv(); extern "C" void do_getCurrentGroupId__10JKRExpHeapFv(); extern "C" extern char const* const JKRExpHeap__stringBase0; // // External References: // extern "C" void __ct__7JKRHeapFPvUlP7JKRHeapb(); extern "C" void __dt__7JKRHeapFv(); extern "C" void initArena__7JKRHeapFPPcPUli(); extern "C" void alloc__7JKRHeapFUliP7JKRHeap(); extern "C" void free__7JKRHeapFPvP7JKRHeap(); extern "C" void callAllDisposer__7JKRHeapFv(); extern "C" void getTotalFreeSize__7JKRHeapFv(); extern "C" void getMaxAllocatableSize__7JKRHeapFi(); extern "C" void find__7JKRHeapCFPv(); extern "C" void dispose__7JKRHeapFPvUl(); extern "C" void dispose__7JKRHeapFv(); extern "C" void __dl__FPv(); extern "C" void state_dump__7JKRHeapCFRCQ27JKRHeap6TState(); extern "C" void panic_f__12JUTExceptionFPCciPCce(); extern "C" void JUTReportConsole_f(const char*, ...); extern "C" void JUTReportConsole(const char*); extern "C" void JUTWarningConsole_f(const char*, ...); extern "C" void JUTWarningConsole(const char*); extern "C" void _savegpr_25(); extern "C" void _savegpr_27(); extern "C" void _savegpr_28(); extern "C" void _savegpr_29(); extern "C" void _restgpr_25(); extern "C" void _restgpr_27(); extern "C" void _restgpr_28(); extern "C" void _restgpr_29(); extern "C" u8 sCurrentHeap__7JKRHeap[4]; extern "C" u8 sRootHeap__7JKRHeap[4]; extern "C" u8 mErrorHandler__7JKRHeap[4]; // // Declarations: // /* 802CEDB4-802CEE2C 2C96F4 0078+00 0/0 1/1 0/0 .text createRoot__10JKRExpHeapFib */ JKRExpHeap* JKRExpHeap::createRoot(int param_0, bool errorFlag) { JKRExpHeap* heap = NULL; if (!sRootHeap) { void* memory; u32 memorySize; initArena((char**)&memory, &memorySize, param_0); u8* start = (u8*)memory + ALIGN_NEXT(sizeof(JKRExpHeap), 0x10); u32 alignedSize = memorySize - ALIGN_NEXT(sizeof(JKRExpHeap), 0x10); heap = new (memory) JKRExpHeap(start, alignedSize, NULL, errorFlag); sRootHeap = heap; } heap->field_0x6e = true; return heap; } /* 802CEE2C-802CEF00 2C976C 00D4+00 0/0 19/19 1/1 .text create__10JKRExpHeapFUlP7JKRHeapb */ #if NONMATCHING JKRExpHeap* JKRExpHeap::create(u32 size, JKRHeap* parent, bool errorFlag) { if (!parent) { parent = sRootHeap; } if (size == 0xffffffff) { size = parent->getMaxAllocatableSize(0x10); } u32 alignedSize = ALIGN_PREV(size, 0x10); u32 expHeapSize = ALIGN_NEXT(sizeof(JKRExpHeap), 0x10); if (alignedSize < 0xa0) return NULL; void* memory = alloc(alignedSize, 0x10, parent); void* dataPtr = (u8*)memory + expHeapSize; if (!memory) { return NULL; } JKRExpHeap* newHeap = new (memory) JKRExpHeap(dataPtr, alignedSize - expHeapSize, parent, errorFlag); if (newHeap == NULL) { free(memory, NULL); return NULL; }; newHeap->field_0x6e = false; return newHeap; } #else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off asm JKRExpHeap* JKRExpHeap::create(u32 param_0, JKRHeap* param_1, bool param_2) { nofralloc #include "asm/JSystem/JKernel/JKRExpHeap/create__10JKRExpHeapFUlP7JKRHeapb.s" } #pragma pop #endif /* 802CEF00-802CEFAC 2C9840 00AC+00 0/0 1/1 0/0 .text create__10JKRExpHeapFPvUlP7JKRHeapb */ JKRExpHeap* JKRExpHeap::create(void* ptr, u32 size, JKRHeap* parent, bool errorFlag) { JKRHeap* parent2; if (parent == NULL) { parent2 = sRootHeap->find(ptr); if (!parent2) return NULL; } else { parent2 = parent; } JKRExpHeap* newHeap = NULL; u32 expHeapSize = ALIGN_NEXT(sizeof(JKRExpHeap), 0x10); if (size < expHeapSize) return NULL; void* dataPtr = (u8*)ptr + expHeapSize; u32 alignedSize = ALIGN_PREV((u32)ptr + size - (u32)dataPtr, 0x10); if (ptr) { newHeap = new (ptr) JKRExpHeap(dataPtr, alignedSize, parent2, errorFlag); } newHeap->field_0x6e = true; newHeap->field_0x70 = ptr; newHeap->field_0x74 = size; return newHeap; } /* 802CEFAC-802CF030 2C98EC 0084+00 1/0 0/0 0/0 .text do_destroy__10JKRExpHeapFv */ void JKRExpHeap::do_destroy() { if (!field_0x6e) { JKRHeap* heap = mChildTree.getParent()->getObject(); if (heap) { this->~JKRExpHeap(); JKRHeap::free(this, heap); } } else { this->~JKRExpHeap(); } } /* ############################################################################################## */ /* 803CBFD0-803CC030 0290F0 0060+00 2/2 0/0 0/0 .data __vt__10JKRExpHeap */ SECTION_DATA extern void* __vt__10JKRExpHeap[24] = { (void*)NULL /* RTTI */, (void*)NULL, (void*)__dt__10JKRExpHeapFv, (void*)callAllDisposer__7JKRHeapFv, (void*)getHeapType__10JKRExpHeapFv, (void*)check__10JKRExpHeapFv, (void*)dump_sort__10JKRExpHeapFv, (void*)dump__10JKRExpHeapFv, (void*)do_destroy__10JKRExpHeapFv, (void*)do_alloc__10JKRExpHeapFUli, (void*)do_free__10JKRExpHeapFPv, (void*)do_freeAll__10JKRExpHeapFv, (void*)do_freeTail__10JKRExpHeapFv, (void*)do_fillFreeArea__10JKRExpHeapFv, (void*)do_resize__10JKRExpHeapFPvUl, (void*)do_getSize__10JKRExpHeapFPv, (void*)do_getFreeSize__10JKRExpHeapFv, (void*)do_getMaxFreeBlock__10JKRExpHeapFv, (void*)do_getTotalFreeSize__10JKRExpHeapFv, (void*)do_changeGroupID__10JKRExpHeapFUc, (void*)do_getCurrentGroupId__10JKRExpHeapFv, (void*)state_register__10JKRExpHeapCFPQ27JKRHeap6TStateUl, (void*)state_compare__10JKRExpHeapCFRCQ27JKRHeap6TStateRCQ27JKRHeap6TState, (void*)state_dump__7JKRHeapCFRCQ27JKRHeap6TState, }; /* 802CF030-802CF0C0 2C9970 0090+00 3/3 0/0 0/0 .text __ct__10JKRExpHeapFPvUlP7JKRHeapb */ JKRExpHeap::JKRExpHeap(void* data, u32 size, JKRHeap* parent, bool errorFlag) : JKRHeap(data, size, parent, errorFlag) { field_0x6c = 0; mCurrentGroupId = 0xff; mHeadFreeList = (CMemBlock*)data; mTailFreeList = mHeadFreeList; mHeadFreeList->initiate(NULL, NULL, size - sizeof(CMemBlock), 0, 0); mHeadUsedList = NULL; mTailUsedList = NULL; } /* 802CF0C0-802CF128 2C9A00 0068+00 1/0 0/0 0/0 .text __dt__10JKRExpHeapFv */ JKRExpHeap::~JKRExpHeap() { dispose(); } /* 802CF128-802CF234 2C9A68 010C+00 1/0 0/0 0/0 .text do_alloc__10JKRExpHeapFUli */ void* JKRExpHeap::do_alloc(u32 size, int alignment) { void* ptr; lock(); if (size < 4) { size = 4; } if (alignment >= 0) { if (alignment <= 4) { ptr = allocFromHead(size); } else { ptr = allocFromHead(size, alignment); } } else { if (-alignment <= 4) { ptr = allocFromTail(size); } else { ptr = allocFromTail(size, -alignment); } } if (ptr == NULL) { JUTWarningConsole_f(":::cannot alloc memory (0x%x byte).\n", size); if (mErrorFlag == true) { callErrorHandler(this, size, alignment); } } unlock(); return ptr; } /* ############################################################################################## */ /* 80451398-8045139C 000898 0004+00 1/1 0/0 0/0 .sbss DBfoundSize */ static u32 DBfoundSize; /* 8045139C-804513A0 00089C 0004+00 1/1 0/0 0/0 .sbss DBfoundOffset */ static u32 DBfoundOffset; /* 804513A0-804513A4 0008A0 0004+00 1/1 0/0 0/0 .sbss DBfoundBlock */ static JKRExpHeap::CMemBlock* DBfoundBlock; /* 804513A4-804513A8 0008A4 0004+00 1/1 0/0 0/0 .sbss DBnewFreeBlock */ static JKRExpHeap::CMemBlock* DBnewFreeBlock; /* 804513A8-804513B0 0008A8 0004+04 1/1 0/0 0/0 .sbss DBnewUsedBlock */ static JKRExpHeap::CMemBlock* DBnewUsedBlock; /* 802CF234-802CF490 2C9B74 025C+00 1/1 0/0 0/0 .text allocFromHead__10JKRExpHeapFUli */ #if NONMATCHING void* JKRExpHeap::allocFromHead(u32 size, int align) { size = ALIGN_NEXT(size, 4); s32 foundSize = -1; u32 foundOffset = 0; CMemBlock* foundBlock = NULL; for (CMemBlock* block = mHeadFreeList; block; block = block->getNextBlock()) { u32 start = (u32)(block->getContent()); u32 offset = ALIGN_PREV(align - 1 + start, align) - start; if (block->getSize() < size + offset) { continue; } if (foundSize <= block->getSize()) { continue; } foundSize = block->getSize(); foundBlock = block; foundOffset = offset; if (field_0x6c != 0) { break; } u32 blockSize = block->getSize(); if (blockSize == size) { break; } } DBfoundSize = foundSize; DBfoundOffset = foundOffset; DBfoundBlock = foundBlock; if (foundBlock) { if (foundOffset >= sizeof(CMemBlock)) { CMemBlock* prev = foundBlock->getPrevBlock(); CMemBlock* next = foundBlock->getNextBlock(); CMemBlock* newUsedBlock = foundBlock->allocFore(foundOffset - sizeof(CMemBlock), 0, 0, 0, 0); CMemBlock* newFreeBlock; if (newUsedBlock) { newFreeBlock = newUsedBlock->allocFore(size, mCurrentGroupId, 0, 0, 0); } else { newFreeBlock = NULL; } if (newFreeBlock) { setFreeBlock(foundBlock, prev, newFreeBlock); } else { setFreeBlock(foundBlock, prev, next); } if (newFreeBlock) { setFreeBlock(newFreeBlock, foundBlock, next); } appendUsedList(newUsedBlock); DBnewFreeBlock = newFreeBlock; DBnewUsedBlock = newUsedBlock; return newUsedBlock->getContent(); } else { if (foundOffset != 0) { CMemBlock* prev = foundBlock->getPrevBlock(); CMemBlock* next = foundBlock->getNextBlock(); removeFreeBlock(foundBlock); CMemBlock* newUsedBlock = (CMemBlock*)((u32)foundBlock + foundOffset); newUsedBlock->size = foundBlock->getSize() - foundOffset; CMemBlock* newFreeBlock = newUsedBlock->allocFore(size, mCurrentGroupId, (u8)foundOffset, 0, 0); if (newFreeBlock) { setFreeBlock(newFreeBlock, prev, next); } appendUsedList(newUsedBlock); return newUsedBlock->getContent(); } else { CMemBlock* prev = foundBlock->getPrevBlock(); CMemBlock* next = foundBlock->getNextBlock(); CMemBlock* newFreeBlock = foundBlock->allocFore(size, mCurrentGroupId, 0, 0, 0); removeFreeBlock(foundBlock); if (newFreeBlock) { setFreeBlock(newFreeBlock, prev, next); } appendUsedList(foundBlock); return foundBlock->getContent(); } } } return NULL; } #else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off asm void* JKRExpHeap::allocFromHead(u32 param_0, int param_1) { nofralloc #include "asm/JSystem/JKernel/JKRExpHeap/allocFromHead__10JKRExpHeapFUli.s" } #pragma pop #endif /* 802CF490-802CF574 2C9DD0 00E4+00 1/1 0/0 0/0 .text allocFromHead__10JKRExpHeapFUl */ void* JKRExpHeap::allocFromHead(u32 size) { size = ALIGN_NEXT(size, 4); s32 foundSize = -1; CMemBlock* foundBlock = NULL; for (CMemBlock* block = mHeadFreeList; block; block = block->getNextBlock()) { if (block->getSize() < size) { continue; } if (foundSize <= block->getSize()) { continue; } foundSize = block->getSize(); foundBlock = block; if (field_0x6c != 0) { break; } if (foundSize == size) { break; } } if (foundBlock) { CMemBlock* newblock = foundBlock->allocFore(size, mCurrentGroupId, 0, 0, 0); if (newblock) { setFreeBlock(newblock, foundBlock->getPrevBlock(), foundBlock->getNextBlock()); } else { removeFreeBlock(foundBlock); } appendUsedList(foundBlock); return foundBlock->getContent(); } return NULL; } /* 802CF574-802CF6D4 2C9EB4 0160+00 1/1 0/0 0/0 .text allocFromTail__10JKRExpHeapFUli */ #if NONMATCHING void* JKRExpHeap::allocFromTail(u32 size, int align) { u32 offset = 0; CMemBlock* foundBlock = NULL; CMemBlock* newBlock = NULL; u32 end; u32 start; u32 usedSize; for (CMemBlock* block = mTailFreeList; block; block = block->getPrevBlock()) { end = (u32)block->getContent() + block->getSize(); start = ALIGN_PREV(end - size, align); usedSize = end - start; if (block->getSize() >= usedSize) { foundBlock = block; offset = block->getSize() - usedSize; newBlock = (CMemBlock*)start - 1; break; } } if (foundBlock != NULL) { if (offset >= sizeof(CMemBlock)) { newBlock->initiate(NULL, NULL, usedSize, mCurrentGroupId, -0x80); foundBlock->size = foundBlock->size - usedSize - sizeof(CMemBlock); appendUsedList(newBlock); return newBlock->getContent(); } else { if (offset != 0) { removeFreeBlock(foundBlock); newBlock->initiate(NULL, NULL, usedSize, mCurrentGroupId, offset | 0x80); appendUsedList(newBlock); return newBlock->getContent(); } else { removeFreeBlock(foundBlock); newBlock->initiate(NULL, NULL, usedSize, mCurrentGroupId, -0x80); appendUsedList(newBlock); return newBlock->getContent(); } } } return NULL; } #else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off asm void* JKRExpHeap::allocFromTail(u32 param_0, int param_1) { nofralloc #include "asm/JSystem/JKernel/JKRExpHeap/allocFromTail__10JKRExpHeapFUli.s" } #pragma pop #endif /* 802CF6D4-802CF7AC 2CA014 00D8+00 1/1 0/0 0/0 .text allocFromTail__10JKRExpHeapFUl */ void* JKRExpHeap::allocFromTail(u32 size) { u32 size2 = ALIGN_NEXT(size, 4); CMemBlock* foundBlock = NULL; for (CMemBlock* block = mTailFreeList; block; block = block->getPrevBlock()) { if (block->getSize() >= size2) { foundBlock = block; break; } } if (foundBlock != NULL) { CMemBlock* usedBlock = foundBlock->allocBack(size2, 0, 0, mCurrentGroupId, 0); CMemBlock* freeBlock; if (usedBlock) { freeBlock = foundBlock; } else { removeFreeBlock(foundBlock); usedBlock = foundBlock; freeBlock = NULL; } if (freeBlock) { setFreeBlock(freeBlock, foundBlock->getPrevBlock(), foundBlock->getNextBlock()); } appendUsedList(usedBlock); return usedBlock->getContent(); } return NULL; } /* 802CF7AC-802CF820 2CA0EC 0074+00 1/0 0/0 0/0 .text do_free__10JKRExpHeapFPv */ void JKRExpHeap::do_free(void* ptr) { lock(); if (getStartAddr() <= ptr && ptr <= getEndAddr()) { CMemBlock* block = CMemBlock::getHeapBlock(ptr); if (block) { block->free(this); } } unlock(); } /* 802CF820-802CF89C 2CA160 007C+00 1/0 0/0 0/0 .text do_freeAll__10JKRExpHeapFv */ void JKRExpHeap::do_freeAll() { lock(); JKRHeap::callAllDisposer(); mHeadFreeList = (CMemBlock*)getStartAddr(); mTailFreeList = mHeadFreeList; mHeadFreeList->initiate(NULL, NULL, getSize() - 0x10, 0, 0); mHeadUsedList = NULL; mTailUsedList = NULL; unlock(); } /* 802CF89C-802CF924 2CA1DC 0088+00 1/0 0/0 0/0 .text do_freeTail__10JKRExpHeapFv */ #if NONMATCHING void JKRExpHeap::do_freeTail() { lock(); CMemBlock* block = mHeadUsedList; while (block) { if (block->_isTempMemBlock()) { dispose(block->getContent(), block->getSize()); CMemBlock* next = block->getNextBlock(); block->free(this); block = next; } else { block = block->getNextBlock(); } } unlock(); } #else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off asm void JKRExpHeap::do_freeTail() { nofralloc #include "asm/JSystem/JKernel/JKRExpHeap/do_freeTail__10JKRExpHeapFv.s" } #pragma pop #endif /* 802CF924-802CF928 2CA264 0004+00 1/0 0/0 0/0 .text do_fillFreeArea__10JKRExpHeapFv */ void JKRExpHeap::do_fillFreeArea() { /* empty function */ } /* 802CF928-802CF978 2CA268 0050+00 1/0 0/0 0/0 .text do_changeGroupID__10JKRExpHeapFUc */ u8 JKRExpHeap::do_changeGroupID(u8 param_0) { lock(); u8 prev = mCurrentGroupId; mCurrentGroupId = param_0; unlock(); return prev; } /* 802CF978-802CFB24 2CA2B8 01AC+00 1/0 0/0 0/0 .text do_resize__10JKRExpHeapFPvUl */ #if NONMATCHING s32 JKRExpHeap::do_resize(void* ptr, u32 size) { lock(); CMemBlock* block = CMemBlock::getHeapBlock(ptr); if (block == NULL || ptr < getStartAddr() || getEndAddr() < ptr) { unlock(); return -1; } u32 newSize = ALIGN_NEXT(size, 4); if (newSize == block->getSize()) { unlock(); return newSize; } if (newSize > block->getSize()) { CMemBlock* foundBlock = NULL; for (CMemBlock* freeBlock = mHeadFreeList; freeBlock; freeBlock = freeBlock->getNextBlock()) { if (freeBlock == (CMemBlock*)((u32)block->getContent() + block->getSize())) { foundBlock = freeBlock; break; } } if (foundBlock == NULL) { unlock(); return -1; } if (newSize > block->getSize() + sizeof(CMemBlock) + foundBlock->getSize()) { unlock(); return -1; } removeFreeBlock(foundBlock); block->size += foundBlock->getSize() + sizeof(CMemBlock); if (block->getSize() - newSize > sizeof(CMemBlock)) { CMemBlock* newBlock = block->allocFore(newSize, block->getGroupId(), block->mFlags, 0, 0); if (newBlock) { recycleFreeBlock(newBlock); } } } else { if (block->getSize() - newSize > 0x10) { CMemBlock* freeBlock = block->allocFore(newSize, block->getGroupId(), block->mFlags, 0, 0); if (freeBlock) { recycleFreeBlock(freeBlock); } } } unlock(); return block->getSize(); } #else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off asm s32 JKRExpHeap::do_resize(void* param_0, u32 param_1) { nofralloc #include "asm/JSystem/JKernel/JKRExpHeap/do_resize__10JKRExpHeapFPvUl.s" } #pragma pop #endif /* 802CFB24-802CFBA4 2CA464 0080+00 1/0 0/0 0/0 .text do_getSize__10JKRExpHeapFPv */ s32 JKRExpHeap::do_getSize(void* ptr) { lock(); CMemBlock* block = CMemBlock::getHeapBlock(ptr); if (!block || ptr < getStartAddr() || getEndAddr() < ptr) { unlock(); return -1; } unlock(); return block->getSize(); } /* 802CFBA4-802CFC10 2CA4E4 006C+00 1/0 0/0 0/0 .text do_getFreeSize__10JKRExpHeapFv */ s32 JKRExpHeap::do_getFreeSize() { lock(); s32 size = 0; for (CMemBlock* block = mHeadFreeList; block; block = block->getNextBlock()) { if (size < (s32)block->getSize()) { size = block->getSize(); } } unlock(); return size; } /* 802CFC10-802CFC84 2CA550 0074+00 1/0 0/0 0/0 .text do_getMaxFreeBlock__10JKRExpHeapFv */ void* JKRExpHeap::do_getMaxFreeBlock() { lock(); s32 size = 0; CMemBlock* res = NULL; for (CMemBlock* block = mHeadFreeList; block; block = block->getNextBlock()) { if (size < (s32)block->getSize()) { size = block->getSize(); res = block; } } unlock(); return res; } /* 802CFC84-802CFCE8 2CA5C4 0064+00 1/0 0/0 0/0 .text do_getTotalFreeSize__10JKRExpHeapFv */ s32 JKRExpHeap::do_getTotalFreeSize() { u32 size = 0; lock(); for (CMemBlock* block = mHeadFreeList; block; block = block->getNextBlock()) { size += block->getSize(); } unlock(); return size; } /* 802CFCE8-802CFD64 2CA628 007C+00 1/1 0/0 0/0 .text getUsedSize__10JKRExpHeapCFUc */ s32 JKRExpHeap::getUsedSize(u8 groupId) const { JKRExpHeap* this2 = const_cast(this); this2->lock(); u32 size = 0; for (CMemBlock* block = mHeadUsedList; block; block = block->getNextBlock()) { u8 blockGroupId = block->getGroupId(); if (blockGroupId == groupId) { size += block->getSize() + sizeof(CMemBlock); } } this2->unlock(); return size; } /* 802CFD64-802CFDCC 2CA6A4 0068+00 0/0 5/5 0/0 .text getTotalUsedSize__10JKRExpHeapCFv */ s32 JKRExpHeap::getTotalUsedSize() const { JKRExpHeap* this2 = const_cast(this); this2->lock(); u32 size = 0; for (CMemBlock* block = mHeadUsedList; block; block = block->getNextBlock()) { size += block->getSize() + sizeof(CMemBlock); } this2->unlock(); return size; } /* 802CFDCC-802CFE68 2CA70C 009C+00 4/4 0/0 0/0 .text * appendUsedList__10JKRExpHeapFPQ210JKRExpHeap9CMemBlock */ void JKRExpHeap::appendUsedList(JKRExpHeap::CMemBlock* newblock) { if (!newblock) { JUTException::panic_f("JKRExpHeap.cpp", 0x620, "%s", "bad appendUsedList\n"); } CMemBlock* block = mTailUsedList; newblock->mMagic = 'HM'; if (block) { block->mNext = newblock; newblock->mPrev = block; } else { newblock->mPrev = NULL; } mTailUsedList = newblock; if (!mHeadUsedList) { mHeadUsedList = newblock; } newblock->mNext = NULL; } /* 802CFE68-802CFEB4 2CA7A8 004C+00 5/5 0/0 0/0 .text * setFreeBlock__10JKRExpHeapFPQ210JKRExpHeap9CMemBlockPQ210JKRExpHeap9CMemBlockPQ210JKRExpHeap9CMemBlock */ void JKRExpHeap::setFreeBlock(CMemBlock* block, CMemBlock* prev, CMemBlock* next) { if (prev == NULL) { mHeadFreeList = block; block->mPrev = NULL; } else { prev->mNext = block; block->mPrev = prev; } if (next == NULL) { mTailFreeList = block; block->mNext = NULL; } else { next->mPrev = block; block->mNext = next; } block->mMagic = 0; } /* 802CFEB4-802CFEE8 2CA7F4 0034+00 5/5 0/0 0/0 .text * removeFreeBlock__10JKRExpHeapFPQ210JKRExpHeap9CMemBlock */ void JKRExpHeap::removeFreeBlock(CMemBlock* block) { CMemBlock* prev = block->mPrev; CMemBlock* next = block->mNext; if (prev == NULL) { mHeadFreeList = next; } else { prev->mNext = next; } if (next == NULL) { mTailFreeList = prev; } else { next->mPrev = prev; } } /* 802CFEE8-802CFF1C 2CA828 0034+00 1/1 0/0 0/0 .text * removeUsedBlock__10JKRExpHeapFPQ210JKRExpHeap9CMemBlock */ void JKRExpHeap::removeUsedBlock(JKRExpHeap::CMemBlock* block) { CMemBlock* prev = block->mPrev; CMemBlock* next = block->mNext; if (prev == NULL) { mHeadUsedList = next; } else { prev->mNext = next; } if (next == NULL) { mTailUsedList = prev; } else { next->mPrev = prev; } } /* 802CFF1C-802D00B4 2CA85C 0198+00 2/2 0/0 0/0 .text * recycleFreeBlock__10JKRExpHeapFPQ210JKRExpHeap9CMemBlock */ #if NONMATCHING void JKRExpHeap::recycleFreeBlock(JKRExpHeap::CMemBlock* block) { u32 size = block->size; void* blockEnd = (u8*)block + size; block->mMagic = 0; u32 offset = block->getAlignment(); if (offset) { block = (CMemBlock*)((u8*)block - offset); size += offset; blockEnd = (u8*)block + size; block->mGroupId = 0; block->mFlags = 0; block->size = size; } if (!mHeadFreeList) { block->initiate(NULL, NULL, size, 0, 0); mHeadFreeList = block; mTailFreeList = block; setFreeBlock(block, NULL, NULL); return; } if (mHeadFreeList >= blockEnd) { block->initiate(NULL, NULL, size, 0, 0); setFreeBlock(block, NULL, mHeadFreeList); joinTwoBlocks(block); return; } if (mTailFreeList <= block) { block->initiate(NULL, NULL, size, 0, 0); setFreeBlock(block, mTailFreeList, NULL); joinTwoBlocks(block->getPrevBlock()); return; } for (CMemBlock* freeBlock = mHeadFreeList; freeBlock; freeBlock = freeBlock->getNextBlock()) { if (freeBlock >= block || block >= freeBlock->getNextBlock()) { continue; } block->mNext = freeBlock->getNextBlock(); block->mPrev = freeBlock; freeBlock->mNext = block; block->mNext->mPrev = block; block->mGroupId = 0; joinTwoBlocks(block); joinTwoBlocks(freeBlock); return; } } #else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off asm void JKRExpHeap::recycleFreeBlock(JKRExpHeap::CMemBlock* param_0) { nofralloc #include "asm/JSystem/JKernel/JKRExpHeap/recycleFreeBlock__10JKRExpHeapFPQ210JKRExpHeap9CMemBlock.s" } #pragma pop #endif /* ############################################################################################## */ /* 8039CAF0-8039CAF0 029150 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ #pragma push #pragma force_active on SECTION_DEAD static char const* const stringBase_8039CB3B = ":::Heap may be broken. (block = %x)"; SECTION_DEAD static char const* const stringBase_8039CB5F = "Bad Block\n"; #pragma pop /* 802D00B4-802D0190 2CA9F4 00DC+00 1/1 0/0 0/0 .text * joinTwoBlocks__10JKRExpHeapFPQ210JKRExpHeap9CMemBlock */ #if NONMATCHING void JKRExpHeap::joinTwoBlocks(CMemBlock* block) { u32 endAddr = (u32)block->getContent() + block->getSize(); CMemBlock* next = block->getNextBlock(); u32 nextAddr = (u32)next - next->getAlignment(); if (endAddr > nextAddr) { JUTWarningConsole_f(":::Heap may be broken. (block = %x)", block); getCurrentHeap()->dump(); JUTException::panic_f("JKRExpHeap.cpp", 0x71c, "%s", "Bad Block\n"); } if (endAddr == nextAddr) { block->size = next->getSize() + sizeof(CMemBlock) + next->getAlignment() + block->getSize(); setFreeBlock(block, block->getPrevBlock(), next->getNextBlock()); } } #else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off asm void JKRExpHeap::joinTwoBlocks(JKRExpHeap::CMemBlock* param_0) { nofralloc #include "asm/JSystem/JKernel/JKRExpHeap/joinTwoBlocks__10JKRExpHeapFPQ210JKRExpHeap9CMemBlock.s" } #pragma pop #endif /* ############################################################################################## */ /* 8039CAF0-8039CAF0 029150 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ #pragma push #pragma force_active on SECTION_DEAD static char const* const stringBase_8039CB6A = ":::addr %08x: bad heap signature. (%c%c)\n"; SECTION_DEAD static char const* const stringBase_8039CB94 = ":::addr %08x: bad next pointer (%08x)\nabort\n"; SECTION_DEAD static char const* const stringBase_8039CBC1 = ":::addr %08x: bad previous pointer (%08x)\n"; SECTION_DEAD static char const* const stringBase_8039CBEC = ":::addr %08x: bad used list(REV) (%08x)\n"; SECTION_DEAD static char const* const stringBase_8039CC15 = ":::addr %08x: bad block size (%08x)\n"; SECTION_DEAD static char const* const stringBase_8039CC3A = ":::bad total memory block size (%08X, %08X)\n"; SECTION_DEAD static char const* const stringBase_8039CC67 = ":::there is some error in this heap!\n"; #pragma pop /* 802D0190-802D03B8 2CAAD0 0228+00 1/0 0/0 0/0 .text check__10JKRExpHeapFv */ #if NONMATCHING bool JKRExpHeap::check() { lock(); int totalBytes = 0; bool ok = true; for (CMemBlock* block = mHeadUsedList; block; block = block->getNextBlock()) { if (!block->isValid()) { ok = false; JUTWarningConsole_f(":::addr %08x: bad heap signature. (%c%c)\n", block, block->mMagic >> 8, block->mMagic & 0xff); } if (block->getNextBlock()) { if (!block->getNextBlock()->isValid()) { ok = false; JUTWarningConsole_f(":::addr %08x: bad next pointer (%08x)\nabort\n", block, block->getNextBlock()); break; } if (block->getNextBlock()->getPrevBlock() != block) { ok = false; JUTWarningConsole_f(":::addr %08x: bad previous pointer (%08x)\n", block->getNextBlock(), block->getNextBlock()->getPrevBlock()); } } else { if (mTailUsedList != block) { ok = false; JUTWarningConsole_f(":::addr %08x: bad used list(REV) (%08x)\n", block, mTailUsedList); } } totalBytes += sizeof(CMemBlock) + block->getSize() + block->getAlignment(); } for (CMemBlock* block = mHeadFreeList; block; block = block->getNextBlock()) { totalBytes += block->getSize() + sizeof(CMemBlock); if (block->getNextBlock()) { if (block->getNextBlock()->getPrevBlock() != block) { ok = false; JUTWarningConsole_f(":::addr %08x: bad previous pointer (%08x)\n", block->getNextBlock(), block->getNextBlock()->getPrevBlock()); } if ((u32)block + block->getSize() + sizeof(CMemBlock) > (u32)block->getNextBlock()) { ok = false; JUTWarningConsole_f(":::addr %08x: bad block size (%08x)\n", block, block->getSize()); } } else { if (mTailFreeList != block) { ok = false; JUTWarningConsole_f(":::addr %08x: bad used list(REV) (%08x)\n", block, mTailFreeList); } } } if (totalBytes != getSize()) { ok = false; JUTWarningConsole_f(":::bad total memory block size (%08X, %08X)\n", getSize(), totalBytes); } if (!ok) { JUTWarningConsole(":::there is some error in this heap!\n"); } unlock(); return ok; } #else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off asm bool JKRExpHeap::check() { nofralloc #include "asm/JSystem/JKernel/JKRExpHeap/check__10JKRExpHeapFv.s" } #pragma pop #endif /* ############################################################################################## */ /* 8039CAF0-8039CAF0 029150 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ #pragma push #pragma force_active on SECTION_DEAD static char const* const stringBase_8039CC8D = " attr address: size gid aln prev_ptr nex" "t_ptr\n"; SECTION_DEAD static char const* const stringBase_8039CCC4 = "(Used Blocks)\n"; SECTION_DEAD static char const* const stringBase_8039CCD3 = " NONE\n"; SECTION_DEAD static char const* const stringBase_8039CCDA = "xxxxx %08x: -------- --- --- (-------- -------" "-)\nabort\n"; SECTION_DEAD static char const* const stringBase_8039CD14 = "%s %08x: %08x %3d %3d (%08x %08x)\n"; SECTION_DEAD static char const* const stringBase_8039CD39 = " temp"; SECTION_DEAD static char const* const stringBase_8039CD3F = "alloc"; SECTION_DEAD static char const* const stringBase_8039CD45 = "(Free Blocks)\n"; SECTION_DEAD static char const* const stringBase_8039CD54 = " free"; SECTION_DEAD static char const* const stringBase_8039CD5A = "%d / %d bytes (%6.2f%%) used (U:%d F:%d)\n"; #pragma pop /* 80455F98-80455FA0 004598 0004+04 2/2 0/0 0/0 .sdata2 @1121 */ SECTION_SDATA2 static f32 lit_1121[1 + 1 /* padding */] = { 100.0f, /* padding */ 0.0f, }; /* 80455FA0-80455FA8 0045A0 0008+00 2/2 0/0 0/0 .sdata2 @1123 */ SECTION_SDATA2 static f64 lit_1123 = 4503599627370496.0 /* cast u32 to float */; /* 802D03B8-802D05CC 2CACF8 0214+00 1/0 0/0 0/0 .text dump__10JKRExpHeapFv */ #if NONMATCHING bool JKRExpHeap::dump() { lock(); bool result = check(); u32 usedBytes = 0; u32 usedCount = 0; u32 freeCount = 0; JUTReportConsole(" attr address: size gid aln prev_ptr next_ptr\n"); JUTReportConsole("(Used Blocks)\n"); if (!mHeadUsedList) { JUTReportConsole(" NONE\n"); } for (CMemBlock* block = mHeadUsedList; block; block = block->getNextBlock()) { if (!block->isValid()) { JUTReportConsole_f("xxxxx %08x: -------- --- --- (-------- --------)\nabort\n", block); break; } int offset = block->getAlignment(); void* content = block->getContent(); const char* type = block->_isTempMemBlock() ? " temp" : "alloc"; JUTReportConsole_f("%s %08x: %08x %3d %3d (%08x %08x)\n", type, content, block->getSize(), block->getGroupId(), offset, block->getPrevBlock(), block->getNextBlock()); usedBytes += sizeof(CMemBlock) + block->getSize() + block->getAlignment(); usedCount++; } JUTReportConsole("(Free Blocks)\n"); if (!mHeadFreeList) { JUTReportConsole(" NONE\n"); } for (CMemBlock* block = mHeadFreeList; block; block = block->getNextBlock()) { JUTReportConsole_f("%s %08x: %08x %3d %3d (%08x %08x)\n", " free", block->getContent(), block->getSize(), block->getGroupId(), block->getAlignment(), block->getPrevBlock(), block->getNextBlock()); freeCount++; } float percent = ((float)usedBytes / (float)getSize()) * 100.0f; JUTReportConsole_f("%d / %d bytes (%6.2f%%) used (U:%d F:%d)\n", usedBytes, getSize(), percent, usedCount, freeCount); unlock(); return result; } #else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off asm bool JKRExpHeap::dump() { nofralloc #include "asm/JSystem/JKernel/JKRExpHeap/dump__10JKRExpHeapFv.s" } #pragma pop #endif /* 802D05CC-802D0810 2CAF0C 0244+00 1/0 0/0 0/0 .text dump_sort__10JKRExpHeapFv */ #if NONMATCHING bool JKRExpHeap::dump_sort() { lock(); bool result = check(); u32 usedBytes = 0; u32 usedCount = 0; u32 freeCount = 0; JUTReportConsole(" attr address: size gid aln prev_ptr next_ptr\n"); JUTReportConsole("(Used Blocks)\n"); if (mHeadUsedList == NULL) { JUTReportConsole(" NONE\n"); } else { CMemBlock* var1 = NULL; while (true) { CMemBlock* block = (CMemBlock*)0xffffffff; for (CMemBlock* iterBlock = mHeadUsedList; iterBlock; iterBlock = iterBlock->getNextBlock()) { if (var1 < iterBlock && iterBlock < block) { block = iterBlock; } } if (block == (CMemBlock*)0xffffffff) { break; } if (!block->isValid()) { JUTReportConsole_f("xxxxx %08x: -------- --- --- (-------- --------)\nabort\n"); break; } int offset = block->getAlignment(); void* content = block->getContent(); const char* type = block->_isTempMemBlock() ? " temp" : "alloc"; JUTReportConsole_f("%s %08x: %08x %3d %3d (%08x %08x)\n", type, content, block->getSize(), block->getGroupId(), offset, block->getPrevBlock(), block->getNextBlock()); usedBytes += sizeof(CMemBlock) + block->getSize() + block->getAlignment(); usedCount++; var1 = block; } } JUTReportConsole("(Free Blocks)\n"); if (mHeadFreeList == NULL) { JUTReportConsole(" NONE\n"); } for (CMemBlock* block = mHeadFreeList; block; block = block->getNextBlock()) { JUTReportConsole_f("%s %08x: %08x %3d %3d (%08x %08x)\n", " free", block->getContent(), block->getSize(), block->getGroupId(), block->getAlignment(), block->getPrevBlock(), block->getNextBlock()); freeCount++; } float percent = ((float)usedBytes / (float)getSize()) * 100.0f; JUTReportConsole_f("%d / %d bytes (%6.2f%%) used (U:%d F:%d)\n", usedBytes, getSize(), percent, usedCount, freeCount); unlock(); return result; } #else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off asm bool JKRExpHeap::dump_sort() { nofralloc #include "asm/JSystem/JKernel/JKRExpHeap/dump_sort__10JKRExpHeapFv.s" } #pragma pop #endif /* 802D0810-802D0830 2CB150 0020+00 4/4 0/0 0/0 .text * initiate__Q210JKRExpHeap9CMemBlockFPQ210JKRExpHeap9CMemBlockPQ210JKRExpHeap9CMemBlockUlUcUc */ void JKRExpHeap::CMemBlock::initiate(JKRExpHeap::CMemBlock* prev, JKRExpHeap::CMemBlock* next, u32 size, u8 groupId, u8 alignment) { mMagic = 'HM'; mFlags = alignment; mGroupId = groupId; this->size = size; mPrev = prev; mNext = next; } /* 802D0830-802D0874 2CB170 0044+00 3/3 0/0 0/0 .text * allocFore__Q210JKRExpHeap9CMemBlockFUlUcUcUcUc */ #if NONMATCHING JKRExpHeap::CMemBlock* JKRExpHeap::CMemBlock::allocFore(u32 size, u8 groupId1, u8 alignment1, u8 groupId2, u8 alignment2) { CMemBlock* block = NULL; mGroupId = groupId1; mFlags = alignment1; if (getSize() >= size + sizeof(CMemBlock)) { CMemBlock* newblock = (CMemBlock*)(size + (u32)this); newblock[1].mGroupId = groupId2; newblock[1].mFlags = alignment2; newblock[1].size = this->size - (size + sizeof(CMemBlock)); this->size = size; block = newblock + 1; } return block; } #else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off asm JKRExpHeap::CMemBlock* JKRExpHeap::CMemBlock::allocFore(u32 param_0, u8 param_1, u8 param_2, u8 param_3, u8 param_4) { nofralloc #include "asm/JSystem/JKernel/JKRExpHeap/allocFore__Q210JKRExpHeap9CMemBlockFUlUcUcUcUc.s" } #pragma pop #endif /* 802D0874-802D08CC 2CB1B4 0058+00 1/1 0/0 0/0 .text * allocBack__Q210JKRExpHeap9CMemBlockFUlUcUcUcUc */ JKRExpHeap::CMemBlock* JKRExpHeap::CMemBlock::allocBack(u32 size, u8 groupId1, u8 alignment1, u8 groupId2, u8 alignment2) { CMemBlock* newblock = NULL; if (getSize() >= size + sizeof(CMemBlock)) { newblock = (CMemBlock*)((u32)this + getSize() - size); newblock->mGroupId = groupId2; newblock->mFlags = alignment2 | 0x80; newblock->size = size; mGroupId = groupId1; mFlags = alignment1; this->size -= size + sizeof(CMemBlock); } else { mGroupId = groupId2; mFlags = 0x80; } return newblock; } /* 802D08CC-802D091C 2CB20C 0050+00 2/2 0/0 0/0 .text free__Q210JKRExpHeap9CMemBlockFP10JKRExpHeap */ int JKRExpHeap::CMemBlock::free(JKRExpHeap* heap) { heap->removeUsedBlock(this); heap->recycleFreeBlock(this); return 0; } /* 802D091C-802D0938 2CB25C 001C+00 3/3 0/0 0/0 .text getHeapBlock__Q210JKRExpHeap9CMemBlockFPv */ JKRExpHeap::CMemBlock* JKRExpHeap::CMemBlock::getHeapBlock(void* ptr) { if (ptr) { CMemBlock* block = (CMemBlock*)ptr - 1; if (block->isValid()) { return block; } } return NULL; } /* 802D0938-802D09E0 2CB278 00A8+00 1/0 0/0 0/0 .text * state_register__10JKRExpHeapCFPQ27JKRHeap6TStateUl */ void JKRExpHeap::state_register(JKRHeap::TState* p, u32 param_1) const { p->mId = param_1; if (param_1 <= 0xff) { p->mUsedSize = getUsedSize(param_1); } else { s32 freeSize = const_cast(this)->getTotalFreeSize(); p->mUsedSize = getSize() - freeSize; } u32 checkCode = 0; for (CMemBlock* block = mHeadUsedList; block; block = block->getNextBlock()) { if (param_1 <= 0xff) { u8 groupId = block->getGroupId(); if (groupId == param_1) { checkCode += (u32)block * 3; } } else { checkCode += (u32)block * 3; } } p->mCheckCode = checkCode; } /* 802D09E0-802D0A10 2CB320 0030+00 1/0 0/0 0/0 .text * state_compare__10JKRExpHeapCFRCQ27JKRHeap6TStateRCQ27JKRHeap6TState */ bool JKRExpHeap::state_compare(JKRHeap::TState const& r1, JKRHeap::TState const& r2) const { bool result = true; if (r1.mCheckCode != r2.mCheckCode) { result = false; } if (r1.mUsedSize != r2.mUsedSize) { result = false; } return result; } /* 802D0A10-802D0A1C 2CB350 000C+00 1/0 0/0 0/0 .text getHeapType__10JKRExpHeapFv */ u32 JKRExpHeap::getHeapType() { return 'EXPH'; } /* 802D0A1C-802D0A24 2CB35C 0008+00 1/0 0/0 0/0 .text do_getCurrentGroupId__10JKRExpHeapFv */ u8 JKRExpHeap::do_getCurrentGroupId() { return mCurrentGroupId; } /* ############################################################################################## */ /* 8039CD84-8039CDA0 0293E4 001C+00 0/0 0/0 0/0 .rodata None */ #pragma push #pragma force_active on SECTION_DEAD static char const* const stringBase_8039CD84 = "+---------------JKRExpHeap\n"; #pragma pop /* 8039CDA0-8039CDD0 029400 0030+00 0/0 0/0 0/0 .rodata None */ #pragma push #pragma force_active on SECTION_DEAD static char const* const stringBase_8039CDA0 = "| Align Group size ( prev , next )\n"; #pragma pop /* 8039CDD0-8039CDE2 029430 0012+00 0/0 0/0 0/0 .rodata None */ #pragma push #pragma force_active on SECTION_DEAD static char const* const stringBase_8039CDD0 = "| ---- FreeFirst\n"; #pragma pop /* 8039CDE2-8039CDEB 029442 0009+00 0/0 0/0 0/0 .rodata None */ #pragma push #pragma force_active on SECTION_DEAD static char const* const stringBase_8039CDE2 = "| %08x "; #pragma pop /* 8039CDEB-8039CE07 02944B 001C+00 0/0 0/0 0/0 .rodata None */ #pragma push #pragma force_active on SECTION_DEAD static char const* const stringBase_8039CDEB = "%2x %3d %6x (%08x %08x)\n"; #pragma pop /* 8039CE07-8039CE18 029467 0011+00 0/0 0/0 0/0 .rodata None */ #pragma push #pragma force_active on SECTION_DEAD static char const* const stringBase_8039CE07 = "| ---- FreeLast\n"; #pragma pop /* 8039CE18-8039CE2A 029478 0012+00 0/0 0/0 0/0 .rodata None */ #pragma push #pragma force_active on SECTION_DEAD static char const* const stringBase_8039CE18 = "| ---- UsedFirst\n"; #pragma pop /* 8039CE2A-8039CE3B 02948A 0011+00 0/0 0/0 0/0 .rodata None */ #pragma push #pragma force_active on SECTION_DEAD static char const* const stringBase_8039CE2A = "| ---- UsedLast\n"; #pragma pop /* 8039CE3B-8039CE50 02949B 0015+00 0/0 0/0 0/0 .rodata None */ #pragma push #pragma force_active on SECTION_DEAD static char const* const stringBase_8039CE3B = "+---------------End\n"; #pragma pop /* 8039CAF0-8039CAF0 029150 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */