mirror of https://github.com/pret/pokecrystal.git
596 lines
7.3 KiB
NASM
596 lines
7.3 KiB
NASM
; Audio interfaces.
|
|
|
|
MapSetup_Sound_Off:: ; 3b4e
|
|
|
|
push hl
|
|
push de
|
|
push bc
|
|
push af
|
|
|
|
ld a, [hROMBank]
|
|
push af
|
|
ld a, BANK(_MapSetup_Sound_Off)
|
|
ld [hROMBank], a
|
|
ld [MBC3RomBank], a
|
|
|
|
call _MapSetup_Sound_Off
|
|
|
|
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
|
|
; wCurMusicByte = [a:de]
|
|
GLOBAL LoadMusicByte
|
|
|
|
ld [hROMBank], a
|
|
ld [MBC3RomBank], a
|
|
|
|
ld a, [de]
|
|
ld [wCurMusicByte], 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(_MapSetup_Sound_Off)
|
|
ld [hROMBank], a
|
|
ld [MBC3RomBank], a
|
|
|
|
ld a, e
|
|
and a
|
|
jr z, .nomusic
|
|
|
|
call _PlayMusic
|
|
jr .end
|
|
|
|
.nomusic
|
|
call _MapSetup_Sound_Off
|
|
|
|
.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
|
|
|
|
|
|
PlayCry:: ; 3be3
|
|
; Play cry header de.
|
|
|
|
push hl
|
|
push de
|
|
push bc
|
|
push af
|
|
|
|
ld a, [hROMBank]
|
|
push af
|
|
|
|
; Cries are stuck in one bank.
|
|
ld a, BANK(PokemonCries)
|
|
ld [hROMBank], a
|
|
ld [MBC3RomBank], a
|
|
|
|
ld hl, PokemonCries
|
|
rept 6 ; sizeof(mon_cry)
|
|
add hl, de
|
|
endr
|
|
|
|
ld e, [hl]
|
|
inc hl
|
|
ld d, [hl]
|
|
inc hl
|
|
|
|
ld a, [hli]
|
|
ld [wCryPitch], a
|
|
ld a, [hli]
|
|
ld [wCryPitch + 1], a
|
|
ld a, [hli]
|
|
ld [wCryLength], a
|
|
ld a, [hl]
|
|
ld [wCryLength + 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 (highest to lowest)
|
|
|
|
push hl
|
|
push de
|
|
push bc
|
|
push af
|
|
|
|
; Is something already playing?
|
|
call CheckSFX
|
|
jr nc, .play
|
|
|
|
; Does it have priority?
|
|
ld a, [wCurSFX]
|
|
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 [wCurSFX], 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, wChannel5Flags
|
|
bit 0, [hl]
|
|
jr nz, .wait
|
|
ld hl, wChannel6Flags
|
|
bit 0, [hl]
|
|
jr nz, .wait
|
|
ld hl, wChannel7Flags
|
|
bit 0, [hl]
|
|
jr nz, .wait
|
|
ld hl, wChannel8Flags
|
|
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, wChannel5Flags
|
|
bit 0, [hl]
|
|
jr nz, .playing
|
|
ld hl, wChannel6Flags
|
|
bit 0, [hl]
|
|
jr nz, .playing
|
|
ld hl, wChannel7Flags
|
|
bit 0, [hl]
|
|
jr nz, .playing
|
|
ld hl, wChannel8Flags
|
|
bit 0, [hl]
|
|
jr nz, .playing
|
|
|
|
pop hl
|
|
scf
|
|
ret
|
|
|
|
.playing
|
|
pop hl
|
|
and a
|
|
ret
|
|
; 3c97
|
|
|
|
MaxVolume:: ; 3c97
|
|
ld a, MAX_VOLUME
|
|
ld [wVolume], a
|
|
ret
|
|
; 3c9d
|
|
|
|
LowVolume:: ; 3c9d
|
|
ld a, $33 ; 40%
|
|
ld [wVolume], a
|
|
ret
|
|
; 3ca3
|
|
|
|
VolumeOff:: ; 3ca3
|
|
xor a
|
|
ld [wVolume], a
|
|
ret
|
|
; 3ca8
|
|
|
|
Unused_FadeOutMusic:: ; 3ca8
|
|
ld a, 4
|
|
ld [wMusicFade], a
|
|
ret
|
|
; 3cae
|
|
|
|
FadeInMusic:: ; 3cae
|
|
ld a, 4 | (1 << MUSIC_FADE_IN_F)
|
|
ld [wMusicFade], a
|
|
ret
|
|
; 3cb4
|
|
|
|
SkipMusic:: ; 3cb4
|
|
; Skip a frames of music.
|
|
.loop
|
|
and a
|
|
ret z
|
|
dec a
|
|
call UpdateSound
|
|
jr .loop
|
|
; 3cbc
|
|
|
|
FadeToMapMusic:: ; 3cbc
|
|
push hl
|
|
push de
|
|
push bc
|
|
push af
|
|
|
|
call GetMapMusic_MaybeSpecial
|
|
ld a, [wMapMusic]
|
|
cp e
|
|
jr z, .done
|
|
|
|
ld a, 8
|
|
ld [wMusicFade], a
|
|
ld a, e
|
|
ld [wMusicFadeID], a
|
|
ld a, d
|
|
ld [wMusicFadeID + 1], 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_MaybeSpecial
|
|
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 [wDontPlayMapMusicOnReload], a
|
|
ld de, MUSIC_BICYCLE
|
|
ld a, [wPlayerState]
|
|
cp PLAYER_BIKE
|
|
jr z, .play
|
|
call GetMapMusic_MaybeSpecial
|
|
.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
|
|
|
|
TryRestartMapMusic:: ; 3d2f
|
|
ld a, [wDontPlayMapMusicOnReload]
|
|
and a
|
|
jr z, RestartMapMusic
|
|
xor a
|
|
ld [wMapMusic], a
|
|
ld de, MUSIC_NONE
|
|
call PlayMusic
|
|
call DelayFrame
|
|
xor a
|
|
ld [wDontPlayMapMusicOnReload], 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, [wPlayerState]
|
|
cp PLAYER_SURF
|
|
jr z, .surf
|
|
cp PLAYER_SURF_PIKA
|
|
jr z, .surf
|
|
|
|
ld a, [wStatusFlags2]
|
|
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, [wMapGroup]
|
|
cp GROUP_ROUTE_35_NATIONAL_PARK_GATE
|
|
jr nz, .no
|
|
ld a, [wMapNumber]
|
|
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_MaybeSpecial:: ; 3d97
|
|
call SpecialMapMusic
|
|
ret c
|
|
call GetMapMusic
|
|
ret
|
|
; 3d9f
|
|
|
|
Unreferenced_Function3d9f:: ; 3d9f
|
|
; Places a BCD number at the
|
|
; upper center of the screen.
|
|
ld a, 4 * TILE_WIDTH
|
|
ld [wVirtualOAMSprite38YCoord], a
|
|
ld [wVirtualOAMSprite39YCoord], a
|
|
ld a, 10 * TILE_WIDTH
|
|
ld [wVirtualOAMSprite38XCoord], a
|
|
ld a, 11 * TILE_WIDTH
|
|
ld [wVirtualOAMSprite39XCoord], a
|
|
xor a
|
|
ld [wVirtualOAMSprite38Attributes], a
|
|
ld [wVirtualOAMSprite39Attributes], a
|
|
ld a, [wc296]
|
|
cp 100
|
|
jr nc, .max
|
|
add 1
|
|
daa
|
|
ld b, a
|
|
swap a
|
|
and $f
|
|
add "0"
|
|
ld [wVirtualOAMSprite38TileID], a
|
|
ld a, b
|
|
and $f
|
|
add "0"
|
|
ld [wVirtualOAMSprite39TileID], a
|
|
ret
|
|
|
|
.max
|
|
ld a, "9"
|
|
ld [wVirtualOAMSprite38TileID], a
|
|
ld [wVirtualOAMSprite39TileID], a
|
|
ret
|
|
; 3dde
|
|
|
|
CheckSFX:: ; 3dde
|
|
; Return carry if any SFX channels are active.
|
|
ld a, [wChannel5Flags]
|
|
bit 0, a
|
|
jr nz, .playing
|
|
ld a, [wChannel6Flags]
|
|
bit 0, a
|
|
jr nz, .playing
|
|
ld a, [wChannel7Flags]
|
|
bit 0, a
|
|
jr nz, .playing
|
|
ld a, [wChannel8Flags]
|
|
bit 0, a
|
|
jr nz, .playing
|
|
and a
|
|
ret
|
|
.playing
|
|
scf
|
|
ret
|
|
; 3dfe
|
|
|
|
TerminateExpBarSound:: ; 3dfe
|
|
xor a
|
|
ld [wChannel5Flags], a
|
|
ld [wSoundInput], 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 [wChannel1Flags], a
|
|
ld [wChannel2Flags], a
|
|
ld [wChannel3Flags], a
|
|
ld [wChannel4Flags], a
|
|
ld [wSoundInput], a
|
|
ret
|
|
; 3e21
|
|
|
|
SFXChannelsOff:: ; 3e21
|
|
; Quickly turn off sound effect channels
|
|
xor a
|
|
ld [wChannel5Flags], a
|
|
ld [wChannel6Flags], a
|
|
ld [wChannel7Flags], a
|
|
ld [wChannel8Flags], a
|
|
ld [wSoundInput], a
|
|
ret
|
|
; 3e32
|