c: osViGetCurrentFrameBuffer

This commit is contained in:
Mittenz
2020-08-19 18:07:32 -05:00
parent eb8876d024
commit da0c0e0421
3 changed files with 106 additions and 36 deletions
@@ -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
+33 -1
View File
@@ -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")
+73 -17
View File
@@ -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;