Decompile quaternion0f096ca0

This commit is contained in:
Ryan Dwyer
2022-02-21 17:51:29 +10:00
parent cddb56f173
commit a2940dde6b
8 changed files with 81 additions and 149 deletions
+12 -16
View File
@@ -1565,15 +1565,11 @@ void bbikeTick(void)
Mtxf sp164;
Mtxf sp124;
Mtxf spe4;
u32 stack3;
struct coord spd4;
u32 stack4;
struct coord spc4;
f32 spd4[4];
f32 spc4[4];
f32 spb4[4];
u32 stack5;
struct coord spa4;
u32 stack6;
struct coord sp94;
f32 spa4[4];
f32 sp94[4];
f32 sp84[4];
struct coord pos;
f32 breathing;
@@ -1700,10 +1696,10 @@ void bbikeTick(void)
mtx3ToMtx4(obj->realrot, &sp124);
mtx00015f04(1.0f / obj->model->scale, &sp124);
mtx4LoadYRotation(hoverpropGetTurnAngle(obj), &spe4);
func0f097044(&spe4, &spd4);
func0f097044(&sp124, &spc4);
func0f0976c0(&spc4, &spd4);
func0f0972b8(&spd4, &spc4, 0.8f, spb4);
func0f097044(&spe4, spd4);
func0f097044(&sp124, spc4);
func0f0976c0(spc4, spd4);
func0f0972b8(spd4, spc4, 0.8f, spb4);
func0f096ed4(spb4, &sp124);
mtx4MultMtx4InPlace(&sp124, &sp164);
@@ -1731,10 +1727,10 @@ void bbikeTick(void)
-1, 0, 0, 0, NULL, -1, NULL, -1, -1, -1, -1);
}
func0f097044(&g_Vars.currentplayer->bondentermtx, &spa4);
func0f097044(&sp164, &sp94);
func0f0976c0(&sp94, &spa4);
func0f0972b8(&spa4, &sp94, 1.0f - g_Vars.currentplayer->bondentert2, sp84);
func0f097044(&g_Vars.currentplayer->bondentermtx, spa4);
func0f097044(&sp164, sp94);
func0f0976c0(sp94, spa4);
func0f0972b8(spa4, sp94, 1.0f - g_Vars.currentplayer->bondentert2, sp84);
func0f096ed4(sp84, &sp164);
}
+6 -8
View File
@@ -2067,10 +2067,8 @@ void bmoveUpdateHead(f32 arg0, f32 arg1, f32 arg2, Mtxf *arg3, f32 arg4)
f32 sp244 = 0;
Mtxf sp180;
Mtxf sp116;
u32 stack;
struct coord sp100;
u32 stack2;
struct coord sp84;
f32 sp100[4];
f32 sp84[4];
f32 sp68[4];
if (g_Vars.currentplayer->isdead == false) {
@@ -2106,10 +2104,10 @@ void bmoveUpdateHead(f32 arg0, f32 arg1, f32 arg2, Mtxf *arg3, f32 arg4)
mtx4MultMtx4InPlace(&sp116, &sp180);
if (arg3) {
func0f097044(&sp180, &sp100);
func0f097044(arg3, &sp84);
func0f0976c0(&sp100, &sp84);
func0f0972b8(&sp100, &sp84, arg4, sp68);
func0f097044(&sp180, sp100);
func0f097044(arg3, sp84);
func0f0976c0(sp100, sp84);
func0f0972b8(sp100, sp84, arg4, sp68);
func0f096ed4(sp68, &sp180);
}
+21 -78
View File
@@ -19,85 +19,28 @@ const u32 var7f1ab88c[] = {0x00000000};
u32 var8006afa0 = 0x00000001;
u32 var8006afa4 = 0x00000002;
void quaternion0f096ca0(struct coord *angle, f32 quat[4])
{
f32 cosx = cosf(angle->f[0] * 0.5f);
f32 sinx = sinf(angle->f[0] * 0.5f);
f32 cosy = cosf(angle->f[1] * 0.5f);
f32 siny = sinf(angle->f[1] * 0.5f);
f32 cosz = cosf(angle->f[2] * 0.5f);
f32 sinz = sinf(angle->f[2] * 0.5f);
f32 cosx_cosy = cosx * cosy;
f32 cosx_siny = cosx * siny;
f32 sinx_cosy = sinx * cosy;
f32 sinx_siny = sinx * siny;
quat[0] = cosx_cosy * cosz + sinx_siny * sinz;
quat[1] = sinx_cosy * cosz - cosx_siny * sinz;
quat[2] = cosx_siny * cosz + sinx_cosy * sinz;
quat[3] = cosx_cosy * sinz - sinx_siny * cosz;
}
GLOBAL_ASM(
glabel func0f096ca0
/* f096ca0: 27bdffc0 */ addiu $sp,$sp,-64
/* f096ca4: f7b40018 */ sdc1 $f20,0x18($sp)
/* f096ca8: afbf0024 */ sw $ra,0x24($sp)
/* f096cac: afb00020 */ sw $s0,0x20($sp)
/* f096cb0: afa50044 */ sw $a1,0x44($sp)
/* f096cb4: 3c013f00 */ lui $at,0x3f00
/* f096cb8: 4481a000 */ mtc1 $at,$f20
/* f096cbc: c4840000 */ lwc1 $f4,0x0($a0)
/* f096cc0: 00808025 */ or $s0,$a0,$zero
/* f096cc4: 46142302 */ mul.s $f12,$f4,$f20
/* f096cc8: 0c0068f4 */ jal cosf
/* f096ccc: 00000000 */ nop
/* f096cd0: e7a0003c */ swc1 $f0,0x3c($sp)
/* f096cd4: c6060000 */ lwc1 $f6,0x0($s0)
/* f096cd8: 46143302 */ mul.s $f12,$f6,$f20
/* f096cdc: 0c0068f7 */ jal sinf
/* f096ce0: 00000000 */ nop
/* f096ce4: e7a00038 */ swc1 $f0,0x38($sp)
/* f096ce8: c6080004 */ lwc1 $f8,0x4($s0)
/* f096cec: 46144302 */ mul.s $f12,$f8,$f20
/* f096cf0: 0c0068f4 */ jal cosf
/* f096cf4: 00000000 */ nop
/* f096cf8: e7a00034 */ swc1 $f0,0x34($sp)
/* f096cfc: c60a0004 */ lwc1 $f10,0x4($s0)
/* f096d00: 46145302 */ mul.s $f12,$f10,$f20
/* f096d04: 0c0068f7 */ jal sinf
/* f096d08: 00000000 */ nop
/* f096d0c: e7a00030 */ swc1 $f0,0x30($sp)
/* f096d10: c6040008 */ lwc1 $f4,0x8($s0)
/* f096d14: 46142302 */ mul.s $f12,$f4,$f20
/* f096d18: 0c0068f4 */ jal cosf
/* f096d1c: 00000000 */ nop
/* f096d20: c6060008 */ lwc1 $f6,0x8($s0)
/* f096d24: e7a0002c */ swc1 $f0,0x2c($sp)
/* f096d28: 46143302 */ mul.s $f12,$f6,$f20
/* f096d2c: 0c0068f7 */ jal sinf
/* f096d30: 00000000 */ nop
/* f096d34: c7a8003c */ lwc1 $f8,0x3c($sp)
/* f096d38: c7aa0034 */ lwc1 $f10,0x34($sp)
/* f096d3c: c7b40038 */ lwc1 $f20,0x38($sp)
/* f096d40: c7a40030 */ lwc1 $f4,0x30($sp)
/* f096d44: 460a4082 */ mul.s $f2,$f8,$f10
/* f096d48: c7b2002c */ lwc1 $f18,0x2c($sp)
/* f096d4c: 8fa20044 */ lw $v0,0x44($sp)
/* f096d50: 4604a402 */ mul.s $f16,$f20,$f4
/* f096d54: 00000000 */ nop
/* f096d58: 46121182 */ mul.s $f6,$f2,$f18
/* f096d5c: 00000000 */ nop
/* f096d60: 46008202 */ mul.s $f8,$f16,$f0
/* f096d64: 46083280 */ add.s $f10,$f6,$f8
/* f096d68: e44a0000 */ swc1 $f10,0x0($v0)
/* f096d6c: c7a40034 */ lwc1 $f4,0x34($sp)
/* f096d70: c7a80030 */ lwc1 $f8,0x30($sp)
/* f096d74: c7a6003c */ lwc1 $f6,0x3c($sp)
/* f096d78: 4604a382 */ mul.s $f14,$f20,$f4
/* f096d7c: 00000000 */ nop
/* f096d80: 46083302 */ mul.s $f12,$f6,$f8
/* f096d84: 00000000 */ nop
/* f096d88: 46127282 */ mul.s $f10,$f14,$f18
/* f096d8c: 00000000 */ nop
/* f096d90: 46006102 */ mul.s $f4,$f12,$f0
/* f096d94: 46045181 */ sub.s $f6,$f10,$f4
/* f096d98: 46126202 */ mul.s $f8,$f12,$f18
/* f096d9c: 00000000 */ nop
/* f096da0: 46007282 */ mul.s $f10,$f14,$f0
/* f096da4: e4460004 */ swc1 $f6,0x4($v0)
/* f096da8: 46001182 */ mul.s $f6,$f2,$f0
/* f096dac: 460a4100 */ add.s $f4,$f8,$f10
/* f096db0: 46128202 */ mul.s $f8,$f16,$f18
/* f096db4: e4440008 */ swc1 $f4,0x8($v0)
/* f096db8: 46083281 */ sub.s $f10,$f6,$f8
/* f096dbc: e44a000c */ swc1 $f10,0xc($v0)
/* f096dc0: 8fbf0024 */ lw $ra,0x24($sp)
/* f096dc4: 8fb00020 */ lw $s0,0x20($sp)
/* f096dc8: d7b40018 */ ldc1 $f20,0x18($sp)
/* f096dcc: 03e00008 */ jr $ra
/* f096dd0: 27bd0040 */ addiu $sp,$sp,0x40
glabel func0f096dd4
/* f096dd4: 3c013f00 */ lui $at,0x3f00
/* f096dd8: 44812000 */ mtc1 $at,$f4
/* f096ddc: 27bdffe0 */ addiu $sp,$sp,-32
+10 -10
View File
@@ -3866,7 +3866,7 @@ glabel var7f1b3c40pf
/* f0f4a80: e7b00294 */ swc1 $f16,0x294($sp)
/* f0f4a84: c6060528 */ lwc1 $f6,0x528($s0)
/* f0f4a88: e7ae02d0 */ swc1 $f14,0x2d0($sp)
/* f0f4a8c: 0fc25af0 */ jal func0f096ca0
/* f0f4a8c: 0fc25af0 */ jal quaternion0f096ca0
/* f0f4a90: e7a60298 */ swc1 $f6,0x298($sp)
/* f0f4a94: c6040548 */ lwc1 $f4,0x548($s0)
/* f0f4a98: 02202025 */ move $a0,$s1
@@ -3875,7 +3875,7 @@ glabel var7f1b3c40pf
/* f0f4aa4: c612054c */ lwc1 $f18,0x54c($s0)
/* f0f4aa8: e7b20294 */ swc1 $f18,0x294($sp)
/* f0f4aac: c6080550 */ lwc1 $f8,0x550($s0)
/* f0f4ab0: 0fc25af0 */ jal func0f096ca0
/* f0f4ab0: 0fc25af0 */ jal quaternion0f096ca0
/* f0f4ab4: e7a80298 */ swc1 $f8,0x298($sp)
/* f0f4ab8: c7ae02d0 */ lwc1 $f14,0x2d0($sp)
/* f0f4abc: 27b1029c */ addiu $s1,$sp,0x29c
@@ -5475,7 +5475,7 @@ glabel var7f1b2948
/* f0f4344: e7aa0294 */ swc1 $f10,0x294($sp)
/* f0f4348: c6060528 */ lwc1 $f6,0x528($s0)
/* f0f434c: e7ae02d0 */ swc1 $f14,0x2d0($sp)
/* f0f4350: 0fc25b28 */ jal func0f096ca0
/* f0f4350: 0fc25b28 */ jal quaternion0f096ca0
/* f0f4354: e7a60298 */ swc1 $f6,0x298($sp)
/* f0f4358: c6080548 */ lwc1 $f8,0x548($s0)
/* f0f435c: 02202025 */ or $a0,$s1,$zero
@@ -5484,7 +5484,7 @@ glabel var7f1b2948
/* f0f4368: c604054c */ lwc1 $f4,0x54c($s0)
/* f0f436c: e7a40294 */ swc1 $f4,0x294($sp)
/* f0f4370: c60a0550 */ lwc1 $f10,0x550($s0)
/* f0f4374: 0fc25b28 */ jal func0f096ca0
/* f0f4374: 0fc25b28 */ jal quaternion0f096ca0
/* f0f4378: e7aa0298 */ swc1 $f10,0x298($sp)
/* f0f437c: c7ae02d0 */ lwc1 $f14,0x2d0($sp)
/* f0f4380: 27b1029c */ addiu $s1,$sp,0x29c
@@ -7084,7 +7084,7 @@ glabel var7f1b2948
/* f0f0e88: e7aa02bc */ swc1 $f10,0x2bc($sp)
/* f0f0e8c: c6260528 */ lwc1 $f6,0x528($s1)
/* f0f0e90: e7ae02f8 */ swc1 $f14,0x2f8($sp)
/* f0f0e94: 0fc2530c */ jal func0f096ca0
/* f0f0e94: 0fc2530c */ jal quaternion0f096ca0
/* f0f0e98: e7a602c0 */ swc1 $f6,0x2c0($sp)
/* f0f0e9c: c6280548 */ lwc1 $f8,0x548($s1)
/* f0f0ea0: 02002025 */ or $a0,$s0,$zero
@@ -7093,7 +7093,7 @@ glabel var7f1b2948
/* f0f0eac: c624054c */ lwc1 $f4,0x54c($s1)
/* f0f0eb0: e7a402bc */ swc1 $f4,0x2bc($sp)
/* f0f0eb4: c62a0550 */ lwc1 $f10,0x550($s1)
/* f0f0eb8: 0fc2530c */ jal func0f096ca0
/* f0f0eb8: 0fc2530c */ jal quaternion0f096ca0
/* f0f0ebc: e7aa02c0 */ swc1 $f10,0x2c0($sp)
/* f0f0ec0: c7ae02f8 */ lwc1 $f14,0x2f8($sp)
/* f0f0ec4: 27b002c4 */ addiu $s0,$sp,0x2c4
@@ -8005,7 +8005,7 @@ glabel var7f1b2948
// f32 sp2f8;
// s32 sp2f4;
// f32 sp2d0;
// struct coord sp2bc;
// f32 sp2bc[4];
// struct coord sp2ac;
// f32 sp29c;
// struct coord sp290;
@@ -8280,14 +8280,14 @@ glabel var7f1b2948
// sp290.y = thing->unk524;
// sp290.z = thing->unk528;
//
// func0f096ca0(&sp290, &sp2bc);
// quaternion0f096ca0(&sp290, sp2bc);
//
// sp290.x = thing->unk548;
// sp290.y = thing->unk54c;
// sp290.z = thing->unk550;
//
// func0f096ca0(&sp290, &sp2ac);
// func0f0972b8(&sp2bc, &sp2ac, sp2d0, &sp29c);
// quaternion0f096ca0(&sp290, &sp2ac);
// func0f0972b8(sp2bc, &sp2ac, sp2d0, &sp29c);
// func0f096ed4(&sp29c, &sp350);
// } else {
// sp398.x = thing->unk520 = thing->unk548;
+14 -17
View File
@@ -2114,10 +2114,8 @@ void playerTickCutscene(bool arg0)
f32 sp104;
Mtxf spc4;
Mtxf sp84;
u32 stack1;
struct coord sp74;
u32 stack2;
struct coord sp64;
f32 sp74[4];
f32 sp64[4];
f32 sp54[4];
if (arg0) {
@@ -2209,10 +2207,10 @@ void playerTickCutscene(bool arg0)
mtx00016d58(&sp84, 0, 0, 0,
-g_Vars.bond->bond2.unk1c.x, -g_Vars.bond->bond2.unk1c.y, -g_Vars.bond->bond2.unk1c.z,
g_Vars.bond->bond2.unk28.x, g_Vars.bond->bond2.unk28.y, g_Vars.bond->bond2.unk28.z);
func0f097044(&spc4, &sp74);
func0f097044(&sp84, &sp64);
func0f0976c0(&sp64, &sp74);
func0f0972b8(&sp74, &sp64, sp104, sp54);
func0f097044(&spc4, sp74);
func0f097044(&sp84, sp64);
func0f0976c0(sp64, sp74);
func0f0972b8(sp74, sp64, sp104, sp54);
func0f096ed4(sp54, &sp11c);
up.x = sp11c.m[1][0];
@@ -3977,13 +3975,12 @@ void playerTick(bool arg0)
Mtxf sp1fc;
Mtxf sp1bc;
Mtxf sp17c;
f32 fVar20;
f32 targetspeed;
f32 sp174;
f32 sp15c[6];
f32 sp14c[4];
f32 sp13c[4];
f32 targetspeed;
struct coord sp12c;
f32 sp12c[4];
f32 prevspeed;
f32 sp11c[3];
bool explode = false;
@@ -4078,10 +4075,10 @@ void playerTick(bool arg0)
sp174 = -stickx * g_Vars.lvupdate240f * 0.00025f;
#endif
fVar20 = sqrtf(sp2ac.f[0] * sp2ac.f[0] + sp2ac.f[2] * sp2ac.f[2]);
f20 = sqrtf(sp2ac.f[0] * sp2ac.f[0] + sp2ac.f[2] * sp2ac.f[2]);
sp2ac.x /= fVar20;
sp2ac.z /= fVar20;
sp2ac.x /= f20;
sp2ac.z /= f20;
f20 = sinf(fVar22);
@@ -4155,8 +4152,8 @@ void playerTick(bool arg0)
projectile->speed.z = (projectile->speed.z * newspeed) / prevspeed;
mtx3ToMtx4(sp2b8, &sp1bc);
func0f097044(&sp1bc, &sp12c);
func0f097738(sp13c, sp12c.f, sp11c);
func0f097044(&sp1bc, sp12c);
func0f097738(sp13c, sp12c, sp11c);
func0f096ed4(sp11c, &sp17c);
mtx4ToMtx3(&sp17c, sp2b8);
@@ -4617,7 +4614,7 @@ void playerTick(bool arg0)
if (var8007074c) {
s8 contpad1 = optionsGetContpadNum1(g_Vars.currentplayerstats->mpindex);
if (lvIsPaused() == false
if (!lvIsPaused()
&& arg0
&& joyGetButtonsPressedThisFrame(contpad1, A_BUTTON | B_BUTTON | Z_TRIG | START_BUTTON | L_TRIG | R_TRIG)) {
var8007074c = 2;
+2 -2
View File
@@ -10691,7 +10691,7 @@ glabel var7f1aa298
/* f06dc78: 8fa50068 */ lw $a1,0x68($sp)
/* f06dc7c: 27a40188 */ addiu $a0,$sp,0x188
/* f06dc80: 24a50068 */ addiu $a1,$a1,0x68
/* f06dc84: 0fc25b28 */ jal func0f096ca0
/* f06dc84: 0fc25b28 */ jal quaternion0f096ca0
/* f06dc88: afa50038 */ sw $a1,0x38($sp)
/* f06dc8c: 27a40108 */ addiu $a0,$sp,0x108
/* f06dc90: 0c005c1c */ jal mtx4LoadRotationFrom
@@ -11391,7 +11391,7 @@ glabel var7f1aa298
/* f06e648: 8fa50068 */ lw $a1,0x68($sp)
/* f06e64c: 27a40188 */ addiu $a0,$sp,0x188
/* f06e650: 24a50078 */ addiu $a1,$a1,0x78
/* f06e654: 0fc25b28 */ jal func0f096ca0
/* f06e654: 0fc25b28 */ jal quaternion0f096ca0
/* f06e658: afa50024 */ sw $a1,0x24($sp)
/* f06e65c: 8fa50024 */ lw $a1,0x24($sp)
/* f06e660: 0fc25db0 */ jal func0f0976c0
+4 -4
View File
@@ -4,13 +4,13 @@
#include "data.h"
#include "types.h"
void func0f096ca0(struct coord *arg0, struct coord *arg1);
void quaternion0f096ca0(struct coord *arg0, f32 quat[4]);
void func0f096ed4(f32 *arg0, Mtxf *arg1);
void func0f097044(Mtxf *matrix, struct coord *arg1);
void func0f097044(Mtxf *matrix, f32 arg1[4]);
u32 func0f097264(void);
void func0f0972b8(struct coord *arg0, struct coord *arg1, f32 arg2, f32 *arg3);
void func0f0972b8(f32 arg0[4], f32 arg1[4], f32 arg2, f32 *arg3);
u32 func0f097518(void);
void func0f0976c0(struct coord *arg0, struct coord *arg1);
void func0f0976c0(f32 arg0[4], f32 arg1[4]);
void func0f097738(f32 *arg0, f32 *arg1, f32 *arg2);
#endif
+12 -14
View File
@@ -681,10 +681,8 @@ void model0001b400(struct modelrenderdata *arg0, struct model *model, struct mod
struct coord sp124;
struct coord sp118;
struct coord sp10c;
u8 stack2[0x4];
struct coord spfc;
u8 stack3[0x4];
struct coord spec;
f32 spfc[4];
f32 spec[4];
u8 stack4[0xc];
f32 spdc;
struct coord spd0;
@@ -730,14 +728,14 @@ void model0001b400(struct modelrenderdata *arg0, struct model *model, struct mod
mtx4LoadYRotation(rwdata->chrinfo.unk14, &sp78);
mtx4LoadRotation(&sp124, &sp38);
mtx00015be0(&sp78, &sp38);
func0f097044(&sp38, &spec);
func0f097044(&sp38, spec);
} else {
func0f096ca0(&sp124, &spec);
quaternion0f096ca0(&sp124, spec);
}
func0f096ca0(&sp230, &spfc);
func0f0976c0(&spfc, &spec);
func0f0972b8(&spfc, &spec, anim->fracmerge, &spdc);
quaternion0f096ca0(&sp230, spfc);
func0f0976c0(spfc, spec);
func0f0972b8(spfc, spec, anim->fracmerge, &spdc);
func0f096ed4(&spdc, &sp1d8);
} else {
mtx4LoadRotation(&sp230, &sp1d8);
@@ -943,7 +941,7 @@ glabel var70054308
/* 1ba58: 310b0100 */ andi $t3,$t0,0x100
/* 1ba5c: 5160001d */ beqzl $t3,.L0001bad4
/* 1ba60: 8faa00b4 */ lw $t2,0xb4($sp)
/* 1ba64: 0fc25b28 */ jal func0f096ca0
/* 1ba64: 0fc25b28 */ jal quaternion0f096ca0
/* 1ba68: 27a5003c */ addiu $a1,$sp,0x3c
/* 1ba6c: 27a4003c */ addiu $a0,$sp,0x3c
/* 1ba70: 3c053f00 */ lui $a1,0x3f00
@@ -1507,10 +1505,10 @@ glabel var70053fc0pf
/* 1bfc8: 8e060034 */ lw $a2,0x34($s0)
/* 1bfcc: 27a40144 */ addiu $a0,$sp,0x144
.PF0001bfd0:
/* 1bfd0: 0fc25af0 */ jal func0f096ca0
/* 1bfd0: 0fc25af0 */ jal quaternion0f096ca0
/* 1bfd4: 27a50088 */ addiu $a1,$sp,0x88
/* 1bfd8: 27a400b0 */ addiu $a0,$sp,0xb0
/* 1bfdc: 0fc25af0 */ jal func0f096ca0
/* 1bfdc: 0fc25af0 */ jal quaternion0f096ca0
/* 1bfe0: 27a50078 */ addiu $a1,$sp,0x78
/* 1bfe4: 27a40088 */ addiu $a0,$sp,0x88
/* 1bfe8: 0fc25d78 */ jal func0f0976c0
@@ -1922,10 +1920,10 @@ glabel model0001bfa8
/* 1c20c: 8e060034 */ lw $a2,0x34($s0)
/* 1c210: 27a40144 */ addiu $a0,$sp,0x144
.L0001c214:
/* 1c214: 0fc25b28 */ jal func0f096ca0
/* 1c214: 0fc25b28 */ jal quaternion0f096ca0
/* 1c218: 27a50088 */ addiu $a1,$sp,0x88
/* 1c21c: 27a400b0 */ addiu $a0,$sp,0xb0
/* 1c220: 0fc25b28 */ jal func0f096ca0
/* 1c220: 0fc25b28 */ jal quaternion0f096ca0
/* 1c224: 27a50078 */ addiu $a1,$sp,0x78
/* 1c228: 27a40088 */ addiu $a0,$sp,0x88
/* 1c22c: 0fc25db0 */ jal func0f0976c0