From f4b023df317f48a36076de82229a8b01d800288c Mon Sep 17 00:00:00 2001 From: dbalatoni13 <40299962+dbalatoni13@users.noreply.github.com> Date: Sat, 12 Apr 2025 14:23:11 +0200 Subject: [PATCH] 64 bit improvements --- include/port/byteswap.h | 48 +++++++++++++++++++++++++++++----- src/REL/bootDll/main.c | 3 +++ src/dolphin/demo/DEMOInit.c | 24 ++++++++--------- src/dolphin/os/OSAlloc.c | 2 +- src/game/malloc.c | 7 +++-- src/game/memory.c | 18 +++++++++---- src/game/process.c | 3 +++ src/game/sprman.c | 34 ++++++++++++------------ src/port/byteswap.cpp | 52 +++++-------------------------------- 9 files changed, 101 insertions(+), 90 deletions(-) diff --git a/include/port/byteswap.h b/include/port/byteswap.h index c1d309a7..4e65aa47 100644 --- a/include/port/byteswap.h +++ b/include/port/byteswap.h @@ -2,13 +2,49 @@ #define _SRC_BYTESWAP_H_ #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif #include "game/animdata.h" #include "game/hsfformat.h" +typedef struct AnimData32b { + s16 bankNum; + s16 patNum; + s16 bmpNum; + s16 useNum; + + u32 bank; + u32 pat; + u32 bmp; +} AnimData32b; + +typedef struct AnimBankData32b { + s16 timeNum; + s16 unk; + u32 frame; +} AnimBankData32b; + +typedef struct AnimPatData32b { + s16 layerNum; + s16 centerX; + s16 centerY; + s16 sizeX; + s16 sizeY; + u32 layer; +} AnimPatData32b; + +typedef struct AnimBmpData32b { + u8 pixSize; + u8 dataFmt; + s16 palNum; + s16 sizeX; + s16 sizeY; + u32 dataSize; + u32 palData; + u32 data; +} AnimBmpData32b; + typedef struct HsfCluster32b { u32 name[2]; u32 targetName; @@ -236,10 +272,10 @@ void byteswap_s32(s32 *src); void byteswap_hsfvec3f(HsfVector3f *src); void byteswap_hsfvec2f(HsfVector2f *src); -void byteswap_animdata(void *src, AnimData* dest); -void byteswap_animbankdata(void *src, AnimBankData *dest); -void byteswap_animpatdata(void *src, AnimPatData *dest); -void byteswap_animbmpdata(void *src, AnimBmpData *dest); +void byteswap_animdata(void *src, AnimData *dest); +void byteswap_animbankdata(AnimBankData32b *src, AnimBankData *dest); +void byteswap_animpatdata(AnimPatData32b *src, AnimPatData *dest); +void byteswap_animbmpdata(AnimBmpData32b *src, AnimBmpData *dest); void byteswap_animframedata(AnimFrameData *src); void byteswap_animlayerdata(AnimLayerData *src); diff --git a/src/REL/bootDll/main.c b/src/REL/bootDll/main.c index f6b09479..21322098 100644 --- a/src/REL/bootDll/main.c +++ b/src/REL/bootDll/main.c @@ -566,6 +566,8 @@ void ObjectSetup(void) s16 sprite; AnimData *sprite_data; s16 i; +#ifdef __MWERKS__ + // TODO PC titleMdlId[0] = model = Hu3DModelCreateFile(TITLE_CHAR_HSF); Hu3DModelAttrSet(model, HU3D_ATTR_DISPOFF); Hu3DModelAttrSet(model, HU3D_MOTATTR_LOOP); @@ -577,6 +579,7 @@ void ObjectSetup(void) Hu3DModelAttrSet(model, HU3D_MOTATTR_LOOP); Hu3DModelCameraInfoSet(model, 1); Hu3DModelLightInfoSet(model, 1); +#endif #if VERSION_NTSC bootGrpId = HuSprGrpCreate(4); #else diff --git a/src/dolphin/demo/DEMOInit.c b/src/dolphin/demo/DEMOInit.c index 86df9bd1..798653b4 100644 --- a/src/dolphin/demo/DEMOInit.c +++ b/src/dolphin/demo/DEMOInit.c @@ -77,10 +77,10 @@ static void __DEMOInitMem() void *arenaHi = OSGetArenaHi(); unsigned long fbSize = ((u16)(rmode->fbWidth + 15) & 0xFFF0) * rmode->xfbHeight * 2; - DemoFrameBuffer1 = (void *)(((u32)arenaLo + 0x1F) & 0xFFFFFFE0); - DemoFrameBuffer2 = (void *)(((u32)DemoFrameBuffer1 + fbSize + 0x1F) & 0xFFFFFFE0); + DemoFrameBuffer1 = (void *)(((uintptr_t)arenaLo + 0x1F) & ~0x1F); + DemoFrameBuffer2 = (void *)(((uintptr_t)DemoFrameBuffer1 + fbSize + 0x1F) & ~0x1F); DemoCurrentBuffer = DemoFrameBuffer2; - arenaLo = (void *)(((u32)DemoFrameBuffer2 + fbSize + 0x1F) & 0xFFFFFFE0); + arenaLo = (void *)(((uintptr_t)DemoFrameBuffer2 + fbSize + 0x1F) & ~0x1F); OSSetArenaLo(arenaLo); if (((OSGetConsoleType() + 0xF0000000) == 4U) && ((OSGetPhysicalMemSize() + 0xFFC00000) != 0U) && (OSGetConsoleSimulatedMemSize() < 0x01800000U)) { @@ -91,9 +91,9 @@ static void __DEMOInitMem() arenaHi = OSGetArenaHi(); arenaLo = OSInitAlloc(arenaLo, arenaHi, 1); OSSetArenaLo(arenaLo); - arenaLo = (void *)(((u32)arenaLo + 0x1F) & 0xFFFFFFE0); - arenaHi = (void *)((u32)arenaHi & 0xFFFFFFE0); - OSSetCurrentHeap(OSCreateHeap((void *)(((u32)arenaLo)), arenaHi)); + arenaLo = (void *)(((uintptr_t)arenaLo + 0x1F) & ~0x1F); + arenaHi = (void *)((uintptr_t)arenaHi & ~0x1F); + OSSetCurrentHeap(OSCreateHeap((void *)(((uintptr_t)arenaLo)), arenaHi)); OSSetArenaLo((arenaLo = arenaHi)); } @@ -210,13 +210,13 @@ static void LoadMemInfo() arenaHi = OSGetArenaHi(); arenaLo = OSInitAlloc(arenaLo, arenaHi, 1); OSSetArenaLo(arenaLo); - arenaLo = (void *)(((u32)arenaLo + 0x1F) & 0xFFFFFFE0); - arenaHi = (void *)((u32)arenaHi & 0xFFFFFFE0); + arenaLo = (void *)(((uintptr_t)arenaLo + 0x1F) & ~0x1F); + arenaHi = (void *)((uintptr_t)arenaHi & ~0x1F); OSSetCurrentHeap(OSCreateHeap((void *)(((u32)arenaLo)), arenaHi)); OSSetArenaLo((arenaLo = arenaHi)); return; } - memEntry = (void *)((u32)buf + 0x1F & 0xFFFFFFE0); + memEntry = (void *)((uintptr_t)buf + 0x1F & ~0x1F); arenaHiOld = OSGetArenaHi(); simMemEnd = OSPhysicalToCached(OSGetConsoleSimulatedMemSize()); OSSetArenaHi(OSPhysicalToCached(OSGetPhysicalMemSize())); @@ -224,8 +224,8 @@ static void LoadMemInfo() arenaHi = OSGetArenaHi(); arenaLo = OSInitAlloc(arenaLo, arenaHi, 1); OSSetArenaLo(arenaLo); - arenaLo = (void *)(((u32)arenaLo + 0x1F) & 0xFFFFFFE0); - arenaHi = (void *)((u32)arenaHi & 0xFFFFFFE0); + arenaLo = (void *)(((uintptr_t)arenaLo + 0x1F) & ~0x1F); + arenaHi = (void *)((uintptr_t)arenaHi & ~0x1F); OSSetCurrentHeap(OSCreateHeap((void *)(arenaLo), arenaHi)); OSSetArenaLo((arenaLo = arenaHi)); OSAllocFixed(&arenaHiOld, &simMemEnd); @@ -234,7 +234,7 @@ static void LoadMemInfo() while (length) { OSReport("loop\n"); transferLength = (length < 0x20) ? length : 0x20; - if (DVDReadPrio(&fileInfo, memEntry, (transferLength + 0x1F) & 0xFFFFFFE0, offset, 2) < 0) { + if (DVDReadPrio(&fileInfo, memEntry, (transferLength + 0x1F) & ~0x1F, offset, 2) < 0) { OSPanic(__FILE__, 0x49F, "An error occurred when issuing read to /meminfo.bin\n"); } indexMax = (transferLength / 8); diff --git a/src/dolphin/os/OSAlloc.c b/src/dolphin/os/OSAlloc.c index db41789a..86a7e015 100644 --- a/src/dolphin/os/OSAlloc.c +++ b/src/dolphin/os/OSAlloc.c @@ -155,7 +155,7 @@ void *OSAllocFromHeap(int heap, unsigned long size) hd = &HeapArray[heap]; size += 0x20; - size = (size + 0x1F) & 0xFFFFFFE0; + size = (size + 0x1F) & ~0x1F; for (cell = hd->free; cell != NULL; cell = cell->next) { if ((signed)size <= (signed)cell->size) { diff --git a/src/game/malloc.c b/src/game/malloc.c index f5d747bf..9c112cc7 100644 --- a/src/game/malloc.c +++ b/src/game/malloc.c @@ -11,6 +11,9 @@ void HuMemInitAll(void) void *ptr; u32 free_size; for(i=0; i<4; i++) { +#ifdef TARGET_PC + HeapSizeTbl[i] *= 2; +#endif ptr = OSAlloc(HeapSizeTbl[i]); if(ptr == NULL) { OSReport("HuMem> Failed OSAlloc Size:%d\n", HeapSizeTbl[i]); @@ -55,7 +58,7 @@ void *HuMemDirectMalloc(HeapID heap, s32 size) mflr retaddr } #endif - size = (size+31) & 0xFFFFFFE0; + size = (size + 31) & ~0x1F; return HuMemMemoryAlloc(HeapTbl[heap], size, retaddr); } @@ -69,7 +72,7 @@ void *HuMemDirectMallocNum(HeapID heap, s32 size, uintptr_t num) mflr retaddr } #endif - size = (size+31) & 0xFFFFFFE0; + size = (size + 31) & ~0x1F; return HuMemMemoryAllocNum(HeapTbl[heap], size, num, retaddr); } diff --git a/src/game/memory.c b/src/game/memory.c index 766af202..4b997331 100644 --- a/src/game/memory.c +++ b/src/game/memory.c @@ -1,10 +1,18 @@ #include "game/memory.h" #include "dolphin/os.h" + +#if INTPTR_MAX == INT32_MAX +#define MEM_ALLOC_SIZE(size) (((size) + 63) & ~0x1F) #define DATA_GET_BLOCK(ptr) ((struct memory_block *)(((char *)(ptr)) - 32)) #define BLOCK_GET_DATA(block) (((char *)(block)) + 32) - -#define MEM_ALLOC_SIZE(size) (((size) + 63) & 0xFFFFFFE0) +#define BLOCK_ALIGNMENT 32u +#else +#define MEM_ALLOC_SIZE(size) (((size - 1) / 32 + 1) * 32 + 64) +#define DATA_GET_BLOCK(ptr) ((struct memory_block *)(((char *)(ptr)) - 64)) +#define BLOCK_GET_DATA(block) (((char *)(block)) + 64) +#define BLOCK_ALIGNMENT 64u +#endif struct memory_block { s32 size; @@ -47,9 +55,9 @@ static void *HuMemMemoryAlloc2(void *heap_ptr, s32 size, uintptr_t num, uintptr_ struct memory_block *block = heap_ptr; do { if (!block->flag && block->size >= alloc_size) { - if (block->size - alloc_size > 32u) { + if (block->size - alloc_size > BLOCK_ALIGNMENT) { #ifdef TARGET_PC - struct memory_block *new_block = (struct memory_block *)(((char *)block) + alloc_size); + struct memory_block *new_block = (struct memory_block *)((char *)block + alloc_size); #else struct memory_block *new_block = (struct memory_block *)(((u32)block) + alloc_size); #endif @@ -202,7 +210,7 @@ s32 HuMemMemorySizeGet(void *ptr) } block = DATA_GET_BLOCK(ptr); if (block->flag == 1 && block->magic == 165) { - return block->size - 32; + return block->size - BLOCK_ALIGNMENT; } else { return 0; diff --git a/src/game/process.c b/src/game/process.c index d1efcd10..7fd45c55 100644 --- a/src/game/process.c +++ b/src/game/process.c @@ -72,6 +72,9 @@ Process *HuPrcCreate(void (*func)(void), u16 prio, u32 stack_size, s32 extra_siz if (stack_size == 0) { stack_size = 2048; } +#ifdef TARGET_PC + stack_size *= 2; +#endif alloc_size = HuMemMemoryAllocSizeGet(sizeof(Process)) + HuMemMemoryAllocSizeGet(stack_size) + HuMemMemoryAllocSizeGet(extra_size); if (!(heap = HuMemDirectMalloc(HEAP_SYSTEM, alloc_size))) { OSReport("process> malloc error size %d\n", alloc_size); diff --git a/src/game/sprman.c b/src/game/sprman.c index 043abc36..b1dc6495 100644 --- a/src/game/sprman.c +++ b/src/game/sprman.c @@ -215,12 +215,7 @@ AnimData *HuSprAnimRead(void *data) AnimBmpData *bmp; AnimBankData *bank; AnimPatData *pat; -#ifdef TARGET_PC - AnimBmpData *bmp2; - AnimBankData *bank2; - AnimPatData *pat2; -#endif - + #ifdef TARGET_PC AnimData *anim = HuMemDirectMallocNum(HEAP_DATA, sizeof(AnimData), MEMORY_DEFAULT_NUM); byteswap_animdata(data, anim); @@ -231,25 +226,28 @@ AnimData *HuSprAnimRead(void *data) anim->useNum++; return anim; } - bank = (AnimBankData *)((uintptr_t)anim->bank+(uintptr_t)data); + bank = (void *)((uintptr_t)anim->bank+(uintptr_t)data); #ifdef TARGET_PC - bank2 = HuMemDirectMallocNum(HEAP_DATA, sizeof(AnimBankData), MEMORY_DEFAULT_NUM); - byteswap_animbankdata(bank, bank2); - bank = bank2; + bank = HuMemDirectMallocNum(HEAP_DATA, anim->bankNum * sizeof(AnimBankData), MEMORY_DEFAULT_NUM); + for(i=0; ibankNum; i++) { + byteswap_animbankdata(&((AnimBankData32b*)((uintptr_t)anim->bank+(uintptr_t)data))[i], &bank[i]); + } #endif anim->bank = bank; - pat = (AnimPatData *)((uintptr_t)anim->pat+(uintptr_t)data); + pat = (void *)((uintptr_t)anim->pat+(uintptr_t)data); #ifdef TARGET_PC - pat2 = HuMemDirectMallocNum(HEAP_DATA, sizeof(AnimPatData), MEMORY_DEFAULT_NUM); - byteswap_animpatdata(pat, pat2); - pat = pat2; + pat = HuMemDirectMallocNum(HEAP_DATA, anim->patNum * sizeof(AnimPatData), MEMORY_DEFAULT_NUM); + for(i=0; ipatNum; i++) { + byteswap_animpatdata(&((AnimPatData32b*)((uintptr_t)anim->pat+(uintptr_t)data))[i], &pat[i]); + } #endif anim->pat = pat; - bmp = (AnimBmpData *)((uintptr_t)anim->bmp+(uintptr_t)data); + bmp = (void *)((uintptr_t)anim->bmp+(uintptr_t)data); #ifdef TARGET_PC - bmp2 = HuMemDirectMallocNum(HEAP_DATA, sizeof(AnimBmpData), MEMORY_DEFAULT_NUM); - byteswap_animbmpdata(bmp, bmp2); - bmp = bmp2; + bmp = HuMemDirectMallocNum(HEAP_DATA, anim->bmpNum * sizeof(AnimBmpData), MEMORY_DEFAULT_NUM); + for(i=0; ibmpNum; i++) { + byteswap_animbmpdata(&((AnimBmpData32b*)((uintptr_t)anim->bmp+(uintptr_t)data))[i], &bmp[i]); + } #endif anim->bmp = bmp; for(i=0; ibankNum; i++, bank++) { diff --git a/src/port/byteswap.cpp b/src/port/byteswap.cpp index c6d6ab84..86d73508 100644 --- a/src/port/byteswap.cpp +++ b/src/port/byteswap.cpp @@ -8,43 +8,6 @@ extern "C" { #include "port/byteswap.h" - -typedef struct AnimData32b { - s16 bankNum; - s16 patNum; - s16 bmpNum; - s16 useNum; - - u32 bank; - u32 pat; - u32 bmp; -} AnimData32b; - -typedef struct AnimBankData32b { - s16 timeNum; - s16 unk; - u32 frame; -} AnimBankData32b; - -typedef struct AnimPatData32b { - s16 layerNum; - s16 centerX; - s16 centerY; - s16 sizeX; - s16 sizeY; - u32 layer; -} AnimPatData32b; - -typedef struct AnimBmpData32b { - u8 pixSize; - u8 dataFmt; - s16 palNum; - s16 sizeX; - s16 sizeY; - u32 dataSize; - u32 palData; - u32 data; -} AnimBmpData32b; } template [[nodiscard]] constexpr T bswap16(T val) noexcept @@ -796,24 +759,21 @@ void byteswap_animdata(void *src, AnimData *dest) sVisitedPtrs.clear(); } -void byteswap_animbankdata(void *src, AnimBankData *dest) +void byteswap_animbankdata(AnimBankData32b *src, AnimBankData *dest) { - auto *bank = reinterpret_cast(src); - bswap(*bank, *bank, *dest); + bswap(*src, *src, *dest); sVisitedPtrs.clear(); } -void byteswap_animpatdata(void *src, AnimPatData *dest) +void byteswap_animpatdata(AnimPatData32b *src, AnimPatData *dest) { - auto *pat = reinterpret_cast(src); - bswap(*pat, *pat, *dest); + bswap(*src, *src, *dest); sVisitedPtrs.clear(); } -void byteswap_animbmpdata(void *src, AnimBmpData *dest) +void byteswap_animbmpdata(AnimBmpData32b *src, AnimBmpData *dest) { - auto *bmp = reinterpret_cast(src); - bswap(*bmp, *bmp, *dest); + bswap(*src, *src, *dest); sVisitedPtrs.clear(); }