diff --git a/asm/Game/zMusic.s b/asm/Game/zMusic.s index a61941c3a..545df62d8 100644 --- a/asm/Game/zMusic.s +++ b/asm/Game/zMusic.s @@ -7,13 +7,13 @@ volume_reset__Fv: /* 800A6E9C 000A3C9C 94 21 FF F0 */ stwu r1, -0x10(r1) /* 800A6EA0 000A3CA0 7C 08 02 A6 */ mflr r0 -/* 800A6EA4 000A3CA4 3C 60 80 2F */ lis r3, lbl_802F2B38@ha +/* 800A6EA4 000A3CA4 3C 60 80 2F */ lis r3, volume@ha /* 800A6EA8 000A3CA8 38 80 00 00 */ li r4, 0 /* 800A6EAC 000A3CAC 90 01 00 14 */ stw r0, 0x14(r1) -/* 800A6EB0 000A3CB0 38 C3 2B 38 */ addi r6, r3, lbl_802F2B38@l +/* 800A6EB0 000A3CB0 38 C3 2B 38 */ addi r6, r3, volume@l /* 800A6EB4 000A3CB4 38 66 00 0C */ addi r3, r6, 0xc /* 800A6EB8 000A3CB8 38 A0 00 08 */ li r5, 8 -/* 800A6EBC 000A3CBC C0 22 93 C8 */ lfs f1, lbl_803CDD48-_SDA2_BASE_(r2) +/* 800A6EBC 000A3CBC C0 22 93 C8 */ lfs f1, unkFloat-_SDA2_BASE_(r2) /* 800A6EC0 000A3CC0 D0 26 00 00 */ stfs f1, 0(r6) /* 800A6EC4 000A3CC4 C0 02 93 CC */ lfs f0, lbl_803CDD4C-_SDA2_BASE_(r2) /* 800A6EC8 000A3CC8 D0 06 00 04 */ stfs f0, 4(r6) @@ -24,48 +24,16 @@ volume_reset__Fv: /* 800A6EDC 000A3CDC 38 21 00 10 */ addi r1, r1, 0x10 /* 800A6EE0 000A3CE0 4E 80 00 20 */ blr -.global zMusicRefreshVolume__Fv -zMusicRefreshVolume__Fv: -/* 800A6EE4 000A3CE4 94 21 FF E0 */ stwu r1, -0x20(r1) -/* 800A6EE8 000A3CE8 7C 08 02 A6 */ mflr r0 -/* 800A6EEC 000A3CEC 3C 80 80 2F */ lis r4, lbl_802F2B10@ha -/* 800A6EF0 000A3CF0 3C 60 80 2F */ lis r3, lbl_802F2B38@ha -/* 800A6EF4 000A3CF4 90 01 00 24 */ stw r0, 0x24(r1) -/* 800A6EF8 000A3CF8 93 E1 00 1C */ stw r31, 0x1c(r1) -/* 800A6EFC 000A3CFC 3B E3 2B 38 */ addi r31, r3, lbl_802F2B38@l -/* 800A6F00 000A3D00 93 C1 00 18 */ stw r30, 0x18(r1) -/* 800A6F04 000A3D04 3B C4 2B 10 */ addi r30, r4, lbl_802F2B10@l -/* 800A6F08 000A3D08 93 A1 00 14 */ stw r29, 0x14(r1) -/* 800A6F0C 000A3D0C 3B A0 00 00 */ li r29, 0 -lbl_800A6F10: -/* 800A6F10 000A3D10 80 7E 00 00 */ lwz r3, 0(r30) -/* 800A6F14 000A3D14 28 03 00 00 */ cmplwi r3, 0 -/* 800A6F18 000A3D18 41 82 00 0C */ beq lbl_800A6F24 -/* 800A6F1C 000A3D1C C0 3F 00 00 */ lfs f1, 0(r31) -/* 800A6F20 000A3D20 4B FA 24 89 */ bl xSndSetVol__FUif -lbl_800A6F24: -/* 800A6F24 000A3D24 3B BD 00 01 */ addi r29, r29, 1 -/* 800A6F28 000A3D28 3B DE 00 14 */ addi r30, r30, 0x14 -/* 800A6F2C 000A3D2C 2C 1D 00 02 */ cmpwi r29, 2 -/* 800A6F30 000A3D30 41 80 FF E0 */ blt lbl_800A6F10 -/* 800A6F34 000A3D34 80 01 00 24 */ lwz r0, 0x24(r1) -/* 800A6F38 000A3D38 83 E1 00 1C */ lwz r31, 0x1c(r1) -/* 800A6F3C 000A3D3C 83 C1 00 18 */ lwz r30, 0x18(r1) -/* 800A6F40 000A3D40 83 A1 00 14 */ lwz r29, 0x14(r1) -/* 800A6F44 000A3D44 7C 08 03 A6 */ mtlr r0 -/* 800A6F48 000A3D48 38 21 00 20 */ addi r1, r1, 0x20 -/* 800A6F4C 000A3D4C 4E 80 00 20 */ blr - .global zMusicInit__Fv zMusicInit__Fv: /* 800A6F50 000A3D50 94 21 FF F0 */ stwu r1, -0x10(r1) /* 800A6F54 000A3D54 7C 08 02 A6 */ mflr r0 -/* 800A6F58 000A3D58 3C 60 80 2F */ lis r3, lbl_802F2B10@ha +/* 800A6F58 000A3D58 3C 60 80 2F */ lis r3, sMusicTrack@ha /* 800A6F5C 000A3D5C 90 01 00 14 */ stw r0, 0x14(r1) /* 800A6F60 000A3D60 38 00 00 00 */ li r0, 0 -/* 800A6F64 000A3D64 38 83 2B 10 */ addi r4, r3, lbl_802F2B10@l +/* 800A6F64 000A3D64 38 83 2B 10 */ addi r4, r3, sMusicTrack@l /* 800A6F68 000A3D68 3C 60 80 26 */ lis r3, lbl_8025E588@ha -/* 800A6F6C 000A3D6C 90 0D 90 58 */ stw r0, lbl_803CB958-_SDA_BASE_(r13) +/* 800A6F6C 000A3D6C 90 0D 90 58 */ stw r0, sMusicPaused-_SDA_BASE_(r13) /* 800A6F70 000A3D70 38 63 E5 88 */ addi r3, r3, lbl_8025E588@l /* 800A6F74 000A3D74 90 04 00 00 */ stw r0, 0(r4) /* 800A6F78 000A3D78 90 04 00 04 */ stw r0, 4(r4) @@ -413,7 +381,7 @@ lbl_800A7450: /* 800A74AC 000A42AC 4B FF FE 69 */ bl getCurrLevelMusicEnum__Fv /* 800A74B0 000A42B0 7C 7A 1B 78 */ mr r26, r3 /* 800A74B4 000A42B4 48 00 00 30 */ b lbl_800A74E4 -/* 800A74B8 000A42B8 83 4D 82 D0 */ lwz r26, lbl_803CABD0-_SDA_BASE_(r13) +/* 800A74B8 000A42B8 83 4D 82 D0 */ lwz r26, sMusicLastEnum-_SDA_BASE_(r13) /* 800A74BC 000A42BC 48 00 00 28 */ b lbl_800A74E4 /* 800A74C0 000A42C0 3B 40 00 01 */ li r26, 1 /* 800A74C4 000A42C4 48 00 00 20 */ b lbl_800A74E4 @@ -427,8 +395,8 @@ lbl_800A74C8: /* 800A74E0 000A42E0 7F 40 18 50 */ subf r26, r0, r3 lbl_800A74E4: /* 800A74E4 000A42E4 1F D9 00 14 */ mulli r30, r25, 0x14 -/* 800A74E8 000A42E8 3C 60 80 2F */ lis r3, lbl_802F2B10@ha -/* 800A74EC 000A42EC 3B E3 2B 10 */ addi r31, r3, lbl_802F2B10@l +/* 800A74E8 000A42E8 3C 60 80 2F */ lis r3, sMusicTrack@ha +/* 800A74EC 000A42EC 3B E3 2B 10 */ addi r31, r3, sMusicTrack@l /* 800A74F0 000A42F0 7C 7F F0 2E */ lwzx r3, r31, r30 /* 800A74F4 000A42F4 28 03 00 00 */ cmplwi r3, 0 /* 800A74F8 000A42F8 41 82 00 10 */ beq lbl_800A7508 @@ -439,14 +407,14 @@ lbl_800A7508: /* 800A7508 000A4308 3C 80 80 2F */ lis r4, lbl_802F2A50@ha /* 800A750C 000A430C 57 5D 18 38 */ slwi r29, r26, 3 /* 800A7510 000A4310 38 04 2A 50 */ addi r0, r4, lbl_802F2A50@l -/* 800A7514 000A4314 3C 60 80 2F */ lis r3, lbl_802F2B10@ha +/* 800A7514 000A4314 3C 60 80 2F */ lis r3, sMusicTrack@ha /* 800A7518 000A4318 7C 80 EA 14 */ add r4, r0, r29 /* 800A751C 000A431C 2C 1A 00 09 */ cmpwi r26, 9 -/* 800A7520 000A4320 38 03 2B 10 */ addi r0, r3, lbl_802F2B10@l +/* 800A7520 000A4320 38 03 2B 10 */ addi r0, r3, sMusicTrack@l /* 800A7524 000A4324 80 64 00 04 */ lwz r3, 4(r4) /* 800A7528 000A4328 7C 80 F2 14 */ add r4, r0, r30 /* 800A752C 000A432C 94 64 00 04 */ stwu r3, 4(r4) -/* 800A7530 000A4330 C0 42 93 C8 */ lfs f2, lbl_803CDD48-_SDA2_BASE_(r2) +/* 800A7530 000A4330 C0 42 93 C8 */ lfs f2, unkFloat-_SDA2_BASE_(r2) /* 800A7534 000A4334 40 82 00 2C */ bne lbl_800A7560 /* 800A7538 000A4338 3C 60 80 3C */ lis r3, globals@ha /* 800A753C 000A433C 38 63 05 58 */ addi r3, r3, globals@l @@ -473,7 +441,7 @@ lbl_800A7560: /* 800A758C 000A438C 64 00 00 01 */ oris r0, r0, 1 /* 800A7590 000A4390 7C 78 E8 2E */ lwzx r3, r24, r29 /* 800A7594 000A4394 7C 80 03 78 */ or r0, r4, r0 -/* 800A7598 000A4398 C0 62 93 C8 */ lfs f3, lbl_803CDD48-_SDA2_BASE_(r2) +/* 800A7598 000A4398 C0 62 93 C8 */ lfs f3, unkFloat-_SDA2_BASE_(r2) /* 800A759C 000A439C 64 05 00 02 */ oris r5, r0, 2 /* 800A75A0 000A43A0 38 80 00 FF */ li r4, 0xff /* 800A75A4 000A43A4 38 C0 00 00 */ li r6, 0 @@ -483,9 +451,9 @@ lbl_800A7560: /* 800A75B4 000A43B4 7C 1F F0 2E */ lwzx r0, r31, r30 /* 800A75B8 000A43B8 28 00 00 00 */ cmplwi r0, 0 /* 800A75BC 000A43BC 41 82 00 64 */ beq lbl_800A7620 -/* 800A75C0 000A43C0 3C 60 80 2F */ lis r3, lbl_802F2B10@ha +/* 800A75C0 000A43C0 3C 60 80 2F */ lis r3, sMusicTrack@ha /* 800A75C4 000A43C4 7C BC D8 2E */ lwzx r5, r28, r27 -/* 800A75C8 000A43C8 38 03 2B 10 */ addi r0, r3, lbl_802F2B10@l +/* 800A75C8 000A43C8 38 03 2B 10 */ addi r0, r3, sMusicTrack@l /* 800A75CC 000A43CC 7C 98 E8 2E */ lwzx r4, r24, r29 /* 800A75D0 000A43D0 7C 60 F2 14 */ add r3, r0, r30 /* 800A75D4 000A43D4 28 05 00 00 */ cmplwi r5, 0 @@ -495,7 +463,7 @@ lbl_800A7560: /* 800A75E4 000A43E4 7C 7F F0 2E */ lwzx r3, r31, r30 /* 800A75E8 000A43E8 38 00 00 00 */ li r0, 0 /* 800A75EC 000A43EC 90 65 00 1C */ stw r3, 0x1c(r5) -/* 800A75F0 000A43F0 C0 02 93 C8 */ lfs f0, lbl_803CDD48-_SDA2_BASE_(r2) +/* 800A75F0 000A43F0 C0 02 93 C8 */ lfs f0, unkFloat-_SDA2_BASE_(r2) /* 800A75F4 000A43F4 7C 7C D8 2E */ lwzx r3, r28, r27 /* 800A75F8 000A43F8 D0 03 00 14 */ stfs f0, 0x14(r3) /* 800A75FC 000A43FC 7C 9C D8 2E */ lwzx r4, r28, r27 @@ -504,7 +472,7 @@ lbl_800A7560: /* 800A7608 000A4408 90 64 00 18 */ stw r3, 0x18(r4) /* 800A760C 000A440C 7C 1C D9 2E */ stwx r0, r28, r27 lbl_800A7610: -/* 800A7610 000A4410 38 8D 82 D0 */ addi r4, r13, lbl_803CABD0-_SDA_BASE_ +/* 800A7610 000A4410 38 8D 82 D0 */ addi r4, r13, sMusicLastEnum-_SDA_BASE_ /* 800A7614 000A4414 38 60 00 01 */ li r3, 1 /* 800A7618 000A4418 7F 44 D9 2E */ stwx r26, r4, r27 /* 800A761C 000A441C 48 00 00 08 */ b lbl_800A7624 @@ -521,7 +489,7 @@ lbl_800A7624: .global zMusicNotify__Fi zMusicNotify__Fi: -/* 800A7640 000A4440 80 0D 90 58 */ lwz r0, lbl_803CB958-_SDA_BASE_(r13) +/* 800A7640 000A4440 80 0D 90 58 */ lwz r0, sMusicPaused-_SDA_BASE_(r13) /* 800A7644 000A4444 28 00 00 00 */ cmplwi r0, 0 /* 800A7648 000A4448 4C 82 00 20 */ bnelr /* 800A764C 000A444C 1C 83 00 2C */ mulli r4, r3, 0x2c @@ -557,10 +525,10 @@ lbl_800A7674: .global zMusicNotifyEvent__FPCfP5xBase zMusicNotifyEvent__FPCfP5xBase: /* 800A76BC 000A44BC 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 800A76C0 000A44C0 80 0D 90 58 */ lwz r0, lbl_803CB958-_SDA_BASE_(r13) +/* 800A76C0 000A44C0 80 0D 90 58 */ lwz r0, sMusicPaused-_SDA_BASE_(r13) /* 800A76C4 000A44C4 28 00 00 00 */ cmplwi r0, 0 /* 800A76C8 000A44C8 40 82 00 E4 */ bne lbl_800A77AC -/* 800A76CC 000A44CC C0 22 93 C8 */ lfs f1, lbl_803CDD48-_SDA2_BASE_(r2) +/* 800A76CC 000A44CC C0 22 93 C8 */ lfs f1, unkFloat-_SDA2_BASE_(r2) /* 800A76D0 000A44D0 C0 03 00 04 */ lfs f0, 4(r3) /* 800A76D4 000A44D4 FC 01 00 00 */ fcmpu cr0, f1, f0 /* 800A76D8 000A44D8 40 82 00 0C */ bne lbl_800A76E4 @@ -573,7 +541,7 @@ lbl_800A76E8: /* 800A76EC 000A44EC 1C C0 00 2C */ mulli r6, r0, 0x2c /* 800A76F0 000A44F0 3C A0 80 29 */ lis r5, lbl_8028FD80@ha /* 800A76F4 000A44F4 FC 00 00 1E */ fctiwz f0, f0 -/* 800A76F8 000A44F8 38 8D 82 D0 */ addi r4, r13, lbl_803CABD0-_SDA_BASE_ +/* 800A76F8 000A44F8 38 8D 82 D0 */ addi r4, r13, sMusicLastEnum-_SDA_BASE_ /* 800A76FC 000A44FC 38 05 FD 80 */ addi r0, r5, lbl_8028FD80@l /* 800A7700 000A4500 7C E0 32 14 */ add r7, r0, r6 /* 800A7704 000A4504 80 07 00 00 */ lwz r0, 0(r7) @@ -633,7 +601,7 @@ zMusicUpdate__Ff: /* 800A77C8 000A45C8 93 E1 00 1C */ stw r31, 0x1c(r1) /* 800A77CC 000A45CC 93 C1 00 18 */ stw r30, 0x18(r1) /* 800A77D0 000A45D0 93 A1 00 14 */ stw r29, 0x14(r1) -/* 800A77D4 000A45D4 80 0D 90 58 */ lwz r0, lbl_803CB958-_SDA_BASE_(r13) +/* 800A77D4 000A45D4 80 0D 90 58 */ lwz r0, sMusicPaused-_SDA_BASE_(r13) /* 800A77D8 000A45D8 FF E0 08 90 */ fmr f31, f1 /* 800A77DC 000A45DC 28 00 00 00 */ cmplwi r0, 0 /* 800A77E0 000A45E0 40 82 01 20 */ bne lbl_800A7900 @@ -668,7 +636,7 @@ zMusicUpdate__Ff: /* 800A7854 000A4654 D0 03 01 48 */ stfs f0, 0x148(r3) lbl_800A7858: /* 800A7858 000A4658 C0 3F 00 00 */ lfs f1, 0(r31) -/* 800A785C 000A465C C0 02 93 C8 */ lfs f0, lbl_803CDD48-_SDA2_BASE_(r2) +/* 800A785C 000A465C C0 02 93 C8 */ lfs f0, unkFloat-_SDA2_BASE_(r2) /* 800A7860 000A4660 FC 01 00 00 */ fcmpu cr0, f1, f0 /* 800A7864 000A4664 40 82 00 10 */ bne lbl_800A7874 /* 800A7868 000A4668 80 1E 00 00 */ lwz r0, 0(r30) @@ -683,19 +651,19 @@ lbl_800A7874: /* 800A7888 000A4688 54 83 DE 3E */ rlwinm r3, r4, 0x1b, 0x18, 0x1f /* 800A788C 000A468C 7C 03 00 00 */ cmpw r3, r0 /* 800A7890 000A4690 40 82 00 54 */ bne lbl_800A78E4 -/* 800A7894 000A4694 C0 02 93 C8 */ lfs f0, lbl_803CDD48-_SDA2_BASE_(r2) +/* 800A7894 000A4694 C0 02 93 C8 */ lfs f0, unkFloat-_SDA2_BASE_(r2) /* 800A7898 000A4698 FC 01 00 40 */ fcmpo cr0, f1, f0 /* 800A789C 000A469C 40 81 00 24 */ ble lbl_800A78C0 /* 800A78A0 000A46A0 C0 1F 00 00 */ lfs f0, 0(r31) /* 800A78A4 000A46A4 EC 00 F8 28 */ fsubs f0, f0, f31 /* 800A78A8 000A46A8 D0 1F 00 00 */ stfs f0, 0(r31) /* 800A78AC 000A46AC C0 3F 00 00 */ lfs f1, 0(r31) -/* 800A78B0 000A46B0 C0 02 93 C8 */ lfs f0, lbl_803CDD48-_SDA2_BASE_(r2) +/* 800A78B0 000A46B0 C0 02 93 C8 */ lfs f0, unkFloat-_SDA2_BASE_(r2) /* 800A78B4 000A46B4 FC 01 00 40 */ fcmpo cr0, f1, f0 /* 800A78B8 000A46B8 40 80 00 08 */ bge lbl_800A78C0 /* 800A78BC 000A46BC D0 1F 00 00 */ stfs f0, 0(r31) lbl_800A78C0: -/* 800A78C0 000A46C0 C0 22 93 C8 */ lfs f1, lbl_803CDD48-_SDA2_BASE_(r2) +/* 800A78C0 000A46C0 C0 22 93 C8 */ lfs f1, unkFloat-_SDA2_BASE_(r2) /* 800A78C4 000A46C4 C0 1F 00 00 */ lfs f0, 0(r31) /* 800A78C8 000A46C8 FC 01 00 00 */ fcmpu cr0, f1, f0 /* 800A78CC 000A46CC 40 82 00 18 */ bne lbl_800A78E4 @@ -732,9 +700,9 @@ volume_update__Ff: /* 800A7938 000A4738 93 E1 00 1C */ stw r31, 0x1c(r1) /* 800A793C 000A473C 93 C1 00 18 */ stw r30, 0x18(r1) /* 800A7940 000A4740 93 A1 00 14 */ stw r29, 0x14(r1) -/* 800A7944 000A4744 3C 60 80 2F */ lis r3, lbl_802F2B38@ha +/* 800A7944 000A4744 3C 60 80 2F */ lis r3, volume@ha /* 800A7948 000A4748 C0 02 93 D8 */ lfs f0, lbl_803CDD58-_SDA2_BASE_(r2) -/* 800A794C 000A474C 38 83 2B 38 */ addi r4, r3, lbl_802F2B38@l +/* 800A794C 000A474C 38 83 2B 38 */ addi r4, r3, volume@l /* 800A7950 000A4750 C0 44 00 08 */ lfs f2, 8(r4) /* 800A7954 000A4754 C3 E4 00 00 */ lfs f31, 0(r4) /* 800A7958 000A4758 FC 02 00 40 */ fcmpo cr0, f2, f0 @@ -748,13 +716,13 @@ volume_update__Ff: /* 800A7978 000A4778 D0 04 00 00 */ stfs f0, 0(r4) /* 800A797C 000A477C 48 00 00 14 */ b lbl_800A7990 lbl_800A7980: -/* 800A7980 000A4780 3C 60 80 2F */ lis r3, lbl_802F2B38@ha -/* 800A7984 000A4784 C4 03 2B 38 */ lfsu f0, lbl_802F2B38@l(r3) +/* 800A7980 000A4780 3C 60 80 2F */ lis r3, volume@ha +/* 800A7984 000A4784 C4 03 2B 38 */ lfsu f0, volume@l(r3) /* 800A7988 000A4788 EC 02 00 7A */ fmadds f0, f2, f1, f0 /* 800A798C 000A478C D0 03 00 00 */ stfs f0, 0(r3) lbl_800A7990: /* 800A7990 000A4790 C0 44 00 08 */ lfs f2, 8(r4) -/* 800A7994 000A4794 C0 02 93 C8 */ lfs f0, lbl_803CDD48-_SDA2_BASE_(r2) +/* 800A7994 000A4794 C0 02 93 C8 */ lfs f0, unkFloat-_SDA2_BASE_(r2) /* 800A7998 000A4798 FC 02 00 40 */ fcmpo cr0, f2, f0 /* 800A799C 000A479C 40 80 00 0C */ bge lbl_800A79A8 /* 800A79A0 000A47A0 38 00 00 01 */ li r0, 1 @@ -764,41 +732,41 @@ lbl_800A79A8: lbl_800A79AC: /* 800A79AC 000A47AC 2C 00 00 00 */ cmpwi r0, 0 /* 800A79B0 000A47B0 41 82 00 1C */ beq lbl_800A79CC -/* 800A79B4 000A47B4 3C 60 80 2F */ lis r3, lbl_802F2B38@ha -/* 800A79B8 000A47B8 C4 23 2B 38 */ lfsu f1, lbl_802F2B38@l(r3) +/* 800A79B4 000A47B4 3C 60 80 2F */ lis r3, volume@ha +/* 800A79B8 000A47B8 C4 23 2B 38 */ lfsu f1, volume@l(r3) /* 800A79BC 000A47BC C0 03 00 04 */ lfs f0, 4(r3) /* 800A79C0 000A47C0 FC 01 00 40 */ fcmpo cr0, f1, f0 /* 800A79C4 000A47C4 4C 40 13 82 */ cror 2, 0, 2 /* 800A79C8 000A47C8 41 82 00 28 */ beq lbl_800A79F0 lbl_800A79CC: -/* 800A79CC 000A47CC C0 02 93 C8 */ lfs f0, lbl_803CDD48-_SDA2_BASE_(r2) +/* 800A79CC 000A47CC C0 02 93 C8 */ lfs f0, unkFloat-_SDA2_BASE_(r2) /* 800A79D0 000A47D0 FC 02 00 40 */ fcmpo cr0, f2, f0 /* 800A79D4 000A47D4 41 80 00 34 */ blt lbl_800A7A08 -/* 800A79D8 000A47D8 3C 60 80 2F */ lis r3, lbl_802F2B38@ha -/* 800A79DC 000A47DC C4 23 2B 38 */ lfsu f1, lbl_802F2B38@l(r3) +/* 800A79D8 000A47D8 3C 60 80 2F */ lis r3, volume@ha +/* 800A79DC 000A47DC C4 23 2B 38 */ lfsu f1, volume@l(r3) /* 800A79E0 000A47E0 C0 03 00 04 */ lfs f0, 4(r3) /* 800A79E4 000A47E4 FC 01 00 40 */ fcmpo cr0, f1, f0 /* 800A79E8 000A47E8 4C 41 13 82 */ cror 2, 1, 2 /* 800A79EC 000A47EC 40 82 00 1C */ bne lbl_800A7A08 lbl_800A79F0: -/* 800A79F0 000A47F0 3C 60 80 2F */ lis r3, lbl_802F2B38@ha -/* 800A79F4 000A47F4 38 63 2B 38 */ addi r3, r3, lbl_802F2B38@l +/* 800A79F0 000A47F0 3C 60 80 2F */ lis r3, volume@ha +/* 800A79F4 000A47F4 38 63 2B 38 */ addi r3, r3, volume@l /* 800A79F8 000A47F8 C0 03 00 04 */ lfs f0, 4(r3) /* 800A79FC 000A47FC D0 03 00 00 */ stfs f0, 0(r3) -/* 800A7A00 000A4800 C0 02 93 C8 */ lfs f0, lbl_803CDD48-_SDA2_BASE_(r2) +/* 800A7A00 000A4800 C0 02 93 C8 */ lfs f0, unkFloat-_SDA2_BASE_(r2) /* 800A7A04 000A4804 D0 04 00 08 */ stfs f0, 8(r4) lbl_800A7A08: -/* 800A7A08 000A4808 3C 80 80 2F */ lis r4, lbl_802F2B10@ha -/* 800A7A0C 000A480C 3C 60 80 2F */ lis r3, lbl_802F2B38@ha -/* 800A7A10 000A4810 3B E4 2B 10 */ addi r31, r4, lbl_802F2B10@l +/* 800A7A08 000A4808 3C 80 80 2F */ lis r4, sMusicTrack@ha +/* 800A7A0C 000A480C 3C 60 80 2F */ lis r3, volume@ha +/* 800A7A10 000A4810 3B E4 2B 10 */ addi r31, r4, sMusicTrack@l /* 800A7A14 000A4814 3B A0 00 00 */ li r29, 0 -/* 800A7A18 000A4818 3B C3 2B 38 */ addi r30, r3, lbl_802F2B38@l +/* 800A7A18 000A4818 3B C3 2B 38 */ addi r30, r3, volume@l lbl_800A7A1C: /* 800A7A1C 000A481C 80 7F 00 00 */ lwz r3, 0(r31) /* 800A7A20 000A4820 28 03 00 00 */ cmplwi r3, 0 /* 800A7A24 000A4824 41 82 00 44 */ beq lbl_800A7A68 -/* 800A7A28 000A4828 3C 80 80 2F */ lis r4, lbl_802F2B38@ha -/* 800A7A2C 000A482C C0 44 2B 38 */ lfs f2, lbl_802F2B38@l(r4) +/* 800A7A28 000A4828 3C 80 80 2F */ lis r4, volume@ha +/* 800A7A2C 000A482C C0 44 2B 38 */ lfs f2, volume@l(r4) /* 800A7A30 000A4830 FC 1F 10 00 */ fcmpu cr0, f31, f2 /* 800A7A34 000A4834 40 82 00 10 */ bne lbl_800A7A44 /* 800A7A38 000A4838 80 1E 00 0C */ lwz r0, 0xc(r30) @@ -831,72 +799,6 @@ lbl_800A7A68: /* 800A7A98 000A4898 38 21 00 30 */ addi r1, r1, 0x30 /* 800A7A9C 000A489C 4E 80 00 20 */ blr -.global zMusicKill__Fv -zMusicKill__Fv: -/* 800A7AA0 000A48A0 94 21 FF E0 */ stwu r1, -0x20(r1) -/* 800A7AA4 000A48A4 7C 08 02 A6 */ mflr r0 -/* 800A7AA8 000A48A8 3C 60 80 2F */ lis r3, lbl_802F2B10@ha -/* 800A7AAC 000A48AC 90 01 00 24 */ stw r0, 0x24(r1) -/* 800A7AB0 000A48B0 93 E1 00 1C */ stw r31, 0x1c(r1) -/* 800A7AB4 000A48B4 3B E0 00 00 */ li r31, 0 -/* 800A7AB8 000A48B8 93 C1 00 18 */ stw r30, 0x18(r1) -/* 800A7ABC 000A48BC 3B C3 2B 10 */ addi r30, r3, lbl_802F2B10@l -/* 800A7AC0 000A48C0 93 A1 00 14 */ stw r29, 0x14(r1) -/* 800A7AC4 000A48C4 3B A0 00 00 */ li r29, 0 -lbl_800A7AC8: -/* 800A7AC8 000A48C8 80 7E 00 00 */ lwz r3, 0(r30) -/* 800A7ACC 000A48CC 28 03 00 00 */ cmplwi r3, 0 -/* 800A7AD0 000A48D0 41 82 00 14 */ beq lbl_800A7AE4 -/* 800A7AD4 000A48D4 4B FA 17 2D */ bl xSndStop__FUi -/* 800A7AD8 000A48D8 93 FE 00 00 */ stw r31, 0(r30) -/* 800A7ADC 000A48DC 93 FE 00 04 */ stw r31, 4(r30) -/* 800A7AE0 000A48E0 93 FE 00 08 */ stw r31, 8(r30) -lbl_800A7AE4: -/* 800A7AE4 000A48E4 3B BD 00 01 */ addi r29, r29, 1 -/* 800A7AE8 000A48E8 3B DE 00 14 */ addi r30, r30, 0x14 -/* 800A7AEC 000A48EC 2C 1D 00 02 */ cmpwi r29, 2 -/* 800A7AF0 000A48F0 41 80 FF D8 */ blt lbl_800A7AC8 -/* 800A7AF4 000A48F4 80 01 00 24 */ lwz r0, 0x24(r1) -/* 800A7AF8 000A48F8 83 E1 00 1C */ lwz r31, 0x1c(r1) -/* 800A7AFC 000A48FC 83 C1 00 18 */ lwz r30, 0x18(r1) -/* 800A7B00 000A4900 83 A1 00 14 */ lwz r29, 0x14(r1) -/* 800A7B04 000A4904 7C 08 03 A6 */ mtlr r0 -/* 800A7B08 000A4908 38 21 00 20 */ addi r1, r1, 0x20 -/* 800A7B0C 000A490C 4E 80 00 20 */ blr - -.global zMusicPause__Fv -zMusicPause__Fv: -/* 800A7B10 000A4910 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 800A7B14 000A4914 7C 08 02 A6 */ mflr r0 -/* 800A7B18 000A4918 90 01 00 14 */ stw r0, 0x14(r1) -/* 800A7B1C 000A491C 93 E1 00 0C */ stw r31, 0xc(r1) -/* 800A7B20 000A4920 93 C1 00 08 */ stw r30, 8(r1) -/* 800A7B24 000A4924 80 0D 90 58 */ lwz r0, lbl_803CB958-_SDA_BASE_(r13) -/* 800A7B28 000A4928 28 00 00 00 */ cmplwi r0, 0 -/* 800A7B2C 000A492C 40 82 00 38 */ bne lbl_800A7B64 -/* 800A7B30 000A4930 3C 60 80 2F */ lis r3, lbl_802F2B10@ha -/* 800A7B34 000A4934 3B C0 00 00 */ li r30, 0 -/* 800A7B38 000A4938 3B E3 2B 10 */ addi r31, r3, lbl_802F2B10@l -lbl_800A7B3C: -/* 800A7B3C 000A493C 80 7F 00 00 */ lwz r3, 0(r31) -/* 800A7B40 000A4940 28 03 00 00 */ cmplwi r3, 0 -/* 800A7B44 000A4944 41 82 00 08 */ beq lbl_800A7B4C -/* 800A7B48 000A4948 4B FA 16 B9 */ bl xSndStop__FUi -lbl_800A7B4C: -/* 800A7B4C 000A494C 3B DE 00 01 */ addi r30, r30, 1 -/* 800A7B50 000A4950 3B FF 00 14 */ addi r31, r31, 0x14 -/* 800A7B54 000A4954 2C 1E 00 02 */ cmpwi r30, 2 -/* 800A7B58 000A4958 41 80 FF E4 */ blt lbl_800A7B3C -/* 800A7B5C 000A495C 38 00 00 01 */ li r0, 1 -/* 800A7B60 000A4960 90 0D 90 58 */ stw r0, lbl_803CB958-_SDA_BASE_(r13) -lbl_800A7B64: -/* 800A7B64 000A4964 80 01 00 14 */ lwz r0, 0x14(r1) -/* 800A7B68 000A4968 83 E1 00 0C */ lwz r31, 0xc(r1) -/* 800A7B6C 000A496C 83 C1 00 08 */ lwz r30, 8(r1) -/* 800A7B70 000A4970 7C 08 03 A6 */ mtlr r0 -/* 800A7B74 000A4974 38 21 00 10 */ addi r1, r1, 0x10 -/* 800A7B78 000A4978 4E 80 00 20 */ blr - .global zMusicUnpause__Fi zMusicUnpause__Fi: /* 800A7B7C 000A497C 94 21 FF E0 */ stwu r1, -0x20(r1) @@ -907,12 +809,12 @@ zMusicUnpause__Fi: /* 800A7B90 000A4990 93 A1 00 14 */ stw r29, 0x14(r1) /* 800A7B94 000A4994 93 81 00 10 */ stw r28, 0x10(r1) /* 800A7B98 000A4998 7C 7C 1B 78 */ mr r28, r3 -/* 800A7B9C 000A499C 80 0D 90 58 */ lwz r0, lbl_803CB958-_SDA_BASE_(r13) +/* 800A7B9C 000A499C 80 0D 90 58 */ lwz r0, sMusicPaused-_SDA_BASE_(r13) /* 800A7BA0 000A49A0 28 00 00 00 */ cmplwi r0, 0 /* 800A7BA4 000A49A4 41 82 00 9C */ beq lbl_800A7C40 -/* 800A7BA8 000A49A8 3C 60 80 2F */ lis r3, lbl_802F2B10@ha +/* 800A7BA8 000A49A8 3C 60 80 2F */ lis r3, sMusicTrack@ha /* 800A7BAC 000A49AC 3B A0 00 00 */ li r29, 0 -/* 800A7BB0 000A49B0 3B E3 2B 10 */ addi r31, r3, lbl_802F2B10@l +/* 800A7BB0 000A49B0 3B E3 2B 10 */ addi r31, r3, sMusicTrack@l /* 800A7BB4 000A49B4 3B C0 00 00 */ li r30, 0 lbl_800A7BB8: /* 800A7BB8 000A49B8 80 1F 00 00 */ lwz r0, 0(r31) @@ -926,7 +828,7 @@ lbl_800A7BB8: lbl_800A7BD8: /* 800A7BD8 000A49D8 80 BF 00 04 */ lwz r5, 4(r31) /* 800A7BDC 000A49DC 3C 60 00 01 */ lis r3, 0x00008000@ha -/* 800A7BE0 000A49E0 C0 42 93 C8 */ lfs f2, lbl_803CDD48-_SDA2_BASE_(r2) +/* 800A7BE0 000A49E0 C0 42 93 C8 */ lfs f2, unkFloat-_SDA2_BASE_(r2) /* 800A7BE4 000A49E4 38 03 80 00 */ addi r0, r3, 0x00008000@l /* 800A7BE8 000A49E8 7C 85 00 D0 */ neg r4, r5 /* 800A7BEC 000A49EC 80 7F 00 0C */ lwz r3, 0xc(r31) @@ -950,7 +852,7 @@ lbl_800A7C24: /* 800A7C30 000A4A30 3B FF 00 14 */ addi r31, r31, 0x14 /* 800A7C34 000A4A34 41 80 FF 84 */ blt lbl_800A7BB8 /* 800A7C38 000A4A38 38 00 00 00 */ li r0, 0 -/* 800A7C3C 000A4A3C 90 0D 90 58 */ stw r0, lbl_803CB958-_SDA_BASE_(r13) +/* 800A7C3C 000A4A3C 90 0D 90 58 */ stw r0, sMusicPaused-_SDA_BASE_(r13) lbl_800A7C40: /* 800A7C40 000A4A40 80 01 00 24 */ lwz r0, 0x24(r1) /* 800A7C44 000A4A44 83 E1 00 1C */ lwz r31, 0x1c(r1) @@ -964,35 +866,18 @@ lbl_800A7C40: .global zMusicSetVolume__Fff zMusicSetVolume__Fff: /* 800A7C60 000A4A60 FC 60 08 18 */ frsp f3, f1 -/* 800A7C64 000A4A64 3C 60 80 2F */ lis r3, lbl_802F2B38@ha -/* 800A7C68 000A4A68 C4 03 2B 38 */ lfsu f0, lbl_802F2B38@l(r3) +/* 800A7C64 000A4A64 3C 60 80 2F */ lis r3, volume@ha +/* 800A7C68 000A4A68 C4 03 2B 38 */ lfsu f0, volume@l(r3) /* 800A7C6C 000A4A6C D0 23 00 04 */ stfs f1, 4(r3) /* 800A7C70 000A4A70 EC 23 00 28 */ fsubs f1, f3, f0 /* 800A7C74 000A4A74 D0 23 00 08 */ stfs f1, 8(r3) -/* 800A7C78 000A4A78 C0 02 93 E0 */ lfs f0, lbl_803CDD60-_SDA2_BASE_(r2) +/* 800A7C78 000A4A78 C0 02 93 E0 */ lfs f0, minDelay-_SDA2_BASE_(r2) /* 800A7C7C 000A4A7C FC 02 00 40 */ fcmpo cr0, f2, f0 /* 800A7C80 000A4A80 4C 81 00 20 */ blelr /* 800A7C84 000A4A84 EC 01 10 24 */ fdivs f0, f1, f2 /* 800A7C88 000A4A88 D0 03 00 08 */ stfs f0, 8(r3) /* 800A7C8C 000A4A8C 4E 80 00 20 */ blr -.global zMusicReset__Fv -zMusicReset__Fv: -/* 800A7C90 000A4A90 94 21 FF F0 */ stwu r1, -0x10(r1) -/* 800A7C94 000A4A94 7C 08 02 A6 */ mflr r0 -/* 800A7C98 000A4A98 90 01 00 14 */ stw r0, 0x14(r1) -/* 800A7C9C 000A4A9C 4B FF F6 79 */ bl getCurrLevelMusicEnum__Fv -/* 800A7CA0 000A4AA0 80 0D 82 D0 */ lwz r0, lbl_803CABD0-_SDA_BASE_(r13) -/* 800A7CA4 000A4AA4 7C 00 18 00 */ cmpw r0, r3 -/* 800A7CA8 000A4AA8 41 82 00 0C */ beq lbl_800A7CB4 -/* 800A7CAC 000A4AAC 38 60 00 00 */ li r3, 0 -/* 800A7CB0 000A4AB0 4B FF F9 91 */ bl zMusicNotify__Fi -lbl_800A7CB4: -/* 800A7CB4 000A4AB4 80 01 00 14 */ lwz r0, 0x14(r1) -/* 800A7CB8 000A4AB8 7C 08 03 A6 */ mtlr r0 -/* 800A7CBC 000A4ABC 38 21 00 10 */ addi r1, r1, 0x10 -/* 800A7CC0 000A4AC0 4E 80 00 20 */ blr - .endif .section .rodata @@ -1010,25 +895,30 @@ lbl_8028FF1C: .section .bss lbl_802F2A50: .skip 0xC0 -lbl_802F2B10: +.global sMusicTrack +sMusicTrack: .skip 0x28 -lbl_802F2B38: +.global volume +volume: .skip 0x18 .section .sbss -lbl_803CB958: +.global sMusicPaused +sMusicPaused: .skip 0x4 lbl_803CB95C: .skip 0xC .section .sdata -lbl_803CABD0: +.global sMusicLastEnum +sMusicLastEnum: .incbin "baserom.dol", 0x2B5C90, 0x8 lbl_803CABD8: .incbin "baserom.dol", 0x2B5C98, 0x8 .section .sdata2 -lbl_803CDD48: +.global unkFloat +unkFloat: .incbin "baserom.dol", 0x2B75E8, 0x4 lbl_803CDD4C: .incbin "baserom.dol", 0x2B75EC, 0x4 @@ -1040,5 +930,6 @@ lbl_803CDD58: .incbin "baserom.dol", 0x2B75F8, 0x4 lbl_803CDD5C: .incbin "baserom.dol", 0x2B75FC, 0x4 -lbl_803CDD60: - .incbin "baserom.dol", 0x2B7600, 0x8 +.global minDelay +minDelay: + .incbin "baserom.dol", 0x2B7600, 0x8 \ No newline at end of file diff --git a/src/Core/x/xSnd.h b/src/Core/x/xSnd.h index a36b33f8a..491383548 100644 --- a/src/Core/x/xSnd.h +++ b/src/Core/x/xSnd.h @@ -3,9 +3,23 @@ #include +enum sound_category +{ + SND_CAT_GAME, + SND_CAT_DIALOG, + SND_CAT_MUSIC, + SND_CAT_CUTSCENE, + SND_CAT_UI, + SND_CAT_NUM_CATEGORIES, + SND_CAT_INVALID = 0xffffffff +}; + void xSndResume(); void xSndSuspend(); void xSndSetVol(uint32 snd, float32 vol); void xSndSetPitch(uint32 snd, float32 pitch); +uint32 xSndPlay(uint32 id, float32 vol, float32 pitch, uint32 priority, uint32 flags, + uint32 parentID, sound_category category, float32 delay); +void xSndStop(uint32 snd); #endif \ No newline at end of file diff --git a/src/Game/zMusic.cpp b/src/Game/zMusic.cpp index 72564963c..454874d11 100644 --- a/src/Game/zMusic.cpp +++ b/src/Game/zMusic.cpp @@ -1,19 +1,118 @@ +#include #include "zMusic.h" +#include "../Core/x/xSnd.h" +#include "../Core/x/xMath.h" +#include "zScene.h" -#include +extern zMusicTrackInfo sMusicTrack[2]; +extern zVolumeInfo volume; +extern uint32 sMusicPaused; +extern int32 sMusicLastEnum[2]; +extern float32 unkFloat; //0f by default. +extern float32 minDelay; //Value is defaulted at 0.001f. // func_800A6E9C #pragma GLOBAL_ASM("asm/Game/zMusic.s", "volume_reset__Fv") -// func_800A6EE4 -#pragma GLOBAL_ASM("asm/Game/zMusic.s", "zMusicRefreshVolume__Fv") +// Reset both music tracks to their default volume. +void zMusicRefreshVolume() +{ + for (int32 i = 0; i < 2; i++) + { + zMusicTrackInfo* track = &sMusicTrack[i]; + if (track->snd_id != 0) + { + xSndSetVol(track->snd_id, + volume.cur); // Only reset volume if the sound ID is not blank. + } + } +} // func_800A6F50 #pragma GLOBAL_ASM("asm/Game/zMusic.s", "zMusicInit__Fv") +// WIP. +#if 1 + // func_800A7314 #pragma GLOBAL_ASM("asm/Game/zMusic.s", "getCurrLevelMusicEnum__Fv") +#else + +// Correct, but won't work due to the switch case jump table (messes with offsets). Obviously names are temporary. +int32 getCurrLevelMusicEnum() +{ + uint32 uVar1; + uint32 uVar2; + int32 uVar3; + + uVar1 = zSceneGetLevelIndex(); + switch (uVar1) + { + case 0: + uVar3 = 0; + break; + case 1: + uVar3 = 1; + break; + case 2: + uVar3 = 2; + break; + case 3: + uVar3 = 3; + break; + case 4: + uVar3 = 4; + break; + case 5: + uVar3 = 5; + break; + case 6: + uVar3 = 6; + break; + case 7: + uVar3 = 0; + break; + case 8: + uVar3 = 8; + break; + case 9: + uVar3 = 9; + break; + case 10: + uVar3 = 10; + break; + case 0xb: + uVar3 = 0xb; + break; + case 0xc: + uVar3 = 0xc; + break; + case 0xd: + uVar3 = 2; + break; + case 0xe: + uVar3 = 0xd; + break; + default: + uVar2 = xrand(); + uVar3 = uVar2 % 0x17 + 1; + if (0x18 <= uVar3) + { + uVar3 = uVar3 - 1; + } + if (((uVar3 == 4) || (uVar3 == 7)) || (uVar3 == 8)) + { + uVar3 = 5; + } + break; + } + + return uVar3; +} + +#endif + // func_800A7414 #pragma GLOBAL_ASM("asm/Game/zMusic.s", "zMusicDo__Fi") @@ -29,17 +128,108 @@ // func_800A7924 #pragma GLOBAL_ASM("asm/Game/zMusic.s", "volume_update__Ff") -// func_800A7AA0 -#pragma GLOBAL_ASM("asm/Game/zMusic.s", "zMusicKill__Fv") +// Stop all tracks and set them to null. +void zMusicKill() +{ + for (int32 i = 0; i < 2; i++) + { + zMusicTrackInfo* track = &sMusicTrack[i]; + if (track->snd_id != 0) + { + xSndStop(track->snd_id); + track->snd_id = 0; + track->loop = 0; + track->situation = 0; + } + } +} -// func_800A7B10 -#pragma GLOBAL_ASM("asm/Game/zMusic.s", "zMusicPause__Fv") +// Pause music by stopping any non-null tracks. +void zMusicPause() +{ + if (sMusicPaused == 0) + { + for (int32 i = 0; i < 2; i++) + { + zMusicTrackInfo* track = &sMusicTrack[i]; + if (track->snd_id != 0) + { + xSndStop(track->snd_id); + } + } + sMusicPaused = 1; + } +} + +// WIP. +#if 1 // func_800A7B7C #pragma GLOBAL_ASM("asm/Game/zMusic.s", "zMusicUnpause__Fi") +#else + +// Only thing that doesn't compile correctly is the function call to xSndPlay, in which a bunch of stuff is in the wrong order it looks like. +void zMusicUnpause(int32 kill) +{ + if (sMusicPaused != 0) + { + for (int32 i = 0; i < 2; i++) + { + zMusicTrackInfo* track = &sMusicTrack[i]; + uint32 prioBase = 0x800 * i; + if (track->snd_id != 0) + { + if (kill != 0) + { + track->snd_id = 0; + } + else + { + uint32 res = + xSndPlay(track->assetID, track->lastVol, unkFloat, 0xff, + prioBase | (int)(-track->loop | track->loop) >> 0x1f & 0x8000U | + 0x10000 | 0x20000, + 0, SND_CAT_MUSIC, unkFloat); + track->snd_id = res; + } + } + } + sMusicPaused = 0; + } +} + +#endif + +// WIP. +#if 1 + // func_800A7C60 #pragma GLOBAL_ASM("asm/Game/zMusic.s", "zMusicSetVolume__Fff") -// func_800A7C90 -#pragma GLOBAL_ASM("asm/Game/zMusic.s", "zMusicReset__Fv") +#else + +// Not sure what's wrong with this one. Doesn't match in the slightest. +void zMusicSetVolume(float32 vol, float32 delay) +{ + if (delay <= minDelay) + { + volume.end = vol; + volume.inc = vol - volume.cur; + return; + } + volume.end = vol; + volume.inc = (vol - volume.cur) / delay; +} + +#endif + +void zMusicReset() +{ + int32 currMusic; + currMusic = getCurrLevelMusicEnum(); + if (sMusicLastEnum[0] != currMusic) + { + zMusicNotify(0); + } +} \ No newline at end of file diff --git a/src/Game/zMusic.h b/src/Game/zMusic.h index 48278a985..897bdd802 100644 --- a/src/Game/zMusic.h +++ b/src/Game/zMusic.h @@ -1,6 +1,33 @@ #ifndef ZMUSIC_H #define ZMUSIC_H +#include +struct zVolumeInfo +{ + float32 cur; + float32 end; + float32 inc; + uint32 adjusted[2]; +}; + +struct zMusicTrackInfo +{ + uint32 snd_id; + uint32 loop; + int32 situation; // Is actually a zMusicSituation*. + uint32 assetID; + float32 lastVol; +}; + +void volume_Reset(); +void zMusicRefreshVolume(); +int32 getCurrLevelMusicEnum(); +void zMusicNotify(int32 situation); +void zMusicSetVolume(float32 vol, float32 delay); +void zMusicKill(); +void zMusicPause(); +void zMusicUnpause(int32 kill); +void zMusicReset(); #endif \ No newline at end of file diff --git a/src/Game/zScene.h b/src/Game/zScene.h index ed6b33bea..4076cb7b1 100644 --- a/src/Game/zScene.h +++ b/src/Game/zScene.h @@ -30,5 +30,6 @@ struct zScene : xScene xBase* zSceneFindObject(uint32 gameID); void zSceneSwitch(_zPortal* p, int32 forceSameScene); +uint32 zSceneGetLevelIndex(); #endif \ No newline at end of file