From 373f08ca3e045d3940dd94cf32a5aa847c70e421 Mon Sep 17 00:00:00 2001 From: Raf <> Date: Sun, 4 Aug 2024 18:26:09 +0800 Subject: [PATCH] portx64: pd-extract setups: a few bug fixes and changed how lists are copied - moved ptrmarkers out of ext_file_bg to common - function to get ailist length --- port/pdextract/common.c | 33 +++++++++++++++++++++++++++++++++ port/pdextract/common.h | 9 +++++++++ port/pdextract/ext_file_bg.c | 36 ------------------------------------ src/game/chrai.c | 16 ++++++++++++++++ 4 files changed, 58 insertions(+), 36 deletions(-) create mode 100644 port/pdextract/common.c diff --git a/port/pdextract/common.c b/port/pdextract/common.c new file mode 100644 index 000000000..dcf425574 --- /dev/null +++ b/port/pdextract/common.c @@ -0,0 +1,33 @@ +#include "common.h" +#include "system.h" + +struct ptrmarker m_PtrMarkers[2048]; +int m_NumPtrMarkers; + +void add_marker(u32 ptr_src, uintptr_t ptr_host) +{ + if (m_NumPtrMarkers >= ARRAYCOUNT(m_PtrMarkers)) { + sysLogPrintf(LOG_ERROR, "[BG] Marker limit exceeded"); + exit(EXIT_FAILURE); + } + + m_PtrMarkers[m_NumPtrMarkers].ptr_src = ptr_src; + m_PtrMarkers[m_NumPtrMarkers].ptr_host = ptr_host; + m_NumPtrMarkers++; +} + +struct ptrmarker* find_marker(uintptr_t ptr_src) +{ + for (int i = 0; i < m_NumPtrMarkers; i++) { + if (m_PtrMarkers[i].ptr_src == ptr_src) { + return &m_PtrMarkers[i]; + } + } + + return NULL; +} + +void reset_markers() +{ + m_NumPtrMarkers = 0; +} diff --git a/port/pdextract/common.h b/port/pdextract/common.h index 665bd6d48..84ee4e08a 100644 --- a/port/pdextract/common.h +++ b/port/pdextract/common.h @@ -77,4 +77,13 @@ void gbi_convert_vtx(uint8_t* dst, uint32_t dstpos, int count); void gbi_gdl_rewrite_addrs(uint8_t* dst, uint32_t offset); void gbi_add_tex_addr(uint32_t src_offset, uint32_t dst_offset); +struct ptrmarker { + u32 ptr_src; + uintptr_t ptr_host; +}; + +void add_marker(u32 ptr_src, uintptr_t ptr_host); +struct ptrmarker* find_marker(uintptr_t ptr_src); +void reset_markers(); + #endif diff --git a/port/pdextract/ext_file_bg.c b/port/pdextract/ext_file_bg.c index 69a445356..c45ca1cb0 100644 --- a/port/pdextract/ext_file_bg.c +++ b/port/pdextract/ext_file_bg.c @@ -6,44 +6,8 @@ #include "system.h" #include "platform.h" -struct ptrmarker { - u32 ptr_src; - uintptr_t ptr_host; -}; - - -struct ptrmarker m_PtrMarkers[2048]; -int m_NumPtrMarkers; int m_SizeGDLs; -static void add_marker(u32 ptr_src, uintptr_t ptr_host) -{ - if (m_NumPtrMarkers >= ARRAYCOUNT(m_PtrMarkers)) { - sysLogPrintf(LOG_ERROR, "[BG] Marker limit exceeded"); - exit(EXIT_FAILURE); - } - - m_PtrMarkers[m_NumPtrMarkers].ptr_src = ptr_src; - m_PtrMarkers[m_NumPtrMarkers].ptr_host = ptr_host; - m_NumPtrMarkers++; -} - -static struct ptrmarker* find_marker(uintptr_t ptr_src) -{ - for (int i = 0; i < m_NumPtrMarkers; i++) { - if (m_PtrMarkers[i].ptr_src == ptr_src) { - return &m_PtrMarkers[i]; - } - } - - return NULL; -} - -static void reset_markers() -{ - m_NumPtrMarkers = 0; -} - /** * 4 bytes decompressed size of primary data * 4 bytes compressed size of section 1 in its entirety diff --git a/src/game/chrai.c b/src/game/chrai.c index ea5294dc0..1dfaefb71 100644 --- a/src/game/chrai.c +++ b/src/game/chrai.c @@ -814,3 +814,19 @@ u32 chraiGetCommandLength(u8 *ailist, u32 aioffset) return 1; } + +// used by ext_setup +u32 chraiGetAilistLength(u8* list) +{ + if (!list) return 0; + + u8* cmd = list; + + while (true) { + u8 type = cmd[1]; + cmd += chraiGetCommandLength(cmd, 0); + if (type == AICMD_END) break; + } + + return (u32)(cmd - list); +}