From c49972f46e7c87589e42d3aa922e22ef2148d850 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Thu, 1 Apr 2021 20:04:19 +1000 Subject: [PATCH] Decompile rdpCreateTask --- ld/libfiles.ntsc-beta.inc | 2 +- ld/libfiles.ntsc-final.inc | 2 +- ld/libfiles.pal-final.inc | 2 +- src/include/PR/sched.h | 6 +- src/include/bss.h | 2 +- src/include/data.h | 8 +- src/include/lib/lib_2f8a0.h | 10 --- src/include/lib/rdp.h | 10 +++ src/include/types.h | 6 ++ src/lib/lib_09a80.c | 8 +- src/lib/lib_24e40.c | 2 - src/lib/lib_2f8a0.c | 141 ------------------------------------ src/lib/main.c | 26 +++---- src/lib/rdp.c | 113 +++++++++++++++++++++++++++++ 14 files changed, 154 insertions(+), 184 deletions(-) delete mode 100644 src/include/lib/lib_2f8a0.h create mode 100644 src/include/lib/rdp.h delete mode 100644 src/lib/lib_2f8a0.c create mode 100644 src/lib/rdp.c diff --git a/ld/libfiles.ntsc-beta.inc b/ld/libfiles.ntsc-beta.inc index 83286e410..63256bfce 100644 --- a/ld/libfiles.ntsc-beta.inc +++ b/ld/libfiles.ntsc-beta.inc @@ -58,7 +58,7 @@ build/ROMID/lib/lib_233c0.o (section); \ build/ROMID/lib/lib_24e40.o (section); \ build/ROMID/lib/lib_2f490.o (section); \ - build/ROMID/lib/lib_2f8a0.o (section); \ + build/ROMID/lib/rdp.o (section); \ build/ROMID/lib/lib_2fa00.o (section); \ build/ROMID/lib/ultra/audio/heap.o (section); \ build/ROMID/lib/lib_2fba0.o (section); \ diff --git a/ld/libfiles.ntsc-final.inc b/ld/libfiles.ntsc-final.inc index d0c41983d..f5d33b988 100644 --- a/ld/libfiles.ntsc-final.inc +++ b/ld/libfiles.ntsc-final.inc @@ -56,7 +56,7 @@ build/ROMID/lib/lib_233c0.o (section); \ build/ROMID/lib/lib_24e40.o (section); \ build/ROMID/lib/lib_2f490.o (section); \ - build/ROMID/lib/lib_2f8a0.o (section); \ + build/ROMID/lib/rdp.o (section); \ build/ROMID/lib/lib_2fa00.o (section); \ build/ROMID/lib/ultra/audio/heap.o (section); \ build/ROMID/lib/lib_2fba0.o (section); \ diff --git a/ld/libfiles.pal-final.inc b/ld/libfiles.pal-final.inc index cffda8ca3..b8606c807 100644 --- a/ld/libfiles.pal-final.inc +++ b/ld/libfiles.pal-final.inc @@ -56,7 +56,7 @@ build/ROMID/lib/lib_233c0.o (section); \ build/ROMID/lib/lib_24e40.o (section); \ build/ROMID/lib/lib_2f490.o (section); \ - build/ROMID/lib/lib_2f8a0.o (section); \ + build/ROMID/lib/rdp.o (section); \ build/ROMID/lib/lib_2fa00.o (section); \ build/ROMID/lib/ultra/audio/heap.o (section); \ build/ROMID/lib/lib_2fba0.o (section); \ diff --git a/src/include/PR/sched.h b/src/include/PR/sched.h index 17e987ac0..b29fe17c8 100644 --- a/src/include/PR/sched.h +++ b/src/include/PR/sched.h @@ -25,11 +25,7 @@ typedef struct OSScTask_s { OSTask list; OSMesgQueue *msgQ; OSMesg msg; -#ifndef _FINALROM /* all #ifdef items should */ - OSTime startTime; /* remain at the end!!, or */ - OSTime totalTime; /* possible conflict if */ -#endif /* FINALROM library used with */ -} OSScTask; /* non FINALROM code */ +} OSScTask; /* * OSScTask flags: diff --git a/src/include/bss.h b/src/include/bss.h index 3b16360d2..48990ed85 100644 --- a/src/include/bss.h +++ b/src/include/bss.h @@ -48,7 +48,7 @@ extern union filedataptr g_TileFileData; extern s32 g_TileNumRooms; extern u32 *g_TileRooms; extern u32 var8009a918; -extern u32 var8009a970[256]; +extern u8 g_RdpDramStack[SP_DRAM_STACK_SIZE8]; extern u32 var8009c2d0; extern struct var8009c340 var8009c340; extern u32 var8009c344; diff --git a/src/include/data.h b/src/include/data.h index 715585543..38d908652 100644 --- a/src/include/data.h +++ b/src/include/data.h @@ -80,11 +80,9 @@ extern u32 var8005f024; extern u32 var8005f030; extern u32 var8005f034; extern u32 var8005f038; -extern u16 *var8005f040; -extern u16 *var8005f044; -extern u32 var8005f048; -extern u32 var8005f0a8; -extern u32 var8005f108; +extern u16 *g_RdpOutBufferEnd; +extern u16 *g_RdpOutBufferStart; +extern struct rdptask *g_RdpCurTask; extern ALGlobals *var8005f110; extern ALGlobals *alGlobals; extern u32 var8005f120; diff --git a/src/include/lib/lib_2f8a0.h b/src/include/lib/lib_2f8a0.h deleted file mode 100644 index 8e7ab4ee2..000000000 --- a/src/include/lib/lib_2f8a0.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _IN_LIB_LIB_2F8A0_H -#define _IN_LIB_LIB_2F8A0_H -#include -#include "data.h" -#include "types.h" - -u32 rdpInit(void); -void func0002f8f4(Gfx *gdlstart, Gfx *gdlend, u32 arg2, void *arg3); - -#endif diff --git a/src/include/lib/rdp.h b/src/include/lib/rdp.h new file mode 100644 index 000000000..7c9bd8291 --- /dev/null +++ b/src/include/lib/rdp.h @@ -0,0 +1,10 @@ +#ifndef _IN_LIB_RDP_H +#define _IN_LIB_RDP_H +#include +#include "data.h" +#include "types.h" + +void rdpInit(void); +void rdpCreateTask(Gfx *gdlstart, Gfx *gdlend, u32 arg2, void *msg); + +#endif diff --git a/src/include/types.h b/src/include/types.h index 5b6508db6..6da5e258a 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -7187,4 +7187,10 @@ struct var80095210 { u16 unk32[45]; }; +struct rdptask { + OSScTask sctask; + u16 *framebuffer; + u32 unk5c; +}; + #endif diff --git a/src/lib/lib_09a80.c b/src/lib/lib_09a80.c index 60242d91e..8e32bda23 100644 --- a/src/lib/lib_09a80.c +++ b/src/lib/lib_09a80.c @@ -2133,15 +2133,15 @@ glabel func0000a044 /* a920: 3c018006 */ lui $at,%hi(var8005d5a0) /* a924: 11400006 */ beqz $t2,.L0000a940 /* a928: ac2ed5a0 */ sw $t6,%lo(var8005d5a0)($at) -/* a92c: 3c0f8006 */ lui $t7,%hi(var8005f108) -/* a930: 8deff108 */ lw $t7,%lo(var8005f108)($t7) +/* a92c: 3c0f8006 */ lui $t7,%hi(g_RdpCurTask) +/* a930: 8deff108 */ lw $t7,%lo(g_RdpCurTask)($t7) /* a934: 8d390028 */ lw $t9,0x28($t1) /* a938: 10000006 */ b .L0000a954 /* a93c: adf90058 */ sw $t9,0x58($t7) .L0000a940: /* a940: 3c18800a */ lui $t8,%hi(var8009cac0) -/* a944: 3c0e8006 */ lui $t6,%hi(var8005f108) -/* a948: 8dcef108 */ lw $t6,%lo(var8005f108)($t6) +/* a944: 3c0e8006 */ lui $t6,%hi(g_RdpCurTask) +/* a948: 8dcef108 */ lw $t6,%lo(g_RdpCurTask)($t6) /* a94c: 8f18cac0 */ lw $t8,%lo(var8009cac0)($t8) /* a950: add80058 */ sw $t8,0x58($t6) .L0000a954: diff --git a/src/lib/lib_24e40.c b/src/lib/lib_24e40.c index a38445274..44ff6d8a6 100644 --- a/src/lib/lib_24e40.c +++ b/src/lib/lib_24e40.c @@ -66,8 +66,6 @@ u32 var8009a964; u32 var8009a968; u32 var8009a96c; -u32 var8009a970[256]; - u32 var8005f030 = 0x00000000; u32 var8005f034 = 0x00000000; u32 var8005f038 = 0x00000000; diff --git a/src/lib/lib_2f8a0.c b/src/lib/lib_2f8a0.c deleted file mode 100644 index 91ff36091..000000000 --- a/src/lib/lib_2f8a0.c +++ /dev/null @@ -1,141 +0,0 @@ -#include -#include "constants.h" -#include "types.h" -#include "data.h" -#include "bss.h" -#include "lib/memory.h" - -u8 var8009ad70[0xb00]; - -u16 *var8005f040 = NULL; -u16 *var8005f044 = NULL; -u32 var8005f048 = 0x00000000; -u32 var8005f04c = 0x00000000; -u32 var8005f050 = 0x00000000; -u32 var8005f054 = 0x00000000; -u32 var8005f058 = 0x00000001; -u32 var8005f05c = 0x00000002; -u32 var8005f060 = 0x00000000; -u32 var8005f064 = 0x00000000; -u32 var8005f068 = 0x00000000; -u32 var8005f06c = 0x00001000; -u32 var8005f070 = 0x00000000; -u32 var8005f074 = 0x00000800; -u32 var8005f078 = (u32) &var8009a970; -u32 var8005f07c = 0x00000400; -u32 var8005f080 = 0x00000000; -u32 var8005f084 = 0x00000000; -u32 var8005f088 = 0x00000000; -u32 var8005f08c = 0x00000000; -u32 var8005f090 = 0x00000000; -u32 var8005f094 = 0x00000000; -u32 var8005f098 = 0x00000000; -u32 var8005f09c = 0x00000000; -u32 var8005f0a0 = 0x00000000; -u32 var8005f0a4 = 0x00000000; -u32 var8005f0a8 = 0x00000000; -u32 var8005f0ac = 0x00000000; -u32 var8005f0b0 = 0x00000000; -u32 var8005f0b4 = 0x00000000; -u32 var8005f0b8 = 0x00000001; -u32 var8005f0bc = 0x00000002; -u32 var8005f0c0 = 0x00000000; -u32 var8005f0c4 = 0x00000000; -u32 var8005f0c8 = 0x00000000; -u32 var8005f0cc = 0x00001000; -u32 var8005f0d0 = 0x00000000; -u32 var8005f0d4 = 0x00000800; -u32 var8005f0d8 = (u32) &var8009a970; -u32 var8005f0dc = 0x00000400; -u32 var8005f0e0 = 0x00000000; -u32 var8005f0e4 = 0x00000000; -u32 var8005f0e8 = 0x00000000; -u32 var8005f0ec = 0x00000000; -u32 var8005f0f0 = 0x00000000; -u32 var8005f0f4 = 0x00000000; -u32 var8005f0f8 = 0x00000000; -u32 var8005f0fc = 0x00000000; -u32 var8005f100 = 0x00000000; -u32 var8005f104 = 0x00000000; -u32 var8005f108 = (u32) &var8005f048; - -void rdpInit(void) -{ - s32 size = 0x10000; - - if (IS4MB()) { - size = 0x8000; - } - - var8005f044 = malloc(size, MEMPOOL_PERMANENT); - var8005f040 = (u16 *)((u32)var8005f044 + size); -} - -GLOBAL_ASM( -glabel func0002f8f4 -/* 2f8f4: 27bdffe0 */ addiu $sp,$sp,-32 -/* 2f8f8: 3c038006 */ lui $v1,%hi(var8005f108) -/* 2f8fc: 2463f108 */ addiu $v1,$v1,%lo(var8005f108) -/* 2f900: afa60028 */ sw $a2,0x28($sp) -/* 2f904: 8c660000 */ lw $a2,0x0($v1) -/* 2f908: 3c028006 */ lui $v0,%hi(rspbootTextStart) -/* 2f90c: 3c0e8006 */ lui $t6,%hi(rspbootTextEnd) -/* 2f910: 24429fe0 */ addiu $v0,$v0,%lo(rspbootTextStart) -/* 2f914: 25cea0b0 */ addiu $t6,$t6,%lo(rspbootTextEnd) -/* 2f918: afbf0014 */ sw $ra,0x14($sp) -/* 2f91c: 01c27823 */ subu $t7,$t6,$v0 -/* 2f920: acc20018 */ sw $v0,0x18($a2) -/* 2f924: 3c188006 */ lui $t8,%hi(gspTextStart) -/* 2f928: 3c198009 */ lui $t9,%hi(gspDataStart) -/* 2f92c: accf001c */ sw $t7,0x1c($a2) -/* 2f930: 24c20010 */ addiu $v0,$a2,0x10 -/* 2f934: 2718a0b0 */ addiu $t8,$t8,%lo(gspTextStart) -/* 2f938: 27399ad0 */ addiu $t9,$t9,%lo(gspDataStart) -/* 2f93c: ac580010 */ sw $t8,0x10($v0) -/* 2f940: ac590018 */ sw $t9,0x18($v0) -/* 2f944: 3c088006 */ lui $t0,%hi(var8005f044) -/* 2f948: 8d08f044 */ lw $t0,%lo(var8005f044)($t0) -/* 2f94c: 3c098006 */ lui $t1,%hi(var8005f040) -/* 2f950: 00a45023 */ subu $t2,$a1,$a0 -/* 2f954: ac480028 */ sw $t0,0x28($v0) -/* 2f958: 8d29f040 */ lw $t1,%lo(var8005f040)($t1) -/* 2f95c: 000a58c3 */ sra $t3,$t2,0x3 -/* 2f960: 3c0d800a */ lui $t5,%hi(var8009ad70) -/* 2f964: 000b60c0 */ sll $t4,$t3,0x3 -/* 2f968: 25adad70 */ addiu $t5,$t5,%lo(var8009ad70) -/* 2f96c: 240e0b00 */ addiu $t6,$zero,0xb00 -/* 2f970: ac440030 */ sw $a0,0x30($v0) -/* 2f974: ac4c0034 */ sw $t4,0x34($v0) -/* 2f978: ac4d0038 */ sw $t5,0x38($v0) -/* 2f97c: ac4e003c */ sw $t6,0x3c($v0) -/* 2f980: ac49002c */ sw $t1,0x2c($v0) -/* 2f984: 3c188009 */ lui $t8,%hi(var8008db30) -/* 2f988: 240f0063 */ addiu $t7,$zero,0x63 -/* 2f98c: 2718db30 */ addiu $t8,$t8,%lo(var8008db30) -/* 2f990: acc00000 */ sw $zero,0x0($a2) -/* 2f994: accf0008 */ sw $t7,0x8($a2) -/* 2f998: acd80050 */ sw $t8,0x50($a2) -/* 2f99c: acc70054 */ sw $a3,0x54($a2) -/* 2f9a0: 8c790000 */ lw $t9,0x0($v1) -/* 2f9a4: 8f280058 */ lw $t0,0x58($t9) -/* 2f9a8: acc8000c */ sw $t0,0xc($a2) -/* 2f9ac: 0c012048 */ jal osWritebackDCacheAll -/* 2f9b0: afa6001c */ sw $a2,0x1c($sp) -/* 2f9b4: 3c048009 */ lui $a0,%hi(g_SchedThread) -/* 2f9b8: 8fa5001c */ lw $a1,0x1c($sp) -/* 2f9bc: 0c0007ea */ jal __scHandleRetraceViaPri -/* 2f9c0: 2484dbd0 */ addiu $a0,$a0,%lo(g_SchedThread) -/* 2f9c4: 3c028006 */ lui $v0,%hi(var8005f108) -/* 2f9c8: 2442f108 */ addiu $v0,$v0,%lo(var8005f108) -/* 2f9cc: 8c490000 */ lw $t1,0x0($v0) -/* 2f9d0: 3c0a8006 */ lui $t2,%hi(var8005f048) -/* 2f9d4: 8fbf0014 */ lw $ra,0x14($sp) -/* 2f9d8: 254af048 */ addiu $t2,$t2,%lo(var8005f048) -/* 2f9dc: 3c0c8006 */ lui $t4,%hi(var8005f0a8) -/* 2f9e0: 258cf0a8 */ addiu $t4,$t4,%lo(var8005f0a8) -/* 2f9e4: 012a5826 */ xor $t3,$t1,$t2 -/* 2f9e8: 016c6826 */ xor $t5,$t3,$t4 -/* 2f9ec: ac4d0000 */ sw $t5,0x0($v0) -/* 2f9f0: 03e00008 */ jr $ra -/* 2f9f4: 27bd0020 */ addiu $sp,$sp,0x20 -); diff --git a/src/lib/main.c b/src/lib/main.c index edaced7be..738b30132 100644 --- a/src/lib/main.c +++ b/src/lib/main.c @@ -55,7 +55,7 @@ #include "lib/lib_13750.h" #include "lib/lib_13790.h" #include "lib/lib_233c0.h" -#include "lib/lib_2f8a0.h" +#include "lib/rdp.h" #include "lib/lib_2f490.h" #include "lib/lib_2fa00.h" #include "data.h" @@ -564,7 +564,7 @@ glabel mainInit /* d640: 24a5d990 */ addiu $a1,$a1,-9840 /* d644: 2484d968 */ addiu $a0,$a0,-9880 /* d648: 00003025 */ move $a2,$zero -/* d64c: 0c00bc7d */ jal func0002f8f4 +/* d64c: 0c00bc7d */ jal rdpCreateTask /* d650: 02003825 */ move $a3,$s0 /* d654: 8fa31490 */ lw $v1,0x1490($sp) /* d658: 24630001 */ addiu $v1,$v1,0x1 @@ -925,12 +925,12 @@ glabel mainInit /* d868: 0c0026d4 */ jal func00009b50 /* d86c: 02002025 */ or $a0,$s0,$zero /* d870: 8faa0048 */ lw $t2,0x48($sp) -/* d874: 3c018006 */ lui $at,%hi(var8005f044) +/* d874: 3c018006 */ lui $at,%hi(g_RdpOutBufferStart) /* d878: 3c048009 */ lui $a0,%hi(var8008db30) -/* d87c: ac2af044 */ sw $t2,%lo(var8005f044)($at) -/* d880: 3c018006 */ lui $at,%hi(var8005f040) +/* d87c: ac2af044 */ sw $t2,%lo(g_RdpOutBufferStart)($at) +/* d880: 3c018006 */ lui $at,%hi(g_RdpOutBufferEnd) /* d884: 254e0800 */ addiu $t6,$t2,0x800 -/* d888: ac2ef040 */ sw $t6,%lo(var8005f040)($at) +/* d888: ac2ef040 */ sw $t6,%lo(g_RdpOutBufferEnd)($at) /* d88c: 2484db30 */ addiu $a0,$a0,%lo(var8008db30) /* d890: 27a51470 */ addiu $a1,$sp,0x1470 /* d894: 0c0121bc */ jal osRecvMesg @@ -967,7 +967,7 @@ glabel mainInit /* d904: 24a5dcf0 */ addiu $a1,$a1,%lo(var8005dcf0) /* d908: 2484dcc8 */ addiu $a0,$a0,%lo(var8005dcc8) /* d90c: 00003025 */ or $a2,$zero,$zero -/* d910: 0c00be3d */ jal func0002f8f4 +/* d910: 0c00be3d */ jal rdpCreateTask /* d914: 02003825 */ or $a3,$s0,$zero /* d918: 8fa31488 */ lw $v1,0x1488($sp) /* d91c: 24630001 */ addiu $v1,$v1,0x1 @@ -1342,7 +1342,7 @@ glabel mainInit /* de1c: 24a5f610 */ addiu $a1,$a1,-2544 /* de20: 02402025 */ or $a0,$s2,$zero /* de24: 00003025 */ or $a2,$zero,$zero -/* de28: 0c00c411 */ jal func0002f8f4 +/* de28: 0c00c411 */ jal rdpCreateTask /* de2c: 8fa70054 */ lw $a3,0x54($sp) /* de30: 26100001 */ addiu $s0,$s0,0x1 /* de34: 2a010006 */ slti $at,$s0,0x6 @@ -1591,8 +1591,8 @@ const char var70053aa0[] = " -ml0 -me0 -mgfx100 -mvtx50 -mt700 -ma400"; // func0000aab0(2); // func00009b50(fb); // -// var8005f044 = texture; -// var8005f040 = texture + 0x400; // 0x800 bytes, because texture is u16 +// g_RdpOutBufferStart = texture; +// g_RdpOutBufferEnd = texture + 0x400; // 0x800 bytes, because texture is u16 // // while (osRecvMesg(&var8008db30, &sp1470, OS_MESG_NOBLOCK) == 0) { // // empty @@ -1607,7 +1607,7 @@ const char var70053aa0[] = " -ml0 -me0 -mgfx100 -mvtx50 -mt700 -ma400"; // // if (*(s16 *)sp1470 == 1) { // func0000a044(); -// func0002f8f4(var8005dcc8, var8005dcf0, 0, sp1450); +// rdpCreateTask(var8005dcc8, var8005dcf0, 0, sp1450); // j++; // } // } @@ -2647,7 +2647,7 @@ void mainTick(void) func0000a044(); } - func0002f8f4(gdlstart, gdl, 0, array); + rdpCreateTask(gdlstart, gdl, 0, array); var8005d9cc++; func00012a8c(); func0f16cf94(); @@ -3020,7 +3020,7 @@ glabel mainTick .NB0000ee3c: /* ee3c: 8fa50094 */ lw $a1,0x94($sp) /* ee40: 00003025 */ or $a2,$zero,$zero -/* ee44: 0c00c411 */ jal func0002f8f4 +/* ee44: 0c00c411 */ jal rdpCreateTask /* ee48: 27a70070 */ addiu $a3,$sp,0x70 /* ee4c: 3c028006 */ lui $v0,0x8006 /* ee50: 2442f2ec */ addiu $v0,$v0,-3348 diff --git a/src/lib/rdp.c b/src/lib/rdp.c new file mode 100644 index 000000000..e5310aefc --- /dev/null +++ b/src/lib/rdp.c @@ -0,0 +1,113 @@ +#include +#include "constants.h" +#include "types.h" +#include "data.h" +#include "bss.h" +#include "lib/memory.h" + +u8 g_RdpDramStack[SP_DRAM_STACK_SIZE8]; + +u8 g_RdpYieldData[0xb00]; + +u16 *g_RdpOutBufferEnd = NULL; +u16 *g_RdpOutBufferStart = NULL; + +struct rdptask g_RdpTaskA = { + { + // OSScTask + NULL, + 0, + 0, + 0, + { + // OSTask + M_GFXTASK, // type + OS_TASK_DP_WAIT, // flags + NULL, + 0, + NULL, + SP_UCODE_SIZE, // ucode_size + NULL, + SP_UCODE_DATA_SIZE, // ucode_data_size + (u64 *) &g_RdpDramStack, // dram_stack + SP_DRAM_STACK_SIZE8, // dram_stack_size + } + } +}; + +struct rdptask g_RdpTaskB = { + { + // OSScTask + NULL, + 0, + 0, + 0, + { + // OSTask + M_GFXTASK, // type + OS_TASK_DP_WAIT, // flags + NULL, + 0, + NULL, + SP_UCODE_SIZE, // ucode_size + NULL, + SP_UCODE_DATA_SIZE, // ucode_data_size + (u64 *) &g_RdpDramStack, // dram_stack + SP_DRAM_STACK_SIZE8, // dram_stack_size + } + } +}; + +struct rdptask *g_RdpCurTask = &g_RdpTaskA; + +extern u8 rspbootTextStart; +extern u8 rspbootTextEnd; +extern u8 gspTextStart; +extern u8 gspDataStart; + +void rdpInit(void) +{ + s32 size = 0x10000; + + if (IS4MB()) { + size = 0x8000; + } + + g_RdpOutBufferStart = malloc(size, MEMPOOL_PERMANENT); + g_RdpOutBufferEnd = (u16 *)((u32)g_RdpOutBufferStart + size); +} + +void rdpCreateTask(Gfx *gdlstart, Gfx *gdlend, u32 arg2, void *msg) +{ + OSScTask *sctask; + OSTask *task; + + sctask = &g_RdpCurTask->sctask; + task = &sctask->list; + + task->t.ucode_boot = (u64 *) &rspbootTextStart; + task->t.ucode_boot_size = (u32) (&rspbootTextEnd - &rspbootTextStart); + + if (rspbootTextStart); + + task->t.ucode = (u64 *) &gspTextStart; + task->t.ucode_data = (u64 *) &gspDataStart; + task->t.output_buff = (u64 *)g_RdpOutBufferStart; + task->t.output_buff_size = (u64 *)g_RdpOutBufferEnd; + task->t.data_ptr = (u64 *) gdlstart; + task->t.data_size = (gdlend - gdlstart) * sizeof(Gfx); + task->t.yield_data_ptr = (u64 *)&g_RdpYieldData; + task->t.yield_data_size = sizeof(g_RdpYieldData); + + sctask->next = NULL; + sctask->flags = OS_SC_NEEDS_RSP | OS_SC_NEEDS_RDP | OS_SC_LAST_TASK | OS_SC_SWAPBUFFER; + sctask->msgQ = &var8008db30; + sctask->msg = msg; + sctask->framebuffer = g_RdpCurTask->framebuffer; + + osWritebackDCacheAll(); + __scHandleRetraceViaPri(&g_SchedThread, sctask); + + // Swap g_RdpCurTask + g_RdpCurTask = (struct rdptask *)((u32)g_RdpCurTask ^ (u32) &g_RdpTaskA ^ (u32) &g_RdpTaskB); +}