diff options
Diffstat (limited to 'home/audio.asm')
-rw-r--r-- | home/audio.asm | 598 |
1 files changed, 598 insertions, 0 deletions
diff --git a/home/audio.asm b/home/audio.asm new file mode 100644 index 000000000..348da52c6 --- /dev/null +++ b/home/audio.asm @@ -0,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 |