mirror of
https://github.com/pret/pokeyellow.git
synced 2024-11-26 20:00:21 +00:00
192 lines
2.6 KiB
NASM
192 lines
2.6 KiB
NASM
; The third of four partially duplicated sound engines.
|
|
|
|
Audio3_PlaySound::
|
|
ld [wSoundID], a
|
|
ld a, [wSoundID]
|
|
cp SFX_STOP_ALL_MUSIC
|
|
jp z, .stopAllAudio
|
|
cp MAX_SFX_ID_3
|
|
jp z, .playSfx
|
|
jp c, .playSfx
|
|
cp $fd
|
|
jr z, .playMusic
|
|
jp nc, .playSfx
|
|
|
|
.playMusic
|
|
call InitMusicVariables
|
|
jp .playSoundCommon
|
|
|
|
.playSfx
|
|
ld l, a
|
|
ld e, a
|
|
ld h, 0
|
|
ld d, h
|
|
add hl, hl
|
|
add hl, de
|
|
ld de, SFX_Headers_3
|
|
add hl, de
|
|
ld a, h
|
|
ld [wSfxHeaderPointer], a
|
|
ld a, l
|
|
ld [wSfxHeaderPointer + 1], a
|
|
ld a, [hl]
|
|
and $c0
|
|
rlca
|
|
rlca
|
|
ld c, a
|
|
.sfxChannelLoop
|
|
ld d, c
|
|
ld a, c
|
|
add a
|
|
add c
|
|
ld c, a
|
|
ld b, 0
|
|
ld a, [wSfxHeaderPointer]
|
|
ld h, a
|
|
ld a, [wSfxHeaderPointer + 1]
|
|
ld l, a
|
|
add hl, bc
|
|
ld c, d
|
|
ld a, [hl]
|
|
and $f
|
|
ld e, a ; software channel ID
|
|
ld d, 0
|
|
ld hl, wChannelSoundIDs
|
|
add hl, de
|
|
ld a, [hl]
|
|
and a
|
|
jr z, .playChannel
|
|
ld a, e
|
|
cp CHAN8
|
|
jr nz, .notNoiseChannel
|
|
ld a, [wSoundID]
|
|
cp NOISE_INSTRUMENTS_END
|
|
jr nc, .notNoiseInstrument
|
|
ret
|
|
.notNoiseInstrument
|
|
ld a, [hl]
|
|
cp NOISE_INSTRUMENTS_END
|
|
jr z, .playChannel
|
|
jr c, .playChannel
|
|
.notNoiseChannel
|
|
ld a, [wSoundID]
|
|
cp [hl]
|
|
jr z, .playChannel
|
|
jr c, .playChannel
|
|
ret
|
|
.playChannel
|
|
call InitSFXVariables
|
|
ld a, c
|
|
and a
|
|
jp z, .playSoundCommon
|
|
dec c
|
|
jp .sfxChannelLoop
|
|
|
|
.stopAllAudio
|
|
call StopAllAudio
|
|
ret
|
|
|
|
.playSoundCommon
|
|
ld a, [wSoundID]
|
|
ld l, a
|
|
ld e, a
|
|
ld h, 0
|
|
ld d, h
|
|
add hl, hl
|
|
add hl, de
|
|
ld de, SFX_Headers_3
|
|
add hl, de
|
|
ld e, l
|
|
ld d, h
|
|
ld hl, wChannelCommandPointers
|
|
ld a, [de] ; get channel number
|
|
ld b, a
|
|
rlca
|
|
rlca
|
|
and $3
|
|
ld c, a
|
|
ld a, b
|
|
and $f
|
|
ld b, c
|
|
inc b
|
|
inc de
|
|
ld c, 0
|
|
.commandPointerLoop
|
|
cp c
|
|
jr z, .next
|
|
inc c
|
|
inc hl
|
|
inc hl
|
|
jr .commandPointerLoop
|
|
.next
|
|
push af
|
|
push hl
|
|
push bc
|
|
ld b, 0
|
|
ld c, a
|
|
cp CHAN4
|
|
jr c, .skipSettingFlag
|
|
ld hl, wChannelFlags1
|
|
add hl, bc
|
|
set BIT_NOISE_OR_SFX, [hl]
|
|
.skipSettingFlag
|
|
pop bc
|
|
pop hl
|
|
ld a, [de] ; get channel pointer
|
|
ld [hli], a
|
|
inc de
|
|
ld a, [de]
|
|
ld [hli], a
|
|
inc de
|
|
pop af
|
|
push hl
|
|
push bc
|
|
ld b, 0
|
|
ld c, a
|
|
ld hl, wChannelSoundIDs
|
|
add hl, bc
|
|
ld a, [wSoundID]
|
|
ld [hl], a
|
|
pop bc
|
|
pop hl
|
|
inc c
|
|
dec b
|
|
ld a, b
|
|
and a
|
|
ld a, [de]
|
|
inc de
|
|
jr nz, .commandPointerLoop
|
|
ld a, [wSoundID]
|
|
cp CRY_SFX_START
|
|
jr nc, .maybeCry
|
|
jr .done
|
|
.maybeCry
|
|
ld a, [wSoundID]
|
|
cp CRY_SFX_END
|
|
jr z, .done
|
|
jr c, .cry
|
|
jr .done
|
|
.cry
|
|
ld hl, wChannelSoundIDs + CHAN5
|
|
ld [hli], a
|
|
ld [hli], a
|
|
ld [hli], a
|
|
ld [hl], a
|
|
ld hl, wChannelCommandPointers + CHAN7 * 2 ; sfx wave channel pointer
|
|
ld de, Audio3_CryRet
|
|
ld [hl], e
|
|
inc hl
|
|
ld [hl], d ; overwrite pointer to point to sound_ret
|
|
ld a, [wSavedVolume]
|
|
and a
|
|
jr nz, .done
|
|
ldh a, [rNR50]
|
|
ld [wSavedVolume], a
|
|
ld a, $77
|
|
ldh [rNR50], a ; full volume
|
|
.done
|
|
ret
|
|
|
|
Audio3_CryRet:
|
|
sound_ret
|