diff --git a/asm/non_matchings/unknown_003260/func_80002A98.s b/asm/non_matchings/unknown_003260/func_80002A98.s index 4e61c54f..c6732fd4 100644 --- a/asm/non_matchings/unknown_003260/func_80002A98.s +++ b/asm/non_matchings/unknown_003260/func_80002A98.s @@ -20,7 +20,7 @@ glabel func_80002A98 /* 0036E0 80002AE0 AFA00044 */ sw $zero, 0x44($sp) /* 0036E4 80002AE4 24C66160 */ addiu $a2, %lo(OSMesgQueue_80116160) # addiu $a2, $a2, 0x6160 /* 0036E8 80002AE8 24A56220 */ addiu $a1, %lo(D_80116220) # addiu $a1, $a1, 0x6220 -/* 0036EC 80002AEC 0C01E520 */ jal func_80079480 +/* 0036EC 80002AEC 0C01E520 */ jal osScAddClient /* 0036F0 80002AF0 24070001 */ li $a3, 1 /* 0036F4 80002AF4 3C1E8011 */ lui $fp, %hi(D_80116198) # $fp, 0x8011 /* 0036F8 80002AF8 3C16800E */ lui $s6, %hi(D_800DC680) # $s6, 0x800e diff --git a/asm/non_matchings/unknown_066AA0/func_8006C3E0.s b/asm/non_matchings/unknown_066AA0/func_8006C3E0.s index e10b8558..4fc0fab2 100644 --- a/asm/non_matchings/unknown_066AA0/func_8006C3E0.s +++ b/asm/non_matchings/unknown_066AA0/func_8006C3E0.s @@ -107,7 +107,7 @@ glabel func_8006C3E0 /* 06D170 8006C570 24C63548 */ addiu $a2, %lo(D_80123548) # addiu $a2, $a2, 0x3548 /* 06D174 8006C574 24A53538 */ addiu $a1, %lo(D_80123538) # addiu $a1, $a1, 0x3538 /* 06D178 8006C578 24841260 */ addiu $a0, %lo(D_80121260) # addiu $a0, $a0, 0x1260 -/* 06D17C 8006C57C 0C01E520 */ jal func_80079480 +/* 06D17C 8006C57C 0C01E520 */ jal osScAddClient /* 06D180 8006C580 24070003 */ li $a3, 3 /* 06D184 8006C584 3C018012 */ lui $at, %hi(D_80123560) # $at, 0x8012 /* 06D188 8006C588 AC203560 */ sw $zero, %lo(D_80123560)($at) diff --git a/asm/non_matchings/unknown_079F50/func_80079480.s b/asm/non_matchings/unknown_079F50/func_800794E4.s similarity index 59% rename from asm/non_matchings/unknown_079F50/func_80079480.s rename to asm/non_matchings/unknown_079F50/func_800794E4.s index ef94a751..dfd5d9c3 100644 --- a/asm/non_matchings/unknown_079F50/func_80079480.s +++ b/asm/non_matchings/unknown_079F50/func_800794E4.s @@ -1,30 +1,4 @@ -glabel func_80079480 -/* 07A080 80079480 27BDFFE8 */ addiu $sp, $sp, -0x18 -/* 07A084 80079484 AFBF0014 */ sw $ra, 0x14($sp) -/* 07A088 80079488 AFA40018 */ sw $a0, 0x18($sp) -/* 07A08C 8007948C AFA60020 */ sw $a2, 0x20($sp) -/* 07A090 80079490 AFA70024 */ sw $a3, 0x24($sp) -/* 07A094 80079494 24040001 */ li $a0, 1 -/* 07A098 80079498 0C03268C */ jal osSetIntMask -/* 07A09C 8007949C AFA5001C */ sw $a1, 0x1c($sp) -/* 07A0A0 800794A0 8FA30018 */ lw $v1, 0x18($sp) -/* 07A0A4 800794A4 8FA5001C */ lw $a1, 0x1c($sp) -/* 07A0A8 800794A8 8FAE0020 */ lw $t6, 0x20($sp) -/* 07A0AC 800794AC 00402025 */ move $a0, $v0 -/* 07A0B0 800794B0 ACAE0008 */ sw $t6, 8($a1) -/* 07A0B4 800794B4 8C6F0260 */ lw $t7, 0x260($v1) -/* 07A0B8 800794B8 00000000 */ nop -/* 07A0BC 800794BC ACAF0004 */ sw $t7, 4($a1) -/* 07A0C0 800794C0 93B80027 */ lbu $t8, 0x27($sp) -/* 07A0C4 800794C4 00000000 */ nop -/* 07A0C8 800794C8 A0B80000 */ sb $t8, ($a1) -/* 07A0CC 800794CC 0C03268C */ jal osSetIntMask -/* 07A0D0 800794D0 AC650260 */ sw $a1, 0x260($v1) -/* 07A0D4 800794D4 8FBF0014 */ lw $ra, 0x14($sp) -/* 07A0D8 800794D8 27BD0018 */ addiu $sp, $sp, 0x18 -/* 07A0DC 800794DC 03E00008 */ jr $ra -/* 07A0E0 800794E0 00000000 */ nop - +glabel osScRemoveClient /* 07A0E4 800794E4 27BDFFE0 */ addiu $sp, $sp, -0x20 /* 07A0E8 800794E8 AFBF0014 */ sw $ra, 0x14($sp) /* 07A0EC 800794EC AFA40020 */ sw $a0, 0x20($sp) diff --git a/asm/non_matchings/unknown_07AF10/func_8007A310.s b/asm/non_matchings/unknown_07AF10/func_8007A310.s index f2b4c3e2..01b7a56a 100644 --- a/asm/non_matchings/unknown_07AF10/func_8007A310.s +++ b/asm/non_matchings/unknown_07AF10/func_8007A310.s @@ -95,7 +95,7 @@ glabel func_8007A310 /* 07B070 8007A470 3C068012 */ lui $a2, %hi(D_801261A0) # $a2, 0x8012 /* 07B074 8007A474 24C661A0 */ addiu $a2, %lo(D_801261A0) # addiu $a2, $a2, 0x61a0 /* 07B078 8007A478 24A56310 */ addiu $a1, %lo(D_80126310) # addiu $a1, $a1, 0x6310 -/* 07B07C 8007A47C 0C01E520 */ jal func_80079480 +/* 07B07C 8007A47C 0C01E520 */ jal osScAddClient /* 07B080 8007A480 24070002 */ li $a3, 2 /* 07B084 8007A484 0C01E954 */ jal func_8007A550 /* 07B088 8007A488 00000000 */ nop diff --git a/src/unknown_066AA0.c b/src/unknown_066AA0.c index aea36d85..47c7bc7e 100644 --- a/src/unknown_066AA0.c +++ b/src/unknown_066AA0.c @@ -1437,7 +1437,7 @@ extern s32 D_80123544; extern s32 D_801234E8; void osCreateScheduler(u16*, s32*, s32, u8, s32); -void func_80079480(u16*, u8*, s32**, s32); +void osScAddClient(u16*, u8*, s32**, s32); void func_8006C3E0(void) { s32 sp24; @@ -1484,7 +1484,7 @@ void func_8006C3E0(void) { func_80081218(); func_800C7350(); osCreateMesgQueue(&D_80123548, &D_80123544, 1); - func_80079480(&D_80121260, &D_80123538, &D_80123548, 3); + osScAddClient(&D_80121260, &D_80123538, &D_80123548, 3); D_80123560 = 0; D_80123504 = 0; D_80123508 = 0; diff --git a/src/unknown_079F50.c b/src/unknown_079F50.c index 466fdf06..c76b5e11 100644 --- a/src/unknown_079F50.c +++ b/src/unknown_079F50.c @@ -5,9 +5,6 @@ #include "macros.h" #include "libultra_internal.h" -#if 0 -GLOBAL_ASM("asm/non_matchings/unknown_079F50/osCreateScheduler.s") -#else #define OS_SC_RETRACE_MSG 1 #define OS_SC_PRE_NMI_MSG 4 #define OS_SC_MAX_MESGS 8 @@ -34,6 +31,7 @@ typedef struct OSScTask_s { typedef struct SCClient_s { + u8 unk0; struct SCClient_s *next; /* next client in the list */ OSMesgQueue *msgQ; /* where to send the frame msg */ } OSScClient; @@ -79,8 +77,6 @@ void osCreateScheduler(OSSched *sc, void *stack, OSPri priority, u8 mode, u8 num sc->retraceMsg.type = OS_SC_RETRACE_MSG; /* sent to apps */ sc->prenmiMsg.type = OS_SC_PRE_NMI_MSG; - - /* * Set up video manager, listen for Video, RSP, and RDP interrupts */ @@ -101,9 +97,44 @@ void osCreateScheduler(OSSched *sc, void *stack, OSPri priority, u8 mode, u8 num osCreateThread(&sc->thread, 5, __scMain, (void *)sc, stack, priority); osStartThread(&sc->thread); } -#endif -GLOBAL_ASM("asm/non_matchings/unknown_079F50/func_80079480.s") +void osScAddClient(OSSched *sc, OSScClient *c, OSMesgQueue *msgQ, u8 arg3){ + OSIntMask mask; + + mask = osSetIntMask(OS_IM_NONE); + + c->msgQ = msgQ; + c->next = sc->clientList; + c->unk0 = arg3; + sc->clientList = c; + + osSetIntMask(mask); +} + + +void osScRemoveClient(OSSched *sc, OSScClient *c) +{ + OSScClient *client = sc->clientList; + OSScClient *prev = 0; + OSIntMask mask; + + mask = osSetIntMask(OS_IM_NONE); + + while (client != 0) { + if (client == c) { + if(prev) + prev->next = c->next; + else + sc->clientList = c->next; + break; + } + prev = client; + client = client->next; + } + + osSetIntMask(mask); +} + GLOBAL_ASM("asm/non_matchings/unknown_079F50/func_80079574.s") GLOBAL_ASM("asm/non_matchings/unknown_079F50/func_8007957C.s") GLOBAL_ASM("asm/non_matchings/unknown_079F50/__scMain.s")