summaryrefslogtreecommitdiff
path: root/audio/engine_1.asm
diff options
context:
space:
mode:
Diffstat (limited to 'audio/engine_1.asm')
-rw-r--r--audio/engine_1.asm331
1 files changed, 98 insertions, 233 deletions
diff --git a/audio/engine_1.asm b/audio/engine_1.asm
index 11962d55..bd021ab3 100644
--- a/audio/engine_1.asm
+++ b/audio/engine_1.asm
@@ -157,6 +157,15 @@ Audio1_PlayNextNote:
add hl, bc
res BIT_PITCH_SLIDE_ON, [hl]
res BIT_PITCH_SLIDE_DECREASING, [hl]
+ ld a, c
+ cp $4
+ jr nz, .asm_918c
+ ld a, [wLowHealthAlarm]
+ bit 7, a
+ jr z, .asm_918c
+ call Audio1_EnableChannelOutput
+ ret
+.asm_918c
call Audio1_sound_ret
ret
@@ -515,7 +524,8 @@ Audio1_unknownmusic0xef:
jr nz, Audio1_duty_cycle_pattern ; no
call Audio1_GetNextMusicByte
push bc
- call Audio1_PlaySound
+ ld b, a
+ call DetermineAudioFunction
pop bc
ld a, [wDisableChannelOutputWhenSfxEnds]
and a
@@ -681,8 +691,8 @@ Audio1_note:
ld a, [wDisableChannelOutputWhenSfxEnds]
and a
jr nz, .skipDnote
- ld a, d
- call Audio1_PlaySound
+ ld b, d
+ call DetermineAudioFunction
.skipDnote
pop bc
pop de
@@ -842,7 +852,7 @@ Audio1_note_pitch:
Audio1_EnableChannelOutput:
ld b, 0
- ld hl, Audio1_HWChannelEnableMasks
+ call Audio1_9972
add hl, bc
ld a, [rNR51]
or [hl] ; set this channel's bits
@@ -862,7 +872,7 @@ Audio1_EnableChannelOutput:
; If this is the SFX noise channel or a music channel whose corresponding
; SFX channel is off, apply stereo panning.
ld a, [wStereoPanning]
- ld hl, Audio1_HWChannelEnableMasks
+ call Audio1_9972
add hl, bc
and [hl]
ld d, a
@@ -950,12 +960,31 @@ Audio1_ApplyWavePatternAndFrequency:
ld [hl], e ; store frequency low byte
inc hl
ld [hl], d ; store frequency high byte
+ ld a, c
+ cp $4
+ jr c, .asm_9642
call Audio1_ApplyFrequencyModifier
+.asm_9642
+ ret
+.asm_9643
+ ld a, c
+ cp $4
+ ret nz
+ ld a, [wLowHealthAlarm]
+ bit 7, a
+ ret z
+ xor a
+ ld [wFrequencyModifier], a
+ ld a, $80
+ ld [wTempoModifier], a
ret
Audio1_SetSfxTempo:
call Audio1_IsCry
+ jr c, .isCry
+ call Audio1_96c3
jr nc, .notCry
+.isCry
ld d, 0
ld a, [wTempoModifier]
add $80
@@ -965,18 +994,20 @@ Audio1_SetSfxTempo:
ld [wSfxTempo + 1], a
ld a, d
ld [wSfxTempo], a
- jr .done
+ ret
.notCry
xor a
ld [wSfxTempo + 1], a
- ld a, $1
+ inc a
ld [wSfxTempo], a
-.done
ret
Audio1_ApplyFrequencyModifier:
call Audio1_IsCry
- jr nc, .done
+ jr c, .isCry
+ call Audio1_96c3
+ ret nc
+.isCry
; if playing a cry, add the cry's frequency modifier
ld a, [wFrequencyModifier]
add e
@@ -1010,8 +1041,7 @@ Audio1_GoBackOneCommandIfCry:
scf
ret
.done
- scf
- ccf
+ and a
ret
Audio1_IsCry:
@@ -1032,6 +1062,26 @@ Audio1_IsCry:
scf
ret
+Audio1_96c3:
+ ld a, [wAudioROMBank]
+ cp BANK(AudioEngine2)
+ jr nz, .asm_96dc
+ ld a, [wChannelSoundIDs + Ch8]
+ ld b, a
+ ld a, [wChannelSoundIDs + Ch5]
+ or b
+ cp $9d
+ jr c, .asm_96dc
+ cp $ea
+ jr z, .asm_96de
+ jr c, .asm_96de
+.asm_96dc
+ and a
+ ret
+.asm_96de
+ scf
+ ret
+
Audio1_ApplyPitchSlide:
ld hl, wChannelFlags1
add hl, bc
@@ -1254,21 +1304,7 @@ Audio1_ApplyDutyCyclePattern:
ret
Audio1_GetNextMusicByte:
- ld d, 0
- ld a, c
- add a
- ld e, a
- ld hl, wChannelCommandPointers
- 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
+ call GetNextMusicByte
ret
Audio1_GetRegisterPointer:
@@ -1330,6 +1366,7 @@ Audio1_CalculateFrequency:
Audio1_PlaySound::
ld [wSoundID], a
+ ld a, [wSoundID]
cp $ff
jp z, .stopAllAudio
cp MAX_SFX_ID_1
@@ -1340,76 +1377,7 @@ Audio1_PlaySound::
jp nc, .playSfx
.playMusic
- xor a
- ld [wUnusedC000], a
- ld [wDisableChannelOutputWhenSfxEnds], a
- ld [wMusicTempo + 1], a
- ld [wMusicWaveInstrument], a
- ld [wSfxWaveInstrument], a
- ld d, $8
- ld hl, wChannelReturnAddresses
- call .FillMem
- ld hl, wChannelCommandPointers
- call .FillMem
- ld d, $4
- ld hl, wChannelSoundIDs
- call .FillMem
- ld hl, wChannelFlags1
- call .FillMem
- ld hl, wChannelDutyCycles
- call .FillMem
- ld hl, wChannelDutyCyclePatterns
- call .FillMem
- ld hl, wChannelVibratoDelayCounters
- call .FillMem
- ld hl, wChannelVibratoExtents
- call .FillMem
- ld hl, wChannelVibratoRates
- call .FillMem
- ld hl, wChannelFrequencyLowBytes
- call .FillMem
- ld hl, wChannelVibratoDelayCounterReloadValues
- call .FillMem
- ld hl, wChannelFlags2
- call .FillMem
- ld hl, wChannelPitchSlideLengthModifiers
- call .FillMem
- ld hl, wChannelPitchSlideFrequencySteps
- call .FillMem
- ld hl, wChannelPitchSlideFrequencyStepsFractionalPart
- call .FillMem
- ld hl, wChannelPitchSlideCurrentFrequencyFractionalPart
- call .FillMem
- ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
- call .FillMem
- ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
- call .FillMem
- ld hl, wChannelPitchSlideTargetFrequencyHighBytes
- call .FillMem
- ld hl, wChannelPitchSlideTargetFrequencyLowBytes
- call .FillMem
- ld a, $1
- ld hl, wChannelLoopCounters
- call .FillMem
- ld hl, wChannelNoteDelayCounters
- call .FillMem
- ld hl, wChannelNoteSpeeds
- call .FillMem
- ld [wMusicTempo], a
- ld a, $ff
- ld [wStereoPanning], a
- xor a
- ld [rNR50], a
- ld a, $8
- ld [rNR10], a
- ld a, 0
- ld [rNR51], a
- xor a
- ld [rNR30], a
- ld a, $80
- ld [rNR30], a
- ld a, $77
- ld [rNR50], a
+ call InitMusicVariables
jp .playSoundCommon
.playSfx
@@ -1471,92 +1439,7 @@ Audio1_PlaySound::
jr c, .playChannel
ret
.playChannel
- xor a
- push de
- ld h, d
- ld l, e
- add hl, hl
- ld d, h
- ld e, l
- ld hl, wChannelReturnAddresses
- add hl, de
- ld [hli], a
- ld [hl], a
- ld hl, wChannelCommandPointers
- add hl, de
- ld [hli], a
- ld [hl], a
- pop de
- ld hl, wChannelSoundIDs
- add hl, de
- ld [hl], a
- ld hl, wChannelFlags1
- add hl, de
- ld [hl], a
- ld hl, wChannelDutyCycles
- add hl, de
- ld [hl], a
- ld hl, wChannelDutyCyclePatterns
- add hl, de
- ld [hl], a
- ld hl, wChannelVibratoDelayCounters
- add hl, de
- ld [hl], a
- ld hl, wChannelVibratoExtents
- add hl, de
- ld [hl], a
- ld hl, wChannelVibratoRates
- add hl, de
- ld [hl], a
- ld hl, wChannelFrequencyLowBytes
- add hl, de
- ld [hl], a
- ld hl, wChannelVibratoDelayCounterReloadValues
- add hl, de
- ld [hl], a
- ld hl, wChannelPitchSlideLengthModifiers
- add hl, de
- ld [hl], a
- ld hl, wChannelPitchSlideFrequencySteps
- add hl, de
- ld [hl], a
- ld hl, wChannelPitchSlideFrequencyStepsFractionalPart
- add hl, de
- ld [hl], a
- ld hl, wChannelPitchSlideCurrentFrequencyFractionalPart
- add hl, de
- ld [hl], a
- ld hl, wChannelPitchSlideCurrentFrequencyHighBytes
- add hl, de
- ld [hl], a
- ld hl, wChannelPitchSlideCurrentFrequencyLowBytes
- add hl, de
- ld [hl], a
- ld hl, wChannelPitchSlideTargetFrequencyHighBytes
- add hl, de
- ld [hl], a
- ld hl, wChannelPitchSlideTargetFrequencyLowBytes
- add hl, de
- ld [hl], a
- ld hl, wChannelFlags2
- add hl, de
- ld [hl], a
- ld a, $1
- ld hl, wChannelLoopCounters
- add hl, de
- ld [hl], a
- ld hl, wChannelNoteDelayCounters
- add hl, de
- ld [hl], a
- ld hl, wChannelNoteSpeeds
- add hl, de
- ld [hl], a
- ld a, e
- cp Ch5
- jr nz, .skipSweepDisable
- ld a, $8
- ld [rNR10], a ; sweep off
-.skipSweepDisable
+ call InitSFXVariables
ld a, c
and a
jp z, .playSoundCommon
@@ -1564,51 +1447,7 @@ Audio1_PlaySound::
jp .sfxChannelLoop
.stopAllAudio
- ld a, $80
- ld [rNR52], a ; sound hardware on
- ld [rNR30], a ; wave playback on
- xor a
- ld [rNR51], a ; no sound output
- ld [rNR32], a ; mute channel 3 (wave channel)
- ld a, $8
- ld [rNR10], a ; sweep off
- ld [rNR12], a ; mute channel 1 (pulse channel 1)
- ld [rNR22], a ; mute channel 2 (pulse channel 2)
- ld [rNR42], a ; mute channel 4 (noise channel)
- ld a, $40
- ld [rNR14], a ; counter mode
- ld [rNR24], a
- ld [rNR44], a
- ld a, $77
- ld [rNR50], a ; full volume
- xor a
- ld [wUnusedC000], a
- ld [wDisableChannelOutputWhenSfxEnds], a
- ld [wMuteAudioAndPauseMusic], a
- ld [wMusicTempo + 1], a
- ld [wSfxTempo + 1], a
- ld [wMusicWaveInstrument], a
- ld [wSfxWaveInstrument], a
- ld d, $a0
- ld hl, wChannelCommandPointers
- call .FillMem
- ld a, $1
- ld d, $18
- ld hl, wChannelNoteDelayCounters
- call .FillMem
- ld [wMusicTempo], a
- ld [wSfxTempo], a
- ld a, $ff
- ld [wStereoPanning], a
- ret
-
-; fills d bytes at hl with a
-.FillMem
- ld b, d
-.loop
- ld [hli], a
- dec b
- jr nz, .loop
+ call StopAllAudio
ret
.playSoundCommon
@@ -1644,16 +1483,11 @@ Audio1_PlaySound::
inc hl
jr .commandPointerLoop
.next
+ push af
push hl
push bc
- push af
ld b, 0
ld c, a
- ld hl, wChannelSoundIDs
- add hl, bc
- ld a, [wSoundID]
- ld [hl], a
- pop af
cp Ch4
jr c, .skipSettingFlag
ld hl, wChannelFlags1
@@ -1668,6 +1502,17 @@ Audio1_PlaySound::
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
@@ -1718,9 +1563,29 @@ Audio1_HWChannelDisableMasks:
db HW_CH1_DISABLE_MASK, HW_CH2_DISABLE_MASK, HW_CH3_DISABLE_MASK, HW_CH4_DISABLE_MASK ; channels 0-3
db HW_CH1_DISABLE_MASK, HW_CH2_DISABLE_MASK, HW_CH3_DISABLE_MASK, HW_CH4_DISABLE_MASK ; channels 4-7
+Audio1_9972:
+ push af
+ push bc
+ ld a, [wOptions]
+ and %110000 ; channel options
+ srl a
+ ld c, a
+ ld b, 0
+ ld hl, Audio1_HWChannelEnableMasks
+ add hl, bc
+ pop bc
+ pop af
+ ret
+
Audio1_HWChannelEnableMasks:
db HW_CH1_ENABLE_MASK, HW_CH2_ENABLE_MASK, HW_CH3_ENABLE_MASK, HW_CH4_ENABLE_MASK ; channels 0-3
db HW_CH1_ENABLE_MASK, HW_CH2_ENABLE_MASK, HW_CH3_ENABLE_MASK, HW_CH4_ENABLE_MASK ; channels 4-7
+ db $01,$20,$44,$88
+ db $11,$22,$44,$88
+ db $01,$20,$04,$80
+ db $01,$20,$04,$80
+ db $01,$02,$40,$80
+ db $01,$02,$40,$80
Audio1_Pitches:
dw $F82C ; C_