Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
66883b9
Improve MSL matching progress
zcanann Apr 19, 2026
f195916
Match MSL float constants
zcanann Apr 19, 2026
a128acd
Match more MSL TRK units
zcanann Apr 19, 2026
caaf627
Match MSL runtime helpers
zcanann Apr 19, 2026
b910b60
Match more MSL TRK support
zcanann Apr 19, 2026
843a82c
Match TRK dispatch
zcanann Apr 19, 2026
1bc202f
Improve TRK message handler matching
zcanann Apr 19, 2026
0612210
Tighten TRK msghndlr matching
zcanann Apr 19, 2026
c8ab8d4
Match TRK main entry
zcanann Apr 19, 2026
6308469
Tighten TRK nubinit matching
zcanann Apr 20, 2026
e654a6e
Improve MSL signal and exit matching
zcanann Apr 20, 2026
81f78d7
Match TRK serial polling parser
zcanann Apr 20, 2026
62e215c
Import TRK file support helpers
zcanann Apr 20, 2026
1bf53bf
Tighten TRK support matching
zcanann Apr 20, 2026
2508fbd
Improve TRK msgbuf matching
zcanann Apr 20, 2026
b30334c
Tighten TRK msgbuf matching
zcanann Apr 20, 2026
3735d57
Match TRK serial polling data layout
zcanann Apr 20, 2026
2491459
Improve MSL rand match
zcanann Apr 20, 2026
a9770ba
Improve MSL direct_io fread match
zcanann Apr 20, 2026
cb0be3f
Improve MSL file_io donor import
zcanann Apr 20, 2026
e204593
Improve MSL wchar_io donor match
zcanann Apr 20, 2026
dfe5bff
Improve MSL arith abs match
zcanann Apr 20, 2026
0c8fa46
Improve MSL ctype donor trim
zcanann Apr 20, 2026
247a7ba
Improve MSL buffer_io donor import
zcanann Apr 20, 2026
e882d70
Improve MSL ansi_files donor import
zcanann Apr 20, 2026
7eabf0f
Improve MSL string donor import
zcanann Apr 20, 2026
c32ce13
Improve MSL extras strcmpi match
zcanann Apr 20, 2026
cc31688
Improve MSL strtoul atoi donor trim
zcanann Apr 20, 2026
036eba3
Improve MSL char_io donor import
zcanann Apr 20, 2026
d9b2ca6
Improve MSL mem donor compiler match
zcanann Apr 20, 2026
0399667
Improve MSL signal donor compiler match
zcanann Apr 20, 2026
e7e3f3f
Improve MSL mbstring donor compiler match
zcanann Apr 20, 2026
a52b3e9
Improve MSL FILE_POS compiler match
zcanann Apr 20, 2026
eb6c9f6
Improve MSL misc_io target surface
zcanann Apr 20, 2026
faa03f6
Improve MSL rand misc_io compiler match
zcanann Apr 20, 2026
7567aff
Improve MSL wchar_io compiler match
zcanann Apr 20, 2026
3d64548
Improve MSL runtime profile matches
zcanann Apr 20, 2026
0185192
Improve MSL donor runtime profile matches
zcanann Apr 20, 2026
e603507
Improve MSL string strncat match
zcanann Apr 20, 2026
4e21e4d
Improve MSL buffer_io load match
zcanann Apr 20, 2026
9077462
Improve MSL strtoul ctype table match
zcanann Apr 20, 2026
d1830f6
Improve MSL file_io close path match
zcanann Apr 20, 2026
a5a7b5d
Improve MSL file_io fopen config match
zcanann Apr 20, 2026
ac5fa3b
Improve MSL file_io mode parsing match
zcanann Apr 20, 2026
6b54b65
Improve MSL mem_funcs compiler match
zcanann Apr 20, 2026
dba34bf
Add MSL qsort donor import
zcanann Apr 20, 2026
887613c
Improve MSL scanf donor compiler match
zcanann Apr 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 49 additions & 34 deletions configure.py
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,21 @@
"-inline auto",
]

