diff options
Diffstat (limited to 'asm')
-rw-r--r-- | asm/crt0.s | 240 | ||||
-rw-r--r-- | asm/libagbsyscall.s | 94 | ||||
-rw-r--r-- | asm/libgcnmultiboot.s | 641 | ||||
-rw-r--r-- | asm/m4a_1.s | 1935 |
4 files changed, 0 insertions, 2910 deletions
diff --git a/asm/crt0.s b/asm/crt0.s deleted file mode 100644 index 0d891141e..000000000 --- a/asm/crt0.s +++ /dev/null @@ -1,240 +0,0 @@ - .include "constants/gba_constants.inc" - .include "constants/misc_constants.inc" - .include "constants/version.inc" - - .syntax unified - - .global Start - - .text - - .arm - -_start: @ 8000000 - b start_vector - - .include "asm/rom_header.inc" - -@ 80000C0 - .word 0 - - .global GPIOPortData -GPIOPortData: @ 80000C4 - .hword 0 - - .global GPIOPortDirection -GPIOPortDirection: @ 80000C6 - .hword 0 - - .global GPIOPortReadEnable -GPIOPortReadEnable: @ 80000C8 - .hword 0 - - .space 6 - -@ 80000D0 - - .4byte 0xFFFFFFFF - .4byte 0xFFFFFFFF - .4byte 0xFFFFFFFF - .4byte 0xFFFFFFFF - .4byte 0xFFFFFFFF - .4byte 0xFFFFFFFF - .4byte 0xFFFFFFFF - .4byte 0xFFFFFFFF - .4byte 0xFFFFFFFF - .4byte 0xFFFFFFFF - .4byte 0xFFFFFFFF - .4byte 0xFFFFFFFF - -@ 8000100 - .global CartIdent -CartIdent: - .4byte GAME_VERSION - .4byte GAME_LANGUAGE -.game_name: - .ifdef FIRERED - .ascii "pokemon red version" - .else - .ifdef LEAFGREEN - .ascii "pokemon green version" - .endif - .endif - .space .game_name+0x20-. - .4byte gMonFrontPicTable - .4byte gMonBackPicTable - .4byte gMonPaletteTable - .4byte gMonShinyPaletteTable - .4byte gMonIconTable - .4byte gMonIconPaletteIndices - .4byte gMonIconPaletteTable - .4byte gSpeciesNames - .4byte gMoveNames - .4byte gDecorations - .4byte 0xEE0 @ offsetof(struct SaveBlock1, flags) - .4byte 0x1000 @ offsetof(struct SaveBlock1, vars) - .4byte 0x18 @ offsetof(struct SaveBlock2, pokedex) - .4byte 0x5F8 @ offsetof(struct SaveBlock1, seen1) - .4byte 0x3A18 @ offsetof(struct SaveBlock1, seen2) - .4byte 0x3C - .4byte 0x838 - .4byte 0x839 - .4byte 0x182 - .4byte 0xA0A0A07 - .4byte 0xC060C0C - .4byte 0xC121006 - .4byte 0x8010B0F - .4byte 0xC - .4byte 0xF24 @ sizeof(struct SaveBlock2) - .4byte 0x3D68 @ sizeof(struct SaveBlock1) - .4byte 0x34 @ offsetof(struct SaveBlock1, playerPartyCount) - .4byte 0x38 @ offsetof(struct SaveBlock1, playerParty) - .4byte 9 @ offsetof(struct SaveBlock2, specialSaveWarp) - .4byte 0xA @ offsetof(struct SaveBlock2, playerTrainerId) - .4byte 0 @ offsetof(struct SaveBlock2, playerName) - .4byte 8 @ offsetof(struct SaveBlock2, playerGender) - - .4byte 0xAD @ offsetof(struct SaveBlock2, ?????? (0xAD)) - .4byte 0xAD @ offsetof(struct SaveBlock2, ?????? (0xAD)) - .4byte 0x30BB - .4byte 0x30A7 - .4byte 0 - .4byte gBaseStats - .4byte gAbilityNames - .4byte gAbilityDescriptionPointers - .4byte gItems - .4byte gBattleMoves - .4byte gBallSpriteSheets - .4byte gBallSpritePalettes - .4byte 0xA8 - .4byte 0x82C - .4byte 0x83B - .4byte 0x3A0D1E2A - .4byte 0x1E2B - .4byte 0x298 @ offsetof(struct SaveBlock1, pcItems) // maybe all items were in a struct together? - .4byte 0x309C @ offsetof(struct SaveBlock1, giftRibbons) - .4byte 0x30EC @ offsetof(struct SaveBlock1, enigmaBerry) - .4byte 0x34 @ size of SaveBlock1 map header reconstruction data? - .4byte 0 - .4byte 0xFFFFFFFF - - .arm - .align 2, 0 - .global start_vector -start_vector: - mov r0, #PSR_IRQ_MODE - msr cpsr_cf, r0 - ldr sp, sp_irq - mov r0, #PSR_SYS_MODE - msr cpsr_cf, r0 - ldr sp, sp_usr - ldr r1, =INTR_VECTOR - adr r0, intr_main - str r0, [r1] - ldr r1, =AgbMain - mov lr, pc - bx r1 - b start_vector - - .align 2, 0 -sp_usr: .word IWRAM_END - 0x1C0 -sp_irq: .word IWRAM_END - 0x60 - - .pool - - .arm - .align 2, 0 - .global intr_main -intr_main: - mov r3, #REG_BASE - add r3, r3, #OFFSET_REG_IE - ldr r2, [r3] - ldrh r1, [r3, #REG_IME - REG_IE] - mrs r0, spsr - stmdb sp!, {r0-r3,lr} - mov r0, #0 - strh r0, [r3, #REG_IME - REG_IE] - and r1, r2, r2, lsr #16 - mov r12, #0 - ands r0, r1, #INTR_FLAG_VCOUNT - bne jump_intr - add r12, r12, 0x4 - mov r0, 0x1 - strh r0, [r3, #REG_IME - REG_IE] - ands r0, r1, #INTR_FLAG_SERIAL - bne jump_intr - add r12, r12, 0x4 - ands r0, r1, #INTR_FLAG_TIMER3 - bne jump_intr - add r12, r12, 0x4 - ands r0, r1, #INTR_FLAG_HBLANK - bne jump_intr - add r12, r12, 0x4 - ands r0, r1, #INTR_FLAG_VBLANK - bne jump_intr - add r12, r12, 0x4 - ands r0, r1, #INTR_FLAG_TIMER0 - bne jump_intr - add r12, r12, 0x4 - ands r0, r1, #INTR_FLAG_TIMER1 - bne jump_intr - add r12, r12, 0x4 - ands r0, r1, #INTR_FLAG_TIMER2 - bne jump_intr - add r12, r12, 0x4 - ands r0, r1, #INTR_FLAG_DMA0 - bne jump_intr - add r12, r12, 0x4 - ands r0, r1, #INTR_FLAG_DMA1 - bne jump_intr - add r12, r12, 0x4 - ands r0, r1, #INTR_FLAG_DMA2 - bne jump_intr - add r12, r12, 0x4 - ands r0, r1, #INTR_FLAG_DMA3 - bne jump_intr - add r12, r12, 0x4 - ands r0, r1, #INTR_FLAG_KEYPAD - bne jump_intr - add r12, r12, 0x4 - ands r0, r1, #INTR_FLAG_GAMEPAK - strbne r0, [r3, #REG_SOUNDCNT_X - REG_IE] -loop: - bne loop @ spin -jump_intr: - strh r0, [r3, #REG_IF - REG_IE] - bic r2, r2, r0 - ldr r0, =gSTWIStatus - ldr r0, [r0] - ldrb r0, [r0, 0xA] - mov r1, #INTR_FLAG_TIMER0 - lsl r0, r1, r0 - orr r0, r0, #INTR_FLAG_GAMEPAK - orr r1, r0, #INTR_FLAG_SERIAL | INTR_FLAG_TIMER3 | INTR_FLAG_VCOUNT | INTR_FLAG_HBLANK - and r1, r1, r2 - strh r1, [r3, #0] - mrs r3, cpsr - bic r3, r3, #PSR_I_BIT | PSR_F_BIT | PSR_MODE_MASK - orr r3, r3, #PSR_SYS_MODE - msr cpsr_cf, r3 - ldr r1, =gIntrTable - add r1, r1, r12 - ldr r0, [r1] - stmdb sp!, {lr} - adr lr, intr_return - bx r0 -intr_return: - ldmia sp!, {lr} - mrs r3, cpsr - bic r3, r3, #PSR_I_BIT | PSR_F_BIT | PSR_MODE_MASK - orr r3, r3, #PSR_I_BIT | PSR_IRQ_MODE - msr cpsr_cf, r3 - ldmia sp!, {r0-r3,lr} - strh r2, [r3, #0] - strh r1, [r3, #REG_IME - REG_IE] - msr spsr_cf, r0 - bx lr - - .pool - - .align 2, 0 @ Don't pad with nop. diff --git a/asm/libagbsyscall.s b/asm/libagbsyscall.s deleted file mode 100644 index 360a43e67..000000000 --- a/asm/libagbsyscall.s +++ /dev/null @@ -1,94 +0,0 @@ - .include "constants/gba_constants.inc" - .include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start ArcTan2 -ArcTan2: @ 81E3B58 - svc 0xA - bx lr - thumb_func_end ArcTan2 - - thumb_func_start BgAffineSet -BgAffineSet: @ 81E3B5C - svc 0xE - bx lr - thumb_func_end BgAffineSet - - thumb_func_start CpuFastSet -CpuFastSet: @ 81E3B60 - svc 0xC - bx lr - thumb_func_end CpuFastSet - - thumb_func_start CpuSet -CpuSet: @ 81E3B64 - svc 0xB - bx lr - thumb_func_end CpuSet - - thumb_func_start Div -Div: @ 81E3B68 - svc 0x6 - bx lr - thumb_func_end Div - - thumb_func_start LZ77UnCompVram -LZ77UnCompVram: @ 81E3B6C - svc 0x12 - bx lr - thumb_func_end LZ77UnCompVram - - thumb_func_start LZ77UnCompWram -LZ77UnCompWram: @ 81E3B70 - svc 0x11 - bx lr - thumb_func_end LZ77UnCompWram - - thumb_func_start MultiBoot -MultiBoot: @ 81E3B74 - movs r1, 0x1 - svc 0x25 - bx lr - thumb_func_end MultiBoot - - thumb_func_start ObjAffineSet -ObjAffineSet: @ 81E3B7C - svc 0xF - bx lr - thumb_func_end ObjAffineSet - - thumb_func_start RegisterRamReset -RegisterRamReset: @ 81E3B80 - svc 0x1 - bx lr - thumb_func_end RegisterRamReset - - thumb_func_start SoftReset -SoftReset: @ 81E3B84 - ldr r3, =REG_IME - movs r2, 0 - strb r2, [r3] - ldr r1, =0x03007f00 @ User Stack - mov sp, r1 - svc 0x1 - svc 0 - .pool - thumb_func_end SoftReset - - thumb_func_start Sqrt -Sqrt: @ 81E3B9C - svc 0x8 - bx lr - thumb_func_end Sqrt - - thumb_func_start VBlankIntrWait -VBlankIntrWait: @ 81E3BA0 - movs r2, 0 - svc 0x5 - bx lr - thumb_func_end VBlankIntrWait - - .align 2, 0 @ Don't pad with nop. diff --git a/asm/libgcnmultiboot.s b/asm/libgcnmultiboot.s deleted file mode 100644 index 91bc1890c..000000000 --- a/asm/libgcnmultiboot.s +++ /dev/null @@ -1,641 +0,0 @@ -@ This library can be used to download and execute a multi-boot image from -@ a GameCube using the JOY Bus protocol over the link cable. - - .include "asm/macros.inc" - .include "constants/constants.inc" - - .equiv GCMB_STRUCT_COUNTER1, 0x00 - .equiv GCMB_STRUCT_COUNTER2, 0x01 - .equiv GCMB_STRUCT_MBPROGRESS, 0x02 - .equiv GCMB_STRUCT_SAVEDVCOUNT, 0x03 - .equiv GCMB_STRUCT_KEYA, 0x04 - .equiv GCMB_STRUCT_KEYB, 0x08 - .equiv GCMB_STRUCT_KEYC, 0x0C - .equiv GCMB_STRUCT_BOOT_KEY, 0x10 - .equiv GCMB_STRUCT_IMAGE_SIZE, 0x12 - .equiv GCMB_STRUCT_SESSION_KEY, 0x14 - .equiv GCMB_STRUCT_HASH_VAL, 0x18 - .equiv GCMB_STRUCT_KEYC_DERIVATION, 0x1C - .equiv GCMB_STRUCT_BASE_DEST_PTR, 0x20 - .equiv GCMB_STRUCT_CUR_DEST_PTR, 0x24 - .equiv GCMB_STRUCT_SERIAL_INTR_HANDLER, 0x28 - - .equiv ROM_HEADER_NINTENDO_LOGO_OFFSET, 0x04 - .equiv ROM_HEADER_NINTENDO_LOGO_LENGTH, 0x98 - .equiv ROM_HEADER_NINTENDO_LOGO_END, 0xA0 - - .equiv MBPROGRESS_NONE, 0x00 - .equiv MBPROGRESS_LOGO_CORRECT, 0x01 - .equiv MBPROGRESS_READY_TO_BOOT, 0x02 - - .equiv GCMB_MAGIC_BOOTKEY_HASHVAL, 0xBB - .equiv GCMB_MAGIC_BOOTKEY, 0xBB - .equiv GCMB_MAGIC_COUNTER2, 0xCC - .equiv GCMB_MAGIC_KEYA, 0xDD - .equiv GCMB_MAGIC_KEYB, 0xEE - .equiv GCMB_MAGIC_KEYCDERIVATION, 0xFF - - .syntax unified - - .text - - thumb_func_start GameCubeMultiBoot_Hash -GameCubeMultiBoot_Hash: @ 81DCB38 - push {r4,lr} - ldr r4, pool_HashVal - eors r3, r1 - movs r2, 0x20 - -GameCubeMultiBoot_Hash_Loop: - lsrs r3, 1 - bcc GameCubeMultiBoot_Hash_SkipEor - - eors r3, r4 - -GameCubeMultiBoot_Hash_SkipEor: - subs r2, 0x1 - bne GameCubeMultiBoot_Hash_Loop - - pop {r4,pc} - thumb_func_end GameCubeMultiBoot_Hash - - thumb_func_start GameCubeMultiBoot_Main -@ void GameCubeMultiBoot_Main(struct GameCubeMultiBoot *mb)@ -GameCubeMultiBoot_Main: @ 81DCB4C - @ If there is no interrupt handler, skip counter manipulation - ldr r1, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER] - cmp r1, 0 - beq GameCubeMultiBoot_Main_SkipCounters - @ Increment the second counter - ldrb r1, [r0, GCMB_STRUCT_COUNTER2] - adds r1, 0x1 - strb r1, [r0, GCMB_STRUCT_COUNTER2] - @ If there is nothing more to do, bail out - ldrb r1, [r0, GCMB_STRUCT_MBPROGRESS] - cmp r1, MBPROGRESS_READY_TO_BOOT - beq GameCubeMultiBoot_Main_Return - @ Save current interrupt master register value - ldr r3, pool_InterruptRegs - ldrh r2, [r3, OFFSET_REG_IME - 0x200] - @ Disable all interrupts - movs r1, 0 - strh r1, [r3, OFFSET_REG_IME - 0x200] - @ Increment the first counter, if it's less than or equal to 10. - ldrb r1, [r0, GCMB_STRUCT_COUNTER1] - cmp r1, 0xA - bgt GameCubeMultiBoot_Main_SkipCounter1Inc - adds r1, 0x1 - strb r1, [r0, GCMB_STRUCT_COUNTER1] -GameCubeMultiBoot_Main_SkipCounter1Inc: - @ Load the saved interrupt master register value (re-enables interrupts if they were enabled before) - strh r2, [r3, OFFSET_REG_IME - 0x200] -GameCubeMultiBoot_Main_SkipCounters: - @ Initialise multiboot structures if required - bcs GameCubeMultiBoot_Init - @ Skip this section (check Nintendo logo) if the check has already passed - ldrb r1, [r0, GCMB_STRUCT_MBPROGRESS] - cmp r1, MBPROGRESS_NONE - bne GameCubeMultiBoot_Main_SkipLogoCheck - @ Bail out if no multiboot image data has been transferred yet - ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] - ldr r2, [r0, GCMB_STRUCT_BASE_DEST_PTR] - subs r1, r2 - beq GameCubeMultiBoot_Main_Return2 - @ Also bail out if not enough data has been transferred - cmp r1, ROM_HEADER_NINTENDO_LOGO_END - bcc GameCubeMultiBoot_Main_Return2 - @ Compare the Nintendo logo of the transferred multiboot image header, with the one in the ROM image of the inserted cart - push {r4-r6} - movs r1, ROM_HEADER_NINTENDO_LOGO_LENGTH - adds r2, ROM_HEADER_NINTENDO_LOGO_OFFSET - ldr r4, pool_NintendoLogo -GameCubeMultiBoot_Main_LogoCmpLoop: - ldm r2!, {r5} - ldm r4!, {r6} - cmp r5, r6 - bne GameCubeMultiBoot_Main_LogoCmpEnd - subs r1, 0x4 - bne GameCubeMultiBoot_Main_LogoCmpLoop - ldm r2!, {r5} - ldm r4!, {r6} - eors r5, r6 - lsrs r5, 8 - str r2, [r0, GCMB_STRUCT_BASE_DEST_PTR] -GameCubeMultiBoot_Main_LogoCmpEnd: - pop {r4-r6} - @ Throw everything away if the logo data didn't match - bne GameCubeMultiBoot_Init - @ Logo matched, set the relevent multiboot progress bit - movs r1, MBPROGRESS_LOGO_CORRECT - strb r1, [r0, GCMB_STRUCT_MBPROGRESS] - @ XOR together KeyA and KeyB to get the initial multiboot image checksum value - ldr r1, [r0, GCMB_STRUCT_KEYA] - ldr r2, [r0, GCMB_STRUCT_KEYB] - eors r1, r2 - str r1, [r0, GCMB_STRUCT_HASH_VAL] - @ ...also use it as the initial value for the image encryption session key. Algorithm is the same as the GBA BIOS multiboot: sessionkey = (initialvalue * 0x6177614b) + 1 - ldr r2, pool_Kawa - muls r1, r2 - adds r1, 0x1 - str r1, [r0, GCMB_STRUCT_SESSION_KEY] -GameCubeMultiBoot_Main_Return: - bx lr -GameCubeMultiBoot_Main_SkipLogoCheck: - @ If this code is executed, then the logo check has passed, and the data being transferred in is encrypted. - @ Set up registers. - ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] - mov r12, r1 - ldr r3, [r0, GCMB_STRUCT_HASH_VAL] - push {r4-r7} - ldr r4, [r0, GCMB_STRUCT_BASE_DEST_PTR] - ldr r5, pool_Kawa - ldr r6, [r0, GCMB_STRUCT_SESSION_KEY] - ldr r7, pool_HashVal -GameCubeMultiBoot_Main_ImageDecryptHashLoop: - @ If there's no more data, break out of the loop - cmp r4, r12 - bcs GameCubeMultiBoot_Main_ImageDecryptHashEnd - @ Get the next uint32 - ldr r1, [r4] - @ Decrypt the ciphertext: plaintext = (ciphertext ^ sessionkey) + hashval - eors r1, r6 - adds r1, r3 - @ Save the current uint32 of plaintext and advance the pointer - stm r4!, {r1} - @ Advance the hashval with this uint32 of plaintext -- this is the same code as GameCubeMultiBoot_Hash. - eors r3, r1 - movs r2, 0x20 -GameCubeMultiBoot_Main_HashLoop: - lsrs r3, 1 - bcc GameCubeMultiBoot_Main_HashSkipEor - eors r3, r7 -GameCubeMultiBoot_Main_HashSkipEor: - subs r2, 0x1 - bne GameCubeMultiBoot_Main_HashLoop - @ Advance the sessionkey with the usual algorithm: sessionkey = (sessionkey * 0x6177614b) + 1 - muls r6, r5 - adds r6, 0x1 - b GameCubeMultiBoot_Main_ImageDecryptHashLoop -GameCubeMultiBoot_Main_ImageDecryptHashEnd: - @ Save the new pointer, sessionkey, hashval - str r4, [r0, GCMB_STRUCT_BASE_DEST_PTR] - str r6, [r0, GCMB_STRUCT_SESSION_KEY] - pop {r4-r7} - str r3, [r0, GCMB_STRUCT_HASH_VAL] - @ Bail out if the image size is unknown - ldrh r1, [r0, GCMB_STRUCT_IMAGE_SIZE] - cmp r1, 0 - bne GameCubeMultiBoot_Main_Return2 - @ Bail out if no image data has been transferred - ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] - ldr r2, [r0, GCMB_STRUCT_BASE_DEST_PTR] - cmp r1, r2 - bne GameCubeMultiBoot_Main_Return2 - @ If KeyC hasn't been generated yet, go generate it - ldr r1, [r0, GCMB_STRUCT_KEYC] - cmp r1, 0 - beq GameCubeMultiBoot_Main_GenerateKeyC - @ If the other side hasn't sent its boot key yet, bail out - ldrh r1, [r0, GCMB_STRUCT_BOOT_KEY] - cmp r1, 0 - beq GameCubeMultiBoot_Main_Return - @ Save off LR so it doesn't get clobbered by the upcoming function call - mov r12, lr - @ Generate the real boot key, which is the checksum of a hardcoded value and KeyC - movs r1, GCMB_MAGIC_BOOTKEY_HASHVAL - ldr r3, [r0, GCMB_STRUCT_KEYC] - bl GameCubeMultiBoot_Hash - ldrh r1, [r0, GCMB_STRUCT_BOOT_KEY] - @ Restore the saved LR value - mov lr, r12 - @ Compare the two boot keys (real and passed in), if they don't match then throw everything away - subs r1, r3 - bne GameCubeMultiBoot_Init - @ The two boot keys matched, tell the caller that the image is ready to boot - movs r1, MBPROGRESS_READY_TO_BOOT - strb r1, [r0, GCMB_STRUCT_MBPROGRESS] - @ Nothing more to do, return. - bx lr -GameCubeMultiBoot_Main_GenerateKeyC: - @ Save off LR so it doesn't get clobbered by the upcoming function call - mov r12, lr - @ KeyC = (SavedVCount << 24) - 1 - ldrb r1, [r0, GCMB_STRUCT_SAVEDVCOUNT] - lsls r1, 24 - subs r1, 0x1 - str r1, [r0, GCMB_STRUCT_KEYC] - @ Hash the KeyC with the multiboot image checksum to generate the KeyC derivation material to be sent to the other side of the link - bl GameCubeMultiBoot_Hash - @ Make sure the sent KeyC derivation material contains a magic value so that the other side can detect it - lsls r3, 8 - adds r3, GCMB_MAGIC_KEYCDERIVATION - @ Save off the KeyC derivation material and return to caller - str r3, [r0, GCMB_STRUCT_KEYC_DERIVATION] - bx r12 -GameCubeMultiBoot_Main_Return2: - bx lr - thumb_func_end GameCubeMultiBoot_Main - - .align 2, 0 - -pool_HashVal: .4byte 0xa1c1 - -pool_Kawa: .ascii "Kawa" @ name of BIOS developer - -pool_NintendoLogo: .4byte RomHeaderNintendoLogo - - thumb_func_start GameCubeMultiBoot_ExecuteProgram -@ void GameCubeMultiBoot_ExecuteProgram(struct GameCubeMultiBoot *mb)@ -GameCubeMultiBoot_ExecuteProgram: @ 81DCC4C - @ If there's no multiboot image ready, just return to caller - ldrb r1, [r0, GCMB_STRUCT_MBPROGRESS] - cmp r1, MBPROGRESS_READY_TO_BOOT - bne GameCubeMultiBoot_ExecuteProgram_Fail - @ Disable interrupts - ldr r3, pool_InterruptRegs - movs r1, 0 - strh r1, [r3, OFFSET_REG_IME - 0x200] - @ Jump to the real entry point of the multiboot image (past the image header), in ARM mode - ldr r1, pool_MultiBootLoadAddr - adds r1, 0xC0 - bx r1 -GameCubeMultiBoot_ExecuteProgram_Fail: - bx lr - thumb_func_end GameCubeMultiBoot_ExecuteProgram - - thumb_func_start GameCubeMultiBoot_Init -@ void GameCubeMultiBoot_Init(struct GameCubeMultiBoot *mb)@ -GameCubeMultiBoot_Init: @ 81DCC60 - ldr r3, pool_InterruptRegs - -@ Save IME register. - ldrh r2, [r3, OFFSET_REG_IME - 0x200] - -@ Disable interrupts. - movs r1, 0 - strh r1, [r3, OFFSET_REG_IME - 0x200] - -@ Set the handler to the "Stop" routine. -@ Unless the first command that is received is a device reset command, the -@ "Stop" routine will be executed and no further commands will be processed. - adr r3, GcMbIntrHandler_Stop - str r3, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER] - - ldrb r3, [r0, 0x3] - push {r3} - ldrb r3, [r0, 0x1] - push {r0,r3} - - adds r3, r0, 0 - adds r3, GCMB_STRUCT_BASE_DEST_PTR - -@ clear all but the last 3 fields of the struct -GameCubeMultiBoot_Init_ClearStructLoop: - stm r0!, {r1} - cmp r0, r3 - blo GameCubeMultiBoot_Init_ClearStructLoop - - pop {r0,r3} - lsrs r3, 1 - strb r3, [r0, 0x3] - pop {r3} - strb r3, [r0, 0x1] - - ldr r3, pool_SerialRegs - -@ Turn off JOY Bus mode. - lsls r0, r3, 10 - strh r0, [r3, OFFSET_REG_RCNT - 0x120] - -@ Turn on JOY Bus mode. - movs r0, 0xC0 - lsls r0, 8 - strh r0, [r3, OFFSET_REG_RCNT - 0x120] - -@ Init JOY Bus registers. - movs r0, 0x47 - strh r0, [r3, OFFSET_REG_JOYCNT - 0x120] - strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120] - - ldr r3, pool_InterruptRegs - -@ Acknowledge serial interrupt. - movs r0, INTR_FLAG_SERIAL - strh r0, [r3, OFFSET_REG_IF - 0x200] - -@ Enable serial interrupt. - ldrh r1, [r3, OFFSET_REG_IE - 0x200] - orrs r1, r0 - strh r1, [r3, OFFSET_REG_IE - 0x200] - -@ Restore IME register. - strh r2, [r3, OFFSET_REG_IME - 0x200] - - bx lr - thumb_func_end GameCubeMultiBoot_Init - - non_word_aligned_thumb_func_start GameCubeMultiBoot_HandleSerialInterrupt -@ void GameCubeMultiBoot_HandleSerialInterrupt(struct GameCubeMultiBoot *mb)@ -GameCubeMultiBoot_HandleSerialInterrupt: @ 81DCCAA - ldr r3, pool_SerialRegs - -@ Acknowledge reset/receive/send flags. - ldrh r1, [r3, OFFSET_REG_JOYCNT - 0x120] - strh r1, [r3, OFFSET_REG_JOYCNT - 0x120] - - movs r2, 0 - strb r2, [r0] - - ldr r2, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER] - cmp r2, 0 - beq GameCubeMultiBoot_HandleSerialInterruptDone - - lsrs r1, 1 @ was a device reset command received? - bcs GameCubeMultiBoot_BeginHandshake @ branch if so - - mov pc, r2 - - .align 2, 0 - -@ Zero the status and the interrupt handler pointer. -@ Commands from the GameCube will not be processed after this is executed -@ unless GameCubeMultiBoot_Init() is called again. -GcMbIntrHandler_Stop: - movs r2, 0 - strh r2, [r3, OFFSET_REG_JOYSTAT - 0x120] - -GameCubeMultiBoot_SetInterruptHandler: - str r2, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER] - -GameCubeMultiBoot_ReadVCount: - ldr r3, pool_RegDispstat - ldrh r1, [r3, OFFSET_REG_VCOUNT - OFFSET_REG_DISPSTAT] - strb r1, [r0, 0x3] - -GameCubeMultiBoot_HandleSerialInterruptDone: - bx lr - -GameCubeMultiBoot_BeginHandshake: - @ Throw away anything that got sent - ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] - @ Send the game code, the other side of the link must send back the same game code - ldr r1, pool_RubyUSAGameCode - str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120] - movs r1, 0x10 - strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120] - @ Use the saved VCount value to provide 8 bits of entropy for KeyB - ldrb r1, [r0, GCMB_STRUCT_SAVEDVCOUNT] - strb r1, [r0, GCMB_STRUCT_KEYB + 1] - @ If a multiboot image has been transferred at least enough such that the Nintendo logo check has passed, stop everything. - ldrb r1, [r0, GCMB_STRUCT_MBPROGRESS] - cmp r1, 0 - bne GcMbIntrHandler_Stop - @ Set the image destination pointers. - ldr r1, pool_MultiBootLoadAddr - str r1, [r0, GCMB_STRUCT_BASE_DEST_PTR] - str r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] - @ Set the new interrupt handler. - adr r2, GcMbIntrHandler_CheckGameCodeSent - b GameCubeMultiBoot_SetInterruptHandler - - .align 2, 0 - -GcMbIntrHandler_CheckGameCodeSent: @ 81DCCEC - lsls r1, 31 - bcc GcMbIntrHandler_Stop @ stop if send failed - bmi GameCubeMultiBoot_CheckHandshakeResponse @ branch if receive is complete - -@ If the response hasn't been fully received yet, -@ check again upon the next interrupt. - adr r2, GcMbIntrHandler_CheckHandshakeResponse - b GameCubeMultiBoot_SetInterruptHandler - - .align 2, 0 - -GcMbIntrHandler_CheckHandshakeResponse: @ 81DCCF8 - lsrs r1, 1 @ is receive complete? - bcc GcMbIntrHandler_Stop @ stop if not - -GameCubeMultiBoot_CheckHandshakeResponse: - ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] - ldr r2, pool_RubyUSAGameCode - cmp r1, r2 - bne GcMbIntrHandler_Stop @ stop if the GameCube didn't reply with the same game code - @ Use the saved VCount value to provide another 8 bits of entropy for KeyB. - ldrb r1, [r0, GCMB_STRUCT_SAVEDVCOUNT] - strb r1, [r0, GCMB_STRUCT_KEYB + 3] - adr r2, GcMbIntrHandler_ReceiveKeyA - b GameCubeMultiBoot_SetInterruptHandler - - .align 2, 0 - -GcMbIntrHandler_ReceiveKeyA: @ 81DCD0C - lsrs r1, 1 @ is receive complete? - bcc GcMbIntrHandler_Stop @ branch if not - ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] - @ make sure top 8 bits of the received value is the KeyA magic number, stop if KeyA is invalid - lsrs r2, r1, 24 - cmp r2, GCMB_MAGIC_KEYA - bne GcMbIntrHandler_Stop - @ save received KeyA - str r1, [r0, GCMB_STRUCT_KEYA] - @ use the second GameCubeMultiBoot_Main() counter as another 8 bits of entropy for KeyB - ldrb r1, [r0, GCMB_STRUCT_COUNTER2] - strb r1, [r0, GCMB_STRUCT_KEYB + 2] - movs r2, 0 - movs r3, 0 - ldr r1, [r0, GCMB_STRUCT_KEYB] - lsrs r1, 8 - @ make sure KeyB is valid (other side of the link is supposed to check KeyB too), if it's not then change the byte that was just set so it is -GameCubeMultiBoot_KeyBCheckLoop: - lsrs r1, 1 - adcs r2, r3 - cmp r1, 0 - bne GameCubeMultiBoot_KeyBCheckLoop - cmp r2, 0xE - bgt GameCubeMultiBoot_KeyBSaveNewByte - cmp r2, 0x7 - bge GameCubeMultiBoot_KeyBCheckEnd - movs r1, 0xFF -GameCubeMultiBoot_KeyBSaveNewByte: - strb r1, [r0, GCMB_STRUCT_KEYB + 2] -GameCubeMultiBoot_KeyBCheckEnd: - @ add in the KeyB magic number and send off KeyB - ldr r1, [r0, GCMB_STRUCT_KEYB] - adds r1, GCMB_MAGIC_KEYB - ldr r3, pool_SerialRegs - str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120] - movs r1, 0x30 - strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120] - @ set new interrupt handler - adr r2, GcMbIntrHandler_CheckKeyBSent - b GameCubeMultiBoot_SetInterruptHandler - - .align 2, 0 - -GcMbIntrHandler_CheckKeyBSent: @ 81DCD4C - lsls r1, 31 - bcc GcMbIntrHandler_Stop @ stop if send failed - bmi GameCubeMultiBoot_CheckImageSizeResponse @ branch if receive is complete - adr r2, GcMbIntrHandler_CheckImageSizeResponse - b GameCubeMultiBoot_SetInterruptHandler - - .align 2, 0 - -GcMbIntrHandler_CheckImageSizeResponse: @ 81DCD58 - lsrs r1, 1 @ is receive complete? - bcc GcMbIntrHandler_Stop @ branch if not -GameCubeMultiBoot_CheckImageSizeResponse: - ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] - ldr r2, GameCubeMultiBoot_MaximumImageSizeUInt32s - cmp r1, r2 - bhs GcMbIntrHandler_Stop - adds r1, 0x1 - adds r1, r1 - strh r1, [r0, GCMB_STRUCT_IMAGE_SIZE] - ldrb r1, [r0, GCMB_STRUCT_MBPROGRESS] - cmp r1, 0 -GcMbIntrHandler_StopIfNotEqual: - bne GcMbIntrHandler_Stop - ldr r1, pool_MultiBootLoadAddr - str r1, [r0, GCMB_STRUCT_BASE_DEST_PTR] - str r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] - adr r2, GcMbIntrHandler_CheckImageResponse - b GameCubeMultiBoot_SetInterruptHandler - - .align 2, 0 - -GcMbIntrHandler_CheckImageResponse: @ 81DCD7C - lsrs r1, 1 @ is receive complete? - bcc GcMbIntrHandler_Stop @ branch if not - ldr r2, [r0, GCMB_STRUCT_CUR_DEST_PTR] - movs r1, 0x4 - ands r1, r2 - adds r1, 0x8 - lsls r1, 2 - strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120] - @ get the recieved uint32 - ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] - @ put it in the current destination pointer and advance that pointer - stm r2!, {r1} - @ save off the advanced pointer - str r2, [r0, GCMB_STRUCT_CUR_DEST_PTR] - @ decrease the image size (in uint32s) - ldrh r1, [r0, GCMB_STRUCT_IMAGE_SIZE] - subs r1, 0x1 - strh r1, [r0, GCMB_STRUCT_IMAGE_SIZE] - @ branch away if the transfer is not yet complete - bne GameCubeMultiBoot_ReadVCount - -GcMbIntrHandler_SendCounter2: - @ send counter2 with magic number - ldrb r1, [r0, GCMB_STRUCT_COUNTER2] - lsls r1, 8 - adds r1, GCMB_MAGIC_COUNTER2 - str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120] - adr r2, GcMbIntrHandler_CheckCounter2Sent - b GameCubeMultiBoot_SetInterruptHandler - - .align 2, 0 - -GcMbIntrHandler_CheckCounter2Sent: - lsls r1, 31 - -GcMbIntrHandler_StopIfSendFailed: - bcc GcMbIntrHandler_Stop @ stop if send failed - @ if KeyC derivation value has not yet been generated, send Counter2 again, otherwise, send KeyC derivation - ldr r1, [r0, GCMB_STRUCT_KEYC_DERIVATION] - cmp r1, 0 - beq GcMbIntrHandler_SendCounter2 - str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120] - adr r2, GcMbIntrHandler_CheckKeyCDerivationSent - b GameCubeMultiBoot_SetInterruptHandler - - .align 2, 0 - -GcMbIntrHandler_CheckKeyCDerivationSent: @ 81DCDB8 - lsls r1, 31 - bcc GcMbIntrHandler_StopIfSendFailed @ branch if send failed - bmi GameCubeMultiBoot_CheckBootKeyResponse @ branch if receive is complete - adr r2, GcMbIntrHandler_CheckBootKeyResponse - b GameCubeMultiBoot_SetInterruptHandler - - .align 2, 0 - -GcMbIntrHandler_CheckBootKeyResponse: @ 81DCDC4 - lsrs r1, 1 @ is receive complete? - bcc GcMbIntrHandler_StopIfSendFailed @ branch if not - -GameCubeMultiBoot_CheckBootKeyResponse: - ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] - @ make sure received boot key contains expected magic number, stop if not - lsrs r2, r1, 24 - cmp r2, GCMB_MAGIC_BOOTKEY - bne GcMbIntrHandler_StopIfNotEqual - @ save received bootkey to be checked in GameCubeMultiBoot_Main() - strh r1, [r0, GCMB_STRUCT_BOOT_KEY] - @ stop if anything more gets sent - adr r2, GcMbIntrHandler_StopUnconditionally - b GameCubeMultiBoot_SetInterruptHandler - - .align 2, 0 - -GcMbIntrHandler_StopUnconditionally: @ 81DCDD8 - b GcMbIntrHandler_Stop - - thumb_func_end GameCubeMultiBoot_HandleSerialInterrupt - - non_word_aligned_thumb_func_start GameCubeMultiBoot_Quit -@ void GameCubeMultiBoot_Quit()@ -GameCubeMultiBoot_Quit: @ 81DCDDA - ldr r3, pool_InterruptRegs - -@ Save IME register. - ldrh r2, [r3, OFFSET_REG_IME - 0x200] - -@ Disable interrupts. - movs r1, 0 - strh r1, [r3, OFFSET_REG_IME - 0x200] - - ldr r3, pool_SerialRegs - -@ Acknowledge all JOYCNT flags. - movs r0, 0x7 - strh r0, [r3, OFFSET_REG_JOYCNT - 0x120] - -@ Turn off JOY Bus mode. - lsls r0, r3, 10 - strh r0, [r3, OFFSET_REG_RCNT - 0x120] @ store 0x8000 - - ldr r3, pool_InterruptRegs - -@ Acknowledge serial interrupt. - movs r0, INTR_FLAG_SERIAL - strh r0, [r3, OFFSET_REG_IF - 0x200] - -@ Disable serial interrupt. - ldrh r1, [r3, OFFSET_REG_IE - 0x200] - bics r1, r0 - strh r1, [r3, OFFSET_REG_IE - 0x200] - -@ Restore IME register. - strh r2, [r3, OFFSET_REG_IME - 0x200] - - bx lr - thumb_func_end GameCubeMultiBoot_Quit - - .align 2, 0 - -GameCubeMultiBoot_MaximumImageSizeUInt32s: .4byte 0x00004000 - -pool_InterruptRegs: .4byte REG_BASE + 0x200 - -pool_SerialRegs: .4byte REG_BASE + 0x120 - -pool_RegDispstat: .4byte REG_DISPSTAT - -pool_RubyUSAGameCode: .ascii "AXVE" - -pool_MultiBootLoadAddr: .4byte EWRAM_START - - .align 2, 0 @ Don't pad with nop. diff --git a/asm/m4a_1.s b/asm/m4a_1.s deleted file mode 100644 index 7cb36580f..000000000 --- a/asm/m4a_1.s +++ /dev/null @@ -1,1935 +0,0 @@ - .include "asm/macros.inc" - .include "constants/gba_constants.inc" - .include "constants/m4a_constants.inc" - - .syntax unified - - .text - - thumb_func_start umul3232H32 -umul3232H32: - adr r2, __umul3232H32 - bx r2 - .arm -__umul3232H32: - umull r2, r3, r0, r1 - add r0, r3, 0 - bx lr - thumb_func_end umul3232H32 - - thumb_func_start SoundMain -SoundMain: - ldr r0, lt_SOUND_INFO_PTR - ldr r0, [r0] - ldr r2, lt_ID_NUMBER - ldr r3, [r0, o_SoundInfo_ident] - cmp r2, r3 - beq SoundMain_1 - bx lr @ Exit the function if ident doesn't match ID_NUMBER. -SoundMain_1: - adds r3, 1 - str r3, [r0, o_SoundInfo_ident] - push {r4-r7,lr} - mov r1, r8 - mov r2, r9 - mov r3, r10 - mov r4, r11 - push {r0-r4} - sub sp, 0x18 - ldrb r1, [r0, o_SoundInfo_maxLines] - cmp r1, 0 @ if maxLines is 0, there is no maximum - beq SoundMain_3 - ldr r2, lt_REG_VCOUNT - ldrb r2, [r2] - cmp r2, VCOUNT_VBLANK - bhs SoundMain_2 - adds r2, TOTAL_SCANLINES -SoundMain_2: - adds r1, r2 -SoundMain_3: - str r1, [sp, 0x14] - ldr r3, [r0, o_SoundInfo_func] - cmp r3, 0 - beq SoundMain_4 - ldr r0, [r0, o_SoundInfo_intp] - bl _081DD25E - ldr r0, [sp, 0x18] -SoundMain_4: - ldr r3, [r0, o_SoundInfo_CgbSound] - bl _081DD25E - ldr r0, [sp, 0x18] - ldr r3, [r0, o_SoundInfo_pcmSamplesPerVBlank] - mov r8, r3 - ldr r5, lt_o_SoundInfo_pcmBuffer - adds r5, r0 - ldrb r4, [r0, o_SoundInfo_pcmDmaCounter] - subs r7, r4, 1 - bls SoundMain_5 - ldrb r1, [r0, o_SoundInfo_pcmDmaPeriod] - subs r1, r7 - mov r2, r8 - muls r2, r1 - adds r5, r2 -SoundMain_5: - str r5, [sp, 0x8] - ldr r6, lt_PCM_DMA_BUF_SIZE - ldr r3, lt_SoundMainRAM_Buffer - bx r3 - - .align 2, 0 -lt_SOUND_INFO_PTR: .word SOUND_INFO_PTR -lt_ID_NUMBER: .word ID_NUMBER -lt_SoundMainRAM_Buffer: .word SoundMainRAM_Buffer + 1 -lt_REG_VCOUNT: .word REG_VCOUNT -lt_o_SoundInfo_pcmBuffer: .word o_SoundInfo_pcmBuffer -lt_PCM_DMA_BUF_SIZE: .word PCM_DMA_BUF_SIZE - thumb_func_end SoundMain - - thumb_func_start SoundMainRAM -SoundMainRAM: - ldrb r3, [r0, o_SoundInfo_reverb] - cmp r3, 0 - beq SoundMainRAM_NoReverb - adr r1, SoundMainRAM_Reverb - bx r1 - .arm -SoundMainRAM_Reverb: - cmp r4, 0x2 - addeq r7, r0, o_SoundInfo_pcmBuffer - addne r7, r5, r8 - mov r4, r8 -_081DCEC4: - ldrsb r0, [r5, r6] - ldrsb r1, [r5] - add r0, r0, r1 - ldrsb r1, [r7, r6] - add r0, r0, r1 - ldrsb r1, [r7], 0x1 - add r0, r0, r1 - mul r1, r0, r3 - mov r0, r1, asr 9 - tst r0, 0x80 - addne r0, r0, 0x1 - strb r0, [r5, r6] - strb r0, [r5], 0x1 - subs r4, r4, 0x1 - bgt _081DCEC4 - adr r0, _081DCF36 + 1 @ plus 1 because THUMB - bx r0 - .thumb -SoundMainRAM_NoReverb: - movs r0, 0 - mov r1, r8 - adds r6, r5 - lsrs r1, 3 - bcc SoundMainRAM_NoReverb_Ok - stm r5!, {r0} - stm r6!, {r0} -SoundMainRAM_NoReverb_Ok: - lsrs r1, 1 - bcc SoundMainRAM_NoReverb_Loop - stm r5!, {r0} - stm r6!, {r0} - stm r5!, {r0} - stm r6!, {r0} -SoundMainRAM_NoReverb_Loop: - stm r5!, {r0} - stm r6!, {r0} - stm r5!, {r0} - stm r6!, {r0} - stm r5!, {r0} - stm r6!, {r0} - stm r5!, {r0} - stm r6!, {r0} - subs r1, 1 - bgt SoundMainRAM_NoReverb_Loop -_081DCF36: - ldr r4, [sp, 0x18] - ldr r0, [r4, o_SoundInfo_divFreq] - mov r12, r0 - ldrb r0, [r4, o_SoundInfo_maxChans] - adds r4, o_SoundInfo_chans - -SoundMainRAM_ChanLoop: - str r0, [sp, 0x4] - ldr r3, [r4, o_SoundChannel_wav] - ldr r0, [sp, 0x14] - cmp r0, 0 - beq _081DCF60 - ldr r1, =REG_VCOUNT - ldrb r1, [r1] - cmp r1, VCOUNT_VBLANK - bhs _081DCF54 - adds r1, TOTAL_SCANLINES -_081DCF54: - cmp r1, r0 - blo _081DCF60 - b _081DD24A - - .pool - -_081DCF60: - ldrb r6, [r4, o_SoundChannel_status] - movs r0, 0xC7 - tst r0, r6 - bne _081DCF6A - b _081DD240 -_081DCF6A: - movs r0, 0x80 - tst r0, r6 - beq _081DCFA0 - movs r0, 0x40 - tst r0, r6 - bne _081DCFB0 - movs r6, 0x3 - strb r6, [r4, o_SoundChannel_status] - adds r0, r3, 0 - adds r0, 0x10 - ldr r1, [r4, o_SoundChannel_ct] - adds r0, r1 - str r0, [r4, o_SoundChannel_cp] - ldr r0, [r3, 0xC] - subs r0, r1 - str r0, [r4, o_SoundChannel_ct] - movs r5, 0 - strb r5, [r4, o_SoundChannel_ev] - str r5, [r4, o_SoundChannel_fw] - ldrb r2, [r3, 0x3] - movs r0, 0xC0 - tst r0, r2 - beq _081DCFF8 - movs r0, 0x10 - orrs r6, r0 - strb r6, [r4, o_SoundChannel_status] - b _081DCFF8 -_081DCFA0: - ldrb r5, [r4, o_SoundChannel_ev] - movs r0, 0x4 - tst r0, r6 - beq _081DCFB6 - ldrb r0, [r4, o_SoundChannel_iel] - subs r0, 1 - strb r0, [r4, o_SoundChannel_iel] - bhi _081DD006 -_081DCFB0: - movs r0, 0 - strb r0, [r4, o_SoundChannel_status] - b _081DD240 -_081DCFB6: - movs r0, 0x40 - tst r0, r6 - beq _081DCFD6 - ldrb r0, [r4, o_SoundChannel_release] - muls r5, r0 - lsrs r5, 8 - ldrb r0, [r4, o_SoundChannel_iev] - cmp r5, r0 - bhi _081DD006 -_081DCFC8: - ldrb r5, [r4, o_SoundChannel_iev] - cmp r5, 0 - beq _081DCFB0 - movs r0, 0x4 - orrs r6, r0 - strb r6, [r4, o_SoundChannel_status] - b _081DD006 -_081DCFD6: - movs r2, 0x3 - ands r2, r6 - cmp r2, 0x2 - bne _081DCFF4 - ldrb r0, [r4, o_SoundChannel_decay] - muls r5, r0 - lsrs r5, 8 - ldrb r0, [r4, o_SoundChannel_sustain] - cmp r5, r0 - bhi _081DD006 - adds r5, r0, 0 - beq _081DCFC8 - subs r6, 0x1 - strb r6, [r4, o_SoundChannel_status] - b _081DD006 -_081DCFF4: - cmp r2, 0x3 - bne _081DD006 -_081DCFF8: - ldrb r0, [r4, o_SoundChannel_attack] - adds r5, r0 - cmp r5, 0xFF - bcc _081DD006 - movs r5, 0xFF - subs r6, 0x1 - strb r6, [r4, o_SoundChannel_status] -_081DD006: - strb r5, [r4, o_SoundChannel_ev] - ldr r0, [sp, 0x18] - ldrb r0, [r0, o_SoundChannel_release] - adds r0, 0x1 - muls r0, r5 - lsrs r5, r0, 4 - ldrb r0, [r4, o_SoundChannel_rightVolume] - muls r0, r5 - lsrs r0, 8 - strb r0, [r4, o_SoundChannel_er] - ldrb r0, [r4, o_SoundChannel_leftVolume] - muls r0, r5 - lsrs r0, 8 - strb r0, [r4, o_SoundChannel_el] - movs r0, 0x10 - ands r0, r6 - str r0, [sp, 0x10] - beq _081DD03A - adds r0, r3, 0 - adds r0, 0x10 - ldr r1, [r3, 0x8] - adds r0, r1 - str r0, [sp, 0xC] - ldr r0, [r3, 0xC] - subs r0, r1 - str r0, [sp, 0x10] -_081DD03A: - ldr r5, [sp, 0x8] - ldr r2, [r4, o_SoundChannel_ct] - ldr r3, [r4, o_SoundChannel_cp] - adr r0, _081DD044 - bx r0 - .arm -_081DD044: - str r8, [sp] - ldr r9, [r4, o_SoundChannel_fw] - ldrb r10, [r4, o_SoundChannel_er] - ldrb r11, [r4, o_SoundChannel_el] - ldrb r0, [r4, o_SoundChannel_type] - tst r0, 0x30 - beq _081DD068 - bl sub_81DC460 - b _081DD228 -_081DD068: - mov r10, r10, lsl 16 - mov r11, r11, lsl 16 - ldrb r0, [r4, o_SoundChannel_type] - tst r0, 0x8 - beq _081DD19C -_081DD07C: - cmp r2, 0x4 - ble _081DD0EC - subs r2, r2, r8 - movgt r9, 0 - bgt _081DD0A8 - mov r9, r8 - add r2, r2, r8 - sub r8, r2, 0x4 - sub r9, r9, r8 - ands r2, r2, 0x3 - moveq r2, 0x4 -_081DD0A8: - ldr r6, [r5] - ldr r7, [r5, 0x630] -_081DD0B0: - ldrsb r0, [r3], 0x1 - mul r1, r10, r0 - bic r1, r1, 0xFF0000 - add r6, r1, r6, ror 8 - mul r1, r11, r0 - bic r1, r1, 0xFF0000 - add r7, r1, r7, ror 8 - adds r5, r5, 0x40000000 - bcc _081DD0B0 - str r7, [r5, 0x630] - str r6, [r5], 0x4 - subs r8, r8, 0x4 - bgt _081DD0A8 - adds r8, r8, r9 - beq _081DD22C -_081DD0EC: - ldr r6, [r5] - ldr r7, [r5, 0x630] -_081DD0F4: - ldrsb r0, [r3], 0x1 - mul r1, r10, r0 - bic r1, r1, 0xFF0000 - add r6, r1, r6, ror 8 - mul r1, r11, r0 - bic r1, r1, 0xFF0000 - add r7, r1, r7, ror 8 - subs r2, r2, 0x1 - beq _081DD164 -_081DD118: - adds r5, r5, 0x40000000 - bcc _081DD0F4 - str r7, [r5, 0x630] - str r6, [r5], 0x4 - subs r8, r8, 0x4 - bgt _081DD07C - b _081DD22C -_081DD134: - ldr r0, [sp, 0x18] - cmp r0, 0 - beq _081DD158 - ldr r3, [sp, 0x14] - rsb lr, r2, 0 -_081DD148: - adds r2, r0, r2 - bgt _081DD1FC - sub lr, lr, r0 - b _081DD148 -_081DD158: - pop {r4,r12} - mov r2, 0 - b _081DD174 -_081DD164: - ldr r2, [sp, 0x10] - cmp r2, 0 - ldrne r3, [sp, 0xC] - bne _081DD118 -_081DD174: - strb r2, [r4, o_SoundChannel_status] - mov r0, r5, lsr 30 - bic r5, r5, 0xC0000000 - rsb r0, r0, 0x3 - mov r0, r0, lsl 3 - mov r6, r6, ror r0 - mov r7, r7, ror r0 - str r7, [r5, 0x630] - str r6, [r5], 0x4 - b _081DD234 -_081DD19C: - push {r4,r12} - ldr r1, [r4, o_SoundChannel_freq] - mul r4, r12, r1 - ldrsb r0, [r3] - ldrsb r1, [r3, 0x1]! - sub r1, r1, r0 -_081DD1B4: - ldr r6, [r5] - ldr r7, [r5, 0x630] -_081DD1BC: - mul lr, r9, r1 - add lr, r0, lr, asr 23 - mul r12, r10, lr - bic r12, r12, 0xFF0000 - add r6, r12, r6, ror 8 - mul r12, r11, lr - bic r12, r12, 0xFF0000 - add r7, r12, r7, ror 8 - add r9, r9, r4 - movs lr, r9, lsr 23 - beq _081DD208 - bic r9, r9, 0x3F800000 - subs r2, r2, lr - ble _081DD134 - subs lr, lr, 0x1 - addeq r0, r0, r1 -_081DD1FC: - ldrsbne r0, [r3, lr]! - ldrsb r1, [r3, 0x1]! - sub r1, r1, r0 -_081DD208: - adds r5, r5, 0x40000000 - bcc _081DD1BC - str r7, [r5, 0x630] - str r6, [r5], 0x4 - subs r8, r8, 0x4 - bgt _081DD1B4 - sub r3, r3, 0x1 - pop {r4,r12} -_081DD228: - str r9, [r4, o_SoundChannel_fw] -_081DD22C: - str r2, [r4, o_SoundChannel_ct] - str r3, [r4, o_SoundChannel_cp] -_081DD234: - ldr r8, [sp] - add r0, pc, 0x1 - bx r0 - .thumb -_081DD240: - ldr r0, [sp, 0x4] - subs r0, 1 - ble _081DD24A - adds r4, SoundChannel_size - b SoundMainRAM_ChanLoop -_081DD24A: - ldr r0, [sp, 0x18] - ldr r3, =ID_NUMBER - str r3, [r0] - add sp, 0x1C - pop {r0-r7} - mov r8, r0 - mov r9, r1 - mov r10, r2 - mov r11, r3 - pop {r3} -_081DD25E: - bx r3 - .pool - thumb_func_end SoundMainRAM - - arm_func_start sub_81DC460 -sub_81DC460: - ldr r6, [r4, o_SoundChannel_wav] - ldrb r0, [r4, o_SoundChannel_status] - tst r0, 0x20 - bne _081DD2B4 - orr r0, r0, 0x20 - strb r0, [r4, o_SoundChannel_status] - ldrb r0, [r4, o_SoundChannel_type] - tst r0, 0x10 - beq _081DD29C - ldr r1, [r6, 0xC] - add r1, r1, r6, lsl 1 - add r1, r1, 0x20 - sub r3, r1, r3 - str r3, [r4, o_SoundChannel_cp] -_081DD29C: - ldrh r0, [r6] - cmp r0, 0 - beq _081DD2B4 - sub r3, r3, r6 - sub r3, r3, 0x10 - str r3, [r4, o_SoundChannel_cp] -_081DD2B4: - push {r8,r12,lr} - mov r10, r10, lsl 16 - mov r11, r11, lsl 16 - ldr r1, [r4, o_SoundChannel_freq] - ldrb r0, [r4, o_SoundChannel_type] - tst r0, 0x8 - movne r8, 0x800000 - muleq r8, r12, r1 - ldrh r0, [r6] - cmp r0, 0 - beq _081DD468 - mov r0, 0xFF000000 - str r0, [r4, o_SoundChannel_xpi] - ldrb r0, [r4, o_SoundChannel_type] - tst r0, 0x10 - bne _081DD3C0 - bl sub_81DC71C - mov r0, r1 - add r3, r3, 0x1 - bl sub_81DC71C - sub r1, r1, r0 -_081DD308: - ldr r6, [r5] - ldr r7, [r5, 0x630] -_081DD310: - mul lr, r9, r1 - add lr, r0, lr, asr 23 - mul r12, r10, lr - bic r12, r12, 0xFF0000 - add r6, r12, r6, ror 8 - mul r12, r11, lr - bic r12, r12, 0xFF0000 - add r7, r12, r7, ror 8 - add r9, r9, r8 - movs lr, r9, lsr 23 - beq _081DD370 - bic r9, r9, 0x3F800000 - subs r2, r2, lr - ble _081DD398 - subs lr, lr, 0x1 - bne _081DD358 - add r0, r0, r1 - b _081DD364 -_081DD358: - add r3, r3, lr - bl sub_81DC71C - mov r0, r1 -_081DD364: - add r3, r3, 0x1 - bl sub_81DC71C - sub r1, r1, r0 -_081DD370: - adds r5, r5, 0x40000000 - bcc _081DD310 - str r7, [r5, 0x630] - str r6, [r5], 0x4 - ldr r6, [sp] - subs r6, r6, 0x4 - str r6, [sp] - bgt _081DD308 - sub r3, r3, 0x1 - b _081DD4F0 -_081DD398: - ldr r0, [sp, 0x1C] - cmp r0, 0 - beq _081DD4F4 - ldr r3, [r4, o_SoundChannel_wav] - ldr r3, [r3, 0x8] - rsb lr, r2, 0 -_081DD3B0: - adds r2, r2, r0 - bgt _081DD358 - sub lr, lr, r0 - b _081DD3B0 -_081DD3C0: - sub r3, r3, 0x1 - bl sub_81DC71C - mov r0, r1 - sub r3, r3, 0x1 - bl sub_81DC71C - sub r1, r1, r0 -_081DD3D8: - ldr r6, [r5] - ldr r7, [r5, 0x630] -_081DD3E0: - mul lr, r9, r1 - add lr, r0, lr, asr 23 - mul r12, r10, lr - bic r12, r12, 0xFF0000 - add r6, r12, r6, ror 8 - mul r12, r11, lr - bic r12, r12, 0xFF0000 - add r7, r12, r7, ror 8 - add r9, r9, r8 - movs lr, r9, lsr 23 - beq _081DD440 - bic r9, r9, 0x3F800000 - subs r2, r2, lr - ble _081DD4F4 - subs lr, lr, 0x1 - bne _081DD428 - add r0, r0, r1 - b _081DD434 -_081DD428: - sub r3, r3, lr - bl sub_81DC71C - mov r0, r1 -_081DD434: - sub r3, r3, 0x1 - bl sub_81DC71C - sub r1, r1, r0 -_081DD440: - adds r5, r5, 0x40000000 - bcc _081DD3E0 - str r7, [r5, 0x630] - str r6, [r5], 0x4 - ldr r6, [sp] - subs r6, r6, 0x4 - str r6, [sp] - bgt _081DD3D8 - add r3, r3, 0x2 - b _081DD4F0 -_081DD468: - ldrb r0, [r4, o_SoundChannel_type] - tst r0, 0x10 - beq _081DD4F0 - ldrsb r0, [r3, -0x1]! - ldrsb r1, [r3, -0x1] - sub r1, r1, r0 -_081DD480: - ldr r6, [r5] - ldr r7, [r5, 0x630] -_081DD488: - mul lr, r9, r1 - add lr, r0, lr, asr 23 - mul r12, r10, lr - bic r12, r12, 0xFF0000 - add r6, r12, r6, ror 8 - mul r12, r11, lr - bic r12, r12, 0xFF0000 - add r7, r12, r7, ror 8 - add r9, r9, r8 - movs lr, r9, lsr 23 - beq _081DD4CC - bic r9, r9, 0x3F800000 - subs r2, r2, lr - ble _081DD4F4 - ldrsb r0, [r3, -lr]! - ldrsb r1, [r3, -0x1] - sub r1, r1, r0 -_081DD4CC: - adds r5, r5, 0x40000000 - bcc _081DD488 - str r7, [r5, 0x630] - str r6, [r5], 0x4 - ldr r6, [sp] - subs r6, r6, 0x4 - str r6, [sp] - bgt _081DD480 - add r3, r3, 0x1 -_081DD4F0: - pop {r8,r12,pc} -_081DD4F4: - mov r2, 0 - strb r2, [r4, o_SoundChannel_status] - mov r0, r5, lsr 30 - bic r5, r5, 0xC0000000 - rsb r0, r0, 0x3 - mov r0, r0, lsl 3 - mov r6, r6, ror r0 - mov r7, r7, ror r0 - str r7, [r5, 0x630] - str r6, [r5], 0x4 - pop {r8,r12,pc} - arm_func_end sub_81DC460 - - arm_func_start sub_81DC71C -sub_81DC71C: - push {r0,r2,r5-r7,lr} - mov r0, r3, lsr 6 - ldr r1, [r4, o_SoundChannel_xpi] - cmp r0, r1 - beq _081DD594 - str r0, [r4, o_SoundChannel_xpi] - mov r1, 0x21 - mul r2, r1, r0 - ldr r1, [r4, o_SoundChannel_wav] - add r2, r2, r1 - add r2, r2, 0x10 - ldr r5, =gUnknown_030007B8 - ldr r6, =gDeltaEncodingTable - mov r7, 0x40 - ldrb lr, [r2], 1 - strb lr, [r5], 1 - ldrb r1, [r2], 1 - b _081DD57C -_081DD568: - ldrb r1, [r2], 1 - mov r0, r1, lsr 4 - ldrsb r0, [r6, r0] - add lr, lr, r0 - strb lr, [r5], 1 -_081DD57C: - and r0, r1, 0xF - ldrsb r0, [r6, r0] - add lr, lr, r0 - strb lr, [r5], 1 - subs r7, r7, 2 - bgt _081DD568 -_081DD594: - ldr r5, =gUnknown_030007B8 - and r0, r3, 0x3F - ldrsb r1, [r5, r0] - pop {r0,r2,r5-r7,pc} - .pool - arm_func_end sub_81DC71C - - thumb_func_start SoundMainBTM -SoundMainBTM: - mov r12, r4 - movs r1, 0 - movs r2, 0 - movs r3, 0 - movs r4, 0 - stm r0!, {r1-r4} - stm r0!, {r1-r4} - stm r0!, {r1-r4} - stm r0!, {r1-r4} - mov r4, r12 - bx lr - thumb_func_end SoundMainBTM - - thumb_func_start RealClearChain -RealClearChain: - ldr r3, [r0, 0x2C] - cmp r3, 0 - beq _081DD5E2 - ldr r1, [r0, 0x34] - ldr r2, [r0, 0x30] - cmp r2, 0 - beq _081DD5D6 - str r1, [r2, 0x34] - b _081DD5D8 -_081DD5D6: - str r1, [r3, 0x20] -_081DD5D8: - cmp r1, 0 - beq _081DD5DE - str r2, [r1, 0x30] -_081DD5DE: - movs r1, 0 - str r1, [r0, 0x2C] -_081DD5E2: - bx lr - thumb_func_end RealClearChain - - thumb_func_start ply_fine -ply_fine: - push {r4,r5,lr} - adds r5, r1, 0 - ldr r4, [r5, o_MusicPlayerTrack_chan] - cmp r4, 0 - beq ply_fine_done -ply_fine_loop: - ldrb r1, [r4] - movs r0, 0xC7 - tst r0, r1 - beq ply_fine_ok - movs r0, 0x40 - orrs r1, r0 - strb r1, [r4] -ply_fine_ok: - adds r0, r4, 0 - bl RealClearChain - ldr r4, [r4, 0x34] - cmp r4, 0 - bne ply_fine_loop -ply_fine_done: - movs r0, 0 - strb r0, [r5] - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end ply_fine - - thumb_func_start MPlayJumpTableCopy -MPlayJumpTableCopy: - mov r12, lr - movs r1, 0x24 - ldr r2, lt_MPlayJumpTableTemplate -MPlayJumpTableCopy_Loop: - ldr r3, [r2] - bl chk_adr_r2 - stm r0!, {r3} - adds r2, 0x4 - subs r1, 0x1 - bgt MPlayJumpTableCopy_Loop - bx r12 - thumb_func_end MPlayJumpTableCopy - - .align 2, 0 - .thumb_func -ldrb_r3_r2: - ldrb r3, [r2] - -@ This attempts to protect against reading anything from the BIOS ROM -@ besides the jump table template. -@ It assumes that the jump table template is located at the end of the ROM. - .thumb_func -chk_adr_r2: - push {r0} - lsrs r0, r2, 25 - bne chk_adr_r2_done @ if adr >= 0x2000000 (i.e. not in BIOS ROM), accept it - ldr r0, lt_MPlayJumpTableTemplate - cmp r2, r0 - blo chk_adr_r2_reject @ if adr < gMPlayJumpTableTemplate, reject it - lsrs r0, r2, 14 - beq chk_adr_r2_done @ if adr < 0x40000 (i.e. in BIOS ROM), accept it -chk_adr_r2_reject: - movs r3, 0 -chk_adr_r2_done: - pop {r0} - bx lr - - .align 2, 0 -lt_MPlayJumpTableTemplate: .word gMPlayJumpTableTemplate - - thumb_func_start ld_r3_tp_adr_i -ld_r3_tp_adr_i: - ldr r2, [r1, 0x40] -_081DD64A: - adds r3, r2, 0x1 - str r3, [r1, 0x40] - ldrb r3, [r2] - b chk_adr_r2 - thumb_func_end ld_r3_tp_adr_i - - thumb_func_start ply_goto -ply_goto: - push {lr} -ply_goto_1: - ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] - ldrb r0, [r2, 0x3] - lsls r0, 8 - ldrb r3, [r2, 0x2] - orrs r0, r3 - lsls r0, 8 - ldrb r3, [r2, 0x1] - orrs r0, r3 - lsls r0, 8 - bl ldrb_r3_r2 - orrs r0, r3 - str r0, [r1, o_MusicPlayerTrack_cmdPtr] - pop {r0} - bx r0 - thumb_func_end ply_goto - - thumb_func_start ply_patt -ply_patt: - ldrb r2, [r1, o_MusicPlayerTrack_patternLevel] - cmp r2, 3 - bhs ply_patt_done - lsls r2, 2 - adds r3, r1, r2 - ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] - adds r2, 0x4 - str r2, [r3, o_MusicPlayerTrack_patternStack] - ldrb r2, [r1, o_MusicPlayerTrack_patternLevel] - adds r2, 1 - strb r2, [r1, o_MusicPlayerTrack_patternLevel] - b ply_goto -ply_patt_done: - b ply_fine - thumb_func_end ply_patt - - thumb_func_start ply_pend -ply_pend: - ldrb r2, [r1, o_MusicPlayerTrack_patternLevel] - cmp r2, 0 - beq ply_pend_done - subs r2, 1 - strb r2, [r1, o_MusicPlayerTrack_patternLevel] - lsls r2, 2 - adds r3, r1, r2 - ldr r2, [r3, o_MusicPlayerTrack_patternStack] - str r2, [r1, o_MusicPlayerTrack_cmdPtr] -ply_pend_done: - bx lr - thumb_func_end ply_pend - - thumb_func_start ply_rept -ply_rept: - push {lr} - ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] - ldrb r3, [r2] - cmp r3, 0 - bne ply_rept_1 - adds r2, 1 - str r2, [r1, o_MusicPlayerTrack_cmdPtr] - b ply_goto_1 -ply_rept_1: - ldrb r3, [r1, o_MusicPlayerTrack_repN] - adds r3, 1 - strb r3, [r1, o_MusicPlayerTrack_repN] - mov r12, r3 - bl ld_r3_tp_adr_i - cmp r12, r3 - bhs ply_rept_2 - b ply_goto_1 -ply_rept_2: - movs r3, 0 - strb r3, [r1, o_MusicPlayerTrack_repN] - adds r2, 5 - str r2, [r1, o_MusicPlayerTrack_cmdPtr] - pop {r0} - bx r0 - thumb_func_end ply_rept - - thumb_func_start ply_prio -ply_prio: - mov r12, lr - bl ld_r3_tp_adr_i - strb r3, [r1, o_MusicPlayerTrack_priority] - bx r12 - thumb_func_end ply_prio - - thumb_func_start ply_tempo -ply_tempo: - mov r12, lr - bl ld_r3_tp_adr_i - lsls r3, 1 - strh r3, [r0, o_MusicPlayerInfo_tempoD] - ldrh r2, [r0, o_MusicPlayerInfo_tempoU] - muls r3, r2 - lsrs r3, 8 - strh r3, [r0, o_MusicPlayerInfo_tempoI] - bx r12 - thumb_func_end ply_tempo - - thumb_func_start ply_keysh -ply_keysh: - mov r12, lr - bl ld_r3_tp_adr_i - strb r3, [r1, o_MusicPlayerTrack_keyShift] - ldrb r3, [r1, o_MusicPlayerTrack_flags] - movs r2, 0xC - orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] - bx r12 - thumb_func_end ply_keysh - - thumb_func_start ply_voice -ply_voice: - mov r12, lr - ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] - ldrb r3, [r2] - adds r2, 1 - str r2, [r1, o_MusicPlayerTrack_cmdPtr] - lsls r2, r3, 1 - adds r2, r3 - lsls r2, 2 - ldr r3, [r0, o_MusicPlayerInfo_tone] - adds r2, r3 - ldr r3, [r2] - bl chk_adr_r2 - str r3, [r1, o_MusicPlayerTrack_ToneData_type] - ldr r3, [r2, 0x4] - bl chk_adr_r2 - str r3, [r1, o_MusicPlayerTrack_ToneData_wav] - ldr r3, [r2, 0x8] - bl chk_adr_r2 - str r3, [r1, o_MusicPlayerTrack_ToneData_attack] - bx r12 - thumb_func_end ply_voice - - thumb_func_start ply_vol -ply_vol: - mov r12, lr - bl ld_r3_tp_adr_i - strb r3, [r1, o_MusicPlayerTrack_vol] - ldrb r3, [r1, o_MusicPlayerTrack_flags] - movs r2, 0x3 - orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] - bx r12 - thumb_func_end ply_vol - - thumb_func_start ply_pan -ply_pan: - mov r12, lr - bl ld_r3_tp_adr_i - subs r3, 0x40 - strb r3, [r1, o_MusicPlayerTrack_pan] - ldrb r3, [r1, o_MusicPlayerTrack_flags] - movs r2, 0x3 - orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] - bx r12 - thumb_func_end ply_pan - - thumb_func_start ply_bend -ply_bend: - mov r12, lr - bl ld_r3_tp_adr_i - subs r3, 0x40 - strb r3, [r1, o_MusicPlayerTrack_bend] - ldrb r3, [r1, o_MusicPlayerTrack_flags] - movs r2, 0xC - orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] - bx r12 - thumb_func_end ply_bend - - thumb_func_start ply_bendr -ply_bendr: - mov r12, lr - bl ld_r3_tp_adr_i - strb r3, [r1, o_MusicPlayerTrack_bendRange] - ldrb r3, [r1, o_MusicPlayerTrack_flags] - movs r2, 0xC - orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] - bx r12 - thumb_func_end ply_bendr - - thumb_func_start ply_lfodl -ply_lfodl: - mov r12, lr - bl ld_r3_tp_adr_i - strb r3, [r1, o_MusicPlayerTrack_lfoDelay] - bx r12 - thumb_func_end ply_lfodl - - thumb_func_start ply_modt -ply_modt: - mov r12, lr - bl ld_r3_tp_adr_i - ldrb r0, [r1, o_MusicPlayerTrack_modT] - cmp r0, r3 - beq _081DD7AA - strb r3, [r1, o_MusicPlayerTrack_modT] - ldrb r3, [r1, o_MusicPlayerTrack_flags] - movs r2, 0xF - orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] -_081DD7AA: - bx r12 - thumb_func_end ply_modt - - thumb_func_start ply_tune -ply_tune: - mov r12, lr - bl ld_r3_tp_adr_i - subs r3, 0x40 - strb r3, [r1, o_MusicPlayerTrack_tune] - ldrb r3, [r1, o_MusicPlayerTrack_flags] - movs r2, 0xC - orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] - bx r12 - thumb_func_end ply_tune - - thumb_func_start ply_port -ply_port: - mov r12, lr - ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] - ldrb r3, [r2] - adds r2, 1 - ldr r0, =REG_SOUND1CNT_L @ sound register base address - adds r0, r3 - bl _081DD64A - strb r3, [r0] - bx r12 - .pool - thumb_func_end ply_port - - thumb_func_start m4aSoundVSync -m4aSoundVSync: - ldr r0, lt2_SOUND_INFO_PTR - ldr r0, [r0] - - @ Exit the function if ident is not ID_NUMBER or ID_NUMBER+1. - ldr r2, lt2_ID_NUMBER - ldr r3, [r0, o_SoundInfo_ident] - subs r3, r2 - cmp r3, 1 - bhi m4aSoundVSync_Done - - @ Decrement the PCM DMA counter. If it reaches 0, we need to do a DMA. - ldrb r1, [r0, o_SoundInfo_pcmDmaCounter] - subs r1, 1 - strb r1, [r0, o_SoundInfo_pcmDmaCounter] - bgt m4aSoundVSync_Done - - @ Reload the PCM DMA counter. - ldrb r1, [r0, o_SoundInfo_pcmDmaPeriod] - strb r1, [r0, o_SoundInfo_pcmDmaCounter] - - ldr r2, =REG_DMA1 - - ldr r1, [r2, 0x8] @ DMA1CNT - lsls r1, 7 - bcc m4aSoundVSync_SkipDMA1 @ branch if repeat bit isn't set - - ldr r1, =((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4 - str r1, [r2, 0x8] @ DMA1CNT - -m4aSoundVSync_SkipDMA1: - ldr r1, [r2, 0xC + 0x8] @ DMA2CNT - lsls r1, 7 - bcc m4aSoundVSync_SkipDMA2 @ branch if repeat bit isn't set - - ldr r1, =((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4 - str r1, [r2, 0xC + 0x8] @ DMA2CNT - -m4aSoundVSync_SkipDMA2: - - @ turn off DMA1/DMA2 - movs r1, DMA_32BIT >> 8 - lsls r1, 8 - strh r1, [r2, 0xA] @ DMA1CNT_H - strh r1, [r2, 0xC + 0xA] @ DMA2CNT_H - - @ turn on DMA1/DMA2 direct-sound FIFO mode - movs r1, (DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT) >> 8 - lsls r1, 8 @ LSB is 0, so DMA_SRC_INC is used (destination is always fixed in FIFO mode) - strh r1, [r2, 0xA] @ DMA1CNT_H - strh r1, [r2, 0xC + 0xA] @ DMA2CNT_H - -m4aSoundVSync_Done: - bx lr - - .pool - thumb_func_end m4aSoundVSync - - thumb_func_start MPlayMain -MPlayMain: - ldr r2, lt2_ID_NUMBER - ldr r3, [r0, o_MusicPlayerInfo_ident] - cmp r2, r3 - beq _081DD82E - bx lr -_081DD82E: - adds r3, 0x1 - str r3, [r0, o_MusicPlayerInfo_ident] - push {r0,lr} - ldr r3, [r0, o_MusicPlayerInfo_func] - cmp r3, 0 - beq _081DD840 - ldr r0, [r0, o_MusicPlayerInfo_intp] - bl call_r3 -_081DD840: - pop {r0} - push {r4-r7} - mov r4, r8 - mov r5, r9 - mov r6, r10 - mov r7, r11 - push {r4-r7} - adds r7, r0, 0 - ldr r0, [r7, o_MusicPlayerInfo_status] - cmp r0, 0 - bge _081DD858 - b _081DDA6C -_081DD858: - ldr r0, lt2_SOUND_INFO_PTR - ldr r0, [r0] - mov r8, r0 - adds r0, r7, 0 - bl FadeOutBody - ldr r0, [r7, o_MusicPlayerInfo_status] - cmp r0, 0 - bge _081DD86C - b _081DDA6C -_081DD86C: - ldrh r0, [r7, o_MusicPlayerInfo_tempoC] - ldrh r1, [r7, o_MusicPlayerInfo_tempoI] - adds r0, r1 - b _081DD9BC -_081DD874: - ldrb r6, [r7, o_MusicPlayerInfo_trackCount] - ldr r5, [r7, o_MusicPlayerInfo_tracks] - movs r3, 0x1 - movs r4, 0 -_081DD87C: - ldrb r0, [r5] - movs r1, 0x80 - tst r1, r0 - bne _081DD886 - b _081DD998 -_081DD886: - mov r10, r3 - orrs r4, r3 - mov r11, r4 - ldr r4, [r5, o_MusicPlayerTrack_chan] - cmp r4, 0 - beq _081DD8BA -_081DD892: - ldrb r1, [r4] - movs r0, 0xC7 - tst r0, r1 - beq _081DD8AE - ldrb r0, [r4, 0x10] - cmp r0, 0 - beq _081DD8B4 - subs r0, 0x1 - strb r0, [r4, 0x10] - bne _081DD8B4 - movs r0, 0x40 - orrs r1, r0 - strb r1, [r4] - b _081DD8B4 -_081DD8AE: - adds r0, r4, 0 - bl ClearChain -_081DD8B4: - ldr r4, [r4, 0x34] - cmp r4, 0 - bne _081DD892 -_081DD8BA: - ldrb r3, [r5, o_MusicPlayerTrack_flags] - movs r0, 0x40 - tst r0, r3 - beq _081DD938 - adds r0, r5, 0 - bl Clear64byte - movs r0, 0x80 - strb r0, [r5] - movs r0, 0x2 - strb r0, [r5, o_MusicPlayerTrack_bendRange] - movs r0, 0x40 - strb r0, [r5, o_MusicPlayerTrack_volX] - movs r0, 0x16 - strb r0, [r5, o_MusicPlayerTrack_lfoSpeed] - movs r0, 0x1 - adds r1, r5, 0x6 - strb r0, [r1, o_MusicPlayerTrack_ToneData_type - 0x6] - b _081DD938 -_081DD8E0: - ldr r2, [r5, o_MusicPlayerTrack_cmdPtr] - ldrb r1, [r2] - cmp r1, 0x80 - bhs _081DD8EC - ldrb r1, [r5, o_MusicPlayerTrack_runningStatus] - b _081DD8F6 -_081DD8EC: - adds r2, 0x1 - str r2, [r5, o_MusicPlayerTrack_cmdPtr] - cmp r1, 0xBD - bcc _081DD8F6 - strb r1, [r5, o_MusicPlayerTrack_runningStatus] -_081DD8F6: - cmp r1, 0xCF - bcc _081DD90C - mov r0, r8 - ldr r3, [r0, o_SoundInfo_plynote] - adds r0, r1, 0 - subs r0, 0xCF - adds r1, r7, 0 - adds r2, r5, 0 - bl call_r3 - b _081DD938 -_081DD90C: - cmp r1, 0xB0 - bls _081DD92E - adds r0, r1, 0 - subs r0, 0xB1 - strb r0, [r7, o_MusicPlayerInfo_cmd] - mov r3, r8 - ldr r3, [r3, o_SoundInfo_MPlayJumpTable] - lsls r0, 2 - ldr r3, [r3, r0] - adds r0, r7, 0 - adds r1, r5, 0 - bl call_r3 - ldrb r0, [r5, o_MusicPlayerTrack_flags] - cmp r0, 0 - beq _081DD994 - b _081DD938 -_081DD92E: - ldr r0, lt_gClockTable - subs r1, 0x80 - adds r1, r0 - ldrb r0, [r1] - strb r0, [r5, o_MusicPlayerTrack_wait] -_081DD938: - ldrb r0, [r5, o_MusicPlayerTrack_wait] - cmp r0, 0 - beq _081DD8E0 - subs r0, 0x1 - strb r0, [r5, o_MusicPlayerTrack_wait] - ldrb r1, [r5, o_MusicPlayerTrack_lfoSpeed] - cmp r1, 0 - beq _081DD994 - ldrb r0, [r5, o_MusicPlayerTrack_mod] - cmp r0, 0 - beq _081DD994 - ldrb r0, [r5, o_MusicPlayerTrack_lfoDelayC] - cmp r0, 0 - beq _081DD95A - subs r0, 0x1 - strb r0, [r5, o_MusicPlayerTrack_lfoDelayC] - b _081DD994 -_081DD95A: - ldrb r0, [r5, o_MusicPlayerTrack_lfoSpeedC] - adds r0, r1 - strb r0, [r5, o_MusicPlayerTrack_lfoSpeedC] - adds r1, r0, 0 - subs r0, 0x40 - lsls r0, 24 - bpl _081DD96E - lsls r2, r1, 24 - asrs r2, 24 - b _081DD972 -_081DD96E: - movs r0, 0x80 - subs r2, r0, r1 -_081DD972: - ldrb r0, [r5, o_MusicPlayerTrack_mod] - muls r0, r2 - asrs r2, r0, 6 - ldrb r0, [r5, o_MusicPlayerTrack_modM] - eors r0, r2 - lsls r0, 24 - beq _081DD994 - strb r2, [r5, o_MusicPlayerTrack_modM] - ldrb r0, [r5] - ldrb r1, [r5, o_MusicPlayerTrack_modT] - cmp r1, 0 - bne _081DD98E - movs r1, 0xC - b _081DD990 -_081DD98E: - movs r1, 0x3 -_081DD990: - orrs r0, r1 - strb r0, [r5, o_MusicPlayerTrack_flags] -_081DD994: - mov r3, r10 - mov r4, r11 -_081DD998: - subs r6, 0x1 - ble _081DD9A4 - movs r0, 0x50 - adds r5, r0 - lsls r3, 1 - b _081DD87C -_081DD9A4: - ldr r0, [r7, o_MusicPlayerInfo_clock] - adds r0, 0x1 - str r0, [r7, o_MusicPlayerInfo_clock] - cmp r4, 0 - bne _081DD9B6 - movs r0, 0x80 - lsls r0, 24 - str r0, [r7, o_MusicPlayerInfo_status] - b _081DDA6C -_081DD9B6: - str r4, [r7, o_MusicPlayerInfo_status] - ldrh r0, [r7, o_MusicPlayerInfo_tempoC] - subs r0, 0x96 -_081DD9BC: - strh r0, [r7, o_MusicPlayerInfo_tempoC] - cmp r0, 0x96 - bcc _081DD9C4 - b _081DD874 -_081DD9C4: - ldrb r2, [r7, o_MusicPlayerInfo_trackCount] - ldr r5, [r7, o_MusicPlayerInfo_tracks] -_081DD9C8: - ldrb r0, [r5, o_MusicPlayerTrack_flags] - movs r1, 0x80 - tst r1, r0 - beq _081DDA62 - movs r1, 0xF - tst r1, r0 - beq _081DDA62 - mov r9, r2 - adds r0, r7, 0 - adds r1, r5, 0 - bl TrkVolPitSet - ldr r4, [r5, o_MusicPlayerTrack_chan] - cmp r4, 0 - beq _081DDA58 -_081DD9E6: - ldrb r1, [r4, o_SoundChannel_status] - movs r0, 0xC7 - tst r0, r1 - bne _081DD9F6 - adds r0, r4, 0 - bl ClearChain - b _081DDA52 -_081DD9F6: - ldrb r0, [r4, o_SoundChannel_type] - movs r6, 0x7 - ands r6, r0 - ldrb r3, [r5, o_MusicPlayerTrack_flags] - movs r0, 0x3 - tst r0, r3 - beq _081DDA14 - bl ChnVolSetAsm - cmp r6, 0 - beq _081DDA14 - ldrb r0, [r4, o_CgbChannel_mo] - movs r1, 0x1 - orrs r0, r1 - strb r0, [r4, o_CgbChannel_mo] -_081DDA14: - ldrb r3, [r5, o_MusicPlayerTrack_flags] - movs r0, 0xC - tst r0, r3 - beq _081DDA52 - ldrb r1, [r4, o_SoundChannel_ky] - movs r0, 0x8 - ldrsb r0, [r5, r0] - adds r2, r1, r0 - bpl _081DDA28 - movs r2, 0 -_081DDA28: - cmp r6, 0 - beq _081DDA46 - mov r0, r8 - ldr r3, [r0, o_SoundInfo_MidiKeyToCgbFreq] - adds r1, r2, 0 - ldrb r2, [r5, o_MusicPlayerTrack_pitM] - adds r0, r6, 0 - bl call_r3 - str r0, [r4, o_CgbChannel_fr] - ldrb r0, [r4, o_CgbChannel_mo] - movs r1, 0x2 - orrs r0, r1 - strb r0, [r4, o_CgbChannel_mo] - b _081DDA52 -_081DDA46: - adds r1, r2, 0 - ldrb r2, [r5, o_MusicPlayerTrack_pitM] - ldr r0, [r4, o_SoundChannel_wav] - bl MidiKeyToFreq - str r0, [r4, o_SoundChannel_freq] -_081DDA52: - ldr r4, [r4, o_SoundChannel_np] - cmp r4, 0 - bne _081DD9E6 -_081DDA58: - ldrb r0, [r5, o_MusicPlayerTrack_flags] - movs r1, 0xF0 - ands r0, r1 - strb r0, [r5, o_MusicPlayerTrack_flags] - mov r2, r9 -_081DDA62: - subs r2, 0x1 - ble _081DDA6C - movs r0, 0x50 - adds r5, r0 - bgt _081DD9C8 -_081DDA6C: - ldr r0, lt2_ID_NUMBER - str r0, [r7, o_MusicPlayerInfo_ident] - pop {r0-r7} - mov r8, r0 - mov r9, r1 - mov r10, r2 - mov r11, r3 - pop {r3} - -call_r3: - bx r3 - - .align 2, 0 -lt_gClockTable: .word gClockTable -lt2_SOUND_INFO_PTR: .word SOUND_INFO_PTR -lt2_ID_NUMBER: .word ID_NUMBER - thumb_func_end MPlayMain - - thumb_func_start TrackStop -TrackStop: - push {r4-r6,lr} - adds r5, r1, 0 - ldrb r1, [r5, o_MusicPlayerTrack_flags] - movs r0, 0x80 - tst r0, r1 - beq TrackStop_Done - ldr r4, [r5, o_MusicPlayerTrack_chan] - cmp r4, 0 - beq TrackStop_3 - movs r6, 0 -TrackStop_Loop: - ldrb r0, [r4, o_SoundChannel_status] - cmp r0, 0 - beq TrackStop_2 - ldrb r0, [r4, o_SoundChannel_type] - movs r3, 0x7 - ands r0, r3 - beq TrackStop_1 - ldr r3, =SOUND_INFO_PTR - ldr r3, [r3] - ldr r3, [r3, o_SoundInfo_CgbOscOff] - bl call_r3 -TrackStop_1: - strb r6, [r4, o_SoundChannel_status] -TrackStop_2: - str r6, [r4, o_SoundChannel_track] - ldr r4, [r4, o_SoundChannel_np] - cmp r4, 0 - bne TrackStop_Loop -TrackStop_3: - str r4, [r5, o_MusicPlayerTrack_chan] -TrackStop_Done: - pop {r4-r6} - pop {r0} - bx r0 - .pool - thumb_func_end TrackStop - - thumb_func_start ChnVolSetAsm -ChnVolSetAsm: - ldrb r1, [r4, 0x12] - movs r0, 0x14 - ldrsb r2, [r4, r0] - movs r3, 0x80 - adds r3, r2 - muls r3, r1 - ldrb r0, [r5, 0x10] - muls r0, r3 - asrs r0, 14 - cmp r0, 0xFF - bls _081DDAE8 - movs r0, 0xFF -_081DDAE8: - strb r0, [r4, 0x2] - movs r3, 0x7F - subs r3, r2 - muls r3, r1 - ldrb r0, [r5, 0x11] - muls r0, r3 - asrs r0, 14 - cmp r0, 0xFF - bls _081DDAFC - movs r0, 0xFF -_081DDAFC: - strb r0, [r4, 0x3] - bx lr - thumb_func_end ChnVolSetAsm - - thumb_func_start ply_note -ply_note: - push {r4-r7,lr} - mov r4, r8 - mov r5, r9 - mov r6, r10 - mov r7, r11 - push {r4-r7} - sub sp, 0x18 - str r1, [sp] - adds r5, r2, 0 - ldr r1, =SOUND_INFO_PTR - ldr r1, [r1] - str r1, [sp, 0x4] - ldr r1, =gClockTable - adds r0, r1 - ldrb r0, [r0] - strb r0, [r5, o_MusicPlayerTrack_gateTime] - ldr r3, [r5, o_MusicPlayerTrack_cmdPtr] - ldrb r0, [r3] - cmp r0, 0x80 - bhs _081DDB46 - strb r0, [r5, o_MusicPlayerTrack_key] - adds r3, 0x1 - ldrb r0, [r3] - cmp r0, 0x80 - bhs _081DDB44 - strb r0, [r5, o_MusicPlayerTrack_velocity] - adds r3, 0x1 - ldrb r0, [r3] - cmp r0, 0x80 - bhs _081DDB44 - ldrb r1, [r5, o_MusicPlayerTrack_gateTime] - adds r1, r0 - strb r1, [r5, o_MusicPlayerTrack_gateTime] - adds r3, 0x1 -_081DDB44: - str r3, [r5, o_MusicPlayerTrack_cmdPtr] -_081DDB46: - movs r0, 0 - str r0, [sp, 0x14] - adds r4, r5, 0 - adds r4, o_MusicPlayerTrack_ToneData_type - ldrb r2, [r4] - movs r0, TONEDATA_TYPE_RHY | TONEDATA_TYPE_SPL - tst r0, r2 - beq _081DDB98 - ldrb r3, [r5, o_MusicPlayerTrack_key] - movs r0, TONEDATA_TYPE_SPL - tst r0, r2 - beq _081DDB66 - ldr r1, [r5, o_MusicPlayerTrack_ToneData_keySplitTable] - adds r1, r3 - ldrb r0, [r1] - b _081DDB68 -_081DDB66: - adds r0, r3, 0 -_081DDB68: - lsls r1, r0, 1 - adds r1, r0 - lsls r1, 2 - ldr r0, [r5, o_MusicPlayerTrack_ToneData_wav] - adds r1, r0 - mov r9, r1 - mov r6, r9 - ldrb r1, [r6] - movs r0, 0xC0 - tst r0, r1 - beq _081DDB80 - b _081DDCEA -_081DDB80: - movs r0, 0x80 - tst r0, r2 - beq _081DDB9C - ldrb r1, [r6, 0x3] - movs r0, 0x80 - tst r0, r1 - beq _081DDB94 - subs r1, 0xC0 - lsls r1, 1 - str r1, [sp, 0x14] -_081DDB94: - ldrb r3, [r6, 0x1] - b _081DDB9C -_081DDB98: - mov r9, r4 - ldrb r3, [r5, 0x5] -_081DDB9C: - str r3, [sp, 0x8] - ldr r6, [sp] - ldrb r1, [r6, 0x9] - ldrb r0, [r5, 0x1D] - adds r0, r1 - cmp r0, 0xFF - bls _081DDBAC - movs r0, 0xFF -_081DDBAC: - str r0, [sp, 0x10] - mov r6, r9 - ldrb r0, [r6] - movs r6, 0x7 - ands r6, r0 - str r6, [sp, 0xC] - beq _081DDBEC - ldr r0, [sp, 0x4] - ldr r4, [r0, 0x1C] - cmp r4, 0 - bne _081DDBC4 - b _081DDCEA -_081DDBC4: - subs r6, 0x1 - lsls r0, r6, 6 - adds r4, r0 - ldrb r1, [r4] - movs r0, 0xC7 - tst r0, r1 - beq _081DDC40 - movs r0, 0x40 - tst r0, r1 - bne _081DDC40 - ldrb r1, [r4, 0x13] - ldr r0, [sp, 0x10] - cmp r1, r0 - bcc _081DDC40 - beq _081DDBE4 - b _081DDCEA -_081DDBE4: - ldr r0, [r4, 0x2C] - cmp r0, r5 - bcs _081DDC40 - b _081DDCEA -_081DDBEC: - ldr r6, [sp, 0x10] - adds r7, r5, 0 - movs r2, 0 - mov r8, r2 - ldr r4, [sp, 0x4] - ldrb r3, [r4, 0x6] - adds r4, 0x50 -_081DDBFA: - ldrb r1, [r4] - movs r0, 0xC7 - tst r0, r1 - beq _081DDC40 - movs r0, 0x40 - tst r0, r1 - beq _081DDC14 - cmp r2, 0 - bne _081DDC18 - adds r2, 0x1 - ldrb r6, [r4, 0x13] - ldr r7, [r4, 0x2C] - b _081DDC32 -_081DDC14: - cmp r2, 0 - bne _081DDC34 -_081DDC18: - ldrb r0, [r4, 0x13] - cmp r0, r6 - bcs _081DDC24 - adds r6, r0, 0 - ldr r7, [r4, 0x2C] - b _081DDC32 -_081DDC24: - bhi _081DDC34 - ldr r0, [r4, 0x2C] - cmp r0, r7 - bls _081DDC30 - adds r7, r0, 0 - b _081DDC32 -_081DDC30: - bcc _081DDC34 -_081DDC32: - mov r8, r4 -_081DDC34: - adds r4, 0x40 - subs r3, 0x1 - bgt _081DDBFA - mov r4, r8 - cmp r4, 0 - beq _081DDCEA -_081DDC40: - adds r0, r4, 0 - bl ClearChain - movs r1, 0 - str r1, [r4, 0x30] - ldr r3, [r5, 0x20] - str r3, [r4, 0x34] - cmp r3, 0 - beq _081DDC54 - str r4, [r3, 0x30] -_081DDC54: - str r4, [r5, 0x20] - str r5, [r4, 0x2C] - ldrb r0, [r5, 0x1B] - strb r0, [r5, 0x1C] - cmp r0, r1 - beq _081DDC66 - adds r1, r5, 0 - bl clear_modM -_081DDC66: - ldr r0, [sp] - adds r1, r5, 0 - bl TrkVolPitSet - ldr r0, [r5, 0x4] - str r0, [r4, 0x10] - ldr r0, [sp, 0x10] - strb r0, [r4, 0x13] - ldr r0, [sp, 0x8] - strb r0, [r4, 0x8] - ldr r0, [sp, 0x14] - strb r0, [r4, 0x14] - mov r6, r9 - ldrb r0, [r6] - strb r0, [r4, 0x1] - ldr r7, [r6, 0x4] - str r7, [r4, 0x24] - ldr r0, [r6, 0x8] - str r0, [r4, 0x4] - ldrh r0, [r5, 0x1E] - strh r0, [r4, 0xC] - bl ChnVolSetAsm - ldrb r1, [r4, 0x8] - movs r0, 0x8 - ldrsb r0, [r5, r0] - adds r3, r1, r0 - bpl _081DDCA0 - movs r3, 0 -_081DDCA0: - ldr r6, [sp, 0xC] - cmp r6, 0 - beq _081DDCCE - mov r6, r9 - ldrb r0, [r6, 0x2] - strb r0, [r4, 0x1E] - ldrb r1, [r6, 0x3] - movs r0, 0x80 - tst r0, r1 - bne _081DDCBA - movs r0, 0x70 - tst r0, r1 - bne _081DDCBC -_081DDCBA: - movs r1, 0x8 -_081DDCBC: - strb r1, [r4, 0x1F] - ldrb r2, [r5, 0x9] - adds r1, r3, 0 - ldr r0, [sp, 0xC] - ldr r3, [sp, 0x4] - ldr r3, [r3, 0x30] - bl call_r3 - b _081DDCDC -_081DDCCE: - ldr r0, [r5, o_MusicPlayerTrack_unk_3C] - str r0, [r4, 0x18] - ldrb r2, [r5, 0x9] - adds r1, r3, 0 - adds r0, r7, 0 - bl MidiKeyToFreq -_081DDCDC: - str r0, [r4, 0x20] - movs r0, 0x80 - strb r0, [r4] - ldrb r1, [r5] - movs r0, 0xF0 - ands r0, r1 - strb r0, [r5] -_081DDCEA: - add sp, 0x18 - pop {r0-r7} - mov r8, r0 - mov r9, r1 - mov r10, r2 - mov r11, r3 - pop {r0} - bx r0 - .pool - thumb_func_end ply_note - - thumb_func_start ply_endtie -ply_endtie: - push {r4,r5} - ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] - ldrb r3, [r2] - cmp r3, 0x80 - bhs _081DDD16 - strb r3, [r1, o_MusicPlayerTrack_key] - adds r2, 0x1 - str r2, [r1, o_MusicPlayerTrack_cmdPtr] - b _081DDD18 -_081DDD16: - ldrb r3, [r1, o_MusicPlayerTrack_key] -_081DDD18: - ldr r1, [r1, o_MusicPlayerTrack_chan] - cmp r1, 0 - beq _081DDD40 - movs r4, 0x83 - movs r5, 0x40 -_081DDD22: - ldrb r2, [r1, o_SoundChannel_status] - tst r2, r4 - beq _081DDD3A - tst r2, r5 - bne _081DDD3A - ldrb r0, [r1, o_SoundChannel_mk] - cmp r0, r3 - bne _081DDD3A - movs r0, 0x40 - orrs r2, r0 - strb r2, [r1, o_SoundChannel_status] - b _081DDD40 -_081DDD3A: - ldr r1, [r1, o_SoundChannel_np] - cmp r1, 0 - bne _081DDD22 -_081DDD40: - pop {r4,r5} - bx lr - thumb_func_end ply_endtie - - thumb_func_start clear_modM -clear_modM: - movs r2, 0 - strb r2, [r1, o_MusicPlayerTrack_modM] - strb r2, [r1, o_MusicPlayerTrack_lfoSpeedC] - ldrb r2, [r1, o_MusicPlayerTrack_modT] - cmp r2, 0 - bne _081DDD54 - movs r2, 0xC - b _081DDD56 -_081DDD54: - movs r2, 0x3 -_081DDD56: - ldrb r3, [r1, o_MusicPlayerTrack_flags] - orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] - bx lr - thumb_func_end clear_modM - - thumb_func_start ld_r3_tp_adr_i -ld_r3_tp_adr_i_unchecked: - ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] - adds r3, r2, 1 - str r3, [r1, o_MusicPlayerTrack_cmdPtr] - ldrb r3, [r2] - bx lr - thumb_func_end ld_r3_tp_adr_i - - thumb_func_start ply_lfos -ply_lfos: - mov r12, lr - bl ld_r3_tp_adr_i_unchecked - strb r3, [r1, o_MusicPlayerTrack_lfoSpeed] - cmp r3, 0 - bne _081DDD7C - bl clear_modM -_081DDD7C: - bx r12 - thumb_func_end ply_lfos - - thumb_func_start ply_mod -ply_mod: - mov r12, lr - bl ld_r3_tp_adr_i_unchecked - strb r3, [r1, o_MusicPlayerTrack_mod] - cmp r3, 0 - bne _081DDD90 - bl clear_modM -_081DDD90: - bx r12 - thumb_func_end ply_mod - - .align 2, 0 @ Don't pad with nop. - - .bss - .align 3 -gUnknown_030007B8: - .space 0x40 - .size gUnknown_030007B8, .-gUnknown_030007B8 - - .global gMPlayTrack_BGM -gMPlayTrack_BGM: - .space 0x320 - .size gMPlayTrack_BGM, .-gMPlayTrack_BGM - - .global gMPlayTrack_SE1 -gMPlayTrack_SE1: - .space 0xF0 - .size gMPlayTrack_SE1, .-gMPlayTrack_SE1 - - .global gMPlayTrack_SE2 -gMPlayTrack_SE2: - .space 0x2D0 - .size gMPlayTrack_SE2, .-gMPlayTrack_SE2 - - .global gMPlayTrack_SE3 -gMPlayTrack_SE3: - .space 0x50 - .size gMPlayTrack_SE3, .-gMPlayTrack_SE3 |