diff --git a/Makefile b/Makefile index 11848c626..fcf396696 100644 --- a/Makefile +++ b/Makefile @@ -76,6 +76,7 @@ $(B_DIR)/lib/ultra/io/visetevent.o: OPT_LVL := -O1 $(B_DIR)/lib/ultra/os/destroythread.o: OPT_LVL := -O1 $(B_DIR)/lib/ultra/os/resetglobalintmask.o: OPT_LVL := -O1 $(B_DIR)/lib/ultra/os/setthreadpri.o: OPT_LVL := -O1 +$(B_DIR)/lib/ultra/os/startthread.o: OPT_LVL := -O1 $(B_DIR)/lib/ultra/os/stopthread.o: OPT_LVL := -O1 $(B_DIR)/lib/ultra/os/thread.o: OPT_LVL := -O1 $(B_DIR)/lib/ultra/os/yieldthread.o: OPT_LVL := -O1 diff --git a/src/lib/ultra/os/startthread.c b/src/lib/ultra/os/startthread.c index c780b35bb..37827ef0d 100644 --- a/src/lib/ultra/os/startthread.c +++ b/src/lib/ultra/os/startthread.c @@ -1,95 +1,33 @@ #include +#include "game/data/data_000000.h" -GLOBAL_ASM( -glabel osStartThread -/* 481f0: 27bdffd8 */ addiu $sp,$sp,-40 -/* 481f4: afbf001c */ sw $ra,0x1c($sp) -/* 481f8: afa40028 */ sw $a0,0x28($sp) -/* 481fc: afb10018 */ sw $s1,0x18($sp) -/* 48200: 0c01256c */ jal __osDisableInt -/* 48204: afb00014 */ sw $s0,0x14($sp) -/* 48208: 8fae0028 */ lw $t6,0x28($sp) -/* 4820c: 24010001 */ addiu $at,$zero,0x1 -/* 48210: 00408025 */ or $s0,$v0,$zero -/* 48214: 95d10010 */ lhu $s1,0x10($t6) -/* 48218: 1221000c */ beq $s1,$at,.L0004824c -/* 4821c: 24010008 */ addiu $at,$zero,0x8 -/* 48220: 1621002a */ bne $s1,$at,.L000482cc -/* 48224: 00000000 */ nop -/* 48228: 8fb80028 */ lw $t8,0x28($sp) -/* 4822c: 240f0002 */ addiu $t7,$zero,0x2 -/* 48230: 3c048006 */ lui $a0,%hi(__osRunQueue) -/* 48234: a70f0010 */ sh $t7,0x10($t8) -/* 48238: 8fa50028 */ lw $a1,0x28($sp) -/* 4823c: 0c000f2e */ jal __osEnqueueThread -/* 48240: 24840938 */ addiu $a0,$a0,%lo(__osRunQueue) -/* 48244: 10000021 */ b .L000482cc -/* 48248: 00000000 */ nop -.L0004824c: -/* 4824c: 8fb90028 */ lw $t9,0x28($sp) -/* 48250: 8f280008 */ lw $t0,0x8($t9) -/* 48254: 11000005 */ beqz $t0,.L0004826c -/* 48258: 00000000 */ nop -/* 4825c: 3c098006 */ lui $t1,%hi(__osRunQueue) -/* 48260: 25290938 */ addiu $t1,$t1,%lo(__osRunQueue) -/* 48264: 1509000a */ bne $t0,$t1,.L00048290 -/* 48268: 00000000 */ nop -.L0004826c: -/* 4826c: 8fab0028 */ lw $t3,0x28($sp) -/* 48270: 240a0002 */ addiu $t2,$zero,0x2 -/* 48274: 3c048006 */ lui $a0,%hi(__osRunQueue) -/* 48278: a56a0010 */ sh $t2,0x10($t3) -/* 4827c: 8fa50028 */ lw $a1,0x28($sp) -/* 48280: 0c000f2e */ jal __osEnqueueThread -/* 48284: 24840938 */ addiu $a0,$a0,%lo(__osRunQueue) -/* 48288: 10000010 */ b .L000482cc -/* 4828c: 00000000 */ nop -.L00048290: -/* 48290: 8fad0028 */ lw $t5,0x28($sp) -/* 48294: 240c0008 */ addiu $t4,$zero,0x8 -/* 48298: a5ac0010 */ sh $t4,0x10($t5) -/* 4829c: 8fae0028 */ lw $t6,0x28($sp) -/* 482a0: 8dc40008 */ lw $a0,0x8($t6) -/* 482a4: 0c000f2e */ jal __osEnqueueThread -/* 482a8: 01c02825 */ or $a1,$t6,$zero -/* 482ac: 8faf0028 */ lw $t7,0x28($sp) -/* 482b0: 0c000f40 */ jal __osPopThread -/* 482b4: 8de40008 */ lw $a0,0x8($t7) -/* 482b8: 00408825 */ or $s1,$v0,$zero -/* 482bc: 3c048006 */ lui $a0,%hi(__osRunQueue) -/* 482c0: 24840938 */ addiu $a0,$a0,%lo(__osRunQueue) -/* 482c4: 0c000f2e */ jal __osEnqueueThread -/* 482c8: 02202825 */ or $a1,$s1,$zero -.L000482cc: -/* 482cc: 3c188006 */ lui $t8,%hi(__osRunningThread) -/* 482d0: 8f180940 */ lw $t8,%lo(__osRunningThread)($t8) -/* 482d4: 17000005 */ bnez $t8,.L000482ec -/* 482d8: 00000000 */ nop -/* 482dc: 0c000f44 */ jal __osDispatchThread -/* 482e0: 00000000 */ nop -/* 482e4: 1000000f */ b .L00048324 -/* 482e8: 00000000 */ nop -.L000482ec: -/* 482ec: 3c198006 */ lui $t9,%hi(__osRunningThread) -/* 482f0: 3c098006 */ lui $t1,%hi(__osRunQueue) -/* 482f4: 8d290938 */ lw $t1,%lo(__osRunQueue)($t1) -/* 482f8: 8f390940 */ lw $t9,%lo(__osRunningThread)($t9) -/* 482fc: 8d2a0004 */ lw $t2,0x4($t1) -/* 48300: 8f280004 */ lw $t0,0x4($t9) -/* 48304: 010a082a */ slt $at,$t0,$t2 -/* 48308: 10200006 */ beqz $at,.L00048324 -/* 4830c: 00000000 */ nop -/* 48310: 240b0002 */ addiu $t3,$zero,0x2 -/* 48314: 3c048006 */ lui $a0,%hi(__osRunQueue) -/* 48318: a72b0010 */ sh $t3,0x10($t9) -/* 4831c: 0c000ee8 */ jal __osEnqueueAndYield -/* 48320: 24840938 */ addiu $a0,$a0,%lo(__osRunQueue) -.L00048324: -/* 48324: 0c012588 */ jal __osRestoreInt -/* 48328: 02002025 */ or $a0,$s0,$zero -/* 4832c: 8fbf001c */ lw $ra,0x1c($sp) -/* 48330: 8fb00014 */ lw $s0,0x14($sp) -/* 48334: 8fb10018 */ lw $s1,0x18($sp) -/* 48338: 03e00008 */ jr $ra -/* 4833c: 27bd0028 */ addiu $sp,$sp,0x28 -); +void osStartThread(OSThread *t) +{ + register u32 saveMask = __osDisableInt(); + + switch (t->state) { + case OS_STATE_WAITING: + t->state = OS_STATE_RUNNABLE; + __osEnqueueThread(&__osRunQueue, t); + break; + case OS_STATE_STOPPED: + if (t->queue == NULL || t->queue == &__osRunQueue) { + t->state = OS_STATE_RUNNABLE; + __osEnqueueThread(&__osRunQueue, t); + } else { + t->state = OS_STATE_WAITING; + __osEnqueueThread(t->queue, t); + __osEnqueueThread(&__osRunQueue, __osPopThread(t->queue)); + } + break; + } + + if (__osRunningThread == NULL) { + __osDispatchThread(); + } else if (__osRunningThread->priority < __osRunQueue->priority) { + __osRunningThread->state = OS_STATE_RUNNABLE; + __osEnqueueAndYield(&__osRunQueue); + } + + __osRestoreInt(saveMask); +}