pokered/audio/engine_2.asm

1736 lines
28 KiB
NASM
Raw Normal View History

2014-01-07 03:34:14 +00:00
; The second of three duplicated sound engines.
2016-06-12 00:24:04 +00:00
Audio2_UpdateMusic::
2016-07-28 03:08:13 +00:00
ld c, Ch0
2014-01-07 03:34:14 +00:00
.loop
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelSoundIDs
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
and a
jr z, .nextChannel
ld a, c
2016-07-28 03:08:13 +00:00
cp Ch4
2014-01-07 03:34:14 +00:00
jr nc, .applyAffects ; if sfx channel
2015-08-09 05:32:44 +00:00
ld a, [wMuteAudioAndPauseMusic]
2014-01-07 03:34:14 +00:00
and a
jr z, .applyAffects
bit 7, a
jr nz, .nextChannel
set 7, a
2015-08-09 05:32:44 +00:00
ld [wMuteAudioAndPauseMusic], a
2014-01-07 03:34:14 +00:00
xor a
2015-08-09 05:32:44 +00:00
ld [rNR51], a
ld [rNR30], a
2014-01-07 03:34:14 +00:00
ld a, $80
2015-08-09 05:32:44 +00:00
ld [rNR30], a
2014-01-07 03:34:14 +00:00
jr .nextChannel
.applyAffects
call Audio2_ApplyMusicAffects
2014-01-07 03:34:14 +00:00
.nextChannel
ld a, c
inc c
2016-07-28 03:08:13 +00:00
cp Ch7
2014-01-07 03:34:14 +00:00
jr nz, .loop
ret
; this routine checks flags for music effects currently applied
; to the channel and calls certain functions based on flags.
2015-08-09 05:32:44 +00:00
; known flags for wChannelFlags1:
2016-07-28 03:33:48 +00:00
; 0: toggleperfectpitch has been used
; 1: call has been used
; 3: a toggle used only by this routine for vibrato
; 4: pitchbend flag
; 6: dutycycle flag
2016-06-12 00:24:04 +00:00
Audio2_ApplyMusicAffects:
2014-01-07 03:34:14 +00:00
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelNoteDelayCounters ; delay until next note
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
cp $1 ; if the delay is 1, play next note
jp z, Audio2_PlayNextNote
2014-01-07 03:34:14 +00:00
dec a ; otherwise, decrease the delay timer
ld [hl], a
ld a, c
2016-07-28 03:08:13 +00:00
cp Ch4
2014-01-07 03:34:14 +00:00
jr nc, .startChecks ; if a sfx channel
2016-07-28 03:08:13 +00:00
ld hl, wChannelSoundIDs + Ch4
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
and a
jr z, .startChecks
ret
.startChecks
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags1
2014-01-07 03:34:14 +00:00
add hl, bc
bit 6, [hl] ; dutycycle
jr z, .checkForExecuteMusic
call Audio2_ApplyDutyCycle
2014-01-07 03:34:14 +00:00
.checkForExecuteMusic
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags2
2014-01-07 03:34:14 +00:00
add hl, bc
bit 0, [hl]
jr nz, .checkForPitchBend
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags1
2014-01-07 03:34:14 +00:00
add hl, bc
bit 2, [hl]
jr nz, .disablePitchBendVibrato
.checkForPitchBend
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags1
2014-01-07 03:34:14 +00:00
add hl, bc
bit 4, [hl] ; pitchbend
jr z, .checkVibratoDelay
jp Audio2_ApplyPitchBend
2014-01-07 03:34:14 +00:00
.checkVibratoDelay
2015-08-09 05:32:44 +00:00
ld hl, wChannelVibratoDelayCounters ; vibrato delay
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
and a ; check if delay is over
jr z, .checkForVibrato
dec [hl] ; otherwise, dec delay
.disablePitchBendVibrato
ret
.checkForVibrato
2015-08-09 05:32:44 +00:00
ld hl, wChannelVibratoExtents ; vibrato rate
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
and a
jr nz, .vibrato
ret ; no vibrato
.vibrato
ld d, a
2015-08-09 05:32:44 +00:00
ld hl, wChannelVibratoRates
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
and $f
and a
jr z, .vibratoAlreadyDone
dec [hl] ; apply vibrato pitch change
ret
.vibratoAlreadyDone
ld a, [hl]
swap [hl]
or [hl]
ld [hl], a ; reset the vibrato value and start again
2015-08-09 05:32:44 +00:00
ld hl, wChannelFrequencyLowBytes
2014-01-07 03:34:14 +00:00
add hl, bc
ld e, [hl] ; get note pitch
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags1
2014-01-07 03:34:14 +00:00
add hl, bc
bit 3, [hl] ; this is the only code that sets/resets bit three so
jr z, .unset ; it continuously alternates which path it takes
res 3, [hl]
ld a, d
and $f
ld d, a
ld a, e
sub d
jr nc, .noCarry
ld a, $0
.noCarry
jr .done
.unset
set 3, [hl]
ld a, d
and $f0
swap a
add e
jr nc, .done
ld a, $ff
.done
ld d, a
ld b, $3
call Audio2_21ff7
2014-01-07 03:34:14 +00:00
ld [hl], d
ret
; this routine executes all music commands that take up no time,
; like tempo changes, duty changes etc. and doesn't return
; until the first note is reached
2016-06-12 00:24:04 +00:00
Audio2_PlayNextNote:
2015-08-09 05:32:44 +00:00
ld hl, wChannelVibratoDelayCounterReloadValues
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
2015-08-09 05:32:44 +00:00
ld hl, wChannelVibratoDelayCounters
2014-01-07 03:34:14 +00:00
add hl, bc
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags1
2014-01-07 03:34:14 +00:00
add hl, bc
res 4, [hl]
res 5, [hl]
ld a, c
2016-07-28 03:08:13 +00:00
cp Ch4
2014-01-07 03:34:14 +00:00
jr nz, .beginChecks
ld a, [wLowHealthAlarm] ;low health alarm enabled?
2014-01-07 03:34:14 +00:00
bit 7, a
ret nz
.beginChecks
call Audio2_endchannel
2014-01-07 03:34:14 +00:00
ret
2016-06-12 00:24:04 +00:00
Audio2_endchannel:
call Audio2_GetNextMusicByte
2014-01-07 03:34:14 +00:00
ld d, a
cp $ff ; is this command an endchannel?
jp nz, Audio2_callchannel ; no
2014-01-07 03:34:14 +00:00
ld b, $0 ; yes
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags1
2014-01-07 03:34:14 +00:00
add hl, bc
bit 1, [hl]
jr nz, .returnFromCall
ld a, c
2016-07-28 03:08:13 +00:00
cp Ch3
2014-01-07 03:34:14 +00:00
jr nc, .noiseOrSfxChannel
jr .asm_219c0
.noiseOrSfxChannel
res 2, [hl]
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags2
2014-01-07 03:34:14 +00:00
add hl, bc
res 0, [hl]
2016-07-28 03:08:13 +00:00
cp Ch6
2014-01-07 03:34:14 +00:00
jr nz, .notSfxChannel3
ld a, $0
2015-08-09 05:32:44 +00:00
ld [rNR30], a
2014-01-07 03:34:14 +00:00
ld a, $80
2015-08-09 05:32:44 +00:00
ld [rNR30], a
2014-01-07 03:34:14 +00:00
.notSfxChannel3
jr nz, .asm_219a3
2015-08-09 05:32:44 +00:00
ld a, [wDisableChannelOutputWhenSfxEnds]
2014-01-07 03:34:14 +00:00
and a
jr z, .asm_219a3
xor a
2015-08-09 05:32:44 +00:00
ld [wDisableChannelOutputWhenSfxEnds], a
2014-01-07 03:34:14 +00:00
jr .asm_219c0
.asm_219a3
jr .asm_219c9
.returnFromCall
res 1, [hl]
ld d, $0
ld a, c
add a
ld e, a
2015-08-09 05:32:44 +00:00
ld hl, wChannelCommandPointers
2014-01-07 03:34:14 +00:00
add hl, de
push hl ; store current channel address
2015-08-09 05:32:44 +00:00
ld hl, wChannelReturnAddresses
2014-01-07 03:34:14 +00:00
add hl, de
ld e, l
ld d, h
pop hl
ld a, [de]
ld [hli], a
inc de
ld a, [de]
ld [hl], a ; loads channel address to return to
jp Audio2_endchannel
2014-01-07 03:34:14 +00:00
.asm_219c0
ld hl, Unknown_222de
add hl, bc
2015-08-09 05:32:44 +00:00
ld a, [rNR51]
2014-01-07 03:34:14 +00:00
and [hl]
2015-08-09 05:32:44 +00:00
ld [rNR51], a
2014-01-07 03:34:14 +00:00
.asm_219c9
2016-07-28 03:08:13 +00:00
ld a, [wChannelSoundIDs + Ch4]
2014-01-07 03:34:14 +00:00
cp $14
jr nc, .asm_219d2
jr .asm_219ef
.asm_219d2
2016-07-28 03:08:13 +00:00
ld a, [wChannelSoundIDs + Ch4]
2014-01-07 03:34:14 +00:00
cp $86
jr z, .asm_219ef
jr c, .asm_219dd
jr .asm_219ef
.asm_219dd
ld a, c
2016-07-28 03:08:13 +00:00
cp Ch4
2014-01-07 03:34:14 +00:00
jr z, .asm_219e6
call Audio2_21e6d
2014-01-07 03:34:14 +00:00
ret c
.asm_219e6
2015-08-09 05:32:44 +00:00
ld a, [wSavedVolume]
ld [rNR50], a
2014-01-07 03:34:14 +00:00
xor a
2015-08-09 05:32:44 +00:00
ld [wSavedVolume], a
2014-01-07 03:34:14 +00:00
.asm_219ef
2015-08-09 05:32:44 +00:00
ld hl, wChannelSoundIDs
2014-01-07 03:34:14 +00:00
add hl, bc
ld [hl], b
ret
2016-06-12 00:24:04 +00:00
Audio2_callchannel:
2014-01-07 03:34:14 +00:00
cp $fd ; is this command a callchannel?
jp nz, Audio2_loopchannel ; no
call Audio2_GetNextMusicByte ; yes
2014-01-07 03:34:14 +00:00
push af
call Audio2_GetNextMusicByte
2014-01-07 03:34:14 +00:00
ld d, a
pop af
ld e, a
push de ; store pointer
ld d, $0
ld a, c
add a
ld e, a
2015-08-09 05:32:44 +00:00
ld hl, wChannelCommandPointers
2014-01-07 03:34:14 +00:00
add hl, de
push hl
2015-08-09 05:32:44 +00:00
ld hl, wChannelReturnAddresses
2014-01-07 03:34:14 +00:00
add hl, de
ld e, l
ld d, h
pop hl
ld a, [hli]
ld [de], a
inc de
ld a, [hld]
ld [de], a ; copy current channel address
pop de
ld [hl], e
inc hl
ld [hl], d ; overwrite current address with pointer
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags1
2014-01-07 03:34:14 +00:00
add hl, bc
set 1, [hl] ; set the call flag
jp Audio2_endchannel
2014-01-07 03:34:14 +00:00
2016-06-12 00:24:04 +00:00
Audio2_loopchannel:
2014-01-07 03:34:14 +00:00
cp $fe ; is this command a loopchannel?
jp nz, Audio2_notetype ; no
call Audio2_GetNextMusicByte ; yes
2014-01-07 03:34:14 +00:00
ld e, a
and a
jr z, .infiniteLoop
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelLoopCounters
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
cp e
jr nz, .loopAgain
ld a, $1 ; if no more loops to make,
ld [hl], a
call Audio2_GetNextMusicByte ; skip pointer
call Audio2_GetNextMusicByte
jp Audio2_endchannel
2014-01-07 03:34:14 +00:00
.loopAgain ; inc loop count
inc a
ld [hl], a
; fall through
.infiniteLoop ; overwrite current address with pointer
call Audio2_GetNextMusicByte
2014-01-07 03:34:14 +00:00
push af
call Audio2_GetNextMusicByte
2014-01-07 03:34:14 +00:00
ld b, a
ld d, $0
ld a, c
add a
ld e, a
2015-08-09 05:32:44 +00:00
ld hl, wChannelCommandPointers
2014-01-07 03:34:14 +00:00
add hl, de
pop af
ld [hli], a
ld [hl], b
jp Audio2_endchannel
2014-01-07 03:34:14 +00:00
2016-06-12 00:24:04 +00:00
Audio2_notetype:
2014-01-07 03:34:14 +00:00
and $f0
cp $d0 ; is this command a notetype?
jp nz, Audio2_toggleperfectpitch ; no
2014-01-07 03:34:14 +00:00
ld a, d ; yes
and $f
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelNoteSpeeds
2014-01-07 03:34:14 +00:00
add hl, bc
ld [hl], a ; store low nibble as speed
ld a, c
2016-07-28 03:08:13 +00:00
cp Ch3
2014-01-07 03:34:14 +00:00
jr z, .noiseChannel ; noise channel has 0 params
call Audio2_GetNextMusicByte
2014-01-07 03:34:14 +00:00
ld d, a
ld a, c
2016-07-28 03:08:13 +00:00
cp Ch2
2014-01-07 03:34:14 +00:00
jr z, .musicChannel3
2016-07-28 03:08:13 +00:00
cp Ch6
2014-01-07 03:34:14 +00:00
jr nz, .notChannel3
2015-08-09 05:32:44 +00:00
ld hl, wSfxWaveInstrument
2014-01-07 03:34:14 +00:00
jr .sfxChannel3
.musicChannel3
2015-08-09 05:32:44 +00:00
ld hl, wMusicWaveInstrument
2014-01-07 03:34:14 +00:00
.sfxChannel3
ld a, d
and $f
ld [hl], a ; store low nibble of param as duty
ld a, d
and $30
sla a
ld d, a
; fall through
; if channel 3, store high nibble as volume
; else, store volume (high nibble) and fade (low nibble)
.notChannel3
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelVolumes
2014-01-07 03:34:14 +00:00
add hl, bc
ld [hl], d
.noiseChannel
jp Audio2_endchannel
2014-01-07 03:34:14 +00:00
2016-06-12 00:24:04 +00:00
Audio2_toggleperfectpitch:
2014-01-07 03:34:14 +00:00
ld a, d
2014-06-09 17:22:35 +00:00
cp $e8 ; is this command a toggleperfectpitch?
jr nz, Audio2_vibrato ; no
2014-01-07 03:34:14 +00:00
ld b, $0 ; yes
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags1
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
xor $1
2015-08-09 05:32:44 +00:00
ld [hl], a ; flip bit 0 of wChannelFlags1
jp Audio2_endchannel
2014-01-07 03:34:14 +00:00
2016-06-12 00:24:04 +00:00
Audio2_vibrato:
2014-01-07 03:34:14 +00:00
cp $ea ; is this command a vibrato?
jr nz, Audio2_pitchbend ; no
call Audio2_GetNextMusicByte ; yes
2014-01-07 03:34:14 +00:00
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelVibratoDelayCounters
2014-01-07 03:34:14 +00:00
add hl, bc
2014-06-09 20:58:02 +00:00
ld [hl], a ; store delay
2015-08-09 05:32:44 +00:00
ld hl, wChannelVibratoDelayCounterReloadValues
2014-01-07 03:34:14 +00:00
add hl, bc
2014-06-09 20:58:02 +00:00
ld [hl], a ; store delay
call Audio2_GetNextMusicByte
2014-01-07 03:34:14 +00:00
ld d, a
and $f0
swap a
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelVibratoExtents
2014-01-07 03:34:14 +00:00
add hl, bc
srl a
ld e, a
adc b
swap a
or e
ld [hl], a ; store rate as both high and low nibbles
ld a, d
and $f
ld d, a
2015-08-09 05:32:44 +00:00
ld hl, wChannelVibratoRates
2014-01-07 03:34:14 +00:00
add hl, bc
swap a
or d
ld [hl], a ; store depth as both high and low nibbles
jp Audio2_endchannel
2014-01-07 03:34:14 +00:00
2016-06-12 00:24:04 +00:00
Audio2_pitchbend:
2014-01-07 03:34:14 +00:00
cp $eb ; is this command a pitchbend?
jr nz, Audio2_duty ; no
call Audio2_GetNextMusicByte ; yes
2014-01-07 03:34:14 +00:00
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendLengthModifiers
2014-01-07 03:34:14 +00:00
add hl, bc
ld [hl], a ; store first param
call Audio2_GetNextMusicByte
2014-01-07 03:34:14 +00:00
ld d, a
and $f0
swap a
ld b, a
ld a, d
and $f
call Audio2_22017
2014-01-07 03:34:14 +00:00
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendTargetFrequencyHighBytes
2014-01-07 03:34:14 +00:00
add hl, bc
ld [hl], d ; store unknown part of second param
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendTargetFrequencyLowBytes
2014-01-07 03:34:14 +00:00
add hl, bc
ld [hl], e ; store unknown part of second param
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags1
2014-01-07 03:34:14 +00:00
add hl, bc
set 4, [hl] ; set pitchbend flag
call Audio2_GetNextMusicByte
2014-01-07 03:34:14 +00:00
ld d, a
jp Audio2_notelength
2014-01-07 03:34:14 +00:00
2016-06-12 00:24:04 +00:00
Audio2_duty:
2014-01-07 03:34:14 +00:00
cp $ec ; is this command a duty?
jr nz, Audio2_tempo ; no
call Audio2_GetNextMusicByte ; yes
2014-01-07 03:34:14 +00:00
rrca
rrca
and $c0
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelDuties
2014-01-07 03:34:14 +00:00
add hl, bc
ld [hl], a ; store duty
jp Audio2_endchannel
2014-01-07 03:34:14 +00:00
2016-06-12 00:24:04 +00:00
Audio2_tempo:
2014-01-07 03:34:14 +00:00
cp $ed ; is this command a tempo?
jr nz, Audio2_stereopanning ; no
2014-01-07 03:34:14 +00:00
ld a, c ; yes
2016-07-28 03:08:13 +00:00
cp Ch4
2014-01-07 03:34:14 +00:00
jr nc, .sfxChannel
call Audio2_GetNextMusicByte
2015-08-09 05:32:44 +00:00
ld [wMusicTempo], a ; store first param
call Audio2_GetNextMusicByte
2015-08-09 05:32:44 +00:00
ld [wMusicTempo + 1], a ; store second param
2014-01-07 03:34:14 +00:00
xor a
2015-08-09 05:32:44 +00:00
ld [wChannelNoteDelayCountersFractionalPart], a ; clear RAM
ld [wChannelNoteDelayCountersFractionalPart + 1], a
ld [wChannelNoteDelayCountersFractionalPart + 2], a
ld [wChannelNoteDelayCountersFractionalPart + 3], a
2014-01-07 03:34:14 +00:00
jr .musicChannelDone
.sfxChannel
call Audio2_GetNextMusicByte
2015-08-09 05:32:44 +00:00
ld [wSfxTempo], a ; store first param
call Audio2_GetNextMusicByte
2015-08-09 05:32:44 +00:00
ld [wSfxTempo + 1], a ; store second param
2014-01-07 03:34:14 +00:00
xor a
2015-08-09 05:32:44 +00:00
ld [wChannelNoteDelayCountersFractionalPart + 4], a ; clear RAM
ld [wChannelNoteDelayCountersFractionalPart + 5], a
ld [wChannelNoteDelayCountersFractionalPart + 6], a
ld [wChannelNoteDelayCountersFractionalPart + 7], a
2014-01-07 03:34:14 +00:00
.musicChannelDone
jp Audio2_endchannel
2014-01-07 03:34:14 +00:00
2016-06-12 00:24:04 +00:00
Audio2_stereopanning:
2014-06-09 17:22:35 +00:00
cp $ee ; is this command a stereopanning?
jr nz, Audio2_unknownmusic0xef ; no
call Audio2_GetNextMusicByte ; yes
2015-08-09 05:32:44 +00:00
ld [wStereoPanning], a ; store panning
jp Audio2_endchannel
2014-01-07 03:34:14 +00:00
; this appears to never be used
2016-06-12 00:24:04 +00:00
Audio2_unknownmusic0xef:
2014-01-07 03:34:14 +00:00
cp $ef ; is this command an unknownmusic0xef?
jr nz, Audio2_dutycycle ; no
call Audio2_GetNextMusicByte ; yes
2014-01-07 03:34:14 +00:00
push bc
2015-08-09 05:32:44 +00:00
call Audio2_PlaySound
2014-01-07 03:34:14 +00:00
pop bc
2015-08-09 05:32:44 +00:00
ld a, [wDisableChannelOutputWhenSfxEnds]
2014-01-07 03:34:14 +00:00
and a
jr nz, .skip
2016-07-28 03:08:13 +00:00
ld a, [wChannelSoundIDs + Ch7]
2015-08-09 05:32:44 +00:00
ld [wDisableChannelOutputWhenSfxEnds], a
2014-01-07 03:34:14 +00:00
xor a
2016-07-28 03:08:13 +00:00
ld [wChannelSoundIDs + Ch7], a
2014-01-07 03:34:14 +00:00
.skip
jp Audio2_endchannel
2014-01-07 03:34:14 +00:00
2016-06-12 00:24:04 +00:00
Audio2_dutycycle:
2014-01-07 03:34:14 +00:00
cp $fc ; is this command a dutycycle?
jr nz, Audio2_volume ; no
call Audio2_GetNextMusicByte ; yes
2014-01-07 03:34:14 +00:00
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelDutyCycles
2014-01-07 03:34:14 +00:00
add hl, bc
ld [hl], a ; store full cycle
and $c0
2015-08-09 05:32:44 +00:00
ld hl, wChannelDuties
2014-01-07 03:34:14 +00:00
add hl, bc
ld [hl], a ; store first duty
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags1
2014-01-07 03:34:14 +00:00
add hl, bc
set 6, [hl] ; set dutycycle flag
jp Audio2_endchannel
2014-01-07 03:34:14 +00:00
2016-06-12 00:24:04 +00:00
Audio2_volume:
2014-06-09 17:22:35 +00:00
cp $f0 ; is this command a volume?
jr nz, Audio2_executemusic ; no
call Audio2_GetNextMusicByte ; yes
2015-08-09 05:32:44 +00:00
ld [rNR50], a ; store volume
jp Audio2_endchannel
2014-01-07 03:34:14 +00:00
2016-06-12 00:24:04 +00:00
Audio2_executemusic:
2014-01-07 03:34:14 +00:00
cp $f8 ; is this command an executemusic?
jr nz, Audio2_octave ; no
2014-01-07 03:34:14 +00:00
ld b, $0 ; yes
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags2
2014-01-07 03:34:14 +00:00
add hl, bc
set 0, [hl]
jp Audio2_endchannel
2014-01-07 03:34:14 +00:00
2016-06-12 00:24:04 +00:00
Audio2_octave:
2014-01-07 03:34:14 +00:00
and $f0
cp $e0 ; is this command an octave?
jr nz, Audio2_sfxnote ; no
2015-08-09 05:32:44 +00:00
ld hl, wChannelOctaves ; yes
2014-01-07 03:34:14 +00:00
ld b, $0
add hl, bc
ld a, d
and $f
ld [hl], a ; store low nibble as octave
jp Audio2_endchannel
2014-01-07 03:34:14 +00:00
; sfxnote is either squarenote or noisenote depending on the channel
Audio2_sfxnote:
cp $20 ; is this command an sfxnote?
jr nz, Audio2_pitchenvelope ; no
2014-01-07 03:34:14 +00:00
ld a, c
2016-07-28 03:08:13 +00:00
cp Ch3 ; is this a noise or sfx channel?
jr c, Audio2_pitchenvelope ; no
2014-01-07 03:34:14 +00:00
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags2
2014-01-07 03:34:14 +00:00
add hl, bc
bit 0, [hl]
jr nz, Audio2_pitchenvelope ; no
call Audio2_notelength
2014-01-07 03:34:14 +00:00
ld d, a
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelDuties
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
or d
ld d, a
ld b, $1
call Audio2_21ff7
2014-01-07 03:34:14 +00:00
ld [hl], d
call Audio2_GetNextMusicByte
2014-01-07 03:34:14 +00:00
ld d, a
ld b, $2
call Audio2_21ff7
2014-01-07 03:34:14 +00:00
ld [hl], d
call Audio2_GetNextMusicByte
2014-01-07 03:34:14 +00:00
ld e, a
ld a, c
2016-07-28 03:08:13 +00:00
cp Ch7
2014-01-07 03:34:14 +00:00
ld a, $0
jr z, .sfxNoiseChannel ; only two params for noise channel
push de
call Audio2_GetNextMusicByte
2014-01-07 03:34:14 +00:00
pop de
.sfxNoiseChannel
ld d, a
push de
call Audio2_21daa
call Audio2_21d79
2014-01-07 03:34:14 +00:00
pop de
call Audio2_21dcc
2014-01-07 03:34:14 +00:00
ret
Audio2_pitchenvelope:
2014-01-07 03:34:14 +00:00
ld a, c
2016-07-28 03:08:13 +00:00
cp Ch4
jr c, Audio2_note ; if not a sfx
2014-01-07 03:34:14 +00:00
ld a, d
cp $10 ; is this command a pitchenvelope?
jr nz, Audio2_note ; no
2014-01-07 03:34:14 +00:00
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags2
2014-01-07 03:34:14 +00:00
add hl, bc
bit 0, [hl]
jr nz, Audio2_note ; no
call Audio2_GetNextMusicByte ; yes
2015-08-09 05:32:44 +00:00
ld [rNR10], a
jp Audio2_endchannel
2014-01-07 03:34:14 +00:00
2016-06-12 00:24:04 +00:00
Audio2_note:
2014-01-07 03:34:14 +00:00
ld a, c
2016-07-28 03:08:13 +00:00
cp Ch3
jr nz, Audio2_notelength ; if not noise channel
2014-01-07 03:34:14 +00:00
ld a, d
and $f0
cp $b0 ; is this command a dnote?
jr z, Audio2_dnote ; yes
jr nc, Audio2_notelength ; no
2014-01-07 03:34:14 +00:00
swap a
ld b, a
ld a, d
and $f
ld d, a
ld a, b
push de
push bc
jr asm_21c7e
2016-06-12 00:24:04 +00:00
Audio2_dnote:
2014-01-07 03:34:14 +00:00
ld a, d
and $f
push af
push bc
call Audio2_GetNextMusicByte ; get dnote instrument
2014-01-07 03:34:14 +00:00
asm_21c7e
ld d, a
2015-08-09 05:32:44 +00:00
ld a, [wDisableChannelOutputWhenSfxEnds]
2014-01-07 03:34:14 +00:00
and a
jr nz, .asm_21c89
ld a, d
2015-08-09 05:32:44 +00:00
call Audio2_PlaySound
2014-01-07 03:34:14 +00:00
.asm_21c89
pop bc
pop de
2016-06-12 00:24:04 +00:00
Audio2_notelength:
2014-01-07 03:34:14 +00:00
ld a, d
push af
and $f
inc a
ld b, $0
ld e, a ; store note length (in 16ths)
ld d, b
2015-08-09 05:32:44 +00:00
ld hl, wChannelNoteSpeeds
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
ld l, b
call Audio2_22006
2014-01-07 03:34:14 +00:00
ld a, c
2016-07-28 03:08:13 +00:00
cp Ch4
2014-01-07 03:34:14 +00:00
jr nc, .sfxChannel
2015-08-09 05:32:44 +00:00
ld a, [wMusicTempo]
2014-01-07 03:34:14 +00:00
ld d, a
2015-08-09 05:32:44 +00:00
ld a, [wMusicTempo + 1]
2014-01-07 03:34:14 +00:00
ld e, a
jr .skip
.sfxChannel
ld d, $1
ld e, $0
2016-07-28 03:08:13 +00:00
cp Ch7
2014-01-07 03:34:14 +00:00
jr z, .skip ; if noise channel
call Audio2_21e2f
2015-08-09 05:32:44 +00:00
ld a, [wSfxTempo]
2014-01-07 03:34:14 +00:00
ld d, a
2015-08-09 05:32:44 +00:00
ld a, [wSfxTempo + 1]
2014-01-07 03:34:14 +00:00
ld e, a
.skip
ld a, l
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelNoteDelayCountersFractionalPart
2014-01-07 03:34:14 +00:00
add hl, bc
ld l, [hl]
call Audio2_22006
2014-01-07 03:34:14 +00:00
ld e, l
ld d, h
2015-08-09 05:32:44 +00:00
ld hl, wChannelNoteDelayCountersFractionalPart
2014-01-07 03:34:14 +00:00
add hl, bc
ld [hl], e
ld a, d
2015-08-09 05:32:44 +00:00
ld hl, wChannelNoteDelayCounters
2014-01-07 03:34:14 +00:00
add hl, bc
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags2
2014-01-07 03:34:14 +00:00
add hl, bc
bit 0, [hl]
jr nz, Audio2_notepitch
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags1
2014-01-07 03:34:14 +00:00
add hl, bc
bit 2, [hl]
jr z, Audio2_notepitch
2014-01-07 03:34:14 +00:00
pop hl
ret
2016-06-12 00:24:04 +00:00
Audio2_notepitch:
2014-01-07 03:34:14 +00:00
pop af
and $f0
cp $c0 ; compare to rest
jr nz, .notRest
ld a, c
2016-07-28 03:08:13 +00:00
cp Ch4
2014-01-07 03:34:14 +00:00
jr nc, .sfxChannel
2016-07-28 03:08:13 +00:00
ld hl, wChannelSoundIDs + Ch4
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
and a
jr nz, .done
; fall through
.sfxChannel
ld a, c
2016-07-28 03:08:13 +00:00
cp Ch2
2014-01-07 03:34:14 +00:00
jr z, .musicChannel3
2016-07-28 03:08:13 +00:00
cp Ch6
2014-01-07 03:34:14 +00:00
jr nz, .notSfxChannel3
.musicChannel3
ld b, $0
ld hl, Unknown_222de
add hl, bc
2015-08-09 05:32:44 +00:00
ld a, [rNR51]
2014-01-07 03:34:14 +00:00
and [hl]
2015-08-09 05:32:44 +00:00
ld [rNR51], a
2014-01-07 03:34:14 +00:00
jr .done
.notSfxChannel3
ld b, $2
call Audio2_21ff7
2014-01-07 03:34:14 +00:00
ld a, $8
ld [hli], a
inc hl
ld a, $80
ld [hl], a
.done
ret
.notRest
swap a
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelOctaves
2014-01-07 03:34:14 +00:00
add hl, bc
ld b, [hl]
call Audio2_22017
2014-01-07 03:34:14 +00:00
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags1
2014-01-07 03:34:14 +00:00
add hl, bc
bit 4, [hl]
jr z, .asm_21d39
call Audio2_21f4e
2014-01-07 03:34:14 +00:00
.asm_21d39
push de
ld a, c
2016-07-28 03:08:13 +00:00
cp Ch4
2014-01-07 03:34:14 +00:00
jr nc, .skip ; if sfx channel
2016-07-28 03:08:13 +00:00
ld hl, wChannelSoundIDs + Ch4
2014-01-07 03:34:14 +00:00
ld d, $0
ld e, a
add hl, de
ld a, [hl]
and a
jr nz, .asm_21d4c
jr .skip
.asm_21d4c
pop de
ret
.skip
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelVolumes
2014-01-07 03:34:14 +00:00
add hl, bc
ld d, [hl]
ld b, $2
call Audio2_21ff7
2014-01-07 03:34:14 +00:00
ld [hl], d
call Audio2_21daa
call Audio2_21d79
2014-01-07 03:34:14 +00:00
pop de
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags1
2014-01-07 03:34:14 +00:00
add hl, bc
2014-06-09 17:22:35 +00:00
bit 0, [hl] ; has toggleperfectpitch been used?
jr z, .skip2
inc e ; if yes, increment the pitch by 1
jr nc, .skip2
2014-01-07 03:34:14 +00:00
inc d
2014-06-09 17:22:35 +00:00
.skip2
2015-08-09 05:32:44 +00:00
ld hl, wChannelFrequencyLowBytes
2014-01-07 03:34:14 +00:00
add hl, bc
ld [hl], e
call Audio2_21dcc
2014-01-07 03:34:14 +00:00
ret
2016-06-12 00:24:04 +00:00
Audio2_21d79:
2014-01-07 03:34:14 +00:00
ld b, $0
ld hl, Unknown_222e6
add hl, bc
2015-08-09 05:32:44 +00:00
ld a, [rNR51]
2014-01-07 03:34:14 +00:00
or [hl]
ld d, a
ld a, c
2016-07-28 03:08:13 +00:00
cp Ch7
2014-01-07 03:34:14 +00:00
jr z, .sfxNoiseChannel
2016-07-28 03:08:13 +00:00
cp Ch4
2014-01-07 03:34:14 +00:00
jr nc, .skip ; if sfx channel
2016-07-28 03:08:13 +00:00
ld hl, wChannelSoundIDs + Ch4
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
and a
jr nz, .skip
.sfxNoiseChannel
2015-08-09 05:32:44 +00:00
ld a, [wStereoPanning]
2014-01-07 03:34:14 +00:00
ld hl, Unknown_222e6
add hl, bc
and [hl]
ld d, a
2015-08-09 05:32:44 +00:00
ld a, [rNR51]
2014-01-07 03:34:14 +00:00
ld hl, Unknown_222de
add hl, bc
and [hl]
or d
ld d, a
.skip
ld a, d
2015-08-09 05:32:44 +00:00
ld [rNR51], a
2014-01-07 03:34:14 +00:00
ret
2016-06-12 00:24:04 +00:00
Audio2_21daa:
2014-01-07 03:34:14 +00:00
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelNoteDelayCounters
2014-01-07 03:34:14 +00:00
add hl, bc
ld d, [hl]
ld a, c
2016-07-28 03:08:13 +00:00
cp Ch2
2014-01-07 03:34:14 +00:00
jr z, .channel3 ; if music channel 3
2016-07-28 03:08:13 +00:00
cp Ch6
2014-01-07 03:34:14 +00:00
jr z, .channel3 ; if sfx channel 3
ld a, d
and $3f
ld d, a
2015-08-09 05:32:44 +00:00
ld hl, wChannelDuties
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
or d
ld d, a
.channel3
ld b, $1
call Audio2_21ff7
2014-01-07 03:34:14 +00:00
ld [hl], d
ret
2016-06-12 00:24:04 +00:00
Audio2_21dcc:
2014-01-07 03:34:14 +00:00
ld a, c
2016-07-28 03:08:13 +00:00
cp Ch2
2014-01-07 03:34:14 +00:00
jr z, .channel3
2016-07-28 03:08:13 +00:00
cp Ch6
2014-01-07 03:34:14 +00:00
jr nz, .notSfxChannel3
; fall through
.channel3
push de
2015-08-09 05:32:44 +00:00
ld de, wMusicWaveInstrument
2016-07-28 03:08:13 +00:00
cp Ch2
2014-01-07 03:34:14 +00:00
jr z, .musicChannel3
2015-08-09 05:32:44 +00:00
ld de, wSfxWaveInstrument
2014-01-07 03:34:14 +00:00
.musicChannel3
ld a, [de]
add a
ld d, $0
ld e, a
ld hl, Audio2_WavePointers
2014-01-07 03:34:14 +00:00
add hl, de
ld e, [hl]
inc hl
ld d, [hl]
ld hl, $ff30
ld b, $f
ld a, $0
2015-08-09 05:32:44 +00:00
ld [rNR30], a
2014-01-07 03:34:14 +00:00
.loop
ld a, [de]
inc de
ld [hli], a
ld a, b
dec b
and a
jr nz, .loop
ld a, $80
2015-08-09 05:32:44 +00:00
ld [rNR30], a
2014-01-07 03:34:14 +00:00
pop de
.notSfxChannel3
ld a, d
or $80
and $c7
ld d, a
ld b, $3
call Audio2_21ff7
2014-01-07 03:34:14 +00:00
ld [hl], e
inc hl
ld [hl], d
ld a, c
2016-07-28 03:08:13 +00:00
cp Ch4
2014-01-07 03:34:14 +00:00
jr c, .musicChannel
call Audio2_21e56
2014-01-07 03:34:14 +00:00
.musicChannel
ret
2016-06-12 00:24:04 +00:00
Audio2_21e19:
2014-01-07 03:34:14 +00:00
ld a, c
2016-07-28 03:08:13 +00:00
cp Ch4
2014-01-07 03:34:14 +00:00
jr nz, .asm_21e2e
ld a, [wLowHealthAlarm]
2014-01-07 03:34:14 +00:00
bit 7, a
jr z, .asm_21e2e
xor a
2015-08-09 05:32:44 +00:00
ld [wFrequencyModifier], a
2014-01-07 03:34:14 +00:00
ld a, $80
2015-08-09 05:32:44 +00:00
ld [wTempoModifier], a
2014-01-07 03:34:14 +00:00
.asm_21e2e
ret
2016-06-12 00:24:04 +00:00
Audio2_21e2f:
call Audio2_21e8b
2014-01-07 03:34:14 +00:00
jr c, .asm_21e39
call Audio2_21e9f
2014-01-07 03:34:14 +00:00
jr nc, .asm_21e4c
.asm_21e39
ld d, $0
2015-08-09 05:32:44 +00:00
ld a, [wTempoModifier]
2014-01-07 03:34:14 +00:00
add $80
jr nc, .asm_21e43
inc d
.asm_21e43
2015-08-09 05:32:44 +00:00
ld [wSfxTempo + 1], a
2014-01-07 03:34:14 +00:00
ld a, d
2015-08-09 05:32:44 +00:00
ld [wSfxTempo], a
2014-01-07 03:34:14 +00:00
jr .asm_21e55
.asm_21e4c
xor a
2015-08-09 05:32:44 +00:00
ld [wSfxTempo + 1], a
2014-01-07 03:34:14 +00:00
ld a, $1
2015-08-09 05:32:44 +00:00
ld [wSfxTempo], a
2014-01-07 03:34:14 +00:00
.asm_21e55
ret
2016-06-12 00:24:04 +00:00
Audio2_21e56:
call Audio2_21e8b
2014-01-07 03:34:14 +00:00
jr c, .asm_21e60
call Audio2_21e9f
2014-01-07 03:34:14 +00:00
jr nc, .asm_21e6c
.asm_21e60
2015-08-09 05:32:44 +00:00
ld a, [wFrequencyModifier]
2014-01-07 03:34:14 +00:00
add e
jr nc, .asm_21e67
inc d
.asm_21e67
dec hl
ld e, a
ld [hl], e
inc hl
ld [hl], d
.asm_21e6c
ret
2016-06-12 00:24:04 +00:00
Audio2_21e6d:
call Audio2_21e8b
2014-01-07 03:34:14 +00:00
jr nc, .asm_21e88
2015-08-09 05:32:44 +00:00
ld hl, wChannelCommandPointers
2014-01-07 03:34:14 +00:00
ld e, c
ld d, $0
sla e
rl d
add hl, de
ld a, [hl]
sub $1
ld [hl], a
inc hl
ld a, [hl]
sbc $0
ld [hl], a
scf
ret
.asm_21e88
scf
ccf
ret
2016-06-12 00:24:04 +00:00
Audio2_21e8b:
2016-07-28 03:08:13 +00:00
ld a, [wChannelSoundIDs + Ch4]
2014-01-07 03:34:14 +00:00
cp $14
jr nc, .asm_21e94
jr .asm_21e9a
.asm_21e94
cp $86
jr z, .asm_21e9a
jr c, .asm_21e9d
.asm_21e9a
scf
ccf
ret
.asm_21e9d
scf
ret
2016-06-12 00:24:04 +00:00
Audio2_21e9f:
2016-07-28 03:08:13 +00:00
ld a, [wChannelSoundIDs + Ch7]
2014-01-07 03:34:14 +00:00
ld b, a
2016-07-28 03:08:13 +00:00
ld a, [wChannelSoundIDs + Ch4]
2014-01-07 03:34:14 +00:00
or b
cp $9d
jr nc, .asm_21ead
jr .asm_21eb3
.asm_21ead
cp $ea
jr z, .asm_21eb3
jr c, .asm_21eb6
.asm_21eb3
scf
ccf
ret
.asm_21eb6
scf
ret
2016-06-12 00:24:04 +00:00
Audio2_ApplyPitchBend:
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags1
2014-01-07 03:34:14 +00:00
add hl, bc
bit 5, [hl]
jp nz, .asm_21eff
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendCurrentFrequencyLowBytes
2014-01-07 03:34:14 +00:00
add hl, bc
ld e, [hl]
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendCurrentFrequencyHighBytes
2014-01-07 03:34:14 +00:00
add hl, bc
ld d, [hl]
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendFrequencySteps
2014-01-07 03:34:14 +00:00
add hl, bc
ld l, [hl]
ld h, b
add hl, de
ld d, h
ld e, l
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendCurrentFrequencyFractionalPart
2014-01-07 03:34:14 +00:00
add hl, bc
push hl
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendFrequencyStepsFractionalPart
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
pop hl
add [hl]
ld [hl], a
ld a, $0
adc e
ld e, a
ld a, $0
adc d
ld d, a
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendTargetFrequencyHighBytes
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
cp d
jp c, .asm_21f45
jr nz, .asm_21f32
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendTargetFrequencyLowBytes
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
cp e
jp c, .asm_21f45
jr .asm_21f32
.asm_21eff
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendCurrentFrequencyLowBytes
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendCurrentFrequencyHighBytes
2014-01-07 03:34:14 +00:00
add hl, bc
ld d, [hl]
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendFrequencySteps
2014-01-07 03:34:14 +00:00
add hl, bc
ld e, [hl]
sub e
ld e, a
ld a, d
sbc b
ld d, a
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendFrequencyStepsFractionalPart
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
add a
ld [hl], a
ld a, e
sbc b
ld e, a
ld a, d
sbc b
ld d, a
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendTargetFrequencyHighBytes
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, d
cp [hl]
jr c, .asm_21f45
jr nz, .asm_21f32
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendTargetFrequencyLowBytes
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, e
cp [hl]
jr c, .asm_21f45
.asm_21f32
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendCurrentFrequencyLowBytes
2014-01-07 03:34:14 +00:00
add hl, bc
ld [hl], e
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendCurrentFrequencyHighBytes
2014-01-07 03:34:14 +00:00
add hl, bc
ld [hl], d
ld b, $3
call Audio2_21ff7
2014-01-07 03:34:14 +00:00
ld a, e
ld [hli], a
ld [hl], d
ret
.asm_21f45
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags1
2014-01-07 03:34:14 +00:00
add hl, bc
res 4, [hl]
res 5, [hl]
ret
2016-06-12 00:24:04 +00:00
Audio2_21f4e:
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendCurrentFrequencyHighBytes
2014-01-07 03:34:14 +00:00
add hl, bc
ld [hl], d
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendCurrentFrequencyLowBytes
2014-01-07 03:34:14 +00:00
add hl, bc
ld [hl], e
2015-08-09 05:32:44 +00:00
ld hl, wChannelNoteDelayCounters
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendLengthModifiers
2014-01-07 03:34:14 +00:00
add hl, bc
sub [hl]
jr nc, .asm_21f66
ld a, $1
.asm_21f66
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendTargetFrequencyLowBytes
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, e
sub [hl]
ld e, a
ld a, d
sbc b
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendTargetFrequencyHighBytes
2014-01-07 03:34:14 +00:00
add hl, bc
sub [hl]
jr c, .asm_21f82
ld d, a
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags1
2014-01-07 03:34:14 +00:00
add hl, bc
set 5, [hl]
jr .asm_21fa5
.asm_21f82
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendCurrentFrequencyHighBytes
2014-01-07 03:34:14 +00:00
add hl, bc
ld d, [hl]
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendCurrentFrequencyLowBytes
2014-01-07 03:34:14 +00:00
add hl, bc
ld e, [hl]
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendTargetFrequencyLowBytes
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
sub e
ld e, a
ld a, d
sbc b
ld d, a
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendTargetFrequencyHighBytes
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
sub d
ld d, a
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags1
2014-01-07 03:34:14 +00:00
add hl, bc
res 5, [hl]
.asm_21fa5
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendLengthModifiers
2014-01-07 03:34:14 +00:00
add hl, bc
.asm_21fa9
inc b
ld a, e
sub [hl]
ld e, a
jr nc, .asm_21fa9
ld a, d
and a
jr z, .asm_21fb7
dec a
ld d, a
jr .asm_21fa9
.asm_21fb7
ld a, e
add [hl]
ld d, b
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendFrequencySteps
2014-01-07 03:34:14 +00:00
add hl, bc
ld [hl], d
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendFrequencyStepsFractionalPart
2014-01-07 03:34:14 +00:00
add hl, bc
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendCurrentFrequencyFractionalPart
2014-01-07 03:34:14 +00:00
add hl, bc
ld [hl], a
ret
2016-06-12 00:24:04 +00:00
Audio2_ApplyDutyCycle:
2014-01-07 03:34:14 +00:00
ld b, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelDutyCycles
2014-01-07 03:34:14 +00:00
add hl, bc
ld a, [hl]
rlca
rlca
ld [hl], a
and $c0
ld d, a
ld b, $1
call Audio2_21ff7
2014-01-07 03:34:14 +00:00
ld a, [hl]
and $3f
or d
ld [hl], a
ret
2016-06-12 00:24:04 +00:00
Audio2_GetNextMusicByte:
2014-01-07 03:34:14 +00:00
ld d, $0
ld a, c
add a
ld e, a
2015-08-09 05:32:44 +00:00
ld hl, wChannelCommandPointers
2014-01-07 03:34:14 +00:00
add hl, de
ld a, [hli]
ld e, a
ld a, [hld]
ld d, a
ld a, [de] ; get next music command
inc de
ld [hl], e ; store address of next command
inc hl
ld [hl], d
ret
2016-06-12 00:24:04 +00:00
Audio2_21ff7:
2014-01-07 03:34:14 +00:00
ld a, c
ld hl, Unknown_222d6
add l
jr nc, .noCarry
inc h
.noCarry
ld l, a
ld a, [hl]
add b
ld l, a
ld h, $ff
ret
2016-06-12 00:24:04 +00:00
Audio2_22006:
2014-01-07 03:34:14 +00:00
ld h, $0
.loop
srl a
jr nc, .noCarry
add hl, de
.noCarry
sla e
rl d
and a
jr z, .done
jr .loop
.done
ret
2016-06-12 00:24:04 +00:00
Audio2_22017:
2014-01-07 03:34:14 +00:00
ld h, $0
ld l, a
add hl, hl
ld d, h
ld e, l
ld hl, Audio2_Pitches
2014-01-07 03:34:14 +00:00
add hl, de
ld e, [hl]
inc hl
ld d, [hl]
ld a, b
.loop
2016-07-28 03:08:13 +00:00
cp Ch7
2014-01-07 03:34:14 +00:00
jr z, .done
sra d
rr e
inc a
jr .loop
.done
ld a, $8
add d
ld d, a
ret
2016-06-12 00:24:04 +00:00
Audio2_PlaySound::
2015-08-09 05:32:44 +00:00
ld [wSoundID], a
2014-01-07 03:34:14 +00:00
cp $ff
jp z, Audio2_221f3
2014-01-07 03:34:14 +00:00
cp $e9
jp z, Audio2_2210d
jp c, Audio2_2210d
2014-01-07 03:34:14 +00:00
cp $fe
jr z, .asm_2204c
jp nc, Audio2_2210d
2014-01-07 03:34:14 +00:00
.asm_2204c
xor a
2015-08-09 05:32:44 +00:00
ld [wUnusedC000], a
ld [wDisableChannelOutputWhenSfxEnds], a
ld [wMusicTempo + 1], a
ld [wMusicWaveInstrument], a
ld [wSfxWaveInstrument], a
2014-01-07 03:34:14 +00:00
ld d, $8
2015-08-09 05:32:44 +00:00
ld hl, wChannelReturnAddresses
call FillAudioRAM2
2015-08-09 05:32:44 +00:00
ld hl, wChannelCommandPointers
call FillAudioRAM2
2014-01-07 03:34:14 +00:00
ld d, $4
2015-08-09 05:32:44 +00:00
ld hl, wChannelSoundIDs
call FillAudioRAM2
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags1
call FillAudioRAM2
2015-08-09 05:32:44 +00:00
ld hl, wChannelDuties
call FillAudioRAM2
2015-08-09 05:32:44 +00:00
ld hl, wChannelDutyCycles
call FillAudioRAM2
2015-08-09 05:32:44 +00:00
ld hl, wChannelVibratoDelayCounters
call FillAudioRAM2
2015-08-09 05:32:44 +00:00
ld hl, wChannelVibratoExtents
call FillAudioRAM2
2015-08-09 05:32:44 +00:00
ld hl, wChannelVibratoRates
call FillAudioRAM2
2015-08-09 05:32:44 +00:00
ld hl, wChannelFrequencyLowBytes
call FillAudioRAM2
2015-08-09 05:32:44 +00:00
ld hl, wChannelVibratoDelayCounterReloadValues
call FillAudioRAM2
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags2
call FillAudioRAM2
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendLengthModifiers
call FillAudioRAM2
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendFrequencySteps
call FillAudioRAM2
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendFrequencyStepsFractionalPart
call FillAudioRAM2
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendCurrentFrequencyFractionalPart
call FillAudioRAM2
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendCurrentFrequencyHighBytes
call FillAudioRAM2
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendCurrentFrequencyLowBytes
call FillAudioRAM2
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendTargetFrequencyHighBytes
call FillAudioRAM2
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendTargetFrequencyLowBytes
call FillAudioRAM2
2014-01-07 03:34:14 +00:00
ld a, $1
2015-08-09 05:32:44 +00:00
ld hl, wChannelLoopCounters
call FillAudioRAM2
2015-08-09 05:32:44 +00:00
ld hl, wChannelNoteDelayCounters
call FillAudioRAM2
2015-08-09 05:32:44 +00:00
ld hl, wChannelNoteSpeeds
call FillAudioRAM2
2015-08-09 05:32:44 +00:00
ld [wMusicTempo], a
2014-01-07 03:34:14 +00:00
ld a, $ff
2015-08-09 05:32:44 +00:00
ld [wStereoPanning], a
2014-01-07 03:34:14 +00:00
xor a
2015-08-09 05:32:44 +00:00
ld [rNR50], a
2014-01-07 03:34:14 +00:00
ld a, $8
2015-08-09 05:32:44 +00:00
ld [rNR10], a
2014-01-07 03:34:14 +00:00
ld a, $0
2015-08-09 05:32:44 +00:00
ld [rNR51], a
2014-01-07 03:34:14 +00:00
xor a
2015-08-09 05:32:44 +00:00
ld [rNR30], a
2014-01-07 03:34:14 +00:00
ld a, $80
2015-08-09 05:32:44 +00:00
ld [rNR30], a
2014-01-07 03:34:14 +00:00
ld a, $77
2015-08-09 05:32:44 +00:00
ld [rNR50], a
jp Audio2_2224e
2014-01-07 03:34:14 +00:00
2016-06-12 00:24:04 +00:00
Audio2_2210d:
2014-01-07 03:34:14 +00:00
ld l, a
ld e, a
ld h, $0
ld d, h
add hl, hl
add hl, de
ld de, SFX_Headers_2
2014-01-07 03:34:14 +00:00
add hl, de
ld a, h
2015-08-09 05:32:44 +00:00
ld [wSfxHeaderPointer], a
2014-01-07 03:34:14 +00:00
ld a, l
2015-08-09 05:32:44 +00:00
ld [wSfxHeaderPointer + 1], a
2014-01-07 03:34:14 +00:00
ld a, [hl]
and $c0
rlca
rlca
ld c, a
.asm_22126
ld d, c
ld a, c
add a
add c
ld c, a
ld b, $0
2015-08-09 05:32:44 +00:00
ld a, [wSfxHeaderPointer]
2014-01-07 03:34:14 +00:00
ld h, a
2015-08-09 05:32:44 +00:00
ld a, [wSfxHeaderPointer + 1]
2014-01-07 03:34:14 +00:00
ld l, a
add hl, bc
ld c, d
ld a, [hl]
and $f
ld e, a
ld d, $0
2015-08-09 05:32:44 +00:00
ld hl, wChannelSoundIDs
2014-01-07 03:34:14 +00:00
add hl, de
ld a, [hl]
and a
jr z, .asm_22162
ld a, e
cp $7
jr nz, .asm_22159
2015-08-09 05:32:44 +00:00
ld a, [wSoundID]
2014-01-07 03:34:14 +00:00
cp $14
jr nc, .asm_22152
ret
.asm_22152
ld a, [hl]
cp $14
jr z, .asm_22162
jr c, .asm_22162
.asm_22159
2015-08-09 05:32:44 +00:00
ld a, [wSoundID]
2014-01-07 03:34:14 +00:00
cp [hl]
jr z, .asm_22162
jr c, .asm_22162
ret
.asm_22162
xor a
push de
ld h, d
ld l, e
add hl, hl
ld d, h
ld e, l
2015-08-09 05:32:44 +00:00
ld hl, wChannelReturnAddresses
2014-01-07 03:34:14 +00:00
add hl, de
ld [hli], a
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelCommandPointers
2014-01-07 03:34:14 +00:00
add hl, de
ld [hli], a
ld [hl], a
pop de
2015-08-09 05:32:44 +00:00
ld hl, wChannelSoundIDs
2014-01-07 03:34:14 +00:00
add hl, de
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags1
2014-01-07 03:34:14 +00:00
add hl, de
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelDuties
2014-01-07 03:34:14 +00:00
add hl, de
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelDutyCycles
2014-01-07 03:34:14 +00:00
add hl, de
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelVibratoDelayCounters
2014-01-07 03:34:14 +00:00
add hl, de
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelVibratoExtents
2014-01-07 03:34:14 +00:00
add hl, de
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelVibratoRates
2014-01-07 03:34:14 +00:00
add hl, de
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelFrequencyLowBytes
2014-01-07 03:34:14 +00:00
add hl, de
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelVibratoDelayCounterReloadValues
2014-01-07 03:34:14 +00:00
add hl, de
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendLengthModifiers
2014-01-07 03:34:14 +00:00
add hl, de
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendFrequencySteps
2014-01-07 03:34:14 +00:00
add hl, de
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendFrequencyStepsFractionalPart
2014-01-07 03:34:14 +00:00
add hl, de
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendCurrentFrequencyFractionalPart
2014-01-07 03:34:14 +00:00
add hl, de
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendCurrentFrequencyHighBytes
2014-01-07 03:34:14 +00:00
add hl, de
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendCurrentFrequencyLowBytes
2014-01-07 03:34:14 +00:00
add hl, de
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendTargetFrequencyHighBytes
2014-01-07 03:34:14 +00:00
add hl, de
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelPitchBendTargetFrequencyLowBytes
2014-01-07 03:34:14 +00:00
add hl, de
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags2
2014-01-07 03:34:14 +00:00
add hl, de
ld [hl], a
ld a, $1
2015-08-09 05:32:44 +00:00
ld hl, wChannelLoopCounters
2014-01-07 03:34:14 +00:00
add hl, de
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelNoteDelayCounters
2014-01-07 03:34:14 +00:00
add hl, de
ld [hl], a
2015-08-09 05:32:44 +00:00
ld hl, wChannelNoteSpeeds
2014-01-07 03:34:14 +00:00
add hl, de
ld [hl], a
ld a, e
cp $4
jr nz, .asm_221ea
ld a, $8
2015-08-09 05:32:44 +00:00
ld [rNR10], a
2014-01-07 03:34:14 +00:00
.asm_221ea
ld a, c
and a
jp z, Audio2_2224e
2014-01-07 03:34:14 +00:00
dec c
jp .asm_22126
2016-06-12 00:24:04 +00:00
Audio2_221f3:
2014-01-07 03:34:14 +00:00
ld a, $80
2015-08-09 05:32:44 +00:00
ld [rNR52], a
ld [rNR30], a
2014-01-07 03:34:14 +00:00
xor a
2015-08-09 05:32:44 +00:00
ld [rNR51], a
ld [rNR32], a
2014-01-07 03:34:14 +00:00
ld a, $8
2015-08-09 05:32:44 +00:00
ld [rNR10], a
ld [rNR12], a
ld [rNR22], a
ld [rNR42], a
2014-01-07 03:34:14 +00:00
ld a, $40
2015-08-09 05:32:44 +00:00
ld [rNR14], a
ld [rNR24], a
ld [rNR44], a
2014-01-07 03:34:14 +00:00
ld a, $77
2015-08-09 05:32:44 +00:00
ld [rNR50], a
2014-01-07 03:34:14 +00:00
xor a
2015-08-09 05:32:44 +00:00
ld [wUnusedC000], a
ld [wDisableChannelOutputWhenSfxEnds], a
ld [wMuteAudioAndPauseMusic], a
ld [wMusicTempo + 1], a
ld [wSfxTempo + 1], a
ld [wMusicWaveInstrument], a
ld [wSfxWaveInstrument], a
2014-01-07 03:34:14 +00:00
ld d, $a0
2015-08-09 05:32:44 +00:00
ld hl, wChannelCommandPointers
call FillAudioRAM2
2014-01-07 03:34:14 +00:00
ld a, $1
ld d, $18
2015-08-09 05:32:44 +00:00
ld hl, wChannelNoteDelayCounters
call FillAudioRAM2
2015-08-09 05:32:44 +00:00
ld [wMusicTempo], a
ld [wSfxTempo], a
2014-01-07 03:34:14 +00:00
ld a, $ff
2015-08-09 05:32:44 +00:00
ld [wStereoPanning], a
2014-01-07 03:34:14 +00:00
ret
; fills d bytes at hl with a
2016-06-12 00:24:04 +00:00
FillAudioRAM2:
2014-01-07 03:34:14 +00:00
ld b, d
.loop
ld [hli], a
dec b
jr nz, .loop
ret
2016-06-12 00:24:04 +00:00
Audio2_2224e:
2015-08-09 05:32:44 +00:00
ld a, [wSoundID]
2014-01-07 03:34:14 +00:00
ld l, a
ld e, a
ld h, $0
ld d, h
add hl, hl
add hl, de
ld de, SFX_Headers_2
2014-01-07 03:34:14 +00:00
add hl, de
ld e, l
ld d, h
2015-08-09 05:32:44 +00:00
ld hl, wChannelCommandPointers
2014-01-07 03:34:14 +00:00
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
.asm_22270
cp c
jr z, .asm_22278
inc c
inc hl
inc hl
jr .asm_22270
.asm_22278
push hl
push bc
push af
ld b, $0
ld c, a
2015-08-09 05:32:44 +00:00
ld hl, wChannelSoundIDs
2014-01-07 03:34:14 +00:00
add hl, bc
2015-08-09 05:32:44 +00:00
ld a, [wSoundID]
2014-01-07 03:34:14 +00:00
ld [hl], a
pop af
cp $3
jr c, .asm_22291
2015-08-09 05:32:44 +00:00
ld hl, wChannelFlags1
2014-01-07 03:34:14 +00:00
add hl, bc
set 2, [hl]
.asm_22291
pop bc
pop hl
ld a, [de] ; get channel pointer
ld [hli], a
inc de
ld a, [de]
ld [hli], a
inc de
inc c
dec b
ld a, b
and a
ld a, [de]
inc de
jr nz, .asm_22270
2015-08-09 05:32:44 +00:00
ld a, [wSoundID]
2014-01-07 03:34:14 +00:00
cp $14
jr nc, .asm_222aa
jr .asm_222d4
.asm_222aa
2015-08-09 05:32:44 +00:00
ld a, [wSoundID]
2014-01-07 03:34:14 +00:00
cp $86
jr z, .asm_222d4
jr c, .asm_222b5
jr .asm_222d4
.asm_222b5
2016-07-28 03:08:13 +00:00
ld hl, wChannelSoundIDs + Ch4
2014-01-07 03:34:14 +00:00
ld [hli], a
ld [hli], a
ld [hli], a
ld [hl], a
2016-07-28 03:08:13 +00:00
ld hl, wChannelCommandPointers + Ch6 * 2 ; sfx noise channel pointer
ld de, Noise2_endchannel
2014-01-07 03:34:14 +00:00
ld [hl], e
inc hl
ld [hl], d ; overwrite pointer to point to endchannel
2015-08-09 05:32:44 +00:00
ld a, [wSavedVolume]
2014-01-07 03:34:14 +00:00
and a
jr nz, .asm_222d4
2015-08-09 05:32:44 +00:00
ld a, [rNR50]
ld [wSavedVolume], a
2014-01-07 03:34:14 +00:00
ld a, $77
2015-08-09 05:32:44 +00:00
ld [rNR50], a
2014-01-07 03:34:14 +00:00
.asm_222d4
ret
2016-06-12 00:24:04 +00:00
Noise2_endchannel:
2014-01-07 03:34:14 +00:00
endchannel
2016-06-12 00:24:04 +00:00
Unknown_222d6:
2014-01-07 03:34:14 +00:00
db $10, $15, $1A, $1F ; channels 0-3
db $10, $15, $1A, $1F ; channels 4-7
2016-06-12 00:24:04 +00:00
Unknown_222de:
2014-01-07 03:34:14 +00:00
db $EE, $DD, $BB, $77 ; channels 0-3
db $EE, $DD, $BB, $77 ; channels 4-7
2016-06-12 00:24:04 +00:00
Unknown_222e6:
2014-01-07 03:34:14 +00:00
db $11, $22, $44, $88 ; channels 0-3
db $11, $22, $44, $88 ; channels 4-7
2016-06-12 00:24:04 +00:00
Audio2_Pitches:
2014-06-09 17:22:35 +00:00
dw $F82C ; C_
dw $F89D ; C#
dw $F907 ; D_
dw $F96B ; D#
dw $F9CA ; E_
dw $FA23 ; F_
dw $FA77 ; F#
dw $FAC7 ; G_
dw $FB12 ; G#
dw $FB58 ; A_
dw $FB9B ; A#
dw $FBDA ; B_
2014-01-07 03:34:14 +00:00