diff --git a/compile_flags.txt b/compile_flags.txt new file mode 100644 index 0000000..669cc98 --- /dev/null +++ b/compile_flags.txt @@ -0,0 +1,5 @@ +-Iinclude +-Ilib/libreultra/include/2.0I +-D_LANGUAGE_C +-D_FINALROM +-DF3DEX_GBI_2 \ No newline at end of file diff --git a/include/common.h b/include/common.h index 50d1ead..edfe604 100644 --- a/include/common.h +++ b/include/common.h @@ -10,6 +10,8 @@ typedef u8 bool; #define false 0 #define true 1 +#define MAX_BYTES_TO_READ 512 + typedef struct { /* 0x00 */ s32 field_0x0; /* 0x04 */ s32 field_0x4; @@ -41,9 +43,116 @@ typedef struct { /* 0xc */ s32 field_0xc; } Stack__dma_load_loop; // size:0x10 -extern void romCopy(const void* src, const void* dst, const s32 len); +typedef struct { + /* 0x00 */ OSMesgQueue field_0x0; + /* 0x30 */ u8 field_0x30[0x58]; + /* 0x88 */ OSMesgQueue field_0x70; + /* 0x74 */ u8 field_0x74[0x20]; + /* 0xa8 */ OSMesgQueue field_0xa8; +} Unk0; -extern void Stack__dma_load_loop_new(Stack__dma_load_loop* arg0, OSMesgQueue* arg1, s16 arg2); + +extern SomethingMusic* __MAYBE_SONG_ARRAY_800A8218[7]; +extern void* musCurrentPtrBank; +extern void* D_800B1828; + +extern s32 D_800E8B14; +extern Unk0 MQ_800E8B4C; +extern s32 __SCREEN_IS_NOT_BLACK; +extern s32 D_800A9EB0; +extern s32 D_800A9EE0; +extern s32 D_800C4B20; +extern void* D_800C4CE0; +extern s32 D_A9EF0; +extern s32 D_800C4B30; + +extern OSPiHandle* CART_HANDLE; +extern OSMesgQueue MQ_800BE030; +extern OSMesg OSMESG_800BE048[0x32]; +extern OSThread THREAD_CONTROLLER; + +extern s32 __SCREEN_IS_NOT_BLACK; +extern OSMesg D_800BBE60[8]; + +extern OSMesgQueue MQ_CONTROLLER; +extern OSMesgQueue MQ_800E7988; +extern OSThread THREAD_CONTROLLER; + +extern OSPiHandle* PTR_CART_ROM_HANDLE; + +extern s32 D_800C4B30; +extern OSMesgQueue MQ_CONTROLLER; +extern OSMesgQueue MQ_800E9BF0; +extern u8 D_800A9FF8; + +extern OSContStatus __GLOBAL_CONT_STATUS[MAXCONTROLLERS]; +extern OSMesgQueue MQ_CONTROLLER; +extern void (*D_800A9FE0)(s16); +extern OSMesgQueue MQ_800C4A00; +extern OSContPad __GLOBAL_CONTROLLER_DATA; + +extern u8 D_800AA040; +extern void (*SWAP_BUFFER_FUNC_800A9E8C)(void** buffers); + +extern void (*D_800AA090)(s32); +extern void (*D_800AA094)(); +extern s32 D_800E79A4; +extern OSMesgQueue MQ_800C4C28; +extern OSMesg OSMESG_800BE1A0[8]; +extern u8 SP_THREAD_800BE1C0[1]; +extern OSThread THREAD_800BE1C0; +extern void* D_800AA41C; +extern u8 D_594284; + +extern void (*SWAP_BUFFER_FUNC)(void** buffers); + +extern Stack__dma_load_loop *D_800E9178[0]; +extern u8 __MAIN_NOT_NULL_INF_LOOP; +extern OSMesgQueue MQ_800B9C40; +extern s8 D_800E918D; + +extern void romCopy(const void* src, void* dst, u32 len); +extern void __calls_romCopy_8009DA50(u8* src, u8* dst, u32 len); + +extern void Stack__dma_load_loop_new(Stack__dma_load_loop* arg0, OSMesgQueue* arg1, s16 flags); extern void Stack__dma_load_loop_delete(Stack__dma_load_loop* arg0); +extern void obInitializePi(); + +extern void __set_black(); +extern void __calls_osViBlack(bool black); + +extern void __start_thread_800B9C88(); +extern void __start_thread_800BE1C0(); + +extern void func_80089804(s32*, s32, s32, s32); +extern void func_80089A10(); +extern void func_80089AB0(s32*, s32); + +extern void __osViSwapBuffer_3(void** buffers); +extern void set_swap_buffer_func(void (*arg0)(void**)); + +extern s32 func_80089CF8(s16 arg0, s32 arg1); +extern void __controller_thread_80089D9C(void*); + +extern void __start_copy_global_controller_data(void); +extern void __end_copy_global_controller_data(void); + +extern s32 __read_controller(OSContPad* data, u32 flags); +extern s32 __real_read_controller(void); +extern s32 __calls_read_controller_0(s16* arg0); + +extern void func_8008A354(); +extern void func_8008A37C(); + +extern void func_8008B130(u8*); +extern void func_8008B1D0(u8*); + +extern void __start_thread_800BE1C0(void); +extern void __thread_8008AFE0(void*); + +extern void func_8008949C(void** buffers); +extern void func_8008350C(); +extern void func_8008B1D0(u8*); + #endif \ No newline at end of file diff --git a/splat.yaml b/splat.yaml index ff2bbb2..5b070ac 100644 --- a/splat.yaml +++ b/splat.yaml @@ -106,7 +106,7 @@ segments: - [0x19FC0, c, "black"] - [0x1A050, c] - [0x1A4F0, asm] - - [0x1A5B0, asm] + - [0x1A5B0, c] - [0x1A660, c] - [0x1A9A0, c] - [0x1AA00, c] @@ -132,7 +132,7 @@ segments: - [0x1BCC0, asm, "libultra/io/pimgr"] - [0x1BE50, asm, "libultra/io/epirawdma"] - [0x1C040, asm, "libultra/io/epidma"] - - [0x1C0E0, asm] + - [0x1C0E0, c] - [0x1C130, asm] - [0x1C2B0, asm] - [0x1C670, asm, "libultra/io/piacs"] diff --git a/src/19050.c b/src/19050.c index 8e1ad83..99029a0 100644 --- a/src/19050.c +++ b/src/19050.c @@ -1,36 +1,18 @@ -#include "PR/os.h" #include "common.h" -void func_8008949C(void*); - INCLUDE_ASM(const s32, "19050", __idle_start_4_threads); /* 192F0 80088EF0*/ s32* func_80088EF0(void) { - extern s32 D_800E8B14; - return &D_800E8B14; } -typedef struct { - /* 0x00 */ OSMesgQueue field_0x0; - /* 0x30 */ u8 field_0x30[0x58]; - /* 0x88 */ OSMesgQueue field_0x70; - /* 0x74 */ u8 field_0x74[0x20]; - /* 0xa8 */ OSMesgQueue field_0xa8; -} Unk0; - -extern Unk0 MQ_800E8B4C; - Unk0* func_80088EFC(void) { return &MQ_800E8B4C; } INCLUDE_ASM(const s32, "19050", __thread_80088F08); -extern Stack__dma_load_loop *D_800E9178[0]; -extern u8 __MAIN_NOT_NULL_INF_LOOP; - /* 19454 80089054 */ void Stack__dma_load_loop_new(Stack__dma_load_loop* arg0, OSMesgQueue* mq, s16 flags) { @@ -60,8 +42,6 @@ INCLUDE_ASM(const s32, "19050", __thread_80089200); INCLUDE_ASM(const s32, "19050", __thread_80089358); -extern OSMesgQueue MQ_800B9C40; - void __thread_800893C0(void) { typedef struct { /* 0x00 */ s32 field_0x0; @@ -91,14 +71,30 @@ void __thread_800893C0(void) { } } +extern struct { + OSMesgQueue mq; + u8 padding[0x549]; + u8 b; +} D_800E8C2C; -INCLUDE_ASM(const s32, "19050", func_8008949C); - -// INCLUDE_ASM(const s32, "19050", func_80089528); - -void func_80089528(s8 arg0) { - extern s8 D_800E918D; +/* 1989C 8008949C */ +void func_8008949C(void** buffers) +{ + Stack__dma_load_loop sp10; + void* temp_s0 = buffers[3]; + if (D_800E8C2C.b != 1) + { + while(osViGetNextFramebuffer() == temp_s0 || osViGetCurrentFramebuffer() == temp_s0) + { + Stack__dma_load_loop_new(&sp10, &D_800E8C2C.mq, 1); + osRecvMesg(&D_800E8C2C.mq, NULL, 1); + Stack__dma_load_loop_delete(&sp10); + } + } +} + +void func_80089528(s8 arg0) { D_800E918D = arg0; } @@ -112,10 +108,7 @@ INCLUDE_ASM(const s32, "19050", __start_thread_800B9C88); INCLUDE_ASM(const s32, "19050", func_80089804); /* 19D90 80089990 */ -void func_80089990(s32 arg0) { - extern void func_80089A10(); - extern s32 D_800AA090; - +void func_80089990(void (*arg0)(s32)) { s32 mask; func_80089A10(); diff --git a/src/19DD0.c b/src/19DD0.c index c2bc66a..c4b43f7 100644 --- a/src/19DD0.c +++ b/src/19DD0.c @@ -1,10 +1,6 @@ #include "common.h" -#include - -extern void (*SWAP_BUFFER_FUNC)(void* buffers); - -void set_swap_buffer_func(void (*arg0)(void*)) { +void set_swap_buffer_func(void (*arg0)(void**)) { s32 mask; mask = osSetIntMask(OS_IM_NONE); diff --git a/src/1A050.c b/src/1A050.c index ae6558b..afcf539 100644 --- a/src/1A050.c +++ b/src/1A050.c @@ -1,15 +1,5 @@ #include "common.h" -void romCopy(const void* src, const void* dst, const s32 len); -s32 func_80089CF8(s16 arg0, s32 arg1); -void __controller_thread_80089D9C(void*); - -OSPiHandle* CART_HANDLE; -OSMesgQueue MQ_800BE030; -OSMesg OSMESG_800BE048[0x32]; -OSThread THREAD_CONTROLLER; - -extern s32 __SCREEN_IS_NOT_BLACK; void func_80089C50(void) { __SCREEN_IS_NOT_BLACK = 0x80; @@ -18,11 +8,6 @@ void func_80089C50(void) { // INCLUDE_ASM(const s32, "1A050", __init_controllers); -extern OSMesg D_800BBE60[8]; - -extern OSMesgQueue MQ_CONTROLLER; -extern OSThread THREAD_CONTROLLER; - /* 1A060 80089C60 */ u8 __init_controllers(void) { u8 pattern; @@ -40,12 +25,7 @@ u8 __init_controllers(void) { return pattern; } - -// INCLUDE_ASM(const s32, "1A050", func_80089CF8); - s32 func_80089CF8(s16 arg0, s32 arg1) { - extern OSMesgQueue MQ_800E7988; - typedef struct { /* 0x0 */ s16 unk0; /* 0x4 */ OSMesgQueue* msgQueue; @@ -61,7 +41,7 @@ s32 func_80089CF8(s16 arg0, s32 arg1) { msg.unkC = arg1; msg.msgQueue = &sp10; - osCreateMesgQueue(&sp10, &sp38, 1 /* size */); + osCreateMesgQueue(&sp10, &sp38, 1); osSendMesg(&MQ_800E7988, &msg, OS_MESG_BLOCK); osRecvMesg(&sp10, NULL, OS_MESG_BLOCK); @@ -77,17 +57,43 @@ void __start_controller_thread(void) { osStartThread(&THREAD_CONTROLLER); } - INCLUDE_ASM(const s32, "1A050", __controller_thread_80089D9C); -void initialise(void) { - extern s32 func_8008BD30(); - extern s32 D_800E7A20; - +void obInitializePi(void) { osCreatePiManager(OS_PRIORITY_PIMGR, &MQ_800BE030, OSMESG_800BE048, sizeof(OSMESG_800BE048) / sizeof(OSMesg)); - D_800E7A20 = func_8008BD30(); + PTR_CART_ROM_HANDLE = osCartRomInit(); +} + +/* 1A380 80089F80 */ +void romCopy(const void *src, void *dst, u32 len) { + OSIoMesg dmaIoMesgBuf; + + OSMesgQueue dmaMessageQ; + OSMesg dummyMesg; + u32 readlength; + + osCreateMesgQueue(&dmaMessageQ, &dummyMesg, 1); + dmaIoMesgBuf.hdr.pri = 0; + dmaIoMesgBuf.hdr.retQueue = &dmaMessageQ; + osInvalDCache(dst, len); + while (len != 0) { + readlength = len; + if (readlength > MAX_BYTES_TO_READ) { + readlength = MAX_BYTES_TO_READ; + } + + dmaIoMesgBuf.devAddr = (u32)src; + dmaIoMesgBuf.dramAddr = dst; + dmaIoMesgBuf.size = readlength; + // Start the DMA transfer + osEPiStartDma(PTR_CART_ROM_HANDLE, &dmaIoMesgBuf, 0); + // Wait for the DMA transfer to complete + osRecvMesg(&dmaMessageQ, &dummyMesg, 1); + src += readlength; + dst += readlength; + len -= readlength; + } } -INCLUDE_ASM(const s32, "1A050", romCopy); INCLUDE_ASM(const s32, "1A050", func_8008A040); diff --git a/src/1A5B0.c b/src/1A5B0.c new file mode 100644 index 0000000..5569894 --- /dev/null +++ b/src/1A5B0.c @@ -0,0 +1,30 @@ +#include "common.h" + +/* 1A5B0 8008A1B0 */ +void func_8008A1B0(void) { + struct { + /* 0x00 */ s32 field_0x0; + /* 0x04 */ void* field_0x4; + /* 0x08 */ s32 field_0x8; + /* 0x0c */ s32 field_0xc; + /* 0x10 */ s32 field_0x10; + /* 0x14 */ s32 field_0x14; + } sp10; + u8 pad[0x7F0]; + + __start_thread_800BE1C0(); + func_80089AB0(&D_800A9EE0, 3); + D_800C4B20 = 0x80000400; + set_swap_buffer_func(&__osViSwapBuffer_3); + D_800C4CE0 = &D_800A9EB0; + __start_thread_800B9C88(); + sp10.field_0x0 = 0xDE000000; + sp10.field_0x4 = &D_A9EF0; + sp10.field_0x8 = 0xE9000000; + sp10.field_0xc = 0; + sp10.field_0x10 = 0xDF000000; + sp10.field_0x14 = 0; + func_80089804(&sp10, 0x18, 0, 0); + func_80089A10(); +} + diff --git a/src/1A660.c b/src/1A660.c index 6e4ac76..dfa7797 100644 --- a/src/1A660.c +++ b/src/1A660.c @@ -1,24 +1,8 @@ #include "common.h" -void __start_copy_global_controller_data(void); -void __end_copy_global_controller_data(void); - -s32 __read_controller(OSContPad* data, u32 flags); -s32 __real_read_controller(void); -s32 __calls_read_controller_0(s16* arg0); - -extern void func_8008A354(); -extern void func_8008A37C(); - -extern s32 D_800C4B30; -extern OSMesgQueue MQ_CONTROLLER; -extern OSMesgQueue MQ_800E9BF0; INCLUDE_ASM(const s32, "1A660", func_8008A260); -extern void func_8008B1D0(u8*); -extern u8 D_800A9FF8; - void func_8008A334(void) { func_8008B1D0(&D_800A9FF8); } @@ -49,9 +33,6 @@ s32 __read_controller(OSContPad* data, u32 flags) { return 0; } -extern OSContStatus __GLOBAL_CONT_STATUS[MAXCONTROLLERS]; -extern OSMesgQueue MQ_CONTROLLER; - s32 __real_read_controller(void) { s32 var_v0; @@ -65,9 +46,6 @@ s32 __real_read_controller(void) { } } -extern void (*D_800A9FE0)(s16); -extern OSMesgQueue MQ_800C4A00; -extern OSContPad __GLOBAL_CONTROLLER_DATA; s32 __calls_read_controller_0(s16* arg0) { if (D_800C4B30 == 0) { diff --git a/src/1A9A0.c b/src/1A9A0.c index 34a07c4..2dddda4 100644 --- a/src/1A9A0.c +++ b/src/1A9A0.c @@ -1,7 +1,5 @@ #include "common.h" -extern s32 D_800C4B30; - void func_8008A5A0(void) { s32 temp_v0; diff --git a/src/1AA00.c b/src/1AA00.c index c147952..cf59e9c 100644 --- a/src/1AA00.c +++ b/src/1AA00.c @@ -1,26 +1,15 @@ #include "common.h" -#include - -extern OSContPad __GLOBAL_CONTROLLER_DATA; - -extern void __end_copy_global_controller_data(); -extern void __start_copy_global_controller_data(); - void __copy_global_controller_data(OSContPad* arg0) { __start_copy_global_controller_data(); bcopy(&__GLOBAL_CONTROLLER_DATA, arg0, 0x18); __end_copy_global_controller_data(); } -extern void func_80089CF8(s32, s32); - void func_8008A640(void) { func_80089CF8(0x103, 0); } -extern void(*D_800A9FE0)(s16); - void __set_fp_8008A660(void(*arg0)(s16)) { s32 mask; diff --git a/src/1AAA0.c b/src/1AAA0.c index ebdd9fd..8c0537d 100644 --- a/src/1AAA0.c +++ b/src/1AAA0.c @@ -1,13 +1,9 @@ #include "common.h" -extern void func_8008B130(u8*); -extern u8 D_800AA040; - void func_8008A6A0(void) { func_8008B130(&D_800AA040); } -extern void func_8008B1D0(u8*); void func_8008A6C0(void) { func_8008B1D0(&D_800AA040); diff --git a/src/1B3A0.c b/src/1B3A0.c index 6c4835a..da144fb 100644 --- a/src/1B3A0.c +++ b/src/1B3A0.c @@ -1,9 +1,7 @@ #include "common.h" -extern void (*SWAP_BUFFER_FUNC_800A9E8C)(void*); - /* 1B3A0 8008AFA0 */ -void set_swap_buffer_func_800A9E8C(void (*arg0)(void*)) { +void set_swap_buffer_func_800A9E8C(void (*arg0)(void**)) { s32 mask; mask = osSetIntMask(OS_IM_NONE); diff --git a/src/1B3E0.c b/src/1B3E0.c index 3e2fe47..1290dc2 100644 --- a/src/1B3E0.c +++ b/src/1B3E0.c @@ -1,14 +1,5 @@ #include "common.h" -void __start_thread_800BE1C0(void); -void __thread_8008AFE0(void*); - -extern void (*D_800AA090)(s32); -extern void (*D_800AA094)(); -extern s32 D_800E79A4; -extern OSMesgQueue MQ_800C4C28; -extern OSMesg OSMESG_800BE1A0[8]; - /* 1B3E0 8008AFE0 */ void __thread_8008AFE0(void* arg0) { Stack__dma_load_loop sp10; @@ -39,9 +30,6 @@ void __thread_8008AFE0(void* arg0) { } void __start_thread_800BE1C0(void) { - extern u8 SP_THREAD_800BE1C0[1]; - extern OSThread THREAD_800BE1C0; - osCreateThread(&THREAD_800BE1C0, 4, __thread_8008AFE0, NULL, SP_THREAD_800BE1C0, 0x32); osStartThread(&THREAD_800BE1C0); } diff --git a/src/1C0E0.c b/src/1C0E0.c new file mode 100644 index 0000000..d701df3 --- /dev/null +++ b/src/1C0E0.c @@ -0,0 +1,19 @@ +#include "common.h" + +#include + +/* 1C0E0 8008BCE0 */ +s32 func_8008BCE0(void** arg0) { + // Use of `__osDisableInt()` and `__osRestoreInt()` + // suggest that this is an library function. + + void* temp_v1; + u32 mask; + + mask = __osDisableInt(); + temp_v1 = D_800AA41C; + D_800AA41C = arg0; + *arg0 = temp_v1; + __osRestoreInt(mask); + return 0; +} diff --git a/src/2DE10.c b/src/2DE10.c index af34072..9c6e4db 100644 --- a/src/2DE10.c +++ b/src/2DE10.c @@ -2,10 +2,8 @@ INCLUDE_ASM(const s32, "2DE10", func_8009DA10); -// INCLUDE_ASM(const s32, "2DE10", __calls_romCopy_8009DA50); /* 2DE50 8009DA50 */ -void __calls_romCopy_8009DA50(u8* src, u8* dst, u32 len) -{ +void __calls_romCopy_8009DA50(u8* src, u8* dst, u32 len) { u8 sp1F[32]; u8* _dst; u8* _src; @@ -13,25 +11,16 @@ void __calls_romCopy_8009DA50(u8* src, u8* dst, u32 len) // align to 16 _src = (u8*) (((u32) &sp1F[15] >> 4) << 4); - - if (len < 0x10) - { - _dst = dst; - - // copy into stack, length aligned to 2 bytes - romCopy(src, _src, (len + 1) & ~1); - len--; - // then copy from stack into destination - while(len != -1) - { + if (len < 16) { + _dst = dst; + // Copy into stack, length aligned to 2 bytes... + romCopy(src, _src, (len + 1) & ~1); + // ...then copy from stack into destination + for(len--; len != -1; len--) *_dst++ = *_src++; - len--; - } - } - else - { - // too big to fit in our stack, so just do a regular copy + } else { + // Too big to fit in our stack, so just do a regular copy romCopy(src, dst, (len + 1) & ~1); } } @@ -43,8 +32,6 @@ INCLUDE_ASM(const s32, "2DE10", __calls_romCopy_8009DAF4); INCLUDE_ASM(const s32, "2DE10", __calls_romCopy_8009DBB8); -extern u8 D_594284; - void* __add_0x594284(s32 arg0) { return arg0 + &D_594284; } diff --git a/src/black.c b/src/black.c index 78f7fe4..bb41504 100644 --- a/src/black.c +++ b/src/black.c @@ -1,13 +1,7 @@ -#include "PR/os.h" #include "common.h" -void __set_black(); -void __calls_osViBlack(bool black); - /* 19FC0 80089BC0 */ void __set_black() { - extern s32 __SCREEN_IS_NOT_BLACK; - __SCREEN_IS_NOT_BLACK = 0; __calls_osViBlack(true); } diff --git a/src/boot.c b/src/boot.c index aa2b755..35caf75 100644 --- a/src/boot.c +++ b/src/boot.c @@ -15,7 +15,6 @@ void boot(void) { void idle(void* arg) { extern void main_(void*); extern void __idle_start_4_threads(s32, s32); - extern void initialise(); extern void (*D_800E7A18)(); extern u8 SP_THREAD_FIRST_DMA_LOAD[1]; @@ -24,7 +23,7 @@ void idle(void* arg) { D_800E7A18 = NULL; - initialise(); + obInitializePi(); __idle_start_4_threads(2, 1); osViSetSpecialFeatures(OS_VI_DIVOT_ON | OS_VI_DITHER_FILTER_ON | OS_VI_GAMMA_OFF | OS_VI_GAMMA_DITHER_OFF); diff --git a/src/main.c b/src/main.c index a989f30..02b2566 100644 --- a/src/main.c +++ b/src/main.c @@ -45,7 +45,7 @@ INCLUDE_ASM(const s32, "main", func_80072398); INCLUDE_ASM(const s32, "main", func_80072710); -INCLUDE_ASM(const s32, "main", func_80072738); +INCLUDE_ASM(const s32, "main", __set_vi_mode); INCLUDE_ASM(const s32, "main", func_800727D8); @@ -105,10 +105,6 @@ INCLUDE_ASM(const s32, "main", __calls_copy_controller_data); extern u8 __reset_compared_osTvType(); /* extern */ extern void* D_800C4BB8; -extern OSViMode osViModeMpalHpf1; -extern OSViMode osViModeMpalLan1; -extern OSViMode osViModeNtscHpf1; -extern OSViMode osViModeNtscLan1; #define OS_TV_TYPE_PAL 0 #define OS_TV_TYPE_NTSC 1 @@ -190,7 +186,6 @@ INCLUDE_ASM(const s32, "main", func_80073F58); // INCLUDE_ASM(const s32, "main", func_80073FD4); -extern SomethingMusic* __MAYBE_SONG_ARRAY_800A8218[7]; /* 43D4 80073FD4 */ void __initialize_song_mem(void) { s32 mask; diff --git a/src/mus.c b/src/mus.c index 4efc208..f911f69 100644 --- a/src/mus.c +++ b/src/mus.c @@ -1,9 +1,5 @@ #include "common.h" -extern void* musCurrentPtrBank; - -void func_8008350C(); - INCLUDE_ASM(const s32, "mus", func_800810F0); INCLUDE_ASM(const s32, "mus", func_8008123C); @@ -46,9 +42,6 @@ void Mus__unknown_80081DB4(void* arg0) { } } - -extern void* D_800B1828; - void* func_80081DF0(void* arg0) { if ((arg0 != NULL) && ((*(s32*)(arg0 + 0x10)) < 0)) { D_800B1828 = arg0; diff --git a/symbol_addrs.txt b/symbol_addrs.txt index b7edd41..3ec0929 100644 --- a/symbol_addrs.txt +++ b/symbol_addrs.txt @@ -6,6 +6,10 @@ __add_0x594284 = 0x8009DD28; __log_lha_error = 0x8007BB90; +CartRomHandle = 0x800C4C50; +osCartRomInit = 0x8008BD30; +PTR_CART_ROM_HANDLE = 0x800E7A20; + D_800A81C0 = 0x800A81C0; // size:0x30 D_800C4BBC = 0x800C4BBC; // size:0x8 D_800AEFE0 = 0x800AEFE0; // size:0x8 @@ -25,6 +29,7 @@ STR_rb = 0x800AE0A8; // type:asciz STR_wb = 0x800AE27C; // type:asciz STR_Unknown_method_skiped = 0x800AE284; // type:asciz +__set_vi_mode = 0x80072738; __calls_osViSwapBuffer_8007307C = 0x8007307C; __osViSwapBuffer_3 = 0x8008B110; @@ -353,7 +358,7 @@ __Mus_thread_80085908 = 0x80085908; THREAD_IDLE = 0x800AF440; idle = 0x8007F8E4; -initialise = 0x80089F40; +obInitializePi = 0x80089F40; boot = 0x8007F880; entry = 0x80070C00; diff --git a/tools/m2ctx.py b/tools/m2ctx.py new file mode 100644 index 0000000..b2450f8 --- /dev/null +++ b/tools/m2ctx.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 + +import argparse +import os +import sys +import subprocess +import tempfile + +script_dir = os.path.dirname(os.path.realpath(__file__)) +root_dir = os.path.abspath(os.path.join(script_dir, "..")) +src_dir = root_dir + "src/" + +# Project-specific +CPP_FLAGS = [ + "-Iinclude", + "-Isrc", + "-Ilib/libreultra/include/2.0I/", + "-D_LANGUAGE_C", + "-DF3DEX_GBI_2", + "-D_MIPS_SZLONG=32", + "-DSCRIPT(...)={}", + "-D__attribute__(...)=", + "-D__asm__(...)=", + "-ffreestanding", + "-DM2CTX", +] + +def import_c_file(in_file) -> str: + in_file = os.path.relpath(in_file, root_dir) + cpp_command = ["gcc", "-E", "-P", "-dM", *CPP_FLAGS, in_file] + cpp_command2 = ["gcc", "-E", "-P", *CPP_FLAGS, in_file] + + with tempfile.NamedTemporaryFile(suffix=".c") as tmp: + stock_macros = subprocess.check_output(["gcc", "-E", "-P", "-dM", tmp.name], cwd=root_dir, encoding="utf-8") + + out_text = "" + try: + out_text += subprocess.check_output(cpp_command, cwd=root_dir, encoding="utf-8") + out_text += subprocess.check_output(cpp_command2, cwd=root_dir, encoding="utf-8") + except subprocess.CalledProcessError: + print( + "Failed to preprocess input file, when running command:\n" + + ' '.join(cpp_command), + file=sys.stderr, + ) + sys.exit(1) + + if not out_text: + print("Output is empty - aborting") + sys.exit(1) + + for line in stock_macros.strip().splitlines(): + out_text = out_text.replace(line + "\n", "") + return out_text + +def main(): + parser = argparse.ArgumentParser( + description="""Create a context file which can be used for mips_to_c""" + ) + parser.add_argument( + "c_file", + help="""File from which to create context""", + ) + args = parser.parse_args() + + output = import_c_file(args.c_file) + + with open(os.path.join(root_dir, "ctx.c"), "w", encoding="UTF-8") as f: + f.write(output) + + +if __name__ == "__main__": + main() diff --git a/undefined_syms.txt b/undefined_syms.txt index 7bd4e21..991ad72 100644 --- a/undefined_syms.txt +++ b/undefined_syms.txt @@ -37,4 +37,5 @@ D_80187020 = 0x80187020; D_80187030 = 0x80187030; D_8018F1A0 = 0x8018F1A0; D_8018FC18 = 0x8018FC18; -D_800EB0E8 = 0x800EB0E8; \ No newline at end of file +D_800EB0E8 = 0x800EB0E8; +D_800E8C2C = 0x800E8C2C; \ No newline at end of file