mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 11:26:18 -04:00
807ca7465f
Co-authored-by: ManDude <7569514+ManDude@users.noreply.github.com>
539 lines
27 KiB
C++
539 lines
27 KiB
C++
//--------------------------MIPS2C---------------------
|
|
// clang-format off
|
|
#include "game/mips2c/mips2c_private.h"
|
|
#include "game/kernel/jak3/kscheme.h"
|
|
using ::jak3::intern_from_c;
|
|
namespace Mips2C::jak3 {
|
|
namespace method_21_nav_engine {
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
bool bc = false;
|
|
c->lwu(v1, 80, a0); // lwu v1, 80(a0)
|
|
c->lwu(v1, 4, v1); // lwu v1, 4(v1)
|
|
c->lwu(a2, 8, a0); // lwu a2, 8(a0)
|
|
c->lwu(a2, 4, a2); // lwu a2, 4(a2)
|
|
c->dsubu(v1, v1, a2); // dsubu v1, v1, a2
|
|
c->addiu(a2, r0, 0); // addiu a2, r0, 0
|
|
//beq r0, r0, L30 // beq r0, r0, L30
|
|
// nop // sll r0, r0, 0
|
|
goto block_4; // branch always
|
|
|
|
|
|
block_1:
|
|
c->lwu(a3, 4, a1); // lwu a3, 4(a1)
|
|
c->addiu(t0, r0, 288); // addiu t0, r0, 288
|
|
c->mult3(t0, t0, a2); // mult3 t0, t0, a2
|
|
c->daddu(a3, a3, t0); // daddu a3, a3, t0
|
|
c->daddiu(t0, a3, 112); // daddiu t0, a3, 112
|
|
c->lwu(t1, 8, a3); // lwu t1, 8(a3)
|
|
bc = c->sgpr64(s7) == c->sgpr64(t1); // beq s7, t1, L29
|
|
c->mov64(t1, s7); // or t1, s7, r0
|
|
if (bc) {goto block_3;} // branch non-likely
|
|
|
|
c->lwu(t1, 76, a0); // lwu t1, 76(a0)
|
|
c->daddiu(t1, t1, 32); // daddiu t1, t1, 32
|
|
c->sw(t1, 56, a3); // sw t1, 56(a3)
|
|
c->lwu(t1, 80, a0); // lwu t1, 80(a0)
|
|
c->sw(t1, 124, a3); // sw t1, 124(a3)
|
|
c->lwu(t1, 0, a1); // lwu t1, 0(a1)
|
|
c->addiu(t2, r0, 288); // addiu t2, r0, 288
|
|
c->mult3(t2, t2, a2); // mult3 t2, t2, a2
|
|
c->daddu(t1, t1, t2); // daddu t1, t1, t2
|
|
c->sw(t1, 4, t0); // sw t1, 4(t0)
|
|
c->mov64(t1, v1); // or t1, v1, r0
|
|
c->lw(t2, 16, t0); // lw t2, 16(t0)
|
|
c->daddu(t3, t2, t1); // daddu t3, t2, t1
|
|
c->xor_(t4, t2, s7); // xor t4, t2, s7
|
|
c->sltiu(t4, t4, 1); // sltiu t4, t4, 1
|
|
c->movz(t2, t3, t4); // movz t2, t3, t4
|
|
c->sw(t2, 16, t0); // sw t2, 16(t0)
|
|
c->lw(t2, 28, t0); // lw t2, 28(t0)
|
|
c->daddu(t3, t2, t1); // daddu t3, t2, t1
|
|
c->xor_(t4, t2, s7); // xor t4, t2, s7
|
|
c->sltiu(t4, t4, 1); // sltiu t4, t4, 1
|
|
c->movz(t2, t3, t4); // movz t2, t3, t4
|
|
c->sw(t2, 28, t0); // sw t2, 28(t0)
|
|
c->lw(t2, 24, t0); // lw t2, 24(t0)
|
|
c->daddu(t3, t2, t1); // daddu t3, t2, t1
|
|
c->xor_(t4, t2, s7); // xor t4, t2, s7
|
|
c->sltiu(t4, t4, 1); // sltiu t4, t4, 1
|
|
c->movz(t2, t3, t4); // movz t2, t3, t4
|
|
c->sw(t2, 24, t0); // sw t2, 24(t0)
|
|
c->lw(t2, 20, t0); // lw t2, 20(t0)
|
|
c->daddu(t1, t2, t1); // daddu t1, t2, t1
|
|
c->xor_(t3, t2, s7); // xor t3, t2, s7
|
|
c->sltiu(t3, t3, 1); // sltiu t3, t3, 1
|
|
c->movz(t2, t1, t3); // movz t2, t1, t3
|
|
c->sw(t2, 20, t0); // sw t2, 20(t0)
|
|
c->gprs[t0].du64[0] = 0; // or t0, r0, r0
|
|
c->lwu(t0, 0, a1); // lwu t0, 0(a1)
|
|
c->addiu(t1, r0, 288); // addiu t1, r0, 288
|
|
c->mult3(t1, t1, a2); // mult3 t1, t1, a2
|
|
c->daddu(t1, t0, t1); // daddu t1, t0, t1
|
|
c->lwu(a3, 8, a3); // lwu a3, 8(a3)
|
|
c->sw(t1, 140, a3); // sw t1, 140(a3)
|
|
|
|
block_3:
|
|
c->daddiu(a2, a2, 1); // daddiu a2, a2, 1
|
|
|
|
block_4:
|
|
c->lb(a3, 14, a1); // lb a3, 14(a1)
|
|
c->slt(a3, a2, a3); // slt a3, a2, a3
|
|
bc = c->sgpr64(a3) != 0; // bne a3, r0, L28
|
|
// nop // sll r0, r0, 0
|
|
if (bc) {goto block_1;} // branch non-likely
|
|
|
|
c->mov64(v1, s7); // or v1, s7, r0
|
|
c->mov64(v1, s7); // or v1, s7, r0
|
|
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
|
//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() {
|
|
gLinkedFunctionTable.reg("(method 21 nav-engine)", execute, 0);
|
|
}
|
|
|
|
} // namespace method_21_nav_engine
|
|
} // namespace Mips2C
|
|
|
|
//--------------------------MIPS2C---------------------
|
|
// clang-format off
|
|
#include "game/mips2c/mips2c_private.h"
|
|
#include "game/kernel/jak3/kscheme.h"
|
|
using ::jak3::intern_from_c;
|
|
namespace Mips2C::jak3 {
|
|
namespace method_20_nav_engine {
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
bool bc = false;
|
|
c->lwu(v1, 8, a0); // lwu v1, 8(a0)
|
|
c->lwu(v1, 4, v1); // lwu v1, 4(v1)
|
|
c->lwu(a2, 80, a0); // lwu a2, 80(a0)
|
|
c->lwu(a2, 4, a2); // lwu a2, 4(a2)
|
|
c->dsubu(v1, v1, a2); // dsubu v1, v1, a2
|
|
c->addiu(a2, r0, 0); // addiu a2, r0, 0
|
|
//beq r0, r0, L35 // beq r0, r0, L35
|
|
// nop // sll r0, r0, 0
|
|
goto block_6; // branch always
|
|
|
|
|
|
block_1:
|
|
c->lwu(a3, 4, a1); // lwu a3, 4(a1)
|
|
c->addiu(t0, r0, 288); // addiu t0, r0, 288
|
|
c->mult3(t0, t0, a2); // mult3 t0, t0, a2
|
|
c->daddu(a3, a3, t0); // daddu a3, a3, t0
|
|
c->daddiu(t0, a3, 112); // daddiu t0, a3, 112
|
|
c->lwu(t1, 8, a3); // lwu t1, 8(a3)
|
|
bc = c->sgpr64(s7) == c->sgpr64(t1); // beq s7, t1, L34
|
|
c->mov64(t1, s7); // or t1, s7, r0
|
|
if (bc) {goto block_5;} // branch non-likely
|
|
|
|
c->addiu(t1, r0, -257); // addiu t1, r0, -257
|
|
c->lwu(t2, 0, a3); // lwu t2, 0(a3)
|
|
c->and_(t1, t1, t2); // and t1, t1, t2
|
|
c->sw(t1, 0, a3); // sw t1, 0(a3)
|
|
c->lwu(t1, 8, a3); // lwu t1, 8(a3)
|
|
c->lwu(t1, 4, t1); // lwu t1, 4(t1)
|
|
c->andi(t1, t1, 2048); // andi t1, t1, 2048
|
|
bc = c->sgpr64(t1) == 0; // beq t1, r0, L33
|
|
c->mov64(t1, s7); // or t1, s7, r0
|
|
if (bc) {goto block_4;} // branch non-likely
|
|
|
|
c->lwu(t1, 0, a3); // lwu t1, 0(a3)
|
|
c->ori(t1, t1, 256); // ori t1, t1, 256
|
|
c->sw(t1, 0, a3); // sw t1, 0(a3)
|
|
|
|
block_4:
|
|
c->lwu(t1, 4, a0); // lwu t1, 4(a0)
|
|
c->daddiu(t1, t1, 32); // daddiu t1, t1, 32
|
|
c->sw(t1, 56, a3); // sw t1, 56(a3)
|
|
c->lwu(t1, 8, a0); // lwu t1, 8(a0)
|
|
c->sw(t1, 124, a3); // sw t1, 124(a3)
|
|
c->mov64(t1, v1); // or t1, v1, r0
|
|
c->lw(t2, 16, t0); // lw t2, 16(t0)
|
|
c->daddu(t3, t2, t1); // daddu t3, t2, t1
|
|
c->xor_(t4, t2, s7); // xor t4, t2, s7
|
|
c->slti(t4, t4, 1); // sltiu t4, t4, 1
|
|
c->movz(t2, t3, t4); // movz t2, t3, t4
|
|
c->sw(t2, 16, t0); // sw t2, 16(t0)
|
|
c->lw(t2, 28, t0); // lw t2, 28(t0)
|
|
c->daddu(t3, t2, t1); // daddu t3, t2, t1
|
|
c->xor_(t4, t2, s7); // xor t4, t2, s7
|
|
c->slti(t4, t4, 1); // sltiu t4, t4, 1
|
|
c->movz(t2, t3, t4); // movz t2, t3, t4
|
|
c->sw(t2, 28, t0); // sw t2, 28(t0)
|
|
c->lw(t2, 24, t0); // lw t2, 24(t0)
|
|
c->daddu(t3, t2, t1); // daddu t3, t2, t1
|
|
c->xor_(t4, t2, s7); // xor t4, t2, s7
|
|
c->slti(t4, t4, 1); // sltiu t4, t4, 1
|
|
c->movz(t2, t3, t4); // movz t2, t3, t4
|
|
c->sw(t2, 24, t0); // sw t2, 24(t0)
|
|
c->lw(t2, 20, t0); // lw t2, 20(t0)
|
|
c->daddu(t1, t2, t1); // daddu t1, t2, t1
|
|
c->xor_(t3, t2, s7); // xor t3, t2, s7
|
|
c->slti(t3, t3, 1); // sltiu t3, t3, 1
|
|
c->movz(t2, t1, t3); // movz t2, t1, t3
|
|
c->sw(t2, 20, t0); // sw t2, 20(t0)
|
|
c->gprs[t0].du64[0] = 0; // or t0, r0, r0
|
|
c->lwu(a3, 8, a3); // lwu a3, 8(a3)
|
|
c->sw(s7, 140, a3); // sw s7, 140(a3)
|
|
c->mov64(t1, s7); // or t1, s7, r0
|
|
|
|
block_5:
|
|
c->daddiu(a2, a2, 1); // daddiu a2, a2, 1
|
|
|
|
block_6:
|
|
c->lb(a3, 14, a1); // lb a3, 14(a1)
|
|
c->slt(a3, a2, a3); // slt a3, a2, a3
|
|
bc = c->sgpr64(a3) != 0; // bne a3, r0, L32
|
|
// nop // sll r0, r0, 0
|
|
if (bc) {goto block_1;} // branch non-likely
|
|
|
|
c->mov64(v1, s7); // or v1, s7, r0
|
|
c->mov64(v1, s7); // or v1, s7, r0
|
|
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
|
//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() {
|
|
gLinkedFunctionTable.reg("(method 20 nav-engine)", execute, 0);
|
|
}
|
|
|
|
} // namespace method_20_nav_engine
|
|
} // namespace Mips2C
|
|
|
|
//--------------------------MIPS2C---------------------
|
|
// clang-format off
|
|
#include "game/mips2c/mips2c_private.h"
|
|
#include "game/kernel/jak3/kscheme.h"
|
|
using ::jak3::intern_from_c;
|
|
namespace Mips2C::jak3 {
|
|
namespace method_18_nav_engine {
|
|
struct Cache {
|
|
void* fake_scratchpad_data; // *fake-scratchpad-data*
|
|
} cache;
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
// bool bc = false;
|
|
c->lwu(a2, 0, a1); // lwu a2, 0(a1)
|
|
c->lwu(v1, 4, a1); // lwu v1, 4(a1)
|
|
c->lwu(a0, 8, a1); // lwu a0, 8(a1)
|
|
c->lui(a1, 4096); // lui a1, 4096
|
|
c->ori(a1, a1, 53248); // ori a1, a1, 53248
|
|
c->addiu(a3, r0, 0); // addiu a3, r0, 0
|
|
|
|
// block_1:
|
|
// c->lw(a3, 0, a1); // lw a3, 0(a1)
|
|
// c->andi(a3, a3, 256); // andi a3, a3, 256
|
|
// // nop // sll r0, r0, 0
|
|
// // nop // sll r0, r0, 0
|
|
// // nop // sll r0, r0, 0
|
|
// // nop // sll r0, r0, 0
|
|
// bc = c->sgpr64(a3) != 0; // bne a3, r0, L43
|
|
// // nop // sll r0, r0, 0
|
|
// if (bc) {goto block_1;} // branch non-likely
|
|
|
|
// Unknown instr: sync.l
|
|
c->lui(a3, 4095); // lui a3, 4095
|
|
c->ori(a3, a3, 65535); // ori a3, a3, 65535
|
|
c->and_(a2, a3, a2); // and a2, a3, a2
|
|
// c->sw(a2, 16, a1); // sw a2, 16(a1)
|
|
u32 madr = c->sgpr64(a2);
|
|
c->lui(a2, 4095); // lui a2, 4095
|
|
c->ori(a2, a2, 65535); // ori a2, a2, 65535
|
|
c->and_(v1, a2, v1); // and v1, a2, v1
|
|
// c->sw(v1, 128, a1); // sw v1, 128(a1)
|
|
u32 sadr = c->sgpr64(v1);
|
|
// c->sw(a0, 32, a1); // sw a0, 32(a1)
|
|
u32 qwc = c->sgpr64(a0);
|
|
// Unknown instr: sync.l
|
|
c->addiu(v1, r0, 256); // addiu v1, r0, 256
|
|
// c->sw(v1, 0, a1); // sw v1, 0(a1)
|
|
spad_from_dma(cache.fake_scratchpad_data, madr, sadr, qwc);
|
|
// Unknown instr: sync.l
|
|
c->gprs[v1].du64[0] = 0; // or v1, r0, r0
|
|
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
|
//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() {
|
|
gLinkedFunctionTable.reg("(method 18 nav-engine)", execute, 0);
|
|
cache.fake_scratchpad_data = intern_from_c(-1, 0, "*fake-scratchpad-data*").c();
|
|
}
|
|
|
|
} // namespace method_18_nav_engine
|
|
} // namespace Mips2C
|
|
|
|
//--------------------------MIPS2C---------------------
|
|
// clang-format off
|
|
#include "game/mips2c/mips2c_private.h"
|
|
#include "game/kernel/jak3/kscheme.h"
|
|
using ::jak3::intern_from_c;
|
|
namespace Mips2C::jak3 {
|
|
namespace method_17_nav_engine {
|
|
struct Cache {
|
|
void* fake_scratchpad_data; // *fake-scratchpad-data*
|
|
} cache;
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
c->lwu(v1, 4, a1); // lwu v1, 4(a1)
|
|
c->lwu(a2, 0, a1); // lwu a2, 0(a1)
|
|
c->lwu(a0, 8, a1); // lwu a0, 8(a1)
|
|
c->lui(a1, 4096); // lui a1, 4096
|
|
c->ori(a1, a1, 54272); // ori a1, a1, 54272
|
|
c->addiu(a3, r0, 0); // addiu a3, r0, 0
|
|
|
|
// block_1:
|
|
// c->lw(a3, 0, a1); // lw a3, 0(a1)
|
|
// c->andi(a3, a3, 256); // andi a3, a3, 256
|
|
// // nop // sll r0, r0, 0
|
|
// // nop // sll r0, r0, 0
|
|
// // nop // sll r0, r0, 0
|
|
// // nop // sll r0, r0, 0
|
|
// bc = c->sgpr64(a3) != 0; // bne a3, r0, L45
|
|
// // nop // sll r0, r0, 0
|
|
// if (bc) {goto block_1;} // branch non-likely
|
|
|
|
// Unknown instr: sync.l
|
|
c->lui(a3, 4095); // lui a3, 4095
|
|
c->ori(a3, a3, 65535); // ori a3, a3, 65535
|
|
c->and_(a2, a3, a2); // and a2, a3, a2
|
|
// c->sw(a2, 16, a1); // sw a2, 16(a1)
|
|
u32 madr = c->sgpr64(a2);
|
|
c->lui(a2, 4095); // lui a2, 4095
|
|
c->ori(a2, a2, 65535); // ori a2, a2, 65535
|
|
c->and_(v1, a2, v1); // and v1, a2, v1
|
|
// c->sw(v1, 128, a1); // sw v1, 128(a1)
|
|
u32 sadr = c->sgpr64(v1);
|
|
// c->sw(a0, 32, a1); // sw a0, 32(a1)
|
|
u32 qwc = c->sgpr64(a0);
|
|
// Unknown instr: sync.l
|
|
c->addiu(v1, r0, 256); // addiu v1, r0, 256
|
|
// c->sw(v1, 0, a1); // sw v1, 0(a1)
|
|
spad_to_dma(cache.fake_scratchpad_data, madr, sadr, qwc);
|
|
// Unknown instr: sync.l
|
|
c->gprs[v1].du64[0] = 0; // or v1, r0, r0
|
|
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
|
//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() {
|
|
gLinkedFunctionTable.reg("(method 17 nav-engine)", execute, 0);
|
|
cache.fake_scratchpad_data = intern_from_c(-1, 0, "*fake-scratchpad-data*").c();
|
|
}
|
|
|
|
} // namespace method_17_nav_engine
|
|
} // namespace Mips2C
|
|
|
|
//--------------------------MIPS2C---------------------
|
|
// clang-format off
|
|
#include "game/mips2c/mips2c_private.h"
|
|
#include "game/kernel/jak3/kscheme.h"
|
|
using ::jak3::intern_from_c;
|
|
namespace Mips2C::jak3 {
|
|
namespace nav_state_patch_pointers {
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
c->lw(v1, 16, a0); // lw v1, 16(a0)
|
|
c->daddu(a2, v1, a1); // daddu a2, v1, a1
|
|
c->xor_(a3, v1, s7); // xor a3, v1, s7
|
|
c->sltiu(a3, a3, 1); // sltiu a3, a3, 1
|
|
c->movz(v1, a2, a3); // movz v1, a2, a3
|
|
c->sw(v1, 16, a0); // sw v1, 16(a0)
|
|
c->lw(v1, 28, a0); // lw v1, 28(a0)
|
|
c->daddu(a2, v1, a1); // daddu a2, v1, a1
|
|
c->xor_(a3, v1, s7); // xor a3, v1, s7
|
|
c->sltiu(a3, a3, 1); // sltiu a3, a3, 1
|
|
c->movz(v1, a2, a3); // movz v1, a2, a3
|
|
c->sw(v1, 28, a0); // sw v1, 28(a0)
|
|
c->lw(v1, 24, a0); // lw v1, 24(a0)
|
|
c->daddu(a2, v1, a1); // daddu a2, v1, a1
|
|
c->xor_(a3, v1, s7); // xor a3, v1, s7
|
|
c->sltiu(a3, a3, 1); // sltiu a3, a3, 1
|
|
c->movz(v1, a2, a3); // movz v1, a2, a3
|
|
c->sw(v1, 24, a0); // sw v1, 24(a0)
|
|
c->lw(v1, 20, a0); // lw v1, 20(a0)
|
|
c->daddu(a1, v1, a1); // daddu a1, v1, a1
|
|
c->xor_(a2, v1, s7); // xor a2, v1, s7
|
|
c->sltiu(a2, a2, 1); // sltiu a2, a2, 1
|
|
c->movz(v1, a1, a2); // movz v1, a1, a2
|
|
c->sw(v1, 20, a0); // sw v1, 20(a0)
|
|
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
|
//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
|
|
end_of_function:
|
|
return c->gprs[v0].du64[0];
|
|
}
|
|
|
|
void link() {
|
|
gLinkedFunctionTable.reg("nav-state-patch-pointers", execute, 0);
|
|
}
|
|
|
|
} // namespace nav_state_patch_pointers
|
|
} // namespace Mips2C
|
|
|
|
//--------------------------MIPS2C---------------------
|
|
// clang-format off
|
|
#include "game/mips2c/mips2c_private.h"
|
|
#include "game/kernel/jak3/kscheme.h"
|
|
using ::jak3::intern_from_c;
|
|
namespace Mips2C::jak3 {
|
|
namespace nav_dma_send_from_spr_no_flush {
|
|
struct Cache {
|
|
void* fake_scratchpad_data; // *fake-scratchpad-data*
|
|
} cache;
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
c->lui(v1, 4096); // lui v1, 4096
|
|
c->ori(v1, v1, 53248); // ori v1, v1, 53248
|
|
c->addiu(a3, r0, 0); // addiu a3, r0, 0
|
|
|
|
// block_1:
|
|
// c->lw(a3, 0, v1); // lw a3, 0(v1)
|
|
// c->andi(a3, a3, 256); // andi a3, a3, 256
|
|
// // nop // sll r0, r0, 0
|
|
// // nop // sll r0, r0, 0
|
|
// // nop // sll r0, r0, 0
|
|
// // nop // sll r0, r0, 0
|
|
// bc = c->sgpr64(a3) != 0; // bne a3, r0, L49
|
|
// // nop // sll r0, r0, 0
|
|
// if (bc) {goto block_1;} // branch non-likely
|
|
|
|
// Unknown instr: sync.l
|
|
c->lui(a3, 4095); // lui a3, 4095
|
|
c->ori(a3, a3, 65535); // ori a3, a3, 65535
|
|
c->and_(a0, a3, a0); // and a0, a3, a0
|
|
// c->sw(a0, 16, v1); // sw a0, 16(v1)
|
|
u32 madr = c->sgpr64(a0);
|
|
c->lui(a0, 4095); // lui a0, 4095
|
|
c->ori(a0, a0, 65535); // ori a0, a0, 65535
|
|
c->and_(a0, a0, a1); // and a0, a0, a1
|
|
// c->sw(a0, 128, v1); // sw a0, 128(v1)
|
|
u32 sadr = c->sgpr64(a0);
|
|
// c->sw(a2, 32, v1); // sw a2, 32(v1)
|
|
u32 qwc = c->sgpr64(a2);
|
|
// Unknown instr: sync.l
|
|
c->addiu(a0, r0, 256); // addiu a0, r0, 256
|
|
// c->sw(a0, 0, v1); // sw a0, 0(v1)
|
|
spad_from_dma(cache.fake_scratchpad_data, madr, sadr, qwc);
|
|
// Unknown instr: sync.l
|
|
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
|
//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();
|
|
gLinkedFunctionTable.reg("nav-dma-send-from-spr-no-flush", execute, 0);
|
|
}
|
|
|
|
} // namespace nav_dma_send_from_spr_no_flush
|
|
} // namespace Mips2C
|
|
|
|
//--------------------------MIPS2C---------------------
|
|
// clang-format off
|
|
#include "game/mips2c/mips2c_private.h"
|
|
#include "game/kernel/jak3/kscheme.h"
|
|
using ::jak3::intern_from_c;
|
|
namespace Mips2C::jak3 {
|
|
namespace nav_dma_send_to_spr_no_flush {
|
|
struct Cache {
|
|
void* fake_scratchpad_data; // *fake-scratchpad-data*
|
|
} cache;
|
|
u64 execute(void* ctxt) {
|
|
auto* c = (ExecutionContext*)ctxt;
|
|
c->lui(v1, 4096); // lui v1, 4096
|
|
c->ori(v1, v1, 54272); // ori v1, v1, 54272
|
|
c->addiu(a3, r0, 0); // addiu a3, r0, 0
|
|
|
|
// block_1:
|
|
// c->lw(a3, 0, v1); // lw a3, 0(v1)
|
|
// c->andi(a3, a3, 256); // andi a3, a3, 256
|
|
// // nop // sll r0, r0, 0
|
|
// // nop // sll r0, r0, 0
|
|
// // nop // sll r0, r0, 0
|
|
// // nop // sll r0, r0, 0
|
|
// bc = c->sgpr64(a3) != 0; // bne a3, r0, L51
|
|
// // nop // sll r0, r0, 0
|
|
// if (bc) {goto block_1;} // branch non-likely
|
|
|
|
// Unknown instr: sync.l
|
|
c->lui(a3, 4095); // lui a3, 4095
|
|
c->ori(a3, a3, 65535); // ori a3, a3, 65535
|
|
c->and_(a1, a3, a1); // and a1, a3, a1
|
|
// c->sw(a1, 16, v1); // sw a1, 16(v1)
|
|
u32 madr = c->sgpr64(a1);
|
|
c->lui(a1, 4095); // lui a1, 4095
|
|
c->ori(a1, a1, 65535); // ori a1, a1, 65535
|
|
c->and_(a0, a1, a0); // and a0, a1, a0
|
|
// c->sw(a0, 128, v1); // sw a0, 128(v1)
|
|
u32 sadr = c->sgpr64(a0);
|
|
// c->sw(a2, 32, v1); // sw a2, 32(v1)
|
|
u32 qwc = c->sgpr64(a2);
|
|
// Unknown instr: sync.l
|
|
c->addiu(a0, r0, 256); // addiu a0, r0, 256
|
|
// c->sw(a0, 0, v1); // sw a0, 0(v1)
|
|
spad_to_dma(cache.fake_scratchpad_data, madr, sadr, qwc);
|
|
// Unknown instr: sync.l
|
|
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
|
//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();
|
|
gLinkedFunctionTable.reg("nav-dma-send-to-spr-no-flush", execute, 0);
|
|
}
|
|
|
|
} // namespace nav_dma_send_to_spr_no_flush
|
|
} // namespace Mips2C
|