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]