diff options
Diffstat (limited to 'audio/engine_1.asm')
-rw-r--r-- | audio/engine_1.asm | 331 |
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_ |