cflags_msl_gc13_runtime = [
*cflags_base,
"-use_lmw_stmw on",
"-str reuse,pool,readonly",
"-common off",
"-inline deferred,auto",
"-char signed",
"-lang=c",
]

cflags_msl_runtime_cpp = [
*cflags_runtime,
"-lang=c++",
]

# dolphin library flags
cflags_dolphin = [
*cflags_base,
Expand Down Expand Up @@ -843,13 +858,13 @@ def MatchingFor(*versions):
[
Object(NonMatching, "Runtime/__mem.c", extra_cflags=["-inline on, deferred"]),
Object(Matching, "Runtime/__va_arg.c"),
Object(NonMatching, "Runtime/global_destructor_chain.c"),
Object(Matching, "Runtime/global_destructor_chain.c"),
Object(NonMatching, "Runtime/New.cp"),
Object(NonMatching, "Runtime/NMWException.cp"),
Object(Matching, "Runtime/CPlusLibPPC.cp"),
Object(NonMatching, "Runtime/ptmf.c"),
Object(NonMatching, "Runtime/runtime.c"),
Object(NonMatching, "Runtime/__init_cpp_exceptions.cpp"),
Object(Matching, "Runtime/runtime.c"),
Object(Matching, "Runtime/__init_cpp_exceptions.cpp"),
Object(NonMatching, "Runtime/Gecko_ExceptionPPC.cp"),
Object(NonMatching, "Runtime/GCN_mem_alloc.c"),
]
Expand All @@ -860,33 +875,33 @@ def MatchingFor(*versions):
[
Object(NonMatching, "MSL_C/PPC_EABI/abort_exit.c"),
Object(NonMatching, "MSL_C/MSL_Common/alloc.c"),
Object(NonMatching, "MSL_C/MSL_Common/ansi_files.c"),
Object(NonMatching, "MSL_C/MSL_Common/ansi_files.c", mw_version="GC/1.3", cflags=cflags_msl_gc13_runtime),
Object(NonMatching, "MSL_C/MSL_Common_Embedded/ansi_fp.c"),
Object(NonMatching, "MSL_C/MSL_Common/arith.c"),
Object(NonMatching, "MSL_C/MSL_Common/arith.c", cflags=cflags_runtime),
Object(NonMatching, "MSL_C/MSL_Common/bsearch.c"),
Object(NonMatching, "MSL_C/MSL_Common/buffer_io.c"),
Object(NonMatching, "MSL_C/MSL_Common/buffer_io.c", cflags=cflags_runtime),
Object(Matching, "MSL_C/PPC_EABI/critical_regions.gamecube.c"),
Object(NonMatching, "MSL_C/MSL_Common/ctype.c"),
Object(NonMatching, "MSL_C/MSL_Common/direct_io.c"),
Object(NonMatching, "MSL_C/MSL_Common/ctype.c", cflags=cflags_runtime),
Object(NonMatching, "MSL_C/MSL_Common/direct_io.c", cflags=cflags_runtime),
Object(Matching, "MSL_C/MSL_Common/errno.c"),
Object(NonMatching, "MSL_C/MSL_Common/file_io.c"),
Object(NonMatching, "MSL_C/MSL_Common/FILE_POS.C"),
Object(NonMatching, "MSL_C/MSL_Common/locale.c"),
Object(NonMatching, "MSL_C/MSL_Common/mbstring.c"),
Object(NonMatching, "MSL_C/MSL_Common/mem.c"),
Object(NonMatching, "MSL_C/MSL_Common/mem_funcs.c"),
Object(NonMatching, "MSL_C/MSL_Common/misc_io.c"),
Object(NonMatching, "MSL_C/MSL_Common/file_io.c", cflags=cflags_runtime + ["-D_MSL_WIDE_CHAR"]),
Object(NonMatching, "MSL_C/MSL_Common/FILE_POS.C", cflags=cflags_msl_runtime_cpp),
Object(Matching, "MSL_C/MSL_Common/locale.c"),
Object(NonMatching, "MSL_C/MSL_Common/mbstring.c", mw_version="GC/1.3", cflags=cflags_msl_gc13_runtime),
Object(NonMatching, "MSL_C/MSL_Common/mem.c", mw_version="GC/1.3", cflags=cflags_msl_gc13_runtime),
Object(NonMatching, "MSL_C/MSL_Common/mem_funcs.c", cflags=cflags_runtime),
Object(NonMatching, "MSL_C/MSL_Common/misc_io.c", cflags=cflags_runtime),
Object(NonMatching, "MSL_C/MSL_Common/printf.c"),
Object(NonMatching, "MSL_C/MSL_Common/qsort.c"),
Object(NonMatching, "MSL_C/MSL_Common/rand.c"),
Object(NonMatching, "MSL_C/MSL_Common/scanf.c"),
Object(NonMatching, "MSL_C/MSL_Common/signal.c"),
Object(NonMatching, "MSL_C/MSL_Common/string.c"),
Object(NonMatching, "MSL_C/MSL_Common/rand.c", cflags=cflags_runtime),
Object(NonMatching, "MSL_C/MSL_Common/scanf.c", cflags=cflags_runtime + ["-inline deferred"]),
Object(NonMatching, "MSL_C/MSL_Common/signal.c", cflags=cflags_msl_gc13_runtime),
Object(NonMatching, "MSL_C/MSL_Common/string.c", cflags=cflags_runtime),
Object(NonMatching, "MSL_C/MSL_Common/strtold.c"),
Object(NonMatching, "MSL_C/MSL_Common/strtoul.c"),
Object(NonMatching, "MSL_C/MSL_Common/float.c"),
Object(NonMatching, "MSL_C/MSL_Common/char_io.c"),
Object(NonMatching, "MSL_C/MSL_Common/wchar_io.c"),
Object(NonMatching, "MSL_C/MSL_Common/strtoul.c", cflags=cflags_runtime),
Object(Matching, "MSL_C/MSL_Common/float.c"),
Object(NonMatching, "MSL_C/MSL_Common/char_io.c", cflags=cflags_runtime),
Object(NonMatching, "MSL_C/MSL_Common/wchar_io.c", cflags=cflags_runtime),
Object(NonMatching, "MSL_C/MSL_Common_Embedded/uart_console_io_gcn.c")
]
),
Expand Down Expand Up @@ -923,29 +938,29 @@ def MatchingFor(*versions):
Object(Matching, "MSL_C/MSL_Common_Embedded/Math/Double_precision/w_fmod.c"),
Object(Matching, "MSL_C/MSL_Common_Embedded/Math/Double_precision/w_log.c"),
Object(Matching, "MSL_C/MSL_Common_Embedded/Math/Double_precision/w_pow.c"),
Object(NonMatching, "MSL_C/PPC_EABI/math_ppc.c"),
Object(Matching, "MSL_C/PPC_EABI/math_ppc.c"),
]
),
trkLib(
"TRK_MINNOW_DOLPHIN",
[
Object(NonMatching, "debugger/embedded/MetroTRK/Portable/mainloop.c"),
Object(NonMatching, "debugger/embedded/MetroTRK/Portable/nubevent.c"),
Object(Matching, "debugger/embedded/MetroTRK/Portable/mainloop.c"),
Object(Matching, "debugger/embedded/MetroTRK/Portable/nubevent.c"),
Object(NonMatching, "debugger/embedded/MetroTRK/Portable/nubassrt.c"),
Object(NonMatching, "debugger/embedded/MetroTRK/Portable/nubinit.c"),
Object(NonMatching, "debugger/embedded/MetroTRK/Portable/nubinit.c", extra_cflags=["-sdata 0", "-sdata2 0"]),
Object(NonMatching, "debugger/embedded/MetroTRK/Portable/msg.c"),
Object(NonMatching, "debugger/embedded/MetroTRK/Portable/msgbuf.c"),
Object(NonMatching, "debugger/embedded/MetroTRK/Portable/serpoll.c"),
Object(NonMatching, "debugger/embedded/MetroTRK/Portable/dispatch.c"),
Object(NonMatching, "debugger/embedded/MetroTRK/Portable/msghndlr.c"),
Object(NonMatching, "debugger/embedded/MetroTRK/Portable/msgbuf.c", extra_cflags=["-sdata 0", "-sdata2 0"]),
Object(NonMatching, "debugger/embedded/MetroTRK/Portable/serpoll.c", extra_cflags=["-sdata 0", "-sdata2 0"]),
Object(Matching, "debugger/embedded/MetroTRK/Portable/dispatch.c", extra_cflags=["-sdata 0", "-sdata2 0"]),
Object(NonMatching, "debugger/embedded/MetroTRK/Portable/msghndlr.c", extra_cflags=["-sdata 0", "-sdata2 0"]),
Object(NonMatching, "debugger/embedded/MetroTRK/Portable/support.c"),
Object(Matching, "debugger/embedded/MetroTRK/Portable/mutex_TRK.c"),
Object(NonMatching, "debugger/embedded/MetroTRK/Portable/notify.c"),
Object(NonMatching, "debugger/embedded/MetroTRK/Portable/main_TRK.c"),
Object(Matching, "debugger/embedded/MetroTRK/Portable/notify.c"),
Object(Matching, "debugger/embedded/MetroTRK/Portable/main_TRK.c", extra_cflags=["-sdata 0", "-sdata2 0"]),
Object(NonMatching, "debugger/embedded/MetroTRK/Portable/mem_TRK.c"),
Object(NonMatching, "debugger/embedded/MetroTRK/Portable/string_TRK.c"),
Object(Matching, "debugger/embedded/MetroTRK/Processor/ppc/Generic/flush_cache.c"),
Object(NonMatching, "debugger/embedded/MetroTRK/Processor/ppc/Generic/__exception.s"),
Object(Matching, "debugger/embedded/MetroTRK/Processor/ppc/Generic/__exception.s"),
Object(NonMatching, "debugger/embedded/MetroTRK/Processor/ppc/Generic/targimpl.c"),
Object(Matching, "debugger/embedded/MetroTRK/Processor/ppc/Export/targsupp.s"),
Object(Matching, "debugger/embedded/MetroTRK/Processor/ppc/Generic/mpc_7xx_603e.c"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ extern "C" {
int fseek(FILE *stream, fpos_t offset, int whence);
int _fseek(FILE *stream, fpos_t offset, int whence);
int ftell(FILE *stream);
int _ftell(FILE *stream);
fpos_t _ftell(FILE *stream);

#ifdef __cplusplus
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
#include "types.h"
#include "PowerPC_EABI_Support/MSL_C/MSL_Common/ansi_files.h"

FILE* fopen(const char* filename, const char* mode);
int fclose(FILE* file);
int fflush(FILE* file);
int __get_file_modes(const char* mode, file_modes* modes);

#endif
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ MATH_INLINE int __fpclassifyf(f32 x)
return 4;
}

#ifndef MATH_API_SKIP_FPCLASSIFYD
MATH_INLINE int __fpclassifyd(f64 x)
{
switch (__HI(x) & 0x7ff00000)
Expand All @@ -83,6 +84,7 @@ MATH_INLINE int __fpclassifyd(f64 x)
}
return 4;
}
#endif

#define fpclassify(x) \
((sizeof(x) == sizeof(float)) ? __fpclassifyf((float)(x)) : __fpclassifyd((double)(x)))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
#ifndef _MSL_MATH_API_H
#define _MSL_MATH_API_H

#include "PowerPC_EABI_Support/MSL_C/MSL_Common/ansi_files.h"

extern void (*__stdio_exit)(void);

void clearerr(FILE* stream);
void __stdio_atexit();

#endif
2 changes: 1 addition & 1 deletion src/PowerPC_EABI_Support/src/MSL_C/MSL_Common/FILE_POS.C
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
#define SEEK_CUR (1)
#define SEEK_END (2)

int _ftell(FILE* file)
inline fpos_t _ftell(FILE* file)
{
int charsInUndoBuffer = 0;
int position;
Expand Down
98 changes: 97 additions & 1 deletion src/PowerPC_EABI_Support/src/MSL_C/MSL_Common/ansi_files.c
Original file line number Diff line number Diff line change
@@ -1,15 +1,30 @@
#include "types.h"
#include "string.h"
#include "PowerPC_EABI_Support/MSL_C/MSL_Common/alloc.h"
#include "PowerPC_EABI_Support/MSL_C/MSL_Common/ansi_files.h"
#include "PowerPC_EABI_Support/MSL_C/MSL_Common/file_io.h"
#include "PowerPC_EABI_Support/MSL_C/MSL_Common/critical_regions.h"

#ifndef _IONBF
#define _IONBF 0
#endif

#ifndef _IOFBF
#define _IOFBF 2
#endif

static char stdin_buff[0x100];
static char stdout_buff[0x100];
static char stderr_buff[0x100];

extern void fclose(FILE*);
extern int __read_console(u32, char*, u32*, void*);
extern int __write_console(u32, char*, u32*, void*);
extern int __close_console(u32);
extern int __position_file(__file_handle file, fpos_t* position, int mode, __ref_con ref_con);
extern int __read_file(__file_handle file, char* buff, size_t* count, __ref_con ref_con);
extern int __write_file(__file_handle file, char* buff, size_t* count, __ref_con ref_con);
extern int __close_file(__file_handle file);
extern int setvbuf(FILE* file, char* buffer, int mode, size_t size);

// clang-format off
FILE __files[4] =
Expand Down Expand Up @@ -113,6 +128,64 @@ FILE __files[4] =
};
// clang-format on

FILE* __find_unopened_file(void)
{
FILE* result;
FILE* prev;
FILE* file = __files[2].mNextFile;

while (file != NULL) {
if (file->mMode.file_kind == __closed_file) {
return file;
}
prev = file;
file = file->mNextFile;
}

result = (FILE*)malloc(sizeof(FILE));
if (result == NULL) {
result = NULL;
} else {
memset(result, 0, sizeof(FILE));
result->mIsDynamicallyAllocated = 1;
prev->mNextFile = result;
return result;
}

return result;
}

void __init_file(FILE* file, file_modes mode, unsigned char* buffer, unsigned long buffer_size)
{
file->mHandle = 0;
file->mMode = mode;

file->mState.io_state = __neutral;
file->mState.free_buffer = 0;
file->mState.eof = 0;
file->mState.error = 0;

file->mPosition = 0;

if (buffer_size != 0) {
setvbuf(file, (char*)buffer, _IOFBF, buffer_size);
} else {
setvbuf(file, NULL, _IONBF, 0);
}

file->mBufferPtr = file->mBuffer;
file->mBufferLength = 0;

if (file->mMode.file_kind == __disk_file) {
file->positionFunc = __position_file;
file->readFunc = __read_file;
file->writeFunc = __write_file;
file->closeFunc = __close_file;
}

file->ref_con = NULL;
}

void __close_all()
{
FILE* p = &__files[0];
Expand Down Expand Up @@ -157,3 +230,26 @@ u32 __flush_all()
};
return retval;
}

int __flush_line_buffered_output_files(void)
{
int result = 0;
FILE* file = &__files[0];
unsigned char* file_bytes;
unsigned short mode_bits;

while (file != NULL) {
file_bytes = (unsigned char*)file;
mode_bits = *(unsigned short*)(file_bytes + 4);
if ((((mode_bits >> 6) & 7) != 0) && (((file_bytes[4] >> 1) & 1) != 0) &&
(((file_bytes[8] & 0xE0) >> 5) == 1u)) {
if (fflush(file) != 0) {
result = -1;
}
}

file = file->mNextFile;
}

return result;
}
15 changes: 9 additions & 6 deletions src/PowerPC_EABI_Support/src/MSL_C/MSL_Common/arith.c
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
#include "PowerPC_EABI_Support/MSL_C/MSL_Common/arith.h"
#include "types.h"

long abs(long x)
typedef struct
{
if (x < 0)
return -x;
else
return x;
int quot;
int rem;
} div_t;

int abs(int n)
{
return ((n >> 31) ^ n) - (n >> 31);
}

long labs(long x)
Expand Down
Loading
Loading