From da0c0e042198d800a87f3a37545f876a6d3a90e8 Mon Sep 17 00:00:00 2001 From: Mittenz Date: Wed, 19 Aug 2020 18:07:32 -0500 Subject: [PATCH] c: osViGetCurrentFrameBuffer --- .../osViGetCurrentFramebuffer.s | 18 ---- lib/src/unknown_0D29F0.c | 34 ++++++- src/unknown_079F50.c | 90 +++++++++++++++---- 3 files changed, 106 insertions(+), 36 deletions(-) delete mode 100644 lib/asm/non_matchings/unknown_0D29F0/osViGetCurrentFramebuffer.s diff --git a/lib/asm/non_matchings/unknown_0D29F0/osViGetCurrentFramebuffer.s b/lib/asm/non_matchings/unknown_0D29F0/osViGetCurrentFramebuffer.s deleted file mode 100644 index 26d7f6b8..00000000 --- a/lib/asm/non_matchings/unknown_0D29F0/osViGetCurrentFramebuffer.s +++ /dev/null @@ -1,18 +0,0 @@ -glabel osViGetCurrentFramebuffer -/* 0D2A70 800D1E70 27BDFFD8 */ addiu $sp, $sp, -0x28 -/* 0D2A74 800D1E74 AFBF001C */ sw $ra, 0x1c($sp) -/* 0D2A78 800D1E78 0C034958 */ jal __osDisableInt -/* 0D2A7C 800D1E7C AFB00018 */ sw $s0, 0x18($sp) -/* 0D2A80 800D1E80 3C0E800E */ lui $t6, %hi(__osViCurr) # $t6, 0x800e -/* 0D2A84 800D1E84 8DCE4870 */ lw $t6, %lo(__osViCurr)($t6) -/* 0D2A88 800D1E88 00408025 */ move $s0, $v0 -/* 0D2A8C 800D1E8C 02002025 */ move $a0, $s0 -/* 0D2A90 800D1E90 8DCF0004 */ lw $t7, 4($t6) -/* 0D2A94 800D1E94 0C034960 */ jal __osRestoreInt -/* 0D2A98 800D1E98 AFAF0020 */ sw $t7, 0x20($sp) -/* 0D2A9C 800D1E9C 8FBF001C */ lw $ra, 0x1c($sp) -/* 0D2AA0 800D1EA0 8FA20020 */ lw $v0, 0x20($sp) -/* 0D2AA4 800D1EA4 8FB00018 */ lw $s0, 0x18($sp) -/* 0D2AA8 800D1EA8 03E00008 */ jr $ra -/* 0D2AAC 800D1EAC 27BD0028 */ addiu $sp, $sp, 0x28 - diff --git a/lib/src/unknown_0D29F0.c b/lib/src/unknown_0D29F0.c index e30fe1b8..484061e8 100644 --- a/lib/src/unknown_0D29F0.c +++ b/lib/src/unknown_0D29F0.c @@ -5,11 +5,43 @@ #include "macros.h" #include "libultra_internal.h" +typedef struct +{ + /* 0x0 */ f32 factor; + /* 0x4 */ u16 offset; + /* 0x8 */ u32 scale; +} __OSViScale; + +typedef struct +{ + /* 0x0 */ u16 state; + /* 0x2 */ u16 retraceCount; + /* 0x4 */ void *framep; + /* 0x8 */ OSViMode *modep; + /* 0xC */ u32 control; + /* 0x10 */ OSMesgQueue *msgq; + /* 0x14 */ OSMesg msg; + /* 0x18 */ __OSViScale x; + /* 0x24 */ __OSViScale y; +} __OSViContext; + extern OSTime __osCurrentTime;//__osCurrentTime extern u32 __osBaseCounter; //__osBaseCounter +extern __OSViContext *__osViCurr; GLOBAL_ASM("lib/asm/non_matchings/unknown_0D29F0/func_800D1DF0.s") -GLOBAL_ASM("lib/asm/non_matchings/unknown_0D29F0/osViGetCurrentFramebuffer.s") + +void *osViGetCurrentFramebuffer(void) +{ + register u32 saveMask; + void *framep; + + saveMask = __osDisableInt(); + framep = __osViCurr->framep; + __osRestoreInt(saveMask); + return framep; +} + GLOBAL_ASM("lib/asm/non_matchings/unknown_0D29F0/osViGetNextFramebuffer.s") GLOBAL_ASM("lib/asm/non_matchings/unknown_0D29F0/_VirtualToPhysicalTask.s") GLOBAL_ASM("lib/asm/non_matchings/unknown_0D29F0/osSpTaskLoad.s") diff --git a/src/unknown_079F50.c b/src/unknown_079F50.c index 0771151b..9306726f 100644 --- a/src/unknown_079F50.c +++ b/src/unknown_079F50.c @@ -9,6 +9,8 @@ #define OS_SC_PRE_NMI_MSG 4 #define OS_SC_MAX_MESGS 8 +#define OS_SC_YIELD 2 + typedef struct { short type; char misc[30]; @@ -147,17 +149,76 @@ GLOBAL_ASM("asm/non_matchings/unknown_079F50/func_8007957C.s") GLOBAL_ASM("asm/non_matchings/unknown_079F50/__scMain.s") GLOBAL_ASM("asm/non_matchings/unknown_079F50/func_80079760.s") GLOBAL_ASM("asm/non_matchings/unknown_079F50/func_80079818.s") + + +#if 1 GLOBAL_ASM("asm/non_matchings/unknown_079F50/func_80079B44.s") +#else +extern f32 D_800DE740; +extern f32 D_800DE744; +extern f32 D_800DE748; +extern f32 D_800DE74C; +extern u32 D_800DE750; +extern f32 D_800E796C; +extern u32 D_80126124; +void func_80079B44(OSSched *sc){ + OSScTask *t, *sp = 0, *dp = 0; + s32 state; + u32 delta; + f32 tmp1; + + //assert(sc->curRSPTask); + t = sc->curRSPTask; + sc->curRSPTask = 0; + + if (t->list.t.type == 2) { + D_80126124 = osGetCount(); + delta = D_80126124 - D_80126120; + tmp1 = (f32) delta; + if(delta < 0){ + tmp1 += 4294967296.0; + } + D_800DE74C = tmp1*60.0f/D_800E796C; + D_800DE744 = D_800DE744 + D_800DE74C; + if(D_800DE740 < D_800DE74C){ + D_800DE740 = D_800DE74C; + } + if(D_800DE750%1000 == 1 || D_800DE750%1000 == 2){ + D_800DE748 = D_800DE744/500.0f; + D_800DE744 = 0.0f; + D_800DE740 = 0.0f; + } + } + if(t->state & 0x10){ + if(func_800D1DF0(&(t->list))){ + t->state |= 0x20; + if ((t->flags & 0x07) == -3) { + + /* push the task back on the list */ + t->next = sc->gfxListHead; + sc->gfxListHead = t; + if (sc->gfxListTail == 0) + sc->gfxListTail = t; + } + } + else{ + t->state &= -3; + } + } + else { + t->state &= -3; + __scTaskComplete(sc, t); + } + state = ((sc->curRSPTask == 0) << 1) | (sc->curRDPTask == 0); + if ( (__scSchedule (sc, &sp, &dp, state)) != state) + __scExec(sc, sp, dp); +} +#endif -/* - * __scHandleRDP is called when an RDP task signals that it has - * finished - */ -void __scHandleRDP(OSSched *sc) -{ +void __scHandleRDP(OSSched *sc){ OSScTask *t, *sp = 0, *dp = 0; s32 state; @@ -174,8 +235,7 @@ void __scHandleRDP(OSSched *sc) } -OSScTask *__scTaskReady(OSScTask *t) -{ +OSScTask *__scTaskReady(OSScTask *t){ if (t) { /* * If there is a pending swap bail out til later (next @@ -194,14 +254,13 @@ OSScTask *__scTaskReady(OSScTask *t) #if 1 GLOBAL_ASM("asm/non_matchings/unknown_079F50/__scTaskComplete.s") #else -s32 __scTaskComplete(OSSched *sc, OSScTask *t) -{ +s32 __scTaskComplete(OSSched *sc, OSScTask *t) { int rv; int firsttime = 1; if ((t->state & 0x03) == 0) { /* none of the needs bits set */ -// assert (t->msgQ); + assert (t->msgQ); if(t->msgQ){ //rv = osSendMesg(t->msgQ, &t->msg, OS_MESG_BLOCK); @@ -231,8 +290,7 @@ s32 __scTaskComplete(OSSched *sc, OSScTask *t) } #endif -void __scAppendList(OSSched *sc, OSScTask *t) -{ +void __scAppendList(OSSched *sc, OSScTask *t) { u32 tmp = t->list.t.type; if (tmp == 2){ if(sc->audioListTail) @@ -254,8 +312,7 @@ void __scAppendList(OSSched *sc, OSScTask *t) t->state = t->flags & 0x03; } -void __scExec(OSSched *sc, OSScTask *sp, OSScTask *dp) -{ +void __scExec(OSSched *sc, OSScTask *sp, OSScTask *dp){ if (sp) { if (sp->list.t.type == M_AUDTASK) { @@ -286,8 +343,7 @@ void __scExec(OSSched *sc, OSScTask *sp, OSScTask *dp) GLOBAL_ASM("asm/non_matchings/unknown_079F50/func_8007A080.s") #else extern OSTime D_80126118; -void func_8007A080(OSSched *sc) -{ +void func_8007A080(OSSched *sc) { if (sc->curRSPTask->list.t.type == M_GFXTASK) { //sc->curRSPTask->state |= OS_SC_YIELD;