diff options
Diffstat (limited to 'audio/engine.asm')
-rw-r--r-- | audio/engine.asm | 221 |
1 files changed, 109 insertions, 112 deletions
diff --git a/audio/engine.asm b/audio/engine.asm index c8e976cc4..a4a9ac62f 100644 --- a/audio/engine.asm +++ b/audio/engine.asm @@ -111,7 +111,7 @@ _UpdateSound:: ; e805c cp $2 ; 1 or 0? jr c, .noteover dec [hl] - jr .asm_e8093 + jr .continue_sound_update .noteover ; reset vibrato delay @@ -124,12 +124,11 @@ _UpdateSound:: ; e805c ; turn vibrato off for now ld hl, Channel1Flags2 - Channel1 add hl, bc - res SOUND_UNKN_09, [hl] + res SOUND_PITCH_WHEEL, [hl] ; get next note call ParseMusic -.asm_e8093 - ; - call Functione84f9 +.continue_sound_update + call ApplyPitchWheel ; duty cycle ld hl, Channel1DutyCycle - Channel1 add hl, bc @@ -143,8 +142,8 @@ _UpdateSound:: ; e805c ld [wCurTrackFrequency], a ld a, [hl] ld [wCurTrackFrequency + 1], a - ; - call Functione8466 ; handle vibrato and other things + ; vibrato, noise + call HandleTrackVibrato ; handle vibrato and other things call HandleNoise ; turn off music when playing sfx? ld a, [SFXPriority] @@ -176,19 +175,19 @@ _UpdateSound:: ; e805c ; are we in a sfx channel right now? ld a, [CurChannel] cp $4 ; sfx - jr nc, .asm_e80ee + jr nc, .sfx_channel ld hl, Channel5Flags - Channel1 add hl, bc bit SOUND_CHANNEL_ON, [hl] - jr nz, .asm_e80fc -.asm_e80ee + jr nz, .sound_channel_on +.sfx_channel call UpdateChannels ld hl, Channel1Tracks - Channel1 add hl, bc ld a, [SoundOutput] or [hl] ld [SoundOutput], a -.asm_e80fc +.sound_channel_on ; clear note flags ld hl, Channel1NoteFlags - Channel1 add hl, bc @@ -719,16 +718,16 @@ FadeMusic: ; e8358 ; e83d1 LoadNote: ; e83d1 - ; check mute?? + ; wait for pitch wheel to finish ld hl, Channel1Flags2 - Channel1 add hl, bc - bit SOUND_UNKN_09, [hl] + bit SOUND_PITCH_WHEEL, [hl] ret z ; get note duration ld hl, Channel1NoteDuration - Channel1 add hl, bc ld a, [hl] - ld hl, wc297 ; ???? + ld hl, wCurNoteDuration sub [hl] jr nc, .ok ld a, 1 @@ -740,8 +739,8 @@ LoadNote: ; e83d1 ld e, [hl] inc hl ld d, [hl] - ; ???? - ld hl, Channel1Field0x21 - Channel1 + ; get direction of pitch wheel + ld hl, Channel1PitchWheelTarget - Channel1 add hl, bc ld a, e sub [hl] @@ -749,15 +748,13 @@ LoadNote: ; e83d1 ld a, d sbc a, 0 ld d, a - ; ???? - ld hl, Channel1Field0x22 - Channel1 + ld hl, Channel1PitchWheelTarget + 1 - Channel1 add hl, bc sub [hl] jr nc, .greater_than - ; ???? ld hl, Channel1Flags3 - Channel1 add hl, bc - set SOUND_UNKN_11, [hl] + set SOUND_PITCH_WHEEL_DIR, [hl] ; get frequency ld hl, Channel1Frequency - Channel1 add hl, bc @@ -765,7 +762,7 @@ LoadNote: ; e83d1 inc hl ld d, [hl] ; ???? - ld hl, Channel1Field0x21 - Channel1 + ld hl, Channel1PitchWheelTarget - Channel1 add hl, bc ld a, [hl] sub e @@ -774,7 +771,7 @@ LoadNote: ; e83d1 sbc a, 0 ld d, a ; ???? - ld hl, Channel1Field0x22 - Channel1 + ld hl, Channel1PitchWheelTarget + 1 - Channel1 add hl, bc ld a, [hl] sub d @@ -782,18 +779,17 @@ LoadNote: ; e83d1 jr .resume .greater_than - ; ???? ld hl, Channel1Flags3 - Channel1 add hl, bc - res SOUND_UNKN_11, [hl] + res SOUND_PITCH_WHEEL_DIR, [hl] ; get frequency ld hl, Channel1Frequency - Channel1 add hl, bc ld e, [hl] inc hl ld d, [hl] - ; ???? - ld hl, Channel1Field0x21 - Channel1 + ; get distance from pitch wheel target + ld hl, Channel1PitchWheelTarget - Channel1 add hl, bc ld a, e sub [hl] @@ -801,15 +797,17 @@ LoadNote: ; e83d1 ld a, d sbc a, 0 ld d, a - ; ???? - ld hl, Channel1Field0x22 - Channel1 + ld hl, Channel1PitchWheelTarget + 1 - Channel1 add hl, bc sub [hl] ld d, a .resume + ; de = x * [wCurNoteDuration] + y + ; x + 1 -> d + ; y -> a push bc - ld hl, wc297 - ld b, 0; loop count + ld hl, wCurNoteDuration + ld b, 0 ; quotient .loop inc b ld a, e @@ -823,18 +821,16 @@ LoadNote: ; e83d1 jr .loop .quit - ld a, e ; result + ld a, e ; remainder add [hl] - ld d, b ; loop count - ; ???? + ld d, b ; quotient pop bc - ld hl, Channel1Field0x23 - Channel1 + ld hl, Channel1PitchWheelAmount - Channel1 add hl, bc - ld [hl], d - ld hl, Channel1Field0x24 - Channel1 + ld [hl], d ; quotient + ld hl, Channel1PitchWheelAmountFraction - Channel1 add hl, bc - ld [hl], a - ; clear ???? + ld [hl], a ; remainder ld hl, Channel1Field0x25 - Channel1 add hl, bc xor a @@ -843,14 +839,13 @@ LoadNote: ; e83d1 ; e8466 -Functione8466: ; e8466 -; handle vibrato and other things -; unknowns: wCurTrackDuty, wCurTrackFrequency +HandleTrackVibrato: ; e8466 +; handle duty, cry pitch, and vibrato ld hl, Channel1Flags2 - Channel1 add hl, bc bit SOUND_DUTY, [hl] ; duty jr z, .next - ld hl, Channel1Field0x1c - Channel1 + ld hl, Channel1SFXDutyLoop - Channel1 add hl, bc ld a, [hl] rlca @@ -963,11 +958,11 @@ Functione8466: ; e8466 ; e84f9 -Functione84f9: ; e84f9 - ; quit if ???? +ApplyPitchWheel: ; e84f9 + ; quit if pitch wheel inactive ld hl, Channel1Flags2 - Channel1 add hl, bc - bit SOUND_UNKN_09, [hl] + bit SOUND_PITCH_WHEEL, [hl] ret z ; de = Frequency ld hl, Channel1Frequency - Channel1 @@ -975,24 +970,24 @@ Functione84f9: ; e84f9 ld e, [hl] inc hl ld d, [hl] - ; + ; check whether pitch wheel is going up or down ld hl, Channel1Flags3 - Channel1 add hl, bc - bit SOUND_UNKN_11, [hl] - jr z, .next - ; - ld hl, Channel1Field0x23 - Channel1 + bit SOUND_PITCH_WHEEL_DIR, [hl] + jr z, .decreasing + ; frequency += [Channel*PitchWheelAmount] + ld hl, Channel1PitchWheelAmount - Channel1 add hl, bc ld l, [hl] ld h, 0 add hl, de ld d, h ld e, l - ; get ???? - ld hl, Channel1Field0x24 - Channel1 + ; [Channel*Field0x25] += [Channel*PitchWheelAmountFraction] + ; if rollover: Frequency += 1 + ld hl, Channel1PitchWheelAmountFraction - Channel1 add hl, bc ld a, [hl] - ; add it to ???? ld hl, Channel1Field0x25 - Channel1 add hl, bc add [hl] @@ -1003,23 +998,26 @@ Functione84f9: ; e84f9 ld a, 0 adc d ld d, a - ; - ld hl, Channel1Field0x22 - Channel1 + ; Compare the dw at [Channel*PitchWheelTarget] to de. + ; If frequency is greater, we're finished. + ; Otherwise, load the frequency and set two flags. + ld hl, Channel1PitchWheelTarget + 1 - Channel1 add hl, bc ld a, [hl] cp d - jp c, .quit1 - jr nz, .quit2 - ld hl, Channel1Field0x21 - Channel1 + jp c, .finished_pitch_wheel + jr nz, .continue_pitch_wheel + ld hl, Channel1PitchWheelTarget - Channel1 add hl, bc ld a, [hl] cp e - jp c, .quit1 - jr .quit2 + jp c, .finished_pitch_wheel + jr .continue_pitch_wheel -.next +.decreasing + ; frequency -= [Channel*PitchWheelAmount] ld a, e - ld hl, Channel1Field0x23 - Channel1 + ld hl, Channel1PitchWheelAmount - Channel1 add hl, bc ld e, [hl] sub e @@ -1027,7 +1025,9 @@ Functione84f9: ; e84f9 ld a, d sbc a, 0 ld d, a - ld hl, Channel1Field0x24 - Channel1 + ; [Channel*Field0x25] *= 2 + ; if rollover: Frequency -= 1 + ld hl, Channel1PitchWheelAmountFraction - Channel1 add hl, bc ld a, [hl] add a @@ -1037,28 +1037,31 @@ Functione84f9: ; e84f9 ld e, a ld a, d sbc a, 0 - ld d,a - ld hl, Channel1Field0x22 - Channel1 + ld d, a + ; Compare the dw at [Channel*PitchWheelTarget] to de. + ; If frequency is lower, we're finished. + ; Otherwise, load the frequency and set two flags. + ld hl, Channel1PitchWheelTarget + 1 - Channel1 add hl, bc ld a, d cp [hl] - jr c, .quit1 - jr nz, .quit2 - ld hl, Channel1Field0x21 - Channel1 + jr c, .finished_pitch_wheel + jr nz, .continue_pitch_wheel + ld hl, Channel1PitchWheelTarget - Channel1 add hl, bc ld a, e cp [hl] - jr nc, .quit2 -.quit1 + jr nc, .continue_pitch_wheel +.finished_pitch_wheel ld hl, Channel1Flags2 - Channel1 add hl, bc - res SOUND_UNKN_09, [hl] + res SOUND_PITCH_WHEEL, [hl] ld hl, Channel1Flags3 - Channel1 add hl, bc - res SOUND_UNKN_11, [hl] + res SOUND_PITCH_WHEEL_DIR, [hl] ret -.quit2 +.continue_pitch_wheel ld hl, Channel1Frequency - Channel1 add hl, bc ld [hl], e @@ -1170,9 +1173,9 @@ ParseMusic: ; e85e1 ld hl, Channel1Flags - Channel1 add hl, bc bit SOUND_SFX, [hl] - jp nz, Functione8698 + jp nz, ParseSFXOrRest bit SOUND_REST, [hl] ; rest - jp nz, Functione8698 + jp nz, ParseSFXOrRest bit SOUND_NOISE, [hl] ; noise sample jp nz, GetNoiseSample ; normal note @@ -1286,7 +1289,7 @@ RestoreVolume: ; e8679 ; e8698 -Functione8698: ; e8698 +ParseSFXOrRest: ; e8698 ; turn noise sampling on ld hl, Channel1NoteFlags - Channel1 add hl, bc @@ -1348,9 +1351,8 @@ GetNoiseSample: ; e86c5 ld d, 0 ; load ptr to noise sample set in hl ld hl, Drumkits -rept 2 add hl, de -endr + add hl, de ld a, [hli] ld h, [hl] ld l, a @@ -1363,9 +1365,8 @@ endr ; use 'pitch' to seek noise sample set ld e, a ld d, 0 -rept 2 add hl, de -endr + add hl, de ; load sample pointer into NoiseSampleAddress ld a, [hli] ld [NoiseSampleAddressLo], a @@ -1387,9 +1388,8 @@ ParseMusicCommand: ; e870f ld d, 0 ; seek command pointer ld hl, MusicCommands -rept 2 add hl, de -endr + add hl, de ; jump to the new pointer ld a, [hli] ld h, [hl] @@ -1415,9 +1415,9 @@ MusicCommands: ; e8720 dw Music_DutyCycle ; duty cycle dw Music_Intensity ; intensity dw Music_SoundStatus ; update sound status - dw MusicDE ; ???? + duty cycle - dw Music_ToggleSFX ; - dw MusicE0 ; + dw Music_SoundDuty ; sfx duty + dw Music_ToggleSFX ; sound on/off + dw Music_SlidePitchTo ; pitch wheel dw Music_Vibrato ; vibrato dw MusicE2 ; unused dw Music_ToggleNoise ; music noise sampling @@ -1443,8 +1443,8 @@ MusicCommands: ; e8720 dw MusicF7 ; nothing dw MusicF8 ; nothing dw MusicF9 ; unused - dw Music_SetCondition ; - dw Music_JumpIf ; + dw Music_SetCondition ; setcondition + dw Music_JumpIf ; jumpif dw Music_JumpChannel ; jump dw Music_LoopChannel ; loop dw Music_CallChannel ; call @@ -1639,9 +1639,8 @@ Music_JumpIf: ; e8817 inc hl ld d, [hl] ; skip pointer -rept 2 inc de -endr + inc de ; update address ld [hl], d dec hl @@ -1693,9 +1692,8 @@ MusicEE; e883e inc hl ld d, [hl] ; skip pointer -rept 2 inc de -endr + inc de ; update address ld [hl], d dec hl @@ -1801,11 +1799,13 @@ Music_Vibrato: ; e8882 ; e88bd -MusicE0: ; e88bd -; ???? +Music_SlidePitchTo: ; e88bd +; set the target for pitch wheel ; params: 2 +; note duration +; target note call GetMusicByte - ld [wc297], a + ld [wCurNoteDuration], a call GetMusicByte ld d, a @@ -1817,22 +1817,22 @@ MusicE0: ; e88bd and $f ld d, a call GetFrequency - ld hl, Channel1Field0x21 - Channel1 + ld hl, Channel1PitchWheelTarget - Channel1 add hl, bc ld [hl], e - ld hl, Channel1Field0x22 - Channel1 + ld hl, Channel1PitchWheelTarget + 1 - Channel1 add hl, bc ld [hl], d ld hl, Channel1Flags2 - Channel1 add hl, bc - set SOUND_UNKN_09, [hl] + set SOUND_PITCH_WHEEL, [hl] ret ; e88e4 Music_Tone: ; e88e4 ; tone -; params: 2 +; params: 1 (dw) ld hl, Channel1Flags2 - Channel1 add hl, bc set SOUND_CRY_PITCH, [hl] @@ -1860,18 +1860,17 @@ MusicE7: ; e88f7 ; e8906 -MusicDE: ; e8906 -; ???? + duty cycle -; params: 1 - ; +Music_SoundDuty: ; e8906 +; sequence of 4 duty cycles to be looped +; params: 1 (4 2-bit duty cycle arguments) ld hl, Channel1Flags2 - Channel1 add hl, bc set SOUND_DUTY, [hl] ; duty cycle - ; + ; sound duty sequence call GetMusicByte rrca rrca - ld hl, Channel1Field0x1c - Channel1 + ld hl, Channel1SFXDutyLoop - Channel1 add hl, bc ld [hl], a ; update duty cycle @@ -2494,9 +2493,9 @@ _PlayCryHeader:: ; e8b79 ; 3-byte pointers (bank, address) ld hl, Cries -rept 3 add hl, de -endr + add hl, de + add hl, de ld a, [hli] ld [MusicBank], a @@ -2713,9 +2712,9 @@ PlayStereoSFX:: ; e8ca6 ; get sfx ptr ld hl, SFX -rept 3 add hl, de -endr + add hl, de + add hl, de ; bank ld a, [hli] @@ -2811,9 +2810,8 @@ LoadChannel: ; e8d1b ld c, a ld b, 0 ld hl, ChannelPointers -rept 2 add hl, bc -endr + add hl, bc ld c, [hl] inc hl ld b, [hl] ; bc = channel pointer @@ -3282,9 +3280,8 @@ ClearChannels:: ; e8fe9 ; doesn't seem to be used, but functionally identical to MapSetup_Sound_Off ld hl, rNR50 xor a -rept 2 ld [hli], a -endr + ld [hli], a ld a, $80 ld [hli], a ld hl, rNR10 |