mirror of
https://github.com/izzy2lost/Diddy-Kong-Racing.git
synced 2026-06-19 01:16:26 -07:00
Match __scSchedule
This commit is contained in:
@@ -1,146 +0,0 @@
|
||||
.late_rodata
|
||||
glabel jpt_800E7970
|
||||
.word L8007A2A4, L8007A248, L8007A1BC, L8007A2A4, L8007A2A4, L8007A248, L8007A248
|
||||
|
||||
.text
|
||||
glabel __scSchedule
|
||||
/* 07ACD4 8007A0D4 27BDFFD8 */ addiu $sp, $sp, -0x28
|
||||
/* 07ACD8 8007A0D8 AFB10018 */ sw $s1, 0x18($sp)
|
||||
/* 07ACDC 8007A0DC 00808825 */ move $s1, $a0
|
||||
/* 07ACE0 8007A0E0 AFBF001C */ sw $ra, 0x1c($sp)
|
||||
/* 07ACE4 8007A0E4 AFB00014 */ sw $s0, 0x14($sp)
|
||||
/* 07ACE8 8007A0E8 2408FFFD */ li $t0, -3
|
||||
.L8007A0EC:
|
||||
/* 07ACEC 8007A0EC 8E2E0284 */ lw $t6, 0x284($s1)
|
||||
/* 07ACF0 8007A0F0 8E300268 */ lw $s0, 0x268($s1)
|
||||
/* 07ACF4 8007A0F4 8E220264 */ lw $v0, 0x264($s1)
|
||||
/* 07ACF8 8007A0F8 11C00016 */ beqz $t6, .L8007A154
|
||||
/* 07ACFC 8007A0FC 00E01825 */ move $v1, $a3
|
||||
/* 07AD00 8007A100 30EF0002 */ andi $t7, $a3, 2
|
||||
/* 07AD04 8007A104 11E00014 */ beqz $t7, .L8007A158
|
||||
/* 07AD08 8007A108 02002025 */ move $a0, $s0
|
||||
/* 07AD0C 8007A10C 12000008 */ beqz $s0, .L8007A130
|
||||
/* 07AD10 8007A110 00000000 */ nop
|
||||
/* 07AD14 8007A114 8E180008 */ lw $t8, 8($s0)
|
||||
/* 07AD18 8007A118 00E81824 */ and $v1, $a3, $t0
|
||||
/* 07AD1C 8007A11C 33190010 */ andi $t9, $t8, 0x10
|
||||
/* 07AD20 8007A120 13200003 */ beqz $t9, .L8007A130
|
||||
/* 07AD24 8007A124 00000000 */ nop
|
||||
/* 07AD28 8007A128 1000005E */ b .L8007A2A4
|
||||
/* 07AD2C 8007A12C ACB00000 */ sw $s0, ($a1)
|
||||
.L8007A130:
|
||||
/* 07AD30 8007A130 ACA20000 */ sw $v0, ($a1)
|
||||
/* 07AD34 8007A134 8E2A0264 */ lw $t2, 0x264($s1)
|
||||
/* 07AD38 8007A138 AE200284 */ sw $zero, 0x284($s1)
|
||||
/* 07AD3C 8007A13C 8D4B0000 */ lw $t3, ($t2)
|
||||
/* 07AD40 8007A140 00E81824 */ and $v1, $a3, $t0
|
||||
/* 07AD44 8007A144 15600057 */ bnez $t3, .L8007A2A4
|
||||
/* 07AD48 8007A148 AE2B0264 */ sw $t3, 0x264($s1)
|
||||
/* 07AD4C 8007A14C 10000055 */ b .L8007A2A4
|
||||
/* 07AD50 8007A150 AE20026C */ sw $zero, 0x26c($s1)
|
||||
.L8007A154:
|
||||
/* 07AD54 8007A154 02002025 */ move $a0, $s0
|
||||
.L8007A158:
|
||||
/* 07AD58 8007A158 AFA30024 */ sw $v1, 0x24($sp)
|
||||
/* 07AD5C 8007A15C AFA5002C */ sw $a1, 0x2c($sp)
|
||||
/* 07AD60 8007A160 AFA60030 */ sw $a2, 0x30($sp)
|
||||
/* 07AD64 8007A164 0C01E77A */ jal __scTaskReady
|
||||
/* 07AD68 8007A168 AFA70034 */ sw $a3, 0x34($sp)
|
||||
/* 07AD6C 8007A16C 8FA30024 */ lw $v1, 0x24($sp)
|
||||
/* 07AD70 8007A170 8FA5002C */ lw $a1, 0x2c($sp)
|
||||
/* 07AD74 8007A174 8FA60030 */ lw $a2, 0x30($sp)
|
||||
/* 07AD78 8007A178 8FA70034 */ lw $a3, 0x34($sp)
|
||||
/* 07AD7C 8007A17C 2408FFFD */ li $t0, -3
|
||||
/* 07AD80 8007A180 10400048 */ beqz $v0, .L8007A2A4
|
||||
/* 07AD84 8007A184 2409FFFE */ li $t1, -2
|
||||
/* 07AD88 8007A188 8E0D0008 */ lw $t5, 8($s0)
|
||||
/* 07AD8C 8007A18C 00000000 */ nop
|
||||
/* 07AD90 8007A190 31AE0007 */ andi $t6, $t5, 7
|
||||
/* 07AD94 8007A194 25CFFFFF */ addiu $t7, $t6, -1
|
||||
/* 07AD98 8007A198 2DE10007 */ sltiu $at, $t7, 7
|
||||
/* 07AD9C 8007A19C 10200041 */ beqz $at, .L8007A2A4
|
||||
/* 07ADA0 8007A1A0 000F7880 */ sll $t7, $t7, 2
|
||||
/* 07ADA4 8007A1A4 3C01800E */ lui $at, %hi(jpt_800E7970) # $at, 0x800e
|
||||
/* 07ADA8 8007A1A8 002F0821 */ addu $at, $at, $t7
|
||||
/* 07ADAC 8007A1AC 8C2F7970 */ lw $t7, %lo(jpt_800E7970)($at)
|
||||
/* 07ADB0 8007A1B0 00000000 */ nop
|
||||
/* 07ADB4 8007A1B4 01E00008 */ jr $t7
|
||||
/* 07ADB8 8007A1B8 00000000 */ nop
|
||||
glabel L8007A1BC
|
||||
/* 07ADBC 8007A1BC 8E180004 */ lw $t8, 4($s0)
|
||||
/* 07ADC0 8007A1C0 30EA0002 */ andi $t2, $a3, 2
|
||||
/* 07ADC4 8007A1C4 33190020 */ andi $t9, $t8, 0x20
|
||||
/* 07ADC8 8007A1C8 13200013 */ beqz $t9, .L8007A218
|
||||
/* 07ADCC 8007A1CC 24010003 */ li $at, 3
|
||||
/* 07ADD0 8007A1D0 11400034 */ beqz $t2, .L8007A2A4
|
||||
/* 07ADD4 8007A1D4 00000000 */ nop
|
||||
/* 07ADD8 8007A1D8 ACB00000 */ sw $s0, ($a1)
|
||||
/* 07ADDC 8007A1DC 8E0B0004 */ lw $t3, 4($s0)
|
||||
/* 07ADE0 8007A1E0 00E81824 */ and $v1, $a3, $t0
|
||||
/* 07ADE4 8007A1E4 316C0001 */ andi $t4, $t3, 1
|
||||
/* 07ADE8 8007A1E8 11800003 */ beqz $t4, .L8007A1F8
|
||||
/* 07ADEC 8007A1EC 00000000 */ nop
|
||||
/* 07ADF0 8007A1F0 ACD00000 */ sw $s0, ($a2)
|
||||
/* 07ADF4 8007A1F4 00691824 */ and $v1, $v1, $t1
|
||||
.L8007A1F8:
|
||||
/* 07ADF8 8007A1F8 8E2D0268 */ lw $t5, 0x268($s1)
|
||||
/* 07ADFC 8007A1FC 00000000 */ nop
|
||||
/* 07AE00 8007A200 8DAE0000 */ lw $t6, ($t5)
|
||||
/* 07AE04 8007A204 00000000 */ nop
|
||||
/* 07AE08 8007A208 15C00026 */ bnez $t6, .L8007A2A4
|
||||
/* 07AE0C 8007A20C AE2E0268 */ sw $t6, 0x268($s1)
|
||||
/* 07AE10 8007A210 10000024 */ b .L8007A2A4
|
||||
/* 07AE14 8007A214 AE200270 */ sw $zero, 0x270($s1)
|
||||
.L8007A218:
|
||||
/* 07AE18 8007A218 14E10022 */ bne $a3, $at, .L8007A2A4
|
||||
/* 07AE1C 8007A21C 00000000 */ nop
|
||||
/* 07AE20 8007A220 ACD00000 */ sw $s0, ($a2)
|
||||
/* 07AE24 8007A224 ACB00000 */ sw $s0, ($a1)
|
||||
/* 07AE28 8007A228 8E380268 */ lw $t8, 0x268($s1)
|
||||
/* 07AE2C 8007A22C 2401FFFC */ li $at, -4
|
||||
/* 07AE30 8007A230 8F190000 */ lw $t9, ($t8)
|
||||
/* 07AE34 8007A234 00E11824 */ and $v1, $a3, $at
|
||||
/* 07AE38 8007A238 1720001A */ bnez $t9, .L8007A2A4
|
||||
/* 07AE3C 8007A23C AE390268 */ sw $t9, 0x268($s1)
|
||||
/* 07AE40 8007A240 10000018 */ b .L8007A2A4
|
||||
/* 07AE44 8007A244 AE200270 */ sw $zero, 0x270($s1)
|
||||
glabel L8007A248
|
||||
/* 07AE48 8007A248 8E020004 */ lw $v0, 4($s0)
|
||||
/* 07AE4C 8007A24C 30EC0002 */ andi $t4, $a3, 2
|
||||
/* 07AE50 8007A250 304B0002 */ andi $t3, $v0, 2
|
||||
/* 07AE54 8007A254 11600007 */ beqz $t3, .L8007A274
|
||||
/* 07AE58 8007A258 304D0001 */ andi $t5, $v0, 1
|
||||
/* 07AE5C 8007A25C 11800005 */ beqz $t4, .L8007A274
|
||||
/* 07AE60 8007A260 304D0001 */ andi $t5, $v0, 1
|
||||
/* 07AE64 8007A264 ACB00000 */ sw $s0, ($a1)
|
||||
/* 07AE68 8007A268 8E020004 */ lw $v0, 4($s0)
|
||||
/* 07AE6C 8007A26C 00E81824 */ and $v1, $a3, $t0
|
||||
/* 07AE70 8007A270 304D0001 */ andi $t5, $v0, 1
|
||||
.L8007A274:
|
||||
/* 07AE74 8007A274 11A0000B */ beqz $t5, .L8007A2A4
|
||||
/* 07AE78 8007A278 306E0001 */ andi $t6, $v1, 1
|
||||
/* 07AE7C 8007A27C 11C00009 */ beqz $t6, .L8007A2A4
|
||||
/* 07AE80 8007A280 00000000 */ nop
|
||||
/* 07AE84 8007A284 ACD00000 */ sw $s0, ($a2)
|
||||
/* 07AE88 8007A288 8E2F0268 */ lw $t7, 0x268($s1)
|
||||
/* 07AE8C 8007A28C 00691824 */ and $v1, $v1, $t1
|
||||
/* 07AE90 8007A290 8DF80000 */ lw $t8, ($t7)
|
||||
/* 07AE94 8007A294 00000000 */ nop
|
||||
/* 07AE98 8007A298 17000002 */ bnez $t8, .L8007A2A4
|
||||
/* 07AE9C 8007A29C AE380268 */ sw $t8, 0x268($s1)
|
||||
/* 07AEA0 8007A2A0 AE200270 */ sw $zero, 0x270($s1)
|
||||
.L8007A2A4:
|
||||
glabel L8007A2A4
|
||||
/* 07AEA4 8007A2A4 10670004 */ beq $v1, $a3, .L8007A2B8
|
||||
/* 07AEA8 8007A2A8 8FBF001C */ lw $ra, 0x1c($sp)
|
||||
/* 07AEAC 8007A2AC 1000FF8F */ b .L8007A0EC
|
||||
/* 07AEB0 8007A2B0 00603825 */ move $a3, $v1
|
||||
/* 07AEB4 8007A2B4 8FBF001C */ lw $ra, 0x1c($sp)
|
||||
.L8007A2B8:
|
||||
/* 07AEB8 8007A2B8 8FB00014 */ lw $s0, 0x14($sp)
|
||||
/* 07AEBC 8007A2BC 8FB10018 */ lw $s1, 0x18($sp)
|
||||
/* 07AEC0 8007A2C0 27BD0028 */ addiu $sp, $sp, 0x28
|
||||
/* 07AEC4 8007A2C4 03E00008 */ jr $ra
|
||||
/* 07AEC8 8007A2C8 00601025 */ move $v0, $v1
|
||||
|
||||
/* 07AECC 8007A2CC 00000000 */ nop
|
||||
+112
-1
@@ -159,7 +159,9 @@ static void __scMain(void *arg) {
|
||||
OSScTask *dp = 0;
|
||||
|
||||
while (1) {
|
||||
|
||||
osRecvMesg(&sc->interruptQ, (OSMesg *)&msg, OS_MESG_BLOCK);
|
||||
|
||||
switch ((int) msg) {
|
||||
case (VIDEO_MSG):
|
||||
__scHandleRetrace(sc);
|
||||
@@ -501,4 +503,113 @@ void __scYield(OSSched *sc) {
|
||||
}
|
||||
}
|
||||
|
||||
GLOBAL_ASM("lib/asm/non_matchings/sched/__scSchedule.s")
|
||||
/*
|
||||
* Schedules the tasks to be run on the RCP
|
||||
*/
|
||||
s32 __scSchedule(OSSched *sc, OSScTask **sp, OSScTask **dp, s32 availRCP) {
|
||||
s32 avail = availRCP;
|
||||
OSScTask *gfx = sc->gfxListHead;
|
||||
OSScTask *audio = sc->audioListHead;
|
||||
|
||||
#ifdef SC_LOGGING
|
||||
osLogEvent(l, 517, 3, *sp, *dp, availRCP);
|
||||
#endif
|
||||
|
||||
if (sc->doAudio && (avail & OS_SC_SP)) {
|
||||
|
||||
if (gfx && (gfx->flags & OS_SC_PARALLEL_TASK)) {
|
||||
*sp = gfx;
|
||||
avail &= ~OS_SC_SP;
|
||||
} else {
|
||||
*sp = audio;
|
||||
avail &= ~OS_SC_SP;
|
||||
sc->doAudio = 0;
|
||||
sc->audioListHead = sc->audioListHead->next;
|
||||
if (sc->audioListHead == NULL)
|
||||
sc->audioListTail = NULL;
|
||||
}
|
||||
} else {
|
||||
#ifdef SC_LOGGING
|
||||
osLogEvent(l, 520, 1, gfx);
|
||||
#endif
|
||||
if (__scTaskReady(gfx)) {
|
||||
|
||||
#ifdef SC_LOGGING
|
||||
osLogEvent(l, 522, 3, gfx, gfx->state, gfx->flags);
|
||||
#endif
|
||||
switch (gfx->flags & OS_SC_TYPE_MASK) {
|
||||
case (OS_SC_XBUS):
|
||||
if (gfx->state & OS_SC_YIELDED) {
|
||||
#ifdef SC_LOGGING
|
||||
osLogEvent(l, 518, 0);
|
||||
#endif
|
||||
/* can hit this if RDP finishes at yield req */
|
||||
/* assert(gfx->state & OS_SC_DP); */
|
||||
|
||||
if (avail & OS_SC_SP) { /* if SP is available */
|
||||
#ifdef SC_LOGGING
|
||||
osLogEvent(l, 519, 0);
|
||||
#endif
|
||||
*sp = gfx;
|
||||
avail &= ~OS_SC_SP;
|
||||
|
||||
if (gfx->state & OS_SC_DP) { /* if it needs DP */
|
||||
*dp = gfx;
|
||||
avail &= ~OS_SC_DP;
|
||||
|
||||
if (avail & OS_SC_DP == 0)
|
||||
assert(sc->curRDPTask == gfx);
|
||||
|
||||
}
|
||||
|
||||
sc->gfxListHead = sc->gfxListHead->next;
|
||||
if (sc->gfxListHead == NULL)
|
||||
sc->gfxListTail = NULL;
|
||||
|
||||
}
|
||||
} else {
|
||||
if (avail == (OS_SC_SP | OS_SC_DP)) {
|
||||
*sp = *dp = gfx;
|
||||
avail &= ~(OS_SC_SP | OS_SC_DP);
|
||||
sc->gfxListHead = sc->gfxListHead->next;
|
||||
if (sc->gfxListHead == NULL)
|
||||
sc->gfxListTail = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case (OS_SC_DRAM):
|
||||
case (OS_SC_DP_DRAM):
|
||||
case (OS_SC_DP_XBUS):
|
||||
if (gfx->state & OS_SC_SP) { /* if needs SP */
|
||||
if (avail & OS_SC_SP) { /* if SP is available */
|
||||
*sp = gfx;
|
||||
avail &= ~OS_SC_SP;
|
||||
}
|
||||
}
|
||||
//This is else if in libreultra, and it's the only difference
|
||||
if (gfx->state & OS_SC_DP) { /* if needs DP */
|
||||
if (avail & OS_SC_DP) { /* if DP available */
|
||||
*dp = gfx;
|
||||
avail &= ~OS_SC_DP;
|
||||
sc->gfxListHead = sc->gfxListHead->next;
|
||||
if (sc->gfxListHead == NULL)
|
||||
sc->gfxListTail = NULL;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case (OS_SC_SP_DRAM):
|
||||
case (OS_SC_SP_XBUS):
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (avail != availRCP)
|
||||
avail = __scSchedule(sc, sp, dp, avail);
|
||||
|
||||
return avail;
|
||||
}
|
||||
|
||||
@@ -99,11 +99,7 @@ extern OSViMode osViModeTable[];
|
||||
/*******************************/
|
||||
|
||||
void __scYield(OSSched *sc);
|
||||
#if 1
|
||||
static void __scMain(void *arg);
|
||||
#else
|
||||
void __scMain(void *arg);
|
||||
#endif
|
||||
void __scExec(OSSched *sc, OSScTask *sp, OSScTask *dp);
|
||||
void osCreateScheduler(OSSched *sc, void *stack, OSPri priority, u8 mode, u8 numFields);
|
||||
void osScAddClient(OSSched *sc, OSScClient *c, OSMesgQueue *msgQ, u8 arg3);
|
||||
@@ -119,5 +115,6 @@ s32 __scTaskComplete(OSSched *sc, OSScTask *t);
|
||||
void __scAppendList(OSSched *sc, OSScTask *t);
|
||||
void __scExec(OSSched *sc, OSScTask *sp, OSScTask *dp);
|
||||
void __scHandleRetrace(OSSched *sc);
|
||||
static s32 __scSchedule(OSSched *sc, OSScTask **sp, OSScTask **dp, s32 availRCP);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user