diff --git a/home.asm b/home.asm index fc923d3c8..2d8e260e1 100644 --- a/home.asm +++ b/home.asm @@ -2518,602 +2518,7 @@ Function3b3c:: ; 3b3c ; 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 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