diff --git a/librecomp/include/librecomp/game.hpp b/librecomp/include/librecomp/game.hpp index 57625ae..da26710 100644 --- a/librecomp/include/librecomp/game.hpp +++ b/librecomp/include/librecomp/game.hpp @@ -30,9 +30,11 @@ namespace recomp { bool has_compressed_code = false; gpr entrypoint_address; - void (*entrypoint)(uint8_t* rdram, recomp_context* context); + void (*entrypoint)(uint8_t* rdram, recomp_context* context) = nullptr; - void (*thread_create_callback)(uint8_t* rdram, recomp_context* context); + void (*thread_create_callback)(uint8_t* rdram, recomp_context* context) = nullptr; + + void (*on_init_callback)(uint8_t* rdram, recomp_context* context) = nullptr; std::u8string stored_filename() const; }; diff --git a/librecomp/src/recomp.cpp b/librecomp/src/recomp.cpp index e18a74c..da26074 100644 --- a/librecomp/src/recomp.cpp +++ b/librecomp/src/recomp.cpp @@ -530,6 +530,9 @@ bool wait_for_game_started(uint8_t* rdram, recomp_context* context) { const recomp::GameEntry& game_entry = find_it->second; init(rdram, context, game_entry.entrypoint_address); + if (game_entry.on_init_callback) { + game_entry.on_init_callback(rdram, context); + } uint32_t mod_ram_used = 0; if (!game_entry.mod_game_id.empty()) { diff --git a/ultramodern/src/threadqueue.cpp b/ultramodern/src/threadqueue.cpp index 22ab3bc..f9c0fa1 100644 --- a/ultramodern/src/threadqueue.cpp +++ b/ultramodern/src/threadqueue.cpp @@ -47,6 +47,7 @@ bool ultramodern::thread_queue_remove(RDRAM_ARG PTR(PTR(OSThread)) queue_, PTR(O while (cur != NULLPTR) { PTR(OSThread)* cur_ptr = queue_to_ptr(PASS_RDRAM queue_); if (*cur_ptr == t_) { + *cur_ptr = TO_PTR(OSThread, *cur_ptr)->next; return true; } cur = TO_PTR(OSThread, *cur_ptr)->next;