Files
jak-project/game/mips2c/jakx_functions/joint.cpp
T
Tyler Wilding 9c86c86c74 d/jx: More files (#4360)
Breaks the 300 file milestone, also includes the majority of mips2c
functions carried forward. Some functions need some fixes in the c++
code to mips2c properly, and a small handful of the mips2c functions
require manual patching -- all spots were marked with `TODO - fix` that
had to be commented out to get things compiling.
2026-09-04 09:27:06 -04:00

231 lines
14 KiB
C++

//--------------------------MIPS2C---------------------
// clang-format off
#include "game/mips2c/mips2c_private.h"
#include "game/kernel/jakx/kscheme.h"
using ::jakx::intern_from_c;
namespace Mips2C::jakx {
namespace calc_animation_from_spr {
struct Cache {
void* fake_scratchpad_data; // *fake-scratchpad-data*
void* clear_frame_accumulator; // clear-frame-accumulator
void* decompress_fixed_data_to_accumulator; // decompress-fixed-data-to-accumulator
void* decompress_frame_data_pair_to_accumulator; // decompress-frame-data-pair-to-accumulator
void* decompress_frame_data_to_accumulator; // decompress-frame-data-to-accumulator
void* normalize_frame_quaternions; // normalize-frame-quaternions
} cache;
u64 execute(void* ctxt) {
auto* c = (ExecutionContext*)ctxt;
bool bc = false;
u32 call_addr = 0;
c->mov64(v1, a1); // or v1, a1, r0
c->daddiu(sp, sp, -192); // daddiu sp, sp, -192
c->sq(s0, 0, sp); // sq s0, 0(sp)
c->sq(s1, 16, sp); // sq s1, 16(sp)
c->sq(s2, 32, sp); // sq s2, 32(sp)
c->sq(s3, 48, sp); // sq s3, 48(sp)
c->sq(s4, 64, sp); // sq s4, 64(sp)
c->sq(s5, 80, sp); // sq s5, 80(sp)
c->sq(s6, 96, sp); // sq s6, 96(sp)
c->sq(t8, 112, sp); // sq t8, 112(sp)
c->sq(t9, 128, sp); // sq t9, 128(sp)
c->sq(gp, 144, sp); // sq gp, 144(sp)
c->sq(fp, 160, sp); // sq fp, 160(sp)
c->sq(ra, 176, sp); // sq ra, 176(sp)
c->daddiu(sp, sp, -16); // daddiu sp, sp, -16
c->mov128_vf_gpr(vf15, r0); // qmtc2.i vf15, r0
c->sw(a1, 0, sp); // sw a1, 0(sp)
get_fake_spad_addr2(v1, cache.fake_scratchpad_data, 0, c);// lui v1, 28672
c->lw(s1, 2384, v1); // lw s1, 2384(v1)
c->daddiu(t7, v1, 1808); // daddiu t7, v1, 1808
c->lui(s0, 4096); // lui s0, 4096
c->daddiu(t1, v1, 7328); // daddiu t1, v1, 7328
bc = c->sgpr64(s1) == 0; // beq s1, r0, L20
c->ori(s0, s0, 54272); // ori s0, s0, 54272
if (bc) {goto block_12;} // branch non-likely
c->lw(t2, 0, t7); // lw t2, 0(t7)
c->addiu(t3, r0, 7392); // addiu t3, r0, 7392
c->lw(t4, 4, t7); // lw t4, 4(t7)
c->addiu(v1, r0, 256); // addiu v1, r0, 256
c->sw(t2, 16, s0); // sw t2, 16(s0)
c->vadd_bc(DEST::xyzw, BC::w, vf14, vf15, vf0); // vaddw.xyzw vf14, vf15, vf0
c->sw(t3, 128, s0); // sw t3, 128(s0)
// nop // sll r0, r0, 0
c->sw(t4, 32, s0); // sw t4, 32(s0)
// Unknown instr: sync.l
c->sw(v1, 0, s0); // sw v1, 0(s0)
// Unknown instr: sync.l
c->load_symbol2(t9, cache.clear_frame_accumulator);// lw t9, clear-frame-accumulator(s7)
c->vadd(DEST::yz, vf14, vf14, vf14); // vadd.yz vf14, vf14, vf14
c->lw(s2, 0, sp); // lw s2, 0(sp)
// nop // sll r0, r0, 0
call_addr = c->gprs[t9].du32[0]; // function call:
c->vadd(DEST::yz, vf14, vf14, vf14); // vadd.yz vf14, vf14, vf14
c->jalr(call_addr); // jalr ra, t9
block_2:
c->lw(v1, 0, s0); // lw v1, 0(s0)
// nop // sll r0, r0, 0
c->andi(v1, v1, 256); // andi v1, v1, 256
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
bc = c->sgpr64(v1) != 0; // bne v1, r0, L16
// nop // sll r0, r0, 0
if (bc) {goto block_2;} // branch non-likely
c->lw(t2, 8, t7); // lw t2, 8(t7)
c->addiu(t3, r0, 9600); // addiu t3, r0, 9600
c->lw(t4, 12, t7); // lw t4, 12(t7)
c->addiu(v1, r0, 256); // addiu v1, r0, 256
c->sw(t2, 16, s0); // sw t2, 16(s0)
// nop // sll r0, r0, 0
c->sw(t3, 128, s0); // sw t3, 128(s0)
// nop // sll r0, r0, 0
c->sw(t4, 32, s0); // sw t4, 32(s0)
// Unknown instr: sync.l
c->sw(v1, 0, s0); // sw v1, 0(s0)
// Unknown instr: sync.l
c->lw(a2, 16, t7); // lw a2, 16(t7)
get_fake_spad_addr2(a1, cache.fake_scratchpad_data, 0, c);// lui a1, 28672
c->load_symbol2(t9, cache.decompress_fixed_data_to_accumulator);// lw t9, decompress-fixed-data-to-accumulator(s7)
c->daddiu(a1, a1, 7392); // daddiu a1, a1, 7392
call_addr = c->gprs[t9].du32[0]; // function call:
c->daddiu(s1, s1, -1); // daddiu s1, s1, -1
c->jalr(call_addr); // jalr ra, t9
block_4:
c->lw(v1, 0, s0); // lw v1, 0(s0)
// nop // sll r0, r0, 0
c->andi(v1, v1, 256); // andi v1, v1, 256
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
bc = c->sgpr64(v1) != 0; // bne v1, r0, L17
// nop // sll r0, r0, 0
if (bc) {goto block_4;} // branch non-likely
bc = c->sgpr64(s1) == 0; // beq s1, r0, L18
// nop // sll r0, r0, 0
if (bc) {goto block_7;} // branch non-likely
c->lw(t2, 24, t7); // lw t2, 24(t7)
c->addiu(t3, r0, 7392); // addiu t3, r0, 7392
c->lw(t4, 28, t7); // lw t4, 28(t7)
c->addiu(v1, r0, 256); // addiu v1, r0, 256
c->sw(t2, 16, s0); // sw t2, 16(s0)
// nop // sll r0, r0, 0
c->sw(t3, 128, s0); // sw t3, 128(s0)
// nop // sll r0, r0, 0
c->sw(t4, 32, s0); // sw t4, 32(s0)
// Unknown instr: sync.l
c->sw(v1, 0, s0); // sw v1, 0(s0)
// Unknown instr: sync.l
block_7:
c->lw(t0, 20, t7); // lw t0, 20(t7)
get_fake_spad_addr2(a1, cache.fake_scratchpad_data, 0, c);// lui a1, 28672
c->lw(a2, 16, t7); // lw a2, 16(t7)
c->daddiu(a1, a1, 9600); // daddiu a1, a1, 9600
bc = c->sgpr64(t0) == 0; // beq t0, r0, L19
// nop // sll r0, r0, 0
if (bc) {goto block_10;} // branch non-likely
c->lw(a3, 12, t7); // lw a3, 12(t7)
// nop // sll r0, r0, 0
c->load_symbol2(t9, cache.decompress_frame_data_pair_to_accumulator);// lw t9, decompress-frame-data-pair-to-accumulator(s7)
// nop // sll r0, r0, 0
call_addr = c->gprs[t9].du32[0]; // function call:
c->sll(a3, a3, 3); // sll a3, a3, 3
c->jalr(call_addr); // jalr ra, t9
bc = c->sgpr64(s1) != 0; // bne s1, r0, L16
c->daddiu(t7, t7, 24); // daddiu t7, t7, 24
if (bc) {goto block_2;} // branch non-likely
c->load_symbol2(t9, cache.normalize_frame_quaternions);// lw t9, normalize-frame-quaternions(s7)
// nop // sll r0, r0, 0
c->lw(s2, 0, sp); // lw s2, 0(sp)
// nop // sll r0, r0, 0
call_addr = c->gprs[t9].du32[0]; // function call:
// nop // sll r0, r0, 0
c->jalr(call_addr); // jalr ra, t9
c->daddiu(sp, sp, 16); // daddiu sp, sp, 16
// nop // sll r0, r0, 0
c->lq(s0, 0, sp); // lq s0, 0(sp)
c->lq(s1, 16, sp); // lq s1, 16(sp)
c->lq(s2, 32, sp); // lq s2, 32(sp)
c->lq(s3, 48, sp); // lq s3, 48(sp)
c->lq(s4, 64, sp); // lq s4, 64(sp)
c->lq(s5, 80, sp); // lq s5, 80(sp)
c->lq(s6, 96, sp); // lq s6, 96(sp)
c->lq(t8, 112, sp); // lq t8, 112(sp)
c->lq(t9, 128, sp); // lq t9, 128(sp)
c->lq(gp, 144, sp); // lq gp, 144(sp)
c->lq(ra, 176, sp); // lq ra, 176(sp)
c->lq(fp, 160, sp); // lq fp, 160(sp)
//jr ra // jr ra
c->daddiu(sp, sp, 192); // daddiu sp, sp, 192
goto end_of_function; // return
block_10:
c->load_symbol2(t9, cache.decompress_frame_data_to_accumulator);// lw t9, decompress-frame-data-to-accumulator(s7)
// nop // sll r0, r0, 0
call_addr = c->gprs[t9].du32[0]; // function call:
// nop // sll r0, r0, 0
c->jalr(call_addr); // jalr ra, t9
bc = c->sgpr64(s1) != 0; // bne s1, r0, L16
c->daddiu(t7, t7, 24); // daddiu t7, t7, 24
if (bc) {goto block_2;} // branch non-likely
c->load_symbol2(t9, cache.normalize_frame_quaternions);// lw t9, normalize-frame-quaternions(s7)
// nop // sll r0, r0, 0
c->lw(s2, 0, sp); // lw s2, 0(sp)
// nop // sll r0, r0, 0
call_addr = c->gprs[t9].du32[0]; // function call:
// nop // sll r0, r0, 0
c->jalr(call_addr); // jalr ra, t9
block_12:
c->daddiu(sp, sp, 16); // daddiu sp, sp, 16
// nop // sll r0, r0, 0
c->lq(s0, 0, sp); // lq s0, 0(sp)
c->lq(s1, 16, sp); // lq s1, 16(sp)
c->lq(s2, 32, sp); // lq s2, 32(sp)
c->lq(s3, 48, sp); // lq s3, 48(sp)
c->lq(s4, 64, sp); // lq s4, 64(sp)
c->lq(s5, 80, sp); // lq s5, 80(sp)
c->lq(s6, 96, sp); // lq s6, 96(sp)
c->lq(t8, 112, sp); // lq t8, 112(sp)
c->lq(t9, 128, sp); // lq t9, 128(sp)
c->lq(gp, 144, sp); // lq gp, 144(sp)
c->lq(ra, 176, sp); // lq ra, 176(sp)
c->lq(fp, 160, sp); // lq fp, 160(sp)
//jr ra // jr ra
c->daddiu(sp, sp, 192); // daddiu sp, sp, 192
goto end_of_function; // return
//jr ra // jr ra
c->daddu(sp, sp, r0); // daddu sp, sp, r0
goto end_of_function; // return
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
// nop // sll r0, r0, 0
end_of_function:
return c->gprs[v0].du64[0];
}
void link() {
cache.fake_scratchpad_data = intern_from_c(-1, 0, "*fake-scratchpad-data*").c();
cache.clear_frame_accumulator = intern_from_c(-1, 0, "clear-frame-accumulator").c();
cache.decompress_fixed_data_to_accumulator = intern_from_c(-1, 0, "decompress-fixed-data-to-accumulator").c();
cache.decompress_frame_data_pair_to_accumulator = intern_from_c(-1, 0, "decompress-frame-data-pair-to-accumulator").c();
cache.decompress_frame_data_to_accumulator = intern_from_c(-1, 0, "decompress-frame-data-to-accumulator").c();
cache.normalize_frame_quaternions = intern_from_c(-1, 0, "normalize-frame-quaternions").c();
gLinkedFunctionTable.reg("calc-animation-from-spr", execute, 512);
}
} // namespace calc_animation_from_spr
} // namespace Mips2C