diff --git a/Makefile b/Makefile index b743e8b9..a7812878 100755 --- a/Makefile +++ b/Makefile @@ -238,7 +238,7 @@ $(BUILD_DIR)/lib/src/unknown_0C91A0.o : OPT_FLAGS := -O1 $(BUILD_DIR)/lib/src/unknown_0D29F0.o: OPT_FLAGS := -O1 $(BUILD_DIR)/lib/src/unknown_0CDE90.o: OPT_FLAGS := -O1 $(BUILD_DIR)/lib/src/unknown_0D3160.o: OPT_FLAGS := -O1 -$(BUILD_DIR)/lib/src/unknown_066460.o: OPT_FLAGS := -O2 -Wo,-loopunroll,0 +$(BUILD_DIR)/lib/src/unknown_0C9C90.o: OPT_FLAGS := -O2 -Wo,-loopunroll,0 $(BUILD_DIR)/lib/src/osCreateThread.o : OPT_FLAGS := -O1 $(BUILD_DIR)/lib/src/osGetThreadPri.o : OPT_FLAGS := -O1 $(BUILD_DIR)/lib/src/osJamMesg.o : OPT_FLAGS := -O1 diff --git a/lib/asm/non_matchings/unknown_0C9C90/alEvtqFlushType.s b/lib/asm/non_matchings/unknown_0C9C90/alEvtqFlushType.s deleted file mode 100644 index 4e630fbe..00000000 --- a/lib/asm/non_matchings/unknown_0C9C90/alEvtqFlushType.s +++ /dev/null @@ -1,80 +0,0 @@ -glabel alEvtqFlushType -/* 0C9C90 800C9090 27BDFFC0 */ addiu $sp, $sp, -0x40 -/* 0C9C94 800C9094 AFB30020 */ sw $s3, 0x20($sp) -/* 0C9C98 800C9098 00059C00 */ sll $s3, $a1, 0x10 -/* 0C9C9C 800C909C AFB2001C */ sw $s2, 0x1c($sp) -/* 0C9CA0 800C90A0 00809025 */ move $s2, $a0 -/* 0C9CA4 800C90A4 00137403 */ sra $t6, $s3, 0x10 -/* 0C9CA8 800C90A8 AFBF0024 */ sw $ra, 0x24($sp) -/* 0C9CAC 800C90AC 01C09825 */ move $s3, $t6 -/* 0C9CB0 800C90B0 AFB10018 */ sw $s1, 0x18($sp) -/* 0C9CB4 800C90B4 AFB00014 */ sw $s0, 0x14($sp) -/* 0C9CB8 800C90B8 AFA50044 */ sw $a1, 0x44($sp) -/* 0C9CBC 800C90BC 0C03268C */ jal osSetIntMask -/* 0C9CC0 800C90C0 24040001 */ li $a0, 1 -/* 0C9CC4 800C90C4 AFA2002C */ sw $v0, 0x2c($sp) -/* 0C9CC8 800C90C8 8E500008 */ lw $s0, 8($s2) -/* 0C9CCC 800C90CC 12000012 */ beqz $s0, .L800C9118 -/* 0C9CD0 800C90D0 00000000 */ nop -.L800C90D4: -/* 0C9CD4 800C90D4 860F000C */ lh $t7, 0xc($s0) -/* 0C9CD8 800C90D8 8E110000 */ lw $s1, ($s0) -/* 0C9CDC 800C90DC 166F000C */ bne $s3, $t7, .L800C9110 -/* 0C9CE0 800C90E0 00000000 */ nop -/* 0C9CE4 800C90E4 12200005 */ beqz $s1, .L800C90FC -/* 0C9CE8 800C90E8 00000000 */ nop -/* 0C9CEC 800C90EC 8E380008 */ lw $t8, 8($s1) -/* 0C9CF0 800C90F0 8E190008 */ lw $t9, 8($s0) -/* 0C9CF4 800C90F4 03194021 */ addu $t0, $t8, $t9 -/* 0C9CF8 800C90F8 AE280008 */ sw $t0, 8($s1) -.L800C90FC: -/* 0C9CFC 800C90FC 0C0321D8 */ jal alUnlink -/* 0C9D00 800C9100 02002025 */ move $a0, $s0 -/* 0C9D04 800C9104 02002025 */ move $a0, $s0 -/* 0C9D08 800C9108 0C0321E4 */ jal alLink -/* 0C9D0C 800C910C 02402825 */ move $a1, $s2 -.L800C9110: -/* 0C9D10 800C9110 1620FFF0 */ bnez $s1, .L800C90D4 -/* 0C9D14 800C9114 02208025 */ move $s0, $s1 -.L800C9118: -/* 0C9D18 800C9118 0C03268C */ jal osSetIntMask -/* 0C9D1C 800C911C 8FA4002C */ lw $a0, 0x2c($sp) -/* 0C9D20 800C9120 8FBF0024 */ lw $ra, 0x24($sp) -/* 0C9D24 800C9124 8FB00014 */ lw $s0, 0x14($sp) -/* 0C9D28 800C9128 8FB10018 */ lw $s1, 0x18($sp) -/* 0C9D2C 800C912C 8FB2001C */ lw $s2, 0x1c($sp) -/* 0C9D30 800C9130 8FB30020 */ lw $s3, 0x20($sp) -/* 0C9D34 800C9134 03E00008 */ jr $ra -/* 0C9D38 800C9138 27BD0040 */ addiu $sp, $sp, 0x40 - -/* 0C9D3C 800C913C 27BDFFC8 */ addiu $sp, $sp, -0x38 -/* 0C9D40 800C9140 AFB20020 */ sw $s2, 0x20($sp) -/* 0C9D44 800C9144 00809025 */ move $s2, $a0 -/* 0C9D48 800C9148 AFBF0024 */ sw $ra, 0x24($sp) -/* 0C9D4C 800C914C AFB1001C */ sw $s1, 0x1c($sp) -/* 0C9D50 800C9150 AFB00018 */ sw $s0, 0x18($sp) -/* 0C9D54 800C9154 0C03268C */ jal osSetIntMask -/* 0C9D58 800C9158 24040001 */ li $a0, 1 -/* 0C9D5C 800C915C AFA2002C */ sw $v0, 0x2c($sp) -/* 0C9D60 800C9160 8E500008 */ lw $s0, 8($s2) -/* 0C9D64 800C9164 12000009 */ beqz $s0, .L800C918C -/* 0C9D68 800C9168 00000000 */ nop -.L800C916C: -/* 0C9D6C 800C916C 8E110000 */ lw $s1, ($s0) -/* 0C9D70 800C9170 0C0321D8 */ jal alUnlink -/* 0C9D74 800C9174 02002025 */ move $a0, $s0 -/* 0C9D78 800C9178 02002025 */ move $a0, $s0 -/* 0C9D7C 800C917C 0C0321E4 */ jal alLink -/* 0C9D80 800C9180 02402825 */ move $a1, $s2 -/* 0C9D84 800C9184 1620FFF9 */ bnez $s1, .L800C916C -/* 0C9D88 800C9188 02208025 */ move $s0, $s1 -.L800C918C: -/* 0C9D8C 800C918C 0C03268C */ jal osSetIntMask -/* 0C9D90 800C9190 8FA4002C */ lw $a0, 0x2c($sp) -/* 0C9D94 800C9194 8FBF0024 */ lw $ra, 0x24($sp) -/* 0C9D98 800C9198 8FB00018 */ lw $s0, 0x18($sp) -/* 0C9D9C 800C919C 8FB1001C */ lw $s1, 0x1c($sp) -/* 0C9DA0 800C91A0 8FB20020 */ lw $s2, 0x20($sp) -/* 0C9DA4 800C91A4 03E00008 */ jr $ra -/* 0C9DA8 800C91A8 27BD0038 */ addiu $sp, $sp, 0x38 - diff --git a/lib/asm/non_matchings/unknown_0C9C90/alEvtqNextEvent.s b/lib/asm/non_matchings/unknown_0C9C90/alEvtqNextEvent.s deleted file mode 100644 index 504bc823..00000000 --- a/lib/asm/non_matchings/unknown_0C9C90/alEvtqNextEvent.s +++ /dev/null @@ -1,39 +0,0 @@ -glabel alEvtqNextEvent -/* 0C9ED0 800C92D0 27BDFFD0 */ addiu $sp, $sp, -0x30 -/* 0C9ED4 800C92D4 AFBF001C */ sw $ra, 0x1c($sp) -/* 0C9ED8 800C92D8 AFA40030 */ sw $a0, 0x30($sp) -/* 0C9EDC 800C92DC AFB00018 */ sw $s0, 0x18($sp) -/* 0C9EE0 800C92E0 AFA50034 */ sw $a1, 0x34($sp) -/* 0C9EE4 800C92E4 0C03268C */ jal osSetIntMask -/* 0C9EE8 800C92E8 24040001 */ li $a0, 1 -/* 0C9EEC 800C92EC 8FAE0030 */ lw $t6, 0x30($sp) -/* 0C9EF0 800C92F0 AFA20024 */ sw $v0, 0x24($sp) -/* 0C9EF4 800C92F4 8FB80034 */ lw $t8, 0x34($sp) -/* 0C9EF8 800C92F8 8DD00008 */ lw $s0, 8($t6) -/* 0C9EFC 800C92FC 00001825 */ move $v1, $zero -/* 0C9F00 800C9300 5200000D */ beql $s0, $zero, .L800C9338 -/* 0C9F04 800C9304 240FFFFF */ li $t7, -1 -/* 0C9F08 800C9308 0C0321D8 */ jal alUnlink -/* 0C9F0C 800C930C 02002025 */ move $a0, $s0 -/* 0C9F10 800C9310 2604000C */ addiu $a0, $s0, 0xc -/* 0C9F14 800C9314 8FA50034 */ lw $a1, 0x34($sp) -/* 0C9F18 800C9318 0C034E08 */ jal alCopy -/* 0C9F1C 800C931C 24060010 */ li $a2, 16 -/* 0C9F20 800C9320 02002025 */ move $a0, $s0 -/* 0C9F24 800C9324 0C0321E4 */ jal alLink -/* 0C9F28 800C9328 8FA50030 */ lw $a1, 0x30($sp) -/* 0C9F2C 800C932C 10000003 */ b .L800C933C -/* 0C9F30 800C9330 8E030008 */ lw $v1, 8($s0) -/* 0C9F34 800C9334 240FFFFF */ li $t7, -1 -.L800C9338: -/* 0C9F38 800C9338 A70F0000 */ sh $t7, ($t8) -.L800C933C: -/* 0C9F3C 800C933C 8FA40024 */ lw $a0, 0x24($sp) -/* 0C9F40 800C9340 0C03268C */ jal osSetIntMask -/* 0C9F44 800C9344 AFA30028 */ sw $v1, 0x28($sp) -/* 0C9F48 800C9348 8FBF001C */ lw $ra, 0x1c($sp) -/* 0C9F4C 800C934C 8FA20028 */ lw $v0, 0x28($sp) -/* 0C9F50 800C9350 8FB00018 */ lw $s0, 0x18($sp) -/* 0C9F54 800C9354 03E00008 */ jr $ra -/* 0C9F58 800C9358 27BD0030 */ addiu $sp, $sp, 0x30 - diff --git a/lib/src/unknown_0C9C90.c b/lib/src/unknown_0C9C90.c index 4657c9f4..f43933cc 100644 --- a/lib/src/unknown_0C9C90.c +++ b/lib/src/unknown_0C9C90.c @@ -6,11 +6,109 @@ #include "audio_internal.h" #include "libultra_internal.h" -GLOBAL_ASM("lib/asm/non_matchings/unknown_0C9C90/alEvtqFlushType.s") +void alEvtqFlushType(ALEventQueue *evtq, s16 type) +{ + ALLink *thisNode; + ALLink *nextNode; + ALEventListItem *thisItem, *nextItem; + OSIntMask mask; + mask = osSetIntMask(OS_IM_NONE); + thisNode = evtq->allocList.next; + while( thisNode != 0 ) + { + nextNode = thisNode->next; + thisItem = (ALEventListItem *)thisNode; + nextItem = (ALEventListItem *)nextNode; + if (thisItem->evt.type == type) + { + if (nextItem) + nextItem->delta += thisItem->delta; + alUnlink(thisNode); + alLink(thisNode, &evtq->freeList); + } + thisNode = nextNode; + } + + osSetIntMask(mask); +} + +void alEvtqFlush(ALEventQueue *evtq) +{ + ALLink *thisNode; + ALLink *nextNode; + OSIntMask mask; + + mask = osSetIntMask(OS_IM_NONE); + + thisNode = evtq->allocList.next; + while( thisNode != 0 ) { + nextNode = thisNode->next; + alUnlink(thisNode); + alLink(thisNode, &evtq->freeList); + thisNode = nextNode; + } + + osSetIntMask(mask); +} + +#if 1 GLOBAL_ASM("lib/asm/non_matchings/unknown_0C9C90/alEvtqPostEvent.s") -//GLOBAL_ASM("lib/asm/non_matchings/unknown_0C9C90/alEvtqNextEvent.s") +#else +void alEvtqPostEvent(ALEventQueue *evtq, ALEvent *evt, ALMicroTime delta) +{ + ALEventListItem *item; + ALEventListItem *nextItem; + ALLink *node; + s32 postAtEnd=0; + OSIntMask mask; + + mask = osSetIntMask(OS_IM_NONE); + + item = (ALEventListItem *)evtq->freeList.next; + if (!item) { + osSetIntMask(mask); +#ifdef _DEBUG + __osError(ERR_ALEVENTNOFREE, 0); +#endif + return; + } + + alUnlink((ALLink *)item); + alCopy(evt, &item->evt, sizeof(*evt)); + + if (delta == AL_EVTQ_END) + postAtEnd = -1; + + for (node = &evtq->allocList; node != 0; node = node->next) { + if (!node->next) { /* end of the list */ + if (postAtEnd) + item->delta = 0; + else + item->delta = delta; + alLink((ALLink *)item, node); + break; + } else { + nextItem = (ALEventListItem *)node->next; + + if (delta < nextItem->delta) { + item->delta = delta; + nextItem->delta -= delta; + + alLink((ALLink *)item, node); + break; + } + + delta -= nextItem->delta; + + } + } + + osSetIntMask(mask); + +} +#endif ALMicroTime alEvtqNextEvent(ALEventQueue *evtq, ALEvent *evt) {