diff options
-rwxr-xr-x | asm/m4a_3.s | 577 | ||||
-rwxr-xr-x | asm/rom.s | 2 | ||||
-rwxr-xr-x | ld_script.ld | 1 | ||||
-rwxr-xr-x | src/m4a_2.c | 1 |
4 files changed, 579 insertions, 2 deletions
diff --git a/asm/m4a_3.s b/asm/m4a_3.s new file mode 100755 index 0000000..c0ac04f --- /dev/null +++ b/asm/m4a_3.s @@ -0,0 +1,577 @@ + .include "asm/macros.inc" + .include "constants/gba_constants.inc" + .include "constants/m4a_constants.inc" + + .syntax unified + + @ extern + .set gCgb3Vol, 0x0852DAFC + + .text + + thumb_func_start CgbSound +CgbSound: @ 8054920 + push {r4-r7,lr} + mov r7, r10 + mov r6, r9 + mov r5, r8 + push {r5-r7} + sub sp, 0x1C + ldr r0, =SOUND_INFO_PTR + ldr r0, [r0] + str r0, [sp, 0x4] + ldrb r0, [r0, 0xA] + cmp r0, 0 + beq _08054944 + subs r0, 0x1 + ldr r1, [sp, 0x4] + strb r0, [r1, 0xA] + b _0805494A + .pool +_08054944: + movs r0, 0xE + ldr r2, [sp, 0x4] + strb r0, [r2, 0xA] +_0805494A: + movs r6, 0x1 + ldr r0, [sp, 0x4] + ldr r4, [r0, 0x1C] +_08054950: + ldrb r1, [r4] + movs r0, 0xC7 + ands r0, r1 + adds r2, r6, 0x1 + mov r10, r2 + movs r2, 0x40 + adds r2, r4 + mov r9, r2 + cmp r0, 0 + bne _08054966 + b _08054D50 +_08054966: + cmp r6, 0x2 + beq _08054988 + cmp r6, 0x2 + bgt _08054974 + cmp r6, 0x1 + beq _0805497A + b _080549D0 +_08054974: + cmp r6, 0x3 + beq _080549B0 + b _080549D0 +_0805497A: + ldr r0, =REG_NR10 + str r0, [sp, 0x8] + ldr r7, =REG_NR11 + ldr r2, =REG_NR12 + str r2, [sp, 0xC] + adds r0, 0x4 + str r0, [sp, 0x10] + adds r2, 0x2 + b _080549E0 + .pool +_08054988: + ldr r0, =REG_NR10 + 1 + str r0, [sp, 0x8] + ldr r7, =REG_NR21 + ldr r2, =REG_NR22 + b _080549D8 + .pool +_080549B0: + ldr r0, =REG_NR30 + str r0, [sp, 0x8] + ldr r7, =REG_NR31 + ldr r2, =REG_NR32 + str r2, [sp, 0xC] + adds r0, 0x4 + str r0, [sp, 0x10] + adds r2, 0x2 + b _080549E0 + .pool +_080549D0: + ldr r0, =REG_NR30 + 1 + str r0, [sp, 0x8] + ldr r7, =REG_NR41 + ldr r2, =REG_NR42 +_080549D8: + str r2, [sp, 0xC] + adds r0, 0xB + str r0, [sp, 0x10] + adds r2, 0x4 +_080549E0: + str r2, [sp, 0x14] + ldr r0, [sp, 0x4] + ldrb r0, [r0, 0xA] + str r0, [sp] + ldr r2, [sp, 0xC] + ldrb r0, [r2] + mov r8, r0 + adds r2, r1, 0 + movs r0, 0x80 + ands r0, r2 + cmp r0, 0 + beq _08054AD6 + movs r3, 0x40 + adds r0, r3, 0 + ands r0, r2 + lsls r0, 24 + lsrs r5, r0, 24 + adds r0, r6, 0x1 + mov r10, r0 + movs r1, 0x40 + adds r1, r4 + mov r9, r1 + cmp r5, 0 + bne _08054AFA + movs r0, 0x3 + strb r0, [r4] + strb r0, [r4, 0x1D] + adds r0, r4, 0 + str r3, [sp, 0x18] + bl CgbModVol + ldr r3, [sp, 0x18] + cmp r6, 0x2 + beq _08054A48 + cmp r6, 0x2 + bgt _08054A3C + cmp r6, 0x1 + beq _08054A42 + b _08054A9C + .pool +_08054A3C: + cmp r6, 0x3 + beq _08054A54 + b _08054A9C +_08054A42: + ldrb r0, [r4, 0x1F] + ldr r2, [sp, 0x8] + strb r0, [r2] +_08054A48: + ldr r0, [r4, 0x24] + lsls r0, 6 + ldrb r1, [r4, 0x1E] + adds r0, r1, r0 + strb r0, [r7] + b _08054AA8 +_08054A54: + ldr r1, [r4, 0x24] + ldr r0, [r4, 0x28] + cmp r1, r0 + beq _08054A7C + ldr r2, [sp, 0x8] + strb r3, [r2] + ldr r1, =REG_WAVE_RAM + ldr r2, [r4, 0x24] + ldr r0, [r2] + str r0, [r1] + adds r1, 0x4 + ldr r0, [r2, 0x4] + str r0, [r1] + adds r1, 0x4 + ldr r0, [r2, 0x8] + str r0, [r1] + adds r1, 0x4 + ldr r0, [r2, 0xC] + str r0, [r1] + str r2, [r4, 0x28] +_08054A7C: + ldr r0, [sp, 0x8] + strb r5, [r0] + ldrb r0, [r4, 0x1E] + strb r0, [r7] + ldrb r0, [r4, 0x1E] + cmp r0, 0 + beq _08054A94 + movs r0, 0xC0 + b _08054AB6 + .pool +_08054A94: + movs r1, 0x80 + negs r1, r1 + strb r1, [r4, 0x1A] + b _08054AB8 +_08054A9C: + ldrb r0, [r4, 0x1E] + strb r0, [r7] + ldr r0, [r4, 0x24] + lsls r0, 3 + ldr r2, [sp, 0x10] + strb r0, [r2] +_08054AA8: + ldrb r0, [r4, 0x4] + adds r0, 0x8 + mov r8, r0 + ldrb r0, [r4, 0x1E] + cmp r0, 0 + beq _08054AB6 + movs r0, 0x40 +_08054AB6: + strb r0, [r4, 0x1A] +_08054AB8: + ldrb r1, [r4, 0x4] + movs r2, 0 + strb r1, [r4, 0xB] + movs r0, 0xFF + ands r0, r1 + adds r1, r6, 0x1 + mov r10, r1 + movs r1, 0x40 + adds r1, r4 + mov r9, r1 + cmp r0, 0 + bne _08054AD2 + b _08054C0E +_08054AD2: + strb r2, [r4, 0x9] + b _08054C3C +_08054AD6: + movs r0, 0x4 + ands r0, r2 + cmp r0, 0 + beq _08054B08 + ldrb r0, [r4, 0xD] + subs r0, 0x1 + strb r0, [r4, 0xD] + movs r2, 0xFF + ands r0, r2 + lsls r0, 24 + adds r1, r6, 0x1 + mov r10, r1 + movs r2, 0x40 + adds r2, r4 + mov r9, r2 + cmp r0, 0 + ble _08054AFA + b _08054C4E +_08054AFA: + lsls r0, r6, 24 + lsrs r0, 24 + bl CgbOscOff + movs r0, 0 + strb r0, [r4] + b _08054D4C +_08054B08: + movs r0, 0x40 + ands r0, r1 + adds r2, r6, 0x1 + mov r10, r2 + movs r2, 0x40 + adds r2, r4 + mov r9, r2 + cmp r0, 0 + beq _08054B48 + movs r0, 0x3 + ands r0, r1 + cmp r0, 0 + beq _08054B48 + movs r0, 0xFC + ands r0, r1 + movs r2, 0 + strb r0, [r4] + ldrb r1, [r4, 0x7] + strb r1, [r4, 0xB] + movs r0, 0xFF + ands r0, r1 + cmp r0, 0 + beq _08054B7A + movs r0, 0x1 + ldrb r1, [r4, 0x1D] + orrs r0, r1 + strb r0, [r4, 0x1D] + cmp r6, 0x3 + beq _08054C3C + ldrb r2, [r4, 0x7] + mov r8, r2 + b _08054C3C +_08054B48: + ldrb r0, [r4, 0xB] + cmp r0, 0 + bne _08054C3C + cmp r6, 0x3 + bne _08054B5A + movs r0, 0x1 + ldrb r1, [r4, 0x1D] + orrs r0, r1 + strb r0, [r4, 0x1D] +_08054B5A: + adds r0, r4, 0 + bl CgbModVol + movs r0, 0x3 + ldrb r2, [r4] + ands r0, r2 + cmp r0, 0 + bne _08054BAE + ldrb r0, [r4, 0x9] + subs r0, 0x1 + strb r0, [r4, 0x9] + movs r1, 0xFF + ands r0, r1 + lsls r0, 24 + cmp r0, 0 + bgt _08054BAA +_08054B7A: + ldrb r2, [r4, 0xC] + ldrb r1, [r4, 0xA] + adds r0, r2, 0 + muls r0, r1 + adds r0, 0xFF + asrs r0, 8 + movs r1, 0 + strb r0, [r4, 0x9] + lsls r0, 24 + cmp r0, 0 + beq _08054AFA + movs r0, 0x4 + ldrb r2, [r4] + orrs r0, r2 + strb r0, [r4] + movs r0, 0x1 + ldrb r1, [r4, 0x1D] + orrs r0, r1 + strb r0, [r4, 0x1D] + cmp r6, 0x3 + beq _08054C4E + movs r2, 0x8 + mov r8, r2 + b _08054C4E +_08054BAA: + ldrb r0, [r4, 0x7] + b _08054C3A +_08054BAE: + cmp r0, 0x1 + bne _08054BBA +_08054BB2: + ldrb r0, [r4, 0x19] + strb r0, [r4, 0x9] + movs r0, 0x7 + b _08054C3A +_08054BBA: + cmp r0, 0x2 + bne _08054BFE + ldrb r0, [r4, 0x9] + subs r0, 0x1 + strb r0, [r4, 0x9] + movs r1, 0xFF + ands r0, r1 + lsls r0, 24 + ldrb r2, [r4, 0x19] + lsls r1, r2, 24 + cmp r0, r1 + bgt _08054BFA +_08054BD2: + ldrb r0, [r4, 0x6] + cmp r0, 0 + bne _08054BE2 + movs r0, 0xFC + ldrb r1, [r4] + ands r0, r1 + strb r0, [r4] + b _08054B7A +_08054BE2: + ldrb r0, [r4] + subs r0, 0x1 + strb r0, [r4] + movs r0, 0x1 + ldrb r2, [r4, 0x1D] + orrs r0, r2 + strb r0, [r4, 0x1D] + cmp r6, 0x3 + beq _08054BB2 + movs r0, 0x8 + mov r8, r0 + b _08054BB2 +_08054BFA: + ldrb r0, [r4, 0x5] + b _08054C3A +_08054BFE: + ldrb r0, [r4, 0x9] + adds r0, 0x1 + strb r0, [r4, 0x9] + movs r1, 0xFF + ands r0, r1 + ldrb r2, [r4, 0xA] + cmp r0, r2 + bcc _08054C38 +_08054C0E: + ldrb r0, [r4] + subs r0, 0x1 + movs r2, 0 + strb r0, [r4] + ldrb r1, [r4, 0x5] + strb r1, [r4, 0xB] + movs r0, 0xFF + ands r0, r1 + cmp r0, 0 + beq _08054BD2 + movs r0, 0x1 + ldrb r1, [r4, 0x1D] + orrs r0, r1 + strb r0, [r4, 0x1D] + ldrb r0, [r4, 0xA] + strb r0, [r4, 0x9] + cmp r6, 0x3 + beq _08054C3C + ldrb r2, [r4, 0x5] + mov r8, r2 + b _08054C3C +_08054C38: + ldrb r0, [r4, 0x4] +_08054C3A: + strb r0, [r4, 0xB] +_08054C3C: + ldrb r0, [r4, 0xB] + subs r0, 0x1 + strb r0, [r4, 0xB] + ldr r0, [sp] + cmp r0, 0 + bne _08054C4E + subs r0, 0x1 + str r0, [sp] + b _08054B48 +_08054C4E: + movs r0, 0x2 + ldrb r1, [r4, 0x1D] + ands r0, r1 + cmp r0, 0 + beq _08054CC6 + cmp r6, 0x3 + bgt _08054C8E + movs r0, 0x8 + ldrb r2, [r4, 0x1] + ands r0, r2 + cmp r0, 0 + beq _08054C8E + ldr r0, =REG_SOUNDBIAS + 1 + ldrb r0, [r0] + cmp r0, 0x3F + bgt _08054C80 + ldr r0, [r4, 0x20] + adds r0, 0x2 + ldr r1, =0x000007fc + b _08054C8A + .pool +_08054C80: + cmp r0, 0x7F + bgt _08054C8E + ldr r0, [r4, 0x20] + adds r0, 0x1 + ldr r1, =0x000007fe +_08054C8A: + ands r0, r1 + str r0, [r4, 0x20] +_08054C8E: + cmp r6, 0x4 + beq _08054CA0 + ldr r0, [r4, 0x20] + ldr r1, [sp, 0x10] + strb r0, [r1] + b _08054CAE + .pool +_08054CA0: + ldr r2, [sp, 0x10] + ldrb r0, [r2] + movs r1, 0x8 + ands r1, r0 + ldr r0, [r4, 0x20] + orrs r0, r1 + strb r0, [r2] +_08054CAE: + movs r0, 0xC0 + ldrb r1, [r4, 0x1A] + ands r0, r1 + adds r1, r4, 0 + adds r1, 0x21 + ldrb r1, [r1] + adds r0, r1, r0 + strb r0, [r4, 0x1A] + movs r2, 0xFF + ands r0, r2 + ldr r1, [sp, 0x14] + strb r0, [r1] +_08054CC6: + movs r0, 0x1 + ldrb r2, [r4, 0x1D] + ands r0, r2 + cmp r0, 0 + beq _08054D4C + ldr r1, =REG_NR51 + ldrb r0, [r1] + ldrb r2, [r4, 0x1C] + bics r0, r2 + ldrb r2, [r4, 0x1B] + orrs r0, r2 + strb r0, [r1] + cmp r6, 0x3 + bne _08054D18 + ldr r0, =gCgb3Vol + ldrb r1, [r4, 0x9] + adds r0, r1, r0 + ldrb r0, [r0] + ldr r2, [sp, 0xC] + strb r0, [r2] + movs r1, 0x80 + adds r0, r1, 0 + ldrb r2, [r4, 0x1A] + ands r0, r2 + cmp r0, 0 + beq _08054D4C + ldr r0, [sp, 0x8] + strb r1, [r0] + ldrb r0, [r4, 0x1A] + ldr r1, [sp, 0x14] + strb r0, [r1] + movs r0, 0x7F + ldrb r2, [r4, 0x1A] + ands r0, r2 + strb r0, [r4, 0x1A] + b _08054D4C + .pool +_08054D18: + movs r0, 0xF + mov r1, r8 + ands r1, r0 + mov r8, r1 + ldrb r2, [r4, 0x9] + lsls r0, r2, 4 + add r0, r8 + ldr r1, [sp, 0xC] + strb r0, [r1] + movs r2, 0x80 + ldrb r0, [r4, 0x1A] + orrs r0, r2 + ldr r1, [sp, 0x14] + strb r0, [r1] + cmp r6, 0x1 + bne _08054D4C + ldr r0, [sp, 0x8] + ldrb r1, [r0] + movs r0, 0x8 + ands r0, r1 + cmp r0, 0 + bne _08054D4C + ldrb r0, [r4, 0x1A] + orrs r0, r2 + ldr r1, [sp, 0x14] + strb r0, [r1] +_08054D4C: + movs r0, 0 + strb r0, [r4, 0x1D] +_08054D50: + mov r6, r10 + mov r4, r9 + cmp r6, 0x4 + bgt _08054D5A + b _08054950 +_08054D5A: + add sp, 0x1C + pop {r3-r5} + mov r8, r3 + mov r9, r4 + mov r10, r5 + pop {r4-r7} + pop {r0} + bx r0 + thumb_func_end CgbSound + + .align 2, 0 @ Don't pad with nop. @@ -1,3 +1,3 @@ .text -.incbin "baserom.gba", 0x54920, 0x6676B0 +.incbin "baserom.gba", 0x54D6C, 0x667264 diff --git a/ld_script.ld b/ld_script.ld index 1d4b8a6..0a8ae40 100755 --- a/ld_script.ld +++ b/ld_script.ld @@ -27,6 +27,7 @@ SECTIONS asm/main.o(.text); asm/m4a_1.o(.text); src/m4a_2.o(.text); + asm/m4a_3.o(.text); asm/rom.o(.text); }=0xFF } diff --git a/src/m4a_2.c b/src/m4a_2.c index a3f2f30..a45c081 100755 --- a/src/m4a_2.c +++ b/src/m4a_2.c @@ -11,7 +11,6 @@ asm(".set gPokemonCrySongTemplate, 0x0852DB40"); // TODO: asm(".set gSongTable, 0x08534E04"); // TODO: asm(".set ply_memacc, 0x08054FE0 + 1"); // TODO: asm(".set ply_xcmd, 0x08055138 + 1"); // TODO: -asm(".set CgbSound, 0x08054920 + 1"); // TODO: asm(".set gMaxLines, 0x3C"); // TODO: asm(".set _call_via_r1, 0x08055698"); // TODO: asm(".set DummyFunc, 0x080552E8 + 1"); // TODO: |