diff --git a/include/stdarg.h b/include/stdarg.h new file mode 100644 index 00000000..aa7e3393 --- /dev/null +++ b/include/stdarg.h @@ -0,0 +1,42 @@ +#ifndef STDARG_H +#define STDARG_H + +// When not building with IDO, use the builtin vaarg macros for portability. +#ifndef __sgi +#define va_list __builtin_va_list +#define va_start __builtin_va_start +#define va_arg __builtin_va_arg +#define va_end __builtin_va_end +#else + +typedef char *va_list; +#define _FP 1 +#define _INT 0 +#define _STRUCT 2 + +#define _VA_FP_SAVE_AREA 0x10 +#define _VA_ALIGN(p, a) (((unsigned int)(((char *)p) + ((a) > 4 ? (a) : 4) - 1)) & -((a) > 4 ? (a) : 4)) +#define va_start(vp, parmN) (vp = ((va_list)&parmN + sizeof(parmN))) + +#define __va_stack_arg(list, mode) \ + ( \ + ((list) = (char *)_VA_ALIGN(list, __builtin_alignof(mode)) + \ + _VA_ALIGN(sizeof(mode), 4)), \ + (((char *)list) - (_VA_ALIGN(sizeof(mode), 4) - sizeof(mode)))) + +#define __va_double_arg(list, mode) \ + ( \ + (((long)list & 0x1) /* 1 byte aligned? */ \ + ? (list = (char *)((long)list + 7), (char *)((long)list - 6 - _VA_FP_SAVE_AREA)) \ + : (((long)list & 0x2) /* 2 byte aligned? */ \ + ? (list = (char *)((long)list + 10), (char *)((long)list - 24 - _VA_FP_SAVE_AREA)) \ + : __va_stack_arg(list, mode)))) + +#define va_arg(list, mode) ((mode *)(((__builtin_classof(mode) == _FP && \ + __builtin_alignof(mode) == sizeof(double)) \ + ? __va_double_arg(list, mode) \ + : __va_stack_arg(list, mode))))[-1] +#define va_end(__list) + +#endif +#endif diff --git a/lib/asm/non_matchings/unknown_0CA940/func_800C9D40.s b/lib/asm/non_matchings/unknown_0CA940/func_800C9D40.s deleted file mode 100644 index 348ec106..00000000 --- a/lib/asm/non_matchings/unknown_0CA940/func_800C9D40.s +++ /dev/null @@ -1,7 +0,0 @@ -glabel func_800C9D40 -/* 0CA940 800C9D40 AFA40000 */ sw $a0, ($sp) -/* 0CA944 800C9D44 AFA50004 */ sw $a1, 4($sp) -/* 0CA948 800C9D48 AFA60008 */ sw $a2, 8($sp) -/* 0CA94C 800C9D4C 03E00008 */ jr $ra -/* 0CA950 800C9D50 24020001 */ li $v0, 1 - diff --git a/lib/asm/non_matchings/unknown_0CA940/func_800C9D54.s b/lib/asm/non_matchings/unknown_0CA940/func_800C9D54.s deleted file mode 100644 index b513d761..00000000 --- a/lib/asm/non_matchings/unknown_0CA940/func_800C9D54.s +++ /dev/null @@ -1,22 +0,0 @@ -glabel func_800C9D54 -/* 0CA954 800C9D54 27BDFFE0 */ addiu $sp, $sp, -0x20 -/* 0CA958 800C9D58 AFA40020 */ sw $a0, 0x20($sp) -/* 0CA95C 800C9D5C AFBF0014 */ sw $ra, 0x14($sp) -/* 0CA960 800C9D60 AFA50024 */ sw $a1, 0x24($sp) -/* 0CA964 800C9D64 AFA60028 */ sw $a2, 0x28($sp) -/* 0CA968 800C9D68 AFA7002C */ sw $a3, 0x2c($sp) -/* 0CA96C 800C9D6C 3C04800D */ lui $a0, %hi(func_800C9D40) # $a0, 0x800d -/* 0CA970 800C9D70 24849D40 */ addiu $a0, %lo(func_800C9D40) # addiu $a0, $a0, -0x62c0 -/* 0CA974 800C9D74 27A70024 */ addiu $a3, $sp, 0x24 -/* 0CA978 800C9D78 8FA60020 */ lw $a2, 0x20($sp) -/* 0CA97C 800C9D7C 0C034FC4 */ jal _Printf -/* 0CA980 800C9D80 00002825 */ move $a1, $zero -/* 0CA984 800C9D84 8FBF0014 */ lw $ra, 0x14($sp) -/* 0CA988 800C9D88 27BD0020 */ addiu $sp, $sp, 0x20 -/* 0CA98C 800C9D8C 03E00008 */ jr $ra -/* 0CA990 800C9D90 00000000 */ nop - -/* 0CA994 800C9D94 00000000 */ nop -/* 0CA998 800C9D98 00000000 */ nop -/* 0CA99C 800C9D9C 00000000 */ nop - diff --git a/lib/src/unknown_0CA940.c b/lib/src/unknown_0CA940.c index 3467b96d..c0429a30 100644 --- a/lib/src/unknown_0CA940.c +++ b/lib/src/unknown_0CA940.c @@ -3,6 +3,14 @@ #include "types.h" #include "macros.h" +#include "stdarg.h" -GLOBAL_ASM("lib/asm/non_matchings/unknown_0CA940/func_800C9D40.s") -GLOBAL_ASM("lib/asm/non_matchings/unknown_0CA940/func_800C9D54.s") +s32 get_true(s32 arg0, s32 arg1, s32 arg2) { + return TRUE; +} + +void func_800C9D54(const char *format, ...) { + va_list args; + va_start(args, format); + _Printf(get_true, 0, format, args); +}