1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2024-11-14 21:40:03 +00:00

[ntsc-1.2] Match N64 libultra (#2081)

* Match N64 libultra

* INITIALIZE_FUNC -> OSINITIALIZE_FUNC

* Document osGetIntMask

* Refer readers of osGetIntMask to osSetIntMask comment

* Whitelist new static functions in disasm unksyms check
This commit is contained in:
cadmic 2024-08-28 18:30:36 -07:00 committed by GitHub
parent 6e8b820184
commit 7079005c83
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
31 changed files with 344 additions and 42 deletions

View file

@ -451,6 +451,9 @@ ifeq ($(PLATFORM),N64)
$(BUILD_DIR)/src/code/z_rumble.o: CFLAGS += -DNO_SQRTF_INTRINSIC
endif
$(BUILD_DIR)/src/code/jpegutils.o: CC := $(CC_OLD)
$(BUILD_DIR)/src/code/jpegdecoder.o: CC := $(CC_OLD)
ifeq ($(DEBUG),1)
$(BUILD_DIR)/src/libc/%.o: OPTFLAGS := -g
else
@ -470,28 +473,57 @@ endif
$(BUILD_DIR)/src/audio/sfx.o: CFLAGS += -use_readwrite_const
$(BUILD_DIR)/src/audio/sequence.o: CFLAGS += -use_readwrite_const
$(BUILD_DIR)/src/libultra/%.o: CC := $(CC_OLD)
$(BUILD_DIR)/src/libultra/libc/ll.o: OPTFLAGS := -O1
$(BUILD_DIR)/src/libultra/libc/ll.o: MIPS_VERSION := -mips3 -32
$(BUILD_DIR)/src/libultra/libc/llcvt.o: OPTFLAGS := -O1
$(BUILD_DIR)/src/libultra/libc/llcvt.o: MIPS_VERSION := -mips3 -32
ifeq ($(PLATFORM),N64)
$(BUILD_DIR)/src/libultra/gu/%.o: OPTFLAGS := -O3
$(BUILD_DIR)/src/libultra/io/%.o: OPTFLAGS := -O1
$(BUILD_DIR)/src/libultra/libc/%.o: OPTFLAGS := -O3
$(BUILD_DIR)/src/libultra/os/%.o: OPTFLAGS := -O1
$(BUILD_DIR)/src/libultra/io/aisetfreq.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/cartrominit.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/contpfs.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/contramread.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/contramwrite.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/contreaddata.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/crc.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/devmgr.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/epiread.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/epiwrite.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/epirawdma.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/epirawread.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/epirawwrite.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/motor.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/pfsgetstatus.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/pfsselectbank.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/pimgr.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/pirawdma.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/sirawdma.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/sirawread.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/sirawwrite.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/sprawdma.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/vimgr.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/visetspecial.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/viswapcontext.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/gu/lookat.o: CFLAGS += -DNO_SQRTF_INTRINSIC
$(BUILD_DIR)/src/libultra/gu/lookathil.o: CFLAGS += -DNO_SQRTF_INTRINSIC
$(BUILD_DIR)/src/libultra/gu/normalize.o: CFLAGS += -DNO_SQRTF_INTRINSIC
else
$(BUILD_DIR)/src/libultra/gu/%.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/io/%.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/libc/%.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/rmon/%.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/gu/%.o: OPTFLAGS := -O2
$(BUILD_DIR)/src/libultra/os/%.o: OPTFLAGS := -O1
endif
$(BUILD_DIR)/assets/misc/z_select_static/%.o: GBI_DEFINES := -DF3DEX_GBI
$(BUILD_DIR)/src/libultra/gu/%.o: CC := $(CC_OLD)
$(BUILD_DIR)/src/libultra/io/%.o: CC := $(CC_OLD)
$(BUILD_DIR)/src/libultra/libc/%.o: CC := $(CC_OLD)
$(BUILD_DIR)/src/libultra/os/%.o: CC := $(CC_OLD)
$(BUILD_DIR)/src/libultra/rmon/%.o: CC := $(CC_OLD)
$(BUILD_DIR)/src/code/jpegutils.o: CC := $(CC_OLD)
$(BUILD_DIR)/src/code/jpegdecoder.o: CC := $(CC_OLD)
# For using asm_processor on some files:
#$(BUILD_DIR)/.../%.o: CC := $(PYTHON) tools/asm_processor/build.py $(CC) -- $(AS) $(ASFLAGS) --

View file

@ -1677,7 +1677,7 @@ s32 __osCheckPackId(OSPfs* pfs, __OSPackId* check);
s32 __osGetId(OSPfs* pfs);
s32 __osCheckId(OSPfs* pfs);
s32 __osPfsRWInode(OSPfs* pfs, __OSInode* inode, u8 flag, u8 bank);
void guMtxL2F(MtxF* m1, Mtx* m2);
void guMtxL2F(f32 mf[4][4], Mtx* m);
s32 osPfsFindFile(OSPfs* pfs, u16 companyCode, u32 gameCode, u8* gameName, u8* extName, s32* fileNo);
s32 osAfterPreNMI(void);
s32 osContStartQuery(OSMesgQueue* mq);
@ -1728,7 +1728,7 @@ u32 __osSpGetStatus(void);
void __osSpSetStatus(u32 status);
void osWritebackDCacheAll(void);
OSThread* __osGetCurrFaultedThread(void);
void guMtxF2L(MtxF* m1, Mtx* m2);
void guMtxF2L(f32 mf[4][4], Mtx* m);
// ? __d_to_ll(?);
// ? __f_to_ll(?);
// ? __d_to_ull(?);

View file

@ -5,6 +5,9 @@
#define GU_PI 3.1415926
#define FTOFIX32(x) (s32)((x) * (f32)0x00010000)
#define FIX32TOF(x) ((f32)(x) * (1.0f / (f32)0x00010000))
#define ROUND(x) (s32)(((x) >= 0.0) ? ((x) + 0.5) : ((x) - 0.5))
typedef union du {

29
spec
View file

@ -589,7 +589,14 @@ beginseg
#if OOT_DEBUG
include "$(BUILD_DIR)/src/libultra/io/pfsfreeblocks.o"
#endif
#if PLATFORM_N64
include "$(BUILD_DIR)/src/libultra/os/getintmask.o"
#endif
#if PLATFORM_N64
include "$(BUILD_DIR)/src/libultra/gu/scale.o"
#else
include "$(BUILD_DIR)/src/libultra/mgu/scale.o"
#endif
include "$(BUILD_DIR)/src/libultra/gu/sinf.o"
include "$(BUILD_DIR)/src/libultra/gu/sins.o"
include "$(BUILD_DIR)/src/libultra/io/sptask.o"
@ -605,7 +612,12 @@ beginseg
include "$(BUILD_DIR)/src/libultra/io/pfsreadwritefile.o"
include "$(BUILD_DIR)/src/libultra/io/pfsgetstatus.o"
#endif
#if PLATFORM_N64
include "$(BUILD_DIR)/src/libultra/gu/mtxutil.o"
#endif
#if !PLATFORM_N64
include "$(BUILD_DIR)/src/libultra/mgu/mtxidentf.o"
#endif
include "$(BUILD_DIR)/src/libultra/gu/lookat.o"
#if OOT_DEBUG
include "$(BUILD_DIR)/src/libultra/io/pfsallocatefile.o"
@ -613,7 +625,9 @@ beginseg
include "$(BUILD_DIR)/src/libultra/os/stoptimer.o"
#if OOT_DEBUG
include "$(BUILD_DIR)/src/libultra/io/contpfs.o"
#if !PLATFORM_N64
include "$(BUILD_DIR)/src/libultra/mgu/mtxl2f.o"
#endif
include "$(BUILD_DIR)/src/libultra/io/pfsfindfile.o"
#endif
include "$(BUILD_DIR)/src/libultra/gu/sqrtf.o"
@ -627,13 +641,19 @@ beginseg
include "$(BUILD_DIR)/src/libultra/libc/string.o"
#endif
include "$(BUILD_DIR)/src/libultra/io/sp.o"
#if !PLATFORM_N64
include "$(BUILD_DIR)/src/libultra/mgu/mtxident.o"
#endif
include "$(BUILD_DIR)/src/libultra/gu/position.o"
include "$(BUILD_DIR)/src/libultra/io/sptaskyielded.o"
include "$(BUILD_DIR)/src/libultra/gu/rotate.o"
include "$(BUILD_DIR)/src/libultra/io/aisetfreq.o"
include "$(BUILD_DIR)/src/libultra/os/getactivequeue.o"
#if PLATFORM_N64
include "$(BUILD_DIR)/src/libultra/gu/normalize.o"
#else
include "$(BUILD_DIR)/src/libultra/mgu/normalize.o"
#endif
include "$(BUILD_DIR)/src/libultra/io/dpgetstat.o"
include "$(BUILD_DIR)/src/libultra/io/dpsetstat.o"
#if OOT_DEBUG
@ -643,6 +663,9 @@ beginseg
include "$(BUILD_DIR)/src/libultra/gu/cosf.o"
include "$(BUILD_DIR)/src/libultra/gu/libm_vals.o"
include "$(BUILD_DIR)/src/libultra/gu/coss.o"
#if PLATFORM_N64
include "$(BUILD_DIR)/src/libultra/os/settime.o"
#endif
include "$(BUILD_DIR)/src/libultra/io/visetevent.o"
#if OOT_DEBUG
include "$(BUILD_DIR)/src/libultra/io/pfsisplug.o"
@ -656,7 +679,11 @@ beginseg
include "$(BUILD_DIR)/src/libultra/io/pfschecker.o"
#endif
include "$(BUILD_DIR)/src/libultra/io/aigetlen.o"
#if PLATFORM_N64
include "$(BUILD_DIR)/src/libultra/gu/translate.o"
#else
include "$(BUILD_DIR)/src/libultra/mgu/translate.o"
#endif
include "$(BUILD_DIR)/src/libultra/io/contramwrite.o"
#if !OOT_DEBUG
include "$(BUILD_DIR)/src/libultra/io/vimodefpallan1.o"
@ -678,7 +705,9 @@ beginseg
include "$(BUILD_DIR)/src/libultra/io/spsetstat.o"
include "$(BUILD_DIR)/src/libultra/os/writebackdcacheall.o"
include "$(BUILD_DIR)/src/libultra/os/getcurrfaultedthread.o"
#if !PLATFORM_N64
include "$(BUILD_DIR)/src/libultra/mgu/mtxf2l.o"
#endif
include "$(BUILD_DIR)/src/libultra/libc/llcvt.o"
include "$(BUILD_DIR)/src/libultra/io/vigetcurrframebuf.o"
include "$(BUILD_DIR)/src/libultra/io/spsetpc.o"

View file

@ -20,5 +20,5 @@ void MtxConv_F2L(Mtx* m1, MtxF* m2) {
void MtxConv_L2F(MtxF* m1, Mtx* m2) {
LOG_UTILS_CHECK_NULL_POINTER("m1", m1, "../mtxuty-cvt.c", 55);
LOG_UTILS_CHECK_NULL_POINTER("m2", m2, "../mtxuty-cvt.c", 56);
guMtxL2F(m1, m2);
guMtxL2F(m1->mf, m2);
}

View file

@ -1020,7 +1020,7 @@ void Matrix_SetTranslateUniformScaleMtx(Mtx* mtx, f32 scale, f32 translateX, f32
MtxF mf;
Matrix_SetTranslateUniformScaleMtxF(&mf, scale, translateX, translateY, translateZ);
guMtxF2L(&mf, mtx);
guMtxF2L(mf.mf, mtx);
}
void Matrix_SetTranslateUniformScaleMtx2(Mtx* mtx, f32 scale, f32 translateX, f32 translateY, f32 translateZ) {

View file

@ -61,5 +61,5 @@ void guLookAt(Mtx* m, f32 xEye, f32 yEye, f32 zEye, f32 xAt, f32 yAt, f32 zAt, f
guLookAtF(mf, xEye, yEye, zEye, xAt, yAt, zAt, xUp, yUp, zUp);
guMtxF2L((MtxF*)mf, m);
guMtxF2L(mf, m);
}

View file

@ -157,5 +157,5 @@ void guLookAtHilite(Mtx* m, LookAt* l, Hilite* h, f32 xEye, f32 yEye, f32 zEye,
guLookAtHiliteF(mf, l, h, xEye, yEye, zEye, xAt, yAt, zAt, xUp, yUp, zUp, xl1, yl1, zl1, xl2, yl2, zl2, hiliteWidth,
hiliteHeight);
guMtxF2L((MtxF*)mf, m);
guMtxF2L(mf, m);
}

View file

@ -1 +1,63 @@
#include "global.h"
void guMtxF2L(f32 mf[4][4], Mtx* m) {
s32 i, j;
s32 e1, e2;
s32 *ai, *af;
ai = (s32*)&m->m[0][0];
af = (s32*)&m->m[2][0];
for (i = 0; i < 4; i++) {
for (j = 0; j < 2; j++) {
e1 = FTOFIX32(mf[i][j * 2]);
e2 = FTOFIX32(mf[i][j * 2 + 1]);
*(ai++) = (e1 & 0xFFFF0000) | ((e2 >> 16) & 0xFFFF);
*(af++) = ((e1 << 16) & 0xFFFF0000) | (e2 & 0xFFFF);
}
}
}
void guMtxL2F(f32 mf[4][4], Mtx* m) {
s32 i, j;
u32 e1, e2;
u32 *ai, *af;
s32 q1, q2;
ai = (u32*)&m->m[0][0];
af = (u32*)&m->m[2][0];
for (i = 0; i < 4; i++) {
for (j = 0; j < 2; j++) {
e1 = (*ai & 0xFFFF0000) | ((*af >> 16) & 0xFFFF);
e2 = ((*(ai++) << 16) & 0xFFFF0000) | (*(af++) & 0xFFFF);
q1 = *((s32*)&e1);
q2 = *((s32*)&e2);
mf[i][j * 2] = FIX32TOF(q1);
mf[i][j * 2 + 1] = FIX32TOF(q2);
}
}
}
void guMtxIdentF(f32 mf[4][4]) {
s32 i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (i == j) {
mf[i][j] = 1.0;
} else {
mf[i][j] = 0.0;
}
}
}
}
void guMtxIdent(Mtx* m) {
f32 mf[4][4];
guMtxIdentF(mf);
guMtxF2L(mf, m);
}

View file

@ -0,0 +1,9 @@
#include "global.h"
void guNormalize(f32* x, f32* y, f32* z) {
f32 m = 1 / sqrtf(SQ(*x) + SQ(*y) + SQ(*z));
*x *= m;
*y *= m;
*z *= m;
}

View file

@ -25,5 +25,5 @@ void guOrtho(Mtx* mtx, f32 left, f32 right, f32 bottom, f32 top, f32 near, f32 f
guOrthoF(mf, left, right, bottom, top, near, far, scale);
guMtxF2L((MtxF*)mf, mtx);
guMtxF2L(mf, mtx);
}

View file

@ -38,5 +38,6 @@ void guPerspective(Mtx* m, u16* perspNorm, f32 fovy, f32 aspect, f32 near, f32 f
f32 mf[4][4];
guPerspectiveF(mf, perspNorm, fovy, aspect, near, far, scale);
guMtxF2L((MtxF*)mf, m);
guMtxF2L(mf, m);
}

View file

@ -50,5 +50,5 @@ void guPosition(Mtx* m, f32 rot, f32 pitch, f32 yaw, f32 scale, f32 x, f32 y, f3
guPositionF(mf, rot, pitch, yaw, scale, x, y, z);
guMtxF2L((MtxF*)mf, m);
guMtxF2L(mf, m);
}

View file

@ -8,9 +8,11 @@ void guRotateF(f32 m[4][4], f32 a, f32 x, f32 y, f32 z) {
f32 bc;
f32 ca;
f32 t;
#if !PLATFORM_N64
f32 xs;
f32 ys;
f32 zs;
#endif
guNormalize(&x, &y, &z);
@ -25,9 +27,15 @@ void guRotateF(f32 m[4][4], f32 a, f32 x, f32 y, f32 z) {
guMtxIdentF(m);
#if PLATFORM_N64
#define xs (x * sine)
#define ys (y * sine)
#define zs (z * sine)
#else
xs = x * sine;
ys = y * sine;
zs = z * sine;
#endif
t = x * x;
m[0][0] = (1 - t) * cosine + t;
@ -47,5 +55,6 @@ void guRotate(Mtx* m, f32 a, f32 x, f32 y, f32 z) {
f32 mf[4][4];
guRotateF(mf, a, x, y, z);
guMtxF2L((MtxF*)mf, m);
guMtxF2L(mf, m);
}

18
src/libultra/gu/scale.c Normal file
View file

@ -0,0 +1,18 @@
#include "global.h"
void guScaleF(f32 m[4][4], f32 x, f32 y, f32 z) {
guMtxIdentF(m);
m[0][0] = x;
m[1][1] = y;
m[2][2] = z;
m[3][3] = 1;
}
void guScale(Mtx* m, f32 x, f32 y, f32 z) {
f32 mf[4][4];
guScaleF(mf, x, y, z);
guMtxF2L(mf, m);
}

View file

@ -0,0 +1,17 @@
#include "global.h"
void guTranslateF(f32 m[4][4], f32 x, f32 y, f32 z) {
guMtxIdentF(m);
m[3][0] = x;
m[3][1] = y;
m[3][2] = z;
}
void guTranslate(Mtx* m, f32 x, f32 y, f32 z) {
f32 mf[4][4];
guTranslateF(mf, x, y, z);
guMtxF2L(mf, m);
}

View file

@ -7,6 +7,8 @@
* direct SI devices.
*/
s32 osContSetCh(u8 ch) {
s32 ret = 0;
__osSiGetAccess();
if (ch > MAXCONTROLLERS) {
@ -17,5 +19,5 @@ s32 osContSetCh(u8 ch) {
__osContLastCmd = CONT_CMD_END;
__osSiRelAccess();
return 0;
return ret;
}

View file

@ -2,7 +2,7 @@
#include "ultra64/internal.h"
s32 osEPiStartDma(OSPiHandle* handle, OSIoMesg* mb, s32 direction) {
s32 ret;
register s32 ret;
if (!__osPiDevMgr.active) {
return -1;

View file

@ -1,8 +1,8 @@
#include "global.h"
u32 osSpTaskYielded(OSTask* task) {
u32 ret;
u32 status = __osSpGetStatus();
u32 ret;
if (status & SP_STATUS_YIELDED) {
ret = OS_TASK_YIELDED;

View file

@ -4,8 +4,8 @@
#define BUFF_LEN 0x20
short _Ldunscale(short*, _Pft*);
void _Genld(_Pft*, char, char*, short, short);
static short _Ldunscale(short*, _Pft*);
static void _Genld(_Pft*, char, char*, short, short);
static const double pows[] = { 10e0L, 10e1L, 10e3L, 10e7L, 10e15L, 10e31L, 10e63L, 10e127L, 10e255L };
@ -156,7 +156,7 @@ void _Ldtob(_Pft* args, char code) {
_Genld((_Pft*)args, code, ptr, nsig, exp);
}
short _Ldunscale(short* pex, _Pft* px) {
static short _Ldunscale(short* pex, _Pft* px) {
unsigned short* ps = (unsigned short*)px;
short xchar = (ps[_D0] & _DMASK) >> _DOFF;
@ -176,7 +176,7 @@ short _Ldunscale(short* pex, _Pft* px) {
}
}
void _Genld(_Pft* px, char code, char* p, short nsig, short xexp) {
static void _Genld(_Pft* px, char code, char* p, short nsig, short xexp) {
const char point = '.';
if (nsig <= 0) {

View file

@ -40,7 +40,7 @@
char spaces[] = " ";
char zeroes[] = "00000000000000000000000000000000";
void _Putfld(_Pft*, va_list*, char, char*);
static void _Putfld(_Pft*, va_list*, char, char*);
int _Printf(PrintCallback pfn, void* arg, const char* fmt, va_list ap) {
_Pft x;
@ -121,7 +121,7 @@ int _Printf(PrintCallback pfn, void* arg, const char* fmt, va_list ap) {
}
}
void _Putfld(_Pft* px, va_list* pap, char code, char* ac) {
static void _Putfld(_Pft* px, va_list* pap, char code, char* ac) {
px->n0 = px->nz0 = px->n1 = px->nz1 = px->n2 = px->nz2 = 0;
switch (code) {

View file

@ -448,6 +448,13 @@ pi:
andi $t1, $s1, MI_INTR_PI
beqz $t1, dp
nop
#if PLATFORM_N64
// Clear interrupt and mask out pi interrupt
li $t1, PI_STATUS_CLR_INTR
lui $at, %hi(PHYS_TO_K1(PI_STATUS_REG))
andi $s1, $s1, (MI_INTR_SP | MI_INTR_SI | MI_INTR_AI | MI_INTR_VI | MI_INTR_DP)
sw $t1, %lo(PHYS_TO_K1(PI_STATUS_REG))($at)
#else
// Clear interrupt
li $t1, PI_STATUS_CLR_INTR
lui $at, %hi(PHYS_TO_K1(PI_STATUS_REG))
@ -468,6 +475,7 @@ pi:
// If the callback returns non-zero, don't post a pi event message
bnez $v0, skip_pi_mesg
nop
#endif
no_pi_callback:
// Post pi event message
jal send_mesg
@ -847,10 +855,12 @@ LEAF(__osPopThread)
sw $t9, ($a0)
END(__osPopThread)
#if !PLATFORM_N64
LEAF(__osNop)
jr $ra
nop
END(__osNop)
#endif
/**
* void __osDispatchThread(void);

View file

@ -0,0 +1,60 @@
#include "ultra64/asm.h"
#include "ultra64/R4300.h"
#include "ultra64/rcp.h"
#include "ultra64/exception.h"
.set noat
.set noreorder
.section .text
.balign 16
/**
* OSIntMask osGetIntMask(void);
*
* Gets the interrupt enable mask for the current thread.
* Interrupts that are not enabled in the global interrupt mask __OSGlobalIntMask
* are not returned here. The global interrupt mask is OS-internal and is not
* expected to change during runtime.
*
* @bug Some usage of the global interrupt mask is broken both in the
* get/set interrupt mask routines and in the exception handler routines.
* See the comment for osSetIntMask for more details.
*/
LEAF(osGetIntMask)
// Extract interrupt enable bits from current SR
mfc0 $v0, C0_SR
andi $v0, $v0, (SR_IMASK | SR_IE)
// Get value of __OSGlobalIntMask
lui $t0, %hi(__OSGlobalIntMask)
addiu $t0, %lo(__OSGlobalIntMask)
lw $t1, 0($t0)
// Bitwise-OR in the disabled CPU bits of __OSGlobalIntMask
li $at, ~0
xor $t0, $t1, $at
andi $t0, $t0, SR_IMASK
or $v0, $v0, $t0
// Fetch MI_INTR_MASK_REG
lui $t1, %hi(PHYS_TO_K1(MI_INTR_MASK_REG))
lw $t1, %lo(PHYS_TO_K1(MI_INTR_MASK_REG))($t1)
// If there are RCP interrupts masked
beqz $t1, 1f
// Get value of __OSGlobalIntMask
lui $t0, %hi(__OSGlobalIntMask)
addiu $t0, %lo(__OSGlobalIntMask)
lw $t0, 0($t0)
// Bitwise-OR in the disabled RCP bits of __OSGlobalIntMask
srl $t0, $t0, RCP_IMASKSHIFT
li $at, ~0
xor $t0, $t0, $at
andi $t0, $t0, (RCP_IMASK >> RCP_IMASKSHIFT)
or $t1, $t1, $t0
1:
// Shift the RCP bits to not conflict with the CPU bits
sll $t2, $t1, RCP_IMASKSHIFT
// OR the CPU and RCP bits together
or $v0, $v0, $t2
jr $ra
nop
END(osGetIntMask)

View file

@ -16,7 +16,19 @@ OSHWIntr __OSGlobalIntMask = OS_IM_ALL;
u32 __osFinalrom;
void __createSpeedParam(void) {
#if PLATFORM_N64
#define OSINITIALIZE_FUNC osInitialize
#define SPEED_PARAM_FUNC createSpeedParam
static void SPEED_PARAM_FUNC(void);
#else
#define OSINITIALIZE_FUNC __osInitialize_common
#define SPEED_PARAM_FUNC __createSpeedParam
void SPEED_PARAM_FUNC(void) {
__Dom1SpeedParam.type = DEVICE_TYPE_INIT;
__Dom1SpeedParam.latency = IO_READ(PI_BSD_DOM1_LAT_REG);
__Dom1SpeedParam.pulse = IO_READ(PI_BSD_DOM1_PWD_REG);
@ -30,13 +42,20 @@ void __createSpeedParam(void) {
__Dom2SpeedParam.relDuration = IO_READ(PI_BSD_DOM2_RLS_REG);
}
void __osInitialize_common(void) {
#endif
void OSINITIALIZE_FUNC(void) {
u32 pifdata;
#if PLATFORM_N64
u32 clock = 0;
#endif
__osFinalrom = true;
__osSetSR(__osGetSR() | SR_CU1);
__osSetFpcCsr(FPCSR_FS | FPCSR_EV);
#if !PLATFORM_N64
__osSetWatchLo(0x04900000);
#endif
while (__osSiRawReadIo((void*)(PIF_RAM_END - 3), &pifdata)) {
;
@ -52,7 +71,7 @@ void __osInitialize_common(void) {
osWritebackDCache((void*)K0BASE, E_VEC - K0BASE + sizeof(__osExceptionVector));
osInvalICache((void*)K0BASE, E_VEC - K0BASE + sizeof(__osExceptionVector));
__createSpeedParam();
SPEED_PARAM_FUNC();
osUnmapTLBAll();
osMapTLBRdb();
@ -82,5 +101,21 @@ void __osInitialize_common(void) {
IO_WRITE(AI_BITRATE_REG, AI_MAX_BIT_RATE - 1);
}
#if PLATFORM_N64
static void SPEED_PARAM_FUNC(void) {
__Dom1SpeedParam.type = DEVICE_TYPE_INIT;
__Dom1SpeedParam.latency = IO_READ(PI_BSD_DOM1_LAT_REG);
__Dom1SpeedParam.pulse = IO_READ(PI_BSD_DOM1_PWD_REG);
__Dom1SpeedParam.pageSize = IO_READ(PI_BSD_DOM1_PGS_REG);
__Dom1SpeedParam.relDuration = IO_READ(PI_BSD_DOM1_RLS_REG);
__Dom2SpeedParam.type = DEVICE_TYPE_INIT;
__Dom2SpeedParam.latency = IO_READ(PI_BSD_DOM2_LAT_REG);
__Dom2SpeedParam.pulse = IO_READ(PI_BSD_DOM2_PWD_REG);
__Dom2SpeedParam.pageSize = IO_READ(PI_BSD_DOM2_PGS_REG);
__Dom2SpeedParam.relDuration = IO_READ(PI_BSD_DOM2_RLS_REG);
}
#else
void __osInitialize_autodetect(void) {
}
#endif

View file

@ -99,8 +99,8 @@ ENDDATA(__osRcpImTable)
* The returned value is the previous interrupt enable mask so that it can be
* restored later.
*
* @bug Some usage of the global interrupt mask is broken both in here and in the
* exception handler routines.
* @bug Some usage of the global interrupt mask is broken both in the
* get/set interrupt mask routines and in the exception handler routines.
* While a thread is running, the C0_SR interrupt enable bits contain the
* interrupt enable bits for the current thread masked by the global
* interrupt mask. There is an attempt to recover only the original interrupt

View file

@ -1 +1,5 @@
#include "global.h"
void osSetTime(OSTime time) {
__osCurrentTime = time;
}

View file

@ -1,11 +1,13 @@
#include "global.h"
s32 osSetTimer(OSTimer* timer, OSTime countdown, OSTime interval, OSMesgQueue* mq, OSMesg msg) {
UNUSED OSTime time;
OSTime time;
#if !PLATFORM_N64
OSTimer* next;
u32 count;
u32 value;
u32 prevInt;
#endif
timer->next = NULL;
timer->prev = NULL;
@ -19,6 +21,12 @@ s32 osSetTimer(OSTimer* timer, OSTime countdown, OSTime interval, OSMesgQueue* m
timer->mq = mq;
timer->msg = msg;
#if PLATFORM_N64
time = __osInsertTimer(timer);
if (__osTimerList->next == timer) {
__osSetTimerIntr(time);
}
#else
prevInt = __osDisableInt();
if (__osTimerList->next != __osTimerList) {
if (1) {}
@ -38,6 +46,7 @@ s32 osSetTimer(OSTimer* timer, OSTime countdown, OSTime interval, OSMesgQueue* m
__osSetTimerIntr(__osTimerList->next->value);
__osRestoreInt(prevInt);
#endif
return 0;
}

View file

@ -63,9 +63,11 @@ void __osSetTimerIntr(OSTime time) {
OSTime newTime;
u32 prevInt;
#if !PLATFORM_N64
if (time < 468) {
time = 468;
}
#endif
prevInt = __osDisableInt();

View file

@ -19,6 +19,7 @@ AudioDebug_ProcessInput
func_800FF334
n64dd_SetDiskVersion
sJpegTask _n64ddSegmentRomStart _n64ddSegmentRomEnd _n64ddSegmentStart _string_n64dd_c
_Putfld _Ldunscale _Genld
""".split()

View file

@ -138,7 +138,7 @@ BD970,800CF050,src/code/printutils
BD9D0,800CF0B0,src/code/jpegutils
BDEE0,800CF5C0,src/code/jpegdecoder
BE4D0,800CFBB0,src/libultra/os/getintmask
BE530,800CFC10,src/libultra/mgu/scale
BE530,800CFC10,src/libultra/gu/scale
BE5D0,800CFCB0,src/libultra/gu/sinf
BE790,800CFE70,src/libultra/gu/sins
BE800,800CFEE0,src/libultra/io/sptask
@ -165,7 +165,7 @@ C17A0,800D2E80,src/libultra/io/sptaskyielded
C1820,800D2F00,src/libultra/gu/rotate
C1A10,800D30F0,src/libultra/io/aisetfreq
C1B60,800D3240,src/libultra/os/getactivequeue
C1B70,800D3250,src/libultra/mgu/normalize
C1B70,800D3250,src/libultra/gu/normalize
C1C00,800D32E0,src/libultra/io/dpgetstat
C1C10,800D32F0,src/libultra/io/dpsetstat
C1C20,800D3300,src/libultra/gu/ortho
@ -177,7 +177,7 @@ C2020,800D3700,src/libultra/gu/us2dex
C21A0,800D3880,src/libultra/io/pfsselectbank
C2220,800D3900,src/libultra/io/contsetch
C2290,800D3970,src/libultra/io/aigetlen
C22A0,800D3980,src/libultra/mgu/translate
C22A0,800D3980,src/libultra/gu/translate
C2340,800D3A20,src/libultra/io/contramwrite
C2590,800D3C70,src/libultra/io/pfsgetstatus
C27C0,800D3EA0,src/libultra/io/contpfs

1 offset vram .text
138 BD9D0 800CF0B0 src/code/jpegutils
139 BDEE0 800CF5C0 src/code/jpegdecoder
140 BE4D0 800CFBB0 src/libultra/os/getintmask
141 BE530 800CFC10 src/libultra/mgu/scale src/libultra/gu/scale
142 BE5D0 800CFCB0 src/libultra/gu/sinf
143 BE790 800CFE70 src/libultra/gu/sins
144 BE800 800CFEE0 src/libultra/io/sptask
165 C1820 800D2F00 src/libultra/gu/rotate
166 C1A10 800D30F0 src/libultra/io/aisetfreq
167 C1B60 800D3240 src/libultra/os/getactivequeue
168 C1B70 800D3250 src/libultra/mgu/normalize src/libultra/gu/normalize
169 C1C00 800D32E0 src/libultra/io/dpgetstat
170 C1C10 800D32F0 src/libultra/io/dpsetstat
171 C1C20 800D3300 src/libultra/gu/ortho
177 C21A0 800D3880 src/libultra/io/pfsselectbank
178 C2220 800D3900 src/libultra/io/contsetch
179 C2290 800D3970 src/libultra/io/aigetlen
180 C22A0 800D3980 src/libultra/mgu/translate src/libultra/gu/translate
181 C2340 800D3A20 src/libultra/io/contramwrite
182 C2590 800D3C70 src/libultra/io/pfsgetstatus
183 C27C0 800D3EA0 src/libultra/io/contpfs

View file

@ -14,7 +14,6 @@ D_06000000 = 0x06000000;
// boot_main.c
func_80001720 = 0x80001720;
osInitialize = 0x80003230;
// cic6105.c
cic6105ucodeTextStart = 0x80006720;
@ -22,8 +21,8 @@ func_800AE258_unknown = 0x800AE258;
func_800AE1E0_unknown = 0x800AE1E0;
// code_n64dd_800AD410.c
osGetIntMask = 0x800CFBB0;
osSetTime = 0x800D3660;
func_800ADCD8_unknown = 0x800ADCD8;
func_800AE170_unknown = 0x800AE170;
func_801C7740_unknown = 0x801C7740;
func_801C8510_unknown = 0x801C8510;
D_801DA410 = 0x801DA410;