diff --git a/src/800.c b/src/800.c index b194352210..cc567838c8 100644 --- a/src/800.c +++ b/src/800.c @@ -16258,7 +16258,115 @@ void func_8002F714(s32 a0, s32 a1) { } } -INCLUDE_ASM("asm/nonmatchings/800", func_8002F80C); +extern u8 D_8006A96E; +extern s16 D_8006A96C; +extern u8 D_800760D0; +extern u8 D_800760D4; +extern u8 D_800760D8; +extern u8 D_800760DC; +extern s8 D_800A4F17; +extern u8 D_800A4F18; +extern s16 D_800A4EFC; +extern void (*D_800A4F24)(void); + +extern void func_8002DC68(s32 a0, s32 a1); +extern void func_8002E138(s32 a0, s32 a1, s32 a2); +extern void func_80030F80(void); +extern void func_8002D320(void); +extern void func_80031BE0(void); + +void func_8002F80C(void) { + u8 flag; + s16 max; + u8 a0; + u8 v0; + + flag = 0; + max = 0; + if ((D_8006A96E & 1) != 0) { + flag = 1; + max = D_800760D0; + } + if ((D_8006A96E & 2) != 0) { + flag = 1; + if (max < D_800760D4) { + max = D_800760D4; + } + } + if ((D_8006A96E & 4) != 0) { + flag = 1; + if (max < D_800760D8) { + max = D_800760D8; + } + } + if ((D_8006A96E & 8) != 0) { + flag = 1; + if (max < D_800760DC) { + max = D_800760DC; + } + } + + a0 = D_8006A96E; + D_8006A96E = a0 & 0xF0; + + if (flag != 0) { + D_8006A96C = 0x10; + if (max != 0) { + func_8002DC68(0xBEB, max | 0x1000); + D_8006A96E |= 0x10; + return; + } + if ((a0 & 0x10) == 0) { + return; + } + D_800A4F17 = 1; + func_8002E138(4, 0xBEB, 0); + v0 = D_800A4F18; + D_800A4F17 = v0; + if (v0 != 0) { + s16 c = D_800A4EFC; + if (c != 0) { + D_800A4EFC = c - 1; + } + func_80030F80(); + func_8002D320(); + func_80031BE0(); + D_800A4F18 = 0; + D_800A4F17 = 0; + } + } else { + s16 t = D_8006A96C; + if (t == 0) { + return; + } + t = t - 1; + D_8006A96C = t; + if (t != 0) { + return; + } + if ((a0 & 0x10) == 0) { + return; + } + D_800A4F17 = 1; + func_8002E138(4, 0xBEB, 0); + v0 = D_800A4F18; + D_800A4F17 = v0; + if (v0 != 0) { + s16 c = D_800A4EFC; + if (c != 0) { + D_800A4EFC = c - 1; + } + func_80030F80(); + func_8002D320(); + func_80031BE0(); + D_800A4F18 = 0; + D_800A4F17 = 0; + } + } + + D_800A4F24 = 0; + D_8006A96E = D_8006A96E & 0xEF; +} INCLUDE_ASM("asm/nonmatchings/800", func_8002FA3C); diff --git a/src/800c3.c b/src/800c3.c index a4368efb09..cd4a460793 100644 --- a/src/800c3.c +++ b/src/800c3.c @@ -72,7 +72,21 @@ __asm__(".text\n.align 2\n.globl EnableEvent\n.ent\tEnableEvent\n" "nop\n" ".set\treorder\n.end\tEnableEvent\n"); -INCLUDE_ASM("asm/nonmatchings/800c3", DisableEvent); +__asm__( + ".text\n" + ".align 2\n" + ".globl DisableEvent\n" + ".ent\tDisableEvent\n" + "DisableEvent:\n" + ".frame $sp,0,$31\n" + ".set\tnoreorder\n" + "addiu $10, $0, 176\n" + "jr $10\n" + "addiu $9, $0, 13\n" + "nop\n" + ".set\treorder\n" + ".end\tDisableEvent\n" +); INCLUDE_ASM("asm/nonmatchings/800c3", ReturnFromException); diff --git a/src/boot.c b/src/boot.c index 9f9d9ae2de..4e1e4fd014 100644 --- a/src/boot.c +++ b/src/boot.c @@ -589,7 +589,40 @@ void func_80011E84(s32 a0) { D_80074790 = a0; } -INCLUDE_ASM("asm/nonmatchings/boot", func_80011EB4); +void func_80011EB4(void) { + extern s32 D_800629D0; + extern s32 D_80074788; + extern s32 D_80074790; + extern u16 D_80074794; + extern u16 D_80074798; + extern s32 func_80014B10(s32 a0); + extern s32 func_800149E0(s32 a0); + u16 local; + + switch (D_800629D0) { + case 0: + local = func_80014B10(0); + *(u16 *)(0x80700000 + D_80074788 * 2) = local; + D_80074788++; + local = func_800149E0(0); + *(u16 *)(0x80700000 + D_80074788 * 2) = local; + D_80074788++; + break; + case 1: + if (D_80074790 != 0) { + D_80074794 = *(u16 *)(D_80074790 + D_80074788++ * 2); + D_80074798 = *(u16 *)(D_80074790 + D_80074788++ * 2); + } else { + D_80074794 = 0; + D_80074798 = 0; + } + break; + case 2: + D_80074794 = *(u16 *)(0x80700000 + D_80074788++ * 2); + D_80074798 = *(u16 *)(0x80700000 + D_80074788++ * 2); + break; + } +} INCLUDE_ASM("asm/nonmatchings/boot", func_800120DC);