ref: 36247945996feb163bc79e5079924ecc90c8baf6
parent: 2cb3f8e1b9e494f01ef2bcb65a0baf463d0efff8
author: yenatch <[email protected]>
date: Wed May 21 12:26:28 EDT 2014
Split bank 0 audio functions into home/audio.asm.
--- a/home.asm
+++ b/home.asm
@@ -2518,602 +2518,7 @@
; 3b4e
-SoundRestart:: ; 3b4e
-
- push hl
- push de
- push bc
- push af
-
- ld a, [hROMBank]
- push af
- ld a, BANK(_SoundRestart)
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- call _SoundRestart
-
- pop af
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3b6a
-
-
-UpdateSound:: ; 3b6a
-
- push hl
- push de
- push bc
- push af
-
- ld a, [hROMBank]
- push af
- ld a, BANK(_UpdateSound)
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- call _UpdateSound
-
- pop af
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3b86
-
-
-_LoadMusicByte:: ; 3b86
-; CurMusicByte = [a:de]
-GLOBAL LoadMusicByte
-
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- ld a, [de]
- ld [CurMusicByte], a
- ld a, BANK(LoadMusicByte)
-
- ld [hROMBank], a
- ld [MBC3RomBank], a
- ret
-; 3b97
-
-
-PlayMusic:: ; 3b97
-; Play music de.
-
- push hl
- push de
- push bc
- push af
-
- ld a, [hROMBank]
- push af
- ld a, BANK(_PlayMusic) ; and BANK(_SoundRestart)
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- ld a, e
- and a
- jr z, .nomusic
-
- call _PlayMusic
- jr .end
-
-.nomusic
- call _SoundRestart
-
-.end
- pop af
- ld [hROMBank], a
- ld [MBC3RomBank], a
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3bbc
-
-
-PlayMusic2:: ; 3bbc
-; Stop playing music, then play music de.
-
- push hl
- push de
- push bc
- push af
-
- ld a, [hROMBank]
- push af
- ld a, BANK(_PlayMusic)
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- push de
- ld de, MUSIC_NONE
- call _PlayMusic
- call DelayFrame
- pop de
- call _PlayMusic
-
- pop af
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- pop af
- pop bc
- pop de
- pop hl
- ret
-
-; 3be3
-
-
-PlayCryHeader:: ; 3be3
-; Play a cry given parameters at header de
-
- push hl
- push de
- push bc
- push af
-
- ld a, [hROMBank]
- push af
-
- ; Cry headers are stuck in one bank.
- ld a, BANK(CryHeaders)
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- ld hl, CryHeaders
- add hl, de
- add hl, de
- add hl, de
- add hl, de
- add hl, de
- add hl, de
-
- ld e, [hl]
- inc hl
- ld d, [hl]
- inc hl
-
- ld a, [hli]
- ld [CryPitch], a
- ld a, [hli]
- ld [CryEcho], a
- ld a, [hli]
- ld [CryLength], a
- ld a, [hl]
- ld [CryLength + 1], a
-
- ld a, BANK(PlayCry)
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- call PlayCry
-
- pop af
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3c23
-
-
-PlaySFX:: ; 3c23
-; Play sound effect de.
-; Sound effects are ordered by priority (lowest to highest)
-
- push hl
- push de
- push bc
- push af
-
- ; Is something already playing?
- call CheckSFX
- jr nc, .play
-
- ; Does it have priority?
- ld a, [CurSFX]
- cp e
- jr c, .done
-
-.play
- ld a, [hROMBank]
- push af
- ld a, BANK(_PlaySFX)
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
- ld a, e
- ld [CurSFX], a
- call _PlaySFX
-
- pop af
- ld [hROMBank], a
- ld [MBC3RomBank], a
-
-.done
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3c4e
-
-
-WaitPlaySFX:: ; 3c4e
- call WaitSFX
- call PlaySFX
- ret
-; 3c55
-
-
-WaitSFX:: ; 3c55
-; infinite loop until sfx is done playing
-
- push hl
-
-.wait
- ld hl, Channel5Flags
- bit 0, [hl]
- jr nz, .wait
- ld hl, Channel6Flags
- bit 0, [hl]
- jr nz, .wait
- ld hl, Channel7Flags
- bit 0, [hl]
- jr nz, .wait
- ld hl, Channel8Flags
- bit 0, [hl]
- jr nz, .wait
-
- pop hl
- ret
-; 3c74
-
-IsSFXPlaying:: ; 3c74
-; Return carry if no sound effect is playing.
-; The inverse of CheckSFX.
- push hl
-
- ld hl, Channel5Flags
- bit 0, [hl]
- jr nz, .playing
- ld hl, Channel6Flags
- bit 0, [hl]
- jr nz, .playing
- ld hl, Channel7Flags
- bit 0, [hl]
- jr nz, .playing
- ld hl, Channel8Flags
- bit 0, [hl]
- jr nz, .playing
-
- pop hl
- scf
- ret
-
-.playing
- pop hl
- and a
- ret
-; 3c97
-
-MaxVolume:: ; 3c97
- ld a, $77 ; max
- ld [Volume], a
- ret
-; 3c9d
-
-LowVolume:: ; 3c9d
- ld a, $33 ; 40%
- ld [Volume], a
- ret
-; 3ca3
-
-VolumeOff:: ; 3ca3
- xor a
- ld [Volume], a
- ret
-; 3ca8
-
-Function3ca8:: ; 3ca8
- ld a, 4
- ld [MusicFade], a
- ret
-; 3cae
-
-Function3cae:: ; 3cae
- ld a, 4 | 1 << 7
- ld [MusicFade], a
- ret
-; 3cb4
-
-SkipMusic:: ; 3cb4
-; Skip a frames of music.
- and a
- ret z
- dec a
- call UpdateSound
- jr SkipMusic
-; 3cbc
-
-FadeToMapMusic:: ; 3cbc
- push hl
- push de
- push bc
- push af
-
- call GetMapMusic
- ld a, [wMapMusic]
- cp e
- jr z, .done
-
- ld a, 8
- ld [MusicFade], a
- ld a, e
- ld [MusicFadeIDLo], a
- ld a, d
- ld [MusicFadeIDHi], a
- ld a, e
- ld [wMapMusic], a
-
-.done
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3cdf
-
-PlayMapMusic:: ; 3cdf
- push hl
- push de
- push bc
- push af
-
- call GetMapMusic
- ld a, [wMapMusic]
- cp e
- jr z, .done
-
- push de
- ld de, MUSIC_NONE
- call PlayMusic
- call DelayFrame
- pop de
- ld a, e
- ld [wMapMusic], a
- call PlayMusic
-
-.done
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3d03
-
-EnterMapMusic:: ; 3d03
- push hl
- push de
- push bc
- push af
-
- xor a
- ld [$c2c1], a
- ld de, MUSIC_BICYCLE
- ld a, [PlayerState]
- cp PLAYER_BIKE
- jr z, .play
- call GetMapMusic
-.play
- push de
- ld de, MUSIC_NONE
- call PlayMusic
- call DelayFrame
- pop de
-
- ld a, e
- ld [wMapMusic], a
- call PlayMusic
-
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3d2f
-
-Function3d2f:: ; 3d2f
- ld a, [$c2c1]
- and a
- jr z, RestartMapMusic
- xor a
- ld [wMapMusic], a
- ld de, MUSIC_NONE
- call PlayMusic
- call DelayFrame
- xor a
- ld [$c2c1], a
- ret
-; 3d47
-
-RestartMapMusic:: ; 3d47
- push hl
- push de
- push bc
- push af
- ld de, MUSIC_NONE
- call PlayMusic
- call DelayFrame
- ld a, [wMapMusic]
- ld e, a
- ld d, 0
- call PlayMusic
- pop af
- pop bc
- pop de
- pop hl
- ret
-; 3d62
-
-SpecialMapMusic:: ; 3d62
- ld a, [PlayerState]
- cp PLAYER_SURF
- jr z, .surf
- cp PLAYER_SURF_PIKA
- jr z, .surf
-
- ld a, [StatusFlags2]
- bit 2, a
- jr nz, .contest
-
-.no
- and a
- ret
-
-.bike
- ld de, MUSIC_BICYCLE
- scf
- ret
-
-.surf
- ld de, MUSIC_SURF
- scf
- ret
-
-.contest
- ld a, [MapGroup]
- cp GROUP_ROUTE_35_NATIONAL_PARK_GATE
- jr nz, .no
- ld a, [MapNumber]
- cp MAP_ROUTE_35_NATIONAL_PARK_GATE
- jr z, .ranking
- cp MAP_ROUTE_36_NATIONAL_PARK_GATE
- jr nz, .no
-
-.ranking
- ld de, MUSIC_BUG_CATCHING_CONTEST_RANKING
- scf
- ret
-; 3d97
-
-GetMapMusic:: ; 3d97
- call SpecialMapMusic
- ret c
- call GetMapHeaderMusic
- ret
-; 3d9f
-
-Function3d9f:: ; 3d9f
-; Places a BCD number at the
-; upper center of the screen.
-; Unreferenced.
- ld a, $20
- ld [$c498], a
- ld [$c49c], a
- ld a, $50
- ld [$c499], a
- ld a, $58
- ld [$c49d], a
- xor a
- ld [$c49b], a
- ld [$c49f], a
- ld a, [$c296]
- cp $64
- jr nc, .max
- add 1
- daa
- ld b, a
- swap a
- and $f
- add "0"
- ld [$c49a], a
- ld a, b
- and $f
- add "0"
- ld [$c49e], a
- ret
-
-.max
- ld a, "9"
- ld [$c49a], a
- ld [$c49e], a
- ret
-; 3dde
-
-CheckSFX:: ; 3dde
-; Return carry if any SFX channels are active.
- ld a, [Channel5Flags]
- bit 0, a
- jr nz, .playing
- ld a, [Channel6Flags]
- bit 0, a
- jr nz, .playing
- ld a, [Channel7Flags]
- bit 0, a
- jr nz, .playing
- ld a, [Channel8Flags]
- bit 0, a
- jr nz, .playing
- and a
- ret
-.playing
- scf
- ret
-; 3dfe
-
-Function3dfe:: ; 3dfe
- xor a
- ld [$c1cc], a
- ld [SoundInput], a
- ld [rNR10], a
- ld [rNR11], a
- ld [rNR12], a
- ld [rNR13], a
- ld [rNR14], a
- ret
-; 3e10
-
-
-ChannelsOff:: ; 3e10
-; Quickly turn off music channels
- xor a
- ld [Channel1Flags], a
- ld [Channel2Flags], a
- ld [Channel3Flags], a
- ld [Channel4Flags], a
- ld [SoundInput], a
- ret
-; 3e21
-
-SFXChannelsOff:: ; 3e21
-; Quickly turn off sound effect channels
- xor a
- ld [Channel5Flags], a
- ld [Channel6Flags], a
- ld [Channel7Flags], a
- ld [Channel8Flags], a
- ld [SoundInput], a
- ret
-; 3e32
+INCLUDE "home/audio.asm"
Function3e32:: ; 3e32
--- /dev/null
+++ b/home/audio.asm
@@ -1,0 +1,598 @@
+; Audio interfaces.
+
+SoundRestart:: ; 3b4e
+
+ push hl
+ push de
+ push bc
+ push af
+
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(_SoundRestart)
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+ call _SoundRestart
+
+ pop af
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+; 3b6a
+
+
+UpdateSound:: ; 3b6a
+
+ push hl
+ push de
+ push bc
+ push af
+
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(_UpdateSound)
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+ call _UpdateSound
+
+ pop af
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+; 3b86
+
+
+_LoadMusicByte:: ; 3b86
+; CurMusicByte = [a:de]
+GLOBAL LoadMusicByte
+
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+ ld a, [de]
+ ld [CurMusicByte], a
+ ld a, BANK(LoadMusicByte)
+
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+ ret
+; 3b97
+
+
+PlayMusic:: ; 3b97
+; Play music de.
+
+ push hl
+ push de
+ push bc
+ push af
+
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(_PlayMusic) ; and BANK(_SoundRestart)
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+ ld a, e
+ and a
+ jr z, .nomusic
+
+ call _PlayMusic
+ jr .end
+
+.nomusic
+ call _SoundRestart
+
+.end
+ pop af
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+; 3bbc
+
+
+PlayMusic2:: ; 3bbc
+; Stop playing music, then play music de.
+
+ push hl
+ push de
+ push bc
+ push af
+
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(_PlayMusic)
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+ push de
+ ld de, MUSIC_NONE
+ call _PlayMusic
+ call DelayFrame
+ pop de
+ call _PlayMusic
+
+ pop af
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+
+; 3be3
+
+
+PlayCryHeader:: ; 3be3
+; Play a cry given parameters at header de
+
+ push hl
+ push de
+ push bc
+ push af
+
+ ld a, [hROMBank]
+ push af
+
+ ; Cry headers are stuck in one bank.
+ ld a, BANK(CryHeaders)
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+ ld hl, CryHeaders
+ add hl, de
+ add hl, de
+ add hl, de
+ add hl, de
+ add hl, de
+ add hl, de
+
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc hl
+
+ ld a, [hli]
+ ld [CryPitch], a
+ ld a, [hli]
+ ld [CryEcho], a
+ ld a, [hli]
+ ld [CryLength], a
+ ld a, [hl]
+ ld [CryLength + 1], a
+
+ ld a, BANK(PlayCry)
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+ call PlayCry
+
+ pop af
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+; 3c23
+
+
+PlaySFX:: ; 3c23
+; Play sound effect de.
+; Sound effects are ordered by priority (lowest to highest)
+
+ push hl
+ push de
+ push bc
+ push af
+
+ ; Is something already playing?
+ call CheckSFX
+ jr nc, .play
+
+ ; Does it have priority?
+ ld a, [CurSFX]
+ cp e
+ jr c, .done
+
+.play
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(_PlaySFX)
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+ ld a, e
+ ld [CurSFX], a
+ call _PlaySFX
+
+ pop af
+ ld [hROMBank], a
+ ld [MBC3RomBank], a
+
+.done
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+; 3c4e
+
+
+WaitPlaySFX:: ; 3c4e
+ call WaitSFX
+ call PlaySFX
+ ret
+; 3c55
+
+
+WaitSFX:: ; 3c55
+; infinite loop until sfx is done playing
+
+ push hl
+
+.wait
+ ld hl, Channel5Flags
+ bit 0, [hl]
+ jr nz, .wait
+ ld hl, Channel6Flags
+ bit 0, [hl]
+ jr nz, .wait
+ ld hl, Channel7Flags
+ bit 0, [hl]
+ jr nz, .wait
+ ld hl, Channel8Flags
+ bit 0, [hl]
+ jr nz, .wait
+
+ pop hl
+ ret
+; 3c74
+
+IsSFXPlaying:: ; 3c74
+; Return carry if no sound effect is playing.
+; The inverse of CheckSFX.
+ push hl
+
+ ld hl, Channel5Flags
+ bit 0, [hl]
+ jr nz, .playing
+ ld hl, Channel6Flags
+ bit 0, [hl]
+ jr nz, .playing
+ ld hl, Channel7Flags
+ bit 0, [hl]
+ jr nz, .playing
+ ld hl, Channel8Flags
+ bit 0, [hl]
+ jr nz, .playing
+
+ pop hl
+ scf
+ ret
+
+.playing
+ pop hl
+ and a
+ ret
+; 3c97
+
+MaxVolume:: ; 3c97
+ ld a, $77 ; max
+ ld [Volume], a
+ ret
+; 3c9d
+
+LowVolume:: ; 3c9d
+ ld a, $33 ; 40%
+ ld [Volume], a
+ ret
+; 3ca3
+
+VolumeOff:: ; 3ca3
+ xor a
+ ld [Volume], a
+ ret
+; 3ca8
+
+Function3ca8:: ; 3ca8
+ ld a, 4
+ ld [MusicFade], a
+ ret
+; 3cae
+
+Function3cae:: ; 3cae
+ ld a, 4 | 1 << 7
+ ld [MusicFade], a
+ ret
+; 3cb4
+
+SkipMusic:: ; 3cb4
+; Skip a frames of music.
+ and a
+ ret z
+ dec a
+ call UpdateSound
+ jr SkipMusic
+; 3cbc
+
+FadeToMapMusic:: ; 3cbc
+ push hl
+ push de
+ push bc
+ push af
+
+ call GetMapMusic
+ ld a, [wMapMusic]
+ cp e
+ jr z, .done
+
+ ld a, 8
+ ld [MusicFade], a
+ ld a, e
+ ld [MusicFadeIDLo], a
+ ld a, d
+ ld [MusicFadeIDHi], a
+ ld a, e
+ ld [wMapMusic], a
+
+.done
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+; 3cdf
+
+PlayMapMusic:: ; 3cdf
+ push hl
+ push de
+ push bc
+ push af
+
+ call GetMapMusic
+ ld a, [wMapMusic]
+ cp e
+ jr z, .done
+
+ push de
+ ld de, MUSIC_NONE
+ call PlayMusic
+ call DelayFrame
+ pop de
+ ld a, e
+ ld [wMapMusic], a
+ call PlayMusic
+
+.done
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+; 3d03
+
+EnterMapMusic:: ; 3d03
+ push hl
+ push de
+ push bc
+ push af
+
+ xor a
+ ld [$c2c1], a
+ ld de, MUSIC_BICYCLE
+ ld a, [PlayerState]
+ cp PLAYER_BIKE
+ jr z, .play
+ call GetMapMusic
+.play
+ push de
+ ld de, MUSIC_NONE
+ call PlayMusic
+ call DelayFrame
+ pop de
+
+ ld a, e
+ ld [wMapMusic], a
+ call PlayMusic
+
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+; 3d2f
+
+Function3d2f:: ; 3d2f
+ ld a, [$c2c1]
+ and a
+ jr z, RestartMapMusic
+ xor a
+ ld [wMapMusic], a
+ ld de, MUSIC_NONE
+ call PlayMusic
+ call DelayFrame
+ xor a
+ ld [$c2c1], a
+ ret
+; 3d47
+
+RestartMapMusic:: ; 3d47
+ push hl
+ push de
+ push bc
+ push af
+ ld de, MUSIC_NONE
+ call PlayMusic
+ call DelayFrame
+ ld a, [wMapMusic]
+ ld e, a
+ ld d, 0
+ call PlayMusic
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+; 3d62
+
+SpecialMapMusic:: ; 3d62
+ ld a, [PlayerState]
+ cp PLAYER_SURF
+ jr z, .surf
+ cp PLAYER_SURF_PIKA
+ jr z, .surf
+
+ ld a, [StatusFlags2]
+ bit 2, a
+ jr nz, .contest
+
+.no
+ and a
+ ret
+
+.bike
+ ld de, MUSIC_BICYCLE
+ scf
+ ret
+
+.surf
+ ld de, MUSIC_SURF
+ scf
+ ret
+
+.contest
+ ld a, [MapGroup]
+ cp GROUP_ROUTE_35_NATIONAL_PARK_GATE
+ jr nz, .no
+ ld a, [MapNumber]
+ cp MAP_ROUTE_35_NATIONAL_PARK_GATE
+ jr z, .ranking
+ cp MAP_ROUTE_36_NATIONAL_PARK_GATE
+ jr nz, .no
+
+.ranking
+ ld de, MUSIC_BUG_CATCHING_CONTEST_RANKING
+ scf
+ ret
+; 3d97
+
+GetMapMusic:: ; 3d97
+ call SpecialMapMusic
+ ret c
+ call GetMapHeaderMusic
+ ret
+; 3d9f
+
+Function3d9f:: ; 3d9f
+; Places a BCD number at the
+; upper center of the screen.
+; Unreferenced.
+ ld a, $20
+ ld [$c498], a
+ ld [$c49c], a
+ ld a, $50
+ ld [$c499], a
+ ld a, $58
+ ld [$c49d], a
+ xor a
+ ld [$c49b], a
+ ld [$c49f], a
+ ld a, [$c296]
+ cp $64
+ jr nc, .max
+ add 1
+ daa
+ ld b, a
+ swap a
+ and $f
+ add "0"
+ ld [$c49a], a
+ ld a, b
+ and $f
+ add "0"
+ ld [$c49e], a
+ ret
+
+.max
+ ld a, "9"
+ ld [$c49a], a
+ ld [$c49e], a
+ ret
+; 3dde
+
+CheckSFX:: ; 3dde
+; Return carry if any SFX channels are active.
+ ld a, [Channel5Flags]
+ bit 0, a
+ jr nz, .playing
+ ld a, [Channel6Flags]
+ bit 0, a
+ jr nz, .playing
+ ld a, [Channel7Flags]
+ bit 0, a
+ jr nz, .playing
+ ld a, [Channel8Flags]
+ bit 0, a
+ jr nz, .playing
+ and a
+ ret
+.playing
+ scf
+ ret
+; 3dfe
+
+Function3dfe:: ; 3dfe
+ xor a
+ ld [$c1cc], a
+ ld [SoundInput], a
+ ld [rNR10], a
+ ld [rNR11], a
+ ld [rNR12], a
+ ld [rNR13], a
+ ld [rNR14], a
+ ret
+; 3e10
+
+
+ChannelsOff:: ; 3e10
+; Quickly turn off music channels
+ xor a
+ ld [Channel1Flags], a
+ ld [Channel2Flags], a
+ ld [Channel3Flags], a
+ ld [Channel4Flags], a
+ ld [SoundInput], a
+ ret
+; 3e21
+
+SFXChannelsOff:: ; 3e21
+; Quickly turn off sound effect channels
+ xor a
+ ld [Channel5Flags], a
+ ld [Channel6Flags], a
+ ld [Channel7Flags], a
+ ld [Channel8Flags], a
+ ld [SoundInput], a
+ ret
+; 3e32