diff --git a/README.md b/README.md index a1d19a39..1eea9686 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# banjo (90.8926%) +# banjo (90.9653%) diff --git a/progress/progress_core1.svg b/progress/progress_core1.svg index a58392ac..1638b9e9 100644 --- a/progress/progress_core1.svg +++ b/progress/progress_core1.svg @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ core1 - 83.1424% - 83.1424% + 83.6434% + 83.6434% \ No newline at end of file diff --git a/progress/progress_total.svg b/progress/progress_total.svg index 228c61f1..7428843a 100644 --- a/progress/progress_total.svg +++ b/progress/progress_total.svg @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ Banjo-Kazooie (us.v10) - 90.8926% - 90.8926% + 90.9653% + 90.9653% \ No newline at end of file diff --git a/src/core1/code_1D00.c b/src/core1/code_1D00.c index 4f084103..027e7e85 100644 --- a/src/core1/code_1D00.c +++ b/src/core1/code_1D00.c @@ -460,7 +460,7 @@ s32 func_80240204(s32 addr, s32 len, void *state){ } temp_s0_3 = D_8027D5B0.unk8; if (temp_s0_3 == NULL) { - func_80247F24(2, 0x7D1, sp30, addr); + func_80247F24(2, 0x7D1); func_802483D8(); return osVirtualToPhysical(D_8027D5B0.unk4); } diff --git a/src/core1/code_3A70.c b/src/core1/code_3A70.c index cb04f4f2..094709a9 100644 --- a/src/core1/code_3A70.c +++ b/src/core1/code_3A70.c @@ -169,7 +169,77 @@ void func_802424D4(Gfx **gfx, Mtx **mtx, Vtx **vtx, f32 arg3[3], f32 arg4[3], f3 } } +#ifndef NONMATCHING #pragma GLOBAL_ASM("asm/nonmatchings/core1/code_3A70/func_80242BE8.s") +#else +void func_80242BE8(Gfx **gfx, Vtx **arg1, f32 arg2[2][2][2][3], s32 arg3[3], s32 *arg4, s32 arg5) { + f32 sp84[3]; + f32 *temp_a0; + f32 *var_v0; + f32 temp_f12; + f32 var_f18; + s32 temp_a2; + s32 var_a2; + s32 var_a3; + s32 var_t2; + s32 var_v1; + void *temp_v0; + void *temp_v0_10; + void *temp_v0_11; + void *temp_v0_12; + void *temp_v0_13; + void *temp_v0_14; + void *temp_v0_15; + void *temp_v0_16; + void *temp_v0_2; + void *temp_v0_3; + void *temp_v0_4; + void *temp_v0_5; + void *temp_v0_6; + void *temp_v0_7; + void *temp_v0_8; + void *temp_v0_9; -// BREAK???=== + func_8024C5CC(sp84); + gSPDisplayList((*gfx)++, D_80275880); + var_t2 = 0; + if(arg5){ + gSPSetGeometryMode((*gfx)++, G_CULL_BACK); + } + else{ + gSPSetGeometryMode((*gfx)++, G_CULL_FRONT); + } + gSPVertex((*gfx)++, *arg1, 8, 0); + for(var_t2 = 0; var_t2 < 2; var_t2++){ + for(var_a3 = 0; var_a3 < 2; var_a3++){ + for(var_v1 = 0; var_v1 < 2; var_v1++){ + (*arg1)->v.ob[0] = arg2[var_t2][var_a3][var_v1][0] - sp84[0]; + (*arg1)->v.ob[1] = arg2[var_t2][var_a3][var_v1][1] - sp84[1]; + (*arg1)->v.ob[2] = arg2[var_t2][var_a3][var_v1][2] - sp84[2]; + (*arg1)->v.flag = 0; + (*arg1)->v.tc[0] = 0; + (*arg1)->v.tc[1] = 0; + (*arg1)->v.cn[0] = 0; + (*arg1)->v.cn[1] = 0; + (*arg1)->v.cn[2] = 0; + (*arg1)->v.cn[3] = 0; + (*arg1)++; + } + } + } + gDPPipeSync((*gfx)++); + gDPSetPrimColor((*gfx)++, 0, 0, arg3[0], arg3[1], arg3[2], *arg4); + gSP2Triangles((*gfx)++, 7, 3, 5, 0, 5, 3, 1, 0); + gSP1Quadrangle((*gfx)++, 6, 4, 0, 2, 0); + gDPPipeSync((*gfx)++); + gDPSetPrimColor((*gfx)++, 0, 0, arg3[0], arg3[1], arg3[2], *arg4); + gSP1Quadrangle((*gfx)++, 7, 6, 2, 3, 0); + gSP2Triangles((*gfx)++, 4, 5, 0, 0, 5, 1, 0, 0); + + gDPPipeSync((*gfx)++); + gDPSetPrimColor((*gfx)++, 0, 0, arg3[0], arg3[1], arg3[2], *arg4); + gSP1Quadrangle((*gfx)++, 5, 4, 6, 7, 0); + gSP2Triangles((*gfx)++, 0, 1, 2, 0, 1, 3, 2, 0); +} +#endif diff --git a/src/core1/code_7F60.c b/src/core1/code_7F60.c index d16bf1ca..7d95f7ac 100644 --- a/src/core1/code_7F60.c +++ b/src/core1/code_7F60.c @@ -86,8 +86,49 @@ void func_80245F34(f32 *arg0, f32 *arg1, f32 *arg2) { *arg2 *= inv_len; } +#ifndef NONMATCHING void func_80245FB8(f32 mf[4][4], u16 *perspNorm, f32 fovy, f32 aspect, f32 near, f32 far, f32 scale); #pragma GLOBAL_ASM("asm/nonmatchings/core1/code_7F60/func_80245FB8.s") +#else +void func_80245FB8(float mf[4][4], u16 *perspNorm, float fovy, float aspect, float near, float far, float scale) +{ + float cot; + f32 tmp; + int i, j; + + near = (near < 1) ? 1 : near; + far = (far < near + 100) ? near + 100 : far; + tmp = ((2 * near * far) / (near - far)); + if( ( tmp*scale > 32767) || (tmp*scale < -32767)) { + tmp = ((tmp*scale > 32767) ? 32767.0f : -32767.0f); + near = (-(tmp/scale) * far) / ((2 * far) - (tmp/scale)); + } + + guMtxIdentF(mf); + fovy *= 3.1415926 / 180.0; + cot = cosf (fovy/2) / sinf (fovy/2); + mf[0][0] = cot / aspect; + mf[1][1] = cot; + mf[2][2] = (near + far) / (near - far); + mf[2][3] = -1; + mf[3][2] = ((2 * near * far) / (near - far)); + mf[3][3] = 0; + + for (i=0; i<4; i++) + for (j=0; j<4; j++) + mf[i][j] *= scale; + + if (perspNorm != (u16 *) NULL) { + if ((near + far)<=2.0) { + *perspNorm = (u16) 0xFFFF; + } else { + *perspNorm = (u16) ((2.0*65536.0)/(near + far)); + if (*perspNorm<=0) + *perspNorm = (u16) 0x0001; + } + } +} +#endif void guPerspective(Mtx *m, u16 *perspNorm, f32 fovy, f32 aspect, f32 near, f32 far, f32 scale) { f32 sp28[4][4]; diff --git a/src/core1/code_9D30.c b/src/core1/code_9D30.c index aaaddad6..b58a957a 100644 --- a/src/core1/code_9D30.c +++ b/src/core1/code_9D30.c @@ -25,8 +25,7 @@ extern u8 D_80275A74[]; extern u32 D_80275A7C[][2]; extern s16 D_80275BBC; - - +extern s16 D_80275BC0; extern s16 D_80275BC4; extern s16 D_80275BC8; @@ -34,15 +33,23 @@ extern s16 D_80275BC8; extern s16 D_80275BCC; extern s16 D_80275BD0; extern s16 D_80275BD4; +extern s16 D_80275BD8; +extern s16 D_80275BDC; extern u8 D_80275BE0; extern s32 D_80275BE4; - +extern u8 D_80275BE8[]; /* .bss */ s32 D_802806E0; s32 D_802806E4; s32 D_802806E8; s32 D_802806EC; +/* .h */ +void func_802484D0(void); +void func_8024856C(void); +void func_80248520(void); + +/* code */ void func_80247750(s32 r, s32 g, s32 b){ D_80275A68 = r; D_80275A6C = g; @@ -180,9 +187,53 @@ void func_80247CEC(s32 arg0, s32 arg1, s32 arg2) { func_80247A7C(arg0, arg1, arg2, 0, 1, D_80275A50[D_80275A74[arg0]][0], D_80275A50[D_80275A74[arg0]][1], D_80275A50[D_80275A74[arg0]][2]); } -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80247D80.s") +void func_80247D80(s32 arg0, s32 arg1, s32 arg2) { + s16 temp_v0; + s32 var_a1; + s32 var_s0; + s32 var_s1; + + D_80275BC4 = D_80275BBC; + D_80275BD4 = arg2; + if (arg1 < 0) { + func_80247CEC(arg0, 0x26, arg2); + arg1 *= -1; + } + + for(var_s0 = 1000000000; var_s0 >= 10 && arg1 < var_s0; var_s0 /= 10){ + continue; + } + + for(var_s0 = var_s0; var_s0 >= 10; var_s0 /= 10){ + for(var_a1 = 0; arg1 >= var_s0; var_a1++){ + arg1 -= var_s0; + } + func_80247CEC(arg0, var_a1, arg2); + } + + func_80247CEC(arg0, arg1, arg2); + func_8024856C(); + if (arg2 == 7) { + D_80275BD8 = D_80275BC4; + D_80275BDC = 0; + } + else if (D_80275BC4 >= D_80275BDC) { + D_80275BDC = D_80275BC4; + } +} + +void func_80247F24(s32 arg0, s32 arg1) { + D_80275BD0 = 0; + D_80275BCC = arg0; + D_80275BBC = 0xE; + D_80275BC8 = 0xA; + func_80247D80(arg0, arg1, 7); + func_802484D0(); + D_80275BC0 = D_80275BC8; + D_80275BDC = D_80275BBC; + D_80275BE0 = 1; +} -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80247F24.s") void func_80247F9C(s32 arg0){ func_80247D80(D_80275BCC, arg0, 2); @@ -193,7 +244,34 @@ void func_80247F9C(s32 arg0){ #pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80248098.s") -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_8024824C.s") +s32 func_8024824C(s32 arg0) { + if ((arg0 >= (s32) D_80275BE8[0]) && ((s32) D_80275BE8[1] >= arg0)) { + return (arg0 - D_80275BE8[0]) + 0xA; + } + + if ((arg0 >= (s32) D_80275BE8[2]) && ((s32) D_80275BE8[3] >= arg0)) { + return (arg0 - D_80275BE8[2]) + 0xA; + } + + if ((arg0 >= (s32) D_80275BE8[4]) && ((s32) D_80275BE8[5] >= arg0)) { + return (arg0 - D_80275BE8[4]); + } + + if (arg0 == D_80275BE8[6]) { + return 0x24; + } + if (arg0 == D_80275BE8[7]) { + return 0x25; + } + if (arg0 == D_80275BE8[8]) { + return 0x26; + } + if (arg0 == D_80275BE8[9]) { + return 0x27; + } + return 0x27; +} + #ifndef NONMATCHING #pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80248330.s") @@ -204,9 +282,13 @@ void func_80248330(u8 *arg0){ D_80275BC4 = D_80275BBC; D_80275BD4 = 2; - for(i = 0; arg0[i] != 0; i++){ - func_8024824C(arg0[i]); - func_80247CEC(D_80275BCC, arg0[i], 2); + i = 0; + val = arg0[i]; + while(arg0[i] != 0){ + val = arg0[i]; + func_8024824C(val); + func_80247CEC(D_80275BCC, val, 2); + i++; } func_80248520(); } @@ -235,15 +317,41 @@ void func_80248404(s32 arg0){ D_80275BD0 = 0; } -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80248444.s") +void func_80248444(s32 arg0) { + D_80275BC8 += arg0; + if (D_80275BC8 >= 0xCD) { + D_80275BBC = D_80275BDC + 4; + D_80275BC4 = D_80275BBC; + D_80275BC8 = (D_80275BD8 < D_80275BC4) ? 0xA : D_80275BC0; + D_80275BDC = 0; + } +} -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_802484D0.s") +void func_802484D0(void){ + func_80248444( D_80275BD4*5 + 2); +} -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80248500.s") +void func_80248500(void){ + func_80248444(2); +} -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80248520.s") +void func_80248520(void){ + func_8024856C(); + if(D_80275BC4 >= D_80275BDC){ + D_80275BDC = D_80275BC4; + } + func_802484D0(); +} + +void func_8024856C(void) { + s16 sp1E; + s16 temp_v0; + + sp1E = D_80275BC4--; + func_80247CEC(D_80275BCC, 0x27, D_80275BD4); + D_80275BC4 = sp1E; +} -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_8024856C.s") s32 func_802485BC(void){ return D_80275BD0; diff --git a/subyaml/core1.us.v10.yaml b/subyaml/core1.us.v10.yaml index 2eda65a3..c67e6e7c 100644 --- a/subyaml/core1.us.v10.yaml +++ b/subyaml/core1.us.v10.yaml @@ -285,8 +285,7 @@ segments: - [0x39C30, bin, data_39C30] # .rodata, code_3A70] - [0x39C40, .rodata, code_5650] - [0x39CA0, .rodata, code_72B0] - - [0x39CC0, bin, data_39CC0] - - [0x39CD0, .rodata, code_7F60] + - [0x39CC0, .rodata, code_7F60] - [0x39CE0, bin, data_39CE0] # .rodata, code_9D30] - [0x39D00, .rodata, done/code_CE60] - [0x39FD0, .rodata, code_EAF0]