Files
perfect-dark/src/lib/lib_05e40.c
T
2021-01-24 22:37:24 +10:00

132 lines
4.6 KiB
C

#include <ultra64.h>
#include "constants.h"
#include "game/data/data_000000.h"
#include "game/data/data_0083d0.h"
#include "game/data/data_00e460.h"
#include "game/data/data_0160b0.h"
#include "game/data/data_01a3a0.h"
#include "game/data/data_020df0.h"
#include "game/data/data_02da90.h"
#include "gvars/gvars.h"
#include "lib/lib_05e40.h"
#include "lib/lib_4b170.h"
#include "lib/lib_4b500.h"
#include "lib/lib_4b550.h"
#include "lib/lib_4b5e0.h"
#include "types.h"
#include "libultra_internal.h"
OSTask *_VirtualToPhysicalTask(OSTask *intp);
GLOBAL_ASM(
glabel _VirtualToPhysicalTask
/* 5e40: 27bdffe8 */ addiu $sp,$sp,-24
/* 5e44: afbf0014 */ sw $ra,0x14($sp)
/* 5e48: 3c058009 */ lui $a1,%hi(var80090a70)
/* 5e4c: 24a50a70 */ addiu $a1,$a1,%lo(var80090a70)
/* 5e50: 0c012c5c */ jal func0004b170
/* 5e54: 24060040 */ addiu $a2,$zero,0x40
/* 5e58: 3c048009 */ lui $a0,%hi(var80090a80)
/* 5e5c: 8c840a80 */ lw $a0,%lo(var80090a80)($a0)
/* 5e60: 10800005 */ beqz $a0,.L00005e78
/* 5e64: 00000000 */ nop
/* 5e68: 0c012d20 */ jal osVirtualToPhysical
/* 5e6c: 00000000 */ nop
/* 5e70: 3c018009 */ lui $at,%hi(var80090a80)
/* 5e74: ac220a80 */ sw $v0,%lo(var80090a80)($at)
.L00005e78:
/* 5e78: 3c048009 */ lui $a0,%hi(var80090a88)
/* 5e7c: 8c840a88 */ lw $a0,%lo(var80090a88)($a0)
/* 5e80: 10800005 */ beqz $a0,.L00005e98
/* 5e84: 00000000 */ nop
/* 5e88: 0c012d20 */ jal osVirtualToPhysical
/* 5e8c: 00000000 */ nop
/* 5e90: 3c018009 */ lui $at,%hi(var80090a88)
/* 5e94: ac220a88 */ sw $v0,%lo(var80090a88)($at)
.L00005e98:
/* 5e98: 3c048009 */ lui $a0,%hi(var80090a90)
/* 5e9c: 8c840a90 */ lw $a0,%lo(var80090a90)($a0)
/* 5ea0: 10800005 */ beqz $a0,.L00005eb8
/* 5ea4: 00000000 */ nop
/* 5ea8: 0c012d20 */ jal osVirtualToPhysical
/* 5eac: 00000000 */ nop
/* 5eb0: 3c018009 */ lui $at,%hi(var80090a90)
/* 5eb4: ac220a90 */ sw $v0,%lo(var80090a90)($at)
.L00005eb8:
/* 5eb8: 3c048009 */ lui $a0,%hi(var80090a98)
/* 5ebc: 8c840a98 */ lw $a0,%lo(var80090a98)($a0)
/* 5ec0: 10800005 */ beqz $a0,.L00005ed8
/* 5ec4: 00000000 */ nop
/* 5ec8: 0c012d20 */ jal osVirtualToPhysical
/* 5ecc: 00000000 */ nop
/* 5ed0: 3c018009 */ lui $at,%hi(var80090a98)
/* 5ed4: ac220a98 */ sw $v0,%lo(var80090a98)($at)
.L00005ed8:
/* 5ed8: 3c048009 */ lui $a0,%hi(var80090a9c)
/* 5edc: 8c840a9c */ lw $a0,%lo(var80090a9c)($a0)
/* 5ee0: 10800005 */ beqz $a0,.L00005ef8
/* 5ee4: 00000000 */ nop
/* 5ee8: 0c012d20 */ jal osVirtualToPhysical
/* 5eec: 00000000 */ nop
/* 5ef0: 3c018009 */ lui $at,%hi(var80090a9c)
/* 5ef4: ac220a9c */ sw $v0,%lo(var80090a9c)($at)
.L00005ef8:
/* 5ef8: 3c048009 */ lui $a0,%hi(var80090aa0)
/* 5efc: 8c840aa0 */ lw $a0,%lo(var80090aa0)($a0)
/* 5f00: 10800005 */ beqz $a0,.L00005f18
/* 5f04: 00000000 */ nop
/* 5f08: 0c012d20 */ jal osVirtualToPhysical
/* 5f0c: 00000000 */ nop
/* 5f10: 3c018009 */ lui $at,%hi(var80090aa0)
/* 5f14: ac220aa0 */ sw $v0,%lo(var80090aa0)($at)
.L00005f18:
/* 5f18: 3c048009 */ lui $a0,%hi(var80090aa8)
/* 5f1c: 8c840aa8 */ lw $a0,%lo(var80090aa8)($a0)
/* 5f20: 50800006 */ beqzl $a0,.L00005f3c
/* 5f24: 8fbf0014 */ lw $ra,0x14($sp)
/* 5f28: 0c012d20 */ jal osVirtualToPhysical
/* 5f2c: 00000000 */ nop
/* 5f30: 3c018009 */ lui $at,%hi(var80090aa8)
/* 5f34: ac220aa8 */ sw $v0,%lo(var80090aa8)($at)
/* 5f38: 8fbf0014 */ lw $ra,0x14($sp)
.L00005f3c:
/* 5f3c: 3c028009 */ lui $v0,%hi(var80090a70)
/* 5f40: 24420a70 */ addiu $v0,$v0,%lo(var80090a70)
/* 5f44: 03e00008 */ jr $ra
/* 5f48: 27bd0018 */ addiu $sp,$sp,0x18
);
void osSpTaskLoad(OSTask *intp)
{
OSTask *tp;
tp = _VirtualToPhysicalTask(intp);
if (tp->t.flags & OS_TASK_YIELDED) {
tp->t.ucode_data = tp->t.yield_data_ptr;
tp->t.ucode_data_size = tp->t.yield_data_size;
intp->t.flags &= ~OS_TASK_YIELDED;
if (tp->t.flags & OS_TASK_LOADABLE) {
tp->t.ucode = (u64 *)IO_READ((u32)intp->t.yield_data_ptr + OS_YIELD_DATA_SIZE - 4);
}
}
osWritebackDCache(tp, sizeof(OSTask));
__osSpSetStatus(SP_CLR_YIELD | SP_CLR_YIELDED | SP_CLR_TASKDONE | SP_SET_INTR_BREAK);
while (__osSpSetPc(SP_IMEM_START) == -1);
while (__osSpRawStartDma(1, (SP_IMEM_START - sizeof(*tp)), tp, sizeof(OSTask)) == -1);
while (__osSpDeviceBusy());
while (__osSpRawStartDma(1, SP_IMEM_START, tp->t.ucode_boot, tp->t.ucode_boot_size) == -1);
}
void osSpTaskStartGo(OSTask *tp)
{
while (__osSpDeviceBusy());
__osSpSetStatus(SP_SET_INTR_BREAK | SP_CLR_SSTEP | SP_CLR_BROKE | SP_CLR_HALT);
}