summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Dolphin/os/__start.c150
1 files changed, 82 insertions, 68 deletions
diff --git a/src/Dolphin/os/__start.c b/src/Dolphin/os/__start.c
index 1113e15..cebb086 100644
--- a/src/Dolphin/os/__start.c
+++ b/src/Dolphin/os/__start.c
@@ -1,48 +1,52 @@
-// This file was taken from the Metroid Prime decompilation project.
-// https://github.com/PrimeDecomp/prime/blob/main/src/Dolphin/os/__start.c
+// This file was taken from the Super Mario Sunshine decompilation project.
+// https://github.com/doldecomp/sms/blob/master/src/os/__start.c
#include "dolphin/__start.h"
-#include "__ppc_eabi_linker.h"
-void __check_pad3(void) {
- if ((Pad3Button & 0x0eef) == 0x0eef) {
- OSResetSystem(OS_RESET_RESTART, 0, FALSE);
- }
- return;
+#pragma section code_type ".init"
+
+void __check_pad3(void)
+{
+ if ((Pad3Button & 0x0eef) == 0x0eef) {
+ OSResetSystem(OS_RESET_RESTART, 0, FALSE);
+ }
+ return;
}
-__declspec(weak) asm void __start(void) {
- // clang-format off
- nofralloc
+// clang-format off
+
+__declspec (weak) asm void __start(void)
+{
+ nofralloc
bl __init_registers
- bl __init_hardware
- li r0, -1
- stwu r1, -8(r1)
- stw r0, 4(r1)
- stw r0, 0(r1)
- bl __init_data
- li r0, 0
- lis r6, EXCEPTIONMASK_ADDR@ha
- addi r6, r6, EXCEPTIONMASK_ADDR@l
- stw r0, 0(r6)
- lis r6, BOOTINFO2_ADDR@ha
- addi r6, r6, BOOTINFO2_ADDR@l
- lwz r6, 0(r6)
+ bl __init_hardware
+ li r0, -1
+ stwu r1, -8(r1)
+ stw r0, 4(r1)
+ stw r0, 0(r1)
+ bl __init_data
+ li r0, 0
+ lis r6, EXCEPTIONMASK_ADDR@ha
+ addi r6, r6, EXCEPTIONMASK_ADDR@l
+ stw r0, 0(r6)
+ lis r6, BOOTINFO2_ADDR@ha
+ addi r6, r6, BOOTINFO2_ADDR@l
+ lwz r6, 0(r6)
_check_TRK:
- cmplwi r6, 0
- beq _load_lomem_debug_flag
- lwz r7, OS_BI2_DEBUGFLAG_OFFSET(r6)
- b _check_debug_flag
+ cmplwi r6, 0
+ beq _load_lomem_debug_flag
+ lwz r7, OS_BI2_DEBUGFLAG_OFFSET(r6)
+ b _check_debug_flag
_load_lomem_debug_flag:
lis r5, ARENAHI_ADDR@ha
addi r5, r5, ARENAHI_ADDR@l
- lwz r5, 0(r5)
- cmplwi r5, 0
- beq _goto_main
- lis r7, DEBUGFLAG_ADDR@ha
- addi r7, r7, DEBUGFLAG_ADDR@l
- lwz r7, 0(r7)
+ lwz r5, 0(r5)
+ cmplwi r5, 0
+ beq _goto_main
+ lis r7, DEBUGFLAG_ADDR@ha
+ addi r7, r7, DEBUGFLAG_ADDR@l
+ lwz r7, 0(r7)
_check_debug_flag:
li r5, 0
@@ -100,22 +104,21 @@ _end_of_parseargs:
beq _check_pad3
andi. r3, r3, 0x7fff
cmplwi r3, 1
- bne _goto_skip_init_bba
+ bne _skip_crc
_check_pad3:
bl __check_pad3
-_goto_skip_init_bba:
+_skip_crc:
bl __init_user
mr r3, r14
mr r4, r15
bl main
b exit
- // clang-format on
}
-asm static void __init_registers(void) {
- // clang-format off
+asm static void __init_registers(void)
+{
nofralloc
lis r1, _stack_addr@h
ori r1, r1, _stack_addr@l
@@ -124,40 +127,51 @@ asm static void __init_registers(void) {
lis r13, _SDA_BASE_@h
ori r13, r13, _SDA_BASE_@l
blr
- // clang-format on
}
-inline static void __copy_rom_section(void* dst, const void* src, unsigned long size) {
- if (size && (dst != src)) {
- memcpy(dst, src, size);
- __flush_cache(dst, size);
- }
+__declspec(section ".init") extern __rom_copy_info _rom_copy_info[];
+__declspec(section ".init") extern __bss_init_info _bss_init_info[];
+
+// clang-format on
+
+inline static void __copy_rom_section(void* dst, const void* src,
+ unsigned long size)
+{
+ if (size && (dst != src)) {
+ memcpy(dst, src, size);
+ __flush_cache(dst, size);
+ }
}
-inline static void __init_bss_section(void* dst, unsigned long size) {
- if (size) {
- memset(dst, 0, size);
- }
+inline static void __init_bss_section(void* dst, unsigned long size)
+{
+ if (size) {
+ memset(dst, 0, size);
+ }
}
#pragma scheduling off
-void __init_data(void) {
- __rom_copy_info* dci;
- __bss_init_info* bii;
-
- dci = _rom_copy_info;
- while (TRUE) {
- if (dci->size == 0)
- break;
- __copy_rom_section(dci->addr, dci->rom, dci->size);
- dci++;
- }
-
- bii = _bss_init_info;
- while (TRUE) {
- if (bii->size == 0)
- break;
- __init_bss_section(bii->addr, bii->size);
- bii++;
- }
+#pragma peephole off
+// peephole might have been turned off due to the inline asm peephole bug
+// which turns off peephole optimizations after an inline-asm function
+void __init_data(void)
+{
+ __rom_copy_info* dci;
+ __bss_init_info* bii;
+
+ dci = _rom_copy_info;
+ while (TRUE) {
+ if (dci->size == 0)
+ break;
+ __copy_rom_section(dci->addr, dci->rom, dci->size);
+ dci++;
+ }
+
+ bii = _bss_init_info;
+ while (TRUE) {
+ if (bii->size == 0)
+ break;
+ __init_bss_section(bii->addr, bii->size);
+ bii++;
+ }
}