diff --git a/README.md b/README.md
index 4ac66261..89511745 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# banjo (90.6686%)
+# banjo (90.6988%)
diff --git a/include/structs.h b/include/structs.h
index 309ca36c..d20daf36 100644
--- a/include/structs.h
+++ b/include/structs.h
@@ -896,4 +896,12 @@ typedef struct{
// u8 pad16[2];
void *unk18;
}struct86s;
+
+typedef struct {
+ s32 unk0; //sound state cnt
+ s32 unk4;
+ s32 unk8; //maxSounds
+ ALHeap *unkC; //heap
+ u16 unk10;
+}Struct87s;
#endif
diff --git a/progress/progress_core1.svg b/progress/progress_core1.svg
index 14f9e1c7..a49b97e7 100644
--- a/progress/progress_core1.svg
+++ b/progress/progress_core1.svg
@@ -17,7 +17,7 @@
core1
- 81.5990%
- 81.5990%
+ 81.8075%
+ 81.8075%
\ No newline at end of file
diff --git a/progress/progress_total.svg b/progress/progress_total.svg
index 7637f8aa..b0e0956d 100644
--- a/progress/progress_total.svg
+++ b/progress/progress_total.svg
@@ -17,7 +17,7 @@
Banjo-Kazooie (us.v10)
- 90.6686%
- 90.6686%
+ 90.6988%
+ 90.6988%
\ No newline at end of file
diff --git a/src/core1/code_3A70.c b/src/core1/code_3A70.c
index 1c1efd5a..cb04f4f2 100644
--- a/src/core1/code_3A70.c
+++ b/src/core1/code_3A70.c
@@ -1,12 +1,17 @@
#include
#include "functions.h"
#include "variables.h"
-#include "n_libaudio.h"
-void func_802444C0(N_AL_Struct81s *arg0);
-void func_80244050(ALEventQueue *arg0, N_AL_Struct81s *arg1, u16 arg2);
-
-extern Gfx D_80275880[];
+Gfx D_80275880[] = {
+ gsSPClearGeometryMode(G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH | G_CLIPPING | 0x0060CD00),
+ gsSPTexture(0, 0, 0, G_TX_RENDERTILE, G_OFF),
+ gsDPPipeSync(),
+ gsDPPipelineMode(G_PM_1PRIMITIVE),
+ gsDPSetCombineMode(G_CC_PRIMITIVE, G_CC_PRIMITIVE),
+ gsDPSetCycleType(G_CYC_1CYCLE),
+ gsDPSetRenderMode(G_RM_ZB_XLU_SURF, G_RM_ZB_XLU_SURF2),
+ gsSPEndDisplayList()
+};
extern f64 D_80277650;
extern f64 D_80277658;
@@ -167,459 +172,4 @@ void func_802424D4(Gfx **gfx, Mtx **mtx, Vtx **vtx, f32 arg3[3], f32 arg4[3], f3
#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_3A70/func_80242BE8.s")
// BREAK???===
-extern struct{
- N_AL_Struct81s *unk0;
- N_AL_Struct81s *unk4;
- N_AL_Struct81s *unk8;
-}D_802758C0;
-extern N_ALSndPlayer *D_802758CC;
-extern s32 D_802758D0;
-extern s16 D_802758D4;
-
-extern ALEventUnknown;
-
-u8 pad_8027EEC0[0x54];
-u16 *D_8027EF14;
-extern struct {
- u8 pad0[4];
- s32 volume[3];
-}D_8027EF18;
-
-#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_3A70/func_80243070.s")
-// void func_80243070(void *arg0) {
- // s16 sp40;
- // ALLink *temp_a0;
- // s32 var_s1;
- // s32 var_v0;
- // u32 var_s0;
- // u32 var_s0_2;
- // void *temp_s0;
- // void *temp_s0_2;
- // void *temp_s0_3;
-
- // D_802758CC->maxSounds = (s32) arg0->unk8;
- // D_802758CC->target = NULL;
- // D_802758CC->frameTime = 33000;
- // ;
- // D_802758CC->sndState = alHeapDBAlloc(NULL, 0, arg0->unkC, 1, arg0->unk0 * sizeof(N_AL_Struct81s));
- // alEvtqNew(&D_802758CC->evtq, alHeapDBAlloc(NULL, 0, arg0->unkC, 1, arg0->unk4 * 0x1C), arg0->unk4);
- // // var_s0 = 1;
- // // var_s1 = 0x50;
- // D_802758C0.unk8 = D_802758CC->sndState;
- // if ((u32) arg0->unk0 >= 2U) {
- // do {
- // temp_a0 = var_s1 + D_802758CC->unk40;
- // alLink(temp_a0, temp_a0 - 0x50);
- // var_s0 += 1;
- // var_s1 += 0x50;
- // } while (var_s0 < (u32) arg0->unk0);
- // }
- // D_8027EF14 = alHeapDBAlloc(NULL, 0, arg0->unkC, 2, (s32) arg0->unk10);
- // var_v0 = 0;
- // var_s0_2 = 0;
- // if (arg0->unk10 != 0) {
- // do {
- // var_s0_2 += 1;
- // *(D_8027EF14 + var_v0) = 0x7FFF;
- // var_v0 += 2;
- // } while (var_s0_2 < (u16) arg0->unk10);
- // }
- // D_802758CC->unk0 = 0;
- // D_802758CC->unk8 = &func_8024324C;
- // temp_s0 = D_802758CC;
- // temp_s0->unk4 = temp_s0;
- // n_alSynAddSndPlayer(D_802758CC);
- // temp_s0_2 = D_802758CC;
- // sp40 = 0x20;
- // alEvtqPostEvent(temp_s0_2 + 0x14, (ALEvent *) &sp40, temp_s0_2->unk48);
- // temp_s0_3 = D_802758CC;
- // D_802758CC->unk4C = alEvtqNextEvent(temp_s0_3 + 0x14, temp_s0_3 + 0x28);
-// }
-
-#ifndef NONMATCHING
-#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_3A70/func_8024324C.s")
-#else
-void func_8024324C(N_ALSndPlayer *arg0) {
- N_ALEvent sp3C;
-
- do {
- if (arg0->nextEvent.type == 0x20) {
- sp3C.type = 0x20;
- alEvtqPostEvent(&arg0->evtq, (ALEvent *) &sp3C, arg0->frameTime);
- func_80244190(arg0);
- } else {
- func_802432F8(arg0, &arg0->nextEvent);
- }
- arg0->nextDelta = alEvtqNextEvent(&arg0->evtq, &arg0->nextEvent);
- } while (arg0->nextDelta == 0);
- arg0->curTime += arg0->nextDelta;
-}
-#endif
-
-#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_3A70/func_802432F8.s")
-
-void func_80243F84(N_AL_Struct81s *arg0) {
- if (arg0->unk3F & 4) {
- n_alSynStopVoice(&arg0->voice);
- n_alSynFreeVoice(&arg0->voice);
- }
- func_802444C0(arg0);
- func_80244050(&D_802758CC->evtq, arg0, 0xFFFF);
-}
-
-void func_80243FE4(N_AL_Struct81s *arg0) {
- ALEvent evt;
- f32 sp1C;
-
- sp1C = alCents2Ratio(arg0->unk8->keyMap->detune)* arg0->unk2C;
- evt.type = 0x10;
- evt.msg.unk3A70.unk0 = arg0;
- evt.msg.unk3A70.unk4 = reinterpret_cast(s32, sp1C);
- alEvtqPostEvent(&D_802758CC->evtq, &evt, 33333);
-}
-
-void func_80244050(ALEventQueue *arg0, N_AL_Struct81s *arg1, u16 arg2) {
- s32 pad[5];
- u32 mask;
- ALEventListItem *next_event_list;
- ALEventListItem *event_list;
-
- mask = osSetIntMask(OS_IM_NONE);
- for(event_list = (ALEventListItem *)arg0->allocList.next; event_list != NULL; event_list = next_event_list) {
- next_event_list = (ALEventListItem *)event_list->node.next;
- if ((arg1 == event_list->evt.msg.unk3A70.unk0) && (reinterpret_cast(u16, event_list->evt.type) & arg2)) {
- if (next_event_list != NULL) {
- next_event_list->delta += event_list->delta;
- }
- alUnlink((ALLink *)event_list);
- alLink((ALLink *)event_list, (ALLink *)arg0);
- }
- }
- osSetIntMask(mask);
-}
-
-s32 func_80244110(u16 *arg0, u16 *arg1) {
- N_AL_Struct81s *var_v0;
- N_AL_Struct81s *var_v1_2;
- N_AL_Struct81s *var_a2;
- u16 var_a0;
- u16 var_a3;
- u16 var_v1;
-
- var_v0 = D_802758C0.unk0;
- var_v1_2 = D_802758C0.unk8;
- var_a2 = D_802758C0.unk4;
-
- for(var_a3 = 0; var_v0 != NULL; var_a3++){
- var_v0 = (N_AL_Struct81s *) var_v0->node.next;
- }
-
-
- for(var_a0 = 0; var_v1_2 != NULL; var_a0++) {
- var_v1_2 = (N_AL_Struct81s *) var_v1_2->node.next;
- }
-
- for(var_v1 = 0; var_a2 != NULL; var_v1++) {
- var_a2 = (N_AL_Struct81s *) var_a2->node.prev;
- }
-
- *arg0 = var_a0;
- *arg1 = var_a3;
- return var_v1;
-}
-
-
-#ifndef NONMATCHING
-#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_3A70/func_80244190.s")
-#else
-void func_80244190(N_AL_Struct81s *arg0) {
- ALMicroTime *temp_a1;
- s32 prev_volume;
- s32 temp_t1;
- s32 temp_t5;
- s32 var_t0;
- ALMicroTime var_t1;
- u8 temp_t6;
- u8 var_a2;
- ALEnvelope *envelope;
- N_AL_Struct81s *var_v0;
- N_AL_Struct81s *var_v1;
-
- for(var_v0 = D_802758C0.unk0; var_v0 != NULL; var_v0 = (N_AL_Struct81s *)var_v0->node.next){
- var_v1 = var_v0;
- envelope = var_v0->unk8->envelope;
- temp_a1 = &envelope->attackTime;
- D_8027EF18.volume[AL_PHASE_ATTACK] = (s32) envelope->attackVolume;
- D_8027EF18.volume[AL_PHASE_DECAY] = (s32) envelope->decayVolume;
- while( var_v0->envPhase < AL_PHASE_RELEASE
- && var_v0->unk48 >= temp_a1[var_v0->envPhase]
- && temp_a1[var_v0->envPhase] != -1
- ){
- var_v0->unk48 -= temp_a1[var_v0->envPhase];
- var_v0->envPhase++;
- }
-
- if (var_v0->envPhase < AL_PHASE_RELEASE) {
- if (temp_a1[var_v1->envPhase] != -1) {
- var_v0->unk44 = D_8027EF18.volume[var_v0->envPhase - 1] + ((s32) ((D_8027EF18.volume[var_v0->envPhase] - D_8027EF18.volume[var_v0->envPhase - 1]) * var_v0->unk48) / temp_a1[var_v0->envPhase]);
- } else {
- var_v0->unk44 = D_8027EF18.volume[var_v0->envPhase - 1]; //
- }
- }
- var_v0->unk48 += arg0->unk48;
- }
-}
-#endif
-
-#ifndef NONMATCHING
-#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_3A70/func_8024431C.s")
-#else
-N_AL_Struct81s *func_8024431C(ALBank *bank, ALSound *sound) {
- s32 pad;
- ALKeyMap *sp30;
- N_AL_Struct81s *temp_s0;
- OSIntMask mask;
- s32 sp24;
-
- temp_s0 = D_802758C0.unk8;
- sp30 = sound->keyMap;
- if (temp_s0 != NULL) {
- mask = osSetIntMask(OS_IM_NONE);
- D_802758C0.unk8 = (N_AL_Struct81s *) temp_s0->unk0.next;
- alUnlink((ALLink *)temp_s0);
- if (D_802758C0.unk0 != NULL) {
- temp_s0->unk0.next = D_802758C0.unk0;
- temp_s0->unk0.prev = NULL;
- D_802758C0.unk0->unk0.prev = temp_s0;
- D_802758C0.unk0 = temp_s0;
- } else {
- temp_s0->unk0.prev = NULL;
- temp_s0->unk0.next = NULL;
- D_802758C0.unk0 = temp_s0;
- D_802758C0.unk4 = temp_s0;
- }
- osSetIntMask(mask);
- sp24 = ((sound->envelope->decayTime + 1) == 0) + 0x40;
- temp_s0->unk36 = sp24;
- temp_s0->unk40 = 5;
- temp_s0->unk38 = 2;
- temp_s0->unk8 = sound;
- temp_s0->unk2C = 1.0f;
- temp_s0->unk3F = sp30->keyMax & 0xF0;
- temp_s0->unk30 = 0;
- temp_s0->envPhase = AL_PHASE_ATTACK;
- temp_s0->unk44 = 0.0f;
- temp_s0->unk48 = 0;
- if (temp_s0->unk3F & 0x20) {
- temp_s0->unk28 = alCents2Ratio((sp30->keyBase * 0x64) - 0x1770);
- } else {
- temp_s0->unk28 = alCents2Ratio(((sp30->keyBase * 0x64) + sp30->detune) - 0x1770);
- }
- if (sp24 != 0x40) {
- temp_s0->unk3F |= 2;
- }
- temp_s0->unk3E = 0;
- temp_s0->unk3D = 0x40;
- temp_s0->unk34 = 0x7FFF;
- }
- return temp_s0;
-}
-#endif
-
-void func_802444C0(N_AL_Struct81s *arg0){
- N_AL_Struct81s *var_v0;
-
- sizeof(ALVoice);
-
- var_v0 = D_802758C0.unk0;
- if(arg0 == D_802758C0.unk0){
- D_802758C0.unk0 = (N_AL_Struct81s *)arg0->node.next;
- }
-
- if(arg0 == D_802758C0.unk4){
- D_802758C0.unk4 = (N_AL_Struct81s *)arg0->node.prev;
- }
-
- alUnlink((ALLink *)arg0);
-
- if(D_802758C0.unk8 != NULL){
- arg0->node.next = (ALLink *)D_802758C0.unk8;
- arg0->node.prev = NULL;
- D_802758C0.unk8->node.prev = (ALLink *)arg0;
- D_802758C0.unk8 = arg0;
- }
- else{
- arg0->node.prev = NULL;
- arg0->node.next = NULL;
- D_802758C0.unk8 = arg0;
- }
-
- if(arg0->unk3F & 0x4){
- D_802758D4--;
- }
-
- arg0->unk40 = 0;
- if(arg0->unk30 != NULL){
- if(*arg0->unk30 == arg0){
- *arg0->unk30 = NULL;
- }
- arg0->unk30 = NULL;
- }
-}
-
-void func_80244594(N_AL_Struct81s *arg0, u8 arg1){
- if(arg0 != NULL)
- arg0->unk36 = arg1;
-}
-
-s32 func_802445AC(N_AL_Struct81s *arg0){
- if(arg0 != NULL)
- return arg0->unk40;
- return 0;
-}
-
-bool func_802445C4(ALBank *bank, s16 arg1){
- ALSound *snd = bank->instArray[0]->soundArray[arg1-1];
- if (snd->envelope->decayTime == -1)
- return TRUE;
- else
- return FALSE;
-}
-
-void *func_80244608(ALBank *bank, s16 arg1, struct46s *arg2) {
- ALKeyMap *temp_v0_2;
- ALSound *temp_s2;
- N_AL_Struct81s *temp_v0;
- s32 var_s3;
- s16 sp6E;
- s32 sp68;
- s32 var_s4;
- N_AL_Struct81s *var_fp;
- ALEvent sp50;
- ALEvent sp40;
-
- var_fp = NULL;
- sp6E = 0;
- var_s3 = 0;
- if (arg1 == 0) {
- return NULL;
- }
-
- do{
- temp_s2 = bank->instArray[0]->soundArray[arg1-1];
- temp_v0 = func_8024431C(bank, temp_s2);
- if (temp_v0 != NULL) {
- temp_v0->unk4C = (s32) (arg1 - 1);
- D_802758CC->target = temp_v0;
- sp50.type = AL_SEQ_MIDI_EVT;
- ((s32 *)&sp50.msg)[0] = temp_v0;
- var_s4 = temp_s2->keyMap->velocityMax * 0x8235;
- if (temp_v0->unk3F & 0x10) {
- temp_v0->unk3F &= ~(0x10);
- alEvtqPostEvent(&D_802758CC->evtq, (ALEvent *) &sp50, var_s3 + 1);
- sp68 = var_s4 + 1;
- sp6E = arg1;
- } else {
- alEvtqPostEvent(&D_802758CC->evtq, (ALEvent *) &sp50, var_s4 + 1);
- }
- var_fp = temp_v0;
- }
- temp_v0_2 = temp_s2->keyMap;
- var_s3 += var_s4;
- arg1 = temp_v0_2->velocityMin + ((temp_v0_2->keyMin & 0xC0) * 4);
- } while (arg1 != 0 && temp_v0 != NULL);
-
- if (var_fp != NULL) {
- var_fp->unk3F |= 1;
- var_fp->unk30 = arg2;
- if (sp6E != 0) {
- var_fp->unk3F |= 0x10;
- sp40.type = 0x200;
- ((s32 *)&sp40.msg)[0] = var_fp;
- ((s32 *)&sp40.msg)[1] = sp6E;
- ((s32 *)&sp40.msg)[2] = bank;
- alEvtqPostEvent(&D_802758CC->evtq, &sp40, sp68);
- }
- }
- if (arg2 != NULL) {
- arg2->unk0 = (s32) var_fp;
- }
- return var_fp;
-}
-
-void func_80244814(N_AL_Struct81s *arg0){
- ALEvent evt;
-
- evt.type = 0x400;
- ((s32 *)&evt.msg)[0] = arg0;
- if(arg0 != NULL){
- arg0->unk3F &= ~(0x10);
- alEvtqPostEvent(&D_802758CC->evtq, &evt, 0);
- }
-}
-
-void func_80244860(u8 arg0) {
- OSIntMask mask;
- ALEvent evt;
- N_AL_Struct81s *var_s0;
-
- mask = osSetIntMask(1U);
- for(var_s0 = D_802758C0.unk0; var_s0 != NULL; var_s0 = (N_AL_Struct81s *)var_s0->node.next){
- evt.type = 0x400;
- ((s32 *)&evt.msg)[0] = (s32)var_s0;
- if ((var_s0->unk3F & arg0) == arg0) {
- var_s0->unk3F &= ~(0x10);
- alEvtqPostEvent(&D_802758CC->evtq, &evt, 0);
- }
- }
- osSetIntMask(mask);
-}
-
-void func_80244918(void){
- func_80244860(1);
-}
-
-void func_80244938(void){
- func_80244860(0x11);
-}
-
-void func_80244958(void){
- func_80244860(3);
-}
-
-void func_80244978(s32 arg0, s16 type, s32 arg2){
- ALEvent sp18;
- if(arg0){
- sp18.type = type;
- ((s32 *)&sp18.msg)[0] = arg0;
- ((s32 *)&sp18.msg)[1] = arg2;
-
- alEvtqPostEvent(&D_802758CC->evtq, &sp18, 0);
- }
-}
-
-s32 func_802449C4(u8 arg0){
- return D_8027EF14[arg0];
-}
-
-void func_802449E4(u8 arg0, u16 arg1) {
- N_AL_Struct81s *var_s0;
- s32 pad30;
- ALEvent evt;
-
- var_s0 = D_802758C0.unk0;
- D_8027EF14[arg0] = arg1;
- while(var_s0 != NULL){
- if ((var_s0->unk8->keyMap->keyMin & 0x3F) == arg0) {
- evt.type = 0x800;
- ((s32 *)&evt.msg)[0] = var_s0;
- alEvtqPostEvent(&D_802758CC->evtq, &evt, 0);
- }
- var_s0 = (N_AL_Struct81s *)var_s0->node.next;
- }
-}
-
-void func_80244A98(s32 arg0){
- D_802758D0 = arg0;
-}
diff --git a/src/core1/code_5650.c b/src/core1/code_5650.c
new file mode 100644
index 00000000..f5464670
--- /dev/null
+++ b/src/core1/code_5650.c
@@ -0,0 +1,448 @@
+#include
+#include "functions.h"
+#include "variables.h"
+#include "n_libaudio.h"
+
+void func_802444C0(N_AL_Struct81s *arg0);
+void func_80244050(ALEventQueue *arg0, N_AL_Struct81s *arg1, u16 arg2);
+
+
+
+void func_8024324C(N_ALSndPlayer *arg0);
+
+// extern ALEventUnknown;
+/* .bss */
+N_ALSndPlayer D_8027EEC0;
+u16 *D_8027EF14;
+extern struct {
+ u8 pad0[4];
+ s32 volume[3];
+}D_8027EF18;
+
+/* .data */
+extern struct{
+ N_AL_Struct81s *unk0;
+ N_AL_Struct81s *unk4;
+ N_AL_Struct81s *unk8;
+}D_802758C0 = {NULL, NULL, NULL};
+extern N_ALSndPlayer *D_802758CC = &D_8027EEC0;
+extern s32 D_802758D0 = 1;
+extern s16 D_802758D4 = 0;
+
+/* .code */
+void func_80243070(Struct87s *arg0) {
+ N_AL_Struct81s *temp_a0;
+ N_AL_Struct81s *var_v0;
+ ALEvent sp40;
+ u32 var_s0;
+
+ D_802758CC->maxSounds = (s32) arg0->unk8;
+ D_802758CC->target = NULL;
+ D_802758CC->frameTime = 33000;
+ D_802758CC->sndState = alHeapDBAlloc(NULL, 0, arg0->unkC, 1, arg0->unk0 * sizeof(N_AL_Struct81s));
+ alEvtqNew(&D_802758CC->evtq, alHeapDBAlloc(NULL, 0, arg0->unkC, 1, arg0->unk4 * 0x1C), arg0->unk4);
+ D_802758C0.unk8 = D_802758CC->sndState;
+ for(var_s0 = 1; var_s0 < arg0->unk0; var_s0++){
+ var_v0 = (N_AL_Struct81s *)D_802758CC->sndState;
+ temp_a0 = var_s0 + var_v0;
+ alLink((ALLink *)temp_a0, (ALLink*)(temp_a0 - 1));
+ }
+ D_8027EF14 = alHeapDBAlloc(NULL, 0, arg0->unkC, 2, (s32) arg0->unk10);
+ for(var_s0 = 0; var_s0 < arg0->unk10; var_s0++){
+ D_8027EF14[var_s0] = 0x7FFF;
+ }
+ D_802758CC->node.next = NULL;
+ D_802758CC->node.handler = (ALVoiceHandler)func_8024324C;
+ D_802758CC->node.clientData = D_802758CC;
+ n_alSynAddSndPlayer(D_802758CC);
+ sp40.type = 0x20;
+ alEvtqPostEvent(&D_802758CC->evtq, &sp40, D_802758CC->frameTime);
+ D_802758CC->nextDelta = alEvtqNextEvent(&D_802758CC->evtq, &D_802758CC->nextEvent);
+}
+
+#ifndef NONMATCHING
+#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_5650/func_8024324C.s")
+#else
+void func_8024324C(N_ALSndPlayer *arg0) {
+ N_ALEvent sp3C;
+
+ do {
+ if (arg0->nextEvent.type == 0x20) {
+ sp3C.type = 0x20;
+ alEvtqPostEvent(&arg0->evtq, (ALEvent *) &sp3C, arg0->frameTime);
+ func_80244190(arg0);
+ } else {
+ func_802432F8(arg0, &arg0->nextEvent);
+ }
+ arg0->nextDelta = alEvtqNextEvent(&arg0->evtq, &arg0->nextEvent);
+ } while (arg0->nextDelta == 0);
+ arg0->curTime += arg0->nextDelta;
+}
+#endif
+
+#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_5650/func_802432F8.s")
+
+void func_80243F84(N_AL_Struct81s *arg0) {
+ if (arg0->unk3F & 4) {
+ n_alSynStopVoice(&arg0->voice);
+ n_alSynFreeVoice(&arg0->voice);
+ }
+ func_802444C0(arg0);
+ func_80244050(&D_802758CC->evtq, arg0, 0xFFFF);
+}
+
+void func_80243FE4(N_AL_Struct81s *arg0) {
+ ALEvent evt;
+ f32 sp1C;
+
+ sp1C = alCents2Ratio(arg0->unk8->keyMap->detune)* arg0->unk2C;
+ evt.type = 0x10;
+ evt.msg.unk3A70.unk0 = arg0;
+ evt.msg.unk3A70.unk4 = reinterpret_cast(s32, sp1C);
+ alEvtqPostEvent(&D_802758CC->evtq, &evt, 33333);
+}
+
+void func_80244050(ALEventQueue *arg0, struct struct_81_s *arg1, u16 arg2) {
+ s32 pad[5];
+ u32 mask;
+ ALEventListItem *next_event_list;
+ ALEventListItem *event_list;
+
+ mask = osSetIntMask(OS_IM_NONE);
+ for(event_list = (ALEventListItem *)arg0->allocList.next; event_list != NULL; event_list = next_event_list) {
+ next_event_list = (ALEventListItem *)event_list->node.next;
+ if ((arg1 == event_list->evt.msg.unk3A70.unk0) && (reinterpret_cast(u16, event_list->evt.type) & arg2)) {
+ if (next_event_list != NULL) {
+ next_event_list->delta += event_list->delta;
+ }
+ alUnlink((ALLink *)event_list);
+ alLink((ALLink *)event_list, (ALLink *)arg0);
+ }
+ }
+ osSetIntMask(mask);
+}
+
+s32 func_80244110(u16 *arg0, u16 *arg1) {
+ N_AL_Struct81s *var_v0;
+ N_AL_Struct81s *var_v1_2;
+ N_AL_Struct81s *var_a2;
+ u16 var_a0;
+ u16 var_a3;
+ u16 var_v1;
+
+ var_v0 = D_802758C0.unk0;
+ var_v1_2 = D_802758C0.unk8;
+ var_a2 = D_802758C0.unk4;
+
+ for(var_a3 = 0; var_v0 != NULL; var_a3++){
+ var_v0 = (N_AL_Struct81s *) var_v0->node.next;
+ }
+
+
+ for(var_a0 = 0; var_v1_2 != NULL; var_a0++) {
+ var_v1_2 = (N_AL_Struct81s *) var_v1_2->node.next;
+ }
+
+ for(var_v1 = 0; var_a2 != NULL; var_v1++) {
+ var_a2 = (N_AL_Struct81s *) var_a2->node.prev;
+ }
+
+ *arg0 = var_a0;
+ *arg1 = var_a3;
+ return var_v1;
+}
+
+
+#ifndef NONMATCHING
+#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_5650/func_80244190.s")
+#else
+void func_80244190(N_AL_Struct81s *arg0) {
+ ALMicroTime *temp_a1;
+ s32 prev_volume;
+ s32 temp_t1;
+ s32 temp_t5;
+ s32 var_t0;
+ ALMicroTime var_t1;
+ u8 temp_t6;
+ u8 var_a2;
+ ALEnvelope *envelope;
+ N_AL_Struct81s *var_v0;
+ N_AL_Struct81s *var_v1;
+
+ for(var_v0 = D_802758C0.unk0; var_v0 != NULL; var_v0 = (N_AL_Struct81s *)var_v0->node.next){
+ var_v1 = var_v0;
+ envelope = var_v0->unk8->envelope;
+ temp_a1 = &envelope->attackTime;
+ D_8027EF18.volume[AL_PHASE_ATTACK] = (s32) envelope->attackVolume;
+ D_8027EF18.volume[AL_PHASE_DECAY] = (s32) envelope->decayVolume;
+ while( var_v0->envPhase < AL_PHASE_RELEASE
+ && var_v0->unk48 >= temp_a1[var_v0->envPhase]
+ && temp_a1[var_v0->envPhase] != -1
+ ){
+ var_v0->unk48 -= temp_a1[var_v0->envPhase];
+ var_v0->envPhase++;
+ }
+
+ if (var_v0->envPhase < AL_PHASE_RELEASE) {
+ if (temp_a1[var_v1->envPhase] != -1) {
+ var_v0->unk44 = D_8027EF18.volume[var_v0->envPhase - 1] + ((s32) ((D_8027EF18.volume[var_v0->envPhase] - D_8027EF18.volume[var_v0->envPhase - 1]) * var_v0->unk48) / temp_a1[var_v0->envPhase]);
+ } else {
+ var_v0->unk44 = D_8027EF18.volume[var_v0->envPhase - 1]; //
+ }
+ }
+ var_v0->unk48 += arg0->unk48;
+ }
+}
+#endif
+
+#ifndef NONMATCHING
+#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_5650/func_8024431C.s")
+#else
+N_AL_Struct81s *func_8024431C(ALBank *bank, ALSound *sound) {
+ s32 pad;
+ ALKeyMap *sp30;
+ N_AL_Struct81s *temp_s0;
+ OSIntMask mask;
+ s32 sp24;
+
+ temp_s0 = D_802758C0.unk8;
+ sp30 = sound->keyMap;
+ if (temp_s0 != NULL) {
+ mask = osSetIntMask(OS_IM_NONE);
+ D_802758C0.unk8 = (N_AL_Struct81s *) temp_s0->unk0.next;
+ alUnlink((ALLink *)temp_s0);
+ if (D_802758C0.unk0 != NULL) {
+ temp_s0->unk0.next = D_802758C0.unk0;
+ temp_s0->unk0.prev = NULL;
+ D_802758C0.unk0->unk0.prev = temp_s0;
+ D_802758C0.unk0 = temp_s0;
+ } else {
+ temp_s0->unk0.prev = NULL;
+ temp_s0->unk0.next = NULL;
+ D_802758C0.unk0 = temp_s0;
+ D_802758C0.unk4 = temp_s0;
+ }
+ osSetIntMask(mask);
+ sp24 = ((sound->envelope->decayTime + 1) == 0) + 0x40;
+ temp_s0->unk36 = sp24;
+ temp_s0->unk40 = 5;
+ temp_s0->unk38 = 2;
+ temp_s0->unk8 = sound;
+ temp_s0->unk2C = 1.0f;
+ temp_s0->unk3F = sp30->keyMax & 0xF0;
+ temp_s0->unk30 = 0;
+ temp_s0->envPhase = AL_PHASE_ATTACK;
+ temp_s0->unk44 = 0.0f;
+ temp_s0->unk48 = 0;
+ if (temp_s0->unk3F & 0x20) {
+ temp_s0->unk28 = alCents2Ratio((sp30->keyBase * 0x64) - 0x1770);
+ } else {
+ temp_s0->unk28 = alCents2Ratio(((sp30->keyBase * 0x64) + sp30->detune) - 0x1770);
+ }
+ if (sp24 != 0x40) {
+ temp_s0->unk3F |= 2;
+ }
+ temp_s0->unk3E = 0;
+ temp_s0->unk3D = 0x40;
+ temp_s0->unk34 = 0x7FFF;
+ }
+ return temp_s0;
+}
+#endif
+
+void func_802444C0(N_AL_Struct81s *arg0){
+ N_AL_Struct81s *var_v0;
+
+ sizeof(ALVoice);
+
+ var_v0 = D_802758C0.unk0;
+ if(arg0 == D_802758C0.unk0){
+ D_802758C0.unk0 = (N_AL_Struct81s *)arg0->node.next;
+ }
+
+ if(arg0 == D_802758C0.unk4){
+ D_802758C0.unk4 = (N_AL_Struct81s *)arg0->node.prev;
+ }
+
+ alUnlink((ALLink *)arg0);
+
+ if(D_802758C0.unk8 != NULL){
+ arg0->node.next = (ALLink *)D_802758C0.unk8;
+ arg0->node.prev = NULL;
+ D_802758C0.unk8->node.prev = (ALLink *)arg0;
+ D_802758C0.unk8 = arg0;
+ }
+ else{
+ arg0->node.prev = NULL;
+ arg0->node.next = NULL;
+ D_802758C0.unk8 = arg0;
+ }
+
+ if(arg0->unk3F & 0x4){
+ D_802758D4--;
+ }
+
+ arg0->unk40 = 0;
+ if(arg0->unk30 != NULL){
+ if(*arg0->unk30 == arg0){
+ *arg0->unk30 = NULL;
+ }
+ arg0->unk30 = NULL;
+ }
+}
+
+void func_80244594(N_AL_Struct81s *arg0, u8 arg1){
+ if(arg0 != NULL)
+ arg0->unk36 = arg1;
+}
+
+s32 func_802445AC(N_AL_Struct81s *arg0){
+ if(arg0 != NULL)
+ return arg0->unk40;
+ return 0;
+}
+
+bool func_802445C4(ALBank *bank, s16 arg1){
+ ALSound *snd = bank->instArray[0]->soundArray[arg1-1];
+ if (snd->envelope->decayTime == -1)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void *func_80244608(ALBank *bank, s16 arg1, struct46s *arg2) {
+ ALKeyMap *temp_v0_2;
+ ALSound *temp_s2;
+ N_AL_Struct81s *temp_v0;
+ s32 var_s3;
+ s16 sp6E;
+ s32 sp68;
+ s32 var_s4;
+ N_AL_Struct81s *var_fp;
+ ALEvent sp50;
+ ALEvent sp40;
+
+ var_fp = NULL;
+ sp6E = 0;
+ var_s3 = 0;
+ if (arg1 == 0) {
+ return NULL;
+ }
+
+ do{
+ temp_s2 = bank->instArray[0]->soundArray[arg1-1];
+ temp_v0 = func_8024431C(bank, temp_s2);
+ if (temp_v0 != NULL) {
+ temp_v0->unk4C = (s32) (arg1 - 1);
+ D_802758CC->target = temp_v0;
+ sp50.type = AL_SEQ_MIDI_EVT;
+ ((s32 *)&sp50.msg)[0] = temp_v0;
+ var_s4 = temp_s2->keyMap->velocityMax * 0x8235;
+ if (temp_v0->unk3F & 0x10) {
+ temp_v0->unk3F &= ~(0x10);
+ alEvtqPostEvent(&D_802758CC->evtq, (ALEvent *) &sp50, var_s3 + 1);
+ sp68 = var_s4 + 1;
+ sp6E = arg1;
+ } else {
+ alEvtqPostEvent(&D_802758CC->evtq, (ALEvent *) &sp50, var_s4 + 1);
+ }
+ var_fp = temp_v0;
+ }
+ temp_v0_2 = temp_s2->keyMap;
+ var_s3 += var_s4;
+ arg1 = temp_v0_2->velocityMin + ((temp_v0_2->keyMin & 0xC0) * 4);
+ } while (arg1 != 0 && temp_v0 != NULL);
+
+ if (var_fp != NULL) {
+ var_fp->unk3F |= 1;
+ var_fp->unk30 = arg2;
+ if (sp6E != 0) {
+ var_fp->unk3F |= 0x10;
+ sp40.type = 0x200;
+ ((s32 *)&sp40.msg)[0] = var_fp;
+ ((s32 *)&sp40.msg)[1] = sp6E;
+ ((s32 *)&sp40.msg)[2] = bank;
+ alEvtqPostEvent(&D_802758CC->evtq, &sp40, sp68);
+ }
+ }
+ if (arg2 != NULL) {
+ arg2->unk0 = (s32) var_fp;
+ }
+ return var_fp;
+}
+
+void func_80244814(N_AL_Struct81s *arg0){
+ ALEvent evt;
+
+ evt.type = 0x400;
+ ((s32 *)&evt.msg)[0] = arg0;
+ if(arg0 != NULL){
+ arg0->unk3F &= ~(0x10);
+ alEvtqPostEvent(&D_802758CC->evtq, &evt, 0);
+ }
+}
+
+void func_80244860(u8 arg0) {
+ OSIntMask mask;
+ ALEvent evt;
+ N_AL_Struct81s *var_s0;
+
+ mask = osSetIntMask(1U);
+ for(var_s0 = D_802758C0.unk0; var_s0 != NULL; var_s0 = (N_AL_Struct81s *)var_s0->node.next){
+ evt.type = 0x400;
+ ((s32 *)&evt.msg)[0] = (s32)var_s0;
+ if ((var_s0->unk3F & arg0) == arg0) {
+ var_s0->unk3F &= ~(0x10);
+ alEvtqPostEvent(&D_802758CC->evtq, &evt, 0);
+ }
+ }
+ osSetIntMask(mask);
+}
+
+void func_80244918(void){
+ func_80244860(1);
+}
+
+void func_80244938(void){
+ func_80244860(0x11);
+}
+
+void func_80244958(void){
+ func_80244860(3);
+}
+
+void func_80244978(s32 arg0, s16 type, s32 arg2){
+ ALEvent sp18;
+ if(arg0){
+ sp18.type = type;
+ ((s32 *)&sp18.msg)[0] = arg0;
+ ((s32 *)&sp18.msg)[1] = arg2;
+
+ alEvtqPostEvent(&D_802758CC->evtq, &sp18, 0);
+ }
+}
+
+s32 func_802449C4(u8 arg0){
+ return D_8027EF14[arg0];
+}
+
+void func_802449E4(u8 arg0, u16 arg1) {
+ N_AL_Struct81s *var_s0;
+ s32 pad30;
+ ALEvent evt;
+
+ var_s0 = D_802758C0.unk0;
+ D_8027EF14[arg0] = arg1;
+ while(var_s0 != NULL){
+ if ((var_s0->unk8->keyMap->keyMin & 0x3F) == arg0) {
+ evt.type = 0x800;
+ ((s32 *)&evt.msg)[0] = var_s0;
+ alEvtqPostEvent(&D_802758CC->evtq, &evt, 0);
+ }
+ var_s0 = (N_AL_Struct81s *)var_s0->node.next;
+ }
+}
+
+void func_80244A98(s32 arg0){
+ D_802758D0 = arg0;
+}
diff --git a/subyaml/core1.us.v10.yaml b/subyaml/core1.us.v10.yaml
index 5d41de05..07bb20af 100644
--- a/subyaml/core1.us.v10.yaml
+++ b/subyaml/core1.us.v10.yaml
@@ -38,6 +38,7 @@ segments:
- [0x2FA0, c, code_2FA0] #DONE
- [0x31C0, c, code_31C0]
- [0x3A70, c, code_3A70]
+ - [0x5650, c, code_5650]
- [0x7090, c, code_7090] #DONE
- [0x72B0, c, code_72B0] #DONE
- [0x7F60, c, code_7F60]
@@ -247,7 +248,9 @@ segments:
- [0x37E30, bin, data_37E30] #data Section
- [0x37E40, .data, code_2FA0]
- [0x37E50, .data, code_31C0]
- - [0x37E60, bin, data_37E60]
+ - [0x37E60, .data, code_3A70]
+ - [0x37EA0, bin, data_37EA0] # .data, code_5650]
+ - [0x37EC0, bin, data_37EC0]
- [0x37EF0, .data, code_8C50]
- [0x38030, bin, data_38030]
- [0x381F0, bin, data_381F0] # .data, done/code_CE60]
@@ -279,6 +282,7 @@ segments:
- [0x39C00, bin, data_39C00] # .rodata, code_1D00]
- [0x39C20, .rodata, code_31C0]
- [0x39C30, bin, data_39C30] # .rodata, code_3A70]
+ - [0x39C40, .rodata, code_5650]
- [0x39CA0, .rodata, code_72B0]
- [0x39CC0, bin, data_39CC0]
- [0x39CD0, bin, data_39CD0] # .rodata, code_7F60]
@@ -325,7 +329,7 @@ segments:
- [0x3c710, .bss, code_2BD0]
- [0x3c710, .bss, code_2DA0]
- [0x3c710, .bss, code_31C0]
- - [0x3c710, .bss, code_3A70]
+ - [0x3c710, .bss, code_5650]
- [0x3c710, .bss, code_7090]
- [0x3c710, .bss, code_72B0]
- [0x3c710, .bss, code_8C50]