;;; ;;; ;; Parameters: ;; r0: Sound effect 0800270C (T) push r14 0800270E (T) lsl r0,r0,10h 08002710 (T) ldr r3,=80A8CDCh ;\ 08002712 (T) ldr r1,=80A8D3Ch ;| 08002714 (T) lsr r0,r0,0Dh ;| 08002716 (T) add r0,r0,r1 ;| 08002718 (T) ldrh r2,[r0,4h] ;| 0800271A (T) lsl r1,r2,1h ;} r1 parameter = [80A8D3C[r0 parameter]] 0800271C (T) add r1,r1,r2 ;} r0 parameter = [80A8CDC[[80A8D40[r0 parameter]]] 0800271E (T) lsl r1,r1,2h ;| 08002720 (T) add r1,r1,r3 ;| 08002722 (T) ldr r2,[r1] ;| 08002724 (T) ldr r1,[r0] ;| 08002726 (T) mov r0,r2 ;/ 08002728 (T) bl 80045A8h ; Execute subroutine 80045A8h 0800272C (T) pop r0 0800272E (T) bx r0 08002730 dd 0080A8CDCh,0080A8D3Ch ;;; ;;; ;; Parameters: ;; r0: ;; r1: 080045A8 (T) push r4-r7,r14 080045AA (T) add sp,-4h 080045AC (T) mov r4,r0 ; r4 = r0 parameter 080045AE (T) mov r5,r1 ; r5 = r1 parameter 080045B0 (T) ldrb r6,[r4,1Ch] ;\ 080045B2 (T) cmp r6,0h ;} If [r0 parameter + 1Ch] != 0: return 080045B4 (T) bne 800465Ch ;/ 080045B6 (T) mov r6,1h ;\ 080045B8 (T) strb r6,[r4,1Ch] ;} r0 parameter + 1Ch = 1 (initialisation) 080045BA (T) ldrb r6,[r4,1Eh] ;\ 080045BC (T) mov r7,1h ;} If r0 parameter + 1Eh has 1: 080045BE (T) and r6,r7 ;} Clear r0 parameter + 1Eh and return 080045C0 (T) bne 8004658h ;/ 080045C2 (T) ldr r6,[r5] ; r6 = [r1 parameter] 080045C4 (T) lsl r2,r6,18h ;\ 080045C6 (T) lsr r2,r2,18h ;} If [r1 parameter]: 080045C8 (T) bne 80045D4h ;/ 080045CA (T) bl 80046E8h ; Execute subroutine 80046E8h (same r0 parameter) 080045CE (T) mov r2,0h ;\ 080045D0 (T) strb r2,[r4] ;} Clear r0 parameter 080045D2 (T) b 8004658h ; Clear r0 parameter + 1Eh and return 080045D4 (T) ldr r7,[r4] ; r7 = [r0 parameter] 080045D6 (T) mov r3,2h ;\ 080045D8 (T) lsl r2,r7,18h ;| 080045DA (T) lsr r2,r2,18h ;} If [r0 parameter] has 2: branch to 80045FAh 080045DC (T) and r3,r2 ;| 080045DE (T) beq 80045FAh ;/ 080045E0 (T) mov r3,1Dh ;\ 080045E2 (T) ldrb r3,[r4,r3] ;| 080045E4 (T) cmp r3,0h ;} If [r0 parameter + 1Dh]: 080045E6 (T) beq 80045F4h ;/ 080045E8 (T) lsl r1,r6,8h ;\ 080045EA (T) lsr r1,r1,18h ;| 080045EC (T) lsr r2,r7,18h ;} If [r0 parameter] > [r1 parameter + 2] 080045EE (T) cmp r2,r1 ;| 080045F0 (T) ble 80045F4h ;/ 080045F2 (T) b 8004658h ; Clear r0 parameter + 1Eh and return 080045F4 (T) mov r0,r4 ; r0 parameter = r0 parameter 080045F6 (T) bl 80046E8h ; Execute subroutine 80046E8h 080045FA (T) mov r3,2h ;\ 080045FC (T) lsl r2,r6,8h ;| 080045FE (T) orr r2,r3 ;} (r0 parameter) = [r1 parameter] | 2 08004600 (T) ldr r0,[r5,4h] ;} r0 parameter + 14h = [r1 parameter + 4] 08004602 (T) str r2,[r4] ;| 08004604 (T) str r0,[r4,14h] ;/ 08004606 (T) str r5,[r4,10h] ; r0 parameter + 10h = r1 parameter 08004608 (T) lsl r3,r3,7h ;\ 0800460A (T) strh r3,[r4,0Ch] ;} r0 parameter + Ch = 100h 0800460C (T) lsr r2,r6,1Fh ;\ 0800460E (T) beq 8004616h ;} If [r1 parameter + 3] negative: 08004610 (T) lsr r0,r6,18h ; r0 parameter = [r1 parameter + 3] 08004612 (T) bl SetSoundOptions ; Execute subroutine SetSoundOptions (30019D4 = r0 parameter & 0x7F) 08004616 (T) lsl r6,r6,18h 08004618 (T) lsr r6,r6,18h 0800461A (T) ldr r7,[r4,18h] ; r7 = [r0 parameter + 18h] 0800461C (T) mov r0,10h ;\ 0800461E (T) str r0,[sp] ;} sp0 parameter = 10h 08004620 (T) mov r0,3h ; r0 parameter = 3 08004622 (T) mov r1,0h ; r1 parameter = 0 08004624 (T) mov r2,r7 ; r2 parameter = [r0 parameter + 18h] 08004626 (T) mov r3,50h ;\ 08004628 (T) mul r3,r6 ;} r3 parameter = [r1 parameter] * 50h 0800462A (T) bl FillDMA ; Execute subroutine FillDMA (clear [r1 parameter] * 50h words, at [r0 parameter + 18h], using DMA3) 0800462E (T) mov r0,1h ; r0 = 1 08004630 (T) mov r2,40h ;\ 08004632 (T) lsl r1,r2,10h ;| 08004634 (T) lsl r2,r2,8h ;} r1 = 404000h 08004636 (T) orr r1,r2 ;/ 08004638 (T) mov r3,0Ch ;\ 0800463A (T) lsl r3,r3,8h ;| 0800463C (T) mov r2,2h ;} r2 = C02h 0800463E (T) orr r2,r3 ;/ 08004640 (T) add r5,8h ; r5 = r1 parameter + 8 08004642 (T) b 800464Ch ; Branch to 800464Ch 08004644 (T) sub r6,1h ; --r6 08004646 (T) beq 8004658h ; If not r6: clear r0 parameter + 1Eh and return 08004648 (T) add r7,50h ; r7 += 50h 0800464A (T) add r5,4h ; r5 += 4 0800464C (T) ldr r3,[r5] ; r3 = [r1 parameter + 8 + 4*i] 0800464E (T) strb r0,[r7] ; [r0 parameter + 18h + 50h*i] = 1 08004650 (T) strh r2,[r7,1Ah] ; [r0 parameter + 18h + 50h*i] + 1Ah = C02h 08004652 (T) str r1,[r7,4h] ; [r0 parameter + 18h + 50h*i] + 4 = 404000h 08004654 (T) str r3,[r7,24h] ; [r0 parameter + 18h + 50h*i] + 24h = [r1 parameter + 8 + 4*i] 08004656 (T) b 8004644h ; Branch to 8004644h 08004658 (T) mov r6,0h ;\ 0800465A (T) strb r6,[r4,1Ch] ;} Clear r0 parameter + 1Eh 0800465C (T) add sp,4h 0800465E (T) pop r4-r7 08004660 (T) pop r0 08004662 (T) bx r0 ;;; ;;; ;; Parameters: ;; r0: 080046E8 (T) push r4-r7,r14 080046EA (T) mov r7,r0 ; r7 = r0 parameter 080046EC (T) ldrb r6,[r7,1Eh] ; r6 = [r0 parameter + 1Eh] 080046EE (T) mov r5,1h ;\ 080046F0 (T) and r5,r6 ;} If [r0 parameter + 1Eh] has 1: return 080046F2 (T) bne 8004756h ;/ 080046F4 (T) ldrb r4,[r7] ;\ 080046F6 (T) mov r5,2h ;| 080046F8 (T) and r4,r5 ;} If [r0 parameter] hasn't 2: return 080046FA (T) beq 8004756h ;/ 080046FC (T) mov r4,1h ;\ 080046FE (T) strb r4,[r7] ;} (r0 parameter) = 1 08004700 (T) mov r4,0h ;\ 08004702 (T) strb r4,[r7,2h] ;} r0 parameter + 2 = 0 08004704 (T) mov r4,2h ;\ 08004706 (T) and r4,r6 ;} If [r0 parameter + 1Eh] has 2: 08004708 (T) beq 8004710h ;/ 0800470A (T) mov r4,0FDh ;\ 0800470C (T) and r4,r6 ;} Mask r0 parameter + 1Eh by FDh 0800470E (T) strb r4,[r7,1Eh] ;/ 08004710 (T) ldrb r6,[r7,1h] ; r6 = [r0 parameter + 1] 08004712 (T) ldr r5,[r7,18h] ; r5 = [r0 parameter + 18h] 08004714 (T) b 800471Ch ; Branch to 800471Ch 08004716 (T) sub r6,1h ; --r6 08004718 (T) beq 8004756h ; If not r6: return 0800471A (T) add r5,50h ; r5 += 50h 0800471C (T) ldr r4,[r5,4Ch] ; r4 = [[r0 parameter + 18h] + 4Ch + 50h*i] 0800471E (T) cmp r4,0h ;\ 08004720 (T) beq 8004738h ;} If [[r0 parameter + 18h] + 4Ch + 50h*i]: 08004722 (T) mov r3,7h ;\ 08004724 (T) mov r2,34h ;| 08004726 (T) ldrb r1,[r5,r2] ;} r1 parameter = ([[r0 parameter + 18h] + 34h + 50h*i] & 7) - 1 08004728 (T) and r1,r3 ;| 0800472A (T) sub r1,1h ;/ 0800472C (T) mov r0,r4 ; r0 parameter = [[r0 parameter + 18h] + 4Ch + 50h*i] (unused) 0800472E (T) bl 80021F4h ; Execute subroutine ResetSound 08004732 (T) mov r3,0h ;\ 08004734 (T) strb r3,[r4] ;} Clear [[r0 parameter + 18h] + 4Ch + 50h*i] 08004736 (T) str r3,[r4,24h] ; Clear [[r0 parameter + 18h] + 4Ch + 50h*i] + 24h 08004738 (T) ldr r0,[r5,48h] ; r0 = [[r0 parameter + 18h] + 48h + 50h*i] 0800473A (T) mov r1,0h ; Looks like clearing a binary tree 0800473C (T) cmp r0,0h ;\ 0800473E (T) beq 800474Eh ;} If r0: 08004740 (T) ldr r2,[r0,30h] ; r2 = [[[r0 parameter + 18h] + 48h + 50h*i] + 30h] 08004742 (T) strb r1,[r0] ; Clear [[r0 parameter + 18h] + 48h + 50h*i] 08004744 (T) str r1,[r0,28h] ; Clear [[r0 parameter + 18h] + 48h + 50h*i] + 28h 08004746 (T) str r1,[r0,30h] ; Clear [[r0 parameter + 18h] + 48h + 50h*i] + 30h 08004748 (T) str r1,[r0,2Ch] ; Clear [[r0 parameter + 18h] + 48h + 50h*i] + 2Ch 0800474A (T) mov r0,r2 ; r0 = r2 0800474C (T) b 800473Ch ; Branch to 800473Ch 0800474E (T) mov r0,0h 08004750 (T) str r0,[r5,4Ch] ; Clear [[r0 parameter + 18h] + 4Ch + 50h*i] 08004752 (T) str r0,[r5,48h] ; Clear [[r0 parameter + 18h] + 48h + 50h*i] 08004754 (T) b 8004716h ; Branch to 8004716h 08004756 (T) pop r4-r7 08004758 (T) pop r0 0800475A (T) bx r0