From 627e6cf9b15619857f1492547cb88f7436dbec07 Mon Sep 17 00:00:00 2001 From: testyourmine <25854988+testyourmine@users.noreply.github.com> Date: Wed, 21 Jan 2026 11:02:35 -0600 Subject: [PATCH 1/2] Name APU registers in part2 --- nes_metroid/emulator/asm/part2/part2_2.s | 28 ++--- nes_metroid/emulator/asm/part2/part2_3.s | 108 +++++++++---------- nes_metroid/emulator/asm/part2/part2_4.s | 58 +++++----- nes_metroid/emulator/asm/part2/part2_5.s | 84 +++++++-------- nes_metroid/emulator/include/structs/part2.h | 34 +++--- nes_metroid/emulator/linker.ld | 32 +++--- nes_metroid/emulator/src/part2/part2.c | 48 ++++----- nes_metroid/emulator/src/part2/part2_2.c | 25 +++-- nes_metroid/emulator/src/part2/part2_3.c | 51 +++++---- nes_metroid/emulator/src/part2/part2_4.c | 29 ++--- nes_metroid/emulator/src/part2/part2_5.c | 53 ++++----- 11 files changed, 284 insertions(+), 266 deletions(-) diff --git a/nes_metroid/emulator/asm/part2/part2_2.s b/nes_metroid/emulator/asm/part2/part2_2.s index bd5c4a4d4..0315fda11 100644 --- a/nes_metroid/emulator/asm/part2/part2_2.s +++ b/nes_metroid/emulator/asm/part2/part2_2.s @@ -244,7 +244,7 @@ _030007A4: .4byte gUnk_03005AA6 _030007A8: ldr r0, _030007C0 @ =gUnk_03005AA6 strh r1, [r0] - ldr r0, _030007C4 @ =gUnk_03005A98 + ldr r0, _030007C4 @ =gEmuAudio_Pulse1_Vol ldrh r2, [r0] movs r0, #0x10 ands r0, r2 @@ -256,7 +256,7 @@ _030007A8: b _030007D0 .align 2, 0 _030007C0: .4byte gUnk_03005AA6 -_030007C4: .4byte gUnk_03005A98 +_030007C4: .4byte gEmuAudio_Pulse1_Vol _030007C8: .4byte gUnk_03005A94 _030007CC: ldr r1, _03000808 @ =gUnk_03005A94 @@ -267,14 +267,14 @@ _030007D0: movs r0, #0xf strh r0, [r1] ldr r1, _03000810 @ =sUnk_030023DC - ldr r0, _03000814 @ =gUnk_03005A9E + ldr r0, _03000814 @ =gEmuAudio_Pulse1_Hi ldrh r0, [r0] lsrs r0, r0, #3 adds r0, r0, r1 ldrb r0, [r0] lsls r0, r0, #2 bl sub_03000784 - ldr r0, _03000818 @ =gUnk_03005A7A + ldr r0, _03000818 @ =gEmuAudio_SndChn ldrh r1, [r0] movs r2, #1 adds r0, r2, #0 @@ -294,8 +294,8 @@ _03000802: _03000808: .4byte gUnk_03005A94 _0300080C: .4byte gUnk_03005AA2 _03000810: .4byte sUnk_030023DC -_03000814: .4byte gUnk_03005A9E -_03000818: .4byte gUnk_03005A7A +_03000814: .4byte gEmuAudio_Pulse1_Hi +_03000818: .4byte gEmuAudio_SndChn _0300081C: .4byte gUnk_03005FCC _03000820: .4byte gUnk_03005AA4 @@ -378,7 +378,7 @@ sub_030008B4: @ 0x030008B4 push {r4, r5, lr} lsls r0, r0, #0x18 lsrs r3, r0, #0x18 - ldr r4, _03000908 @ =gUnk_03005A98 + ldr r4, _03000908 @ =gEmuAudio_Pulse1_Vol ldrb r1, [r4] movs r2, #0x10 adds r0, r2, #0 @@ -419,7 +419,7 @@ _03000900: pop {r0} bx r0 .align 2, 0 -_03000908: .4byte gUnk_03005A98 +_03000908: .4byte gEmuAudio_Pulse1_Vol _0300090C: .4byte gUnk_03005AAD _03000910: .4byte gUnk_03005FCC _03000914: .4byte gUnk_03005AA2 @@ -428,28 +428,28 @@ _03000914: .4byte gUnk_03005AA2 sub_03000918: @ 0x03000918 lsls r0, r0, #0x18 lsrs r0, r0, #0x18 - ldr r1, _03000928 @ =gUnk_03005A9A + ldr r1, _03000928 @ =gEmuAudio_Pulse1_Sweep strh r0, [r1] ldr r1, _0300092C @ =gUnk_03005AAA movs r0, #1 strh r0, [r1] bx lr .align 2, 0 -_03000928: .4byte gUnk_03005A9A +_03000928: .4byte gEmuAudio_Pulse1_Sweep _0300092C: .4byte gUnk_03005AAA thumb_func_start sub_03000930 sub_03000930: @ 0x03000930 lsls r0, r0, #0x18 lsrs r0, r0, #0x18 - ldr r1, _03000940 @ =gUnk_03005A9C + ldr r1, _03000940 @ =gEmuAudio_Pulse1_Lo strh r0, [r1] ldr r1, _03000944 @ =gUnk_03005AAC movs r0, #1 strb r0, [r1] bx lr .align 2, 0 -_03000940: .4byte gUnk_03005A9C +_03000940: .4byte gEmuAudio_Pulse1_Lo _03000944: .4byte gUnk_03005AAC thumb_func_start sub_03000948 @@ -464,7 +464,7 @@ sub_03000948: @ 0x03000948 movs r0, #0xf0 lsls r0, r0, #4 ands r0, r1 - ldr r1, _03000974 @ =gUnk_03005A9C + ldr r1, _03000974 @ =gEmuAudio_Pulse1_Lo ldrh r1, [r1] orrs r0, r1 bl sub_03000848 @@ -474,7 +474,7 @@ _03000966: .align 2, 0 _0300096C: .4byte gUnk_03005AAC _03000970: .4byte gUnk_03005AA0 -_03000974: .4byte gUnk_03005A9C +_03000974: .4byte gEmuAudio_Pulse1_Lo _03000978: .4byte gUnk_03005A80 _0300097C: .4byte gUnk_03005A84 diff --git a/nes_metroid/emulator/asm/part2/part2_3.s b/nes_metroid/emulator/asm/part2/part2_3.s index 565047111..ae2aeda69 100644 --- a/nes_metroid/emulator/asm/part2/part2_3.s +++ b/nes_metroid/emulator/asm/part2/part2_3.s @@ -9,12 +9,12 @@ sub_030009A0: @ 0x030009A0 adds r1, r0, #0 lsls r1, r1, #0x18 lsrs r1, r1, #0x18 - ldr r0, _030009D0 @ =gUnk_03005A9E + ldr r0, _030009D0 @ =gEmuAudio_Pulse1_Hi strh r1, [r0] movs r0, #7 ands r0, r1 lsls r0, r0, #8 - ldr r1, _030009D4 @ =gUnk_03005A9C + ldr r1, _030009D4 @ =gEmuAudio_Pulse1_Lo ldrh r1, [r1] orrs r0, r1 bl sub_03000848 @@ -28,8 +28,8 @@ _030009C8: pop {r0} bx r0 .align 2, 0 -_030009D0: .4byte gUnk_03005A9E -_030009D4: .4byte gUnk_03005A9C +_030009D0: .4byte gEmuAudio_Pulse1_Hi +_030009D4: .4byte gEmuAudio_Pulse1_Lo _030009D8: .4byte gUnk_03005FCC thumb_func_start sub_030009DC @@ -44,13 +44,13 @@ sub_030009DC: @ 0x030009DC strh r0, [r1] ldr r1, _03000A34 @ =gUnk_03005A96 strh r0, [r1] - ldr r1, _03000A38 @ =gUnk_03005A98 + ldr r1, _03000A38 @ =gEmuAudio_Pulse1_Vol strh r0, [r1] - ldr r1, _03000A3C @ =gUnk_03005A9A + ldr r1, _03000A3C @ =gEmuAudio_Pulse1_Sweep strh r0, [r1] - ldr r1, _03000A40 @ =gUnk_03005A9C + ldr r1, _03000A40 @ =gEmuAudio_Pulse1_Lo strh r0, [r1] - ldr r1, _03000A44 @ =gUnk_03005A9E + ldr r1, _03000A44 @ =gEmuAudio_Pulse1_Hi strh r0, [r1] ldr r1, _03000A48 @ =gUnk_03005AA0 strh r0, [r1] @@ -76,10 +76,10 @@ _03000A28: .4byte gUnk_03005A90 _03000A2C: .4byte gUnk_03005FD0 _03000A30: .4byte gUnk_03005A94 _03000A34: .4byte gUnk_03005A96 -_03000A38: .4byte gUnk_03005A98 -_03000A3C: .4byte gUnk_03005A9A -_03000A40: .4byte gUnk_03005A9C -_03000A44: .4byte gUnk_03005A9E +_03000A38: .4byte gEmuAudio_Pulse1_Vol +_03000A3C: .4byte gEmuAudio_Pulse1_Sweep +_03000A40: .4byte gEmuAudio_Pulse1_Lo +_03000A44: .4byte gEmuAudio_Pulse1_Hi _03000A48: .4byte gUnk_03005AA0 _03000A4C: .4byte gUnk_03005AA2 _03000A50: .4byte gUnk_03005FCC @@ -108,7 +108,7 @@ _03000A84: strh r6, [r3] b _03000B50 _03000A94: - ldr r3, _03001264 @ =gUnk_03005A9A + ldr r3, _03001264 @ =gEmuAudio_Pulse1_Sweep ldrh r2, [r3] tst r2, #0x80 beq _03000AFC @@ -136,7 +136,7 @@ _03000A94: strh r3, [r4] _03000AFC: ldr r6, _03001270 @ =gUnk_03005A94 - ldr r3, _03001274 @ =gUnk_03005A98 + ldr r3, _03001274 @ =gEmuAudio_Pulse1_Vol ldrh r2, [r3] and r5, r2, #0xf tst r2, #0x10 @@ -168,7 +168,7 @@ _03000B50: ldr r5, _03001284 @ =gUnk_03005A96 ldrh r5, [r5] ldr sl, _03001288 @ =sUnk_030025FC - ldr r4, _0300128C @ =gUnk_03005A98 + ldr r4, _0300128C @ =gEmuAudio_Pulse1_Vol ldrh r4, [r4] lsr r4, r4, #6 ldr r8, _03001290 @ =sUnk_0300263C @@ -179,7 +179,7 @@ _03000B50: ldr r2, [r2] ldr r3, _0300129C @ =gUnk_03005FD0 ldr r3, [r3] - ldr r4, _030012A0 @ =gUnk_03005A98 + ldr r4, _030012A0 @ =gEmuAudio_Pulse1_Vol ldrh r4, [r4] lsr r4, r4, #6 lsls r4, r4, #1 @@ -318,7 +318,7 @@ _03000D4C: .4byte gUnk_03005AC6 _03000D50: ldr r0, _03000D68 @ =gUnk_03005AC6 strh r1, [r0] - ldr r0, _03000D6C @ =gUnk_03005AB8 + ldr r0, _03000D6C @ =gEmuAudio_Pulse2_Vol ldrh r2, [r0] movs r0, #0x10 ands r0, r2 @@ -330,7 +330,7 @@ _03000D50: b _03000D78 .align 2, 0 _03000D68: .4byte gUnk_03005AC6 -_03000D6C: .4byte gUnk_03005AB8 +_03000D6C: .4byte gEmuAudio_Pulse2_Vol _03000D70: .4byte gUnk_03005AB4 _03000D74: ldr r1, _03000D90 @ =gUnk_03005AB4 @@ -358,14 +358,14 @@ _03000DA0: _03000DA4: strh r0, [r1] ldr r1, _03000DD8 @ =sUnk_030023DC - ldr r0, _03000DDC @ =gUnk_03005ABE + ldr r0, _03000DDC @ =gEmuAudio_Pulse2_Hi ldrh r0, [r0] lsrs r0, r0, #3 adds r0, r0, r1 ldrb r0, [r0] lsls r0, r0, #2 bl sub_03000D2C - ldr r0, _03000DE0 @ =gUnk_03005A7A + ldr r0, _03000DE0 @ =gEmuAudio_SndChn ldrh r1, [r0] movs r0, #2 ands r0, r1 @@ -384,8 +384,8 @@ _03000DD0: .align 2, 0 _03000DD4: .4byte gUnk_03005ACA _03000DD8: .4byte sUnk_030023DC -_03000DDC: .4byte gUnk_03005ABE -_03000DE0: .4byte gUnk_03005A7A +_03000DDC: .4byte gEmuAudio_Pulse2_Hi +_03000DE0: .4byte gEmuAudio_SndChn _03000DE4: .4byte gUnk_03005FD8 _03000DE8: .4byte gUnk_03005AC4 @@ -421,7 +421,7 @@ sub_03000E10: @ 0x03000E10 movs r0, #0xf0 lsls r0, r0, #4 ands r0, r1 - ldr r1, _03000E3C @ =gUnk_03005ABC + ldr r1, _03000E3C @ =gEmuAudio_Pulse2_Lo ldrh r1, [r1] orrs r0, r1 bl sub_03000E40 @@ -431,7 +431,7 @@ _03000E2E: .align 2, 0 _03000E34: .4byte gUnk_03005ACC _03000E38: .4byte gUnk_03005AC0 -_03000E3C: .4byte gUnk_03005ABC +_03000E3C: .4byte gEmuAudio_Pulse2_Lo thumb_func_start sub_03000E40 sub_03000E40: @ 0x03000E40 @@ -493,7 +493,7 @@ sub_03000EAC: @ 0x03000EAC push {r4, r5, lr} lsls r0, r0, #0x18 lsrs r3, r0, #0x18 - ldr r4, _03000F00 @ =gUnk_03005AB8 + ldr r4, _03000F00 @ =gEmuAudio_Pulse2_Vol ldrb r1, [r4] movs r2, #0x10 adds r0, r2, #0 @@ -534,7 +534,7 @@ _03000EF8: pop {r0} bx r0 .align 2, 0 -_03000F00: .4byte gUnk_03005AB8 +_03000F00: .4byte gEmuAudio_Pulse2_Vol _03000F04: .4byte gUnk_03005ACD _03000F08: .4byte gUnk_03005FD8 _03000F0C: .4byte gUnk_03005AC2 @@ -543,28 +543,28 @@ _03000F0C: .4byte gUnk_03005AC2 sub_03000F10: @ 0x03000F10 lsls r0, r0, #0x18 lsrs r0, r0, #0x18 - ldr r1, _03000F20 @ =gUnk_03005ABA + ldr r1, _03000F20 @ =gEmuAudio_Pulse2_Sweep strh r0, [r1] ldr r1, _03000F24 @ =gUnk_03005ACA movs r0, #1 strh r0, [r1] bx lr .align 2, 0 -_03000F20: .4byte gUnk_03005ABA +_03000F20: .4byte gEmuAudio_Pulse2_Sweep _03000F24: .4byte gUnk_03005ACA thumb_func_start sub_03000F28 sub_03000F28: @ 0x03000F28 lsls r0, r0, #0x18 lsrs r0, r0, #0x18 - ldr r1, _03000F38 @ =gUnk_03005ABC + ldr r1, _03000F38 @ =gEmuAudio_Pulse2_Lo strh r0, [r1] ldr r1, _03000F3C @ =gUnk_03005ACC movs r0, #1 strb r0, [r1] bx lr .align 2, 0 -_03000F38: .4byte gUnk_03005ABC +_03000F38: .4byte gEmuAudio_Pulse2_Lo _03000F3C: .4byte gUnk_03005ACC thumb_func_start sub_03000F40 @@ -573,12 +573,12 @@ sub_03000F40: @ 0x03000F40 adds r1, r0, #0 lsls r1, r1, #0x18 lsrs r1, r1, #0x18 - ldr r0, _03000F70 @ =gUnk_03005ABE + ldr r0, _03000F70 @ =gEmuAudio_Pulse2_Hi strh r1, [r0] movs r0, #7 ands r0, r1 lsls r0, r0, #8 - ldr r1, _03000F74 @ =gUnk_03005ABC + ldr r1, _03000F74 @ =gEmuAudio_Pulse2_Lo ldrh r1, [r1] orrs r0, r1 bl sub_03000E40 @@ -592,8 +592,8 @@ _03000F68: pop {r0} bx r0 .align 2, 0 -_03000F70: .4byte gUnk_03005ABE -_03000F74: .4byte gUnk_03005ABC +_03000F70: .4byte gEmuAudio_Pulse2_Hi +_03000F74: .4byte gEmuAudio_Pulse2_Lo _03000F78: .4byte gUnk_03005FD8 thumb_func_start sub_03000F7C @@ -608,13 +608,13 @@ sub_03000F7C: @ 0x03000F7C strh r0, [r1] ldr r1, _03000FD4 @ =gUnk_03005AB6 strh r0, [r1] - ldr r1, _03000FD8 @ =gUnk_03005AB8 + ldr r1, _03000FD8 @ =gEmuAudio_Pulse2_Vol strh r0, [r1] - ldr r1, _03000FDC @ =gUnk_03005ABA + ldr r1, _03000FDC @ =gEmuAudio_Pulse2_Sweep strh r0, [r1] - ldr r1, _03000FE0 @ =gUnk_03005ABC + ldr r1, _03000FE0 @ =gEmuAudio_Pulse2_Lo strh r0, [r1] - ldr r1, _03000FE4 @ =gUnk_03005ABE + ldr r1, _03000FE4 @ =gEmuAudio_Pulse2_Hi strh r0, [r1] ldr r1, _03000FE8 @ =gUnk_03005AC0 strh r0, [r1] @@ -640,10 +640,10 @@ _03000FC8: .4byte gUnk_03005AB0 _03000FCC: .4byte gUnk_03005FC4 _03000FD0: .4byte gUnk_03005AB4 _03000FD4: .4byte gUnk_03005AB6 -_03000FD8: .4byte gUnk_03005AB8 -_03000FDC: .4byte gUnk_03005ABA -_03000FE0: .4byte gUnk_03005ABC -_03000FE4: .4byte gUnk_03005ABE +_03000FD8: .4byte gEmuAudio_Pulse2_Vol +_03000FDC: .4byte gEmuAudio_Pulse2_Sweep +_03000FE0: .4byte gEmuAudio_Pulse2_Lo +_03000FE4: .4byte gEmuAudio_Pulse2_Hi _03000FE8: .4byte gUnk_03005AC0 _03000FEC: .4byte gUnk_03005AC2 _03000FF0: .4byte gUnk_03005FD8 @@ -672,7 +672,7 @@ _03001024: strh r6, [r3] b _030010EC _03001034: - ldr r3, _030012C4 @ =gUnk_03005ABA + ldr r3, _030012C4 @ =gEmuAudio_Pulse2_Sweep ldrh r2, [r3] tst r2, #0x80 beq _03001098 @@ -699,7 +699,7 @@ _03001034: strh r3, [r4] _03001098: ldr r6, _030012D0 @ =gUnk_03005AB4 - ldr r3, _030012D4 @ =gUnk_03005AB8 + ldr r3, _030012D4 @ =gEmuAudio_Pulse2_Vol ldrh r2, [r3] and r5, r2, #0xf tst r2, #0x10 @@ -731,7 +731,7 @@ _030010EC: ldr r5, _030012E4 @ =gUnk_03005AB6 ldrh r5, [r5] ldr sl, _030012E8 @ =sUnk_030025FC - ldr r4, _030012EC @ =gUnk_03005AB8 + ldr r4, _030012EC @ =gEmuAudio_Pulse2_Vol ldrh r4, [r4] lsr r4, r4, #6 ldr r8, _030012F0 @ =sUnk_0300263C @@ -742,7 +742,7 @@ _030010EC: ldr r2, [r2] ldr r3, _030012FC @ =gUnk_03005FC4 ldr r3, [r3] - ldr r4, _03001300 @ =gUnk_03005AB8 + ldr r4, _03001300 @ =gEmuAudio_Pulse2_Vol ldrh r4, [r4] lsr r4, r4, #6 lsls r4, r4, #1 @@ -825,22 +825,22 @@ sub_03001258: @ 0x03001258 _0300125C: .4byte gUnk_03005AA4 _03001260: .4byte gUnk_03005A94 -_03001264: .4byte gUnk_03005A9A +_03001264: .4byte gEmuAudio_Pulse1_Sweep _03001268: .4byte gUnk_03005AAA _0300126C: .4byte gUnk_03005AA0 _03001270: .4byte gUnk_03005A94 -_03001274: .4byte gUnk_03005A98 +_03001274: .4byte gEmuAudio_Pulse1_Vol _03001278: .4byte gUnk_03005AA2 _0300127C: .4byte gUnk_03005AA0 _03001280: .4byte gUnk_03005A94 _03001284: .4byte gUnk_03005A96 _03001288: .4byte sUnk_030025FC -_0300128C: .4byte gUnk_03005A98 +_0300128C: .4byte gEmuAudio_Pulse1_Vol _03001290: .4byte sUnk_0300263C _03001294: .4byte sUnk_03002640 _03001298: .4byte gUnk_03005A90 _0300129C: .4byte gUnk_03005FD0 -_030012A0: .4byte gUnk_03005A98 +_030012A0: .4byte gEmuAudio_Pulse1_Vol _030012A4: .4byte gUnk_03005A96 _030012A8: .4byte gUnk_03005A90 _030012AC: .4byte gUnk_03005A90 @@ -850,22 +850,22 @@ _030012B8: .4byte gUnk_03005AA4 _030012BC: .4byte gUnk_03005AC4 _030012C0: .4byte gUnk_03005AB4 -_030012C4: .4byte gUnk_03005ABA +_030012C4: .4byte gEmuAudio_Pulse2_Sweep _030012C8: .4byte gUnk_03005ACA _030012CC: .4byte gUnk_03005AC0 _030012D0: .4byte gUnk_03005AB4 -_030012D4: .4byte gUnk_03005AB8 +_030012D4: .4byte gEmuAudio_Pulse2_Vol _030012D8: .4byte gUnk_03005AC2 _030012DC: .4byte gUnk_03005AC0 _030012E0: .4byte gUnk_03005AB4 _030012E4: .4byte gUnk_03005AB6 _030012E8: .4byte sUnk_030025FC -_030012EC: .4byte gUnk_03005AB8 +_030012EC: .4byte gEmuAudio_Pulse2_Vol _030012F0: .4byte sUnk_0300263C _030012F4: .4byte sUnk_03002640 _030012F8: .4byte gUnk_03005AB0 _030012FC: .4byte gUnk_03005FC4 -_03001300: .4byte gUnk_03005AB8 +_03001300: .4byte gEmuAudio_Pulse2_Vol _03001304: .4byte gUnk_03005AB6 _03001308: .4byte gUnk_03005AB0 _0300130C: .4byte gUnk_03005AB0 diff --git a/nes_metroid/emulator/asm/part2/part2_4.s b/nes_metroid/emulator/asm/part2/part2_4.s index b7dbd72c1..fbc898587 100644 --- a/nes_metroid/emulator/asm/part2/part2_4.s +++ b/nes_metroid/emulator/asm/part2/part2_4.s @@ -31,20 +31,20 @@ _0300133C: .4byte gUnk_03005AD4 sub_03001340: @ 0x03001340 push {r4, lr} ldr r1, _030013A4 @ =sUnk_030023DC - ldr r0, _030013A8 @ =gUnk_03005AE2 + ldr r0, _030013A8 @ =gEmuAudio_Triangle_Hi ldrh r0, [r0] lsrs r0, r0, #3 adds r0, r0, r1 ldrb r0, [r0] lsls r0, r0, #2 bl sub_03001334 - ldr r0, _030013AC @ =gUnk_03005ADE + ldr r0, _030013AC @ =gEmuAudio_Triangle_Linear ldrh r1, [r0] movs r0, #0x7f ands r0, r1 cmp r0, #0 beq _03001382 - ldr r0, _030013B0 @ =gUnk_03005A7A + ldr r0, _030013B0 @ =gEmuAudio_SndChn ldrh r1, [r0] movs r0, #4 ands r0, r1 @@ -63,7 +63,7 @@ _03001378: strh r0, [r1] _03001382: ldr r2, _030013BC @ =gUnk_03005AD6 - ldr r0, _030013AC @ =gUnk_03005ADE + ldr r0, _030013AC @ =gEmuAudio_Triangle_Linear ldrh r1, [r0] movs r0, #0x7f ands r0, r1 @@ -81,9 +81,9 @@ _03001382: bx r0 .align 2, 0 _030013A4: .4byte sUnk_030023DC -_030013A8: .4byte gUnk_03005AE2 -_030013AC: .4byte gUnk_03005ADE -_030013B0: .4byte gUnk_03005A7A +_030013A8: .4byte gEmuAudio_Triangle_Hi +_030013AC: .4byte gEmuAudio_Triangle_Linear +_030013B0: .4byte gEmuAudio_SndChn _030013B4: .4byte gUnk_03005FB0 _030013B8: .4byte gUnk_03005AD8 _030013BC: .4byte gUnk_03005AD6 @@ -173,7 +173,7 @@ sub_03001458: @ 0x03001458 lsrs r0, r0, #0x18 ldr r3, _03001488 @ =gUnk_03005AD6 ldrh r2, [r3] - ldr r1, _0300148C @ =gUnk_03005ADE + ldr r1, _0300148C @ =gEmuAudio_Triangle_Linear strh r0, [r1] movs r1, #0x7f ands r1, r0 @@ -193,7 +193,7 @@ sub_03001458: @ 0x03001458 b _030014BC .align 2, 0 _03001488: .4byte gUnk_03005AD6 -_0300148C: .4byte gUnk_03005ADE +_0300148C: .4byte gEmuAudio_Triangle_Linear _03001490: .4byte gUnk_03005AE4 _03001494: bl sub_030013C8 @@ -228,14 +228,14 @@ _030014C4: .4byte gUnk_03005AE4 sub_030014C8: @ 0x030014C8 lsls r0, r0, #0x18 lsrs r0, r0, #0x18 - ldr r1, _030014D8 @ =gUnk_03005AE0 + ldr r1, _030014D8 @ =gEmuAudio_Triangle_Lo strh r0, [r1] ldr r1, _030014DC @ =sUnk_03002845 movs r0, #1 strb r0, [r1] bx lr .align 2, 0 -_030014D8: .4byte gUnk_03005AE0 +_030014D8: .4byte gEmuAudio_Triangle_Lo _030014DC: .4byte sUnk_03002845 thumb_func_start sub_030014E0 @@ -250,12 +250,12 @@ sub_030014E0: @ 0x030014E0 lsls r0, r0, #0x18 cmp r0, #0 bne _03001508 - ldr r0, _03001510 @ =gUnk_03005AE2 + ldr r0, _03001510 @ =gEmuAudio_Triangle_Hi ldrh r1, [r0] movs r0, #7 ands r0, r1 lsls r0, r0, #8 - ldr r1, _03001514 @ =gUnk_03005AE0 + ldr r1, _03001514 @ =gEmuAudio_Triangle_Lo ldrh r1, [r1] orrs r0, r1 bl sub_030013F0 @@ -264,8 +264,8 @@ _03001508: bx r0 .align 2, 0 _0300150C: .4byte sUnk_03002845 -_03001510: .4byte gUnk_03005AE2 -_03001514: .4byte gUnk_03005AE0 +_03001510: .4byte gEmuAudio_Triangle_Hi +_03001514: .4byte gEmuAudio_Triangle_Lo thumb_func_start sub_03001518 sub_03001518: @ 0x03001518 @@ -273,7 +273,7 @@ sub_03001518: @ 0x03001518 adds r1, r0, #0 lsls r1, r1, #0x18 lsrs r1, r1, #0x18 - ldr r4, _03001548 @ =gUnk_03005AE2 + ldr r4, _03001548 @ =gEmuAudio_Triangle_Hi strh r1, [r4] ldr r2, _0300154C @ =gUnk_03005AE4 movs r0, #1 @@ -281,7 +281,7 @@ sub_03001518: @ 0x03001518 movs r0, #7 ands r0, r1 lsls r0, r0, #8 - ldr r1, _03001550 @ =gUnk_03005AE0 + ldr r1, _03001550 @ =gEmuAudio_Triangle_Lo ldrh r1, [r1] orrs r0, r1 bl sub_030013F0 @@ -292,9 +292,9 @@ sub_03001518: @ 0x03001518 bl sub_03001340 b _0300157C .align 2, 0 -_03001548: .4byte gUnk_03005AE2 +_03001548: .4byte gEmuAudio_Triangle_Hi _0300154C: .4byte gUnk_03005AE4 -_03001550: .4byte gUnk_03005AE0 +_03001550: .4byte gEmuAudio_Triangle_Lo _03001554: .4byte gUnk_03005FB0 _03001558: ldr r1, _03001584 @ =sUnk_030023DC @@ -305,7 +305,7 @@ _03001558: lsls r0, r0, #2 bl sub_03001334 ldr r2, _03001588 @ =gUnk_03005AD6 - ldr r0, _0300158C @ =gUnk_03005ADE + ldr r0, _0300158C @ =gEmuAudio_Triangle_Linear ldrh r1, [r0] movs r0, #0x7f ands r0, r1 @@ -321,7 +321,7 @@ _0300157C: .align 2, 0 _03001584: .4byte sUnk_030023DC _03001588: .4byte gUnk_03005AD6 -_0300158C: .4byte gUnk_03005ADE +_0300158C: .4byte gEmuAudio_Triangle_Linear _03001590: .4byte gUnk_03005AD8 thumb_func_start sub_03001594 @@ -344,11 +344,11 @@ sub_03001594: @ 0x03001594 strh r1, [r0] ldr r0, _030015F0 @ =gUnk_03005ADC strh r1, [r0] - ldr r0, _030015F4 @ =gUnk_03005ADE + ldr r0, _030015F4 @ =gEmuAudio_Triangle_Linear strh r1, [r0] - ldr r0, _030015F8 @ =gUnk_03005AE0 + ldr r0, _030015F8 @ =gEmuAudio_Triangle_Lo strh r1, [r0] - ldr r0, _030015FC @ =gUnk_03005AE2 + ldr r0, _030015FC @ =gEmuAudio_Triangle_Hi strh r1, [r0] ldr r0, _03001600 @ =gUnk_03005AE4 strh r1, [r0] @@ -366,9 +366,9 @@ _030015E4: .4byte gUnk_03005FB0 _030015E8: .4byte gUnk_03005AD8 _030015EC: .4byte gUnk_03005ADA _030015F0: .4byte gUnk_03005ADC -_030015F4: .4byte gUnk_03005ADE -_030015F8: .4byte gUnk_03005AE0 -_030015FC: .4byte gUnk_03005AE2 +_030015F4: .4byte gEmuAudio_Triangle_Linear +_030015F8: .4byte gEmuAudio_Triangle_Lo +_030015FC: .4byte gEmuAudio_Triangle_Hi _03001600: .4byte gUnk_03005AE4 _03001604: .4byte gUnk_03005FD4 _03001608: .4byte sUnk_03002845 @@ -399,7 +399,7 @@ _03001634: ldr r2, _0300170C @ =gUnk_03005AE4 mov r3, #0 strh r3, [r2] - ldr r2, _03001710 @ =gUnk_03005ADE + ldr r2, _03001710 @ =gEmuAudio_Triangle_Linear ldrh r2, [r2] tst r2, #0x80 beq _030016E8 @@ -455,7 +455,7 @@ _03001700: .4byte gUnk_03005AD8 _03001704: .4byte sUnk_03002645 _03001708: .4byte gUnk_03005AD6 _0300170C: .4byte gUnk_03005AE4 -_03001710: .4byte gUnk_03005ADE +_03001710: .4byte gEmuAudio_Triangle_Linear _03001714: .4byte sUnk_03002645 _03001718: .4byte gUnk_03005ADA _0300171C: .4byte gUnk_03005AD0 diff --git a/nes_metroid/emulator/asm/part2/part2_5.s b/nes_metroid/emulator/asm/part2/part2_5.s index ecbb890c5..479f21890 100644 --- a/nes_metroid/emulator/asm/part2/part2_5.s +++ b/nes_metroid/emulator/asm/part2/part2_5.s @@ -64,7 +64,7 @@ _03001790: .4byte gUnk_03005AFA thumb_func_start sub_03001794 sub_03001794: @ 0x03001794 push {r4, r5, lr} - ldr r0, _030017C0 @ =gUnk_03005A7A + ldr r0, _030017C0 @ =gEmuAudio_SndChn ldrh r1, [r0] movs r0, #8 ands r0, r1 @@ -74,7 +74,7 @@ sub_03001794: @ 0x03001794 movs r0, #1 strh r0, [r1] _030017A8: - ldr r1, _030017C8 @ =gUnk_03005B00 + ldr r1, _030017C8 @ =gEmuAudio_Noise_Vol ldrh r2, [r1] movs r0, #0x10 ands r0, r2 @@ -86,9 +86,9 @@ _030017A8: ands r0, r2 b _030017D4 .align 2, 0 -_030017C0: .4byte gUnk_03005A7A +_030017C0: .4byte gEmuAudio_SndChn _030017C4: .4byte gUnk_03005FC0 -_030017C8: .4byte gUnk_03005B00 +_030017C8: .4byte gEmuAudio_Noise_Vol _030017CC: .4byte gUnk_03005AF4 _030017D0: ldr r1, _03001828 @ =gUnk_03005AF4 @@ -101,7 +101,7 @@ _030017D4: ands r0, r1 strh r0, [r2] ldr r1, _03001830 @ =sUnk_030023DC - ldr r2, _03001834 @ =gUnk_03005B06 + ldr r2, _03001834 @ =gEmuAudio_Noise_Hi ldrh r0, [r2] lsrs r0, r0, #3 adds r0, r0, r1 @@ -140,7 +140,7 @@ _03001806: _03001828: .4byte gUnk_03005AF4 _0300182C: .4byte gUnk_03005AF8 _03001830: .4byte sUnk_030023DC -_03001834: .4byte gUnk_03005B06 +_03001834: .4byte gEmuAudio_Noise_Hi _03001838: .4byte sUnk_03002988 _0300183C: .4byte gUnk_03005AF6 @@ -184,7 +184,7 @@ sub_0300187C: @ 0x0300187C lsls r0, r0, #0x18 lsrs r4, r0, #0x18 adds r5, r4, #0 - ldr r3, _030018AC @ =gUnk_03005B00 + ldr r3, _030018AC @ =gEmuAudio_Noise_Vol ldrb r1, [r3] movs r2, #0x10 adds r0, r2, #0 @@ -205,7 +205,7 @@ sub_0300187C: @ 0x0300187C strh r0, [r1] b _030018D0 .align 2, 0 -_030018AC: .4byte gUnk_03005B00 +_030018AC: .4byte gEmuAudio_Noise_Vol _030018B0: .4byte gUnk_03005B08 _030018B4: .4byte gUnk_03005AF4 _030018B8: @@ -234,7 +234,7 @@ sub_030018E0: @ 0x030018E0 push {r4, lr} lsls r0, r0, #0x18 lsrs r0, r0, #0x18 - ldr r1, _03001918 @ =gUnk_03005B04 + ldr r1, _03001918 @ =gEmuAudio_Noise_Lo strh r0, [r1] ldr r3, _0300191C @ =gUnk_03005AF6 movs r1, #0xf @@ -259,7 +259,7 @@ sub_030018E0: @ 0x030018E0 str r0, [r1] b _0300193A .align 2, 0 -_03001918: .4byte gUnk_03005B04 +_03001918: .4byte gEmuAudio_Noise_Lo _0300191C: .4byte gUnk_03005AF6 _03001920: .4byte gUnk_03005AF0 _03001924: .4byte gUnk_03005B10 @@ -283,7 +283,7 @@ sub_03001944: @ 0x03001944 push {lr} lsls r0, r0, #0x18 lsrs r2, r0, #0x18 - ldr r0, _03001964 @ =gUnk_03005B04 + ldr r0, _03001964 @ =gEmuAudio_Noise_Lo ldrh r1, [r0] movs r0, #0x80 ands r0, r1 @@ -297,7 +297,7 @@ sub_03001944: @ 0x03001944 str r0, [r1] b _0300197A .align 2, 0 -_03001964: .4byte gUnk_03005B04 +_03001964: .4byte gEmuAudio_Noise_Lo _03001968: .4byte sUnk_03002846 _0300196C: .4byte gUnk_03005AE8 _03001970: @@ -307,14 +307,14 @@ _03001970: adds r0, r3, #0 strh r0, [r1] _0300197A: - ldr r0, _0300198C @ =gUnk_03005B06 + ldr r0, _0300198C @ =gEmuAudio_Noise_Hi strh r2, [r0] bl sub_03001794 pop {r0} bx r0 .align 2, 0 _03001988: .4byte sUnk_03002846 -_0300198C: .4byte gUnk_03005B06 +_0300198C: .4byte gEmuAudio_Noise_Hi thumb_func_start sub_03001990 sub_03001990: @ 0x03001990 @@ -347,13 +347,13 @@ sub_03001990: @ 0x03001990 strh r1, [r0] ldr r0, _03001A0C @ =gUnk_03005AFE strh r1, [r0] - ldr r0, _03001A10 @ =gUnk_03005B00 + ldr r0, _03001A10 @ =gEmuAudio_Noise_Vol strh r1, [r0] ldr r0, _03001A14 @ =gUnk_03005B02 strh r1, [r0] - ldr r0, _03001A18 @ =gUnk_03005B04 + ldr r0, _03001A18 @ =gEmuAudio_Noise_Lo strh r1, [r0] - ldr r0, _03001A1C @ =gUnk_03005B06 + ldr r0, _03001A1C @ =gEmuAudio_Noise_Hi strh r1, [r0] ldr r0, _03001A20 @ =gUnk_03005B08 strb r3, [r0] @@ -372,10 +372,10 @@ _03001A00: .4byte gUnk_03005AFC _03001A04: .4byte sUnk_03002846 _03001A08: .4byte gUnk_03005FC0 _03001A0C: .4byte gUnk_03005AFE -_03001A10: .4byte gUnk_03005B00 +_03001A10: .4byte gEmuAudio_Noise_Vol _03001A14: .4byte gUnk_03005B02 -_03001A18: .4byte gUnk_03005B04 -_03001A1C: .4byte gUnk_03005B06 +_03001A18: .4byte gEmuAudio_Noise_Lo +_03001A1C: .4byte gEmuAudio_Noise_Hi _03001A20: .4byte gUnk_03005B08 thumb_func_start sub_03001A24 @@ -387,7 +387,7 @@ sub_03001A24: @ 0x03001A24 sub_03001A28: @ 0x03001A28 push {r4, r5, r6, r7, r8, sb, sl, fp} ldr r6, _030021AC @ =gUnk_03005AF4 - ldr r3, _030021B0 @ =gUnk_03005B00 + ldr r3, _030021B0 @ =gEmuAudio_Noise_Vol ldrh r2, [r3] and r5, r2, #0xf tst r2, #0x10 @@ -526,7 +526,7 @@ sub_03001C10: @ 0x03001C10 lsls r0, r0, #0x18 lsrs r4, r0, #0x18 adds r5, r4, #0 - ldr r0, _03001C54 @ =gUnk_03005A7A + ldr r0, _03001C54 @ =gEmuAudio_SndChn strh r4, [r0] movs r0, #1 ands r0, r4 @@ -556,14 +556,14 @@ _03001C4C: pop {r0} bx r0 .align 2, 0 -_03001C54: .4byte gUnk_03005A7A +_03001C54: .4byte gEmuAudio_SndChn thumb_func_start sub_03001C58 sub_03001C58: @ 0x03001C58 push {lr} lsls r0, r0, #0x18 lsrs r0, r0, #0x18 - ldr r1, _03001C74 @ =gUnk_03005A7C + ldr r1, _03001C74 @ =gEmuAudio_FrameCtr strh r0, [r1] movs r1, #0x80 ands r1, r0 @@ -573,7 +573,7 @@ sub_03001C58: @ 0x03001C58 bl sub_03000000 b _03001C7E .align 2, 0 -_03001C74: .4byte gUnk_03005A7C +_03001C74: .4byte gEmuAudio_FrameCtr _03001C78: movs r0, #0x80 bl sub_03000000 @@ -722,7 +722,7 @@ _03001D7C: strh r0, [r1] strb r5, [r2] _03001DA0: - ldr r0, _03001EB8 @ =gUnk_03005A9A + ldr r0, _03001EB8 @ =gEmuAudio_Pulse1_Sweep ldrh r1, [r0] movs r0, #0x80 ands r0, r1 @@ -739,7 +739,7 @@ _03001DB4: subs r0, #1 strh r0, [r2] _03001DC0: - ldr r0, _03001EC4 @ =gUnk_03005A98 + ldr r0, _03001EC4 @ =gEmuAudio_Pulse1_Vol ldrh r1, [r0] movs r0, #0x20 ands r0, r1 @@ -789,7 +789,7 @@ _03001E00: movs r0, #0 strb r0, [r2] _03001E26: - ldr r0, _03001EDC @ =gUnk_03005ABA + ldr r0, _03001EDC @ =gEmuAudio_Pulse2_Sweep ldrh r1, [r0] movs r0, #0x80 ands r0, r1 @@ -806,7 +806,7 @@ _03001E3A: subs r0, #1 strh r0, [r2] _03001E46: - ldr r0, _03001EE8 @ =gUnk_03005AB8 + ldr r0, _03001EE8 @ =gEmuAudio_Pulse2_Vol ldrh r1, [r0] movs r0, #0x20 ands r0, r1 @@ -859,19 +859,19 @@ _03001E86: _03001EAC: .4byte gUnk_03005FCC _03001EB0: .4byte gUnk_03005AAD _03001EB4: .4byte gUnk_03005A94 -_03001EB8: .4byte gUnk_03005A9A +_03001EB8: .4byte gEmuAudio_Pulse1_Sweep _03001EBC: .4byte gUnk_03005AA0 _03001EC0: .4byte gUnk_03005AA8 -_03001EC4: .4byte gUnk_03005A98 +_03001EC4: .4byte gEmuAudio_Pulse1_Vol _03001EC8: .4byte gUnk_03005AA4 _03001ECC: .4byte gUnk_03005AA6 _03001ED0: .4byte gUnk_03005FD8 _03001ED4: .4byte gUnk_03005ACD _03001ED8: .4byte gUnk_03005AB4 -_03001EDC: .4byte gUnk_03005ABA +_03001EDC: .4byte gEmuAudio_Pulse2_Sweep _03001EE0: .4byte gUnk_03005AC0 _03001EE4: .4byte gUnk_03005AC8 -_03001EE8: .4byte gUnk_03005AB8 +_03001EE8: .4byte gEmuAudio_Pulse2_Vol _03001EEC: .4byte gUnk_03005AC4 _03001EF0: .4byte gUnk_03005AC6 _03001EF4: .4byte gUnk_03005FB0 @@ -915,7 +915,7 @@ _03001F40: _03001F46: strh r0, [r3] _03001F48: - ldr r0, _03001FE4 @ =gUnk_03005ADE + ldr r0, _03001FE4 @ =gEmuAudio_Triangle_Linear ldrh r1, [r0] movs r0, #0x80 ands r0, r1 @@ -968,7 +968,7 @@ _03001FA2: subs r0, #1 strh r0, [r2] _03001FAE: - ldr r0, _03002004 @ =gUnk_03005B00 + ldr r0, _03002004 @ =gEmuAudio_Noise_Vol ldrh r1, [r0] movs r0, #0x20 ands r0, r1 @@ -996,7 +996,7 @@ _03001FC4: strh r1, [r0] b _03002016 .align 2, 0 -_03001FE4: .4byte gUnk_03005ADE +_03001FE4: .4byte gEmuAudio_Triangle_Linear _03001FE8: .4byte gUnk_03005AD8 _03001FEC: .4byte gUnk_03005ADA _03001FF0: .4byte gUnk_03005FB0 @@ -1004,7 +1004,7 @@ _03001FF4: .4byte gUnk_03005FC0 _03001FF8: .4byte gUnk_03005B08 _03001FFC: .4byte gUnk_03005AF4 _03002000: .4byte gUnk_03005AFA -_03002004: .4byte gUnk_03005B00 +_03002004: .4byte gEmuAudio_Noise_Vol _03002008: .4byte gUnk_03005AFE _0300200C: lsrs r2, r4, #4 @@ -1132,9 +1132,9 @@ _0300205E: adds r0, r5, #0 movs r1, #0xa0 bl sub_03000618 - ldr r0, _0300219C @ =gUnk_03005A7A + ldr r0, _0300219C @ =gEmuAudio_SndChn strh r4, [r0] - ldr r0, _030021A0 @ =gUnk_03005A7C + ldr r0, _030021A0 @ =gEmuAudio_FrameCtr strh r4, [r0] movs r0, #0x80 lsls r0, r0, #8 @@ -1177,8 +1177,8 @@ _0300218C: .4byte gUnk_03005FDC _03002190: .4byte gUnk_03005AE8 _03002194: .4byte gUnk_03005A96 _03002198: .4byte gUnk_03005AB6 -_0300219C: .4byte gUnk_03005A7A -_030021A0: .4byte gUnk_03005A7C +_0300219C: .4byte gEmuAudio_SndChn +_030021A0: .4byte gEmuAudio_FrameCtr _030021A4: .4byte sub_03001D30 thumb_func_start sub_030021A8 @@ -1187,7 +1187,7 @@ sub_030021A8: @ 0x030021A8 .align 2, 0 _030021AC: .4byte gUnk_03005AF4 -_030021B0: .4byte gUnk_03005B00 +_030021B0: .4byte gEmuAudio_Noise_Vol _030021B4: .4byte gUnk_03005AF8 _030021B8: .4byte gUnk_03005AEC _030021BC: .4byte gUnk_03005AF0 diff --git a/nes_metroid/emulator/include/structs/part2.h b/nes_metroid/emulator/include/structs/part2.h index 90e2ceb3a..157503c79 100644 --- a/nes_metroid/emulator/include/structs/part2.h +++ b/nes_metroid/emulator/include/structs/part2.h @@ -3,6 +3,8 @@ #include "types.h" +#define NES_CLOCK_SPEED 1789773u + extern void* gUnk_03005A50; extern void* gUnk_03005A54; extern void* gUnk_03005A58; @@ -12,8 +14,8 @@ extern u8 gUnk_03005A5E; extern u16 gUnk_03005A60; extern void (*gUnk_03005A64)(void*, u32); extern u16 gUnk_03005A68[]; // length? -extern u16 gUnk_03005A7A; -extern u16 gUnk_03005A7C; +extern u16 gEmuAudio_SndChn; +extern u16 gEmuAudio_FrameCtr; extern u32* gUnk_03005A80; extern u32* gUnk_03005A84; extern u32* gUnk_03005A88; @@ -21,10 +23,10 @@ extern u32* gUnk_03005A8C; extern u32 gUnk_03005A90; extern u16 gUnk_03005A94; extern u16 gUnk_03005A96; -extern u16 gUnk_03005A98; -extern u16 gUnk_03005A9A; -extern u16 gUnk_03005A9C; -extern u16 gUnk_03005A9E; +extern u16 gEmuAudio_Pulse1_Vol; +extern u16 gEmuAudio_Pulse1_Sweep; +extern u16 gEmuAudio_Pulse1_Lo; +extern u16 gEmuAudio_Pulse1_Hi; extern u16 gUnk_03005AA0; extern u16 gUnk_03005AA2; extern u16 gUnk_03005AA4; @@ -36,10 +38,10 @@ extern u8 gUnk_03005AAD; extern u32 gUnk_03005AB0; extern u16 gUnk_03005AB4; extern u16 gUnk_03005AB6; -extern u16 gUnk_03005AB8; -extern u16 gUnk_03005ABA; -extern u16 gUnk_03005ABC; -extern u16 gUnk_03005ABE; +extern u16 gEmuAudio_Pulse2_Vol; +extern u16 gEmuAudio_Pulse2_Sweep; +extern u16 gEmuAudio_Pulse2_Lo; +extern u16 gEmuAudio_Pulse2_Hi; extern u16 gUnk_03005AC0; extern u16 gUnk_03005AC2; extern u16 gUnk_03005AC4; @@ -54,9 +56,9 @@ extern u16 gUnk_03005AD6; extern u16 gUnk_03005AD8; extern u16 gUnk_03005ADA; extern u16 gUnk_03005ADC; -extern u16 gUnk_03005ADE; -extern u16 gUnk_03005AE0; -extern u16 gUnk_03005AE2; +extern u16 gEmuAudio_Triangle_Linear; +extern u16 gEmuAudio_Triangle_Lo; +extern u16 gEmuAudio_Triangle_Hi; extern u16 gUnk_03005AE4; extern u32 gUnk_03005AE8; extern u32 gUnk_03005AEC; @@ -67,10 +69,10 @@ extern u16 gUnk_03005AF8; extern u16 gUnk_03005AFA; extern u16 gUnk_03005AFC; extern u16 gUnk_03005AFE; -extern u16 gUnk_03005B00; +extern u16 gEmuAudio_Noise_Vol; extern u16 gUnk_03005B02; -extern u16 gUnk_03005B04; -extern u16 gUnk_03005B06; +extern u16 gEmuAudio_Noise_Lo; +extern u16 gEmuAudio_Noise_Hi; extern u8 gUnk_03005B08; extern u32 gUnk_03005B10[]; extern u32 gUnk_03005B50[]; diff --git a/nes_metroid/emulator/linker.ld b/nes_metroid/emulator/linker.ld index b607de773..7400a59dc 100644 --- a/nes_metroid/emulator/linker.ld +++ b/nes_metroid/emulator/linker.ld @@ -45,8 +45,8 @@ SECTIONS { . = 0x00005A60; gUnk_03005A60 = .; . = 0x00005A64; gUnk_03005A64 = .; . = 0x00005A68; gUnk_03005A68 = .; - . = 0x00005A7A; gUnk_03005A7A = .; - . = 0x00005A7C; gUnk_03005A7C = .; + . = 0x00005A7A; gEmuAudio_SndChn = .; + . = 0x00005A7C; gEmuAudio_FrameCtr = .; . = 0x00005A80; gUnk_03005A80 = .; . = 0x00005A84; gUnk_03005A84 = .; . = 0x00005A88; gUnk_03005A88 = .; @@ -54,10 +54,10 @@ SECTIONS { . = 0x00005A90; gUnk_03005A90 = .; . = 0x00005A94; gUnk_03005A94 = .; . = 0x00005A96; gUnk_03005A96 = .; - . = 0x00005A98; gUnk_03005A98 = .; - . = 0x00005A9A; gUnk_03005A9A = .; - . = 0x00005A9C; gUnk_03005A9C = .; - . = 0x00005A9E; gUnk_03005A9E = .; + . = 0x00005A98; gEmuAudio_Pulse1_Vol = .; + . = 0x00005A9A; gEmuAudio_Pulse1_Sweep = .; + . = 0x00005A9C; gEmuAudio_Pulse1_Lo = .; + . = 0x00005A9E; gEmuAudio_Pulse1_Hi = .; . = 0x00005AA0; gUnk_03005AA0 = .; . = 0x00005AA2; gUnk_03005AA2 = .; . = 0x00005AA4; gUnk_03005AA4 = .; @@ -69,10 +69,10 @@ SECTIONS { . = 0x00005AB0; gUnk_03005AB0 = .; . = 0x00005AB4; gUnk_03005AB4 = .; . = 0x00005AB6; gUnk_03005AB6 = .; - . = 0x00005AB8; gUnk_03005AB8 = .; - . = 0x00005ABA; gUnk_03005ABA = .; - . = 0x00005ABC; gUnk_03005ABC = .; - . = 0x00005ABE; gUnk_03005ABE = .; + . = 0x00005AB8; gEmuAudio_Pulse2_Vol = .; + . = 0x00005ABA; gEmuAudio_Pulse2_Sweep = .; + . = 0x00005ABC; gEmuAudio_Pulse2_Lo = .; + . = 0x00005ABE; gEmuAudio_Pulse2_Hi = .; . = 0x00005AC0; gUnk_03005AC0 = .; . = 0x00005AC2; gUnk_03005AC2 = .; . = 0x00005AC4; gUnk_03005AC4 = .; @@ -87,9 +87,9 @@ SECTIONS { . = 0x00005AD8; gUnk_03005AD8 = .; . = 0x00005ADA; gUnk_03005ADA = .; . = 0x00005ADC; gUnk_03005ADC = .; - . = 0x00005ADE; gUnk_03005ADE = .; - . = 0x00005AE0; gUnk_03005AE0 = .; - . = 0x00005AE2; gUnk_03005AE2 = .; + . = 0x00005ADE; gEmuAudio_Triangle_Linear = .; + . = 0x00005AE0; gEmuAudio_Triangle_Lo = .; + . = 0x00005AE2; gEmuAudio_Triangle_Hi = .; . = 0x00005AE4; gUnk_03005AE4 = .; . = 0x00005AE8; gUnk_03005AE8 = .; . = 0x00005AEC; gUnk_03005AEC = .; @@ -100,10 +100,10 @@ SECTIONS { . = 0x00005AFA; gUnk_03005AFA = .; . = 0x00005AFC; gUnk_03005AFC = .; . = 0x00005AFE; gUnk_03005AFE = .; - . = 0x00005B00; gUnk_03005B00 = .; + . = 0x00005B00; gEmuAudio_Noise_Vol = .; . = 0x00005B02; gUnk_03005B02 = .; - . = 0x00005B04; gUnk_03005B04 = .; - . = 0x00005B06; gUnk_03005B06 = .; + . = 0x00005B04; gEmuAudio_Noise_Lo = .; + . = 0x00005B06; gEmuAudio_Noise_Hi = .; . = 0x00005B08; gUnk_03005B08 = .; . = 0x00005B10; gUnk_03005B10 = .; . = 0x00005B50; gUnk_03005B50 = .; diff --git a/nes_metroid/emulator/src/part2/part2.c b/nes_metroid/emulator/src/part2/part2.c index 635536054..bdd5c8c63 100644 --- a/nes_metroid/emulator/src/part2/part2.c +++ b/nes_metroid/emulator/src/part2/part2.c @@ -15,30 +15,30 @@ u32 sUnk_03002370 = DMA_32BIT | DMA_DEST_FIXED; u8 sUnk_03002374 = 0; void (*sUnk_03002378[0x18])(u8) = { - sub_030008B4, - sub_03000918, - sub_03000930, - sub_030009A0, - sub_03000EAC, - sub_03000F10, - sub_03000F28, - sub_03000F40, - sub_03001458, - sub_03000404, - sub_030014C8, - sub_03001518, - sub_0300187C, - sub_03000404, - sub_030018E0, - sub_03001944, - sub_03000404, - sub_03000404, - sub_03000404, - sub_03000404, - sub_03000404, - sub_03001C10, - sub_03000404, - sub_03001C58, + sub_030008B4, // SQ1_VOL + sub_03000918, // SQ1_SWEEP + sub_03000930, // SQ1_LO + sub_030009A0, // SQ1_HI + sub_03000EAC, // SQ2_VOL + sub_03000F10, // SQ2_SWEEP + sub_03000F28, // SQ2_LO + sub_03000F40, // SQ2_HI + sub_03001458, // TRI_LINEAR + sub_03000404, // + sub_030014C8, // TRI_LO + sub_03001518, // TRI_HI + sub_0300187C, // NOISE_VOL + sub_03000404, // + sub_030018E0, // NOISE_LO + sub_03001944, // NOISE_HI + sub_03000404, // + sub_03000404, // + sub_03000404, // + sub_03000404, // + sub_03000404, // + sub_03001C10, // SND_CHN + sub_03000404, // + sub_03001C58, // JOY2 (frame counter) }; u32 sUnk_030023D8 = DMA_32BIT | DMA_DEST_FIXED; diff --git a/nes_metroid/emulator/src/part2/part2_2.c b/nes_metroid/emulator/src/part2/part2_2.c index 1adcba3b5..52c4798f8 100644 --- a/nes_metroid/emulator/src/part2/part2_2.c +++ b/nes_metroid/emulator/src/part2/part2_2.c @@ -26,9 +26,9 @@ void sub_03000790(void) } gUnk_03005AA6 = 0; - if (gUnk_03005A98 & 0x10) + if (gEmuAudio_Pulse1_Vol & 0x10) { - gUnk_03005A94 = gUnk_03005A98 & 0xF; + gUnk_03005A94 = gEmuAudio_Pulse1_Vol & 0xF; } else { @@ -36,8 +36,8 @@ void sub_03000790(void) } gUnk_03005AA2 = 0xF; - sub_03000784(sUnk_030023DC[gUnk_03005A9E >> 3] * 4); - if (gUnk_03005A7A & 1) + sub_03000784(sUnk_030023DC[gEmuAudio_Pulse1_Hi >> 3] * 4); + if (gEmuAudio_SndChn & 1) { gUnk_03005FCC = 1; gUnk_03005AA4 = 0; @@ -65,7 +65,7 @@ void sub_03000848(u16 arg0) return; } - gUnk_03005FD0 = 0x1B4F4DU / (arg0 + 1); + gUnk_03005FD0 = NES_CLOCK_SPEED / (arg0 + 1); tmp = gUnk_03005FC4; // fake if (gUnk_03005FD0 == gUnk_03005FC4) { @@ -79,20 +79,21 @@ void sub_0300089C(u8 arg0) gUnk_03005AA2 = 1; } +// SQ1_VOL void sub_030008B4(u8 arg0) { u8 var_0; u8 var_1; - var_0 = gUnk_03005A98 & 0x10; + var_0 = gEmuAudio_Pulse1_Vol & 0x10; var_1 = arg0 & 0x10; - gUnk_03005A98 = arg0; + gEmuAudio_Pulse1_Vol = arg0; gUnk_03005AAD = 0; if ((arg0 & 0xC0) == 0xC0) { - gUnk_03005A98 = arg0 & 0x7F; + gEmuAudio_Pulse1_Vol = arg0 & 0x7F; } if ((var_0 != 0) && (var_1 == 0) && (gUnk_03005FCC != 0)) @@ -102,15 +103,17 @@ void sub_030008B4(u8 arg0) } } +// SQ1_SWEEP void sub_03000918(u8 arg0) { - gUnk_03005A9A = arg0; + gEmuAudio_Pulse1_Sweep = arg0; gUnk_03005AAA = 1; } +// SQ1_LO void sub_03000930(u8 arg0) { - gUnk_03005A9C = arg0; + gEmuAudio_Pulse1_Lo = arg0; gUnk_03005AAC = 1; } @@ -118,6 +121,6 @@ void sub_03000948(void) { if (gUnk_03005AAC != 0) { - sub_03000848((gUnk_03005AA0 & 0xF00) | gUnk_03005A9C); + sub_03000848((gUnk_03005AA0 & 0xF00) | gEmuAudio_Pulse1_Lo); } } diff --git a/nes_metroid/emulator/src/part2/part2_3.c b/nes_metroid/emulator/src/part2/part2_3.c index 891c4e4ca..776646cf0 100644 --- a/nes_metroid/emulator/src/part2/part2_3.c +++ b/nes_metroid/emulator/src/part2/part2_3.c @@ -7,10 +7,11 @@ extern u8 sUnk_030023DC[]; +// SQ1_HI void sub_030009A0(u8 arg0) { - gUnk_03005A9E = arg0; - sub_03000848(((arg0 & 7) << 8) | gUnk_03005A9C); + gEmuAudio_Pulse1_Hi = arg0; + sub_03000848(((arg0 & 7) << 8) | gEmuAudio_Pulse1_Lo); if (gUnk_03005FCC == 0) { sub_03000778(); @@ -24,10 +25,10 @@ void sub_030009DC(void) gUnk_03005FD0 = 0; gUnk_03005A94 = 0; gUnk_03005A96 = 0; - gUnk_03005A98 = 0; - gUnk_03005A9A = 0; - gUnk_03005A9C = 0; - gUnk_03005A9E = 0; + gEmuAudio_Pulse1_Vol = 0; + gEmuAudio_Pulse1_Sweep = 0; + gEmuAudio_Pulse1_Lo = 0; + gEmuAudio_Pulse1_Hi = 0; gUnk_03005AA0 = 0; gUnk_03005AA2 = 0; gUnk_03005FCC = 0; @@ -60,9 +61,9 @@ void sub_03000D38(void) } gUnk_03005AC6 = 0; - if (gUnk_03005AB8 & 0x10) + if (gEmuAudio_Pulse2_Vol & 0x10) { - gUnk_03005AB4 = gUnk_03005AB8 & 0xF; + gUnk_03005AB4 = gEmuAudio_Pulse2_Vol & 0xF; } else { @@ -79,8 +80,8 @@ void sub_03000D38(void) gUnk_03005ACA = 4; } - sub_03000D2C(sUnk_030023DC[gUnk_03005ABE >> 3] * 4); - if (gUnk_03005A7A & 2) + sub_03000D2C(sUnk_030023DC[gEmuAudio_Pulse2_Hi >> 3] * 4); + if (gEmuAudio_SndChn & 2) { gUnk_03005FD8 = 1; gUnk_03005AC4 = 0; @@ -99,7 +100,7 @@ void sub_03000E10(void) { if (gUnk_03005ACC != 0) { - sub_03000E40((gUnk_03005AC0 & 0xF00) | gUnk_03005ABC); + sub_03000E40((gUnk_03005AC0 & 0xF00) | gEmuAudio_Pulse2_Lo); } } @@ -115,7 +116,7 @@ void sub_03000E40(u16 arg0) return; } - gUnk_03005FC4 = 0x1B4F4DU / (arg0 + 1); + gUnk_03005FC4 = NES_CLOCK_SPEED / (arg0 + 1); tmp = gUnk_03005FD0; // fake if (tmp == gUnk_03005FC4) { @@ -130,20 +131,21 @@ void sub_03000E94(u8 arg0) gUnk_03005AC2 = 1; } +// SQ2_VOL void sub_03000EAC(u8 arg0) { u8 var_0; u8 var_1; - var_0 = gUnk_03005AB8 & 0x10; + var_0 = gEmuAudio_Pulse2_Vol & 0x10; var_1 = arg0 & 0x10; - gUnk_03005AB8 = arg0; + gEmuAudio_Pulse2_Vol = arg0; gUnk_03005ACD = 0; if ((arg0 & 0xC0) == 0xC0) { - gUnk_03005AB8 = arg0 & 0x7F; + gEmuAudio_Pulse2_Vol = arg0 & 0x7F; } if ((var_0 != 0) && (var_1 == 0) && (gUnk_03005FD8 != 0)) @@ -153,22 +155,25 @@ void sub_03000EAC(u8 arg0) } } +// SQ2_SWEEP void sub_03000F10(u8 arg0) { - gUnk_03005ABA = arg0; + gEmuAudio_Pulse2_Sweep = arg0; gUnk_03005ACA = 1; } +// SQ2_LO void sub_03000F28(u8 arg0) { - gUnk_03005ABC = arg0; + gEmuAudio_Pulse2_Lo = arg0; gUnk_03005ACC = 1; } +// SQ2_HI void sub_03000F40(u8 arg0) { - gUnk_03005ABE = arg0; - sub_03000E40(((arg0 & 7) << 8) | gUnk_03005ABC); + gEmuAudio_Pulse2_Hi = arg0; + sub_03000E40(((arg0 & 7) << 8) | gEmuAudio_Pulse2_Lo); if (gUnk_03005FD8 == 0) { sub_03000D20(); @@ -182,10 +187,10 @@ void sub_03000F7C(void) gUnk_03005FC4 = 0; gUnk_03005AB4 = 0; gUnk_03005AB6 = 0; - gUnk_03005AB8 = 0; - gUnk_03005ABA = 0; - gUnk_03005ABC = 0; - gUnk_03005ABE = 0; + gEmuAudio_Pulse2_Vol = 0; + gEmuAudio_Pulse2_Sweep = 0; + gEmuAudio_Pulse2_Lo = 0; + gEmuAudio_Pulse2_Hi = 0; gUnk_03005AC0 = 0; gUnk_03005AC2 = 0; gUnk_03005FD8 = 0; diff --git a/nes_metroid/emulator/src/part2/part2_4.c b/nes_metroid/emulator/src/part2/part2_4.c index 7eff05a44..94ff27a6a 100644 --- a/nes_metroid/emulator/src/part2/part2_4.c +++ b/nes_metroid/emulator/src/part2/part2_4.c @@ -23,8 +23,8 @@ void sub_03001334(u32 arg0) void sub_03001340(void) { - sub_03001334(sUnk_030023DC[gUnk_03005AE2 >> 3] * 4); - if ((gUnk_03005ADE & 0x7F) && (gUnk_03005A7A & 4)) + sub_03001334(sUnk_030023DC[gEmuAudio_Triangle_Hi >> 3] * 4); + if ((gEmuAudio_Triangle_Linear & 0x7F) && (gEmuAudio_SndChn & 4)) { if (gUnk_03005FB0 == 0) { sub_03001318(); @@ -32,7 +32,7 @@ void sub_03001340(void) gUnk_03005FB0 = 1; gUnk_03005AD8 = 0; } - gUnk_03005AD6 = (gUnk_03005ADE & 0x7F) + 1; + gUnk_03005AD6 = (gEmuAudio_Triangle_Linear & 0x7F) + 1; gUnk_03005ADA = (gUnk_03005ADC + gUnk_03005ADA) >> 1; } @@ -72,13 +72,14 @@ void sub_030013F0(u16 arg0) } } +// TRI_LINEAR void sub_03001458(u8 arg0) { u32 tmp; u32 tmp2; tmp2 = gUnk_03005AD6; - gUnk_03005ADE = arg0; + gEmuAudio_Triangle_Linear = arg0; tmp = arg0 & 0x7F; if ((arg0 & 0x7F) == 0) @@ -102,9 +103,10 @@ void sub_03001458(u8 arg0) } } +// TRI_LO void sub_030014C8(u8 arg0) { - gUnk_03005AE0 = arg0; + gEmuAudio_Triangle_Lo = arg0; sUnk_03002845 = 1; } @@ -115,25 +117,26 @@ void sub_030014E0(void) sUnk_03002845 -= 1; if (sUnk_03002845 == 0) { - sub_030013F0(((gUnk_03005AE2 & 7) << 8) | gUnk_03005AE0); + sub_030013F0(((gEmuAudio_Triangle_Hi & 7) << 8) | gEmuAudio_Triangle_Lo); } } } +// TRI_HI void sub_03001518(u8 arg0) { - gUnk_03005AE2 = arg0; + gEmuAudio_Triangle_Hi = arg0; gUnk_03005AE4 = 1; - sub_030013F0(((arg0 & 7) << 8) | gUnk_03005AE0); + sub_030013F0(((arg0 & 7) << 8) | gEmuAudio_Triangle_Lo); if (gUnk_03005FB0 == 0) { sub_03001340(); return; } - sub_03001334(sUnk_030023DC[gUnk_03005AE2 >> 3] * 4); - gUnk_03005AD6 = (gUnk_03005ADE & 0x7F) + 1; + sub_03001334(sUnk_030023DC[gEmuAudio_Triangle_Hi >> 3] * 4); + gUnk_03005AD6 = (gEmuAudio_Triangle_Linear & 0x7F) + 1; gUnk_03005AD8 = 0; } @@ -147,9 +150,9 @@ void sub_03001594(void) gUnk_03005AD8 = 0; gUnk_03005ADA = 0; gUnk_03005ADC = 0; - gUnk_03005ADE = 0; - gUnk_03005AE0 = 0; - gUnk_03005AE2 = 0; + gEmuAudio_Triangle_Linear = 0; + gEmuAudio_Triangle_Lo = 0; + gEmuAudio_Triangle_Hi = 0; gUnk_03005AE4 = 0; gUnk_03005FD4 = 0; sUnk_03002845 = 0; diff --git a/nes_metroid/emulator/src/part2/part2_5.c b/nes_metroid/emulator/src/part2/part2_5.c index f9fbbc128..bf2f1bdda 100644 --- a/nes_metroid/emulator/src/part2/part2_5.c +++ b/nes_metroid/emulator/src/part2/part2_5.c @@ -44,22 +44,22 @@ void sub_03001794(void) u32 var_r4; u32 var_r5; - if (gUnk_03005A7A & 8) + if (gEmuAudio_SndChn & 8) { gUnk_03005FC0 = 1; } - if (gUnk_03005B00 & 0x10) + if (gEmuAudio_Noise_Vol & 0x10) { - gUnk_03005AF4 = gUnk_03005B00 & 0xF; + gUnk_03005AF4 = gEmuAudio_Noise_Vol & 0xF; } else { gUnk_03005AF4 = 0xF; } - gUnk_03005AF8 = gUnk_03005B00 & 0xF; - var_r4 = sUnk_030023DC[gUnk_03005B06 >> 3]; + gUnk_03005AF8 = gEmuAudio_Noise_Vol & 0xF; + var_r4 = sUnk_030023DC[gEmuAudio_Noise_Hi >> 3]; if ((sUnk_03002988 == 0x7F) && (var_r4 == 1)) { var_r4 = 2; @@ -73,7 +73,7 @@ void sub_03001794(void) { var_r5 = 0; } - sub_03001788((sUnk_030023DC[gUnk_03005B06 >> 3] * 4) + var_r5); + sub_03001788((sUnk_030023DC[gEmuAudio_Noise_Hi >> 3] * 4) + var_r5); sUnk_03002988 = var_r4; sub_03001788((var_r4 * 4) + var_r5); } @@ -92,15 +92,16 @@ void sub_03001864(u8 arg0) gUnk_03005AF8 = 1; } +// NOISE_VOL void sub_0300187C(u8 arg0) { u8 var_0; u8 var_1; - var_0 = gUnk_03005B00 & 0x10; + var_0 = gEmuAudio_Noise_Vol & 0x10; var_1 = arg0 & 0x10; - gUnk_03005B00 = arg0; + gEmuAudio_Noise_Vol = arg0; gUnk_03005B08 = 0; if (var_1 == 1) @@ -114,9 +115,10 @@ void sub_0300187C(u8 arg0) } } +// NOISE_LO void sub_030018E0(u8 arg0) { - gUnk_03005B04 = arg0; + gEmuAudio_Noise_Lo = arg0; gUnk_03005AF6 = arg0 & 0xF; gUnk_03005AF0 = gUnk_03005B10[gUnk_03005AF6]; @@ -131,9 +133,10 @@ void sub_030018E0(u8 arg0) } } +// NOISE_HI void sub_03001944(u8 arg0) { - if (gUnk_03005B04 & 0x80) + if (gEmuAudio_Noise_Lo & 0x80) { sUnk_03002846 = 0x40; gUnk_03005AE8 = 1; @@ -143,7 +146,7 @@ void sub_03001944(u8 arg0) sUnk_03002846 = 0x4000; } - gUnk_03005B06 = arg0; + gEmuAudio_Noise_Hi = arg0; sub_03001794(); } @@ -160,18 +163,19 @@ void sub_03001990(void) sUnk_03002846 = 0x8000; gUnk_03005FC0 = 0; gUnk_03005AFE = 0; - gUnk_03005B00 = 0; + gEmuAudio_Noise_Vol = 0; gUnk_03005B02 = 0; - gUnk_03005B04 = 0; - gUnk_03005B06 = 0; + gEmuAudio_Noise_Lo = 0; + gEmuAudio_Noise_Hi = 0; gUnk_03005B08 = 0; } // File split? +// SND_CHN void sub_03001C10(u8 arg0) { - gUnk_03005A7A = arg0; + gEmuAudio_SndChn = arg0; if (!(arg0 & 1)) { @@ -191,9 +195,10 @@ void sub_03001C10(u8 arg0) } } +// JOY2 (frame counter) void sub_03001C58(u8 arg0) { - gUnk_03005A7C = arg0; + gEmuAudio_FrameCtr = arg0; if (arg0 & 0x80) { @@ -283,7 +288,7 @@ void sub_03001D30(void* arg0, u32 arg1) gUnk_03005A94 = 0xF; gUnk_03005AAD = 0; } - if (gUnk_03005A9A & 0x80) + if (gEmuAudio_Pulse1_Sweep & 0x80) { sub_03000848(gUnk_03005AA0); } @@ -291,7 +296,7 @@ void sub_03001D30(void* arg0, u32 arg1) { gUnk_03005AA8 -= 1; } - if (!(gUnk_03005A98 & 0x20) && (gUnk_03005AA8 == 0)) + if (!(gEmuAudio_Pulse1_Vol & 0x20) && (gUnk_03005AA8 == 0)) { sub_03000824(); } @@ -320,7 +325,7 @@ void sub_03001D30(void* arg0, u32 arg1) gUnk_03005AB4 = 0xF; gUnk_03005ACD = 0; } - if (gUnk_03005ABA & 0x80) + if (gEmuAudio_Pulse2_Sweep & 0x80) { sub_03000E40(gUnk_03005AC0); } @@ -328,7 +333,7 @@ void sub_03001D30(void* arg0, u32 arg1) { gUnk_03005AC8 -= 1; } - if (!(gUnk_03005AB8 & 0x20) && (gUnk_03005AC8 == 0)) + if (!(gEmuAudio_Pulse2_Vol & 0x20) && (gUnk_03005AC8 == 0)) { sub_03000DEC(); } @@ -374,7 +379,7 @@ void sub_03001D30(void* arg0, u32 arg1) gUnk_03005ADA -= 1; } } - if (!(gUnk_03005ADE & 0x80) && (gUnk_03005AD4 == 0)) + if (!(gEmuAudio_Triangle_Linear & 0x80) && (gUnk_03005AD4 == 0)) { sub_030013C8(); } @@ -403,7 +408,7 @@ void sub_03001D30(void* arg0, u32 arg1) { gUnk_03005AFA -= 1; } - if (!(gUnk_03005B00 & 0x20) && (gUnk_03005AFA == 0)) + if (!(gEmuAudio_Noise_Vol & 0x20) && (gUnk_03005AFA == 0)) { sub_03001840(); } @@ -475,7 +480,7 @@ void sub_0300203C(void) sub_03000618(gUnk_03005E70, 0xA0); sub_03000618(gUnk_03005F10, 0xA0); - gUnk_03005A7A = 0; - gUnk_03005A7C = 0; + gEmuAudio_SndChn = 0; + gEmuAudio_FrameCtr = 0; sub_030002A4(gUnk_03005DD0, gUnk_03005E70, gUnk_03005F10, sub_03000050(0x8000), 0xA0, &sub_03001D30); } From 270571c9161e3408be36265bcba2fb358c79e93b Mon Sep 17 00:00:00 2001 From: testyourmine <25854988+testyourmine@users.noreply.github.com> Date: Wed, 28 Jan 2026 16:48:41 -0600 Subject: [PATCH 2/2] A lot of part2 documentation --- nes_metroid/emulator/asm/part1.s | 6 +- nes_metroid/emulator/asm/part2/part2_2.s | 86 ++-- nes_metroid/emulator/asm/part2/part2_3.s | 138 +++--- nes_metroid/emulator/asm/part2/part2_4.s | 64 +-- nes_metroid/emulator/asm/part2/part2_5.s | 216 ++++----- .../emulator/asm/part2/part2_handwritten.s | 81 +++- nes_metroid/emulator/asm/part5.s | 60 +-- nes_metroid/emulator/include/part2.h | 90 ++-- nes_metroid/emulator/include/structs/part2.h | 145 +++--- nes_metroid/emulator/linker.ld | 66 +-- nes_metroid/emulator/src/part2/part2.c | 419 +++++++++++------- nes_metroid/emulator/src/part2/part2_2.c | 80 ++-- nes_metroid/emulator/src/part2/part2_3.c | 140 +++--- nes_metroid/emulator/src/part2/part2_4.c | 75 ++-- nes_metroid/emulator/src/part2/part2_5.c | 281 +++++++----- 15 files changed, 1120 insertions(+), 827 deletions(-) diff --git a/nes_metroid/emulator/asm/part1.s b/nes_metroid/emulator/asm/part1.s index 255149927..67659b47d 100644 --- a/nes_metroid/emulator/asm/part1.s +++ b/nes_metroid/emulator/asm/part1.s @@ -371,8 +371,8 @@ _0600666C: str r0, [sp, #SP_890] @ SP_890 = 0x030073FF mov r0, #0x820000 str r0, [sp, #SP_8AC] @ SP_8AC = 0x00820000 - ldr r0, _060069D0 @ =sub_03000408 - str r0, [sp, #SP_9B4] @ SP_9B4 = sub_03000408 + ldr r0, _060069D0 @ =EmulatorAudio_WriteToApu + str r0, [sp, #SP_9B4] @ SP_9B4 = EmulatorAudio_WriteToApu mov r0, #0xef str r0, [sp, #SP_8B4] @ SP_8B4 = 0x000000EF ldr r0, _060069D4 @ =0x03020100 @@ -525,7 +525,7 @@ _060069C0: .4byte 0x0203C000 _060069C4: .4byte _03002E68 _060069C8: .4byte 0x44444444 _060069CC: .4byte sub_06006000 -_060069D0: .4byte sub_03000408 +_060069D0: .4byte EmulatorAudio_WriteToApu _060069D4: .4byte 0x03020100 _060069D8: .4byte 0x07060504 _060069DC: .4byte sub_03005568 diff --git a/nes_metroid/emulator/asm/part2/part2_2.s b/nes_metroid/emulator/asm/part2/part2_2.s index 0315fda11..6bbdb3ebd 100644 --- a/nes_metroid/emulator/asm/part2/part2_2.s +++ b/nes_metroid/emulator/asm/part2/part2_2.s @@ -90,13 +90,13 @@ sub_03000634: @ 0x03000634 arm_func_start sub_03000638 sub_03000638: @ 0x03000638 push {r4, r5} - ldr r2, _03000978 @ =gUnk_03005A80 + ldr r2, _03000978 @ =gEmuAudio_Pulse1_BufferPtr ldr r2, [r2] - ldr r3, _0300097C @ =gUnk_03005A84 + ldr r3, _0300097C @ =gEmuAudio_Pulse2_BufferPtr ldr r3, [r3] - ldr r4, _03000980 @ =gUnk_03005A88 + ldr r4, _03000980 @ =gEmuAudio_Triangle_BufferPtr ldr r4, [r4] - ldr r5, _03000984 @ =gUnk_03005A8C + ldr r5, _03000984 @ =gEmuAudio_Noise_BufferPtr ldr r5, [r5] mov ip, #0 _03000660: @@ -178,13 +178,13 @@ sub_03000704: @ 0x03000704 arm_func_start sub_03000708 sub_03000708: @ 0x03000708 push {r4, r5, r6, r7, r8, sb} - ldr r2, _03000990 @ =gUnk_03005A80 + ldr r2, _03000990 @ =gEmuAudio_Pulse1_BufferPtr ldr r2, [r2] - ldr r3, _03000994 @ =gUnk_03005A84 + ldr r3, _03000994 @ =gEmuAudio_Pulse2_BufferPtr ldr r3, [r3] - ldr r4, _03000998 @ =gUnk_03005A88 + ldr r4, _03000998 @ =gEmuAudio_Triangle_BufferPtr ldr r4, [r4] - ldr r5, _0300099C @ =gUnk_03005A8C + ldr r5, _0300099C @ =gEmuAudio_Noise_BufferPtr ldr r5, [r5] mov r8, #0x80 orr r8, r8, r8, lsl #8 @@ -220,13 +220,13 @@ sub_03000778: @ 0x03000778 .align 2, 0 _03000780: .4byte gUnk_03005A90 - thumb_func_start sub_03000784 -sub_03000784: @ 0x03000784 - ldr r1, _0300078C @ =gUnk_03005AA8 + thumb_func_start EmulatorAudio_Pulse1_SetLengthCounter +EmulatorAudio_Pulse1_SetLengthCounter: @ 0x03000784 + ldr r1, _0300078C @ =gEmuAudio_Pulse1_LengthCounter strh r0, [r1] bx lr .align 2, 0 -_0300078C: .4byte gUnk_03005AA8 +_0300078C: .4byte gEmuAudio_Pulse1_LengthCounter thumb_func_start sub_03000790 sub_03000790: @ 0x03000790 @@ -266,14 +266,14 @@ _030007D0: ldr r1, _0300080C @ =gUnk_03005AA2 movs r0, #0xf strh r0, [r1] - ldr r1, _03000810 @ =sUnk_030023DC + ldr r1, _03000810 @ =sEmulatorAudio_LengthCounterTable ldr r0, _03000814 @ =gEmuAudio_Pulse1_Hi ldrh r0, [r0] lsrs r0, r0, #3 adds r0, r0, r1 ldrb r0, [r0] lsls r0, r0, #2 - bl sub_03000784 + bl EmulatorAudio_Pulse1_SetLengthCounter ldr r0, _03000818 @ =gEmuAudio_SndChn ldrh r1, [r0] movs r2, #1 @@ -281,7 +281,7 @@ _030007D0: ands r0, r1 cmp r0, #0 beq _03000802 - ldr r0, _0300081C @ =gUnk_03005FCC + ldr r0, _0300081C @ =gEmuAudio_Pulse1_Enable strh r2, [r0] ldr r1, _03000820 @ =gUnk_03005AA4 movs r0, #0 @@ -293,16 +293,16 @@ _03000802: .align 2, 0 _03000808: .4byte gUnk_03005A94 _0300080C: .4byte gUnk_03005AA2 -_03000810: .4byte sUnk_030023DC +_03000810: .4byte sEmulatorAudio_LengthCounterTable _03000814: .4byte gEmuAudio_Pulse1_Hi _03000818: .4byte gEmuAudio_SndChn -_0300081C: .4byte gUnk_03005FCC +_0300081C: .4byte gEmuAudio_Pulse1_Enable _03000820: .4byte gUnk_03005AA4 thumb_func_start sub_03000824 sub_03000824: @ 0x03000824 push {lr} - ldr r0, _03000840 @ =gUnk_03005FCC + ldr r0, _03000840 @ =gEmuAudio_Pulse1_Enable ldrh r0, [r0] cmp r0, #0 beq _0300083A @@ -316,7 +316,7 @@ _0300083A: pop {r0} bx r0 .align 2, 0 -_03000840: .4byte gUnk_03005FCC +_03000840: .4byte gEmuAudio_Pulse1_Enable _03000844: .4byte gUnk_03005AA4 thumb_func_start sub_03000848 @@ -327,7 +327,7 @@ sub_03000848: @ 0x03000848 ldr r1, _03000864 @ =gUnk_03005AAC movs r0, #0 strb r0, [r1] - ldr r0, _03000868 @ =gUnk_03005AA0 + ldr r0, _03000868 @ =gEmuAudio_Pulse1_Timer strh r2, [r0] cmp r2, #0 bne _03000870 @@ -336,15 +336,15 @@ sub_03000848: @ 0x03000848 b _03000888 .align 2, 0 _03000864: .4byte gUnk_03005AAC -_03000868: .4byte gUnk_03005AA0 +_03000868: .4byte gEmuAudio_Pulse1_Timer _0300086C: .4byte gUnk_03005A94 _03000870: - ldr r4, _03000890 @ =gUnk_03005FD0 + ldr r4, _03000890 @ =gEmuAudio_Pulse1_Frequency adds r1, r2, #1 ldr r0, _03000894 @ =0x001B4F4D bl __udivsi3 str r0, [r4] - ldr r2, _03000898 @ =gUnk_03005FC4 + ldr r2, _03000898 @ =gEmuAudio_Pulse2_Frequency ldr r1, [r2] cmp r0, r1 bne _03000888 @@ -355,9 +355,9 @@ _03000888: pop {r0} bx r0 .align 2, 0 -_03000890: .4byte gUnk_03005FD0 +_03000890: .4byte gEmuAudio_Pulse1_Frequency _03000894: .4byte 0x001B4F4D -_03000898: .4byte gUnk_03005FC4 +_03000898: .4byte gEmuAudio_Pulse2_Frequency thumb_func_start sub_0300089C sub_0300089C: @ 0x0300089C @@ -373,8 +373,8 @@ sub_0300089C: @ 0x0300089C _030008AC: .4byte gUnk_03005A94 _030008B0: .4byte gUnk_03005AA2 - thumb_func_start sub_030008B4 -sub_030008B4: @ 0x030008B4 + thumb_func_start EmulatorAudio_Pulse1_WriteVolume +EmulatorAudio_Pulse1_WriteVolume: @ 0x030008B4 push {r4, r5, lr} lsls r0, r0, #0x18 lsrs r3, r0, #0x18 @@ -405,7 +405,7 @@ _030008E6: beq _03000900 cmp r1, #0 bne _03000900 - ldr r0, _03000910 @ =gUnk_03005FCC + ldr r0, _03000910 @ =gEmuAudio_Pulse1_Enable ldrh r0, [r0] cmp r0, #0 beq _03000900 @@ -421,11 +421,11 @@ _03000900: .align 2, 0 _03000908: .4byte gEmuAudio_Pulse1_Vol _0300090C: .4byte gUnk_03005AAD -_03000910: .4byte gUnk_03005FCC +_03000910: .4byte gEmuAudio_Pulse1_Enable _03000914: .4byte gUnk_03005AA2 - thumb_func_start sub_03000918 -sub_03000918: @ 0x03000918 + thumb_func_start EmulatorAudio_Pulse1_WriteSweep +EmulatorAudio_Pulse1_WriteSweep: @ 0x03000918 lsls r0, r0, #0x18 lsrs r0, r0, #0x18 ldr r1, _03000928 @ =gEmuAudio_Pulse1_Sweep @@ -438,8 +438,8 @@ sub_03000918: @ 0x03000918 _03000928: .4byte gEmuAudio_Pulse1_Sweep _0300092C: .4byte gUnk_03005AAA - thumb_func_start sub_03000930 -sub_03000930: @ 0x03000930 + thumb_func_start EmulatorAudio_Pulse1_WriteLo +EmulatorAudio_Pulse1_WriteLo: @ 0x03000930 lsls r0, r0, #0x18 lsrs r0, r0, #0x18 ldr r1, _03000940 @ =gEmuAudio_Pulse1_Lo @@ -459,7 +459,7 @@ sub_03000948: @ 0x03000948 ldrb r0, [r0] cmp r0, #0 beq _03000966 - ldr r0, _03000970 @ =gUnk_03005AA0 + ldr r0, _03000970 @ =gEmuAudio_Pulse1_Timer ldrh r1, [r0] movs r0, #0xf0 lsls r0, r0, #4 @@ -473,18 +473,18 @@ _03000966: bx r0 .align 2, 0 _0300096C: .4byte gUnk_03005AAC -_03000970: .4byte gUnk_03005AA0 +_03000970: .4byte gEmuAudio_Pulse1_Timer _03000974: .4byte gEmuAudio_Pulse1_Lo -_03000978: .4byte gUnk_03005A80 -_0300097C: .4byte gUnk_03005A84 -_03000980: .4byte gUnk_03005A88 -_03000984: .4byte gUnk_03005A8C +_03000978: .4byte gEmuAudio_Pulse1_BufferPtr +_0300097C: .4byte gEmuAudio_Pulse2_BufferPtr +_03000980: .4byte gEmuAudio_Triangle_BufferPtr +_03000984: .4byte gEmuAudio_Noise_BufferPtr _03000988: .4byte 0x03005FE0 _0300098C: .4byte 0x03005FE0 -_03000990: .4byte gUnk_03005A80 -_03000994: .4byte gUnk_03005A84 -_03000998: .4byte gUnk_03005A88 -_0300099C: .4byte gUnk_03005A8C +_03000990: .4byte gEmuAudio_Pulse1_BufferPtr +_03000994: .4byte gEmuAudio_Pulse2_BufferPtr +_03000998: .4byte gEmuAudio_Triangle_BufferPtr +_0300099C: .4byte gEmuAudio_Noise_BufferPtr diff --git a/nes_metroid/emulator/asm/part2/part2_3.s b/nes_metroid/emulator/asm/part2/part2_3.s index ae2aeda69..9b6da6845 100644 --- a/nes_metroid/emulator/asm/part2/part2_3.s +++ b/nes_metroid/emulator/asm/part2/part2_3.s @@ -3,8 +3,8 @@ .syntax unified - thumb_func_start sub_030009A0 -sub_030009A0: @ 0x030009A0 + thumb_func_start EmulatorAudio_Pulse1_WriteHi +EmulatorAudio_Pulse1_WriteHi: @ 0x030009A0 push {lr} adds r1, r0, #0 lsls r1, r1, #0x18 @@ -18,7 +18,7 @@ sub_030009A0: @ 0x030009A0 ldrh r1, [r1] orrs r0, r1 bl sub_03000848 - ldr r0, _030009D8 @ =gUnk_03005FCC + ldr r0, _030009D8 @ =gEmuAudio_Pulse1_Enable ldrh r0, [r0] cmp r0, #0 bne _030009C8 @@ -30,14 +30,14 @@ _030009C8: .align 2, 0 _030009D0: .4byte gEmuAudio_Pulse1_Hi _030009D4: .4byte gEmuAudio_Pulse1_Lo -_030009D8: .4byte gUnk_03005FCC +_030009D8: .4byte gEmuAudio_Pulse1_Enable - thumb_func_start sub_030009DC -sub_030009DC: @ 0x030009DC + thumb_func_start EmulatorAudio_Pulse1_ClearVariables +EmulatorAudio_Pulse1_ClearVariables: @ 0x030009DC ldr r1, _03000A28 @ =gUnk_03005A90 movs r0, #0 str r0, [r1] - ldr r1, _03000A2C @ =gUnk_03005FD0 + ldr r1, _03000A2C @ =gEmuAudio_Pulse1_Frequency str r0, [r1] ldr r1, _03000A30 @ =gUnk_03005A94 movs r2, #0 @@ -52,17 +52,17 @@ sub_030009DC: @ 0x030009DC strh r0, [r1] ldr r1, _03000A44 @ =gEmuAudio_Pulse1_Hi strh r0, [r1] - ldr r1, _03000A48 @ =gUnk_03005AA0 + ldr r1, _03000A48 @ =gEmuAudio_Pulse1_Timer strh r0, [r1] ldr r1, _03000A4C @ =gUnk_03005AA2 strh r0, [r1] - ldr r1, _03000A50 @ =gUnk_03005FCC + ldr r1, _03000A50 @ =gEmuAudio_Pulse1_Enable strh r0, [r1] ldr r1, _03000A54 @ =gUnk_03005AA4 strh r0, [r1] ldr r1, _03000A58 @ =gUnk_03005AA6 strh r0, [r1] - ldr r1, _03000A5C @ =gUnk_03005AA8 + ldr r1, _03000A5C @ =gEmuAudio_Pulse1_LengthCounter strh r0, [r1] ldr r1, _03000A60 @ =gUnk_03005AAA strh r0, [r1] @@ -73,19 +73,19 @@ sub_030009DC: @ 0x030009DC bx lr .align 2, 0 _03000A28: .4byte gUnk_03005A90 -_03000A2C: .4byte gUnk_03005FD0 +_03000A2C: .4byte gEmuAudio_Pulse1_Frequency _03000A30: .4byte gUnk_03005A94 _03000A34: .4byte gUnk_03005A96 _03000A38: .4byte gEmuAudio_Pulse1_Vol _03000A3C: .4byte gEmuAudio_Pulse1_Sweep _03000A40: .4byte gEmuAudio_Pulse1_Lo _03000A44: .4byte gEmuAudio_Pulse1_Hi -_03000A48: .4byte gUnk_03005AA0 +_03000A48: .4byte gEmuAudio_Pulse1_Timer _03000A4C: .4byte gUnk_03005AA2 -_03000A50: .4byte gUnk_03005FCC +_03000A50: .4byte gEmuAudio_Pulse1_Enable _03000A54: .4byte gUnk_03005AA4 _03000A58: .4byte gUnk_03005AA6 -_03000A5C: .4byte gUnk_03005AA8 +_03000A5C: .4byte gEmuAudio_Pulse1_LengthCounter _03000A60: .4byte gUnk_03005AAA _03000A64: .4byte gUnk_03005AAC _03000A68: .4byte gUnk_03005AAD @@ -121,7 +121,7 @@ _03000A94: and r5, r5, r2, lsr #3 orr r5, r5, #1 strh r5, [r4] - ldr r4, _0300126C @ =gUnk_03005AA0 + ldr r4, _0300126C @ =gEmuAudio_Pulse1_Timer ldrh r3, [r4] ands r5, r2, #7 beq _03000AFC @@ -159,7 +159,7 @@ _03000B40: _03000B4C: strh r5, [r6] _03000B50: - ldr r6, _0300127C @ =gUnk_03005AA0 + ldr r6, _0300127C @ =gEmuAudio_Pulse1_Timer ldrh r6, [r6] cmp r6, #8 ldr r6, _03001280 @ =gUnk_03005A94 @@ -177,7 +177,7 @@ _03000B50: ldrb sb, [sb, r4] ldr r2, _03001298 @ =gUnk_03005A90 ldr r2, [r2] - ldr r3, _0300129C @ =gUnk_03005FD0 + ldr r3, _0300129C @ =gEmuAudio_Pulse1_Frequency ldr r3, [r3] ldr r4, _030012A0 @ =gEmuAudio_Pulse1_Vol ldrh r4, [r4] @@ -294,13 +294,13 @@ sub_03000D20: @ 0x03000D20 .align 2, 0 _03000D28: .4byte gUnk_03005AB0 - thumb_func_start sub_03000D2C -sub_03000D2C: @ 0x03000D2C - ldr r1, _03000D34 @ =gUnk_03005AC8 + thumb_func_start EmulatorAudio_Pulse2_SetLengthCounter +EmulatorAudio_Pulse2_SetLengthCounter: @ 0x03000D2C + ldr r1, _03000D34 @ =gEmuAudio_Pulse2_LengthCounter strh r0, [r1] bx lr .align 2, 0 -_03000D34: .4byte gUnk_03005AC8 +_03000D34: .4byte gEmuAudio_Pulse2_LengthCounter thumb_func_start sub_03000D38 sub_03000D38: @ 0x03000D38 @@ -340,7 +340,7 @@ _03000D78: ldr r1, _03000D94 @ =gUnk_03005AC2 movs r0, #0xf strh r0, [r1] - ldr r0, _03000D98 @ =gUnk_03005FD8 + ldr r0, _03000D98 @ =gEmuAudio_Pulse2_Enable ldrh r0, [r0] cmp r0, #0 beq _03000DA0 @@ -350,28 +350,28 @@ _03000D78: .align 2, 0 _03000D90: .4byte gUnk_03005AB4 _03000D94: .4byte gUnk_03005AC2 -_03000D98: .4byte gUnk_03005FD8 +_03000D98: .4byte gEmuAudio_Pulse2_Enable _03000D9C: .4byte gUnk_03005ACA _03000DA0: ldr r1, _03000DD4 @ =gUnk_03005ACA movs r0, #4 _03000DA4: strh r0, [r1] - ldr r1, _03000DD8 @ =sUnk_030023DC + ldr r1, _03000DD8 @ =sEmulatorAudio_LengthCounterTable ldr r0, _03000DDC @ =gEmuAudio_Pulse2_Hi ldrh r0, [r0] lsrs r0, r0, #3 adds r0, r0, r1 ldrb r0, [r0] lsls r0, r0, #2 - bl sub_03000D2C + bl EmulatorAudio_Pulse2_SetLengthCounter ldr r0, _03000DE0 @ =gEmuAudio_SndChn ldrh r1, [r0] movs r0, #2 ands r0, r1 cmp r0, #0 beq _03000DD0 - ldr r1, _03000DE4 @ =gUnk_03005FD8 + ldr r1, _03000DE4 @ =gEmuAudio_Pulse2_Enable movs r0, #1 strh r0, [r1] ldr r1, _03000DE8 @ =gUnk_03005AC4 @@ -383,16 +383,16 @@ _03000DD0: bx r0 .align 2, 0 _03000DD4: .4byte gUnk_03005ACA -_03000DD8: .4byte sUnk_030023DC +_03000DD8: .4byte sEmulatorAudio_LengthCounterTable _03000DDC: .4byte gEmuAudio_Pulse2_Hi _03000DE0: .4byte gEmuAudio_SndChn -_03000DE4: .4byte gUnk_03005FD8 +_03000DE4: .4byte gEmuAudio_Pulse2_Enable _03000DE8: .4byte gUnk_03005AC4 thumb_func_start sub_03000DEC sub_03000DEC: @ 0x03000DEC push {lr} - ldr r0, _03000E08 @ =gUnk_03005FD8 + ldr r0, _03000E08 @ =gEmuAudio_Pulse2_Enable ldrh r0, [r0] cmp r0, #0 beq _03000E02 @@ -406,7 +406,7 @@ _03000E02: pop {r0} bx r0 .align 2, 0 -_03000E08: .4byte gUnk_03005FD8 +_03000E08: .4byte gEmuAudio_Pulse2_Enable _03000E0C: .4byte gUnk_03005AC4 thumb_func_start sub_03000E10 @@ -416,7 +416,7 @@ sub_03000E10: @ 0x03000E10 ldrb r0, [r0] cmp r0, #0 beq _03000E2E - ldr r0, _03000E38 @ =gUnk_03005AC0 + ldr r0, _03000E38 @ =gEmuAudio_Pulse2_Timer ldrh r1, [r0] movs r0, #0xf0 lsls r0, r0, #4 @@ -430,7 +430,7 @@ _03000E2E: bx r0 .align 2, 0 _03000E34: .4byte gUnk_03005ACC -_03000E38: .4byte gUnk_03005AC0 +_03000E38: .4byte gEmuAudio_Pulse2_Timer _03000E3C: .4byte gEmuAudio_Pulse2_Lo thumb_func_start sub_03000E40 @@ -441,7 +441,7 @@ sub_03000E40: @ 0x03000E40 ldr r1, _03000E5C @ =gUnk_03005ACC movs r0, #0 strb r0, [r1] - ldr r0, _03000E60 @ =gUnk_03005AC0 + ldr r0, _03000E60 @ =gEmuAudio_Pulse2_Timer strh r2, [r0] cmp r2, #0 bne _03000E68 @@ -450,16 +450,16 @@ sub_03000E40: @ 0x03000E40 b _03000E82 .align 2, 0 _03000E5C: .4byte gUnk_03005ACC -_03000E60: .4byte gUnk_03005AC0 +_03000E60: .4byte gEmuAudio_Pulse2_Timer _03000E64: .4byte gUnk_03005AB4 _03000E68: - ldr r4, _03000E88 @ =gUnk_03005FC4 + ldr r4, _03000E88 @ =gEmuAudio_Pulse2_Frequency adds r1, r2, #1 ldr r0, _03000E8C @ =0x001B4F4D bl __udivsi3 adds r1, r0, #0 str r1, [r4] - ldr r0, _03000E90 @ =gUnk_03005FD0 + ldr r0, _03000E90 @ =gEmuAudio_Pulse1_Frequency ldr r0, [r0] cmp r0, r1 bne _03000E82 @@ -470,9 +470,9 @@ _03000E82: pop {r0} bx r0 .align 2, 0 -_03000E88: .4byte gUnk_03005FC4 +_03000E88: .4byte gEmuAudio_Pulse2_Frequency _03000E8C: .4byte 0x001B4F4D -_03000E90: .4byte gUnk_03005FD0 +_03000E90: .4byte gEmuAudio_Pulse1_Frequency thumb_func_start sub_03000E94 sub_03000E94: @ 0x03000E94 @@ -488,8 +488,8 @@ sub_03000E94: @ 0x03000E94 _03000EA4: .4byte gUnk_03005AB4 _03000EA8: .4byte gUnk_03005AC2 - thumb_func_start sub_03000EAC -sub_03000EAC: @ 0x03000EAC + thumb_func_start EmulatorAudio_Pulse2_WriteVolume +EmulatorAudio_Pulse2_WriteVolume: @ 0x03000EAC push {r4, r5, lr} lsls r0, r0, #0x18 lsrs r3, r0, #0x18 @@ -520,7 +520,7 @@ _03000EDE: beq _03000EF8 cmp r1, #0 bne _03000EF8 - ldr r0, _03000F08 @ =gUnk_03005FD8 + ldr r0, _03000F08 @ =gEmuAudio_Pulse2_Enable ldrh r0, [r0] cmp r0, #0 beq _03000EF8 @@ -536,11 +536,11 @@ _03000EF8: .align 2, 0 _03000F00: .4byte gEmuAudio_Pulse2_Vol _03000F04: .4byte gUnk_03005ACD -_03000F08: .4byte gUnk_03005FD8 +_03000F08: .4byte gEmuAudio_Pulse2_Enable _03000F0C: .4byte gUnk_03005AC2 - thumb_func_start sub_03000F10 -sub_03000F10: @ 0x03000F10 + thumb_func_start EmulatorAudio_Pulse2_WriteSweep +EmulatorAudio_Pulse2_WriteSweep: @ 0x03000F10 lsls r0, r0, #0x18 lsrs r0, r0, #0x18 ldr r1, _03000F20 @ =gEmuAudio_Pulse2_Sweep @@ -553,8 +553,8 @@ sub_03000F10: @ 0x03000F10 _03000F20: .4byte gEmuAudio_Pulse2_Sweep _03000F24: .4byte gUnk_03005ACA - thumb_func_start sub_03000F28 -sub_03000F28: @ 0x03000F28 + thumb_func_start EmulatorAudio_Pulse2_WriteLo +EmulatorAudio_Pulse2_WriteLo: @ 0x03000F28 lsls r0, r0, #0x18 lsrs r0, r0, #0x18 ldr r1, _03000F38 @ =gEmuAudio_Pulse2_Lo @@ -567,8 +567,8 @@ sub_03000F28: @ 0x03000F28 _03000F38: .4byte gEmuAudio_Pulse2_Lo _03000F3C: .4byte gUnk_03005ACC - thumb_func_start sub_03000F40 -sub_03000F40: @ 0x03000F40 + thumb_func_start EmulatorAudio_Pulse2_WriteHi +EmulatorAudio_Pulse2_WriteHi: @ 0x03000F40 push {lr} adds r1, r0, #0 lsls r1, r1, #0x18 @@ -582,7 +582,7 @@ sub_03000F40: @ 0x03000F40 ldrh r1, [r1] orrs r0, r1 bl sub_03000E40 - ldr r0, _03000F78 @ =gUnk_03005FD8 + ldr r0, _03000F78 @ =gEmuAudio_Pulse2_Enable ldrh r0, [r0] cmp r0, #0 bne _03000F68 @@ -594,14 +594,14 @@ _03000F68: .align 2, 0 _03000F70: .4byte gEmuAudio_Pulse2_Hi _03000F74: .4byte gEmuAudio_Pulse2_Lo -_03000F78: .4byte gUnk_03005FD8 +_03000F78: .4byte gEmuAudio_Pulse2_Enable - thumb_func_start sub_03000F7C -sub_03000F7C: @ 0x03000F7C + thumb_func_start EmulatorAudio_Pulse2_ClearVariables +EmulatorAudio_Pulse2_ClearVariables: @ 0x03000F7C ldr r1, _03000FC8 @ =gUnk_03005AB0 movs r0, #0 str r0, [r1] - ldr r1, _03000FCC @ =gUnk_03005FC4 + ldr r1, _03000FCC @ =gEmuAudio_Pulse2_Frequency str r0, [r1] ldr r1, _03000FD0 @ =gUnk_03005AB4 movs r2, #0 @@ -616,17 +616,17 @@ sub_03000F7C: @ 0x03000F7C strh r0, [r1] ldr r1, _03000FE4 @ =gEmuAudio_Pulse2_Hi strh r0, [r1] - ldr r1, _03000FE8 @ =gUnk_03005AC0 + ldr r1, _03000FE8 @ =gEmuAudio_Pulse2_Timer strh r0, [r1] ldr r1, _03000FEC @ =gUnk_03005AC2 strh r0, [r1] - ldr r1, _03000FF0 @ =gUnk_03005FD8 + ldr r1, _03000FF0 @ =gEmuAudio_Pulse2_Enable strh r0, [r1] ldr r1, _03000FF4 @ =gUnk_03005AC4 strh r0, [r1] ldr r1, _03000FF8 @ =gUnk_03005AC6 strh r0, [r1] - ldr r1, _03000FFC @ =gUnk_03005AC8 + ldr r1, _03000FFC @ =gEmuAudio_Pulse2_LengthCounter strh r0, [r1] ldr r1, _03001000 @ =gUnk_03005ACA strh r0, [r1] @@ -637,19 +637,19 @@ sub_03000F7C: @ 0x03000F7C bx lr .align 2, 0 _03000FC8: .4byte gUnk_03005AB0 -_03000FCC: .4byte gUnk_03005FC4 +_03000FCC: .4byte gEmuAudio_Pulse2_Frequency _03000FD0: .4byte gUnk_03005AB4 _03000FD4: .4byte gUnk_03005AB6 _03000FD8: .4byte gEmuAudio_Pulse2_Vol _03000FDC: .4byte gEmuAudio_Pulse2_Sweep _03000FE0: .4byte gEmuAudio_Pulse2_Lo _03000FE4: .4byte gEmuAudio_Pulse2_Hi -_03000FE8: .4byte gUnk_03005AC0 +_03000FE8: .4byte gEmuAudio_Pulse2_Timer _03000FEC: .4byte gUnk_03005AC2 -_03000FF0: .4byte gUnk_03005FD8 +_03000FF0: .4byte gEmuAudio_Pulse2_Enable _03000FF4: .4byte gUnk_03005AC4 _03000FF8: .4byte gUnk_03005AC6 -_03000FFC: .4byte gUnk_03005AC8 +_03000FFC: .4byte gEmuAudio_Pulse2_LengthCounter _03001000: .4byte gUnk_03005ACA _03001004: .4byte gUnk_03005ACC _03001008: .4byte gUnk_03005ACD @@ -685,7 +685,7 @@ _03001034: and r5, r5, r2, lsr #3 orr r5, r5, #1 strh r5, [r4] - ldr r4, _030012CC @ =gUnk_03005AC0 + ldr r4, _030012CC @ =gEmuAudio_Pulse2_Timer ldrh r3, [r4] ands r5, r2, #7 beq _03001098 @@ -722,7 +722,7 @@ _030010DC: _030010E8: strh r5, [r6] _030010EC: - ldr r6, _030012DC @ =gUnk_03005AC0 + ldr r6, _030012DC @ =gEmuAudio_Pulse2_Timer ldrh r6, [r6] cmp r6, #8 ldr r6, _030012E0 @ =gUnk_03005AB4 @@ -740,7 +740,7 @@ _030010EC: ldrb sb, [sb, r4] ldr r2, _030012F8 @ =gUnk_03005AB0 ldr r2, [r2] - ldr r3, _030012FC @ =gUnk_03005FC4 + ldr r3, _030012FC @ =gEmuAudio_Pulse2_Frequency ldr r3, [r3] ldr r4, _03001300 @ =gEmuAudio_Pulse2_Vol ldrh r4, [r4] @@ -827,11 +827,11 @@ _0300125C: .4byte gUnk_03005AA4 _03001260: .4byte gUnk_03005A94 _03001264: .4byte gEmuAudio_Pulse1_Sweep _03001268: .4byte gUnk_03005AAA -_0300126C: .4byte gUnk_03005AA0 +_0300126C: .4byte gEmuAudio_Pulse1_Timer _03001270: .4byte gUnk_03005A94 _03001274: .4byte gEmuAudio_Pulse1_Vol _03001278: .4byte gUnk_03005AA2 -_0300127C: .4byte gUnk_03005AA0 +_0300127C: .4byte gEmuAudio_Pulse1_Timer _03001280: .4byte gUnk_03005A94 _03001284: .4byte gUnk_03005A96 _03001288: .4byte sUnk_030025FC @@ -839,7 +839,7 @@ _0300128C: .4byte gEmuAudio_Pulse1_Vol _03001290: .4byte sUnk_0300263C _03001294: .4byte sUnk_03002640 _03001298: .4byte gUnk_03005A90 -_0300129C: .4byte gUnk_03005FD0 +_0300129C: .4byte gEmuAudio_Pulse1_Frequency _030012A0: .4byte gEmuAudio_Pulse1_Vol _030012A4: .4byte gUnk_03005A96 _030012A8: .4byte gUnk_03005A90 @@ -852,11 +852,11 @@ _030012BC: .4byte gUnk_03005AC4 _030012C0: .4byte gUnk_03005AB4 _030012C4: .4byte gEmuAudio_Pulse2_Sweep _030012C8: .4byte gUnk_03005ACA -_030012CC: .4byte gUnk_03005AC0 +_030012CC: .4byte gEmuAudio_Pulse2_Timer _030012D0: .4byte gUnk_03005AB4 _030012D4: .4byte gEmuAudio_Pulse2_Vol _030012D8: .4byte gUnk_03005AC2 -_030012DC: .4byte gUnk_03005AC0 +_030012DC: .4byte gEmuAudio_Pulse2_Timer _030012E0: .4byte gUnk_03005AB4 _030012E4: .4byte gUnk_03005AB6 _030012E8: .4byte sUnk_030025FC @@ -864,7 +864,7 @@ _030012EC: .4byte gEmuAudio_Pulse2_Vol _030012F0: .4byte sUnk_0300263C _030012F4: .4byte sUnk_03002640 _030012F8: .4byte gUnk_03005AB0 -_030012FC: .4byte gUnk_03005FC4 +_030012FC: .4byte gEmuAudio_Pulse2_Frequency _03001300: .4byte gEmuAudio_Pulse2_Vol _03001304: .4byte gUnk_03005AB6 _03001308: .4byte gUnk_03005AB0 diff --git a/nes_metroid/emulator/asm/part2/part2_4.s b/nes_metroid/emulator/asm/part2/part2_4.s index fbc898587..678451590 100644 --- a/nes_metroid/emulator/asm/part2/part2_4.s +++ b/nes_metroid/emulator/asm/part2/part2_4.s @@ -6,7 +6,7 @@ thumb_func_start sub_03001318 sub_03001318: @ 0x03001318 push {lr} - ldr r0, _0300132C @ =gUnk_03005FB0 + ldr r0, _0300132C @ =gEmuAudio_Triangle_Enable ldrh r1, [r0] cmp r1, #0 bne _03001326 @@ -16,28 +16,28 @@ _03001326: pop {r0} bx r0 .align 2, 0 -_0300132C: .4byte gUnk_03005FB0 +_0300132C: .4byte gEmuAudio_Triangle_Enable _03001330: .4byte gUnk_03005AD0 - thumb_func_start sub_03001334 -sub_03001334: @ 0x03001334 - ldr r1, _0300133C @ =gUnk_03005AD4 + thumb_func_start EmulatorAudio_Triangle_SetLengthCounter +EmulatorAudio_Triangle_SetLengthCounter: @ 0x03001334 + ldr r1, _0300133C @ =gEmuAudio_Triangle_LengthCounter strh r0, [r1] bx lr .align 2, 0 -_0300133C: .4byte gUnk_03005AD4 +_0300133C: .4byte gEmuAudio_Triangle_LengthCounter thumb_func_start sub_03001340 sub_03001340: @ 0x03001340 push {r4, lr} - ldr r1, _030013A4 @ =sUnk_030023DC + ldr r1, _030013A4 @ =sEmulatorAudio_LengthCounterTable ldr r0, _030013A8 @ =gEmuAudio_Triangle_Hi ldrh r0, [r0] lsrs r0, r0, #3 adds r0, r0, r1 ldrb r0, [r0] lsls r0, r0, #2 - bl sub_03001334 + bl EmulatorAudio_Triangle_SetLengthCounter ldr r0, _030013AC @ =gEmuAudio_Triangle_Linear ldrh r1, [r0] movs r0, #0x7f @@ -50,7 +50,7 @@ sub_03001340: @ 0x03001340 ands r0, r1 cmp r0, #0 beq _03001382 - ldr r4, _030013B4 @ =gUnk_03005FB0 + ldr r4, _030013B4 @ =gEmuAudio_Triangle_Enable ldrh r0, [r4] cmp r0, #0 bne _03001378 @@ -80,11 +80,11 @@ _03001382: pop {r0} bx r0 .align 2, 0 -_030013A4: .4byte sUnk_030023DC +_030013A4: .4byte sEmulatorAudio_LengthCounterTable _030013A8: .4byte gEmuAudio_Triangle_Hi _030013AC: .4byte gEmuAudio_Triangle_Linear _030013B0: .4byte gEmuAudio_SndChn -_030013B4: .4byte gUnk_03005FB0 +_030013B4: .4byte gEmuAudio_Triangle_Enable _030013B8: .4byte gUnk_03005AD8 _030013BC: .4byte gUnk_03005AD6 _030013C0: .4byte gUnk_03005ADA @@ -93,7 +93,7 @@ _030013C4: .4byte gUnk_03005ADC thumb_func_start sub_030013C8 sub_030013C8: @ 0x030013C8 push {lr} - ldr r0, _030013E4 @ =gUnk_03005FB0 + ldr r0, _030013E4 @ =gEmuAudio_Triangle_Enable ldrh r0, [r0] cmp r0, #0 beq _030013E0 @@ -108,7 +108,7 @@ _030013E0: pop {r0} bx r0 .align 2, 0 -_030013E4: .4byte gUnk_03005FB0 +_030013E4: .4byte gEmuAudio_Triangle_Enable _030013E8: .4byte gUnk_03005AD8 _030013EC: .4byte gUnk_03005ADA @@ -166,8 +166,8 @@ _0300144C: .4byte gUnk_03005FDC _03001450: .4byte 0x006D3D34 _03001454: .4byte gUnk_03005ADC - thumb_func_start sub_03001458 -sub_03001458: @ 0x03001458 + thumb_func_start EmulatorAudio_Triangle_WriteLinear +EmulatorAudio_Triangle_WriteLinear: @ 0x03001458 push {lr} lsls r0, r0, #0x18 lsrs r0, r0, #0x18 @@ -204,7 +204,7 @@ _03001494: .align 2, 0 _030014A0: .4byte gUnk_03005AE4 _030014A4: - ldr r0, _030014C0 @ =gUnk_03005FB0 + ldr r0, _030014C0 @ =gEmuAudio_Triangle_Enable ldrh r0, [r0] ldr r2, _030014C4 @ =gUnk_03005AE4 cmp r0, #0 @@ -221,11 +221,11 @@ _030014BC: pop {r0} bx r0 .align 2, 0 -_030014C0: .4byte gUnk_03005FB0 +_030014C0: .4byte gEmuAudio_Triangle_Enable _030014C4: .4byte gUnk_03005AE4 - thumb_func_start sub_030014C8 -sub_030014C8: @ 0x030014C8 + thumb_func_start EmulatorAudio_Triangle_WriteLo +EmulatorAudio_Triangle_WriteLo: @ 0x030014C8 lsls r0, r0, #0x18 lsrs r0, r0, #0x18 ldr r1, _030014D8 @ =gEmuAudio_Triangle_Lo @@ -267,8 +267,8 @@ _0300150C: .4byte sUnk_03002845 _03001510: .4byte gEmuAudio_Triangle_Hi _03001514: .4byte gEmuAudio_Triangle_Lo - thumb_func_start sub_03001518 -sub_03001518: @ 0x03001518 + thumb_func_start EmulatorAudio_Triangle_WriteHi +EmulatorAudio_Triangle_WriteHi: @ 0x03001518 push {r4, lr} adds r1, r0, #0 lsls r1, r1, #0x18 @@ -285,7 +285,7 @@ sub_03001518: @ 0x03001518 ldrh r1, [r1] orrs r0, r1 bl sub_030013F0 - ldr r0, _03001554 @ =gUnk_03005FB0 + ldr r0, _03001554 @ =gEmuAudio_Triangle_Enable ldrh r0, [r0] cmp r0, #0 bne _03001558 @@ -295,15 +295,15 @@ sub_03001518: @ 0x03001518 _03001548: .4byte gEmuAudio_Triangle_Hi _0300154C: .4byte gUnk_03005AE4 _03001550: .4byte gEmuAudio_Triangle_Lo -_03001554: .4byte gUnk_03005FB0 +_03001554: .4byte gEmuAudio_Triangle_Enable _03001558: - ldr r1, _03001584 @ =sUnk_030023DC + ldr r1, _03001584 @ =sEmulatorAudio_LengthCounterTable ldrh r0, [r4] lsrs r0, r0, #3 adds r0, r0, r1 ldrb r0, [r0] lsls r0, r0, #2 - bl sub_03001334 + bl EmulatorAudio_Triangle_SetLengthCounter ldr r2, _03001588 @ =gUnk_03005AD6 ldr r0, _0300158C @ =gEmuAudio_Triangle_Linear ldrh r1, [r0] @@ -319,24 +319,24 @@ _0300157C: pop {r0} bx r0 .align 2, 0 -_03001584: .4byte sUnk_030023DC +_03001584: .4byte sEmulatorAudio_LengthCounterTable _03001588: .4byte gUnk_03005AD6 _0300158C: .4byte gEmuAudio_Triangle_Linear _03001590: .4byte gUnk_03005AD8 - thumb_func_start sub_03001594 -sub_03001594: @ 0x03001594 + thumb_func_start EmulatorAudio_Triangle_ClearVariables +EmulatorAudio_Triangle_ClearVariables: @ 0x03001594 ldr r0, _030015D4 @ =gUnk_03005AD0 movs r1, #0 str r1, [r0] ldr r0, _030015D8 @ =gUnk_03005FDC str r1, [r0] - ldr r0, _030015DC @ =gUnk_03005AD4 + ldr r0, _030015DC @ =gEmuAudio_Triangle_LengthCounter movs r2, #0 strh r1, [r0] ldr r0, _030015E0 @ =gUnk_03005AD6 strh r1, [r0] - ldr r0, _030015E4 @ =gUnk_03005FB0 + ldr r0, _030015E4 @ =gEmuAudio_Triangle_Enable strh r1, [r0] ldr r0, _030015E8 @ =gUnk_03005AD8 strh r1, [r0] @@ -360,9 +360,9 @@ sub_03001594: @ 0x03001594 .align 2, 0 _030015D4: .4byte gUnk_03005AD0 _030015D8: .4byte gUnk_03005FDC -_030015DC: .4byte gUnk_03005AD4 +_030015DC: .4byte gEmuAudio_Triangle_LengthCounter _030015E0: .4byte gUnk_03005AD6 -_030015E4: .4byte gUnk_03005FB0 +_030015E4: .4byte gEmuAudio_Triangle_Enable _030015E8: .4byte gUnk_03005AD8 _030015EC: .4byte gUnk_03005ADA _030015F0: .4byte gUnk_03005ADC diff --git a/nes_metroid/emulator/asm/part2/part2_5.s b/nes_metroid/emulator/asm/part2/part2_5.s index 479f21890..20d29f0a2 100644 --- a/nes_metroid/emulator/asm/part2/part2_5.s +++ b/nes_metroid/emulator/asm/part2/part2_5.s @@ -26,7 +26,7 @@ _03001746: bls _03001746 movs r3, #3 ldr r0, _0300177C @ =gUnk_03005B10 - ldr r1, _03001780 @ =sUnk_0600E008 + ldr r1, _03001780 @ =sEmulatorAudio_NoiseSampleRateTable ldr r5, _03001784 @ =0x0000FFFF movs r4, #0x80 lsls r4, r4, #9 @@ -50,16 +50,16 @@ _0300176A: bx r0 .align 2, 0 _0300177C: .4byte gUnk_03005B10 -_03001780: .4byte sUnk_0600E008 +_03001780: .4byte sEmulatorAudio_NoiseSampleRateTable _03001784: .4byte 0x0000FFFF - thumb_func_start sub_03001788 -sub_03001788: @ 0x03001788 - ldr r1, _03001790 @ =gUnk_03005AFA + thumb_func_start EmulatorAudio_Noise_SetLengthCounter +EmulatorAudio_Noise_SetLengthCounter: @ 0x03001788 + ldr r1, _03001790 @ =gEmuAudio_Noise_LengthCounter strh r0, [r1] bx lr .align 2, 0 -_03001790: .4byte gUnk_03005AFA +_03001790: .4byte gEmuAudio_Noise_LengthCounter thumb_func_start sub_03001794 sub_03001794: @ 0x03001794 @@ -70,7 +70,7 @@ sub_03001794: @ 0x03001794 ands r0, r1 cmp r0, #0 beq _030017A8 - ldr r1, _030017C4 @ =gUnk_03005FC0 + ldr r1, _030017C4 @ =gEmuAudio_Noise_Enable movs r0, #1 strh r0, [r1] _030017A8: @@ -87,7 +87,7 @@ _030017A8: b _030017D4 .align 2, 0 _030017C0: .4byte gEmuAudio_SndChn -_030017C4: .4byte gUnk_03005FC0 +_030017C4: .4byte gEmuAudio_Noise_Enable _030017C8: .4byte gEmuAudio_Noise_Vol _030017CC: .4byte gUnk_03005AF4 _030017D0: @@ -100,7 +100,7 @@ _030017D4: movs r0, #0xf ands r0, r1 strh r0, [r2] - ldr r1, _03001830 @ =sUnk_030023DC + ldr r1, _03001830 @ =sEmulatorAudio_LengthCounterTable ldr r2, _03001834 @ =gEmuAudio_Noise_Hi ldrh r0, [r2] lsrs r0, r0, #3 @@ -127,19 +127,19 @@ _03001806: ldrb r0, [r0] lsls r0, r0, #2 adds r0, r0, r5 - bl sub_03001788 + bl EmulatorAudio_Noise_SetLengthCounter ldr r0, _03001838 @ =sUnk_03002988 str r4, [r0] lsls r0, r4, #2 adds r0, r0, r5 - bl sub_03001788 + bl EmulatorAudio_Noise_SetLengthCounter pop {r4, r5} pop {r0} bx r0 .align 2, 0 _03001828: .4byte gUnk_03005AF4 _0300182C: .4byte gUnk_03005AF8 -_03001830: .4byte sUnk_030023DC +_03001830: .4byte sEmulatorAudio_LengthCounterTable _03001834: .4byte gEmuAudio_Noise_Hi _03001838: .4byte sUnk_03002988 _0300183C: .4byte gUnk_03005AF6 @@ -147,7 +147,7 @@ _0300183C: .4byte gUnk_03005AF6 thumb_func_start sub_03001840 sub_03001840: @ 0x03001840 push {lr} - ldr r0, _0300185C @ =gUnk_03005FC0 + ldr r0, _0300185C @ =gEmuAudio_Noise_Enable ldrh r0, [r0] cmp r0, #0 beq _03001856 @@ -161,7 +161,7 @@ _03001856: pop {r0} bx r0 .align 2, 0 -_0300185C: .4byte gUnk_03005FC0 +_0300185C: .4byte gEmuAudio_Noise_Enable _03001860: .4byte gUnk_03005AFE thumb_func_start sub_03001864 @@ -178,8 +178,8 @@ sub_03001864: @ 0x03001864 _03001874: .4byte gUnk_03005AF4 _03001878: .4byte gUnk_03005AF8 - thumb_func_start sub_0300187C -sub_0300187C: @ 0x0300187C + thumb_func_start EmulatorAudio_Noise_WriteVolume +EmulatorAudio_Noise_WriteVolume: @ 0x0300187C push {r4, r5, r6, lr} lsls r0, r0, #0x18 lsrs r4, r0, #0x18 @@ -211,7 +211,7 @@ _030018B4: .4byte gUnk_03005AF4 _030018B8: cmp r6, #0 beq _030018D0 - ldr r0, _030018D8 @ =gUnk_03005FC0 + ldr r0, _030018D8 @ =gEmuAudio_Noise_Enable ldrh r0, [r0] cmp r0, #0 beq _030018D0 @@ -226,11 +226,11 @@ _030018D0: pop {r0} bx r0 .align 2, 0 -_030018D8: .4byte gUnk_03005FC0 +_030018D8: .4byte gEmuAudio_Noise_Enable _030018DC: .4byte gUnk_03005AF8 - thumb_func_start sub_030018E0 -sub_030018E0: @ 0x030018E0 + thumb_func_start EmulatorAudio_Noise_WriteLo +EmulatorAudio_Noise_WriteLo: @ 0x030018E0 push {r4, lr} lsls r0, r0, #0x18 lsrs r0, r0, #0x18 @@ -278,8 +278,8 @@ _0300193A: .align 2, 0 _03001940: .4byte sUnk_03002846 - thumb_func_start sub_03001944 -sub_03001944: @ 0x03001944 + thumb_func_start EmulatorAudio_Noise_WriteHi +EmulatorAudio_Noise_WriteHi: @ 0x03001944 push {lr} lsls r0, r0, #0x18 lsrs r2, r0, #0x18 @@ -316,8 +316,8 @@ _0300197A: _03001988: .4byte sUnk_03002846 _0300198C: .4byte gEmuAudio_Noise_Hi - thumb_func_start sub_03001990 -sub_03001990: @ 0x03001990 + thumb_func_start EmulatorAudio_Noise_ClearVariables +EmulatorAudio_Noise_ClearVariables: @ 0x03001990 push {r4, lr} ldr r1, _030019E4 @ =gUnk_03005AE8 movs r0, #1 @@ -334,7 +334,7 @@ sub_03001990: @ 0x03001990 strh r1, [r0] ldr r0, _030019F8 @ =gUnk_03005AF8 strh r1, [r0] - ldr r0, _030019FC @ =gUnk_03005AFA + ldr r0, _030019FC @ =gEmuAudio_Noise_LengthCounter strh r1, [r0] ldr r0, _03001A00 @ =gUnk_03005AFC strh r1, [r0] @@ -343,7 +343,7 @@ sub_03001990: @ 0x03001990 lsls r4, r4, #8 adds r0, r4, #0 strh r0, [r2] - ldr r0, _03001A08 @ =gUnk_03005FC0 + ldr r0, _03001A08 @ =gEmuAudio_Noise_Enable strh r1, [r0] ldr r0, _03001A0C @ =gUnk_03005AFE strh r1, [r0] @@ -367,10 +367,10 @@ _030019EC: .4byte gUnk_03005AF0 _030019F0: .4byte gUnk_03005AF4 _030019F4: .4byte gUnk_03005AF6 _030019F8: .4byte gUnk_03005AF8 -_030019FC: .4byte gUnk_03005AFA +_030019FC: .4byte gEmuAudio_Noise_LengthCounter _03001A00: .4byte gUnk_03005AFC _03001A04: .4byte sUnk_03002846 -_03001A08: .4byte gUnk_03005FC0 +_03001A08: .4byte gEmuAudio_Noise_Enable _03001A0C: .4byte gUnk_03005AFE _03001A10: .4byte gEmuAudio_Noise_Vol _03001A14: .4byte gUnk_03005B02 @@ -520,8 +520,8 @@ sub_03001C0C: @ 0x03001C0C bx lr .align 2, 0 - thumb_func_start sub_03001C10 -sub_03001C10: @ 0x03001C10 + thumb_func_start EmulatorAudio_SoundChannel_Write +EmulatorAudio_SoundChannel_Write: @ 0x03001C10 push {r4, r5, lr} lsls r0, r0, #0x18 lsrs r4, r0, #0x18 @@ -558,8 +558,8 @@ _03001C4C: .align 2, 0 _03001C54: .4byte gEmuAudio_SndChn - thumb_func_start sub_03001C58 -sub_03001C58: @ 0x03001C58 + thumb_func_start EmulatorAudio_FrameCounter_Write +EmulatorAudio_FrameCounter_Write: @ 0x03001C58 push {lr} lsls r0, r0, #0x18 lsrs r0, r0, #0x18 @@ -570,13 +570,13 @@ sub_03001C58: @ 0x03001C58 cmp r1, #0 beq _03001C78 movs r0, #0xa0 - bl sub_03000000 + bl EmulatorAudio_SetTimer1Reload b _03001C7E .align 2, 0 _03001C74: .4byte gEmuAudio_FrameCtr _03001C78: movs r0, #0x80 - bl sub_03000000 + bl EmulatorAudio_SetTimer1Reload _03001C7E: ldr r1, _03001CFC @ =gUnk_03005AA2 ldrh r0, [r1] @@ -620,28 +620,28 @@ _03001CBA: subs r0, #1 strh r0, [r1] _03001CC6: - ldr r1, _03001D14 @ =gUnk_03005AA8 + ldr r1, _03001D14 @ =gEmuAudio_Pulse1_LengthCounter ldrh r0, [r1] cmp r0, #0 beq _03001CD2 subs r0, #1 strh r0, [r1] _03001CD2: - ldr r1, _03001D18 @ =gUnk_03005AC8 + ldr r1, _03001D18 @ =gEmuAudio_Pulse2_LengthCounter ldrh r0, [r1] cmp r0, #0 beq _03001CDE subs r0, #1 strh r0, [r1] _03001CDE: - ldr r1, _03001D1C @ =gUnk_03005AD4 + ldr r1, _03001D1C @ =gEmuAudio_Triangle_LengthCounter ldrh r0, [r1] cmp r0, #0 beq _03001CEA subs r0, #1 strh r0, [r1] _03001CEA: - ldr r1, _03001D20 @ =gUnk_03005AFA + ldr r1, _03001D20 @ =gEmuAudio_Noise_LengthCounter ldrh r0, [r1] cmp r0, #0 beq _03001CF6 @@ -657,10 +657,10 @@ _03001D04: .4byte gUnk_03005AF8 _03001D08: .4byte gUnk_03005AD6 _03001D0C: .4byte gUnk_03005AAA _03001D10: .4byte gUnk_03005ACA -_03001D14: .4byte gUnk_03005AA8 -_03001D18: .4byte gUnk_03005AC8 -_03001D1C: .4byte gUnk_03005AD4 -_03001D20: .4byte gUnk_03005AFA +_03001D14: .4byte gEmuAudio_Pulse1_LengthCounter +_03001D18: .4byte gEmuAudio_Pulse2_LengthCounter +_03001D1C: .4byte gEmuAudio_Triangle_LengthCounter +_03001D20: .4byte gEmuAudio_Noise_LengthCounter thumb_func_start sub_03001D24 sub_03001D24: @ 0x03001D24 @@ -670,8 +670,8 @@ sub_03001D24: @ 0x03001D24 .align 2, 0 _03001D2C: .4byte gUnk_03005FB8 - thumb_func_start sub_03001D30 -sub_03001D30: @ 0x03001D30 + thumb_func_start EmulatorAudio_ProcessApuAndMixBuffers +EmulatorAudio_ProcessApuAndMixBuffers: @ 0x03001D30 push {r4, r5, r6, r7, lr} mov r7, sl mov r6, sb @@ -679,12 +679,12 @@ sub_03001D30: @ 0x03001D30 push {r5, r6, r7} adds r7, r0, #0 adds r4, r1, #0 - ldr r6, _03001D68 @ =gUnk_03005B50 - ldr r0, _03001D6C @ =gUnk_03005BF0 + ldr r6, _03001D68 @ =gEmuAudio_Pulse1_Buffer + ldr r0, _03001D6C @ =gEmuAudio_Pulse2_Buffer mov r8, r0 - ldr r0, _03001D70 @ =gUnk_03005C90 + ldr r0, _03001D70 @ =gEmuAudio_Triangle_Buffer mov sb, r0 - ldr r0, _03001D74 @ =gUnk_03005D30 + ldr r0, _03001D74 @ =gEmuAudio_Noise_Buffer mov sl, r0 movs r5, #0 ldr r0, _03001D78 @ =gUnk_03005FB8 @@ -699,13 +699,13 @@ sub_03001D30: @ 0x03001D30 bl sub_03000704 b _0300202E .align 2, 0 -_03001D68: .4byte gUnk_03005B50 -_03001D6C: .4byte gUnk_03005BF0 -_03001D70: .4byte gUnk_03005C90 -_03001D74: .4byte gUnk_03005D30 +_03001D68: .4byte gEmuAudio_Pulse1_Buffer +_03001D6C: .4byte gEmuAudio_Pulse2_Buffer +_03001D70: .4byte gEmuAudio_Triangle_Buffer +_03001D74: .4byte gEmuAudio_Noise_Buffer _03001D78: .4byte gUnk_03005FB8 _03001D7C: - ldr r0, _03001EAC @ =gUnk_03005FCC + ldr r0, _03001EAC @ =gEmuAudio_Pulse1_Enable ldrh r0, [r0] cmp r0, #0 beq _03001DD6 @@ -728,11 +728,11 @@ _03001DA0: ands r0, r1 cmp r0, #0 beq _03001DB4 - ldr r0, _03001EBC @ =gUnk_03005AA0 + ldr r0, _03001EBC @ =gEmuAudio_Pulse1_Timer ldrh r0, [r0] bl sub_03000848 _03001DB4: - ldr r2, _03001EC0 @ =gUnk_03005AA8 + ldr r2, _03001EC0 @ =gEmuAudio_Pulse1_LengthCounter ldrh r0, [r2] cmp r0, #0 beq _03001DC0 @@ -763,7 +763,7 @@ _03001DD6: movs r0, #0x80 lsls r0, r0, #0x18 orrs r5, r0 - ldr r0, _03001EAC @ =gUnk_03005FCC + ldr r0, _03001EAC @ =gEmuAudio_Pulse1_Enable strh r1, [r0] ldr r0, _03001ECC @ =gUnk_03005AA6 ldrh r0, [r0] @@ -771,7 +771,7 @@ _03001DD6: beq _03001E00 bl sub_03000790 _03001E00: - ldr r0, _03001ED0 @ =gUnk_03005FD8 + ldr r0, _03001ED0 @ =gEmuAudio_Pulse2_Enable ldrh r0, [r0] cmp r0, #0 beq _03001E5C @@ -795,11 +795,11 @@ _03001E26: ands r0, r1 cmp r0, #0 beq _03001E3A - ldr r0, _03001EE0 @ =gUnk_03005AC0 + ldr r0, _03001EE0 @ =gEmuAudio_Pulse2_Timer ldrh r0, [r0] bl sub_03000E40 _03001E3A: - ldr r2, _03001EE4 @ =gUnk_03005AC8 + ldr r2, _03001EE4 @ =gEmuAudio_Pulse2_LengthCounter ldrh r0, [r2] cmp r0, #0 beq _03001E46 @@ -830,7 +830,7 @@ _03001E5C: movs r0, #0x80 lsls r0, r0, #0x17 orrs r5, r0 - ldr r0, _03001ED0 @ =gUnk_03005FD8 + ldr r0, _03001ED0 @ =gEmuAudio_Pulse2_Enable strh r1, [r0] ldr r0, _03001EF0 @ =gUnk_03005AC6 ldrh r0, [r0] @@ -838,7 +838,7 @@ _03001E5C: beq _03001E86 bl sub_03000D38 _03001E86: - ldr r0, _03001EF4 @ =gUnk_03005FB0 + ldr r0, _03001EF4 @ =gEmuAudio_Triangle_Enable ldrh r0, [r0] cmp r0, #0 beq _03001F5E @@ -856,25 +856,25 @@ _03001E86: orrs r5, r0 b _03001F08 .align 2, 0 -_03001EAC: .4byte gUnk_03005FCC +_03001EAC: .4byte gEmuAudio_Pulse1_Enable _03001EB0: .4byte gUnk_03005AAD _03001EB4: .4byte gUnk_03005A94 _03001EB8: .4byte gEmuAudio_Pulse1_Sweep -_03001EBC: .4byte gUnk_03005AA0 -_03001EC0: .4byte gUnk_03005AA8 +_03001EBC: .4byte gEmuAudio_Pulse1_Timer +_03001EC0: .4byte gEmuAudio_Pulse1_LengthCounter _03001EC4: .4byte gEmuAudio_Pulse1_Vol _03001EC8: .4byte gUnk_03005AA4 _03001ECC: .4byte gUnk_03005AA6 -_03001ED0: .4byte gUnk_03005FD8 +_03001ED0: .4byte gEmuAudio_Pulse2_Enable _03001ED4: .4byte gUnk_03005ACD _03001ED8: .4byte gUnk_03005AB4 _03001EDC: .4byte gEmuAudio_Pulse2_Sweep -_03001EE0: .4byte gUnk_03005AC0 -_03001EE4: .4byte gUnk_03005AC8 +_03001EE0: .4byte gEmuAudio_Pulse2_Timer +_03001EE4: .4byte gEmuAudio_Pulse2_LengthCounter _03001EE8: .4byte gEmuAudio_Pulse2_Vol _03001EEC: .4byte gUnk_03005AC4 _03001EF0: .4byte gUnk_03005AC6 -_03001EF4: .4byte gUnk_03005FB0 +_03001EF4: .4byte gEmuAudio_Triangle_Enable _03001EF8: .4byte gUnk_03005FD4 _03001EFC: .4byte gUnk_03005ADA _03001F00: @@ -882,7 +882,7 @@ _03001F00: adds r1, r4, #0 bl sub_0300160C _03001F08: - ldr r0, _03001F30 @ =gUnk_03005AD4 + ldr r0, _03001F30 @ =gEmuAudio_Triangle_LengthCounter ldrh r1, [r0] adds r6, r0, #0 cmp r1, #0 @@ -904,7 +904,7 @@ _03001F16: adds r0, r1, #1 b _03001F46 .align 2, 0 -_03001F30: .4byte gUnk_03005AD4 +_03001F30: .4byte gEmuAudio_Triangle_LengthCounter _03001F34: .4byte gUnk_03005AD8 _03001F38: .4byte gUnk_03005ADC _03001F3C: .4byte gUnk_03005ADA @@ -941,10 +941,10 @@ _03001F5E: movs r0, #0x80 lsls r0, r0, #0x16 orrs r5, r0 - ldr r0, _03001FF0 @ =gUnk_03005FB0 + ldr r0, _03001FF0 @ =gEmuAudio_Triangle_Enable strh r1, [r0] _03001F80: - ldr r0, _03001FF4 @ =gUnk_03005FC0 + ldr r0, _03001FF4 @ =gEmuAudio_Noise_Enable ldrh r0, [r0] cmp r0, #0 beq _03001FC4 @@ -961,7 +961,7 @@ _03001F80: movs r0, #0 strb r0, [r2] _03001FA2: - ldr r2, _03002000 @ =gUnk_03005AFA + ldr r2, _03002000 @ =gEmuAudio_Noise_LengthCounter ldrh r0, [r2] cmp r0, #0 beq _03001FAE @@ -992,18 +992,18 @@ _03001FC4: movs r0, #0x80 lsls r0, r0, #0x15 orrs r5, r0 - ldr r0, _03001FF4 @ =gUnk_03005FC0 + ldr r0, _03001FF4 @ =gEmuAudio_Noise_Enable strh r1, [r0] b _03002016 .align 2, 0 _03001FE4: .4byte gEmuAudio_Triangle_Linear _03001FE8: .4byte gUnk_03005AD8 _03001FEC: .4byte gUnk_03005ADA -_03001FF0: .4byte gUnk_03005FB0 -_03001FF4: .4byte gUnk_03005FC0 +_03001FF0: .4byte gEmuAudio_Triangle_Enable +_03001FF4: .4byte gEmuAudio_Noise_Enable _03001FF8: .4byte gUnk_03005B08 _03001FFC: .4byte gUnk_03005AF4 -_03002000: .4byte gUnk_03005AFA +_03002000: .4byte gEmuAudio_Noise_LengthCounter _03002004: .4byte gEmuAudio_Noise_Vol _03002008: .4byte gUnk_03005AFE _0300200C: @@ -1030,21 +1030,21 @@ _0300202E: pop {r0} bx r0 - thumb_func_start sub_0300203C -sub_0300203C: @ 0x0300203C + thumb_func_start EmulatorAudio_SetupEngine +EmulatorAudio_SetupEngine: @ 0x0300203C push {r4, r5, r6, r7, lr} mov r7, sl mov r6, sb mov r5, r8 push {r5, r6, r7} sub sp, #8 - ldr r0, _03002154 @ =gUnk_03005B50 + ldr r0, _03002154 @ =gEmuAudio_Pulse1_Buffer mov r8, r0 bl sub_0300173C movs r3, #0 movs r2, #0 mov sl, r8 - ldr r1, _03002158 @ =gUnk_03005BF0 + ldr r1, _03002158 @ =gEmuAudio_Pulse2_Buffer mov sb, r1 mov ip, r8 mov r4, sb @@ -1056,40 +1056,40 @@ _0300205E: subs r0, #4 stm r0!, {r2} stm r4!, {r2} - ldr r0, _0300215C @ =gUnk_03005C90 + ldr r0, _0300215C @ =gEmuAudio_Triangle_Buffer adds r0, r1, r0 str r2, [r0] - ldr r0, _03002160 @ =gUnk_03005D30 + ldr r0, _03002160 @ =gEmuAudio_Noise_Buffer adds r0, r1, r0 str r2, [r0] - ldr r7, _03002164 @ =gUnk_03005DD0 + ldr r7, _03002164 @ =gEmuAudio_OutputBuffer0 adds r0, r1, r7 str r2, [r0] - ldr r6, _03002168 @ =gUnk_03005E70 + ldr r6, _03002168 @ =gEmuAudio_OutputBuffer1 adds r0, r1, r6 str r2, [r0] - ldr r5, _0300216C @ =gUnk_03005F10 + ldr r5, _0300216C @ =gEmuAudio_OutputBuffer2 adds r1, r1, r5 str r2, [r1] adds r3, #1 cmp r3, #0x27 bls _0300205E - ldr r0, _03002170 @ =gUnk_03005A80 + ldr r0, _03002170 @ =gEmuAudio_Pulse1_BufferPtr mov r1, sl str r1, [r0] - ldr r0, _03002174 @ =gUnk_03005A84 + ldr r0, _03002174 @ =gEmuAudio_Pulse2_BufferPtr mov r1, sb str r1, [r0] - ldr r0, _03002178 @ =gUnk_03005A88 - ldr r1, _0300215C @ =gUnk_03005C90 + ldr r0, _03002178 @ =gEmuAudio_Triangle_BufferPtr + ldr r1, _0300215C @ =gEmuAudio_Triangle_Buffer str r1, [r0] - ldr r0, _0300217C @ =gUnk_03005A8C - ldr r1, _03002160 @ =gUnk_03005D30 + ldr r0, _0300217C @ =gEmuAudio_Noise_BufferPtr + ldr r1, _03002160 @ =gEmuAudio_Noise_Buffer str r1, [r0] ldr r0, _03002180 @ =gUnk_03005A90 movs r4, #0 str r4, [r0] - ldr r0, _03002184 @ =gUnk_03005FD0 + ldr r0, _03002184 @ =gEmuAudio_Pulse1_Frequency str r4, [r0] ldr r0, _03002188 @ =gUnk_03005AD0 str r4, [r0] @@ -1144,12 +1144,12 @@ _0300205E: lsrs r3, r3, #0x10 movs r0, #0xa0 str r0, [sp] - ldr r0, _030021A4 @ =sub_03001D30 + ldr r0, _030021A4 @ =EmulatorAudio_ProcessApuAndMixBuffers str r0, [sp, #4] adds r0, r7, #0 adds r1, r6, #0 adds r2, r5, #0 - bl sub_030002A4 + bl EmulatorAudio_SetupOutput add sp, #8 pop {r3, r4, r5} mov r8, r3 @@ -1159,19 +1159,19 @@ _0300205E: pop {r0} bx r0 .align 2, 0 -_03002154: .4byte gUnk_03005B50 -_03002158: .4byte gUnk_03005BF0 -_0300215C: .4byte gUnk_03005C90 -_03002160: .4byte gUnk_03005D30 -_03002164: .4byte gUnk_03005DD0 -_03002168: .4byte gUnk_03005E70 -_0300216C: .4byte gUnk_03005F10 -_03002170: .4byte gUnk_03005A80 -_03002174: .4byte gUnk_03005A84 -_03002178: .4byte gUnk_03005A88 -_0300217C: .4byte gUnk_03005A8C +_03002154: .4byte gEmuAudio_Pulse1_Buffer +_03002158: .4byte gEmuAudio_Pulse2_Buffer +_0300215C: .4byte gEmuAudio_Triangle_Buffer +_03002160: .4byte gEmuAudio_Noise_Buffer +_03002164: .4byte gEmuAudio_OutputBuffer0 +_03002168: .4byte gEmuAudio_OutputBuffer1 +_0300216C: .4byte gEmuAudio_OutputBuffer2 +_03002170: .4byte gEmuAudio_Pulse1_BufferPtr +_03002174: .4byte gEmuAudio_Pulse2_BufferPtr +_03002178: .4byte gEmuAudio_Triangle_BufferPtr +_0300217C: .4byte gEmuAudio_Noise_BufferPtr _03002180: .4byte gUnk_03005A90 -_03002184: .4byte gUnk_03005FD0 +_03002184: .4byte gEmuAudio_Pulse1_Frequency _03002188: .4byte gUnk_03005AD0 _0300218C: .4byte gUnk_03005FDC _03002190: .4byte gUnk_03005AE8 @@ -1179,7 +1179,7 @@ _03002194: .4byte gUnk_03005A96 _03002198: .4byte gUnk_03005AB6 _0300219C: .4byte gEmuAudio_SndChn _030021A0: .4byte gEmuAudio_FrameCtr -_030021A4: .4byte sub_03001D30 +_030021A4: .4byte EmulatorAudio_ProcessApuAndMixBuffers thumb_func_start sub_030021A8 sub_030021A8: @ 0x030021A8 diff --git a/nes_metroid/emulator/asm/part2/part2_handwritten.s b/nes_metroid/emulator/asm/part2/part2_handwritten.s index 1c45899c6..102fce6bc 100644 --- a/nes_metroid/emulator/asm/part2/part2_handwritten.s +++ b/nes_metroid/emulator/asm/part2/part2_handwritten.s @@ -6,11 +6,40 @@ .section .data - .global sUnk_030023DC -sUnk_030023DC: - .byte 0x05, 0x7F, 0x0A, 0x01 - .byte 0x13, 0x02, 0x28, 0x03, 0x50, 0x04, 0x1E, 0x05, 0x07, 0x06, 0x0D, 0x07, 0x06, 0x08, 0x0C, 0x09 - .byte 0x18, 0x0A, 0x30, 0x0B, 0x60, 0x0C, 0x24, 0x0D, 0x08, 0x0E, 0x10, 0x0F + .global sEmulatorAudio_LengthCounterTable +sEmulatorAudio_LengthCounterTable: @ 0x030023DC + .byte 10/2 + .byte 254/2 + .byte 20/2 + .byte 2/2 + .byte 40/2 - 1 + .byte 4/2 + .byte 80/2 + .byte 6/2 + .byte 160/2 + .byte 8/2 + .byte 60/2 + .byte 10/2 + .byte 14/2 + .byte 12/2 + .byte 26/2 + .byte 14/2 + .byte 12/2 + .byte 16/2 + .byte 24/2 + .byte 18/2 + .byte 48/2 + .byte 20/2 + .byte 96/2 + .byte 22/2 + .byte 192/2 + .byte 24/2 + .byte 72/2 + .byte 26/2 + .byte 16/2 + .byte 28/2 + .byte 32/2 + .byte 30/2 _030023FC: .byte 0x00, 0x00, 0x00, 0x00 @@ -204,7 +233,7 @@ sUnk_03002948: sUnk_03002988: .4byte 0x00000000 - @ Loads + @ Reads _0300298C: .4byte sub_03005250 @ Addresses $1XXXX-$11XXX (Is this possible?) _03002990: .4byte sub_03002E38 @ Addresses $EXXX-$FXXX (ROM) _03002994: .4byte sub_03002E38 @ Addresses $CXXX-$DXXX (ROM) @@ -598,18 +627,19 @@ _03002EE4: b _03002EC8 @ Reads from APU/2A03 registers + @ r0 = APU register address arm_func_start sub_03002EFC sub_03002EFC: @ 0x03002EFC - tst r0, #0x1f00 + tst r0, #0x1f00 @ TODO: is this checking for outside APU space? bne _03002F2C - and r2, r0, #0xff + and r2, r0, #0xff @ r2 = low byte of APU register address cmp r2, #0x15 - beq _03002F58 - blo _03002F2C + beq _03002F58 @ if r2 == SND_CHN: goto _03002F58 + blo _03002F2C @ if r2 < SND_CHN: goto _03002F2C cmp r2, #0x17 - blo _03002F68 - beq _03003010 - cmp r2, #0x30 + blo _03002F68 @ if r2 < JOY2: goto _03002F68 + beq _03003010 @ if r2 == JOY2: goto _03003010 + cmp r2, #0x30 @ NOTE: this code should be unreachable blo _03002F2C bhs _03002F34 _03002F2C: @@ -619,7 +649,7 @@ _03002F34: str r0, [sp, #SP_93C] str lr, [sp, #SP_938] add lr, pc, #0x4 @ =_03002F48 - ldr r2, _030031C8 @ =sub_03000380 + ldr r2, _030031C8 @ =EmulatorAudio_GetActiveChannels bx r2 _03002F48: add r12, r11, #0x44 @@ -804,7 +834,7 @@ _03003100: stm r11, {r1, r2, r3, r4, r5, r6, r7, r8} bx lr .align 2, 0 -_030031C8: .4byte sub_03000380 +_030031C8: .4byte EmulatorAudio_GetActiveChannels _030031CC: .4byte 0x06015400 _030031D0: .4byte 0x06015540 @@ -939,19 +969,19 @@ _03003380: arm_func_start sub_030033A4 sub_030033A4: @ 0x030033A4 tst r0, #0x1fc0 - bne _030034A8 + bne sub_030034A8 and r2, r0, #0x3f cmp r2, #0x20 - bge _030034A8 + bge sub_030034A8 subs r2, r2, #0x14 - blt _030034A8 + blt sub_030034A8 @ goto _030033C8[r2] ldr pc, [pc, r2, lsl #2] _030033C4: .4byte 0x000000 _030033C8: .4byte sub_030033F8 @ OAMDMA - .4byte _030034A8 @ SND_CHN + .4byte sub_030034A8 @ SND_CHN .4byte sub_03003444 @ JOY1 .4byte sub_03003494 @ JOY2 .4byte sub_03003034 @ Invalid/Unused/Dontcare registers @@ -1016,14 +1046,19 @@ _03003484: sub_03003494: @ 0x03003494 ands r2, r1, #0xc0 strb r2, [sp, #SP_A3C] - bne _030034A8 + bne sub_030034A8 mov r2, #0x40 str r2, [sp, #SP_9D0] -_030034A8: + + @ Writes to APU + arm_func_start sub_030034A8 +sub_030034A8: @ 0x030034A8 str r3, [sp, #SP_884] + @ Call SP_9B4 (EmulatorAudio_WriteToApu(apuRegister=r0, value=r1)) ldr r3, [sp, #SP_9B4] - add lr, pc, #0x0 @ =0x030034B8 + add lr, pc, #0x0 @ =_030034B8 bx r3 +_030034B8: ldr r3, [sp, #SP_884] add r12, r11, #0x44 cmp r4, #0 @@ -3511,7 +3546,7 @@ _030057E4: ldr r12, [pc, r2] bx r12 _030057F8: - .4byte sub_030004E0 @ Timer 1 Interrupt + .4byte EmulatorAudio_Timer1Callback @ Timer 1 Interrupt .4byte sub_0300525C @ V-Blank Interrupt .4byte sub_0300582C @ Timer 3 Interrupt .4byte sub_0300583C @ All other interrupts diff --git a/nes_metroid/emulator/asm/part5.s b/nes_metroid/emulator/asm/part5.s index a9a4efa1d..88bad418a 100644 --- a/nes_metroid/emulator/asm/part5.s +++ b/nes_metroid/emulator/asm/part5.s @@ -6,28 +6,28 @@ .section .rodata - .4byte 0x006D3D34 - .4byte 0x001B4F4D + .4byte 7159092 + .4byte 1789773 - .global sUnk_0600E008 -sUnk_0600E008: - .4byte 0x0006D3D3 - .4byte 0x000369EA - .4byte 0x0001B4F5 - .4byte 0x0000DA7A - .4byte 0x00006D3D - .4byte 0x000048D3 - .4byte 0x0000369F - .4byte 0x00002BB2 - .4byte 0x0000229C - .4byte 0x00001B86 - .4byte 0x00001266 - .4byte 0x00000DC3 - .4byte 0x0000092D + .global sEmulatorAudio_NoiseSampleRateTable +sEmulatorAudio_NoiseSampleRateTable: + .4byte 447443 + .4byte 223722 + .4byte 111861 + .4byte 55930 + .4byte 27965 + .4byte 18643 + .4byte 13983 + .4byte 11186 + .4byte 8860 + .4byte 7046 + .4byte 4710 + .4byte 3523 + .4byte 2349 - .4byte 0x000006E2 - .4byte 0x00000370 - .4byte 0x0000036B + .4byte 1762 + .4byte 880 + .4byte 875 .section .text @@ -248,13 +248,13 @@ sub_0600E1C4: @ 0x0600E1C4 strh r1, [r4, #4] @ REG_DISPSTAT = 8 (V-Blank IRQ Enable) (why does debugger say 0xA?) mov r1, #0x31 orr r1, r1, #0x2000 - strh r1, [r5, #-8] @ REG_IE = 0x2031 (Game Pak, Timer 1 Overflow, Timer 0 Overflow, LCD V-Blank) + strh r1, [r5, #-8] @ REG_IE = 0x2031 (Game Pak, Timer 2 Overflow, Timer 1 Overflow, LCD V-Blank) mvn r1, #0 strh r1, [r5, #-6] @ REG_IF = 0xFFFF (acknowledge all interrupt requests) mov r1, #1 strh r1, [r5] @ REG_IME = 1 (enable interrupts) - @ sub_03000488() - ldr r4, _0600E234 @ =sub_03000488 + @ EmulatorAudio_Initialize() + ldr r4, _0600E234 @ =EmulatorAudio_Initialize add lr, pc, #0x0 @ =_0600E224 bx r4 _0600E224: @@ -265,7 +265,7 @@ _0600E224: add lr, pc, #0x8 @ =_0600E23C bx r4 .align 2, 0 -_0600E234: .4byte sub_03000488 +_0600E234: .4byte EmulatorAudio_Initialize _0600E238: .4byte sub_03000368 _0600E23C: bl sub_0600EBF8 @@ -400,7 +400,7 @@ sub_0600E38C: @ 0x0600E38C add lr, pc, #0xC @ =sub_0600E3A0 mov r0, #0x4000 orr r0, r0, #0x15 - ldr r1, _0600E574 @ =sub_03000380 + ldr r1, _0600E574 @ =EmulatorAudio_GetActiveChannels bx r1 arm_func_start sub_0600E3A0 @@ -463,7 +463,7 @@ sub_0600E440: @ 0x0600E440 strb r0, [sp, #SP_A2D] bne _0600E3D8 add lr, pc, #0x4 @ =_0600E468 - ldr r2, _0600E578 @ =sub_0300053C + ldr r2, _0600E578 @ =EmulatorAudio_Reset bx r2 _0600E468: bl sub_0600EB04 @@ -559,8 +559,8 @@ _0600E548: ldrb r0, [r2, #0xd] bx r7 @ return r0 = [SP_854 + 0xD] .align 2, 0 -_0600E574: .4byte sub_03000380 -_0600E578: .4byte sub_0300053C +_0600E574: .4byte EmulatorAudio_GetActiveChannels +_0600E578: .4byte EmulatorAudio_Reset _0600E57C: .4byte EmulatorLoadFromSram _0600E580: .4byte sub_03002DF0 _0600E584: .4byte 0x0000C399 @@ -1028,13 +1028,13 @@ _0600EB7C: strb r1, [sp, #SP_A32] mov r1, #0xa strb r1, [sp, #SP_A2D] - ldr r2, _0600EBF0 @ =sub_03000500 + ldr r2, _0600EBF0 @ =EmulatorAudio_Disable bx r2 .align 2, 0 _0600EBE4: .4byte sub_03001D24 _0600EBE8: .4byte sub_0600E440 _0600EBEC: .4byte _0600E3D8 -_0600EBF0: .4byte sub_03000500 +_0600EBF0: .4byte EmulatorAudio_Disable _0600EBF4: .4byte 0x0600A000 arm_func_start sub_0600EBF8 diff --git a/nes_metroid/emulator/include/part2.h b/nes_metroid/emulator/include/part2.h index ff7df349d..969abee82 100644 --- a/nes_metroid/emulator/include/part2.h +++ b/nes_metroid/emulator/include/part2.h @@ -3,87 +3,89 @@ #include "types.h" +#include "structs/part2.h" + // part2 -void sub_03000000(u16 arg0); +void EmulatorAudio_SetTimer1Reload(u16 timer1Reload); u16 sub_03000024(u8 arg0); u16 sub_03000050(u16 arg0); -void sub_03000080(void); -void sub_03000188(u16 arg0); -void sub_030001B4(void); -void sub_030001C4(void* arg0); +void EmulatorAudio_UpdateApuAndOutput(void); +void EmulatorAudio_StartTimers(u16 timer0Reload); +void EmulatorAudio_DisableTimers(void); +void EmulatorAudio_SetNewSource(void* src); void sub_030001F0(void* arg0, u16 arg1, u32 arg2, u8 arg3); void sub_0300023C(void* arg0, void* arg1, u16 arg2, s32 arg3, void* arg4); -void sub_030002A4(void* arg0, void* arg1, void* arg2, u16 arg3, s32 arg4, void* arg5); -void sub_03000330(void); +void EmulatorAudio_SetupOutput(void* outputBuffer0, void* outputBuffer1, void* outputBuffer2, u16 timer0Reload, u32 timer1Reload, void* func); +void EmulatorAudio_CallDisableTimers(void); void sub_0300033C(u32 arg0); void sub_03000348(u32 arg0); void sub_03000354(u32 arg0, u32 arg1); void sub_03000368(u32 arg0); -u8 sub_03000380(u16 arg0); -void sub_03000404(u8 arg0); -void sub_03000408(u16 arg0, u8 arg1); -void sub_0300047C(u8* arg0, u8 arg1); -u8 sub_03000484(u8* arg0); -void sub_03000488(void); -void sub_030004E0(void); -void sub_03000500(void); -void sub_0300053C(void); -void sub_03000564(void); +u8 EmulatorAudio_GetActiveChannels(EmulatorAudioApuRegisters apuRegister); +void EmulatorAudio_Stub(u8 value); +void EmulatorAudio_WriteToApu(EmulatorAudioApuRegisters apuRegister, u8 value); +void EmulatorAudio_Write8(u8* dst, u8 val); +u8 EmulatorAudio_Read8(u8* src); +void EmulatorAudio_Initialize(void); +void EmulatorAudio_Timer1Callback(void); +void EmulatorAudio_Disable(void); +void EmulatorAudio_Reset(void); +void EmulatorAudio_ClearChannels(void); // part2_2 void sub_03000778(void); -void sub_03000784(u32 arg0); +void EmulatorAudio_Pulse1_SetLengthCounter(u32 lengthCounter); void sub_03000790(void); void sub_03000824(void); -void sub_03000848(u16 arg0); +void sub_03000848(u16 timer); void sub_0300089C(u8 arg0); -void sub_030008B4(u8 arg0); -void sub_03000918(u8 arg0); -void sub_03000930(u8 arg0); +void EmulatorAudio_Pulse1_WriteVolume(u8 value); +void EmulatorAudio_Pulse1_WriteSweep(u8 value); +void EmulatorAudio_Pulse1_WriteLo(u8 value); void sub_03000948(void); // part2_3 -void sub_030009A0(u8 arg0); -void sub_030009DC(void); +void EmulatorAudio_Pulse1_WriteHi(u8 value); +void EmulatorAudio_Pulse1_ClearVariables(void); void sub_03000D20(void); -void sub_03000D2C(u32 arg0); +void EmulatorAudio_Pulse2_SetLengthCounter(u32 lengthCounter); void sub_03000D38(void); void sub_03000DEC(void); void sub_03000E10(void); -void sub_03000E40(u16 arg0); +void sub_03000E40(u16 timer); void sub_03000E94(u8 arg0); -void sub_03000EAC(u8 arg0); -void sub_03000F10(u8 arg0); -void sub_03000F28(u8 arg0); -void sub_03000F40(u8 arg0); -void sub_03000F7C(void); +void EmulatorAudio_Pulse2_WriteVolume(u8 value); +void EmulatorAudio_Pulse2_WriteSweep(u8 value); +void EmulatorAudio_Pulse2_WriteLo(u8 value); +void EmulatorAudio_Pulse2_WriteHi(u8 value); +void EmulatorAudio_Pulse2_ClearVariables(void); // part2_4 void sub_03001318(void); -void sub_03001334(u32 arg0); +void EmulatorAudio_Triangle_SetLengthCounter(u32 lengthCounter); void sub_03001340(void); void sub_030013C8(void); void sub_030013F0(u16 arg0); -void sub_03001458(u8 arg0); -void sub_030014C8(u8 arg0); +void EmulatorAudio_Triangle_WriteLinear(u8 value); +void EmulatorAudio_Triangle_WriteLo(u8 value); void sub_030014E0(void); -void sub_03001518(u8 arg0); +void EmulatorAudio_Triangle_WriteHi(u8 value); // part2_5 void sub_03001730(void); void sub_0300173C(void); -void sub_03001788(u32 arg0); +void EmulatorAudio_Noise_SetLengthCounter(u32 lengthCounter); void sub_03001794(void); void sub_03001840(void); void sub_03001864(u8 arg0); -void sub_0300187C(u8 arg0); -void sub_030018E0(u8 arg0); -void sub_03001944(u8 arg0); -void sub_03001990(void); -void sub_03001C10(u8 arg0); -void sub_03001C58(u8 arg0); +void EmulatorAudio_Noise_WriteVolume(u8 value); +void EmulatorAudio_Noise_WriteLo(u8 value); +void EmulatorAudio_Noise_WriteHi(u8 value); +void EmulatorAudio_Noise_ClearVariables(void); +void EmulatorAudio_SoundChannel_Write(u8 value); +void EmulatorAudio_FrameCounter_Write(u8 value); void sub_03001D24(u32 arg0); -void sub_03001D30(void* arg0, u32 arg1); -void sub_0300203C(void); +void EmulatorAudio_ProcessApuAndMixBuffers(void* outputBuffer, u32 timer1Reload); +void EmulatorAudio_SetupEngine(void); #endif /* PART2_H */ diff --git a/nes_metroid/emulator/include/structs/part2.h b/nes_metroid/emulator/include/structs/part2.h index 157503c79..c67e72da2 100644 --- a/nes_metroid/emulator/include/structs/part2.h +++ b/nes_metroid/emulator/include/structs/part2.h @@ -2,97 +2,140 @@ #define PART2_STRUCT_H #include "types.h" +#include "macros.h" #define NES_CLOCK_SPEED 1789773u -extern void* gUnk_03005A50; -extern void* gUnk_03005A54; -extern void* gUnk_03005A58; -extern u8 gUnk_03005A5C; -extern u8 gUnk_03005A5D; -extern u8 gUnk_03005A5E; -extern u16 gUnk_03005A60; -extern void (*gUnk_03005A64)(void*, u32); -extern u16 gUnk_03005A68[]; // length? -extern u16 gEmuAudio_SndChn; -extern u16 gEmuAudio_FrameCtr; -extern u32* gUnk_03005A80; -extern u32* gUnk_03005A84; -extern u32* gUnk_03005A88; -extern u32* gUnk_03005A8C; +#define EMULATOR_AUDIO_BUFFER_SIZE 40 + +#define NES_APU_REG_BASE 0x4000 + +MAKE_ENUM(u16, EmulatorAudioApuRegisters) { + NES_APU_REG_SQ1_VOL, + NES_APU_REG_SQ1_SWEEP, + NES_APU_REG_SQ1_LO, + NES_APU_REG_SQ1_HI, + NES_APU_REG_SQ2_VOL, + NES_APU_REG_SQ2_SWEEP, + NES_APU_REG_SQ2_LO, + NES_APU_REG_SQ2_HI, + NES_APU_REG_TRI_LINEAR, + NES_APU_REG_4009, + NES_APU_REG_TRI_LO, + NES_APU_REG_TRI_HI, + NES_APU_REG_NOISE_VOL, + NES_APU_REG_400D, + NES_APU_REG_NOISE_LO, + NES_APU_REG_NOISE_HI, + NES_APU_REG_DMC_FREQ, + NES_APU_REG_DMC_RAW, + NES_APU_REG_DMC_START, + NES_APU_REG_DMC_LEN, + NES_APU_REG_OAM_DMA, + NES_APU_REG_SND_CHN, + NES_APU_REG_JOY_1, + NES_APU_REG_FRAME_CTR, + + NES_APU_REG_COUNT +}; + +extern void* gEmuAudio_OutputBuffer0Ptr; +extern void* gEmuAudio_OutputBuffer1Ptr; +extern void* gEmuAudio_OutputBuffer2Ptr; +extern u8 gEmuAudio_EnableOutput; +extern u8 gEmuAudio_NumExtraOutputBuffers; +extern u8 gEmuAudio_CurrentOutputBuffer; +extern u16 gEmuAudio_Timer0Reload; // Set but never read +extern void (*gEmuAudio_ProcessApuAndMixBuffersFunc)(void*, u32); +extern u16 gEmuAudio_ActiveChannels[]; // length? +extern u16 gEmuAudio_SndChn; // SND_CHN +extern u16 gEmuAudio_FrameCtr; // FRAME_CTR +extern u32* gEmuAudio_Pulse1_BufferPtr; +extern u32* gEmuAudio_Pulse2_BufferPtr; +extern u32* gEmuAudio_Triangle_BufferPtr; +extern u32* gEmuAudio_Noise_BufferPtr; + +// Pulse 1 variables extern u32 gUnk_03005A90; extern u16 gUnk_03005A94; extern u16 gUnk_03005A96; -extern u16 gEmuAudio_Pulse1_Vol; -extern u16 gEmuAudio_Pulse1_Sweep; -extern u16 gEmuAudio_Pulse1_Lo; -extern u16 gEmuAudio_Pulse1_Hi; -extern u16 gUnk_03005AA0; +extern u16 gEmuAudio_Pulse1_Vol; // SQ1_VOL +extern u16 gEmuAudio_Pulse1_Sweep; // SQ1_SWEEP +extern u16 gEmuAudio_Pulse1_Lo; // SQ1_LO +extern u16 gEmuAudio_Pulse1_Hi; // SQ1_HI +extern u16 gEmuAudio_Pulse1_Timer; extern u16 gUnk_03005AA2; extern u16 gUnk_03005AA4; extern u16 gUnk_03005AA6; -extern u16 gUnk_03005AA8; +extern u16 gEmuAudio_Pulse1_LengthCounter; extern u16 gUnk_03005AAA; extern u8 gUnk_03005AAC; extern u8 gUnk_03005AAD; + +// Pulse 2 variables extern u32 gUnk_03005AB0; extern u16 gUnk_03005AB4; extern u16 gUnk_03005AB6; -extern u16 gEmuAudio_Pulse2_Vol; -extern u16 gEmuAudio_Pulse2_Sweep; -extern u16 gEmuAudio_Pulse2_Lo; -extern u16 gEmuAudio_Pulse2_Hi; -extern u16 gUnk_03005AC0; +extern u16 gEmuAudio_Pulse2_Vol; // SQ2_VOL +extern u16 gEmuAudio_Pulse2_Sweep; // SQ2_SWEEP +extern u16 gEmuAudio_Pulse2_Lo; // SQ2_LO +extern u16 gEmuAudio_Pulse2_Hi; // SQ2_HI +extern u16 gEmuAudio_Pulse2_Timer; extern u16 gUnk_03005AC2; extern u16 gUnk_03005AC4; extern u16 gUnk_03005AC6; -extern u16 gUnk_03005AC8; +extern u16 gEmuAudio_Pulse2_LengthCounter; extern u16 gUnk_03005ACA; extern u8 gUnk_03005ACC; extern u8 gUnk_03005ACD; + +// Triangle variables extern u32 gUnk_03005AD0; -extern u16 gUnk_03005AD4; +extern u16 gEmuAudio_Triangle_LengthCounter; extern u16 gUnk_03005AD6; extern u16 gUnk_03005AD8; extern u16 gUnk_03005ADA; extern u16 gUnk_03005ADC; -extern u16 gEmuAudio_Triangle_Linear; -extern u16 gEmuAudio_Triangle_Lo; -extern u16 gEmuAudio_Triangle_Hi; +extern u16 gEmuAudio_Triangle_Linear; // TRI_LINEAR +extern u16 gEmuAudio_Triangle_Lo; // TRI_LO +extern u16 gEmuAudio_Triangle_Hi; // TRI_HI extern u16 gUnk_03005AE4; + +// Noise variables extern u32 gUnk_03005AE8; extern u32 gUnk_03005AEC; extern u32 gUnk_03005AF0; extern u16 gUnk_03005AF4; extern u16 gUnk_03005AF6; extern u16 gUnk_03005AF8; -extern u16 gUnk_03005AFA; +extern u16 gEmuAudio_Noise_LengthCounter; extern u16 gUnk_03005AFC; extern u16 gUnk_03005AFE; -extern u16 gEmuAudio_Noise_Vol; +extern u16 gEmuAudio_Noise_Vol; // NOISE_VOL extern u16 gUnk_03005B02; -extern u16 gEmuAudio_Noise_Lo; -extern u16 gEmuAudio_Noise_Hi; +extern u16 gEmuAudio_Noise_Lo; // NOISE_LO +extern u16 gEmuAudio_Noise_Hi; // NOISE_HI extern u8 gUnk_03005B08; + extern u32 gUnk_03005B10[]; -extern u32 gUnk_03005B50[]; -extern u32 gUnk_03005BF0[]; -extern u32 gUnk_03005C90[]; -extern u32 gUnk_03005D30[]; -extern u32 gUnk_03005DD0[]; -extern u32 gUnk_03005E70[]; -extern u32 gUnk_03005F10[]; -extern u16 gUnk_03005FB0; -extern u32 gUnk_03005FB4; +extern u32 gEmuAudio_Pulse1_Buffer[EMULATOR_AUDIO_BUFFER_SIZE]; +extern u32 gEmuAudio_Pulse2_Buffer[EMULATOR_AUDIO_BUFFER_SIZE]; +extern u32 gEmuAudio_Triangle_Buffer[EMULATOR_AUDIO_BUFFER_SIZE]; +extern u32 gEmuAudio_Noise_Buffer[EMULATOR_AUDIO_BUFFER_SIZE]; +extern u32 gEmuAudio_OutputBuffer0[EMULATOR_AUDIO_BUFFER_SIZE]; +extern u32 gEmuAudio_OutputBuffer1[EMULATOR_AUDIO_BUFFER_SIZE]; +extern u32 gEmuAudio_OutputBuffer2[EMULATOR_AUDIO_BUFFER_SIZE]; +extern u16 gEmuAudio_Triangle_Enable; +extern u32 gUnk_03005FB4; // Set but never read extern u8 gUnk_03005FB8; -extern u32 gUnk_03005FBC; -extern u16 gUnk_03005FC0; -extern u32 gUnk_03005FC4; -extern u32 gUnk_03005FC8; -extern u16 gUnk_03005FCC; -extern u32 gUnk_03005FD0; +extern u32 gEmuAudio_Timer1Reload; +extern u16 gEmuAudio_Noise_Enable; +extern u32 gEmuAudio_Pulse2_Frequency; +extern u32 gUnk_03005FC8; // Set but never read +extern u16 gEmuAudio_Pulse1_Enable; +extern u32 gEmuAudio_Pulse1_Frequency; extern u16 gUnk_03005FD4; -extern u16 gUnk_03005FD8; +extern u16 gEmuAudio_Pulse2_Enable; extern u32 gUnk_03005FDC; #endif /* PART2_STRUCT_H */ diff --git a/nes_metroid/emulator/linker.ld b/nes_metroid/emulator/linker.ld index 7400a59dc..7c13cfa4c 100644 --- a/nes_metroid/emulator/linker.ld +++ b/nes_metroid/emulator/linker.ld @@ -36,21 +36,21 @@ SECTIONS { __rom_cursor += SIZEOF(.iwram_text); .iwram_data 0x03000000 (NOLOAD) : { - . = 0x00005A50; gUnk_03005A50 = .; - . = 0x00005A54; gUnk_03005A54 = .; - . = 0x00005A58; gUnk_03005A58 = .; - . = 0x00005A5C; gUnk_03005A5C = .; - . = 0x00005A5D; gUnk_03005A5D = .; - . = 0x00005A5E; gUnk_03005A5E = .; - . = 0x00005A60; gUnk_03005A60 = .; - . = 0x00005A64; gUnk_03005A64 = .; - . = 0x00005A68; gUnk_03005A68 = .; + . = 0x00005A50; gEmuAudio_OutputBuffer0Ptr = .; + . = 0x00005A54; gEmuAudio_OutputBuffer1Ptr = .; + . = 0x00005A58; gEmuAudio_OutputBuffer2Ptr = .; + . = 0x00005A5C; gEmuAudio_EnableOutput = .; + . = 0x00005A5D; gEmuAudio_NumExtraOutputBuffers = .; + . = 0x00005A5E; gEmuAudio_CurrentOutputBuffer = .; + . = 0x00005A60; gEmuAudio_Timer0Reload = .; + . = 0x00005A64; gEmuAudio_ProcessApuAndMixBuffersFunc = .; + . = 0x00005A68; gEmuAudio_ActiveChannels = .; . = 0x00005A7A; gEmuAudio_SndChn = .; . = 0x00005A7C; gEmuAudio_FrameCtr = .; - . = 0x00005A80; gUnk_03005A80 = .; - . = 0x00005A84; gUnk_03005A84 = .; - . = 0x00005A88; gUnk_03005A88 = .; - . = 0x00005A8C; gUnk_03005A8C = .; + . = 0x00005A80; gEmuAudio_Pulse1_BufferPtr = .; + . = 0x00005A84; gEmuAudio_Pulse2_BufferPtr = .; + . = 0x00005A88; gEmuAudio_Triangle_BufferPtr = .; + . = 0x00005A8C; gEmuAudio_Noise_BufferPtr = .; . = 0x00005A90; gUnk_03005A90 = .; . = 0x00005A94; gUnk_03005A94 = .; . = 0x00005A96; gUnk_03005A96 = .; @@ -58,11 +58,11 @@ SECTIONS { . = 0x00005A9A; gEmuAudio_Pulse1_Sweep = .; . = 0x00005A9C; gEmuAudio_Pulse1_Lo = .; . = 0x00005A9E; gEmuAudio_Pulse1_Hi = .; - . = 0x00005AA0; gUnk_03005AA0 = .; + . = 0x00005AA0; gEmuAudio_Pulse1_Timer = .; . = 0x00005AA2; gUnk_03005AA2 = .; . = 0x00005AA4; gUnk_03005AA4 = .; . = 0x00005AA6; gUnk_03005AA6 = .; - . = 0x00005AA8; gUnk_03005AA8 = .; + . = 0x00005AA8; gEmuAudio_Pulse1_LengthCounter = .; . = 0x00005AAA; gUnk_03005AAA = .; . = 0x00005AAC; gUnk_03005AAC = .; . = 0x00005AAD; gUnk_03005AAD = .; @@ -73,16 +73,16 @@ SECTIONS { . = 0x00005ABA; gEmuAudio_Pulse2_Sweep = .; . = 0x00005ABC; gEmuAudio_Pulse2_Lo = .; . = 0x00005ABE; gEmuAudio_Pulse2_Hi = .; - . = 0x00005AC0; gUnk_03005AC0 = .; + . = 0x00005AC0; gEmuAudio_Pulse2_Timer = .; . = 0x00005AC2; gUnk_03005AC2 = .; . = 0x00005AC4; gUnk_03005AC4 = .; . = 0x00005AC6; gUnk_03005AC6 = .; - . = 0x00005AC8; gUnk_03005AC8 = .; + . = 0x00005AC8; gEmuAudio_Pulse2_LengthCounter = .; . = 0x00005ACA; gUnk_03005ACA = .; . = 0x00005ACC; gUnk_03005ACC = .; . = 0x00005ACD; gUnk_03005ACD = .; . = 0x00005AD0; gUnk_03005AD0 = .; - . = 0x00005AD4; gUnk_03005AD4 = .; + . = 0x00005AD4; gEmuAudio_Triangle_LengthCounter = .; . = 0x00005AD6; gUnk_03005AD6 = .; . = 0x00005AD8; gUnk_03005AD8 = .; . = 0x00005ADA; gUnk_03005ADA = .; @@ -97,7 +97,7 @@ SECTIONS { . = 0x00005AF4; gUnk_03005AF4 = .; . = 0x00005AF6; gUnk_03005AF6 = .; . = 0x00005AF8; gUnk_03005AF8 = .; - . = 0x00005AFA; gUnk_03005AFA = .; + . = 0x00005AFA; gEmuAudio_Noise_LengthCounter = .; . = 0x00005AFC; gUnk_03005AFC = .; . = 0x00005AFE; gUnk_03005AFE = .; . = 0x00005B00; gEmuAudio_Noise_Vol = .; @@ -106,24 +106,24 @@ SECTIONS { . = 0x00005B06; gEmuAudio_Noise_Hi = .; . = 0x00005B08; gUnk_03005B08 = .; . = 0x00005B10; gUnk_03005B10 = .; - . = 0x00005B50; gUnk_03005B50 = .; - . = 0x00005BF0; gUnk_03005BF0 = .; - . = 0x00005C90; gUnk_03005C90 = .; - . = 0x00005D30; gUnk_03005D30 = .; - . = 0x00005DD0; gUnk_03005DD0 = .; - . = 0x00005E70; gUnk_03005E70 = .; - . = 0x00005F10; gUnk_03005F10 = .; - . = 0x00005FB0; gUnk_03005FB0 = .; + . = 0x00005B50; gEmuAudio_Pulse1_Buffer = .; + . = 0x00005BF0; gEmuAudio_Pulse2_Buffer = .; + . = 0x00005C90; gEmuAudio_Triangle_Buffer = .; + . = 0x00005D30; gEmuAudio_Noise_Buffer = .; + . = 0x00005DD0; gEmuAudio_OutputBuffer0 = .; + . = 0x00005E70; gEmuAudio_OutputBuffer1 = .; + . = 0x00005F10; gEmuAudio_OutputBuffer2 = .; + . = 0x00005FB0; gEmuAudio_Triangle_Enable = .; . = 0x00005FB4; gUnk_03005FB4 = .; . = 0x00005FB8; gUnk_03005FB8 = .; - . = 0x00005FBC; gUnk_03005FBC = .; - . = 0x00005FC0; gUnk_03005FC0 = .; - . = 0x00005FC4; gUnk_03005FC4 = .; + . = 0x00005FBC; gEmuAudio_Timer1Reload = .; + . = 0x00005FC0; gEmuAudio_Noise_Enable = .; + . = 0x00005FC4; gEmuAudio_Pulse2_Frequency = .; . = 0x00005FC8; gUnk_03005FC8 = .; - . = 0x00005FCC; gUnk_03005FCC = .; - . = 0x00005FD0; gUnk_03005FD0 = .; + . = 0x00005FCC; gEmuAudio_Pulse1_Enable = .; + . = 0x00005FD0; gEmuAudio_Pulse1_Frequency = .; . = 0x00005FD4; gUnk_03005FD4 = .; - . = 0x00005FD8; gUnk_03005FD8 = .; + . = 0x00005FD8; gEmuAudio_Pulse2_Enable = .; . = 0x00005FDC; gUnk_03005FDC = .; } > iwram diff --git a/nes_metroid/emulator/src/part2/part2.c b/nes_metroid/emulator/src/part2/part2.c index bdd5c8c63..c74b889f6 100644 --- a/nes_metroid/emulator/src/part2/part2.c +++ b/nes_metroid/emulator/src/part2/part2.c @@ -12,43 +12,53 @@ u32 sUnk_03002330[] = { u32 sUnk_03002370 = DMA_32BIT | DMA_DEST_FIXED; -u8 sUnk_03002374 = 0; - -void (*sUnk_03002378[0x18])(u8) = { - sub_030008B4, // SQ1_VOL - sub_03000918, // SQ1_SWEEP - sub_03000930, // SQ1_LO - sub_030009A0, // SQ1_HI - sub_03000EAC, // SQ2_VOL - sub_03000F10, // SQ2_SWEEP - sub_03000F28, // SQ2_LO - sub_03000F40, // SQ2_HI - sub_03001458, // TRI_LINEAR - sub_03000404, // - sub_030014C8, // TRI_LO - sub_03001518, // TRI_HI - sub_0300187C, // NOISE_VOL - sub_03000404, // - sub_030018E0, // NOISE_LO - sub_03001944, // NOISE_HI - sub_03000404, // - sub_03000404, // - sub_03000404, // - sub_03000404, // - sub_03000404, // - sub_03001C10, // SND_CHN - sub_03000404, // - sub_03001C58, // JOY2 (frame counter) +boolu8 sEmulatorAudio_Disabled = FALSE; + +void (*sEmulatorAudio_ApuWriteFuncs[0x18])(u8) = { + [NES_APU_REG_SQ1_VOL] = EmulatorAudio_Pulse1_WriteVolume, + [NES_APU_REG_SQ1_SWEEP] = EmulatorAudio_Pulse1_WriteSweep, + [NES_APU_REG_SQ1_LO] = EmulatorAudio_Pulse1_WriteLo, + [NES_APU_REG_SQ1_HI] = EmulatorAudio_Pulse1_WriteHi, + + [NES_APU_REG_SQ2_VOL] = EmulatorAudio_Pulse2_WriteVolume, + [NES_APU_REG_SQ2_SWEEP] = EmulatorAudio_Pulse2_WriteSweep, + [NES_APU_REG_SQ2_LO] = EmulatorAudio_Pulse2_WriteLo, + [NES_APU_REG_SQ2_HI] = EmulatorAudio_Pulse2_WriteHi, + + [NES_APU_REG_TRI_LINEAR] = EmulatorAudio_Triangle_WriteLinear, + [NES_APU_REG_4009] = EmulatorAudio_Stub, + [NES_APU_REG_TRI_LO] = EmulatorAudio_Triangle_WriteLo, + [NES_APU_REG_TRI_HI] = EmulatorAudio_Triangle_WriteHi, + + [NES_APU_REG_NOISE_VOL] = EmulatorAudio_Noise_WriteVolume, + [NES_APU_REG_400D] = EmulatorAudio_Stub, + [NES_APU_REG_NOISE_LO] = EmulatorAudio_Noise_WriteLo, + [NES_APU_REG_NOISE_HI] = EmulatorAudio_Noise_WriteHi, + + [NES_APU_REG_DMC_FREQ] = EmulatorAudio_Stub, + [NES_APU_REG_DMC_RAW] = EmulatorAudio_Stub, + [NES_APU_REG_DMC_START] = EmulatorAudio_Stub, + [NES_APU_REG_DMC_LEN] = EmulatorAudio_Stub, + + [NES_APU_REG_OAM_DMA] = EmulatorAudio_Stub, + [NES_APU_REG_SND_CHN] = EmulatorAudio_SoundChannel_Write, + [NES_APU_REG_JOY_1] = EmulatorAudio_Stub, + [NES_APU_REG_FRAME_CTR] = EmulatorAudio_FrameCounter_Write }; u32 sUnk_030023D8 = DMA_32BIT | DMA_DEST_FIXED; -void sub_03000000(u16 arg0) +/** + * @brief 03000000 | Set new timer 1 reload value + * + * @param timer1Reload Value for timer 1 reload + */ +void EmulatorAudio_SetTimer1Reload(u16 timer1Reload) { - if (gUnk_03005FBC != arg0) + if (gEmuAudio_Timer1Reload != timer1Reload) { - gUnk_03005FBC = arg0; - WRITE_16(REG_TM1CNT_L, -arg0); + gEmuAudio_Timer1Reload = timer1Reload; + WRITE_16(REG_TM1CNT_L, -timer1Reload); } } @@ -73,51 +83,58 @@ u16 sub_03000050(u16 arg0) return var_r1; } -void sub_03000080(void) +/** + * @brief 03000080 | Update the APU and audio output buffers + * + */ +void EmulatorAudio_UpdateApuAndOutput(void) { WRITE_32(REG_DMA1_CNT, C_32_2_16(DMA_ENABLE | DMA_32BIT | DMA_DEST_FIXED, 1 * sizeof(u32))); WRITE_16(REG_DMA1_CNT_H, sUnk_03002370); - if (gUnk_03005A5C != 0) + if (gEmuAudio_EnableOutput) { - if (gUnk_03005A5D != 0) + if (gEmuAudio_NumExtraOutputBuffers != 0) { - switch (gUnk_03005A5D) + switch (gEmuAudio_NumExtraOutputBuffers) { case 1: - if (gUnk_03005A5E == 0) + if (gEmuAudio_CurrentOutputBuffer == 0) { - gUnk_03005A5E = 1; - sub_030001C4(gUnk_03005A54); - gUnk_03005A64(gUnk_03005A50, gUnk_03005FBC); + gEmuAudio_CurrentOutputBuffer = 1; + EmulatorAudio_SetNewSource(gEmuAudio_OutputBuffer1Ptr); + gEmuAudio_ProcessApuAndMixBuffersFunc(gEmuAudio_OutputBuffer0Ptr, gEmuAudio_Timer1Reload); } else { - gUnk_03005A5E = 0; - sub_030001C4(gUnk_03005A50); - gUnk_03005A64(gUnk_03005A54, gUnk_03005FBC); + gEmuAudio_CurrentOutputBuffer = 0; + EmulatorAudio_SetNewSource(gEmuAudio_OutputBuffer0Ptr); + gEmuAudio_ProcessApuAndMixBuffersFunc(gEmuAudio_OutputBuffer1Ptr, gEmuAudio_Timer1Reload); } break; - + case 2: - switch (gUnk_03005A5E) + switch (gEmuAudio_CurrentOutputBuffer) { + // Output buffer 1 and start mixing buffer 2 case 0: - gUnk_03005A5E = 1; - sub_030001C4(gUnk_03005A54); - gUnk_03005A64(gUnk_03005A58, gUnk_03005FBC); + gEmuAudio_CurrentOutputBuffer = 1; + EmulatorAudio_SetNewSource(gEmuAudio_OutputBuffer1Ptr); + gEmuAudio_ProcessApuAndMixBuffersFunc(gEmuAudio_OutputBuffer2Ptr, gEmuAudio_Timer1Reload); break; - + + // Output buffer 2 and start mixing buffer 0 case 1: - gUnk_03005A5E = 2; - sub_030001C4(gUnk_03005A58); - gUnk_03005A64(gUnk_03005A50, gUnk_03005FBC); + gEmuAudio_CurrentOutputBuffer = 2; + EmulatorAudio_SetNewSource(gEmuAudio_OutputBuffer2Ptr); + gEmuAudio_ProcessApuAndMixBuffersFunc(gEmuAudio_OutputBuffer0Ptr, gEmuAudio_Timer1Reload); break; - + + // Output buffer 0 and start mixing buffer 1 case 2: - gUnk_03005A5E = 0; - sub_030001C4(gUnk_03005A50); - gUnk_03005A64(gUnk_03005A54, gUnk_03005FBC); + gEmuAudio_CurrentOutputBuffer = 0; + EmulatorAudio_SetNewSource(gEmuAudio_OutputBuffer0Ptr); + gEmuAudio_ProcessApuAndMixBuffersFunc(gEmuAudio_OutputBuffer1Ptr, gEmuAudio_Timer1Reload); break; } break; @@ -125,38 +142,50 @@ void sub_03000080(void) } else { - sub_030001C4(gUnk_03005A50); + EmulatorAudio_SetNewSource(gEmuAudio_OutputBuffer0Ptr); } } else { - sub_030001B4(); + EmulatorAudio_DisableTimers(); } } -void sub_03000188(u16 arg0) +/** + * @brief 03000188 | Start timer 0 and timer 1 + * + */ +void EmulatorAudio_StartTimers(u16 timer0Reload) { - WRITE_16(REG_TM1CNT_L, -gUnk_03005FBC); - WRITE_16(REG_TM1CNT_H, 0xC4); + WRITE_16(REG_TM1CNT_L, -gEmuAudio_Timer1Reload); + WRITE_16(REG_TM1CNT_H, 0xC4); // Count up, IRQ enable, Start - WRITE_16(REG_TM0CNT_L, arg0); - WRITE_16(REG_TM0CNT_H, 0x80); + WRITE_16(REG_TM0CNT_L, timer0Reload); + WRITE_16(REG_TM0CNT_H, 0x80); // Start } -void sub_030001B4(void) +/** + * @brief 030001B4 | Stop timer 0 and timer 1 + * + */ +void EmulatorAudio_DisableTimers(void) { WRITE_32(REG_TM0CNT_H, 0); WRITE_32(REG_TM1CNT_H, 0); } -void sub_030001C4(void* arg0) +/** + * @brief 030001C4 | Set new audio source + * + * @param src Source + */ +void EmulatorAudio_SetNewSource(void* src) { - WRITE_16(REG_DMA1_SRC, (u32)arg0); - WRITE_16(REG_DMA1_SRC + 2, (u32)arg0 >> 0x10); + WRITE_16(REG_DMA1_SRC, LOW_SHORT((u32)src)); + WRITE_16(REG_DMA1_SRC + 2, HIGH_SHORT((u32)src)); - // REG_FIFO_A - WRITE_16(REG_DMA1_DST, 0xA0); - WRITE_16(REG_DMA1_DST + 2, 0x400); + WRITE_16(REG_DMA1_DST, LOW_SHORT((u32)REG_FIFO_A)); + WRITE_16(REG_DMA1_DST + 2, HIGH_SHORT((u32)REG_FIFO_A)); WRITE_16(REG_DMA1_CNT_H, DMA_ENABLE | DMA_START_SPECIAL | DMA_REPEAT); } @@ -165,55 +194,69 @@ void sub_030001F0(void* arg0, u16 arg1, u32 arg2, u8 arg3) { WRITE_16(REG_SOUNDCNT_H, 0xB06); // DMA Sound A Enable Left/Right, Timer 0, Reset FIFO, 100% Vol, Sound 100% Vol - gUnk_03005FBC = arg2; - gUnk_03005A5C = arg3; - gUnk_03005A50 = arg0; - gUnk_03005A5D = 0; + gEmuAudio_Timer1Reload = arg2; + gEmuAudio_EnableOutput = arg3; + gEmuAudio_OutputBuffer0Ptr = arg0; + gEmuAudio_NumExtraOutputBuffers = 0; - sub_030001C4(arg0); - sub_03000188(arg1); + EmulatorAudio_SetNewSource(arg0); + EmulatorAudio_StartTimers(arg1); } void sub_0300023C(void* arg0, void* arg1, u16 arg2, s32 arg3, void* arg4) { WRITE_16(REG_SOUNDCNT_H, 0xB06); // DMA Sound A Enable Left/Right, Timer 0, Reset FIFO, 100% Vol, Sound 100% Vol - gUnk_03005FBC = arg3; - gUnk_03005A5C = 1; - gUnk_03005A50 = arg0; - gUnk_03005A54 = arg1; - gUnk_03005A5D = 1; - gUnk_03005A5E = 0; - gUnk_03005A64 = arg4; + gEmuAudio_Timer1Reload = arg3; + gEmuAudio_EnableOutput = TRUE; + gEmuAudio_OutputBuffer0Ptr = arg0; + gEmuAudio_OutputBuffer1Ptr = arg1; + gEmuAudio_NumExtraOutputBuffers = 1; + gEmuAudio_CurrentOutputBuffer = 0; + gEmuAudio_ProcessApuAndMixBuffersFunc = arg4; - sub_030001C4(arg0); - sub_03000188(arg2); + EmulatorAudio_SetNewSource(arg0); + EmulatorAudio_StartTimers(arg2); } -void sub_030002A4(void* arg0, void* arg1, void* arg2, u16 arg3, s32 arg4, void* arg5) +/** + * @brief 030002A4 | Set up the variables for audio output and update + * + * @param outputBuffer0 Pointer to output buffer 0 + * @param outputBuffer1 Pointer to output buffer 1 + * @param outputBuffer2 Pointer to output buffer 2 + * @param timer0Reload Timer 0 reload value + * @param timer1Reload Timer 1 reload value + * @param func Pointer to APU/Buffer update function + */ +void EmulatorAudio_SetupOutput(void* outputBuffer0, void* outputBuffer1, void* outputBuffer2, u16 timer0Reload, u32 timer1Reload, void* func) { WRITE_16(REG_SOUNDCNT_X, 0x80); // FIFO enable WRITE_16(REG_SOUNDCNT_L, 0); WRITE_16(REG_SOUNDCNT_H, 0xB00); // DMA Sound A Enable Left/Right, Timer 0, Reset FIFO, 50% Vol, Sound 25% Vol WRITE_16(REG_SOUNDCNT_H, 0xB04); // DMA Sound A Enable Left/Right, Timer 0, Reset FIFO, 100% Vol, Sound 25% Vol - gUnk_03005FBC = arg4; - gUnk_03005A5C = 1; - gUnk_03005A50 = arg0; - gUnk_03005A54 = arg1; - gUnk_03005A58 = arg2; - gUnk_03005A5D = 2; - gUnk_03005A5E = 0; - gUnk_03005A60 = arg3; - gUnk_03005A64 = arg5; - - sub_030001C4(arg0); - sub_03000188(arg3); + gEmuAudio_Timer1Reload = timer1Reload; + gEmuAudio_EnableOutput = TRUE; + gEmuAudio_OutputBuffer0Ptr = outputBuffer0; + gEmuAudio_OutputBuffer1Ptr = outputBuffer1; + gEmuAudio_OutputBuffer2Ptr = outputBuffer2; + gEmuAudio_NumExtraOutputBuffers = 2; + gEmuAudio_CurrentOutputBuffer = 0; + gEmuAudio_Timer0Reload = timer0Reload; + gEmuAudio_ProcessApuAndMixBuffersFunc = func; + + EmulatorAudio_SetNewSource(outputBuffer0); + EmulatorAudio_StartTimers(timer0Reload); } -void sub_03000330(void) +/** + * @brief 03000330 | Stop timer 0 and timer 1 + * + */ +void EmulatorAudio_CallDisableTimers(void) { - sub_030001B4(); + EmulatorAudio_DisableTimers(); } void sub_0300033C(u32 arg0) @@ -238,140 +281,194 @@ void sub_03000368(u32 arg0) gUnk_03005FC8 = arg0 + 0x2000; } -u8 sub_03000380(u16 arg0) +/** + * @brief 03000380 | Get the active channels + * + * @param apuRegister APU register to write to (NES address) + * @return u8 Active channels bitflags + */ +u8 EmulatorAudio_GetActiveChannels(EmulatorAudioApuRegisters apuRegister) { - u8 var_r3; - u8 var_r4; - u16 subroutine_arg0[5]; + u8 activeChannels; + u8 i; + u16 enabledChannels[5]; - var_r3 = 0; + activeChannels = 0; - if (arg0 == 0x4015) + if (apuRegister == (NES_APU_REG_BASE | NES_APU_REG_SND_CHN)) { - subroutine_arg0[0] = (u8)gUnk_03005FCC; - subroutine_arg0[1] = (u8)gUnk_03005FD8; - subroutine_arg0[2] = gUnk_03005FB0; - subroutine_arg0[3] = (u8)gUnk_03005FC0; + enabledChannels[0] = (u8)gEmuAudio_Pulse1_Enable; + enabledChannels[1] = (u8)gEmuAudio_Pulse2_Enable; + enabledChannels[2] = gEmuAudio_Triangle_Enable; + enabledChannels[3] = (u8)gEmuAudio_Noise_Enable; - for (var_r4 = 0; var_r4 < 4; var_r4++) + for (i = 0; i < 4; i++) { - if (gUnk_03005A68[var_r4] != 0) + if (gEmuAudio_ActiveChannels[i] != 0) { - var_r3 |= (gUnk_03005A68[var_r4] - 1) << var_r4; + activeChannels |= (gEmuAudio_ActiveChannels[i] - 1) << i; } else { - var_r3 |= subroutine_arg0[var_r4] << var_r4; + activeChannels |= enabledChannels[i] << i; } } - do { var_r3 |= (u8)subroutine_arg0[4] * 0x10; } while(0); // what? + do { activeChannels |= (u8)enabledChannels[4] << 4; } while(0); // what? } - return var_r3; + return activeChannels; } -void sub_03000404(u8 arg0) +/** + * @brief 03000404 | Stub for invalid/unhandled register writes + * + * @param value (Unused) Value + */ +void EmulatorAudio_Stub(u8 value) { return; } -void sub_03000408(u16 arg0, u8 arg1) +/** + * @brief 03000408 | Write to APU register + * + * @param apuRegister APU register to write to (NES address) + * @param value Value to write to APU register + */ +void EmulatorAudio_WriteToApu(EmulatorAudioApuRegisters apuRegister, u8 value) { - u32 var_r2; + u32 i; - if (sUnk_03002374 != 0) + if (sEmulatorAudio_Disabled) return; - arg0 -= 0x4000; - if (arg0 < 0x18) + apuRegister -= NES_APU_REG_BASE; + if (apuRegister < NES_APU_REG_COUNT) { - sUnk_03002378[arg0](arg1); - if ((arg0 & 3) == 3) + sEmulatorAudio_ApuWriteFuncs[apuRegister](value); + // If writing to a length counter register + // Write 2 to gEmuAudio_ActiveChannels + if ((apuRegister & 3) == 3) { - gUnk_03005A68[arg0 >> 2] = 2; + gEmuAudio_ActiveChannels[apuRegister >> 2] = 2; } } - if (arg0 == 0x15) + // SND_CHN register + if (apuRegister == NES_APU_REG_SND_CHN) { - for (var_r2 = 0; var_r2 < 4; var_r2++) + // If sound channel enabled + // Write 1 to gEmuAudio_ActiveChannels + for (i = 0; i < 4; i++) { - if (arg1 & 1) + if (value & 1) { - gUnk_03005A68[var_r2] = 1; + gEmuAudio_ActiveChannels[i] = 1; } - arg1 >>= 1; + value >>= 1; } } } -void sub_0300047C(u8* arg0, u8 arg1) +/** + * @brief 0300047C | Write byte + * + * @param dst Destination + * @param val Value to write + */ +void EmulatorAudio_Write8(u8* dst, u8 val) { - WRITE_8(arg0, arg1); + WRITE_8(dst, val); } -u8 sub_03000484(u8* arg0) +/** + * @brief 03000484 | (Unused) Read byte + * + * @param src Source + * @return u8 Value from source + */ +u8 EmulatorAudio_Read8(u8* src) { - return READ_8(arg0); + return READ_8(src); } -void sub_03000488(void) +/** + * @brief 03000488 | Initialize audio engine + * + */ +void EmulatorAudio_Initialize(void) { - sUnk_03002374 = 0; - sub_03000564(); + sEmulatorAudio_Disabled = FALSE; + EmulatorAudio_ClearChannels(); - sub_0300047C(REG_SOUNDCNT_X, 0xFF); // FIFO enable - sub_0300047C(REG_SOUNDCNT_L, 0x77); // Sound 1-4 Master Volume Left/Right Enable - sub_0300047C(REG_SOUNDCNT_L + 1, 0xFF); // Sound 1-4 Flags Left/Right Enable + EmulatorAudio_Write8(REG_SOUNDCNT_X, 0xFF); // FIFO enable + EmulatorAudio_Write8(REG_SOUNDCNT_L, 0x77); // Sound 1-4 Master Volume Left/Right Enable + EmulatorAudio_Write8(REG_SOUNDCNT_L + 1, 0xFF); // Sound 1-4 Flags Left/Right Enable WRITE_16(REG_SOUNDBIAS, (READ_16(REG_SOUNDBIAS) & 0x3FF) | 0x4000); // Set Resolution / Sampling to 8bit / 65.536kHz - sub_0300203C(); + EmulatorAudio_SetupEngine(); } -void sub_030004E0(void) +/** + * @brief 030004E0 | Timer 1 interrupt + * + */ +void EmulatorAudio_Timer1Callback(void) { - u32 var_r1; + u32 i; - sub_03000080(); + EmulatorAudio_UpdateApuAndOutput(); - for (var_r1 = 0; var_r1 < 5; var_r1++) + for (i = 0; i < 5; i++) { - gUnk_03005A68[var_r1] = 0; + gEmuAudio_ActiveChannels[i] = 0; } } -void sub_03000500(void) +/** + * @brief 03000500 | Disable audio upon reset + * + */ +void EmulatorAudio_Disable(void) { - sub_03000408(0x4015, 0); - sUnk_03002374 = 1; - sub_03000330(); + EmulatorAudio_WriteToApu(NES_APU_REG_BASE | NES_APU_REG_SND_CHN, 0); + sEmulatorAudio_Disabled = TRUE; + EmulatorAudio_CallDisableTimers(); WRITE_32(REG_DMA1_CNT, C_32_2_16(DMA_ENABLE | DMA_32BIT | DMA_DEST_FIXED, 1 * sizeof(u32))); WRITE_16(REG_DMA1_CNT_H, sUnk_030023D8); } -void sub_0300053C(void) +/** + * @brief 0300053C | Reset audio + * + */ +void EmulatorAudio_Reset(void) { WRITE_32(REG_FIFO_A, 0); WRITE_32(REG_FIFO_B, 0); - sub_0300203C(); - sub_03000564(); - sUnk_03002374 = 0; + EmulatorAudio_SetupEngine(); + EmulatorAudio_ClearChannels(); + sEmulatorAudio_Disabled = FALSE; } -void sub_03000564(void) +/** + * @brief 03000564 | Clear channel variables + * + */ +void EmulatorAudio_ClearChannels(void) { - u32 var_r1; + u32 i; - for (var_r1 = 0; var_r1 < 5; var_r1++) + for (i = 0; i < 5; i++) { - gUnk_03005A68[var_r1] = 0; + gEmuAudio_ActiveChannels[i] = 0; } - sub_030009DC(); - sub_03000F7C(); - sub_03001594(); - sub_03001990(); + EmulatorAudio_Pulse1_ClearVariables(); + EmulatorAudio_Pulse2_ClearVariables(); + EmulatorAudio_Triangle_ClearVariables(); + EmulatorAudio_Noise_ClearVariables(); } diff --git a/nes_metroid/emulator/src/part2/part2_2.c b/nes_metroid/emulator/src/part2/part2_2.c index 52c4798f8..7384f3af6 100644 --- a/nes_metroid/emulator/src/part2/part2_2.c +++ b/nes_metroid/emulator/src/part2/part2_2.c @@ -5,16 +5,21 @@ #include "structs/part2.h" -extern u8 sUnk_030023DC[]; +extern u8 sEmulatorAudio_LengthCounterTable[]; void sub_03000778(void) { gUnk_03005A90 = 0; } -void sub_03000784(u32 arg0) +/** + * @brief 03000784 | Set Pulse 1 length counter + * + * @param lengthCounter Length counter + */ +void EmulatorAudio_Pulse1_SetLengthCounter(u32 lengthCounter) { - gUnk_03005AA8 = arg0; + gEmuAudio_Pulse1_LengthCounter = lengthCounter; } void sub_03000790(void) @@ -24,8 +29,8 @@ void sub_03000790(void) gUnk_03005AA6 = 1; return; } - gUnk_03005AA6 = 0; + gUnk_03005AA6 = 0; if (gEmuAudio_Pulse1_Vol & 0x10) { gUnk_03005A94 = gEmuAudio_Pulse1_Vol & 0xF; @@ -36,40 +41,40 @@ void sub_03000790(void) } gUnk_03005AA2 = 0xF; - sub_03000784(sUnk_030023DC[gEmuAudio_Pulse1_Hi >> 3] * 4); + EmulatorAudio_Pulse1_SetLengthCounter(sEmulatorAudio_LengthCounterTable[gEmuAudio_Pulse1_Hi >> 3] * 4); if (gEmuAudio_SndChn & 1) { - gUnk_03005FCC = 1; + gEmuAudio_Pulse1_Enable = 1; gUnk_03005AA4 = 0; } } void sub_03000824(void) { - if ((gUnk_03005FCC != 0) && (gUnk_03005AA4 == 0)) + if ((gEmuAudio_Pulse1_Enable != 0) && (gUnk_03005AA4 == 0)) { gUnk_03005AA4 = 2; } } -void sub_03000848(u16 arg0) +void sub_03000848(u16 timer) { u32 tmp; tmp = 1; gUnk_03005AAC = 0; - gUnk_03005AA0 = arg0; - if (arg0 == 0) + gEmuAudio_Pulse1_Timer = timer; + if (timer == 0) { gUnk_03005A94 = 0; return; } - gUnk_03005FD0 = NES_CLOCK_SPEED / (arg0 + 1); - tmp = gUnk_03005FC4; // fake - if (gUnk_03005FD0 == gUnk_03005FC4) + gEmuAudio_Pulse1_Frequency = NES_CLOCK_SPEED / (timer + 1); + tmp = gEmuAudio_Pulse2_Frequency; // fake + if (gEmuAudio_Pulse1_Frequency == gEmuAudio_Pulse2_Frequency) { - gUnk_03005FC4 -= 1; + gEmuAudio_Pulse2_Frequency -= 1; } } @@ -79,41 +84,54 @@ void sub_0300089C(u8 arg0) gUnk_03005AA2 = 1; } -// SQ1_VOL -void sub_030008B4(u8 arg0) +/** + * @brief 030008B4 | Write to SQ1_VOL + * + * @param value Value to write + */ +void EmulatorAudio_Pulse1_WriteVolume(u8 value) { - u8 var_0; - u8 var_1; + u8 oldPulse1_ConstantVolumeFlag; + u8 newPulse1_ConstantVolumeFlag; - var_0 = gEmuAudio_Pulse1_Vol & 0x10; - var_1 = arg0 & 0x10; + oldPulse1_ConstantVolumeFlag = gEmuAudio_Pulse1_Vol & 0x10; + newPulse1_ConstantVolumeFlag = value & 0x10; - gEmuAudio_Pulse1_Vol = arg0; + gEmuAudio_Pulse1_Vol = value; gUnk_03005AAD = 0; - if ((arg0 & 0xC0) == 0xC0) + // If duty cycle is 3 (25% negated), set to 1 (25%) + if ((value & 0xC0) == 0xC0) { - gEmuAudio_Pulse1_Vol = arg0 & 0x7F; + gEmuAudio_Pulse1_Vol = value & 0x7F; } - if ((var_0 != 0) && (var_1 == 0) && (gUnk_03005FCC != 0)) + if ((oldPulse1_ConstantVolumeFlag != 0) && (newPulse1_ConstantVolumeFlag == 0) && (gEmuAudio_Pulse1_Enable != 0)) { gUnk_03005AAD = 4; gUnk_03005AA2 = 1; } } -// SQ1_SWEEP -void sub_03000918(u8 arg0) +/** + * @brief 03000918 | Write to SQ1_SWEEP + * + * @param value Value to write + */ +void EmulatorAudio_Pulse1_WriteSweep(u8 value) { - gEmuAudio_Pulse1_Sweep = arg0; + gEmuAudio_Pulse1_Sweep = value; gUnk_03005AAA = 1; } -// SQ1_LO -void sub_03000930(u8 arg0) +/** + * @brief 03000930 | Write to SQ1_LO + * + * @param value Value to write + */ +void EmulatorAudio_Pulse1_WriteLo(u8 value) { - gEmuAudio_Pulse1_Lo = arg0; + gEmuAudio_Pulse1_Lo = value; gUnk_03005AAC = 1; } @@ -121,6 +139,6 @@ void sub_03000948(void) { if (gUnk_03005AAC != 0) { - sub_03000848((gUnk_03005AA0 & 0xF00) | gEmuAudio_Pulse1_Lo); + sub_03000848((gEmuAudio_Pulse1_Timer & 0xF00) | gEmuAudio_Pulse1_Lo); } } diff --git a/nes_metroid/emulator/src/part2/part2_3.c b/nes_metroid/emulator/src/part2/part2_3.c index 776646cf0..928ff4ce0 100644 --- a/nes_metroid/emulator/src/part2/part2_3.c +++ b/nes_metroid/emulator/src/part2/part2_3.c @@ -5,36 +5,45 @@ #include "structs/part2.h" -extern u8 sUnk_030023DC[]; - -// SQ1_HI -void sub_030009A0(u8 arg0) +extern u8 sEmulatorAudio_LengthCounterTable[]; + +/** + * @brief 030009A0 | Write to SQ1_HI + * + * @param value Value to write + */ +void EmulatorAudio_Pulse1_WriteHi(u8 value) { - gEmuAudio_Pulse1_Hi = arg0; - sub_03000848(((arg0 & 7) << 8) | gEmuAudio_Pulse1_Lo); - if (gUnk_03005FCC == 0) + gEmuAudio_Pulse1_Hi = value; + + sub_03000848(((value & 7) << 8) | gEmuAudio_Pulse1_Lo); + if (gEmuAudio_Pulse1_Enable == 0) { sub_03000778(); } sub_03000790(); } -void sub_030009DC(void) +/** + * @brief 030009DC | Clear Pulse 1 variables + * + */ +void EmulatorAudio_Pulse1_ClearVariables(void) { gUnk_03005A90 = 0; - gUnk_03005FD0 = 0; + gEmuAudio_Pulse1_Frequency = 0; gUnk_03005A94 = 0; gUnk_03005A96 = 0; gEmuAudio_Pulse1_Vol = 0; gEmuAudio_Pulse1_Sweep = 0; gEmuAudio_Pulse1_Lo = 0; gEmuAudio_Pulse1_Hi = 0; - gUnk_03005AA0 = 0; + gEmuAudio_Pulse1_Timer = 0; gUnk_03005AA2 = 0; - gUnk_03005FCC = 0; + gEmuAudio_Pulse1_Enable = 0; gUnk_03005AA4 = 0; gUnk_03005AA6 = 0; - gUnk_03005AA8 = 0; + gEmuAudio_Pulse1_LengthCounter = 0; gUnk_03005AAA = 0; gUnk_03005AAC = 0; gUnk_03005AAD = 0; @@ -47,9 +56,14 @@ void sub_03000D20(void) gUnk_03005AB0 = 0; } -void sub_03000D2C(u32 arg0) +/** + * @brief 03000D2C | Set Pulse 2 length counter + * + * @param lengthCounter Length counter + */ +void EmulatorAudio_Pulse2_SetLengthCounter(u32 lengthCounter) { - gUnk_03005AC8 = arg0; + gEmuAudio_Pulse2_LengthCounter = lengthCounter; } void sub_03000D38(void) @@ -71,7 +85,7 @@ void sub_03000D38(void) } gUnk_03005AC2 = 0xF; - if (gUnk_03005FD8 != 0) + if (gEmuAudio_Pulse2_Enable != 0) { gUnk_03005ACA = 1; } @@ -80,17 +94,17 @@ void sub_03000D38(void) gUnk_03005ACA = 4; } - sub_03000D2C(sUnk_030023DC[gEmuAudio_Pulse2_Hi >> 3] * 4); + EmulatorAudio_Pulse2_SetLengthCounter(sEmulatorAudio_LengthCounterTable[gEmuAudio_Pulse2_Hi >> 3] * 4); if (gEmuAudio_SndChn & 2) { - gUnk_03005FD8 = 1; + gEmuAudio_Pulse2_Enable = 1; gUnk_03005AC4 = 0; } } void sub_03000DEC(void) { - if ((gUnk_03005FD8 != 0) && (gUnk_03005AC4 == 0)) + if ((gEmuAudio_Pulse2_Enable != 0) && (gUnk_03005AC4 == 0)) { gUnk_03005AC4 = 2; } @@ -100,28 +114,28 @@ void sub_03000E10(void) { if (gUnk_03005ACC != 0) { - sub_03000E40((gUnk_03005AC0 & 0xF00) | gEmuAudio_Pulse2_Lo); + sub_03000E40((gEmuAudio_Pulse2_Timer & 0xF00) | gEmuAudio_Pulse2_Lo); } } -void sub_03000E40(u16 arg0) +void sub_03000E40(u16 timer) { u32 tmp; gUnk_03005ACC = 0; - gUnk_03005AC0 = arg0; - if (arg0 == 0) + gEmuAudio_Pulse2_Timer = timer; + if (timer == 0) { gUnk_03005AB4 = 0; return; } - gUnk_03005FC4 = NES_CLOCK_SPEED / (arg0 + 1); - tmp = gUnk_03005FD0; // fake - if (tmp == gUnk_03005FC4) + gEmuAudio_Pulse2_Frequency = NES_CLOCK_SPEED / (timer + 1); + tmp = gEmuAudio_Pulse1_Frequency; // fake + if (tmp == gEmuAudio_Pulse2_Frequency) { tmp = 1; - gUnk_03005FC4 -= 1; + gEmuAudio_Pulse2_Frequency -= 1; } } @@ -131,72 +145,94 @@ void sub_03000E94(u8 arg0) gUnk_03005AC2 = 1; } -// SQ2_VOL -void sub_03000EAC(u8 arg0) +/** + * @brief 03000EAC | Write to SQ2_VOL + * + * @param value Value to write + */ +void EmulatorAudio_Pulse2_WriteVolume(u8 value) { - u8 var_0; - u8 var_1; + u8 oldPulse2_ConstantVolumeFlag; + u8 newPulse2_ConstantVolumeFlag; - var_0 = gEmuAudio_Pulse2_Vol & 0x10; - var_1 = arg0 & 0x10; + oldPulse2_ConstantVolumeFlag = gEmuAudio_Pulse2_Vol & 0x10; + newPulse2_ConstantVolumeFlag = value & 0x10; - gEmuAudio_Pulse2_Vol = arg0; + gEmuAudio_Pulse2_Vol = value; gUnk_03005ACD = 0; - if ((arg0 & 0xC0) == 0xC0) + // If duty cycle is 3 (25% negated), set to 1 (25%) + if ((value & 0xC0) == 0xC0) { - gEmuAudio_Pulse2_Vol = arg0 & 0x7F; + gEmuAudio_Pulse2_Vol = value & 0x7F; } - if ((var_0 != 0) && (var_1 == 0) && (gUnk_03005FD8 != 0)) + if ((oldPulse2_ConstantVolumeFlag != 0) && (newPulse2_ConstantVolumeFlag == 0) && (gEmuAudio_Pulse2_Enable != 0)) { gUnk_03005ACD = 4; gUnk_03005AC2 = 1; } } -// SQ2_SWEEP -void sub_03000F10(u8 arg0) +/** + * @brief 03000F10 | Write to SQ2_SWEEP + * + * @param value Value to write + */ +void EmulatorAudio_Pulse2_WriteSweep(u8 value) { - gEmuAudio_Pulse2_Sweep = arg0; + gEmuAudio_Pulse2_Sweep = value; gUnk_03005ACA = 1; } -// SQ2_LO -void sub_03000F28(u8 arg0) +/** + * @brief 03000F10 | Write to SQ2_LO + * + * @param value Value to write + */ +void EmulatorAudio_Pulse2_WriteLo(u8 value) { - gEmuAudio_Pulse2_Lo = arg0; + gEmuAudio_Pulse2_Lo = value; gUnk_03005ACC = 1; } -// SQ2_HI -void sub_03000F40(u8 arg0) +/** + * @brief 03000F40 | Write to SQ2_HI + * + * @param value Value to write + */ +void EmulatorAudio_Pulse2_WriteHi(u8 value) { - gEmuAudio_Pulse2_Hi = arg0; - sub_03000E40(((arg0 & 7) << 8) | gEmuAudio_Pulse2_Lo); - if (gUnk_03005FD8 == 0) + gEmuAudio_Pulse2_Hi = value; + + sub_03000E40(((value & 7) << 8) | gEmuAudio_Pulse2_Lo); + if (gEmuAudio_Pulse2_Enable == 0) { sub_03000D20(); } sub_03000D38(); } -void sub_03000F7C(void) +/** + * @brief 03000F7C | Clear Pulse 2 variables + * + */ +void EmulatorAudio_Pulse2_ClearVariables(void) { gUnk_03005AB0 = 0; - gUnk_03005FC4 = 0; + gEmuAudio_Pulse2_Frequency = 0; gUnk_03005AB4 = 0; gUnk_03005AB6 = 0; gEmuAudio_Pulse2_Vol = 0; gEmuAudio_Pulse2_Sweep = 0; gEmuAudio_Pulse2_Lo = 0; gEmuAudio_Pulse2_Hi = 0; - gUnk_03005AC0 = 0; + gEmuAudio_Pulse2_Timer = 0; gUnk_03005AC2 = 0; - gUnk_03005FD8 = 0; + gEmuAudio_Pulse2_Enable = 0; gUnk_03005AC4 = 0; gUnk_03005AC6 = 0; - gUnk_03005AC8 = 0; + gEmuAudio_Pulse2_LengthCounter = 0; gUnk_03005ACA = 0; gUnk_03005ACC = 0; gUnk_03005ACD = 0; diff --git a/nes_metroid/emulator/src/part2/part2_4.c b/nes_metroid/emulator/src/part2/part2_4.c index 94ff27a6a..7e05df89b 100644 --- a/nes_metroid/emulator/src/part2/part2_4.c +++ b/nes_metroid/emulator/src/part2/part2_4.c @@ -5,31 +5,36 @@ #include "structs/part2.h" -extern u8 sUnk_030023DC[]; +extern u8 sEmulatorAudio_LengthCounterTable[]; extern u8 sUnk_03002845; void sub_03001318(void) { - if (gUnk_03005FB0 == 0) + if (gEmuAudio_Triangle_Enable == 0) { gUnk_03005AD0 = 0; } } -void sub_03001334(u32 arg0) +/** + * @brief 03001334 | Set Triangle length counter + * + * @param lengthCounter Length counter + */ +void EmulatorAudio_Triangle_SetLengthCounter(u32 lengthCounter) { - gUnk_03005AD4 = arg0; + gEmuAudio_Triangle_LengthCounter = lengthCounter; } void sub_03001340(void) { - sub_03001334(sUnk_030023DC[gEmuAudio_Triangle_Hi >> 3] * 4); + EmulatorAudio_Triangle_SetLengthCounter(sEmulatorAudio_LengthCounterTable[gEmuAudio_Triangle_Hi >> 3] * 4); if ((gEmuAudio_Triangle_Linear & 0x7F) && (gEmuAudio_SndChn & 4)) { - if (gUnk_03005FB0 == 0) { + if (gEmuAudio_Triangle_Enable == 0) { sub_03001318(); } - gUnk_03005FB0 = 1; + gEmuAudio_Triangle_Enable = 1; gUnk_03005AD8 = 0; } gUnk_03005AD6 = (gEmuAudio_Triangle_Linear & 0x7F) + 1; @@ -38,7 +43,7 @@ void sub_03001340(void) void sub_030013C8(void) { - if ((gUnk_03005FB0 != 0) && (gUnk_03005AD8 == 0)) + if ((gEmuAudio_Triangle_Enable != 0) && (gUnk_03005AD8 == 0)) { gUnk_03005AD8 = gUnk_03005ADA; } @@ -72,17 +77,21 @@ void sub_030013F0(u16 arg0) } } -// TRI_LINEAR -void sub_03001458(u8 arg0) +/** + * @brief 03001458 | Write to TRI_LINEAR + * + * @param value Value to write + */ +void EmulatorAudio_Triangle_WriteLinear(u8 value) { u32 tmp; u32 tmp2; tmp2 = gUnk_03005AD6; - gEmuAudio_Triangle_Linear = arg0; + gEmuAudio_Triangle_Linear = value; - tmp = arg0 & 0x7F; - if ((arg0 & 0x7F) == 0) + tmp = value & 0x7F; + if ((value & 0x7F) == 0) { tmp = tmp2 & 0x80; if (((tmp2 & 0x80) == 0) && (gUnk_03005AE4 != 0)) @@ -96,17 +105,21 @@ void sub_03001458(u8 arg0) gUnk_03005AE4 = 0; } } - else if ((gUnk_03005FB0 == 0) || (gUnk_03005AE4 != 0)) + else if ((gEmuAudio_Triangle_Enable == 0) || (gUnk_03005AE4 != 0)) { - gUnk_03005AD6 = (arg0 & 0x7F) + 1; + gUnk_03005AD6 = (value & 0x7F) + 1; gUnk_03005AE4 = 0; } } -// TRI_LO -void sub_030014C8(u8 arg0) +/** + * @brief 030014C8 | Write to TRI_LO + * + * @param value Value to write + */ +void EmulatorAudio_Triangle_WriteLo(u8 value) { - gEmuAudio_Triangle_Lo = arg0; + gEmuAudio_Triangle_Lo = value; sUnk_03002845 = 1; } @@ -122,31 +135,39 @@ void sub_030014E0(void) } } -// TRI_HI -void sub_03001518(u8 arg0) +/** + * @brief 03001518 | Write to TRI_HI + * + * @param value Value to write + */ +void EmulatorAudio_Triangle_WriteHi(u8 value) { - gEmuAudio_Triangle_Hi = arg0; + gEmuAudio_Triangle_Hi = value; gUnk_03005AE4 = 1; - sub_030013F0(((arg0 & 7) << 8) | gEmuAudio_Triangle_Lo); - if (gUnk_03005FB0 == 0) + sub_030013F0(((value & 7) << 8) | gEmuAudio_Triangle_Lo); + if (gEmuAudio_Triangle_Enable == 0) { sub_03001340(); return; } - sub_03001334(sUnk_030023DC[gEmuAudio_Triangle_Hi >> 3] * 4); + EmulatorAudio_Triangle_SetLengthCounter(sEmulatorAudio_LengthCounterTable[gEmuAudio_Triangle_Hi >> 3] * 4); gUnk_03005AD6 = (gEmuAudio_Triangle_Linear & 0x7F) + 1; gUnk_03005AD8 = 0; } -void sub_03001594(void) +/** + * @brief 03001594 | Clear Triangle variables + * + */ +void EmulatorAudio_Triangle_ClearVariables(void) { gUnk_03005AD0 = 0; gUnk_03005FDC = 0; - gUnk_03005AD4 = 0; + gEmuAudio_Triangle_LengthCounter = 0; gUnk_03005AD6 = 0; - gUnk_03005FB0 = 0; + gEmuAudio_Triangle_Enable = 0; gUnk_03005AD8 = 0; gUnk_03005ADA = 0; gUnk_03005ADC = 0; diff --git a/nes_metroid/emulator/src/part2/part2_5.c b/nes_metroid/emulator/src/part2/part2_5.c index bf2f1bdda..5e12739c1 100644 --- a/nes_metroid/emulator/src/part2/part2_5.c +++ b/nes_metroid/emulator/src/part2/part2_5.c @@ -5,10 +5,10 @@ #include "structs/part2.h" -extern u8 sUnk_030023DC[]; +extern u8 sEmulatorAudio_LengthCounterTable[]; extern u16 sUnk_03002846; extern u32 sUnk_03002988; -extern u32 sUnk_0600E008[]; +extern u32 sEmulatorAudio_NoiseSampleRateTable[]; void sub_03001730(void) { @@ -26,7 +26,7 @@ void sub_0300173C(void) for (var_r3 = 3; var_r3 < 0x10; var_r3++) { - gUnk_03005B10[var_r3] = sUnk_0600E008[var_r3]; + gUnk_03005B10[var_r3] = sEmulatorAudio_NoiseSampleRateTable[var_r3]; if (gUnk_03005B10[var_r3] > 0xFFFF) { gUnk_03005B10[var_r3] = 0x10000; @@ -34,9 +34,14 @@ void sub_0300173C(void) } } -void sub_03001788(u32 arg0) +/** + * @brief 03001788 | Set Noise length counter + * + * @param lengthCounter Length counter + */ +void EmulatorAudio_Noise_SetLengthCounter(u32 lengthCounter) { - gUnk_03005AFA = arg0; + gEmuAudio_Noise_LengthCounter = lengthCounter; } void sub_03001794(void) @@ -46,7 +51,7 @@ void sub_03001794(void) if (gEmuAudio_SndChn & 8) { - gUnk_03005FC0 = 1; + gEmuAudio_Noise_Enable = 1; } if (gEmuAudio_Noise_Vol & 0x10) @@ -59,7 +64,7 @@ void sub_03001794(void) } gUnk_03005AF8 = gEmuAudio_Noise_Vol & 0xF; - var_r4 = sUnk_030023DC[gEmuAudio_Noise_Hi >> 3]; + var_r4 = sEmulatorAudio_LengthCounterTable[gEmuAudio_Noise_Hi >> 3]; if ((sUnk_03002988 == 0x7F) && (var_r4 == 1)) { var_r4 = 2; @@ -73,14 +78,14 @@ void sub_03001794(void) { var_r5 = 0; } - sub_03001788((sUnk_030023DC[gEmuAudio_Noise_Hi >> 3] * 4) + var_r5); + EmulatorAudio_Noise_SetLengthCounter((sEmulatorAudio_LengthCounterTable[gEmuAudio_Noise_Hi >> 3] * 4) + var_r5); sUnk_03002988 = var_r4; - sub_03001788((var_r4 * 4) + var_r5); + EmulatorAudio_Noise_SetLengthCounter((var_r4 * 4) + var_r5); } void sub_03001840(void) { - if ((gUnk_03005FC0 != 0) && (gUnk_03005AFE == 0)) + if ((gEmuAudio_Noise_Enable != 0) && (gUnk_03005AFE == 0)) { gUnk_03005AFE = 2; } @@ -92,37 +97,45 @@ void sub_03001864(u8 arg0) gUnk_03005AF8 = 1; } -// NOISE_VOL -void sub_0300187C(u8 arg0) +/** + * @brief 0300187C | Write to NOISE_VOL + * + * @param value Value to write + */ +void EmulatorAudio_Noise_WriteVolume(u8 value) { - u8 var_0; - u8 var_1; + u8 oldNoise_ConstantVolumeFlag; + u8 newNoise_ConstantVolumeFlag; - var_0 = gEmuAudio_Noise_Vol & 0x10; - var_1 = arg0 & 0x10; + oldNoise_ConstantVolumeFlag = gEmuAudio_Noise_Vol & 0x10; + newNoise_ConstantVolumeFlag = value & 0x10; - gEmuAudio_Noise_Vol = arg0; + gEmuAudio_Noise_Vol = value; gUnk_03005B08 = 0; - if (var_1 == 1) + if (newNoise_ConstantVolumeFlag == 1) { - gUnk_03005AF4 = arg0 & 0xF; + gUnk_03005AF4 = value & 0xF; } - else if ((var_0 != 0) && (gUnk_03005FC0 != 0)) + else if ((oldNoise_ConstantVolumeFlag != 0) && (gEmuAudio_Noise_Enable != 0)) { gUnk_03005B08 = 4; - gUnk_03005AF8 = arg0 & 0xF; + gUnk_03005AF8 = value & 0xF; } } -// NOISE_LO -void sub_030018E0(u8 arg0) +/** + * @brief 030018E0 | Write to NOISE_LO + * + * @param value Value to write + */ +void EmulatorAudio_Noise_WriteLo(u8 value) { - gEmuAudio_Noise_Lo = arg0; - gUnk_03005AF6 = arg0 & 0xF; + gEmuAudio_Noise_Lo = value; + gUnk_03005AF6 = value & 0xF; gUnk_03005AF0 = gUnk_03005B10[gUnk_03005AF6]; - if (arg0 & 0x80) + if (value & 0x80) { sUnk_03002846 = 0x40; gUnk_03005AE8 = 1; @@ -133,8 +146,12 @@ void sub_030018E0(u8 arg0) } } -// NOISE_HI -void sub_03001944(u8 arg0) +/** + * @brief 03001944 | Write to NOISE_HI + * + * @param value Value to write + */ +void EmulatorAudio_Noise_WriteHi(u8 value) { if (gEmuAudio_Noise_Lo & 0x80) { @@ -146,11 +163,15 @@ void sub_03001944(u8 arg0) sUnk_03002846 = 0x4000; } - gEmuAudio_Noise_Hi = arg0; + gEmuAudio_Noise_Hi = value; sub_03001794(); } -void sub_03001990(void) +/** + * @brief 03001990 | Clear Noise variables + * + */ +void EmulatorAudio_Noise_ClearVariables(void) { gUnk_03005AE8 = 1; gUnk_03005AEC = 0; @@ -158,10 +179,10 @@ void sub_03001990(void) gUnk_03005AF4 = 0; gUnk_03005AF6 = 0; gUnk_03005AF8 = 0; - gUnk_03005AFA = 0; + gEmuAudio_Noise_LengthCounter = 0; gUnk_03005AFC = 0; sUnk_03002846 = 0x8000; - gUnk_03005FC0 = 0; + gEmuAudio_Noise_Enable = 0; gUnk_03005AFE = 0; gEmuAudio_Noise_Vol = 0; gUnk_03005B02 = 0; @@ -172,41 +193,49 @@ void sub_03001990(void) // File split? -// SND_CHN -void sub_03001C10(u8 arg0) +/** + * @brief 03001C10 | Write to SND_CHN + * + * @param value Value to write + */ +void EmulatorAudio_SoundChannel_Write(u8 value) { - gEmuAudio_SndChn = arg0; + gEmuAudio_SndChn = value; - if (!(arg0 & 1)) + if (!(value & 1)) { sub_03000824(); } - if (!(arg0 & 2)) + if (!(value & 2)) { sub_03000DEC(); } - if (!(arg0 & 4)) + if (!(value & 4)) { sub_030013C8(); } - if (!(arg0 & 8)) + if (!(value & 8)) { sub_03001840(); } } -// JOY2 (frame counter) -void sub_03001C58(u8 arg0) +/** + * @brief 03001C58 | Write to FRAME_CTR + * + * @param value Value to write + */ +void EmulatorAudio_FrameCounter_Write(u8 value) { - gEmuAudio_FrameCtr = arg0; + gEmuAudio_FrameCtr = value; - if (arg0 & 0x80) + if (value & 0x80) { - sub_03000000(0xA0); + EmulatorAudio_SetTimer1Reload(0xA0); } else { - sub_03000000(0x80); + EmulatorAudio_SetTimer1Reload(0x80); } if (gUnk_03005AA2 > 1) @@ -234,21 +263,21 @@ void sub_03001C58(u8 arg0) gUnk_03005ACA -= 1; } - if (gUnk_03005AA8 != 0) + if (gEmuAudio_Pulse1_LengthCounter != 0) { - gUnk_03005AA8 -= 1; + gEmuAudio_Pulse1_LengthCounter -= 1; } - if (gUnk_03005AC8 != 0) + if (gEmuAudio_Pulse2_LengthCounter != 0) { - gUnk_03005AC8 -= 1; + gEmuAudio_Pulse2_LengthCounter -= 1; } - if (gUnk_03005AD4 != 0) + if (gEmuAudio_Triangle_LengthCounter != 0) { - gUnk_03005AD4 -= 1; + gEmuAudio_Triangle_LengthCounter -= 1; } - if (gUnk_03005AFA != 0) + if (gEmuAudio_Noise_LengthCounter != 0) { - gUnk_03005AFA -= 1; + gEmuAudio_Noise_LengthCounter -= 1; } } @@ -257,32 +286,38 @@ void sub_03001D24(u32 arg0) gUnk_03005FB8 = arg0; } -void sub_03001D30(void* arg0, u32 arg1) +/** + * @brief 03001D30 | Handle processing APU and mixing APU and output buffers + * + * @param outputBuffer Pointer to output buffer + * @param timer1Reload Value from timer 1 reload + */ +void EmulatorAudio_ProcessApuAndMixBuffers(void* outputBuffer, u32 timer1Reload) { u32 var_r5; - void* var_0; - void* var_1; - void* var_2; - void* var_3; + void* pulse1_Buffer; + void* pulse2_Buffer; + void* triangle_Buffer; + void* noise_Buffer; - var_0 = gUnk_03005B50; - var_1 = gUnk_03005BF0; - var_2 = gUnk_03005C90; - var_3 = gUnk_03005D30; + pulse1_Buffer = gEmuAudio_Pulse1_Buffer; + pulse2_Buffer = gEmuAudio_Pulse2_Buffer; + triangle_Buffer = gEmuAudio_Triangle_Buffer; + noise_Buffer = gEmuAudio_Noise_Buffer; var_r5 = 0; if (gUnk_03005FB8 != 0) { - sub_03000634(0xF0000000, arg1); - sub_03000704(arg0, arg1); + sub_03000634(0xF0000000, timer1Reload); + sub_03000704(outputBuffer, timer1Reload); return; } - if (gUnk_03005FCC != 0) + if (gEmuAudio_Pulse1_Enable != 0) { sub_03000948(); - sub_03000A6C(var_0, arg1); + sub_03000A6C(pulse1_Buffer, timer1Reload); if (gUnk_03005AAD != 0) { gUnk_03005A94 = 0xF; @@ -290,13 +325,13 @@ void sub_03001D30(void* arg0, u32 arg1) } if (gEmuAudio_Pulse1_Sweep & 0x80) { - sub_03000848(gUnk_03005AA0); + sub_03000848(gEmuAudio_Pulse1_Timer); } - if (gUnk_03005AA8 != 0) + if (gEmuAudio_Pulse1_LengthCounter != 0) { - gUnk_03005AA8 -= 1; + gEmuAudio_Pulse1_LengthCounter -= 1; } - if (!(gEmuAudio_Pulse1_Vol & 0x20) && (gUnk_03005AA8 == 0)) + if (!(gEmuAudio_Pulse1_Vol & 0x20) && (gEmuAudio_Pulse1_LengthCounter == 0)) { sub_03000824(); } @@ -308,7 +343,7 @@ void sub_03001D30(void* arg0, u32 arg1) if (gUnk_03005AA4 == 0) { var_r5 |= 0x80000000; - gUnk_03005FCC = 0; + gEmuAudio_Pulse1_Enable = 0; if (gUnk_03005AA6 != 0) { sub_03000790(); @@ -316,10 +351,10 @@ void sub_03001D30(void* arg0, u32 arg1) } } - if (gUnk_03005FD8 != 0) + if (gEmuAudio_Pulse2_Enable != 0) { sub_03000E10(); - sub_0300100C(var_1, arg1); + sub_0300100C(pulse2_Buffer, timer1Reload); if (gUnk_03005ACD != 0) { gUnk_03005AB4 = 0xF; @@ -327,13 +362,13 @@ void sub_03001D30(void* arg0, u32 arg1) } if (gEmuAudio_Pulse2_Sweep & 0x80) { - sub_03000E40(gUnk_03005AC0); + sub_03000E40(gEmuAudio_Pulse2_Timer); } - if (gUnk_03005AC8 != 0) + if (gEmuAudio_Pulse2_LengthCounter != 0) { - gUnk_03005AC8 -= 1; + gEmuAudio_Pulse2_LengthCounter -= 1; } - if (!(gEmuAudio_Pulse2_Vol & 0x20) && (gUnk_03005AC8 == 0)) + if (!(gEmuAudio_Pulse2_Vol & 0x20) && (gEmuAudio_Pulse2_LengthCounter == 0)) { sub_03000DEC(); } @@ -345,7 +380,7 @@ void sub_03001D30(void* arg0, u32 arg1) if (gUnk_03005AC4 == 0) { var_r5 |= 0x40000000; - gUnk_03005FD8 = 0; + gEmuAudio_Pulse2_Enable = 0; if (gUnk_03005AC6 != 0) { sub_03000D38(); @@ -353,7 +388,7 @@ void sub_03001D30(void* arg0, u32 arg1) } } - if (gUnk_03005FB0 != 0) + if (gEmuAudio_Triangle_Enable != 0) { sub_030014E0(); if ((gUnk_03005FD4 == 0) && (gUnk_03005ADA == 0)) @@ -362,11 +397,11 @@ void sub_03001D30(void* arg0, u32 arg1) } else { - sub_0300160C(var_2, arg1); + sub_0300160C(triangle_Buffer, timer1Reload); } - if (gUnk_03005AD4 != 0) + if (gEmuAudio_Triangle_LengthCounter != 0) { - gUnk_03005AD4 -= 1; + gEmuAudio_Triangle_LengthCounter -= 1; } if (gUnk_03005AD8 == 0) { @@ -379,7 +414,7 @@ void sub_03001D30(void* arg0, u32 arg1) gUnk_03005ADA -= 1; } } - if (!(gEmuAudio_Triangle_Linear & 0x80) && (gUnk_03005AD4 == 0)) + if (!(gEmuAudio_Triangle_Linear & 0x80) && (gEmuAudio_Triangle_LengthCounter == 0)) { sub_030013C8(); } @@ -387,28 +422,28 @@ void sub_03001D30(void* arg0, u32 arg1) if (gUnk_03005AD8 != 0) { - gUnk_03005AD8 >>= 0x1; + gUnk_03005AD8 >>= 1; gUnk_03005ADA = gUnk_03005AD8; if (gUnk_03005ADA == 0) { var_r5 |= 0x20000000; - gUnk_03005FB0 = 0; + gEmuAudio_Triangle_Enable = 0; } } - if (gUnk_03005FC0 != 0) + if (gEmuAudio_Noise_Enable != 0) { - sub_03001A24(var_3, arg1); + sub_03001A24(noise_Buffer, timer1Reload); if (gUnk_03005B08 != 0) { gUnk_03005AF4 = 0xF; gUnk_03005B08 = 0; } - if (gUnk_03005AFA != 0) + if (gEmuAudio_Noise_LengthCounter != 0) { - gUnk_03005AFA -= 1; + gEmuAudio_Noise_LengthCounter -= 1; } - if (!(gEmuAudio_Noise_Vol & 0x20) && (gUnk_03005AFA == 0)) + if (!(gEmuAudio_Noise_Vol & 0x20) && (gEmuAudio_Noise_LengthCounter == 0)) { sub_03001840(); } @@ -420,45 +455,49 @@ void sub_03001D30(void* arg0, u32 arg1) if (gUnk_03005AFE == 0) { var_r5 |= 0x10000000; - gUnk_03005FC0 = 0; + gEmuAudio_Noise_Enable = 0; } else { - sub_0300059C(var_3, arg1, arg1 >> 4); + sub_0300059C(noise_Buffer, timer1Reload, timer1Reload >> 4); } } - sub_03000634(var_r5, arg1); - sub_03000704(arg0, arg1); - sub_030006CC(arg0, arg1); + sub_03000634(var_r5, timer1Reload); + sub_03000704(outputBuffer, timer1Reload); + sub_030006CC(outputBuffer, timer1Reload); } -void sub_0300203C(void) +/** + * @brief 0300203C | Initialize engine buffers and variables + * + */ +void EmulatorAudio_SetupEngine(void) { - u32 var_r3; - u32* var_0; + u32 i; + u32* pulse1_Buffer; - var_0 = gUnk_03005B50; // fake + pulse1_Buffer = gEmuAudio_Pulse1_Buffer; // fake sub_0300173C(); - for (var_r3 = 0; var_r3 < 0x28; var_r3++) + for (i = 0; i < EMULATOR_AUDIO_BUFFER_SIZE; i++) { - gUnk_03005B50[var_r3] = 0; - gUnk_03005BF0[var_r3] = 0; - gUnk_03005C90[var_r3] = 0; - gUnk_03005D30[var_r3] = 0; - gUnk_03005DD0[var_r3] = 0; - gUnk_03005E70[var_r3] = 0; - gUnk_03005F10[var_r3] = 0; + gEmuAudio_Pulse1_Buffer[i] = 0; + gEmuAudio_Pulse2_Buffer[i] = 0; + gEmuAudio_Triangle_Buffer[i] = 0; + gEmuAudio_Noise_Buffer[i] = 0; + gEmuAudio_OutputBuffer0[i] = 0; + gEmuAudio_OutputBuffer1[i] = 0; + gEmuAudio_OutputBuffer2[i] = 0; } - gUnk_03005A80 = gUnk_03005B50; - gUnk_03005A84 = gUnk_03005BF0; - gUnk_03005A88 = gUnk_03005C90; - gUnk_03005A8C = gUnk_03005D30; + gEmuAudio_Pulse1_BufferPtr = gEmuAudio_Pulse1_Buffer; + gEmuAudio_Pulse2_BufferPtr = gEmuAudio_Pulse2_Buffer; + gEmuAudio_Triangle_BufferPtr = gEmuAudio_Triangle_Buffer; + gEmuAudio_Noise_BufferPtr = gEmuAudio_Noise_Buffer; gUnk_03005A90 = 0; - gUnk_03005FD0 = 0; + gEmuAudio_Pulse1_Frequency = 0; gUnk_03005AD0 = 0; gUnk_03005FDC = 0; gUnk_03005AE8 = 0x4400; @@ -469,18 +508,20 @@ void sub_0300203C(void) sub_03000DEC(); sub_030013C8(); sub_03001840(); + sub_03000634(0xF0000000, 0xA0); - sub_03000618(var_0, 0xA0); + sub_03000618(pulse1_Buffer, 0xA0); - sub_03000704(gUnk_03005DD0, 0xA0); - sub_03000704(gUnk_03005E70, 0xA0); - sub_03000704(gUnk_03005F10, 0xA0); + sub_03000704(gEmuAudio_OutputBuffer0, sizeof(gEmuAudio_OutputBuffer0)); + sub_03000704(gEmuAudio_OutputBuffer1, sizeof(gEmuAudio_OutputBuffer1)); + sub_03000704(gEmuAudio_OutputBuffer2, sizeof(gEmuAudio_OutputBuffer2)); - sub_03000618(gUnk_03005DD0, 0xA0); - sub_03000618(gUnk_03005E70, 0xA0); - sub_03000618(gUnk_03005F10, 0xA0); + sub_03000618(gEmuAudio_OutputBuffer0, sizeof(gEmuAudio_OutputBuffer0)); + sub_03000618(gEmuAudio_OutputBuffer1, sizeof(gEmuAudio_OutputBuffer1)); + sub_03000618(gEmuAudio_OutputBuffer2, sizeof(gEmuAudio_OutputBuffer2)); gEmuAudio_SndChn = 0; gEmuAudio_FrameCtr = 0; - sub_030002A4(gUnk_03005DD0, gUnk_03005E70, gUnk_03005F10, sub_03000050(0x8000), 0xA0, &sub_03001D30); + EmulatorAudio_SetupOutput(gEmuAudio_OutputBuffer0, gEmuAudio_OutputBuffer1, gEmuAudio_OutputBuffer2, + sub_03000050(0x8000), 0xA0, &EmulatorAudio_ProcessApuAndMixBuffers); }