mirror of
https://github.com/open-goal/jak-project
synced 2026-09-05 02:55:51 -04:00
9c86c86c74
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.
231 lines
14 KiB
C++
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
|