diff --git a/audio.asm b/audio.asm index 286dc7ed..037145d8 100644 --- a/audio.asm +++ b/audio.asm @@ -364,10 +364,10 @@ SECTION "Audio Engine 1", ROMX, BANK[AUDIO_1] PlayBattleMusic:: ; 0x90c6 xor a - ld [wMusicHeaderPointer], a + ld [wAudioFadeOutControl], a ld [wLowHealthAlarm], a dec a - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound ; stop music call DelayFrame ld c, BANK(Music_GymLeaderBattle) @@ -406,7 +406,7 @@ Music_RivalAlternateStart:: ; 0x9b47 ld c, BANK(Music_MeetRival) ld a, MUSIC_MEET_RIVAL call PlayMusic - ld hl, wc006 + ld hl, wChannelCommandPointers ld de, Music_MeetRival_branch_b1a2 call Audio1_OverwriteChannelPointer ld de, Music_MeetRival_branch_b21d @@ -425,30 +425,30 @@ Music_RivalAlternateTempo:: ; 0x9b65 ld c, BANK(Music_MeetRival) ld a, MUSIC_MEET_RIVAL call PlayMusic - ld hl, wc006 + ld hl, wChannelCommandPointers ld de, Music_MeetRival_branch_b119 jp Audio1_OverwriteChannelPointer ; applies both the alternate start and alternate tempo Music_RivalAlternateStartAndTempo:: ; 0x9b75 call Music_RivalAlternateStart - ld hl, wc006 + ld hl, wChannelCommandPointers ld de, Music_MeetRival_branch_b19b jp Audio1_OverwriteChannelPointer ; an alternate tempo for Cities1 which is used for the Hall of Fame room Music_Cities1AlternateTempo:: ; 0x9b81 - ld a, $a - ld [wcfc8], a - ld [wcfc9], a - ld a, $ff - ld [wMusicHeaderPointer], a + ld a, 10 + ld [wAudioFadeOutCounterReloadValue], a + ld [wAudioFadeOutCounter], a + ld a, $ff ; stop playing music after the fade-out is finished + ld [wAudioFadeOutControl], a ld c, 100 - call DelayFrames + call DelayFrames ; wait for the fade-out to finish ld c, BANK(Music_Cities1) ld a, MUSIC_CITIES1 call PlayMusic - ld hl, wc006 + ld hl, wChannelCommandPointers ld de, Music_Cities1_branch_aa6f jp Audio1_OverwriteChannelPointer @@ -477,7 +477,7 @@ Music_DoLowHealthAlarm:: ; 2136e (8:536e) .asm_2138a ld a, $86 - ld [wc02a], a ;disable sound channel? + ld [wChannelSoundIDs + CH4], a ;disable sound channel? ld a, [wLowHealthAlarm] and $7f ;decrement alarm timer. dec a @@ -491,7 +491,7 @@ Music_DoLowHealthAlarm:: ; 2136e (8:536e) .disableAlarm xor a ld [wLowHealthAlarm], a ;disable alarm - ld [wc02a], a ;re-enable sound channel? + ld [wChannelSoundIDs + CH4], a ;re-enable sound channel? ld de, .toneDataSilence jr .playTone @@ -542,7 +542,7 @@ Music_PokeFluteInBattle:: ; 22306 (8:6306) ld a, SFX_CAUGHT_MON call PlaySoundWaitForCurrent ; then immediately overwrtie the channel pointers - ld hl, wc00e + ld hl, wChannelCommandPointers + CH4 * 2 ld de, SFX_08_PokeFlute_Ch1 call Audio2_OverwriteChannelPointer ld de, SFX_08_PokeFlute_Ch2 @@ -572,7 +572,7 @@ PlayPokedexRatingSfx:: ; 7d13b (1f:513b) .gotSfxPointer push bc ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySoundWaitForCurrent pop bc ld b, $0 diff --git a/audio/engine_1.asm b/audio/engine_1.asm index 9a302ef3..c729fa7e 100644 --- a/audio/engine_1.asm +++ b/audio/engine_1.asm @@ -3,29 +3,29 @@ Audio1_UpdateMusic:: ; 0x9103 ld c, CH0 .loop - ld b, $0 - ld hl, wc026 + ld b, 0 + ld hl, wChannelSoundIDs add hl, bc ld a, [hl] and a jr z, .nextChannel ld a, c cp CH4 - jr nc, .asm_912e ; if sfx channel - ld a, [wc002] + jr nc, .applyAffects ; if sfx channel + ld a, [wMuteAudioAndPauseMusic] and a - jr z, .asm_912e + jr z, .applyAffects bit 7, a jr nz, .nextChannel set 7, a - ld [wc002], a - xor a - ld [$ff25], a - ld [$ff1a], a + ld [wMuteAudioAndPauseMusic], a + xor a ; disable all channels' output + ld [rNR51], a + ld [rNR30], a ld a, $80 - ld [$ff1a], a + ld [rNR30], a jr .nextChannel -.asm_912e +.applyAffects call Audio1_ApplyMusicAffects .nextChannel ld a, c @@ -36,15 +36,9 @@ Audio1_UpdateMusic:: ; 0x9103 ; this routine checks flags for music effects currently applied ; to the channel and calls certain functions based on flags. -; known flags for wc02e: -; 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 Audio1_ApplyMusicAffects: ; 0x9138 ld b, $0 - ld hl, wc0b6 ; delay until next note + ld hl, wChannelNoteDelayCounters ; delay until next note add hl, bc ld a, [hl] cp $1 ; if the delay is 1, play next note @@ -54,45 +48,45 @@ Audio1_ApplyMusicAffects: ; 0x9138 ld a, c cp CH4 jr nc, .startChecks ; if a sfx channel - ld hl, wc02a + ld hl, wChannelSoundIDs + CH4 add hl, bc ld a, [hl] and a jr z, .startChecks ret .startChecks - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc - bit 6, [hl] ; dutycycle + bit BIT_ROTATE_DUTY, [hl] jr z, .checkForExecuteMusic call Audio1_ApplyDutyCycle .checkForExecuteMusic - ld b, $0 - ld hl, wc036 + ld b, 0 + ld hl, wChannelFlags2 add hl, bc - bit 0, [hl] + bit BIT_EXECUTE_MUSIC, [hl] jr nz, .checkForPitchBend - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc - bit 2, [hl] - jr nz, .disablePitchBendVibrato + bit BIT_NOISE_OR_SFX, [hl] + jr nz, .skipPitchBendVibrato .checkForPitchBend - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc - bit 4, [hl] ; pitchbend + bit BIT_PITCH_BEND_ON, [hl] jr z, .checkVibratoDelay jp Audio1_ApplyPitchBend .checkVibratoDelay - ld hl, wc04e ; vibrato delay + ld hl, wChannelVibratoDelayCounters add hl, bc ld a, [hl] and a ; check if delay is over jr z, .checkForVibrato dec [hl] ; otherwise, dec delay -.disablePitchBendVibrato +.skipPitchBendVibrato ret .checkForVibrato - ld hl, wc056 ; vibrato rate + ld hl, wChannelVibratoExtents add hl, bc ld a, [hl] and a @@ -100,38 +94,40 @@ Audio1_ApplyMusicAffects: ; 0x9138 ret ; no vibrato .vibrato ld d, a - ld hl, wc05e + ld hl, wChannelVibratoRates add hl, bc ld a, [hl] and $f and a - jr z, .vibratoAlreadyDone - dec [hl] ; apply vibrato pitch change + jr z, .applyVibrato + dec [hl] ; decrement counter ret -.vibratoAlreadyDone +.applyVibrato ld a, [hl] swap [hl] or [hl] - ld [hl], a ; reset the vibrato value and start again - ld hl, wc066 + ld [hl], a ; reload the counter + ld hl, wChannelFrequencyLowBytes add hl, bc ld e, [hl] ; get note pitch - ld hl, wc02e + ld hl, wChannelFlags1 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] +; This is the only code that sets/resets the vibrato direction bit, so it +; continuously alternates which path it takes. + bit BIT_VIBRATO_DIRECTION, [hl] + jr z, .unset + res BIT_VIBRATO_DIRECTION, [hl] ld a, d and $f ld d, a ld a, e sub d jr nc, .noCarry - ld a, $0 + ld a, 0 .noCarry jr .done .unset - set 3, [hl] + set BIT_VIBRATO_DIRECTION, [hl] ld a, d and $f0 swap a @@ -140,8 +136,8 @@ Audio1_ApplyMusicAffects: ; 0x9138 ld a, $ff .done ld d, a - ld b, $3 - call Audio1_9838 + ld b, REG_FREQUENCY_LO + call Audio1_GetRegisterPointer ld [hl], d ret @@ -149,16 +145,18 @@ Audio1_ApplyMusicAffects: ; 0x9138 ; like tempo changes, duty changes etc. and doesn't return ; until the first note is reached Audio1_PlayNextNote: ; 0x91d0 - ld hl, wc06e +; reload the vibrato delay counter + ld hl, wChannelVibratoDelayCounterReloadValues add hl, bc ld a, [hl] - ld hl, wc04e + ld hl, wChannelVibratoDelayCounters add hl, bc ld [hl], a - ld hl, wc02e + + ld hl, wChannelFlags1 add hl, bc - res 4, [hl] - res 5, [hl] + res BIT_PITCH_BEND_ON, [hl] + res BIT_PITCH_BEND_DECREASING, [hl] call Audio1_endchannel ret @@ -167,34 +165,35 @@ Audio1_endchannel: ; 0x91e6 ld d, a cp $ff ; is this command an endchannel? jp nz, Audio1_callchannel ; no - ld b, $0 ; yes - ld hl, wc02e + ld b, 0 + ld hl, wChannelFlags1 add hl, bc - bit 1, [hl] + bit BIT_CHANNEL_CALL, [hl] jr nz, .returnFromCall ld a, c cp CH3 jr nc, .noiseOrSfxChannel - jr .asm_923f + jr .disableChannelOutput .noiseOrSfxChannel - res 2, [hl] - ld hl, wc036 + res BIT_NOISE_OR_SFX, [hl] + ld hl, wChannelFlags2 add hl, bc - res 0, [hl] + res BIT_EXECUTE_MUSIC, [hl] cp CH6 - jr nz, .notSfxChannel3 + jr nz, .skipSfxChannel3 +; restart hardware channel 3 (wave channel) output ld a, $0 - ld [$ff1a], a + ld [rNR30], a ld a, $80 - ld [$ff1a], a -.notSfxChannel3 + ld [rNR30], a +.skipSfxChannel3 jr nz, .asm_9222 - ld a, [wc003] + ld a, [wDisableChannelOutputWhenSfxEnds] and a jr z, .asm_9222 xor a - ld [wc003], a - jr .asm_923f + ld [wDisableChannelOutputWhenSfxEnds], a + jr .disableChannelOutput .asm_9222 jr .asm_9248 .returnFromCall @@ -203,10 +202,10 @@ Audio1_endchannel: ; 0x91e6 ld a, c add a ld e, a - ld hl, wc006 + ld hl, wChannelCommandPointers add hl, de push hl ; store current channel address - ld hl, wc016 + ld hl, wChannelReturnAddresses add hl, de ld e, l ld d, h @@ -217,36 +216,36 @@ Audio1_endchannel: ; 0x91e6 ld a, [de] ld [hl], a ; loads channel address to return to jp Audio1_endchannel -.asm_923f - ld hl, Unknown_9b1f +.disableChannelOutput + ld hl, Audio1_HWChannelDisableMasks add hl, bc - ld a, [$ff25] + ld a, [rNR51] and [hl] - ld [$ff25], a + ld [rNR51], a .asm_9248 - ld a, [wc02a] - cp $14 + ld a, [wChannelSoundIDs + CH4] + cp CRY_SFX_START jr nc, .asm_9251 - jr .asm_926e + jr .skipCry .asm_9251 - ld a, [wc02a] - cp $86 - jr z, .asm_926e - jr c, .asm_925c - jr .asm_926e -.asm_925c + ld a, [wChannelSoundIDs + CH4] + cp CRY_SFX_END + jr z, .skipCry + jr c, .cry + jr .skipCry +.cry ld a, c cp CH4 jr z, .asm_9265 - call Audio1_96c7 + call Audio1_GoBackOneCommandIfCry ret c .asm_9265 - ld a, [wc005] - ld [$ff24], a + ld a, [wSavedVolume] + ld [rNR50], a xor a - ld [wc005], a -.asm_926e - ld hl, wc026 + ld [wSavedVolume], a +.skipCry + ld hl, wChannelSoundIDs add hl, bc ld [hl], b ret @@ -254,7 +253,7 @@ Audio1_endchannel: ; 0x91e6 Audio1_callchannel: ; 0x9274 cp $fd ; is this command a callchannel? jp nz, Audio1_loopchannel ; no - call Audio1_GetNextMusicByte ; yes + call Audio1_GetNextMusicByte push af call Audio1_GetNextMusicByte ld d, a @@ -265,10 +264,10 @@ Audio1_callchannel: ; 0x9274 ld a, c add a ld e, a - ld hl, wc006 + ld hl, wChannelCommandPointers add hl, de push hl - ld hl, wc016 + ld hl, wChannelReturnAddresses add hl, de ld e, l ld d, h @@ -283,20 +282,20 @@ Audio1_callchannel: ; 0x9274 inc hl ld [hl], d ; overwrite current address with pointer ld b, $0 - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc - set 1, [hl] ; set the call flag + set BIT_CHANNEL_CALL, [hl] ; set the call flag jp Audio1_endchannel Audio1_loopchannel: ; 0x92a9 cp $fe ; is this command a loopchannel? jp nz, Audio1_notetype ; no - call Audio1_GetNextMusicByte ; yes + call Audio1_GetNextMusicByte ld e, a and a jr z, .infiniteLoop - ld b, $0 - ld hl, wc0be + ld b, 0 + ld hl, wChannelLoopCounters add hl, bc ld a, [hl] cp e @@ -319,7 +318,7 @@ Audio1_loopchannel: ; 0x92a9 ld a, c add a ld e, a - ld hl, wc006 + ld hl, wChannelCommandPointers add hl, de pop af ld [hli], a @@ -330,10 +329,10 @@ Audio1_notetype: ; 0x92e4 and $f0 cp $d0 ; is this command a notetype? jp nz, Audio1_toggleperfectpitch ; no - ld a, d ; yes + ld a, d and $f ld b, $0 - ld hl, wc0c6 + ld hl, wChannelNoteSpeeds add hl, bc ld [hl], a ; store low nibble as speed ld a, c @@ -345,15 +344,15 @@ Audio1_notetype: ; 0x92e4 cp CH2 jr z, .musicChannel3 cp CH6 - jr nz, .notChannel3 - ld hl, wc0e7 - jr .sfxChannel3 + jr nz, .skipChannel3 + ld hl, wSfxWaveInstrument + jr .channel3 .musicChannel3 - ld hl, wc0e6 -.sfxChannel3 + ld hl, wMusicWaveInstrument +.channel3 ld a, d and $f - ld [hl], a ; store low nibble of param as duty + ld [hl], a ; store low nibble of param as wave instrument ld a, d and $30 sla a @@ -362,9 +361,9 @@ Audio1_notetype: ; 0x92e4 ; if channel 3, store high nibble as volume ; else, store volume (high nibble) and fade (low nibble) -.notChannel3 - ld b, $0 - ld hl, wc0de +.skipChannel3 + ld b, 0 + ld hl, wChannelVolumes add hl, bc ld [hl], d .noiseChannel @@ -374,56 +373,70 @@ Audio1_toggleperfectpitch: ; 0x9323 ld a, d cp $e8 ; is this command a toggleperfectpitch? jr nz, Audio1_vibrato ; no - ld b, $0 ; yes - ld hl, wc02e + ld b, 0 + ld hl, wChannelFlags1 add hl, bc ld a, [hl] xor $1 - ld [hl], a ; flip bit 0 of wc02e + ld [hl], a ; flip bit 0 of wChannelFlags1 jp Audio1_endchannel Audio1_vibrato: ; 0x9335 cp $ea ; is this command a vibrato? jr nz, Audio1_pitchbend ; no - call Audio1_GetNextMusicByte ; yes - ld b, $0 - ld hl, wc04e + call Audio1_GetNextMusicByte + ld b, 0 + ld hl, wChannelVibratoDelayCounters add hl, bc ld [hl], a ; store delay - ld hl, wc06e + ld hl, wChannelVibratoDelayCounterReloadValues add hl, bc ld [hl], a ; store delay call Audio1_GetNextMusicByte ld d, a + +; The high nybble of the command byte is the extent of the vibrato. +; Let n be the extent. +; The upper nybble of the channel's byte in the wChannelVibratoExtents +; array will store the extent above the note: (n / 2) + (n % 2). +; The lower nybble will store the extent below the note: (n / 2). +; These two values add to the total extent, n. and $f0 swap a - ld b, $0 - ld hl, wc056 + ld b, 0 + ld hl, wChannelVibratoExtents 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 [hl], a + +; The low nybble of the command byte is the rate of the vibrato. +; The high and low nybbles of the channel's byte in the wChannelVibratoRates +; array are both initialised to this value because the high nybble is the +; counter reload value and the low nybble is the counter itself, which should +; start at its value upon reload. ld a, d and $f ld d, a - ld hl, wc05e + ld hl, wChannelVibratoRates add hl, bc swap a or d - ld [hl], a ; store depth as both high and low nibbles + ld [hl], a + jp Audio1_endchannel Audio1_pitchbend: ; 0x936d cp $eb ; is this command a pitchbend? jr nz, Audio1_duty ; no - call Audio1_GetNextMusicByte ; yes - ld b, $0 - ld hl, wc076 + call Audio1_GetNextMusicByte + ld b, 0 + ld hl, wChannelPitchBendLengthModifiers add hl, bc - ld [hl], a ; store first param + ld [hl], a call Audio1_GetNextMusicByte ld d, a and $f0 @@ -431,18 +444,18 @@ Audio1_pitchbend: ; 0x936d ld b, a ld a, d and $f - call Audio1_9858 - ld b, $0 - ld hl, wc0a6 + call Audio1_CalculateFrequency + ld b, 0 + ld hl, wChannelPitchBendTargetFrequencyHighBytes add hl, bc - ld [hl], d ; store unknown part of second param - ld hl, wc0ae + ld [hl], d + ld hl, wChannelPitchBendTargetFrequencyLowBytes add hl, bc - ld [hl], e ; store unknown part of second param - ld b, $0 - ld hl, wc02e + ld [hl], e + ld b, 0 + ld hl, wChannelFlags1 add hl, bc - set 4, [hl] ; set pitchbend flag + set BIT_PITCH_BEND_ON, [hl] call Audio1_GetNextMusicByte ld d, a jp Audio1_notelength @@ -450,12 +463,12 @@ Audio1_pitchbend: ; 0x936d Audio1_duty: ; 0x93a5 cp $ec ; is this command a duty? jr nz, Audio1_tempo ; no - call Audio1_GetNextMusicByte ; yes + call Audio1_GetNextMusicByte rrca rrca and $c0 - ld b, $0 - ld hl, wc03e + ld b, 0 + ld hl, wChannelDuties add hl, bc ld [hl], a ; store duty jp Audio1_endchannel @@ -463,96 +476,96 @@ Audio1_duty: ; 0x93a5 Audio1_tempo: ; 0x93ba cp $ed ; is this command a tempo? jr nz, Audio1_stereopanning ; no - ld a, c ; yes + ld a, c cp CH4 jr nc, .sfxChannel call Audio1_GetNextMusicByte - ld [wc0e8], a ; store first param + ld [wMusicTempo], a ; store first param call Audio1_GetNextMusicByte - ld [wc0e9], a ; store second param + ld [wMusicTempo + 1], a ; store second param xor a - ld [wc0ce], a ; clear RAM - ld [wc0cf], a - ld [wc0d0], a - ld [wc0d1], a + ld [wChannelNoteDelayCountersFractionalPart], a ; clear RAM + ld [wChannelNoteDelayCountersFractionalPart + 1], a + ld [wChannelNoteDelayCountersFractionalPart + 2], a + ld [wChannelNoteDelayCountersFractionalPart + 3], a jr .musicChannelDone .sfxChannel call Audio1_GetNextMusicByte - ld [wc0ea], a ; store first param + ld [wSfxTempo], a ; store first param call Audio1_GetNextMusicByte - ld [wc0eb], a ; store second param + ld [wSfxTempo + 1], a ; store second param xor a - ld [wc0d2], a ; clear RAM - ld [wc0d3], a - ld [wc0d4], a - ld [wc0d5], a + ld [wChannelNoteDelayCountersFractionalPart + 4], a ; clear RAM + ld [wChannelNoteDelayCountersFractionalPart + 5], a + ld [wChannelNoteDelayCountersFractionalPart + 6], a + ld [wChannelNoteDelayCountersFractionalPart + 7], a .musicChannelDone jp Audio1_endchannel Audio1_stereopanning: ; 0x93fa cp $ee ; is this command a stereopanning? jr nz, Audio1_unknownmusic0xef ; no - call Audio1_GetNextMusicByte ; yes - ld [wc004], a ; store panning + call Audio1_GetNextMusicByte + ld [wStereoPanning], a ; store panning jp Audio1_endchannel ; this appears to never be used Audio1_unknownmusic0xef: ; 0x9407 cp $ef ; is this command an unknownmusic0xef? jr nz, Audio1_dutycycle ; no - call Audio1_GetNextMusicByte ; yes + call Audio1_GetNextMusicByte push bc - call Audio1_9876 + call Audio1_PlaySound pop bc - ld a, [wc003] + ld a, [wDisableChannelOutputWhenSfxEnds] and a jr nz, .skip - ld a, [wc02d] - ld [wc003], a + ld a, [wChannelSoundIDs + CH7] + ld [wDisableChannelOutputWhenSfxEnds], a xor a - ld [wc02d], a + ld [wChannelSoundIDs + CH7], a .skip jp Audio1_endchannel Audio1_dutycycle: ; 0x9426 cp $fc ; is this command a dutycycle? jr nz, Audio1_volume ; no - call Audio1_GetNextMusicByte ; yes - ld b, $0 - ld hl, wc046 + call Audio1_GetNextMusicByte + ld b, 0 + ld hl, wChannelDutyCycles add hl, bc ld [hl], a ; store full cycle and $c0 - ld hl, wc03e + ld hl, wChannelDuties add hl, bc ld [hl], a ; store first duty - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc - set 6, [hl] ; set dutycycle flag + set BIT_ROTATE_DUTY, [hl] jp Audio1_endchannel Audio1_volume: ; 0x9444 cp $f0 ; is this command a volume? jr nz, Audio1_executemusic ; no - call Audio1_GetNextMusicByte ; yes - ld [$ff24], a ; store volume + call Audio1_GetNextMusicByte + ld [rNR50], a ; store volume jp Audio1_endchannel Audio1_executemusic: ; 0x9450 cp $f8 ; is this command an executemusic? jr nz, Audio1_octave ; no - ld b, $0 ; yes - ld hl, wc036 + ld b, $0 + ld hl, wChannelFlags2 add hl, bc - set 0, [hl] + set BIT_EXECUTE_MUSIC, [hl] jp Audio1_endchannel Audio1_octave: ; 0x945f and $f0 cp $e0 ; is this command an octave? jr nz, Audio1_unknownsfx0x20 ; no - ld hl, wc0d6 ; yes - ld b, $0 + ld hl, wChannelOctaves + ld b, 0 add hl, bc ld a, d and $f @@ -561,47 +574,54 @@ Audio1_octave: ; 0x945f Audio1_unknownsfx0x20: ; 0x9472 cp $20 ; is this command an unknownsfx0x20? - jr nz, Audio1_unknownsfx0x10 ; no + jr nz, Audio1_unknownsfx0x10 ld a, c cp CH3 ; is this a noise or sfx channel? jr c, Audio1_unknownsfx0x10 ; no - ld b, $0 - ld hl, wc036 + ld b, 0 + ld hl, wChannelFlags2 add hl, bc - bit 0, [hl] - jr nz, Audio1_unknownsfx0x10 ; no - call Audio1_notelength ; yes + bit BIT_EXECUTE_MUSIC, [hl] ; is executemusic being used? + jr nz, Audio1_unknownsfx0x10 ; yes + call Audio1_notelength + +; This code seems to do the same thing as what Audio1_ApplyDutyAndSoundLength +; does below. ld d, a - ld b, $0 - ld hl, wc03e + ld b, 0 + ld hl, wChannelDuties add hl, bc ld a, [hl] or d ld d, a - ld b, $1 - call Audio1_9838 + ld b, REG_DUTY_SOUND_LEN + call Audio1_GetRegisterPointer ld [hl], d + call Audio1_GetNextMusicByte ld d, a - ld b, $2 - call Audio1_9838 + ld b, REG_VOLUME_ENVELOPE + call Audio1_GetRegisterPointer ld [hl], d call Audio1_GetNextMusicByte ld e, a ld a, c cp CH7 - ld a, $0 - jr z, .sfxNoiseChannel ; only two params for noise channel + ld a, 0 + jr z, .skip +; Channels 1 through 3 have 2 registers that control frequency, but the noise +; channel a single register (the polynomial counter) that controls frequency, +; so this command has one less byte on the noise channel. push de call Audio1_GetNextMusicByte pop de -.sfxNoiseChannel +.skip ld d, a push de - call Audio1_9629 - call Audio1_95f8 + call Audio1_ApplyDutyAndSoundLength + call Audio1_EnableChannelOutput pop de - call Audio1_964b + call Audio1_ApplyWavePatternAndFrequency ret Audio1_unknownsfx0x10: @@ -612,12 +632,12 @@ Audio1_unknownsfx0x10: cp $10 ; is this command a unknownsfx0x10? jr nz, Audio1_note ; no ld b, $0 - ld hl, wc036 + ld hl, wChannelFlags2 add hl, bc - bit 0, [hl] + bit BIT_EXECUTE_MUSIC, [hl] jr nz, Audio1_note ; no - call Audio1_GetNextMusicByte ; yes - ld [$ff10], a + call Audio1_GetNextMusicByte + ld [rNR10], a jp Audio1_endchannel Audio1_note: @@ -627,7 +647,7 @@ Audio1_note: ld a, d and $f0 cp $b0 ; is this command a dnote? - jr z, Audio1_dnote ; yes + jr z, Audio1_dnote jr nc, Audio1_notelength ; no swap a ld b, a @@ -647,11 +667,11 @@ Audio1_dnote: call Audio1_GetNextMusicByte ; get dnote instrument asm_94fd ld d, a - ld a, [wc003] + ld a, [wDisableChannelOutputWhenSfxEnds] and a jr nz, .asm_9508 ld a, d - call Audio1_9876 + call Audio1_PlaySound .asm_9508 pop bc pop de @@ -661,20 +681,20 @@ Audio1_notelength: ; 0x950a push af and $f inc a - ld b, $0 + ld b, 0 ld e, a ; store note length (in 16ths) ld d, b - ld hl, wc0c6 + ld hl, wChannelNoteSpeeds add hl, bc ld a, [hl] ld l, b - call Audio1_9847 + call Audio1_MultiplyAdd ld a, c cp CH4 jr nc, .sfxChannel - ld a, [wc0e8] + ld a, [wMusicTempo] ld d, a - ld a, [wc0e9] + ld a, [wMusicTempo + 1] ld e, a jr .skip .sfxChannel @@ -682,34 +702,34 @@ Audio1_notelength: ; 0x950a ld e, $0 cp CH7 jr z, .skip ; if noise channel - call Audio1_9693 - ld a, [wc0ea] + call Audio1_SetSfxTempo + ld a, [wSfxTempo] ld d, a - ld a, [wc0eb] + ld a, [wSfxTempo + 1] ld e, a .skip - ld a, l - ld b, $0 - ld hl, wc0ce + ld a, l ; a = note_length * note_speed + ld b, 0 + ld hl, wChannelNoteDelayCountersFractionalPart add hl, bc ld l, [hl] - call Audio1_9847 + call Audio1_MultiplyAdd ld e, l - ld d, h - ld hl, wc0ce + ld d, h ; de = note_delay_frac_part + (note_length * note_speed * tempo) + ld hl, wChannelNoteDelayCountersFractionalPart add hl, bc ld [hl], e ld a, d - ld hl, wc0b6 + ld hl, wChannelNoteDelayCounters add hl, bc ld [hl], a - ld hl, wc036 + ld hl, wChannelFlags2 add hl, bc - bit 0, [hl] + bit BIT_EXECUTE_MUSIC, [hl] jr nz, Audio1_notepitch - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc - bit 2, [hl] + bit BIT_NOISE_OR_SFX, [hl] jr z, Audio1_notepitch pop hl ret @@ -721,177 +741,183 @@ Audio1_notepitch: ; 0x9568 jr nz, .notRest ld a, c cp CH4 - jr nc, .sfxChannel - ld hl, wc02a + jr nc, .next +; If this isn't an SFX channel, try the corresponding SFX channel. + ld hl, wChannelSoundIDs + CH4 add hl, bc ld a, [hl] and a jr nz, .done ; fall through -.sfxChannel +.next ld a, c cp CH2 - jr z, .musicChannel3 + jr z, .channel3 cp CH6 - jr nz, .notSfxChannel3 -.musicChannel3 - ld b, $0 - ld hl, Unknown_9b1f + jr nz, .notChannel3 +.channel3 + ld b, 0 + ld hl, Audio1_HWChannelDisableMasks add hl, bc - ld a, [$ff25] + ld a, [rNR51] and [hl] - ld [$ff25], a + ld [rNR51], a ; disable hardware channel 3's output jr .done -.notSfxChannel3 - ld b, $2 - call Audio1_9838 - ld a, $8 +.notChannel3 + ld b, REG_VOLUME_ENVELOPE + call Audio1_GetRegisterPointer + ld a, $8 ; fade in sound ld [hli], a inc hl - ld a, $80 + ld a, $80 ; restart sound ld [hl], a .done ret .notRest swap a - ld b, $0 - ld hl, wc0d6 + ld b, 0 + ld hl, wChannelOctaves add hl, bc ld b, [hl] - call Audio1_9858 - ld b, $0 - ld hl, wc02e + call Audio1_CalculateFrequency + ld b, 0 + ld hl, wChannelFlags1 add hl, bc - bit 4, [hl] - jr z, .asm_95b8 - call Audio1_978f -.asm_95b8 + bit BIT_PITCH_BEND_ON, [hl] + jr z, .skipPitchBend + call Audio1_InitPitchBendVars +.skipPitchBend push de ld a, c cp CH4 - jr nc, .skip ; if sfx channel - ld hl, wc02a - ld d, $0 + jr nc, .sfxChannel ; if sfx channel +; If this isn't an SFX channel, try the corresponding SFX channel. + ld hl, wChannelSoundIDs + CH4 + ld d, 0 ld e, a add hl, de ld a, [hl] and a - jr nz, .asm_95cb - jr .skip -.asm_95cb + jr nz, .noSfx + jr .sfxChannel +.noSfx pop de ret -.skip - ld b, $0 - ld hl, wc0de +.sfxChannel + ld b, 0 + ld hl, wChannelVolumes add hl, bc ld d, [hl] - ld b, $2 - call Audio1_9838 + ld b, REG_VOLUME_ENVELOPE + call Audio1_GetRegisterPointer ld [hl], d - call Audio1_9629 - call Audio1_95f8 + call Audio1_ApplyDutyAndSoundLength + call Audio1_EnableChannelOutput pop de ld b, $0 - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc - bit 0, [hl] ; has toggleperfectpitch been used? - jr z, .skip2 - inc e ; if yes, increment the pitch by 1 - jr nc, .skip2 + bit BIT_PERFECT_PITCH, [hl] ; has toggleperfectpitch been used? + jr z, .skipFrequencyInc + inc e ; if yes, increment the frequency by 1 + jr nc, .skipFrequencyInc inc d -.skip2 - ld hl, wc066 +.skipFrequencyInc + ld hl, wChannelFrequencyLowBytes add hl, bc ld [hl], e - call Audio1_964b + call Audio1_ApplyWavePatternAndFrequency ret -Audio1_95f8: ; 0x95f8 - ld b, $0 - ld hl, Unknown_9b27 +Audio1_EnableChannelOutput: ; 0x95f8 + ld b, 0 + ld hl, Audio1_HWChannelEnableMasks add hl, bc - ld a, [$ff25] - or [hl] + ld a, [rNR51] + or [hl] ; set this channel's bits ld d, a ld a, c cp CH7 - jr z, .sfxNoiseChannel + jr z, .noiseChannelOrNoSfx cp CH4 jr nc, .skip ; if sfx channel - ld hl, wc02a +; If this isn't an SFX channel, try the corresponding SFX channel. + ld hl, wChannelSoundIDs + CH4 add hl, bc ld a, [hl] and a jr nz, .skip -.sfxNoiseChannel - ld a, [wc004] - ld hl, Unknown_9b27 +.noiseChannelOrNoSfx +; 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 add hl, bc and [hl] ld d, a - ld a, [$ff25] - ld hl, Unknown_9b1f + ld a, [rNR51] + ld hl, Audio1_HWChannelDisableMasks add hl, bc - and [hl] - or d + and [hl] ; reset this channel's output bits + or d ; set this channel's output bits that enabled in [wStereoPanning] ld d, a .skip ld a, d - ld [$ff25], a + ld [rNR51], a ret -Audio1_9629: ; 0x9629 - ld b, $0 - ld hl, wc0b6 +Audio1_ApplyDutyAndSoundLength: ; 0x9629 + ld b, 0 + ld hl, wChannelNoteDelayCounters ; use the note delay as sound length add hl, bc ld d, [hl] ld a, c cp CH2 - jr z, .channel3 ; if music channel 3 + jr z, .skipDuty ; if music channel 3 cp CH6 - jr z, .channel3 ; if sfx channel 3 + jr z, .skipDuty ; if sfx channel 3 +; include duty (except on channel 3 which doesn't have it) ld a, d and $3f ld d, a - ld hl, wc03e + ld hl, wChannelDuties add hl, bc ld a, [hl] or d ld d, a -.channel3 - ld b, $1 - call Audio1_9838 +.skipDuty + ld b, REG_DUTY_SOUND_LEN + call Audio1_GetRegisterPointer ld [hl], d ret -Audio1_964b: ; 0x964b +Audio1_ApplyWavePatternAndFrequency: ; 0x964b ld a, c cp CH2 jr z, .channel3 cp CH6 - jr nz, .notSfxChannel3 + jr nz, .notChannel3 ; fall through .channel3 push de - ld de, wc0e6 + ld de, wMusicWaveInstrument cp CH2 - jr z, .musicChannel3 - ld de, wc0e7 -.musicChannel3 + jr z, .next + ld de, wSfxWaveInstrument +.next ld a, [de] add a - ld d, $0 + ld d, 0 ld e, a ld hl, Audio1_WavePointers add hl, de ld e, [hl] inc hl ld d, [hl] - ld hl, $ff30 + ld hl, $ff30 ; wave pattern RAM ld b, $f - ld a, $0 - ld [$ff1a], a + ld a, $0 ; stop hardware channel 3 + ld [rNR30], a .loop ld a, [de] inc de @@ -900,152 +926,155 @@ Audio1_964b: ; 0x964b dec b and a jr nz, .loop - ld a, $80 - ld [$ff1a], a + ld a, $80 ; start hardware channel 3 + ld [rNR30], a pop de -.notSfxChannel3 +.notChannel3 ld a, d - or $80 - and $c7 + or $80 ; use counter mode (i.e. disable output when the counter reaches 0) + and $c7 ; zero the unused bits in the register ld d, a - ld b, $3 - call Audio1_9838 - ld [hl], e + ld b, REG_FREQUENCY_LO + call Audio1_GetRegisterPointer + ld [hl], e ; store frequency low byte inc hl - ld [hl], d - call Audio1_96b5 + ld [hl], d ; store frequency high byte + call Audio1_ApplyFrequencyModifier ret -Audio1_9693: ; 0x9693 - call Audio1_96e5 - jr nc, .asm_96ab - ld d, $0 - ld a, [wc0f2] +Audio1_SetSfxTempo: ; 0x9693 + call Audio1_IsCry + jr nc, .notCry + ld d, 0 + ld a, [wTempoModifier] add $80 - jr nc, .asm_96a2 + jr nc, .next inc d -.asm_96a2 - ld [wc0eb], a +.next + ld [wSfxTempo + 1], a ld a, d - ld [wc0ea], a - jr .asm_96b4 -.asm_96ab + ld [wSfxTempo], a + jr .done +.notCry xor a - ld [wc0eb], a + ld [wSfxTempo + 1], a ld a, $1 - ld [wc0ea], a -.asm_96b4 + ld [wSfxTempo], a +.done ret -Audio1_96b5: ; 0x96b5 - call Audio1_96e5 - jr nc, .asm_96c6 - ld a, [wc0f1] +Audio1_ApplyFrequencyModifier: ; 0x96b5 + call Audio1_IsCry + jr nc, .done +; if playing a cry, add the cry's frequency modifier + ld a, [wFrequencyModifier] add e - jr nc, .asm_96c1 + jr nc, .noCarry inc d -.asm_96c1 +.noCarry dec hl ld e, a ld [hl], e inc hl ld [hl], d -.asm_96c6 +.done ret -Audio1_96c7: ; 0x96c7 - call Audio1_96e5 - jr nc, .asm_96e2 - ld hl, wc006 +Audio1_GoBackOneCommandIfCry: ; 0x96c7 + call Audio1_IsCry + jr nc, .done + ld hl, wChannelCommandPointers ld e, c - ld d, $0 + ld d, 0 sla e rl d add hl, de ld a, [hl] - sub $1 + sub 1 ld [hl], a inc hl ld a, [hl] - sbc $0 + sbc 0 ld [hl], a scf ret -.asm_96e2 +.done scf ccf ret -Audio1_96e5: ; 0x96e5 - ld a, [wc02a] - cp $14 - jr nc, .asm_96ee - jr .asm_96f4 -.asm_96ee - cp $86 - jr z, .asm_96f4 - jr c, .asm_96f7 -.asm_96f4 +Audio1_IsCry: ; 0x96e5 +; Returns whether the currently playing audio is a cry in carry. + ld a, [wChannelSoundIDs + CH4] + cp CRY_SFX_START + jr nc, .next + jr .no +.next + cp CRY_SFX_END + jr z, .no + jr c, .yes +.no scf ccf ret -.asm_96f7 +.yes scf ret Audio1_ApplyPitchBend: ; 0x96f9 - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc - bit 5, [hl] - jp nz, .asm_9740 - ld hl, wc09e + bit BIT_PITCH_BEND_DECREASING, [hl] + jp nz, .frequencyDecreasing +; frequency increasing + ld hl, wChannelPitchBendCurrentFrequencyLowBytes add hl, bc ld e, [hl] - ld hl, wc096 + ld hl, wChannelPitchBendCurrentFrequencyHighBytes add hl, bc ld d, [hl] - ld hl, wc07e + ld hl, wChannelPitchBendFrequencySteps add hl, bc ld l, [hl] ld h, b add hl, de ld d, h ld e, l - ld hl, wc08e + ld hl, wChannelPitchBendCurrentFrequencyFractionalPart add hl, bc push hl - ld hl, wc086 + ld hl, wChannelPitchBendFrequencyStepsFractionalPart add hl, bc ld a, [hl] pop hl add [hl] ld [hl], a - ld a, $0 + ld a, 0 adc e ld e, a - ld a, $0 + ld a, 0 adc d ld d, a - ld hl, wc0a6 + ld hl, wChannelPitchBendTargetFrequencyHighBytes add hl, bc ld a, [hl] cp d - jp c, .asm_9786 - jr nz, .asm_9773 - ld hl, wc0ae + jp c, .reachedTargetFrequency + jr nz, .applyUpdatedFrequency + ld hl, wChannelPitchBendTargetFrequencyLowBytes add hl, bc ld a, [hl] cp e - jp c, .asm_9786 - jr .asm_9773 -.asm_9740 - ld hl, wc09e + jp c, .reachedTargetFrequency + jr .applyUpdatedFrequency +.frequencyDecreasing + ld hl, wChannelPitchBendCurrentFrequencyLowBytes add hl, bc ld a, [hl] - ld hl, wc096 + ld hl, wChannelPitchBendCurrentFrequencyHighBytes add hl, bc ld d, [hl] - ld hl, wc07e + ld hl, wChannelPitchBendFrequencySteps add hl, bc ld e, [hl] sub e @@ -1053,7 +1082,7 @@ Audio1_ApplyPitchBend: ; 0x96f9 ld a, d sbc b ld d, a - ld hl, wc086 + ld hl, wChannelPitchBendFrequencyStepsFractionalPart add hl, bc ld a, [hl] add a @@ -1064,129 +1093,140 @@ Audio1_ApplyPitchBend: ; 0x96f9 ld a, d sbc b ld d, a - ld hl, wc0a6 + ld hl, wChannelPitchBendTargetFrequencyHighBytes add hl, bc ld a, d cp [hl] - jr c, .asm_9786 - jr nz, .asm_9773 - ld hl, wc0ae + jr c, .reachedTargetFrequency + jr nz, .applyUpdatedFrequency + ld hl, wChannelPitchBendTargetFrequencyLowBytes add hl, bc ld a, e cp [hl] - jr c, .asm_9786 -.asm_9773 - ld hl, wc09e + jr c, .reachedTargetFrequency +.applyUpdatedFrequency + ld hl, wChannelPitchBendCurrentFrequencyLowBytes add hl, bc ld [hl], e - ld hl, wc096 + ld hl, wChannelPitchBendCurrentFrequencyHighBytes add hl, bc ld [hl], d - ld b, $3 - call Audio1_9838 + ld b, REG_FREQUENCY_LO + call Audio1_GetRegisterPointer ld a, e ld [hli], a ld [hl], d ret -.asm_9786 - ld hl, wc02e +.reachedTargetFrequency +; Turn off pitch bend when the target frequency has been reached. + ld hl, wChannelFlags1 add hl, bc - res 4, [hl] - res 5, [hl] + res BIT_PITCH_BEND_ON, [hl] + res BIT_PITCH_BEND_DECREASING, [hl] ret -Audio1_978f: ; 0x978f - ld hl, wc096 +Audio1_InitPitchBendVars: ; 0x978f + ld hl, wChannelPitchBendCurrentFrequencyHighBytes add hl, bc ld [hl], d - ld hl, wc09e + ld hl, wChannelPitchBendCurrentFrequencyLowBytes add hl, bc ld [hl], e - ld hl, wc0b6 + ld hl, wChannelNoteDelayCounters add hl, bc ld a, [hl] - ld hl, wc076 + ld hl, wChannelPitchBendLengthModifiers add hl, bc sub [hl] - jr nc, .asm_97a7 - ld a, $1 -.asm_97a7 + jr nc, .next + ld a, 1 +.next ld [hl], a - ld hl, wc0ae + ld hl, wChannelPitchBendTargetFrequencyLowBytes add hl, bc ld a, e sub [hl] ld e, a ld a, d sbc b - ld hl, wc0a6 + ld hl, wChannelPitchBendTargetFrequencyHighBytes add hl, bc sub [hl] - jr c, .asm_97c3 + jr c, .targetFrequencyGreater ld d, a - ld b, $0 - ld hl, wc02e + ld b, 0 + ld hl, wChannelFlags1 add hl, bc - set 5, [hl] - jr .asm_97e6 -.asm_97c3 - ld hl, wc096 + set BIT_PITCH_BEND_DECREASING, [hl] + jr .next2 +.targetFrequencyGreater +; If the target frequency is greater, subtract the current frequency from +; the target frequency to get the absolute difference. + ld hl, wChannelPitchBendCurrentFrequencyHighBytes add hl, bc ld d, [hl] - ld hl, wc09e + ld hl, wChannelPitchBendCurrentFrequencyLowBytes add hl, bc ld e, [hl] - ld hl, wc0ae + ld hl, wChannelPitchBendTargetFrequencyLowBytes add hl, bc ld a, [hl] sub e ld e, a + +; Bug. Instead of borrowing from the high byte of the target frequency as it +; should, it borrows from the high byte of the current frequency instead. +; This means that the result will be 0x200 greater than it should be if the +; low byte of the current frequency is greater than the low byte of the +; target frequency. ld a, d sbc b ld d, a - ld hl, wc0a6 + + ld hl, wChannelPitchBendTargetFrequencyHighBytes add hl, bc ld a, [hl] sub d ld d, a - ld b, $0 - ld hl, wc02e + ld b, 0 + ld hl, wChannelFlags1 add hl, bc - res 5, [hl] -.asm_97e6 - ld hl, wc076 + res BIT_PITCH_BEND_DECREASING, [hl] + +.next2 + ld hl, wChannelPitchBendLengthModifiers add hl, bc -.asm_97ea +.divideLoop inc b ld a, e sub [hl] ld e, a - jr nc, .asm_97ea + jr nc, .divideLoop ld a, d and a - jr z, .asm_97f8 + jr z, .doneDividing dec a ld d, a - jr .asm_97ea -.asm_97f8 - ld a, e + jr .divideLoop +.doneDividing + ld a, e ; a = remainder - dividend add [hl] - ld d, b - ld b, $0 - ld hl, wc07e + ld d, b ; d = quotient + 1 + ld b, 0 + ld hl, wChannelPitchBendFrequencySteps add hl, bc - ld [hl], d - ld hl, wc086 + ld [hl], d ; store quotient + 1 + ld hl, wChannelPitchBendFrequencyStepsFractionalPart add hl, bc - ld [hl], a - ld hl, wc08e + ld [hl], a ; store remainder - dividend + ld hl, wChannelPitchBendCurrentFrequencyFractionalPart add hl, bc - ld [hl], a + ld [hl], a ; store remainder - dividend ret Audio1_ApplyDutyCycle: ; 0x980d - ld b, $0 - ld hl, wc046 + ld b, 0 + ld hl, wChannelDutyCycles add hl, bc ld a, [hl] rlca @@ -1194,8 +1234,8 @@ Audio1_ApplyDutyCycle: ; 0x980d ld [hl], a and $c0 ld d, a - ld b, $1 - call Audio1_9838 + ld b, REG_DUTY_SOUND_LEN + call Audio1_GetRegisterPointer ld a, [hl] and $3f or d @@ -1203,11 +1243,11 @@ Audio1_ApplyDutyCycle: ; 0x980d ret Audio1_GetNextMusicByte: ; 0x9825 - ld d, $0 + ld d, 0 ld a, c add a ld e, a - ld hl, wc006 + ld hl, wChannelCommandPointers add hl, de ld a, [hli] ld e, a @@ -1220,9 +1260,10 @@ Audio1_GetNextMusicByte: ; 0x9825 ld [hl], d ret -Audio1_9838: ; 0x9838 +Audio1_GetRegisterPointer: ; 0x9838 +; hl = address of hardware sound register b for software channel c ld a, c - ld hl, Unknown_9b17 + ld hl, Audio1_HWChannelBaseAddresses add l jr nc, .noCarry inc h @@ -1234,13 +1275,14 @@ Audio1_9838: ; 0x9838 ld h, $ff ret -Audio1_9847: ; 0x9847 - ld h, $0 +Audio1_MultiplyAdd: ; 0x9847 +; hl = l + (a * de) + ld h, 0 .loop srl a - jr nc, .noCarry + jr nc, .skipAdd add hl, de -.noCarry +.skipAdd sla e rl d and a @@ -1249,8 +1291,9 @@ Audio1_9847: ; 0x9847 .done ret -Audio1_9858: ; 0x9858 - ld h, $0 +Audio1_CalculateFrequency: ; 0x9858 +; return the frequency for note a, octave b in de + ld h, 0 ld l, a add hl, hl ld d, h @@ -1262,137 +1305,138 @@ Audio1_9858: ; 0x9858 ld d, [hl] ld a, b .loop - cp $7 + cp 7 jr z, .done sra d rr e inc a jr .loop .done - ld a, $8 + ld a, 8 add d ld d, a ret -Audio1_9876:: ; 0x9876 - ld [wc001], a +Audio1_PlaySound:: ; 0x9876 + ld [wSoundID], a cp $ff - jp z, Audio1_9a34 - cp $b9 - jp z, Audio1_994e - jp c, Audio1_994e + jp z, .stopAllAudio + cp MAX_SFX_ID + jp z, .playSfx + jp c, .playSfx cp $fe - jr z, .asm_988d - jp nc, Audio1_994e -.asm_988d - xor a - ld [wc000], a - ld [wc003], a - ld [wc0e9], a - ld [wc0e6], a - ld [wc0e7], a - ld d, $8 - ld hl, wc016 - call FillAudioRAM1 - ld hl, wc006 - call FillAudioRAM1 - ld d, $4 - ld hl, wc026 - call FillAudioRAM1 - ld hl, wc02e - call FillAudioRAM1 - ld hl, wc03e - call FillAudioRAM1 - ld hl, wc046 - call FillAudioRAM1 - ld hl, wc04e - call FillAudioRAM1 - ld hl, wc056 - call FillAudioRAM1 - ld hl, wc05e - call FillAudioRAM1 - ld hl, wc066 - call FillAudioRAM1 - ld hl, wc06e - call FillAudioRAM1 - ld hl, wc036 - call FillAudioRAM1 - ld hl, wc076 - call FillAudioRAM1 - ld hl, wc07e - call FillAudioRAM1 - ld hl, wc086 - call FillAudioRAM1 - ld hl, wc08e - call FillAudioRAM1 - ld hl, wc096 - call FillAudioRAM1 - ld hl, wc09e - call FillAudioRAM1 - ld hl, wc0a6 - call FillAudioRAM1 - ld hl, wc0ae - call FillAudioRAM1 - ld a, $1 - ld hl, wc0be - call FillAudioRAM1 - ld hl, wc0b6 - call FillAudioRAM1 - ld hl, wc0c6 - call FillAudioRAM1 - ld [wc0e8], a - ld a, $ff - ld [wc004], a - xor a - ld [$ff24], a - ld a, $8 - ld [$ff10], a - ld a, $0 - ld [$ff25], a - xor a - ld [$ff1a], a - ld a, $80 - ld [$ff1a], a - ld a, $77 - ld [$ff24], a - jp Audio1_9a8f + jr z, .playMusic + jp nc, .playSfx -Audio1_994e: ; 0x994e +.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, wChannelDuties + call .FillMem + ld hl, wChannelDutyCycles + 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, wChannelPitchBendLengthModifiers + call .FillMem + ld hl, wChannelPitchBendFrequencySteps + call .FillMem + ld hl, wChannelPitchBendFrequencyStepsFractionalPart + call .FillMem + ld hl, wChannelPitchBendCurrentFrequencyFractionalPart + call .FillMem + ld hl, wChannelPitchBendCurrentFrequencyHighBytes + call .FillMem + ld hl, wChannelPitchBendCurrentFrequencyLowBytes + call .FillMem + ld hl, wChannelPitchBendTargetFrequencyHighBytes + call .FillMem + ld hl, wChannelPitchBendTargetFrequencyLowBytes + 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 + jp .playSoundCommon + +.playSfx ld l, a ld e, a - ld h, $0 + ld h, 0 ld d, h add hl, hl add hl, de ld de, SFX_Headers_1 add hl, de ld a, h - ld [wc0ec], a + ld [wSfxHeaderPointer], a ld a, l - ld [wc0ed], a + ld [wSfxHeaderPointer + 1], a ld a, [hl] and $c0 rlca rlca ld c, a -.asm_9967 +.sfxChannelLoop ld d, c ld a, c add a add c ld c, a - ld b, $0 - ld a, [wc0ec] + ld b, 0 + ld a, [wSfxHeaderPointer] ld h, a - ld a, [wc0ed] + ld a, [wSfxHeaderPointer + 1] ld l, a add hl, bc ld c, d ld a, [hl] and $f - ld e, a - ld d, $0 - ld hl, wc026 + ld e, a ; software channel ID + ld d, 0 + ld hl, wChannelSoundIDs add hl, de ld a, [hl] and a @@ -1400,7 +1444,7 @@ Audio1_994e: ; 0x994e ld a, e cp $7 jr nz, .asm_999a - ld a, [wc001] + ld a, [wSoundID] cp $14 jr nc, .asm_9993 ret @@ -1410,7 +1454,7 @@ Audio1_994e: ; 0x994e jr z, .asm_99a3 jr c, .asm_99a3 .asm_999a - ld a, [wc001] + ld a, [wSoundID] cp [hl] jr z, .asm_99a3 jr c, .asm_99a3 @@ -1423,132 +1467,132 @@ Audio1_994e: ; 0x994e add hl, hl ld d, h ld e, l - ld hl, wc016 + ld hl, wChannelReturnAddresses add hl, de ld [hli], a ld [hl], a - ld hl, wc006 + ld hl, wChannelCommandPointers add hl, de ld [hli], a ld [hl], a pop de - ld hl, wc026 + ld hl, wChannelSoundIDs add hl, de ld [hl], a - ld hl, wc02e + ld hl, wChannelFlags1 add hl, de ld [hl], a - ld hl, wc03e + ld hl, wChannelDuties add hl, de ld [hl], a - ld hl, wc046 + ld hl, wChannelDutyCycles add hl, de ld [hl], a - ld hl, wc04e + ld hl, wChannelVibratoDelayCounters add hl, de ld [hl], a - ld hl, wc056 + ld hl, wChannelVibratoExtents add hl, de ld [hl], a - ld hl, wc05e + ld hl, wChannelVibratoRates add hl, de ld [hl], a - ld hl, wc066 + ld hl, wChannelFrequencyLowBytes add hl, de ld [hl], a - ld hl, wc06e + ld hl, wChannelVibratoDelayCounterReloadValues add hl, de ld [hl], a - ld hl, wc076 + ld hl, wChannelPitchBendLengthModifiers add hl, de ld [hl], a - ld hl, wc07e + ld hl, wChannelPitchBendFrequencySteps add hl, de ld [hl], a - ld hl, wc086 + ld hl, wChannelPitchBendFrequencyStepsFractionalPart add hl, de ld [hl], a - ld hl, wc08e + ld hl, wChannelPitchBendCurrentFrequencyFractionalPart add hl, de ld [hl], a - ld hl, wc096 + ld hl, wChannelPitchBendCurrentFrequencyHighBytes add hl, de ld [hl], a - ld hl, wc09e + ld hl, wChannelPitchBendCurrentFrequencyLowBytes add hl, de ld [hl], a - ld hl, wc0a6 + ld hl, wChannelPitchBendTargetFrequencyHighBytes add hl, de ld [hl], a - ld hl, wc0ae + ld hl, wChannelPitchBendTargetFrequencyLowBytes add hl, de ld [hl], a - ld hl, wc036 + ld hl, wChannelFlags2 add hl, de ld [hl], a ld a, $1 - ld hl, wc0be + ld hl, wChannelLoopCounters add hl, de ld [hl], a - ld hl, wc0b6 + ld hl, wChannelNoteDelayCounters add hl, de ld [hl], a - ld hl, wc0c6 + ld hl, wChannelNoteSpeeds add hl, de ld [hl], a ld a, e - cp $4 + cp CH4 jr nz, .asm_9a2b ld a, $8 - ld [$ff10], a + ld [rNR10], a ; sweep off .asm_9a2b ld a, c and a - jp z, Audio1_9a8f + jp z, .playSoundCommon dec c - jp .asm_9967 + jp .sfxChannelLoop -Audio1_9a34: ; 0x9a34 +.stopAllAudio ld a, $80 - ld [$ff26], a - ld [$ff1a], a + ld [rNR52], a ; sound hardware on + ld [rNR30], a ; wave playback on xor a - ld [$ff25], a - ld [$ff1c], a + ld [rNR51], a ; no sound output + ld [rNR32], a ; mute channel 3 (wave channel) ld a, $8 - ld [$ff10], a - ld [$ff12], a - ld [$ff17], a - ld [$ff21], a + 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 [$ff14], a - ld [$ff19], a - ld [$ff23], a + ld [rNR14], a ; counter mode + ld [rNR24], a + ld [rNR44], a ld a, $77 - ld [$ff24], a + ld [rNR50], a ; full volume xor a - ld [wc000], a - ld [wc003], a - ld [wc002], a - ld [wc0e9], a - ld [wc0eb], a - ld [wc0e6], a - ld [wc0e7], 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, wc006 - call FillAudioRAM1 + ld hl, wChannelCommandPointers + call .FillMem ld a, $1 ld d, $18 - ld hl, wc0b6 - call FillAudioRAM1 - ld [wc0e8], a - ld [wc0ea], a + ld hl, wChannelNoteDelayCounters + call .FillMem + ld [wMusicTempo], a + ld [wSfxTempo], a ld a, $ff - ld [wc004], a + ld [wStereoPanning], a ret ; fills d bytes at hl with a -FillAudioRAM1: ; 0x9a89 +.FillMem ld b, d .loop ld [hli], a @@ -1556,11 +1600,11 @@ FillAudioRAM1: ; 0x9a89 jr nz, .loop ret -Audio1_9a8f: ; 0x9a8f - ld a, [wc001] +.playSoundCommon + ld a, [wSoundID] ld l, a ld e, a - ld h, $0 + ld h, 0 ld d, h add hl, hl add hl, de @@ -1568,7 +1612,7 @@ Audio1_9a8f: ; 0x9a8f add hl, de ld e, l ld d, h - ld hl, wc006 + ld hl, wChannelCommandPointers ld a, [de] ; get channel number ld b, a rlca @@ -1580,31 +1624,31 @@ Audio1_9a8f: ; 0x9a8f ld b, c inc b inc de - ld c, $0 -.asm_9ab1 + ld c, 0 +.commandPointerLoop cp c - jr z, .asm_9ab9 + jr z, .next inc c inc hl inc hl - jr .asm_9ab1 -.asm_9ab9 + jr .commandPointerLoop +.next push hl push bc push af - ld b, $0 + ld b, 0 ld c, a - ld hl, wc026 + ld hl, wChannelSoundIDs add hl, bc - ld a, [wc001] + ld a, [wSoundID] ld [hl], a pop af - cp $3 - jr c, .asm_9ad2 - ld hl, wc02e + cp CH3 + jr c, .skipSettingFlag + ld hl, wChannelFlags1 add hl, bc - set 2, [hl] -.asm_9ad2 + set BIT_NOISE_OR_SFX, [hl] +.skipSettingFlag pop bc pop hl ld a, [de] ; get channel pointer @@ -1619,52 +1663,53 @@ Audio1_9a8f: ; 0x9a8f and a ld a, [de] inc de - jr nz, .asm_9ab1 - ld a, [wc001] - cp $14 + jr nz, .commandPointerLoop + ld a, [wSoundID] + cp CRY_SFX_START jr nc, .asm_9aeb - jr .asm_9b15 + jr .done .asm_9aeb - ld a, [wc001] - cp $86 - jr z, .asm_9b15 - jr c, .asm_9af6 - jr .asm_9b15 -.asm_9af6 - ld hl, wc02a + ld a, [wSoundID] + cp CRY_SFX_END + jr z, .done + jr c, .cry + jr .done +.cry + ld hl, wChannelSoundIDs + CH4 ld [hli], a ld [hli], a ld [hli], a ld [hl], a - ld hl, wc012 ; sfx noise channel pointer - ld de, Noise1_endchannel + ld hl, wChannelCommandPointers + CH6 * 2 ; sfx wave channel pointer + ld de, Audio1_CryEndchannel ld [hl], e inc hl ld [hl], d ; overwrite pointer to point to endchannel - ld a, [wc005] + ld a, [wSavedVolume] and a - jr nz, .asm_9b15 - ld a, [$ff24] - ld [wc005], a + jr nz, .done + ld a, [rNR50] + ld [wSavedVolume], a ld a, $77 - ld [$ff24], a -.asm_9b15 + ld [rNR50], a ; full volume +.done ret -Noise1_endchannel: ; 0x9b16 +Audio1_CryEndchannel: ; 0x9b16 endchannel -Unknown_9b17: ; 0x9b17 - db $10, $15, $1A, $1F ; channels 0-3 - db $10, $15, $1A, $1F ; channels 4-7 +Audio1_HWChannelBaseAddresses: ; 0x9b17 +; the low bytes of each HW channel's base address + db HW_CH1_BASE, HW_CH2_BASE, HW_CH3_BASE, HW_CH4_BASE ; channels 0-3 + db HW_CH1_BASE, HW_CH2_BASE, HW_CH3_BASE, HW_CH4_BASE ; channels 4-7 -Unknown_9b1f: ; 0x9b1f - db $EE, $DD, $BB, $77 ; channels 0-3 - db $EE, $DD, $BB, $77 ; channels 4-7 +Audio1_HWChannelDisableMasks: ; 0x9b1f + 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 -Unknown_9b27: ; 0x9b27 - db $11, $22, $44, $88 ; channels 0-3 - db $11, $22, $44, $88 ; channels 4-7 +Audio1_HWChannelEnableMasks: ; 0x9b27 + 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 Audio1_Pitches: ; 0x9b2f dw $F82C ; C_ diff --git a/audio/engine_2.asm b/audio/engine_2.asm index 62b82cec..e70a305f 100644 --- a/audio/engine_2.asm +++ b/audio/engine_2.asm @@ -4,7 +4,7 @@ Audio2_UpdateMusic:: ; 21879 (8:5879) ld c, CH0 .loop ld b, $0 - ld hl, wc026 + ld hl, wChannelSoundIDs add hl, bc ld a, [hl] and a @@ -12,18 +12,18 @@ Audio2_UpdateMusic:: ; 21879 (8:5879) ld a, c cp CH4 jr nc, .applyAffects ; if sfx channel - ld a, [wc002] + ld a, [wMuteAudioAndPauseMusic] and a jr z, .applyAffects bit 7, a jr nz, .nextChannel set 7, a - ld [wc002], a + ld [wMuteAudioAndPauseMusic], a xor a - ld [$ff25], a - ld [$ff1a], a + ld [rNR51], a + ld [rNR30], a ld a, $80 - ld [$ff1a], a + ld [rNR30], a jr .nextChannel .applyAffects call Audio2_ApplyMusicAffects @@ -36,7 +36,7 @@ Audio2_UpdateMusic:: ; 21879 (8:5879) ; this routine checks flags for music effects currently applied ; to the channel and calls certain functions based on flags. -; known flags for wc02e: +; known flags for wChannelFlags1: ; 0: toggleperfectpitch has been used ; 1: call has been used ; 3: a toggle used only by this routine for vibrato @@ -44,7 +44,7 @@ Audio2_UpdateMusic:: ; 21879 (8:5879) ; 6: dutycycle flag Audio2_ApplyMusicAffects: ; 218ae (8:58ae) ld b, $0 - ld hl, wc0b6 ; delay until next note + ld hl, wChannelNoteDelayCounters ; delay until next note add hl, bc ld a, [hl] cp $1 ; if the delay is 1, play next note @@ -54,36 +54,36 @@ Audio2_ApplyMusicAffects: ; 218ae (8:58ae) ld a, c cp CH4 jr nc, .startChecks ; if a sfx channel - ld hl, wc02a + ld hl, wChannelSoundIDs + CH4 add hl, bc ld a, [hl] and a jr z, .startChecks ret .startChecks - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc bit 6, [hl] ; dutycycle jr z, .checkForExecuteMusic call Audio2_ApplyDutyCycle .checkForExecuteMusic ld b, $0 - ld hl, wc036 + ld hl, wChannelFlags2 add hl, bc bit 0, [hl] jr nz, .checkForPitchBend - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc bit 2, [hl] jr nz, .disablePitchBendVibrato .checkForPitchBend - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc bit 4, [hl] ; pitchbend jr z, .checkVibratoDelay jp Audio2_ApplyPitchBend .checkVibratoDelay - ld hl, wc04e ; vibrato delay + ld hl, wChannelVibratoDelayCounters ; vibrato delay add hl, bc ld a, [hl] and a ; check if delay is over @@ -92,7 +92,7 @@ Audio2_ApplyMusicAffects: ; 218ae (8:58ae) .disablePitchBendVibrato ret .checkForVibrato - ld hl, wc056 ; vibrato rate + ld hl, wChannelVibratoExtents ; vibrato rate add hl, bc ld a, [hl] and a @@ -100,7 +100,7 @@ Audio2_ApplyMusicAffects: ; 218ae (8:58ae) ret ; no vibrato .vibrato ld d, a - ld hl, wc05e + ld hl, wChannelVibratoRates add hl, bc ld a, [hl] and $f @@ -113,10 +113,10 @@ Audio2_ApplyMusicAffects: ; 218ae (8:58ae) swap [hl] or [hl] ld [hl], a ; reset the vibrato value and start again - ld hl, wc066 + ld hl, wChannelFrequencyLowBytes add hl, bc ld e, [hl] ; get note pitch - ld hl, wc02e + ld hl, wChannelFlags1 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 @@ -149,13 +149,13 @@ Audio2_ApplyMusicAffects: ; 218ae (8:58ae) ; like tempo changes, duty changes etc. and doesn't return ; until the first note is reached Audio2_PlayNextNote: ; 21946 (8:5946) - ld hl, wc06e + ld hl, wChannelVibratoDelayCounterReloadValues add hl, bc ld a, [hl] - ld hl, wc04e + ld hl, wChannelVibratoDelayCounters add hl, bc ld [hl], a - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc res 4, [hl] res 5, [hl] @@ -175,7 +175,7 @@ Audio2_endchannel: ; 21967 (8:5967) cp $ff ; is this command an endchannel? jp nz, Audio2_callchannel ; no ld b, $0 ; yes - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc bit 1, [hl] jr nz, .returnFromCall @@ -185,22 +185,22 @@ Audio2_endchannel: ; 21967 (8:5967) jr .asm_219c0 .noiseOrSfxChannel res 2, [hl] - ld hl, wc036 + ld hl, wChannelFlags2 add hl, bc res 0, [hl] cp CH6 jr nz, .notSfxChannel3 ld a, $0 - ld [$ff1a], a + ld [rNR30], a ld a, $80 - ld [$ff1a], a + ld [rNR30], a .notSfxChannel3 jr nz, .asm_219a3 - ld a, [wc003] + ld a, [wDisableChannelOutputWhenSfxEnds] and a jr z, .asm_219a3 xor a - ld [wc003], a + ld [wDisableChannelOutputWhenSfxEnds], a jr .asm_219c0 .asm_219a3 jr .asm_219c9 @@ -210,10 +210,10 @@ Audio2_endchannel: ; 21967 (8:5967) ld a, c add a ld e, a - ld hl, wc006 + ld hl, wChannelCommandPointers add hl, de push hl ; store current channel address - ld hl, wc016 + ld hl, wChannelReturnAddresses add hl, de ld e, l ld d, h @@ -227,16 +227,16 @@ Audio2_endchannel: ; 21967 (8:5967) .asm_219c0 ld hl, Unknown_222de add hl, bc - ld a, [$ff25] + ld a, [rNR51] and [hl] - ld [$ff25], a + ld [rNR51], a .asm_219c9 - ld a, [wc02a] + ld a, [wChannelSoundIDs + CH4] cp $14 jr nc, .asm_219d2 jr .asm_219ef .asm_219d2 - ld a, [wc02a] + ld a, [wChannelSoundIDs + CH4] cp $86 jr z, .asm_219ef jr c, .asm_219dd @@ -248,12 +248,12 @@ Audio2_endchannel: ; 21967 (8:5967) call Audio2_21e6d ret c .asm_219e6 - ld a, [wc005] - ld [$ff24], a + ld a, [wSavedVolume] + ld [rNR50], a xor a - ld [wc005], a + ld [wSavedVolume], a .asm_219ef - ld hl, wc026 + ld hl, wChannelSoundIDs add hl, bc ld [hl], b ret @@ -272,10 +272,10 @@ Audio2_callchannel: ; 219f5 (8:59f5) ld a, c add a ld e, a - ld hl, wc006 + ld hl, wChannelCommandPointers add hl, de push hl - ld hl, wc016 + ld hl, wChannelReturnAddresses add hl, de ld e, l ld d, h @@ -290,7 +290,7 @@ Audio2_callchannel: ; 219f5 (8:59f5) inc hl ld [hl], d ; overwrite current address with pointer ld b, $0 - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc set 1, [hl] ; set the call flag jp Audio2_endchannel @@ -303,7 +303,7 @@ Audio2_loopchannel: ; 21a2a (8:5a2a) and a jr z, .infiniteLoop ld b, $0 - ld hl, wc0be + ld hl, wChannelLoopCounters add hl, bc ld a, [hl] cp e @@ -326,7 +326,7 @@ Audio2_loopchannel: ; 21a2a (8:5a2a) ld a, c add a ld e, a - ld hl, wc006 + ld hl, wChannelCommandPointers add hl, de pop af ld [hli], a @@ -340,7 +340,7 @@ Audio2_notetype: ; 21a65 (8:5a65) ld a, d ; yes and $f ld b, $0 - ld hl, wc0c6 + ld hl, wChannelNoteSpeeds add hl, bc ld [hl], a ; store low nibble as speed ld a, c @@ -353,10 +353,10 @@ Audio2_notetype: ; 21a65 (8:5a65) jr z, .musicChannel3 cp CH6 jr nz, .notChannel3 - ld hl, wc0e7 + ld hl, wSfxWaveInstrument jr .sfxChannel3 .musicChannel3 - ld hl, wc0e6 + ld hl, wMusicWaveInstrument .sfxChannel3 ld a, d and $f @@ -371,7 +371,7 @@ Audio2_notetype: ; 21a65 (8:5a65) ; else, store volume (high nibble) and fade (low nibble) .notChannel3 ld b, $0 - ld hl, wc0de + ld hl, wChannelVolumes add hl, bc ld [hl], d .noiseChannel @@ -382,11 +382,11 @@ Audio2_toggleperfectpitch: ; 21aa4 (8:5aa4) cp $e8 ; is this command a toggleperfectpitch? jr nz, Audio2_vibrato ; no ld b, $0 ; yes - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc ld a, [hl] xor $1 - ld [hl], a ; flip bit 0 of wc02e + ld [hl], a ; flip bit 0 of wChannelFlags1 jp Audio2_endchannel Audio2_vibrato: ; 21ab6 (8:5ab6) @@ -394,10 +394,10 @@ Audio2_vibrato: ; 21ab6 (8:5ab6) jr nz, Audio2_pitchbend ; no call Audio2_GetNextMusicByte ; yes ld b, $0 - ld hl, wc04e + ld hl, wChannelVibratoDelayCounters add hl, bc ld [hl], a ; store delay - ld hl, wc06e + ld hl, wChannelVibratoDelayCounterReloadValues add hl, bc ld [hl], a ; store delay call Audio2_GetNextMusicByte @@ -405,7 +405,7 @@ Audio2_vibrato: ; 21ab6 (8:5ab6) and $f0 swap a ld b, $0 - ld hl, wc056 + ld hl, wChannelVibratoExtents add hl, bc srl a ld e, a @@ -416,7 +416,7 @@ Audio2_vibrato: ; 21ab6 (8:5ab6) ld a, d and $f ld d, a - ld hl, wc05e + ld hl, wChannelVibratoRates add hl, bc swap a or d @@ -428,7 +428,7 @@ Audio2_pitchbend: ; 21aee (8:5aee) jr nz, Audio2_duty ; no call Audio2_GetNextMusicByte ; yes ld b, $0 - ld hl, wc076 + ld hl, wChannelPitchBendLengthModifiers add hl, bc ld [hl], a ; store first param call Audio2_GetNextMusicByte @@ -440,14 +440,14 @@ Audio2_pitchbend: ; 21aee (8:5aee) and $f call Audio2_22017 ld b, $0 - ld hl, wc0a6 + ld hl, wChannelPitchBendTargetFrequencyHighBytes add hl, bc ld [hl], d ; store unknown part of second param - ld hl, wc0ae + ld hl, wChannelPitchBendTargetFrequencyLowBytes add hl, bc ld [hl], e ; store unknown part of second param ld b, $0 - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc set 4, [hl] ; set pitchbend flag call Audio2_GetNextMusicByte @@ -462,7 +462,7 @@ Audio2_duty: ; 21b26 (8:5b26) rrca and $c0 ld b, $0 - ld hl, wc03e + ld hl, wChannelDuties add hl, bc ld [hl], a ; store duty jp Audio2_endchannel @@ -474,25 +474,25 @@ Audio2_tempo: ; 21b3b (8:5b3b) cp CH4 jr nc, .sfxChannel call Audio2_GetNextMusicByte - ld [wc0e8], a ; store first param + ld [wMusicTempo], a ; store first param call Audio2_GetNextMusicByte - ld [wc0e9], a ; store second param + ld [wMusicTempo + 1], a ; store second param xor a - ld [wc0ce], a ; clear RAM - ld [wc0cf], a - ld [wc0d0], a - ld [wc0d1], a + ld [wChannelNoteDelayCountersFractionalPart], a ; clear RAM + ld [wChannelNoteDelayCountersFractionalPart + 1], a + ld [wChannelNoteDelayCountersFractionalPart + 2], a + ld [wChannelNoteDelayCountersFractionalPart + 3], a jr .musicChannelDone .sfxChannel call Audio2_GetNextMusicByte - ld [wc0ea], a ; store first param + ld [wSfxTempo], a ; store first param call Audio2_GetNextMusicByte - ld [wc0eb], a ; store second param + ld [wSfxTempo + 1], a ; store second param xor a - ld [wc0d2], a ; clear RAM - ld [wc0d3], a - ld [wc0d4], a - ld [wc0d5], a + ld [wChannelNoteDelayCountersFractionalPart + 4], a ; clear RAM + ld [wChannelNoteDelayCountersFractionalPart + 5], a + ld [wChannelNoteDelayCountersFractionalPart + 6], a + ld [wChannelNoteDelayCountersFractionalPart + 7], a .musicChannelDone jp Audio2_endchannel @@ -500,7 +500,7 @@ Audio2_stereopanning: ; 21b7b (8:5b7b) cp $ee ; is this command a stereopanning? jr nz, Audio2_unknownmusic0xef ; no call Audio2_GetNextMusicByte ; yes - ld [wc004], a ; store panning + ld [wStereoPanning], a ; store panning jp Audio2_endchannel ; this appears to never be used @@ -509,15 +509,15 @@ Audio2_unknownmusic0xef: ; 21b88 (8:5b88) jr nz, Audio2_dutycycle ; no call Audio2_GetNextMusicByte ; yes push bc - call Audio2_22035 + call Audio2_PlaySound pop bc - ld a, [wc003] + ld a, [wDisableChannelOutputWhenSfxEnds] and a jr nz, .skip - ld a, [wc02d] - ld [wc003], a + ld a, [wChannelSoundIDs + CH7] + ld [wDisableChannelOutputWhenSfxEnds], a xor a - ld [wc02d], a + ld [wChannelSoundIDs + CH7], a .skip jp Audio2_endchannel @@ -526,14 +526,14 @@ Audio2_dutycycle: ; 21ba7 (8:5ba7) jr nz, Audio2_volume ; no call Audio2_GetNextMusicByte ; yes ld b, $0 - ld hl, wc046 + ld hl, wChannelDutyCycles add hl, bc ld [hl], a ; store full cycle and $c0 - ld hl, wc03e + ld hl, wChannelDuties add hl, bc ld [hl], a ; store first duty - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc set 6, [hl] ; set dutycycle flag jp Audio2_endchannel @@ -542,14 +542,14 @@ Audio2_volume: ; 21bc5 (8:5bc5) cp $f0 ; is this command a volume? jr nz, Audio2_executemusic ; no call Audio2_GetNextMusicByte ; yes - ld [$ff24], a ; store volume + ld [rNR50], a ; store volume jp Audio2_endchannel Audio2_executemusic: ; 21bd1 (8:5bd1) cp $f8 ; is this command an executemusic? jr nz, Audio2_octave ; no ld b, $0 ; yes - ld hl, wc036 + ld hl, wChannelFlags2 add hl, bc set 0, [hl] jp Audio2_endchannel @@ -558,7 +558,7 @@ Audio2_octave: ; 21be0 (8:5be0) and $f0 cp $e0 ; is this command an octave? jr nz, Audio2_unknownsfx0x20 ; no - ld hl, wc0d6 ; yes + ld hl, wChannelOctaves ; yes ld b, $0 add hl, bc ld a, d @@ -573,14 +573,14 @@ Audio2_unknownsfx0x20: ; 21bf3 cp CH3 ; is this a noise or sfx channel? jr c, Audio2_unknownsfx0x10 ; no ld b, $0 - ld hl, wc036 + ld hl, wChannelFlags2 add hl, bc bit 0, [hl] jr nz, Audio2_unknownsfx0x10 ; no call Audio2_notelength ld d, a ld b, $0 - ld hl, wc03e + ld hl, wChannelDuties add hl, bc ld a, [hl] or d @@ -619,12 +619,12 @@ Audio2_unknownsfx0x10: ; 21c40 (8:5c40) cp $10 ; is this command a unknownsfx0x10? jr nz, Audio2_note ; no ld b, $0 - ld hl, wc036 + ld hl, wChannelFlags2 add hl, bc bit 0, [hl] jr nz, Audio2_note ; no call Audio2_GetNextMusicByte ; yes - ld [$ff10], a + ld [rNR10], a jp Audio2_endchannel Audio2_note: ; 21c5c (8:5c5c) @@ -654,11 +654,11 @@ Audio2_dnote: ; 21c76 (8:5c76) call Audio2_GetNextMusicByte ; get dnote instrument asm_21c7e ld d, a - ld a, [wc003] + ld a, [wDisableChannelOutputWhenSfxEnds] and a jr nz, .asm_21c89 ld a, d - call Audio2_22035 + call Audio2_PlaySound .asm_21c89 pop bc pop de @@ -671,7 +671,7 @@ Audio2_notelength: ; 21c8b (8:5c8b) ld b, $0 ld e, a ; store note length (in 16ths) ld d, b - ld hl, wc0c6 + ld hl, wChannelNoteSpeeds add hl, bc ld a, [hl] ld l, b @@ -679,9 +679,9 @@ Audio2_notelength: ; 21c8b (8:5c8b) ld a, c cp CH4 jr nc, .sfxChannel - ld a, [wc0e8] + ld a, [wMusicTempo] ld d, a - ld a, [wc0e9] + ld a, [wMusicTempo + 1] ld e, a jr .skip .sfxChannel @@ -690,31 +690,31 @@ Audio2_notelength: ; 21c8b (8:5c8b) cp CH7 jr z, .skip ; if noise channel call Audio2_21e2f - ld a, [wc0ea] + ld a, [wSfxTempo] ld d, a - ld a, [wc0eb] + ld a, [wSfxTempo + 1] ld e, a .skip ld a, l ld b, $0 - ld hl, wc0ce + ld hl, wChannelNoteDelayCountersFractionalPart add hl, bc ld l, [hl] call Audio2_22006 ld e, l ld d, h - ld hl, wc0ce + ld hl, wChannelNoteDelayCountersFractionalPart add hl, bc ld [hl], e ld a, d - ld hl, wc0b6 + ld hl, wChannelNoteDelayCounters add hl, bc ld [hl], a - ld hl, wc036 + ld hl, wChannelFlags2 add hl, bc bit 0, [hl] jr nz, Audio2_notepitch - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc bit 2, [hl] jr z, Audio2_notepitch @@ -729,7 +729,7 @@ Audio2_notepitch: ; 21ce9 (8:5ce9) ld a, c cp CH4 jr nc, .sfxChannel - ld hl, wc02a + ld hl, wChannelSoundIDs + CH4 add hl, bc ld a, [hl] and a @@ -745,9 +745,9 @@ Audio2_notepitch: ; 21ce9 (8:5ce9) ld b, $0 ld hl, Unknown_222de add hl, bc - ld a, [$ff25] + ld a, [rNR51] and [hl] - ld [$ff25], a + ld [rNR51], a jr .done .notSfxChannel3 ld b, $2 @@ -762,12 +762,12 @@ Audio2_notepitch: ; 21ce9 (8:5ce9) .notRest swap a ld b, $0 - ld hl, wc0d6 + ld hl, wChannelOctaves add hl, bc ld b, [hl] call Audio2_22017 ld b, $0 - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc bit 4, [hl] jr z, .asm_21d39 @@ -777,7 +777,7 @@ Audio2_notepitch: ; 21ce9 (8:5ce9) ld a, c cp CH4 jr nc, .skip ; if sfx channel - ld hl, wc02a + ld hl, wChannelSoundIDs + CH4 ld d, $0 ld e, a add hl, de @@ -790,7 +790,7 @@ Audio2_notepitch: ; 21ce9 (8:5ce9) ret .skip ld b, $0 - ld hl, wc0de + ld hl, wChannelVolumes add hl, bc ld d, [hl] ld b, $2 @@ -800,7 +800,7 @@ Audio2_notepitch: ; 21ce9 (8:5ce9) call Audio2_21d79 pop de ld b, $0 - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc bit 0, [hl] ; has toggleperfectpitch been used? jr z, .skip2 @@ -808,7 +808,7 @@ Audio2_notepitch: ; 21ce9 (8:5ce9) jr nc, .skip2 inc d .skip2 - ld hl, wc066 + ld hl, wChannelFrequencyLowBytes add hl, bc ld [hl], e call Audio2_21dcc @@ -818,7 +818,7 @@ Audio2_21d79: ; 21d79 (8:5d79) ld b, $0 ld hl, Unknown_222e6 add hl, bc - ld a, [$ff25] + ld a, [rNR51] or [hl] ld d, a ld a, c @@ -826,18 +826,18 @@ Audio2_21d79: ; 21d79 (8:5d79) jr z, .sfxNoiseChannel cp CH4 jr nc, .skip ; if sfx channel - ld hl, wc02a + ld hl, wChannelSoundIDs + CH4 add hl, bc ld a, [hl] and a jr nz, .skip .sfxNoiseChannel - ld a, [wc004] + ld a, [wStereoPanning] ld hl, Unknown_222e6 add hl, bc and [hl] ld d, a - ld a, [$ff25] + ld a, [rNR51] ld hl, Unknown_222de add hl, bc and [hl] @@ -845,12 +845,12 @@ Audio2_21d79: ; 21d79 (8:5d79) ld d, a .skip ld a, d - ld [$ff25], a + ld [rNR51], a ret Audio2_21daa: ; 21daa (8:5daa) ld b, $0 - ld hl, wc0b6 + ld hl, wChannelNoteDelayCounters add hl, bc ld d, [hl] ld a, c @@ -861,7 +861,7 @@ Audio2_21daa: ; 21daa (8:5daa) ld a, d and $3f ld d, a - ld hl, wc03e + ld hl, wChannelDuties add hl, bc ld a, [hl] or d @@ -881,10 +881,10 @@ Audio2_21dcc: ; 21dcc (8:5dcc) ; fall through .channel3 push de - ld de, wc0e6 + ld de, wMusicWaveInstrument cp CH2 jr z, .musicChannel3 - ld de, wc0e7 + ld de, wSfxWaveInstrument .musicChannel3 ld a, [de] add a @@ -898,7 +898,7 @@ Audio2_21dcc: ; 21dcc (8:5dcc) ld hl, $ff30 ld b, $f ld a, $0 - ld [$ff1a], a + ld [rNR30], a .loop ld a, [de] inc de @@ -908,7 +908,7 @@ Audio2_21dcc: ; 21dcc (8:5dcc) and a jr nz, .loop ld a, $80 - ld [$ff1a], a + ld [rNR30], a pop de .notSfxChannel3 ld a, d @@ -935,9 +935,9 @@ Audio2_21e19: ; 21e19 (8:5e19) bit 7, a jr z, .asm_21e2e xor a - ld [wc0f1], a + ld [wFrequencyModifier], a ld a, $80 - ld [wc0f2], a + ld [wTempoModifier], a .asm_21e2e ret @@ -948,20 +948,20 @@ Audio2_21e2f: ; 21e2f (8:5e2f) jr nc, .asm_21e4c .asm_21e39 ld d, $0 - ld a, [wc0f2] + ld a, [wTempoModifier] add $80 jr nc, .asm_21e43 inc d .asm_21e43 - ld [wc0eb], a + ld [wSfxTempo + 1], a ld a, d - ld [wc0ea], a + ld [wSfxTempo], a jr .asm_21e55 .asm_21e4c xor a - ld [wc0eb], a + ld [wSfxTempo + 1], a ld a, $1 - ld [wc0ea], a + ld [wSfxTempo], a .asm_21e55 ret @@ -971,7 +971,7 @@ Audio2_21e56: ; 21e56 (8:5e56) call Audio2_21e9f jr nc, .asm_21e6c .asm_21e60 - ld a, [wc0f1] + ld a, [wFrequencyModifier] add e jr nc, .asm_21e67 inc d @@ -987,7 +987,7 @@ Audio2_21e56: ; 21e56 (8:5e56) Audio2_21e6d: ; 21e6d (8:5e6d) call Audio2_21e8b jr nc, .asm_21e88 - ld hl, wc006 + ld hl, wChannelCommandPointers ld e, c ld d, $0 sla e @@ -1008,7 +1008,7 @@ Audio2_21e6d: ; 21e6d (8:5e6d) ret Audio2_21e8b: ; 21e8b (8:5e8b) - ld a, [wc02a] + ld a, [wChannelSoundIDs + CH4] cp $14 jr nc, .asm_21e94 jr .asm_21e9a @@ -1025,9 +1025,9 @@ Audio2_21e8b: ; 21e8b (8:5e8b) ret Audio2_21e9f: ; 21e9f (8:5e9f) - ld a, [wc02d] + ld a, [wChannelSoundIDs + CH7] ld b, a - ld a, [wc02a] + ld a, [wChannelSoundIDs + CH4] or b cp $9d jr nc, .asm_21ead @@ -1045,27 +1045,27 @@ Audio2_21e9f: ; 21e9f (8:5e9f) ret Audio2_ApplyPitchBend: ; 21eb8 (8:5eb8) - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc bit 5, [hl] jp nz, .asm_21eff - ld hl, wc09e + ld hl, wChannelPitchBendCurrentFrequencyLowBytes add hl, bc ld e, [hl] - ld hl, wc096 + ld hl, wChannelPitchBendCurrentFrequencyHighBytes add hl, bc ld d, [hl] - ld hl, wc07e + ld hl, wChannelPitchBendFrequencySteps add hl, bc ld l, [hl] ld h, b add hl, de ld d, h ld e, l - ld hl, wc08e + ld hl, wChannelPitchBendCurrentFrequencyFractionalPart add hl, bc push hl - ld hl, wc086 + ld hl, wChannelPitchBendFrequencyStepsFractionalPart add hl, bc ld a, [hl] pop hl @@ -1077,26 +1077,26 @@ Audio2_ApplyPitchBend: ; 21eb8 (8:5eb8) ld a, $0 adc d ld d, a - ld hl, wc0a6 + ld hl, wChannelPitchBendTargetFrequencyHighBytes add hl, bc ld a, [hl] cp d jp c, .asm_21f45 jr nz, .asm_21f32 - ld hl, wc0ae + ld hl, wChannelPitchBendTargetFrequencyLowBytes add hl, bc ld a, [hl] cp e jp c, .asm_21f45 jr .asm_21f32 .asm_21eff - ld hl, wc09e + ld hl, wChannelPitchBendCurrentFrequencyLowBytes add hl, bc ld a, [hl] - ld hl, wc096 + ld hl, wChannelPitchBendCurrentFrequencyHighBytes add hl, bc ld d, [hl] - ld hl, wc07e + ld hl, wChannelPitchBendFrequencySteps add hl, bc ld e, [hl] sub e @@ -1104,7 +1104,7 @@ Audio2_ApplyPitchBend: ; 21eb8 (8:5eb8) ld a, d sbc b ld d, a - ld hl, wc086 + ld hl, wChannelPitchBendFrequencyStepsFractionalPart add hl, bc ld a, [hl] add a @@ -1115,22 +1115,22 @@ Audio2_ApplyPitchBend: ; 21eb8 (8:5eb8) ld a, d sbc b ld d, a - ld hl, wc0a6 + ld hl, wChannelPitchBendTargetFrequencyHighBytes add hl, bc ld a, d cp [hl] jr c, .asm_21f45 jr nz, .asm_21f32 - ld hl, wc0ae + ld hl, wChannelPitchBendTargetFrequencyLowBytes add hl, bc ld a, e cp [hl] jr c, .asm_21f45 .asm_21f32 - ld hl, wc09e + ld hl, wChannelPitchBendCurrentFrequencyLowBytes add hl, bc ld [hl], e - ld hl, wc096 + ld hl, wChannelPitchBendCurrentFrequencyHighBytes add hl, bc ld [hl], d ld b, $3 @@ -1140,54 +1140,54 @@ Audio2_ApplyPitchBend: ; 21eb8 (8:5eb8) ld [hl], d ret .asm_21f45 - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc res 4, [hl] res 5, [hl] ret Audio2_21f4e: ; 21f4e (8:5f4e) - ld hl, wc096 + ld hl, wChannelPitchBendCurrentFrequencyHighBytes add hl, bc ld [hl], d - ld hl, wc09e + ld hl, wChannelPitchBendCurrentFrequencyLowBytes add hl, bc ld [hl], e - ld hl, wc0b6 + ld hl, wChannelNoteDelayCounters add hl, bc ld a, [hl] - ld hl, wc076 + ld hl, wChannelPitchBendLengthModifiers add hl, bc sub [hl] jr nc, .asm_21f66 ld a, $1 .asm_21f66 ld [hl], a - ld hl, wc0ae + ld hl, wChannelPitchBendTargetFrequencyLowBytes add hl, bc ld a, e sub [hl] ld e, a ld a, d sbc b - ld hl, wc0a6 + ld hl, wChannelPitchBendTargetFrequencyHighBytes add hl, bc sub [hl] jr c, .asm_21f82 ld d, a ld b, $0 - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc set 5, [hl] jr .asm_21fa5 .asm_21f82 - ld hl, wc096 + ld hl, wChannelPitchBendCurrentFrequencyHighBytes add hl, bc ld d, [hl] - ld hl, wc09e + ld hl, wChannelPitchBendCurrentFrequencyLowBytes add hl, bc ld e, [hl] - ld hl, wc0ae + ld hl, wChannelPitchBendTargetFrequencyLowBytes add hl, bc ld a, [hl] sub e @@ -1195,17 +1195,17 @@ Audio2_21f4e: ; 21f4e (8:5f4e) ld a, d sbc b ld d, a - ld hl, wc0a6 + ld hl, wChannelPitchBendTargetFrequencyHighBytes add hl, bc ld a, [hl] sub d ld d, a ld b, $0 - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc res 5, [hl] .asm_21fa5 - ld hl, wc076 + ld hl, wChannelPitchBendLengthModifiers add hl, bc .asm_21fa9 inc b @@ -1224,20 +1224,20 @@ Audio2_21f4e: ; 21f4e (8:5f4e) add [hl] ld d, b ld b, $0 - ld hl, wc07e + ld hl, wChannelPitchBendFrequencySteps add hl, bc ld [hl], d - ld hl, wc086 + ld hl, wChannelPitchBendFrequencyStepsFractionalPart add hl, bc ld [hl], a - ld hl, wc08e + ld hl, wChannelPitchBendCurrentFrequencyFractionalPart add hl, bc ld [hl], a ret Audio2_ApplyDutyCycle: ; 21fcc (8:5fcc) ld b, $0 - ld hl, wc046 + ld hl, wChannelDutyCycles add hl, bc ld a, [hl] rlca @@ -1258,7 +1258,7 @@ Audio2_GetNextMusicByte: ; 21fe4 (8:5fe4) ld a, c add a ld e, a - ld hl, wc006 + ld hl, wChannelCommandPointers add hl, de ld a, [hli] ld e, a @@ -1325,8 +1325,8 @@ Audio2_22017: ; 22017 (8:6017) ld d, a ret -Audio2_22035:: ; 22035 (8:6035) - ld [wc001], a +Audio2_PlaySound:: ; 22035 (8:6035) + ld [wSoundID], a cp $ff jp z, Audio2_221f3 cp $e9 @@ -1337,75 +1337,75 @@ Audio2_22035:: ; 22035 (8:6035) jp nc, Audio2_2210d .asm_2204c xor a - ld [wc000], a - ld [wc003], a - ld [wc0e9], a - ld [wc0e6], a - ld [wc0e7], a + ld [wUnusedC000], a + ld [wDisableChannelOutputWhenSfxEnds], a + ld [wMusicTempo + 1], a + ld [wMusicWaveInstrument], a + ld [wSfxWaveInstrument], a ld d, $8 - ld hl, wc016 + ld hl, wChannelReturnAddresses call FillAudioRAM2 - ld hl, wc006 + ld hl, wChannelCommandPointers call FillAudioRAM2 ld d, $4 - ld hl, wc026 + ld hl, wChannelSoundIDs call FillAudioRAM2 - ld hl, wc02e + ld hl, wChannelFlags1 call FillAudioRAM2 - ld hl, wc03e + ld hl, wChannelDuties call FillAudioRAM2 - ld hl, wc046 + ld hl, wChannelDutyCycles call FillAudioRAM2 - ld hl, wc04e + ld hl, wChannelVibratoDelayCounters call FillAudioRAM2 - ld hl, wc056 + ld hl, wChannelVibratoExtents call FillAudioRAM2 - ld hl, wc05e + ld hl, wChannelVibratoRates call FillAudioRAM2 - ld hl, wc066 + ld hl, wChannelFrequencyLowBytes call FillAudioRAM2 - ld hl, wc06e + ld hl, wChannelVibratoDelayCounterReloadValues call FillAudioRAM2 - ld hl, wc036 + ld hl, wChannelFlags2 call FillAudioRAM2 - ld hl, wc076 + ld hl, wChannelPitchBendLengthModifiers call FillAudioRAM2 - ld hl, wc07e + ld hl, wChannelPitchBendFrequencySteps call FillAudioRAM2 - ld hl, wc086 + ld hl, wChannelPitchBendFrequencyStepsFractionalPart call FillAudioRAM2 - ld hl, wc08e + ld hl, wChannelPitchBendCurrentFrequencyFractionalPart call FillAudioRAM2 - ld hl, wc096 + ld hl, wChannelPitchBendCurrentFrequencyHighBytes call FillAudioRAM2 - ld hl, wc09e + ld hl, wChannelPitchBendCurrentFrequencyLowBytes call FillAudioRAM2 - ld hl, wc0a6 + ld hl, wChannelPitchBendTargetFrequencyHighBytes call FillAudioRAM2 - ld hl, wc0ae + ld hl, wChannelPitchBendTargetFrequencyLowBytes call FillAudioRAM2 ld a, $1 - ld hl, wc0be + ld hl, wChannelLoopCounters call FillAudioRAM2 - ld hl, wc0b6 + ld hl, wChannelNoteDelayCounters call FillAudioRAM2 - ld hl, wc0c6 + ld hl, wChannelNoteSpeeds call FillAudioRAM2 - ld [wc0e8], a + ld [wMusicTempo], a ld a, $ff - ld [wc004], a + ld [wStereoPanning], a xor a - ld [$ff24], a + ld [rNR50], a ld a, $8 - ld [$ff10], a + ld [rNR10], a ld a, $0 - ld [$ff25], a + ld [rNR51], a xor a - ld [$ff1a], a + ld [rNR30], a ld a, $80 - ld [$ff1a], a + ld [rNR30], a ld a, $77 - ld [$ff24], a + ld [rNR50], a jp Audio2_2224e Audio2_2210d: ; 2210d (8:610d) @@ -1418,9 +1418,9 @@ Audio2_2210d: ; 2210d (8:610d) ld de, SFX_Headers_2 add hl, de ld a, h - ld [wc0ec], a + ld [wSfxHeaderPointer], a ld a, l - ld [wc0ed], a + ld [wSfxHeaderPointer + 1], a ld a, [hl] and $c0 rlca @@ -1433,9 +1433,9 @@ Audio2_2210d: ; 2210d (8:610d) add c ld c, a ld b, $0 - ld a, [wc0ec] + ld a, [wSfxHeaderPointer] ld h, a - ld a, [wc0ed] + ld a, [wSfxHeaderPointer + 1] ld l, a add hl, bc ld c, d @@ -1443,7 +1443,7 @@ Audio2_2210d: ; 2210d (8:610d) and $f ld e, a ld d, $0 - ld hl, wc026 + ld hl, wChannelSoundIDs add hl, de ld a, [hl] and a @@ -1451,7 +1451,7 @@ Audio2_2210d: ; 2210d (8:610d) ld a, e cp $7 jr nz, .asm_22159 - ld a, [wc001] + ld a, [wSoundID] cp $14 jr nc, .asm_22152 ret @@ -1461,7 +1461,7 @@ Audio2_2210d: ; 2210d (8:610d) jr z, .asm_22162 jr c, .asm_22162 .asm_22159 - ld a, [wc001] + ld a, [wSoundID] cp [hl] jr z, .asm_22162 jr c, .asm_22162 @@ -1474,84 +1474,84 @@ Audio2_2210d: ; 2210d (8:610d) add hl, hl ld d, h ld e, l - ld hl, wc016 + ld hl, wChannelReturnAddresses add hl, de ld [hli], a ld [hl], a - ld hl, wc006 + ld hl, wChannelCommandPointers add hl, de ld [hli], a ld [hl], a pop de - ld hl, wc026 + ld hl, wChannelSoundIDs add hl, de ld [hl], a - ld hl, wc02e + ld hl, wChannelFlags1 add hl, de ld [hl], a - ld hl, wc03e + ld hl, wChannelDuties add hl, de ld [hl], a - ld hl, wc046 + ld hl, wChannelDutyCycles add hl, de ld [hl], a - ld hl, wc04e + ld hl, wChannelVibratoDelayCounters add hl, de ld [hl], a - ld hl, wc056 + ld hl, wChannelVibratoExtents add hl, de ld [hl], a - ld hl, wc05e + ld hl, wChannelVibratoRates add hl, de ld [hl], a - ld hl, wc066 + ld hl, wChannelFrequencyLowBytes add hl, de ld [hl], a - ld hl, wc06e + ld hl, wChannelVibratoDelayCounterReloadValues add hl, de ld [hl], a - ld hl, wc076 + ld hl, wChannelPitchBendLengthModifiers add hl, de ld [hl], a - ld hl, wc07e + ld hl, wChannelPitchBendFrequencySteps add hl, de ld [hl], a - ld hl, wc086 + ld hl, wChannelPitchBendFrequencyStepsFractionalPart add hl, de ld [hl], a - ld hl, wc08e + ld hl, wChannelPitchBendCurrentFrequencyFractionalPart add hl, de ld [hl], a - ld hl, wc096 + ld hl, wChannelPitchBendCurrentFrequencyHighBytes add hl, de ld [hl], a - ld hl, wc09e + ld hl, wChannelPitchBendCurrentFrequencyLowBytes add hl, de ld [hl], a - ld hl, wc0a6 + ld hl, wChannelPitchBendTargetFrequencyHighBytes add hl, de ld [hl], a - ld hl, wc0ae + ld hl, wChannelPitchBendTargetFrequencyLowBytes add hl, de ld [hl], a - ld hl, wc036 + ld hl, wChannelFlags2 add hl, de ld [hl], a ld a, $1 - ld hl, wc0be + ld hl, wChannelLoopCounters add hl, de ld [hl], a - ld hl, wc0b6 + ld hl, wChannelNoteDelayCounters add hl, de ld [hl], a - ld hl, wc0c6 + ld hl, wChannelNoteSpeeds add hl, de ld [hl], a ld a, e cp $4 jr nz, .asm_221ea ld a, $8 - ld [$ff10], a + ld [rNR10], a .asm_221ea ld a, c and a @@ -1561,41 +1561,41 @@ Audio2_2210d: ; 2210d (8:610d) Audio2_221f3: ; 221f3 (8:61f3) ld a, $80 - ld [$ff26], a - ld [$ff1a], a + ld [rNR52], a + ld [rNR30], a xor a - ld [$ff25], a - ld [$ff1c], a + ld [rNR51], a + ld [rNR32], a ld a, $8 - ld [$ff10], a - ld [$ff12], a - ld [$ff17], a - ld [$ff21], a + ld [rNR10], a + ld [rNR12], a + ld [rNR22], a + ld [rNR42], a ld a, $40 - ld [$ff14], a - ld [$ff19], a - ld [$ff23], a + ld [rNR14], a + ld [rNR24], a + ld [rNR44], a ld a, $77 - ld [$ff24], a + ld [rNR50], a xor a - ld [wc000], a - ld [wc003], a - ld [wc002], a - ld [wc0e9], a - ld [wc0eb], a - ld [wc0e6], a - ld [wc0e7], 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, wc006 + ld hl, wChannelCommandPointers call FillAudioRAM2 ld a, $1 ld d, $18 - ld hl, wc0b6 + ld hl, wChannelNoteDelayCounters call FillAudioRAM2 - ld [wc0e8], a - ld [wc0ea], a + ld [wMusicTempo], a + ld [wSfxTempo], a ld a, $ff - ld [wc004], a + ld [wStereoPanning], a ret ; fills d bytes at hl with a @@ -1608,7 +1608,7 @@ FillAudioRAM2: ; 22248 (8:6248) ret Audio2_2224e: ; 2224e (8:624e) - ld a, [wc001] + ld a, [wSoundID] ld l, a ld e, a ld h, $0 @@ -1619,7 +1619,7 @@ Audio2_2224e: ; 2224e (8:624e) add hl, de ld e, l ld d, h - ld hl, wc006 + ld hl, wChannelCommandPointers ld a, [de] ; get channel number ld b, a rlca @@ -1645,14 +1645,14 @@ Audio2_2224e: ; 2224e (8:624e) push af ld b, $0 ld c, a - ld hl, wc026 + ld hl, wChannelSoundIDs add hl, bc - ld a, [wc001] + ld a, [wSoundID] ld [hl], a pop af cp $3 jr c, .asm_22291 - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc set 2, [hl] .asm_22291 @@ -1671,34 +1671,34 @@ Audio2_2224e: ; 2224e (8:624e) ld a, [de] inc de jr nz, .asm_22270 - ld a, [wc001] + ld a, [wSoundID] cp $14 jr nc, .asm_222aa jr .asm_222d4 .asm_222aa - ld a, [wc001] + ld a, [wSoundID] cp $86 jr z, .asm_222d4 jr c, .asm_222b5 jr .asm_222d4 .asm_222b5 - ld hl, wc02a + ld hl, wChannelSoundIDs + CH4 ld [hli], a ld [hli], a ld [hli], a ld [hl], a - ld hl, wc012 ; sfx noise channel pointer + ld hl, wChannelCommandPointers + CH6 * 2 ; sfx noise channel pointer ld de, Noise2_endchannel ld [hl], e inc hl ld [hl], d ; overwrite pointer to point to endchannel - ld a, [wc005] + ld a, [wSavedVolume] and a jr nz, .asm_222d4 - ld a, [$ff24] - ld [wc005], a + ld a, [rNR50] + ld [wSavedVolume], a ld a, $77 - ld [$ff24], a + ld [rNR50], a .asm_222d4 ret diff --git a/audio/engine_3.asm b/audio/engine_3.asm index 93fa62aa..c7254405 100644 --- a/audio/engine_3.asm +++ b/audio/engine_3.asm @@ -4,7 +4,7 @@ Audio3_UpdateMusic:: ; 7d177 (1f:5177) ld c, CH0 .loop ld b, $0 - ld hl, wc026 + ld hl, wChannelSoundIDs add hl, bc ld a, [hl] and a @@ -12,18 +12,18 @@ Audio3_UpdateMusic:: ; 7d177 (1f:5177) ld a, c cp CH4 jr nc, .applyAffects ; if sfx channel - ld a, [wc002] + ld a, [wMuteAudioAndPauseMusic] and a jr z, .applyAffects bit 7, a jr nz, .nextChannel set 7, a - ld [wc002], a + ld [wMuteAudioAndPauseMusic], a xor a - ld [$ff25], a - ld [$ff1a], a + ld [rNR51], a + ld [rNR30], a ld a, $80 - ld [$ff1a], a + ld [rNR30], a jr .nextChannel .applyAffects call Audio3_ApplyMusicAffects @@ -36,7 +36,7 @@ Audio3_UpdateMusic:: ; 7d177 (1f:5177) ; this routine checks flags for music effects currently applied ; to the channel and calls certain functions based on flags. -; known flags for wc02e: +; known flags for wChannelFlags1: ; 0: toggleperfectpitch has been used ; 1: call has been used ; 3: a toggle used only by this routine for vibrato @@ -44,7 +44,7 @@ Audio3_UpdateMusic:: ; 7d177 (1f:5177) ; 6: dutycycle flag Audio3_ApplyMusicAffects: ; 7d1ac (1f:51ac) ld b, $0 - ld hl, wc0b6 ; delay until next note + ld hl, wChannelNoteDelayCounters ; delay until next note add hl, bc ld a, [hl] cp $1 ; if delay is 1, play next note @@ -54,36 +54,36 @@ Audio3_ApplyMusicAffects: ; 7d1ac (1f:51ac) ld a, c cp CH4 jr nc, .startChecks ; if a sfx channel - ld hl, wc02a + ld hl, wChannelSoundIDs + CH4 add hl, bc ld a, [hl] and a jr z, .startChecks ret .startChecks - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc bit 6, [hl] ; dutycycle jr z, .checkForExecuteMusic call Audio3_ApplyDutyCycle .checkForExecuteMusic ld b, $0 - ld hl, wc036 + ld hl, wChannelFlags2 add hl, bc bit 0, [hl] jr nz, .checkForPitchBend - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc bit 2, [hl] jr nz, .disablePitchBendVibrato .checkForPitchBend - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc bit 4, [hl] ; pitchbend jr z, .checkVibratoDelay jp Audio3_ApplyPitchBend .checkVibratoDelay - ld hl, wc04e ; vibrato delay + ld hl, wChannelVibratoDelayCounters ; vibrato delay add hl, bc ld a, [hl] and a ; check if delay is over @@ -92,7 +92,7 @@ Audio3_ApplyMusicAffects: ; 7d1ac (1f:51ac) .disablePitchBendVibrato ret .checkForVibrato - ld hl, wc056 ; vibrato rate + ld hl, wChannelVibratoExtents ; vibrato rate add hl, bc ld a, [hl] and a @@ -100,7 +100,7 @@ Audio3_ApplyMusicAffects: ; 7d1ac (1f:51ac) ret ; no vibrato .vibrato ld d, a - ld hl, wc05e + ld hl, wChannelVibratoRates add hl, bc ld a, [hl] and $f @@ -113,10 +113,10 @@ Audio3_ApplyMusicAffects: ; 7d1ac (1f:51ac) swap [hl] or [hl] ld [hl], a ; reset the vibrato value and start again - ld hl, wc066 + ld hl, wChannelFrequencyLowBytes add hl, bc ld e, [hl] ; get note pitch - ld hl, wc02e + ld hl, wChannelFlags1 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 @@ -149,13 +149,13 @@ Audio3_ApplyMusicAffects: ; 7d1ac (1f:51ac) ; like tempo changes, duty changes etc. and doesn't return ; until the first note is reached Audio3_PlayNextNote: ; 7d244 (1f:5244) - ld hl, wc06e + ld hl, wChannelVibratoDelayCounterReloadValues add hl, bc ld a, [hl] - ld hl, wc04e + ld hl, wChannelVibratoDelayCounters add hl, bc ld [hl], a - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc res 4, [hl] res 5, [hl] @@ -168,7 +168,7 @@ Audio3_endchannel: ; 7d25a (1f:525a) cp $ff ; is this command an endchannel? jp nz, Audio3_callchannel ; no ld b, $0 ; yes - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc bit 1, [hl] jr nz, .returnFromCall @@ -178,22 +178,22 @@ Audio3_endchannel: ; 7d25a (1f:525a) jr .asm_7d2b3 .noiseOrSfxChannel res 2, [hl] - ld hl, wc036 + ld hl, wChannelFlags2 add hl, bc res 0, [hl] cp CH6 jr nz, .notSfxChannel3 ld a, $0 - ld [$ff1a], a + ld [rNR30], a ld a, $80 - ld [$ff1a], a + ld [rNR30], a .notSfxChannel3 jr nz, .asm_7d296 - ld a, [wc003] + ld a, [wDisableChannelOutputWhenSfxEnds] and a jr z, .asm_7d296 xor a - ld [wc003], a + ld [wDisableChannelOutputWhenSfxEnds], a jr .asm_7d2b3 .asm_7d296 jr .asm_7d2bc @@ -203,10 +203,10 @@ Audio3_endchannel: ; 7d25a (1f:525a) ld a, c add a ld e, a - ld hl, wc006 + ld hl, wChannelCommandPointers add hl, de push hl ; store current channel address - ld hl, wc016 + ld hl, wChannelReturnAddresses add hl, de ld e, l ld d, h @@ -220,16 +220,16 @@ Audio3_endchannel: ; 7d25a (1f:525a) .asm_7d2b3 ld hl, Unknown_7db93 add hl, bc - ld a, [$ff25] + ld a, [rNR51] and [hl] - ld [$ff25], a + ld [rNR51], a .asm_7d2bc - ld a, [wc02a] + ld a, [wChannelSoundIDs + CH4] cp $14 jr nc, .asm_7d2c5 jr .asm_7d2e2 .asm_7d2c5 - ld a, [wc02a] + ld a, [wChannelSoundIDs + CH4] cp $86 jr z, .asm_7d2e2 jr c, .asm_7d2d0 @@ -241,12 +241,12 @@ Audio3_endchannel: ; 7d25a (1f:525a) call Audio3_7d73b ret c .asm_7d2d9 - ld a, [wc005] - ld [$ff24], a + ld a, [wSavedVolume] + ld [rNR50], a xor a - ld [wc005], a + ld [wSavedVolume], a .asm_7d2e2 - ld hl, wc026 + ld hl, wChannelSoundIDs add hl, bc ld [hl], b ret @@ -265,10 +265,10 @@ Audio3_callchannel: ; 7d2e8 (1f:52e8) ld a, c add a ld e, a - ld hl, wc006 + ld hl, wChannelCommandPointers add hl, de push hl - ld hl, wc016 + ld hl, wChannelReturnAddresses add hl, de ld e, l ld d, h @@ -283,7 +283,7 @@ Audio3_callchannel: ; 7d2e8 (1f:52e8) inc hl ld [hl], d ; overwrite current address with pointer ld b, $0 - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc set 1, [hl] ; set the call flag jp Audio3_endchannel @@ -296,7 +296,7 @@ Audio3_loopchannel: ; 7d31d (1f:531d) and a jr z, .infiniteLoop ld b, $0 - ld hl, wc0be + ld hl, wChannelLoopCounters add hl, bc ld a, [hl] cp e @@ -319,7 +319,7 @@ Audio3_loopchannel: ; 7d31d (1f:531d) ld a, c add a ld e, a - ld hl, wc006 + ld hl, wChannelCommandPointers add hl, de pop af ld [hli], a @@ -333,7 +333,7 @@ Audio3_notetype: ; 7d358 (1f:5358) ld a, d ; yes and $f ld b, $0 - ld hl, wc0c6 + ld hl, wChannelNoteSpeeds add hl, bc ld [hl], a ; store low nibble as speed ld a, c @@ -346,10 +346,10 @@ Audio3_notetype: ; 7d358 (1f:5358) jr z, .musicChannel3 cp CH6 jr nz, .notChannel3 - ld hl, wc0e7 + ld hl, wSfxWaveInstrument jr .sfxChannel3 .musicChannel3 - ld hl, wc0e6 + ld hl, wMusicWaveInstrument .sfxChannel3 ld a, d and $f @@ -364,7 +364,7 @@ Audio3_notetype: ; 7d358 (1f:5358) ; else, store volume (high nibble) and fade (low nibble) .notChannel3 ld b, $0 - ld hl, wc0de + ld hl, wChannelVolumes add hl, bc ld [hl], d .noiseChannel @@ -375,11 +375,11 @@ Audio3_toggleperfectpitch: ; 7d397 (1f:5397) cp $e8 ; is this command a toggleperfectpitch? jr nz, Audio3_vibrato ; no ld b, $0 ; yes - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc ld a, [hl] xor $1 - ld [hl], a ; flip bit 0 of wc02e + ld [hl], a ; flip bit 0 of wChannelFlags1 jp Audio3_endchannel Audio3_vibrato: ; 7d3a9 (1f:53a9) @@ -387,10 +387,10 @@ Audio3_vibrato: ; 7d3a9 (1f:53a9) jr nz, Audio3_pitchbend ; no call Audio3_GetNextMusicByte ; yes ld b, $0 - ld hl, wc04e + ld hl, wChannelVibratoDelayCounters add hl, bc ld [hl], a ; store delay - ld hl, wc06e + ld hl, wChannelVibratoDelayCounterReloadValues add hl, bc ld [hl], a ; store delay call Audio3_GetNextMusicByte @@ -398,7 +398,7 @@ Audio3_vibrato: ; 7d3a9 (1f:53a9) and $f0 swap a ld b, $0 - ld hl, wc056 + ld hl, wChannelVibratoExtents add hl, bc srl a ld e, a @@ -409,7 +409,7 @@ Audio3_vibrato: ; 7d3a9 (1f:53a9) ld a, d and $f ld d, a - ld hl, wc05e + ld hl, wChannelVibratoRates add hl, bc swap a or d @@ -421,7 +421,7 @@ Audio3_pitchbend: ; 7d3e1 (1f:53e1) jr nz, Audio3_duty ; no call Audio3_GetNextMusicByte ; yes ld b, $0 - ld hl, wc076 + ld hl, wChannelPitchBendLengthModifiers add hl, bc ld [hl], a ; store first param call Audio3_GetNextMusicByte @@ -433,14 +433,14 @@ Audio3_pitchbend: ; 7d3e1 (1f:53e1) and $f call Audio3_7d8cc ld b, $0 - ld hl, wc0a6 + ld hl, wChannelPitchBendTargetFrequencyHighBytes add hl, bc ld [hl], d ; store unknown part of second param - ld hl, wc0ae + ld hl, wChannelPitchBendTargetFrequencyLowBytes add hl, bc ld [hl], e ; store unknown part of second param ld b, $0 - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc set 4, [hl] ; set pitchbend flag call Audio3_GetNextMusicByte @@ -455,7 +455,7 @@ Audio3_duty: ; 7d419 (1f:5419) rrca and $c0 ld b, $0 - ld hl, wc03e + ld hl, wChannelDuties add hl, bc ld [hl], a ; store duty jp Audio3_endchannel @@ -467,25 +467,25 @@ Audio3_tempo: ; 7d42e (1f:542e) cp CH4 jr nc, .sfxChannel call Audio3_GetNextMusicByte - ld [wc0e8], a ; store first param + ld [wMusicTempo], a ; store first param call Audio3_GetNextMusicByte - ld [wc0e9], a ; store second param + ld [wMusicTempo + 1], a ; store second param xor a - ld [wc0ce], a ; clear RAM - ld [wc0cf], a - ld [wc0d0], a - ld [wc0d1], a + ld [wChannelNoteDelayCountersFractionalPart], a ; clear RAM + ld [wChannelNoteDelayCountersFractionalPart + 1], a + ld [wChannelNoteDelayCountersFractionalPart + 2], a + ld [wChannelNoteDelayCountersFractionalPart + 3], a jr .musicChannelDone .sfxChannel call Audio3_GetNextMusicByte - ld [wc0ea], a ; store first param + ld [wSfxTempo], a ; store first param call Audio3_GetNextMusicByte - ld [wc0eb], a ; store second param + ld [wSfxTempo + 1], a ; store second param xor a - ld [wc0d2], a ; clear RAM - ld [wc0d3], a - ld [wc0d4], a - ld [wc0d5], a + ld [wChannelNoteDelayCountersFractionalPart + 4], a ; clear RAM + ld [wChannelNoteDelayCountersFractionalPart + 5], a + ld [wChannelNoteDelayCountersFractionalPart + 6], a + ld [wChannelNoteDelayCountersFractionalPart + 7], a .musicChannelDone jp Audio3_endchannel @@ -493,7 +493,7 @@ Audio3_stereopanning: ; 7d46e (1f:546e) cp $ee ; is this command a stereopanning? jr nz, Audio3_unknownmusic0xef ; no call Audio3_GetNextMusicByte ; yes - ld [wc004], a ; store panning + ld [wStereoPanning], a ; store panning jp Audio3_endchannel ; this appears to never be used @@ -502,15 +502,15 @@ Audio3_unknownmusic0xef: ; 7d47b (1f:547b) jr nz, Audio3_dutycycle ; no call Audio3_GetNextMusicByte ; yes push bc - call Audio3_7d8ea + call Audio3_PlaySound pop bc - ld a, [wc003] + ld a, [wDisableChannelOutputWhenSfxEnds] and a jr nz, .skip - ld a, [wc02d] - ld [wc003], a + ld a, [wChannelSoundIDs + CH7] + ld [wDisableChannelOutputWhenSfxEnds], a xor a - ld [wc02d], a + ld [wChannelSoundIDs + CH7], a .skip jp Audio3_endchannel @@ -519,14 +519,14 @@ Audio3_dutycycle: ; 7d49a (1f:549a) jr nz, Audio3_volume ; no call Audio3_GetNextMusicByte ; yes ld b, $0 - ld hl, wc046 + ld hl, wChannelDutyCycles add hl, bc ld [hl], a ; store full cycle and $c0 - ld hl, wc03e + ld hl, wChannelDuties add hl, bc ld [hl], a ; store first duty - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc set 6, [hl] ; set duty flag jp Audio3_endchannel @@ -535,14 +535,14 @@ Audio3_volume: ; 7d4b8 (1f:54b8) cp $f0 ; is this command a volume? jr nz, Audio3_executemusic ; no call Audio3_GetNextMusicByte ; yes - ld [$ff24], a ; store volume + ld [rNR50], a ; store volume jp Audio3_endchannel Audio3_executemusic: ; 7d4c4 (1f:54c4) cp $f8 ; is this command an executemusic? jr nz, Audio3_octave ; no ld b, $0 ; yes - ld hl, wc036 + ld hl, wChannelFlags2 add hl, bc set 0, [hl] jp Audio3_endchannel @@ -551,7 +551,7 @@ Audio3_octave: ; 7d4d3 (1f:54d3) and $f0 cp $e0 ; is this command an octave? jr nz, Audio3_unknownsfx0x20 ; no - ld hl, wc0d6 ; yes + ld hl, wChannelOctaves ; yes ld b, $0 add hl, bc ld a, d @@ -566,14 +566,14 @@ Audio3_unknownsfx0x20: ; 7d4e6 (1f:54e6) cp CH3 ; is this a noise or sfx channel? jr c, Audio3_unknownsfx0x10 ; no ld b, $0 - ld hl, wc036 + ld hl, wChannelFlags2 add hl, bc bit 0, [hl] jr nz, Audio3_unknownsfx0x10 ; no call Audio3_notelength ; yes ld d, a ld b, $0 - ld hl, wc03e + ld hl, wChannelDuties add hl, bc ld a, [hl] or d @@ -612,12 +612,12 @@ Audio3_unknownsfx0x10: ; 7d533 (1f:5533) cp $10 ; is this command an unknownsfx0x10? jr nz, Audio3_note ; no ld b, $0 - ld hl, wc036 + ld hl, wChannelFlags2 add hl, bc bit 0, [hl] jr nz, Audio3_note ; no call Audio3_GetNextMusicByte ; yes - ld [$ff10], a + ld [rNR10], a jp Audio3_endchannel Audio3_note: ; 7d54f (1f:554f) @@ -647,11 +647,11 @@ Audio3_dnote: ; 7d569 (1f:5569) call Audio3_GetNextMusicByte ; get dnote instrument asm_7d571 ld d, a - ld a, [wc003] + ld a, [wDisableChannelOutputWhenSfxEnds] and a jr nz, .asm_7d57c ld a, d - call Audio3_7d8ea + call Audio3_PlaySound .asm_7d57c pop bc pop de @@ -664,7 +664,7 @@ Audio3_notelength: ; 7d57e (1f:557e) ld b, $0 ld e, a ; store note length (in 16ths) ld d, b - ld hl, wc0c6 + ld hl, wChannelNoteSpeeds add hl, bc ld a, [hl] ld l, b @@ -672,9 +672,9 @@ Audio3_notelength: ; 7d57e (1f:557e) ld a, c cp CH4 jr nc, .sfxChannel - ld a, [wc0e8] + ld a, [wMusicTempo] ld d, a - ld a, [wc0e9] + ld a, [wMusicTempo + 1] ld e, a jr .skip .sfxChannel @@ -683,31 +683,31 @@ Audio3_notelength: ; 7d57e (1f:557e) cp CH7 jr z, .skip ; if noise channel call Audio3_7d707 - ld a, [wc0ea] + ld a, [wSfxTempo] ld d, a - ld a, [wc0eb] + ld a, [wSfxTempo + 1] ld e, a .skip ld a, l ld b, $0 - ld hl, wc0ce + ld hl, wChannelNoteDelayCountersFractionalPart add hl, bc ld l, [hl] call Audio3_7d8bb ld e, l ld d, h - ld hl, wc0ce + ld hl, wChannelNoteDelayCountersFractionalPart add hl, bc ld [hl], e ld a, d - ld hl, wc0b6 + ld hl, wChannelNoteDelayCounters add hl, bc ld [hl], a - ld hl, wc036 + ld hl, wChannelFlags2 add hl, bc bit 0, [hl] jr nz, Audio3_notepitch - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc bit 2, [hl] jr z, Audio3_notepitch @@ -722,7 +722,7 @@ Audio3_notepitch: ; 7d5dc (1f:55dc) ld a, c cp CH4 jr nc, .sfxChannel - ld hl, wc02a + ld hl, wChannelSoundIDs + CH4 add hl, bc ld a, [hl] and a @@ -738,9 +738,9 @@ Audio3_notepitch: ; 7d5dc (1f:55dc) ld b, $0 ld hl, Unknown_7db93 add hl, bc - ld a, [$ff25] + ld a, [rNR51] and [hl] - ld [$ff25], a + ld [rNR51], a jr .quit .notSfxChannel3 ld b, $2 @@ -755,12 +755,12 @@ Audio3_notepitch: ; 7d5dc (1f:55dc) .notRest swap a ld b, $0 - ld hl, wc0d6 + ld hl, wChannelOctaves add hl, bc ld b, [hl] call Audio3_7d8cc ld b, $0 - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc bit 4, [hl] jr z, .asm_7d62c @@ -770,7 +770,7 @@ Audio3_notepitch: ; 7d5dc (1f:55dc) ld a, c cp CH4 jr nc, .skip ; if sfx Channel - ld hl, wc02a + ld hl, wChannelSoundIDs + CH4 ld d, $0 ld e, a add hl, de @@ -783,7 +783,7 @@ Audio3_notepitch: ; 7d5dc (1f:55dc) ret .skip ld b, $0 - ld hl, wc0de + ld hl, wChannelVolumes add hl, bc ld d, [hl] ld b, $2 @@ -793,7 +793,7 @@ Audio3_notepitch: ; 7d5dc (1f:55dc) call Audio3_7d66c pop de ld b, $0 - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc bit 0, [hl] ; has toggleperfectpitch been used? jr z, .skip2 @@ -801,7 +801,7 @@ Audio3_notepitch: ; 7d5dc (1f:55dc) jr nc, .skip2 inc d .skip2 - ld hl, wc066 + ld hl, wChannelFrequencyLowBytes add hl, bc ld [hl], e call Audio3_7d6bf @@ -811,7 +811,7 @@ Audio3_7d66c: ; 7d66c (1f:566c) ld b, $0 ld hl, Unknown_7db9b add hl, bc - ld a, [$ff25] + ld a, [rNR51] or [hl] ld d, a ld a, c @@ -819,18 +819,18 @@ Audio3_7d66c: ; 7d66c (1f:566c) jr z, .sfxNoiseChannel cp CH4 jr nc, .skip ; if sfx channel - ld hl, wc02a + ld hl, wChannelSoundIDs + CH4 add hl, bc ld a, [hl] and a jr nz, .skip .sfxNoiseChannel - ld a, [wc004] + ld a, [wStereoPanning] ld hl, Unknown_7db9b add hl, bc and [hl] ld d, a - ld a, [$ff25] + ld a, [rNR51] ld hl, Unknown_7db93 add hl, bc and [hl] @@ -838,12 +838,12 @@ Audio3_7d66c: ; 7d66c (1f:566c) ld d, a .skip ld a, d - ld [$ff25], a + ld [rNR51], a ret Audio3_7d69d: ; 7d69d (1f:569d) ld b, $0 - ld hl, wc0b6 + ld hl, wChannelNoteDelayCounters add hl, bc ld d, [hl] ld a, c @@ -854,7 +854,7 @@ Audio3_7d69d: ; 7d69d (1f:569d) ld a, d and $3f ld d, a - ld hl, wc03e + ld hl, wChannelDuties add hl, bc ld a, [hl] or d @@ -874,10 +874,10 @@ Audio3_7d6bf: ; 7d6bf (1f:56bf) ; fall through .channel3 push de - ld de, wc0e6 + ld de, wMusicWaveInstrument cp CH2 jr z, .musicChannel3 - ld de, wc0e7 + ld de, wSfxWaveInstrument .musicChannel3 ld a, [de] add a @@ -891,7 +891,7 @@ Audio3_7d6bf: ; 7d6bf (1f:56bf) ld hl, $ff30 ld b, $f ld a, $0 - ld [$ff1a], a + ld [rNR30], a .loop ld a, [de] inc de @@ -901,7 +901,7 @@ Audio3_7d6bf: ; 7d6bf (1f:56bf) and a jr nz, .loop ld a, $80 - ld [$ff1a], a + ld [rNR30], a pop de .notSfxChannel3 ld a, d @@ -920,27 +920,27 @@ Audio3_7d707: ; 7d707 (1f:5707) call Audio3_7d759 jr nc, .asm_7d71f ld d, $0 - ld a, [wc0f2] + ld a, [wTempoModifier] add $80 jr nc, .asm_7d716 inc d .asm_7d716 - ld [wc0eb], a + ld [wSfxTempo + 1], a ld a, d - ld [wc0ea], a + ld [wSfxTempo], a jr .asm_7d728 .asm_7d71f xor a - ld [wc0eb], a + ld [wSfxTempo + 1], a ld a, $1 - ld [wc0ea], a + ld [wSfxTempo], a .asm_7d728 ret Audio3_7d729: ; 7d729 (1f:5729) call Audio3_7d759 jr nc, .asm_7d73a - ld a, [wc0f1] + ld a, [wFrequencyModifier] add e jr nc, .asm_7d735 inc d @@ -956,7 +956,7 @@ Audio3_7d729: ; 7d729 (1f:5729) Audio3_7d73b: ; 7d73b (1f:573b) call Audio3_7d759 jr nc, .asm_7d756 - ld hl, wc006 + ld hl, wChannelCommandPointers ld e, c ld d, $0 sla e @@ -977,7 +977,7 @@ Audio3_7d73b: ; 7d73b (1f:573b) ret Audio3_7d759: ; 7d759 (1f:5759) - ld a, [wc02a] + ld a, [wChannelSoundIDs + CH4] cp $14 jr nc, .asm_7d762 jr .asm_7d768 @@ -994,27 +994,27 @@ Audio3_7d759: ; 7d759 (1f:5759) ret Audio3_ApplyPitchBend: ; 7d76d (1f:576d) - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc bit 5, [hl] jp nz, .asm_7d7b4 - ld hl, wc09e + ld hl, wChannelPitchBendCurrentFrequencyLowBytes add hl, bc ld e, [hl] - ld hl, wc096 + ld hl, wChannelPitchBendCurrentFrequencyHighBytes add hl, bc ld d, [hl] - ld hl, wc07e + ld hl, wChannelPitchBendFrequencySteps add hl, bc ld l, [hl] ld h, b add hl, de ld d, h ld e, l - ld hl, wc08e + ld hl, wChannelPitchBendCurrentFrequencyFractionalPart add hl, bc push hl - ld hl, wc086 + ld hl, wChannelPitchBendFrequencyStepsFractionalPart add hl, bc ld a, [hl] pop hl @@ -1026,26 +1026,26 @@ Audio3_ApplyPitchBend: ; 7d76d (1f:576d) ld a, $0 adc d ld d, a - ld hl, wc0a6 + ld hl, wChannelPitchBendTargetFrequencyHighBytes add hl, bc ld a, [hl] cp d jp c, .asm_7d7fa jr nz, .asm_7d7e7 - ld hl, wc0ae + ld hl, wChannelPitchBendTargetFrequencyLowBytes add hl, bc ld a, [hl] cp e jp c, .asm_7d7fa jr .asm_7d7e7 .asm_7d7b4 - ld hl, wc09e + ld hl, wChannelPitchBendCurrentFrequencyLowBytes add hl, bc ld a, [hl] - ld hl, wc096 + ld hl, wChannelPitchBendCurrentFrequencyHighBytes add hl, bc ld d, [hl] - ld hl, wc07e + ld hl, wChannelPitchBendFrequencySteps add hl, bc ld e, [hl] sub e @@ -1053,7 +1053,7 @@ Audio3_ApplyPitchBend: ; 7d76d (1f:576d) ld a, d sbc b ld d, a - ld hl, wc086 + ld hl, wChannelPitchBendFrequencyStepsFractionalPart add hl, bc ld a, [hl] add a @@ -1064,22 +1064,22 @@ Audio3_ApplyPitchBend: ; 7d76d (1f:576d) ld a, d sbc b ld d, a - ld hl, wc0a6 + ld hl, wChannelPitchBendTargetFrequencyHighBytes add hl, bc ld a, d cp [hl] jr c, .asm_7d7fa jr nz, .asm_7d7e7 - ld hl, wc0ae + ld hl, wChannelPitchBendTargetFrequencyLowBytes add hl, bc ld a, e cp [hl] jr c, .asm_7d7fa .asm_7d7e7 - ld hl, wc09e + ld hl, wChannelPitchBendCurrentFrequencyLowBytes add hl, bc ld [hl], e - ld hl, wc096 + ld hl, wChannelPitchBendCurrentFrequencyHighBytes add hl, bc ld [hl], d ld b, $3 @@ -1089,54 +1089,54 @@ Audio3_ApplyPitchBend: ; 7d76d (1f:576d) ld [hl], d ret .asm_7d7fa - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc res 4, [hl] res 5, [hl] ret Audio3_7d803: ; 7d803 (1f:5803) - ld hl, wc096 + ld hl, wChannelPitchBendCurrentFrequencyHighBytes add hl, bc ld [hl], d - ld hl, wc09e + ld hl, wChannelPitchBendCurrentFrequencyLowBytes add hl, bc ld [hl], e - ld hl, wc0b6 + ld hl, wChannelNoteDelayCounters add hl, bc ld a, [hl] - ld hl, wc076 + ld hl, wChannelPitchBendLengthModifiers add hl, bc sub [hl] jr nc, .asm_7d81b ld a, $1 .asm_7d81b ld [hl], a - ld hl, wc0ae + ld hl, wChannelPitchBendTargetFrequencyLowBytes add hl, bc ld a, e sub [hl] ld e, a ld a, d sbc b - ld hl, wc0a6 + ld hl, wChannelPitchBendTargetFrequencyHighBytes add hl, bc sub [hl] jr c, .asm_7d837 ld d, a ld b, $0 - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc set 5, [hl] jr .asm_7d85a .asm_7d837 - ld hl, wc096 + ld hl, wChannelPitchBendCurrentFrequencyHighBytes add hl, bc ld d, [hl] - ld hl, wc09e + ld hl, wChannelPitchBendCurrentFrequencyLowBytes add hl, bc ld e, [hl] - ld hl, wc0ae + ld hl, wChannelPitchBendTargetFrequencyLowBytes add hl, bc ld a, [hl] sub e @@ -1144,17 +1144,17 @@ Audio3_7d803: ; 7d803 (1f:5803) ld a, d sbc b ld d, a - ld hl, wc0a6 + ld hl, wChannelPitchBendTargetFrequencyHighBytes add hl, bc ld a, [hl] sub d ld d, a ld b, $0 - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc res 5, [hl] .asm_7d85a - ld hl, wc076 + ld hl, wChannelPitchBendLengthModifiers add hl, bc .asm_7d85e inc b @@ -1173,20 +1173,20 @@ Audio3_7d803: ; 7d803 (1f:5803) add [hl] ld d, b ld b, $0 - ld hl, wc07e + ld hl, wChannelPitchBendFrequencySteps add hl, bc ld [hl], d - ld hl, wc086 + ld hl, wChannelPitchBendFrequencyStepsFractionalPart add hl, bc ld [hl], a - ld hl, wc08e + ld hl, wChannelPitchBendCurrentFrequencyFractionalPart add hl, bc ld [hl], a ret Audio3_ApplyDutyCycle: ; 7d881 (1f:5881) ld b, $0 - ld hl, wc046 + ld hl, wChannelDutyCycles add hl, bc ld a, [hl] rlca @@ -1207,7 +1207,7 @@ Audio3_GetNextMusicByte: ; 7d899 (1f:5899) ld a, c add a ld e, a - ld hl, wc006 + ld hl, wChannelCommandPointers add hl, de ld a, [hli] ld e, a @@ -1274,8 +1274,8 @@ Audio3_7d8cc: ; 7d8cc (1f:58cc) ld d, a ret -Audio3_7d8ea:: ; 7d8ea (1f:58ea) - ld [wc001], a +Audio3_PlaySound:: ; 7d8ea (1f:58ea) + ld [wSoundID], a cp $ff jp z, Audio3_7daa8 cp $c2 @@ -1286,75 +1286,75 @@ Audio3_7d8ea:: ; 7d8ea (1f:58ea) jp nc, Audio3_7d9c2 .asm_7d901 xor a - ld [wc000], a - ld [wc003], a - ld [wc0e9], a - ld [wc0e6], a - ld [wc0e7], a + ld [wUnusedC000], a + ld [wDisableChannelOutputWhenSfxEnds], a + ld [wMusicTempo + 1], a + ld [wMusicWaveInstrument], a + ld [wSfxWaveInstrument], a ld d, $8 - ld hl, wc016 + ld hl, wChannelReturnAddresses call FillAudioRAM3 - ld hl, wc006 + ld hl, wChannelCommandPointers call FillAudioRAM3 ld d, $4 - ld hl, wc026 + ld hl, wChannelSoundIDs call FillAudioRAM3 - ld hl, wc02e + ld hl, wChannelFlags1 call FillAudioRAM3 - ld hl, wc03e + ld hl, wChannelDuties call FillAudioRAM3 - ld hl, wc046 + ld hl, wChannelDutyCycles call FillAudioRAM3 - ld hl, wc04e + ld hl, wChannelVibratoDelayCounters call FillAudioRAM3 - ld hl, wc056 + ld hl, wChannelVibratoExtents call FillAudioRAM3 - ld hl, wc05e + ld hl, wChannelVibratoRates call FillAudioRAM3 - ld hl, wc066 + ld hl, wChannelFrequencyLowBytes call FillAudioRAM3 - ld hl, wc06e + ld hl, wChannelVibratoDelayCounterReloadValues call FillAudioRAM3 - ld hl, wc036 + ld hl, wChannelFlags2 call FillAudioRAM3 - ld hl, wc076 + ld hl, wChannelPitchBendLengthModifiers call FillAudioRAM3 - ld hl, wc07e + ld hl, wChannelPitchBendFrequencySteps call FillAudioRAM3 - ld hl, wc086 + ld hl, wChannelPitchBendFrequencyStepsFractionalPart call FillAudioRAM3 - ld hl, wc08e + ld hl, wChannelPitchBendCurrentFrequencyFractionalPart call FillAudioRAM3 - ld hl, wc096 + ld hl, wChannelPitchBendCurrentFrequencyHighBytes call FillAudioRAM3 - ld hl, wc09e + ld hl, wChannelPitchBendCurrentFrequencyLowBytes call FillAudioRAM3 - ld hl, wc0a6 + ld hl, wChannelPitchBendTargetFrequencyHighBytes call FillAudioRAM3 - ld hl, wc0ae + ld hl, wChannelPitchBendTargetFrequencyLowBytes call FillAudioRAM3 ld a, $1 - ld hl, wc0be + ld hl, wChannelLoopCounters call FillAudioRAM3 - ld hl, wc0b6 + ld hl, wChannelNoteDelayCounters call FillAudioRAM3 - ld hl, wc0c6 + ld hl, wChannelNoteSpeeds call FillAudioRAM3 - ld [wc0e8], a + ld [wMusicTempo], a ld a, $ff - ld [wc004], a + ld [wStereoPanning], a xor a - ld [$ff24], a + ld [rNR50], a ld a, $8 - ld [$ff10], a + ld [rNR10], a ld a, $0 - ld [$ff25], a + ld [rNR51], a xor a - ld [$ff1a], a + ld [rNR30], a ld a, $80 - ld [$ff1a], a + ld [rNR30], a ld a, $77 - ld [$ff24], a + ld [rNR50], a jp Audio3_7db03 Audio3_7d9c2: ; 7d9c2 (1f:59c2) @@ -1367,9 +1367,9 @@ Audio3_7d9c2: ; 7d9c2 (1f:59c2) ld de, SFX_Headers_3 add hl, de ld a, h - ld [wc0ec], a + ld [wSfxHeaderPointer], a ld a, l - ld [wc0ed], a + ld [wSfxHeaderPointer + 1], a ld a, [hl] and $c0 rlca @@ -1382,9 +1382,9 @@ Audio3_7d9c2: ; 7d9c2 (1f:59c2) add c ld c, a ld b, $0 - ld a, [wc0ec] + ld a, [wSfxHeaderPointer] ld h, a - ld a, [wc0ed] + ld a, [wSfxHeaderPointer + 1] ld l, a add hl, bc ld c, d @@ -1392,7 +1392,7 @@ Audio3_7d9c2: ; 7d9c2 (1f:59c2) and $f ld e, a ld d, $0 - ld hl, wc026 + ld hl, wChannelSoundIDs add hl, de ld a, [hl] and a @@ -1400,7 +1400,7 @@ Audio3_7d9c2: ; 7d9c2 (1f:59c2) ld a, e cp $7 jr nz, .asm_7da0e - ld a, [wc001] + ld a, [wSoundID] cp $14 jr nc, .asm_7da07 ret @@ -1410,7 +1410,7 @@ Audio3_7d9c2: ; 7d9c2 (1f:59c2) jr z, .asm_7da17 jr c, .asm_7da17 .asm_7da0e - ld a, [wc001] + ld a, [wSoundID] cp [hl] jr z, .asm_7da17 jr c, .asm_7da17 @@ -1423,84 +1423,84 @@ Audio3_7d9c2: ; 7d9c2 (1f:59c2) add hl, hl ld d, h ld e, l - ld hl, wc016 + ld hl, wChannelReturnAddresses add hl, de ld [hli], a ld [hl], a - ld hl, wc006 + ld hl, wChannelCommandPointers add hl, de ld [hli], a ld [hl], a pop de - ld hl, wc026 + ld hl, wChannelSoundIDs add hl, de ld [hl], a - ld hl, wc02e + ld hl, wChannelFlags1 add hl, de ld [hl], a - ld hl, wc03e + ld hl, wChannelDuties add hl, de ld [hl], a - ld hl, wc046 + ld hl, wChannelDutyCycles add hl, de ld [hl], a - ld hl, wc04e + ld hl, wChannelVibratoDelayCounters add hl, de ld [hl], a - ld hl, wc056 + ld hl, wChannelVibratoExtents add hl, de ld [hl], a - ld hl, wc05e + ld hl, wChannelVibratoRates add hl, de ld [hl], a - ld hl, wc066 + ld hl, wChannelFrequencyLowBytes add hl, de ld [hl], a - ld hl, wc06e + ld hl, wChannelVibratoDelayCounterReloadValues add hl, de ld [hl], a - ld hl, wc076 + ld hl, wChannelPitchBendLengthModifiers add hl, de ld [hl], a - ld hl, wc07e + ld hl, wChannelPitchBendFrequencySteps add hl, de ld [hl], a - ld hl, wc086 + ld hl, wChannelPitchBendFrequencyStepsFractionalPart add hl, de ld [hl], a - ld hl, wc08e + ld hl, wChannelPitchBendCurrentFrequencyFractionalPart add hl, de ld [hl], a - ld hl, wc096 + ld hl, wChannelPitchBendCurrentFrequencyHighBytes add hl, de ld [hl], a - ld hl, wc09e + ld hl, wChannelPitchBendCurrentFrequencyLowBytes add hl, de ld [hl], a - ld hl, wc0a6 + ld hl, wChannelPitchBendTargetFrequencyHighBytes add hl, de ld [hl], a - ld hl, wc0ae + ld hl, wChannelPitchBendTargetFrequencyLowBytes add hl, de ld [hl], a - ld hl, wc036 + ld hl, wChannelFlags2 add hl, de ld [hl], a ld a, $1 - ld hl, wc0be + ld hl, wChannelLoopCounters add hl, de ld [hl], a - ld hl, wc0b6 + ld hl, wChannelNoteDelayCounters add hl, de ld [hl], a - ld hl, wc0c6 + ld hl, wChannelNoteSpeeds add hl, de ld [hl], a ld a, e cp $4 jr nz, .asm_7da9f ld a, $8 - ld [$ff10], a + ld [rNR10], a .asm_7da9f ld a, c and a @@ -1510,41 +1510,41 @@ Audio3_7d9c2: ; 7d9c2 (1f:59c2) Audio3_7daa8: ; 7daa8 (1f:5aa8) ld a, $80 - ld [$ff26], a - ld [$ff1a], a + ld [rNR52], a + ld [rNR30], a xor a - ld [$ff25], a - ld [$ff1c], a + ld [rNR51], a + ld [rNR32], a ld a, $8 - ld [$ff10], a - ld [$ff12], a - ld [$ff17], a - ld [$ff21], a + ld [rNR10], a + ld [rNR12], a + ld [rNR22], a + ld [rNR42], a ld a, $40 - ld [$ff14], a - ld [$ff19], a - ld [$ff23], a + ld [rNR14], a + ld [rNR24], a + ld [rNR44], a ld a, $77 - ld [$ff24], a + ld [rNR50], a xor a - ld [wc000], a - ld [wc003], a - ld [wc002], a - ld [wc0e9], a - ld [wc0eb], a - ld [wc0e6], a - ld [wc0e7], 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, wc006 + ld hl, wChannelCommandPointers call FillAudioRAM3 ld a, $1 ld d, $18 - ld hl, wc0b6 + ld hl, wChannelNoteDelayCounters call FillAudioRAM3 - ld [wc0e8], a - ld [wc0ea], a + ld [wMusicTempo], a + ld [wSfxTempo], a ld a, $ff - ld [wc004], a + ld [wStereoPanning], a ret ; fills d bytes at hl with a @@ -1557,7 +1557,7 @@ FillAudioRAM3: ; 7dafd (1f:5afd) ret Audio3_7db03: ; 7db03 (1f:5b03) - ld a, [wc001] + ld a, [wSoundID] ld l, a ld e, a ld h, $0 @@ -1568,7 +1568,7 @@ Audio3_7db03: ; 7db03 (1f:5b03) add hl, de ld e, l ld d, h - ld hl, wc006 + ld hl, wChannelCommandPointers ld a, [de] ; get channel number ld b, a rlca @@ -1594,14 +1594,14 @@ Audio3_7db03: ; 7db03 (1f:5b03) push af ld b, $0 ld c, a - ld hl, wc026 + ld hl, wChannelSoundIDs add hl, bc - ld a, [wc001] + ld a, [wSoundID] ld [hl], a pop af cp $3 jr c, .asm_7db46 - ld hl, wc02e + ld hl, wChannelFlags1 add hl, bc set 2, [hl] .asm_7db46 @@ -1620,34 +1620,34 @@ Audio3_7db03: ; 7db03 (1f:5b03) ld a, [de] inc de jr nz, .asm_7db25 - ld a, [wc001] + ld a, [wSoundID] cp $14 jr nc, .asm_7db5f jr .asm_7db89 .asm_7db5f - ld a, [wc001] + ld a, [wSoundID] cp $86 jr z, .asm_7db89 jr c, .asm_7db6a jr .asm_7db89 .asm_7db6a - ld hl, wc02a + ld hl, wChannelSoundIDs + CH4 ld [hli], a ld [hli], a ld [hli], a ld [hl], a - ld hl, wc012 ; sfx noise channel pointer + ld hl, wChannelCommandPointers + CH6 * 2 ; sfx noise channel pointer ld de, Noise3_endchannel ld [hl], e inc hl ld [hl], d ; overwrite pointer to point to endchannel - ld a, [wc005] + ld a, [wSavedVolume] and a jr nz, .asm_7db89 - ld a, [$ff24] - ld [wc005], a + ld a, [rNR50] + ld [wSavedVolume], a ld a, $77 - ld [$ff24], a + ld [rNR50], a .asm_7db89 ret diff --git a/constants/hardware_constants.asm b/constants/hardware_constants.asm index f9e3fe19..21a3ad93 100644 --- a/constants/hardware_constants.asm +++ b/constants/hardware_constants.asm @@ -107,4 +107,3 @@ rUNKNOWN5 EQU $ff75 ; (8Fh) - Bit 4-6 (Read/Write) rUNKNOWN6 EQU $ff76 ; (00h) - Always 00h (Read Only) rUNKNOWN7 EQU $ff77 ; (00h) - Always 00h (Read Only) rIE EQU $ffff ; Interrupt Enable (R/W) - diff --git a/constants/music_constants.asm b/constants/music_constants.asm index f239acea..57ad230d 100644 --- a/constants/music_constants.asm +++ b/constants/music_constants.asm @@ -1,3 +1,42 @@ +; HW sound channel register base addresses +HW_CH1_BASE EQU (rNR10 % $100) +HW_CH2_BASE EQU ((rNR21 % $100) - 1) +HW_CH3_BASE EQU (rNR30 % $100) +HW_CH4_BASE EQU ((rNR41 % $100) - 1) + +; HW sound channel enable bit masks +HW_CH1_ENABLE_MASK EQU %00010001 +HW_CH2_ENABLE_MASK EQU %00100010 +HW_CH3_ENABLE_MASK EQU %01000100 +HW_CH4_ENABLE_MASK EQU %10001000 + +; HW sound channel disable bit masks +HW_CH1_DISABLE_MASK EQU (~HW_CH1_ENABLE_MASK & $ff) +HW_CH2_DISABLE_MASK EQU (~HW_CH2_ENABLE_MASK & $ff) +HW_CH3_DISABLE_MASK EQU (~HW_CH3_ENABLE_MASK & $ff) +HW_CH4_DISABLE_MASK EQU (~HW_CH4_ENABLE_MASK & $ff) + +REG_DUTY_SOUND_LEN EQU 1 +REG_VOLUME_ENVELOPE EQU 2 +REG_FREQUENCY_LO EQU 3 + +MAX_SFX_ID EQU $B9 + +CRY_SFX_START EQU $14 +CRY_SFX_END EQU $86 + +; wChannelFlags1 constants +BIT_PERFECT_PITCH EQU 0 ; controlled by toggleperfectpitch command +BIT_CHANNEL_CALL EQU 1 ; if in channel call +BIT_NOISE_OR_SFX EQU 2 ; if channel is the music noise channel or an SFX channel +BIT_VIBRATO_DIRECTION EQU 3 ; if the pitch is above or below normal (cycles) +BIT_PITCH_BEND_ON EQU 4 ; if pitch bend is active +BIT_PITCH_BEND_DECREASING EQU 5 ; if the pitch bend frequency is decreasing (instead of increasing) +BIT_ROTATE_DUTY EQU 6 ; if rotating duty + +; wChannelFlags2 constant (only has one flag) +BIT_EXECUTE_MUSIC EQU 0 ; if in execute music + ; Song ids are calculated by address to save space. music_const: MACRO diff --git a/engine/battle/animations.asm b/engine/battle/animations.asm index b46842ec..1bd48988 100755 --- a/engine/battle/animations.asm +++ b/engine/battle/animations.asm @@ -772,7 +772,7 @@ DoBallTossSpecialEffects: ; 78f3e (1e:4f3e) dec b jr nz,.loop ld a,%00001000 - ld [$ff10],a ; Channel 1 sweep register + ld [rNR10],a ; Channel 1 sweep register ret .isTrainerBattle ; if it's a trainer battle, shorten the animation by one frame ld a,[W_SUBANIMCOUNTER] @@ -2335,19 +2335,19 @@ GetMoveSound: ; 7986f (1e:586f) call GetCryData ld b,a pop hl - ld a,[wc0f1] + ld a,[wFrequencyModifier] add [hl] - ld [wc0f1],a + ld [wFrequencyModifier],a inc hl - ld a,[wc0f2] + ld a,[wTempoModifier] add [hl] - ld [wc0f2],a + ld [wTempoModifier],a jr .done .NotCryMove ld a,[hli] - ld [wc0f1],a + ld [wFrequencyModifier],a ld a,[hli] - ld [wc0f2],a + ld [wTempoModifier],a .done ld a,b ret @@ -3029,8 +3029,8 @@ PlayApplyingAttackSound: ; 79e6a (1e:5e6a) ld b, $1 ld c, SFX_NOT_VERY_EFFECTIVE .playSound - ld [wc0f1], a + ld [wFrequencyModifier], a ld a, b - ld [wc0f2], a + ld [wTempoModifier], a ld a, c jp PlaySound diff --git a/engine/battle/common_text.asm b/engine/battle/common_text.asm index a00e9d59..a1afcb75 100644 --- a/engine/battle/common_text.asm +++ b/engine/battle/common_text.asm @@ -61,9 +61,9 @@ PrintBeginningBattleText: ; 58d99 (16:4d99) .playSFX xor a - ld [wc0f1], a + ld [wFrequencyModifier], a ld a, $80 - ld [wc0f2], a + ld [wTempoModifier], a ld a, SFX_SILPH_SCOPE call PlaySound jp WaitForSoundToFinish diff --git a/engine/battle/core.asm b/engine/battle/core.asm index 004859da..22a47908 100755 --- a/engine/battle/core.asm +++ b/engine/battle/core.asm @@ -867,12 +867,12 @@ FaintEnemyPokemon: ; 0x3c567 dec a jr z, .wild_win xor a - ld [wc0f1], a - ld [wc0f2], a + ld [wFrequencyModifier], a + ld [wTempoModifier], a ld a, SFX_FAINT_FALL call PlaySoundWaitForCurrent .sfxwait - ld a, [wc02a] + ld a, [wChannelSoundIDs + CH4] cp SFX_FAINT_FALL jr z, .sfxwait ld a, SFX_FAINT_THUD @@ -952,7 +952,7 @@ EnemyMonFaintedText: ; 0x3c63e EndLowHealthAlarm: ; 3c643 (f:4643) xor a ld [wLowHealthAlarm], a ;disable low health alarm - ld [wc02a], a + ld [wChannelSoundIDs + CH4], a inc a ld [wccf6], a ret @@ -1045,7 +1045,7 @@ TrainerDefeatedText: ; 3c6e9 (f:46e9) PlayBattleVictoryMusic: ; 3c6ee (f:46ee) push af ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySoundWaitForCurrent ld c, BANK(Music_DefeatedTrainer) pop af @@ -1944,7 +1944,7 @@ DrawPlayerHUDAndHPBar: ; 3cd60 (f:4d60) ld [hl], $0 ret z xor a - ld [wc02a], a + ld [wChannelSoundIDs + CH4], a ret .asm_3cde6 ld hl, wLowHealthAlarm @@ -6993,8 +6993,8 @@ _LoadTrainerPic: ; 3f04b (f:704b) ; unreferenced ResetCryModifiers: ; 3f069 (f:7069) xor a - ld [wc0f1], a - ld [wc0f2], a + ld [wFrequencyModifier], a + ld [wTempoModifier], a jp PlaySound ; animates the mon "growing" out of the pokeball diff --git a/engine/battle/end_of_battle.asm b/engine/battle/end_of_battle.asm index c642d206..f1de313c 100755 --- a/engine/battle/end_of_battle.asm +++ b/engine/battle/end_of_battle.asm @@ -46,7 +46,7 @@ EndOfBattle: ; 137aa (4:77aa) .resetVariables xor a ld [wLowHealthAlarm], a ;disable low health alarm - ld [wc02a], a + ld [wChannelSoundIDs + CH4], a ld [W_ISINBATTLE], a ld [W_BATTLETYPE], a ld [W_MOVEMISSED], a diff --git a/engine/cable_club.asm b/engine/cable_club.asm index 078ae5c2..dec18fe3 100755 --- a/engine/cable_club.asm +++ b/engine/cable_club.asm @@ -824,12 +824,12 @@ TradeCenter_Trade: add hl, bc ld a, [hl] ld [wTradedEnemyMonSpecies], a - ld a, $a - ld [wMusicHeaderPointer], a + ld a, 10 + ld [wAudioFadeOutControl], a ld a, $2 - ld [wc0f0], a + ld [wAudioSavedROMBank], a ld a, MUSIC_SAFARI_ZONE - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound ld c, 100 call DelayFrames @@ -915,12 +915,12 @@ CableClub_Run: ; 5a5f (1:5a5f) inc a ; LINK_STATE_IN_CABLE_CLUB ld [wLinkState], a ld [$ffb5], a - ld a, $a - ld [wMusicHeaderPointer], a + ld a, 10 + ld [wAudioFadeOutControl], a ld a, BANK(Music_Celadon) - ld [wc0f0], a + ld [wAudioSavedROMBank], a ld a, MUSIC_CELADON - ld [wc0ee], a + ld [wNewSoundID], a jp PlaySound EmptyFunc3: ; 5aaf (1:5aaf) diff --git a/engine/evolution.asm b/engine/evolution.asm index 720e77cd..8fbf568a 100755 --- a/engine/evolution.asm +++ b/engine/evolution.asm @@ -8,9 +8,9 @@ EvolveMon: ; 7bde9 (1e:7de9) push af xor a ld [wLowHealthAlarm], a - ld [wc02a], a + ld [wChannelSoundIDs + CH4], a dec a - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound ld a, $1 ld [H_AUTOBGTRANSFERENABLED], a @@ -68,7 +68,7 @@ EvolveMon: ; 7bde9 (1e:7de9) .done ld [wcf1d], a ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound ld a, [wcf1d] call PlayCry diff --git a/engine/hall_of_fame.asm b/engine/hall_of_fame.asm index ce1430e3..293c756f 100755 --- a/engine/hall_of_fame.asm +++ b/engine/hall_of_fame.asm @@ -280,9 +280,9 @@ HoFRecordMonInfo: ; 70404 (1c:4404) jp CopyData HoFFadeOutScreenAndMusic: ; 70423 (1c:4423) - ld a, $a - ld [wcfc8], a - ld [wcfc9], a + ld a, 10 + ld [wAudioFadeOutCounterReloadValue], a + ld [wAudioFadeOutCounter], a ld a, $ff - ld [wMusicHeaderPointer], a + ld [wAudioFadeOutControl], a jp GBFadeOutToWhite diff --git a/engine/hidden_object_functions7.asm b/engine/hidden_object_functions7.asm index 0753531e..67e75301 100755 --- a/engine/hidden_object_functions7.asm +++ b/engine/hidden_object_functions7.asm @@ -63,14 +63,14 @@ SafariZoneGameStillGoing: ; 1e9ab (7:69ab) SafariZoneGameOver: ; 1e9b0 (7:69b0) call EnableAutoTextBoxDrawing xor a - ld [wMusicHeaderPointer], a + ld [wAudioFadeOutControl], a dec a call PlaySound ld c, BANK(SFX_Safari_Zone_PA) ld a, SFX_SAFARI_ZONE_PA call PlayMusic .asm_1e9c2 - ld a, [wc02a] + ld a, [wChannelSoundIDs + CH4] cp $b9 jr nz, .asm_1e9c2 ld a, TEXT_SAFARI_GAME_OVER @@ -374,7 +374,7 @@ BillsHouseInitiatedText: ; 1ebe2 (7:6be2) db $06 TX_ASM ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound ld c, 16 call DelayFrames diff --git a/engine/intro.asm b/engine/intro.asm index 154c41fd..572d51fa 100755 --- a/engine/intro.asm +++ b/engine/intro.asm @@ -325,10 +325,10 @@ PlayShootingStar: ; 4188a (10:588a) call DelayFrames .next ld a, BANK(Music_IntroBattle) - ld [wc0ef], a - ld [wc0f0], a + ld [wAudioROMBank], a + ld [wAudioSavedROMBank], a ld a, MUSIC_INTRO_BATTLE - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound call IntroClearMiddleOfScreen call ClearSprites diff --git a/engine/items/items.asm b/engine/items/items.asm index a45b9185..84490521 100755 --- a/engine/items/items.asm +++ b/engine/items/items.asm @@ -856,7 +856,7 @@ ItemUseMedicine: ; dabb (3:5abb) .notFullHP ; if the pokemon's current HP doesn't equal its max HP xor a ld [wLowHealthAlarm],a ;disable low health alarm - ld [wc02a],a + ld [wChannelSoundIDs + CH4],a push hl push de ld bc,32 @@ -1643,7 +1643,7 @@ ItemUsePokeflute: ; e140 (3:6140) call WaitForSoundToFinish ; wait for sound to end callba Music_PokeFluteInBattle ; play in-battle pokeflute music .musicWaitLoop ; wait for music to finish playing - ld a,[wc02c] + ld a,[wChannelSoundIDs + CH6] and a ; music off? jr nz,.musicWaitLoop .skipMusic @@ -1716,8 +1716,8 @@ PlayedFluteHadEffectText: ; e215 (3:6215) ld c, BANK(SFX_Pokeflute) call PlayMusic .musicWaitLoop ; wait for music to finish playing - ld a,[wc028] - cp a,$b8 + ld a,[wChannelSoundIDs + CH2] + cp a, SFX_POKEFLUE jr z,.musicWaitLoop call PlayDefaultMusic ; start playing normal music again .done diff --git a/engine/menu/pokedex.asm b/engine/menu/pokedex.asm index b5ebd83e..fd8a928d 100755 --- a/engine/menu/pokedex.asm +++ b/engine/menu/pokedex.asm @@ -397,7 +397,7 @@ ShowPokedexDataInternal: ; 402e2 (10:42e2) ld hl,wd72c set 1,[hl] ld a,$33 ; 3/7 volume - ld [$ff24],a + ld [rNR50],a call GBPalWhiteOut ; zero all palettes call ClearScreen ld a,[wd11e] ; pokemon ID @@ -566,7 +566,7 @@ ShowPokedexDataInternal: ; 402e2 (10:42e2) ld hl,wd72c res 1,[hl] ld a,$77 ; max volume - ld [$ff24],a + ld [rNR50],a ret HeightWeightText: ; 40448 (10:4448) diff --git a/engine/menu/status_screen.asm b/engine/menu/status_screen.asm index c13d7c85..bc58ba21 100755 --- a/engine/menu/status_screen.asm +++ b/engine/menu/status_screen.asm @@ -80,7 +80,7 @@ StatusScreen: ; 12953 (4:6953) ld hl, wd72c set 1, [hl] ld a, $33 - ld [$ff24], a ; Reduce the volume + ld [rNR50], a ; Reduce the volume call GBPalWhiteOutWithDelay3 call ClearScreen call UpdateSprites @@ -430,7 +430,7 @@ StatusScreen2: ; 12b57 (4:6b57) ld hl, wd72c res 1, [hl] ld a, $77 - ld [$ff24], a + ld [rNR50], a call GBPalWhiteOut jp ClearScreen diff --git a/engine/oak_speech.asm b/engine/oak_speech.asm index 98499d7f..566bd880 100755 --- a/engine/oak_speech.asm +++ b/engine/oak_speech.asm @@ -129,12 +129,12 @@ OakSpeech: ; 6115 (1:6115) ld a,[H_LOADEDROMBANK] push af ld a, BANK(Music_PalletTown) - ld [wc0ef],a - ld [wc0f0],a - ld a,$A - ld [wMusicHeaderPointer],a + ld [wAudioROMBank],a + ld [wAudioSavedROMBank],a + ld a, 10 + ld [wAudioFadeOutControl],a ld a,$FF - ld [wc0ee],a + ld [wNewSoundID],a call PlaySound ; stop music pop af ld [H_LOADEDROMBANK],a diff --git a/engine/overworld/elevator.asm b/engine/overworld/elevator.asm index eb62fee7..05a9cc4e 100755 --- a/engine/overworld/elevator.asm +++ b/engine/overworld/elevator.asm @@ -33,7 +33,7 @@ ShakeElevator: ; 7bf15 (1e:7f15) ld a, SFX_SAFARI_ZONE_PA call PlayMusic .musicLoop - ld a, [wc02a] + ld a, [wChannelSoundIDs + CH4] cp $b9 jr z, .musicLoop call UpdateSprites diff --git a/engine/overworld/healing_machine.asm b/engine/overworld/healing_machine.asm index d3513b0d..0c04ff0e 100755 --- a/engine/overworld/healing_machine.asm +++ b/engine/overworld/healing_machine.asm @@ -15,44 +15,44 @@ AnimateHealingMachine: ; 70433 (1c:4433) ld hl, wOAMBuffer + $84 ld de, PokeCenterOAMData call CopyHealingMachineOAM - ld a, $4 - ld [wMusicHeaderPointer], a + ld a, 4 + ld [wAudioFadeOutControl], a ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound -.asm_70464 - ld a, [wMusicHeaderPointer] - and a - jr nz, .asm_70464 +.waitLoop + ld a, [wAudioFadeOutControl] + and a ; is fade-out finished? + jr nz, .waitLoop ; if not, check again ld a, [wPartyCount] ld b, a -.asm_7046e +.partyLoop call CopyHealingMachineOAM ld a, SFX_HEALING_MACHINE call PlaySound ld c, 30 call DelayFrames dec b - jr nz, .asm_7046e - ld a, [wc0ef] + jr nz, .partyLoop + ld a, [wAudioROMBank] cp BANK(Audio3_UpdateMusic) - ld [wc0f0], a - jr nz, .asm_70495 + ld [wAudioSavedROMBank], a + jr nz, .next ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound ld a, BANK(Music_PkmnHealed) - ld [wc0ef], a -.asm_70495 + ld [wAudioROMBank], a +.next ld a, MUSIC_PKMN_HEALED - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound ld d, $28 call FlashSprite8Times -.asm_704a2 - ld a, [wc026] - cp MUSIC_PKMN_HEALED - jr z, .asm_704a2 +.waitLoop2 + ld a, [wChannelSoundIDs] + cp MUSIC_PKMN_HEALED ; is the healed music still playing? + jr z, .waitLoop2 ; if so, check gain ld c, 32 call DelayFrames pop af diff --git a/engine/overworld/npc_movement.asm b/engine/overworld/npc_movement.asm index 0c01e38c..fa5ac222 100755 --- a/engine/overworld/npc_movement.asm +++ b/engine/overworld/npc_movement.asm @@ -163,10 +163,10 @@ PewterMuseumGuyMovementScriptPointerTable: ; 1a510 (6:6510) PewterMovementScript_WalkToMuseum: ; 1a514 (6:6514) ld a, BANK(Music_MuseumGuy) - ld [wc0ef], a - ld [wc0f0], a + ld [wAudioROMBank], a + ld [wAudioSavedROMBank], a ld a, MUSIC_MUSEUM_GUY - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound ld a, [wSpriteIndex] swap a @@ -219,10 +219,10 @@ PewterGymGuyMovementScriptPointerTable: ; 1a57d (6:657d) PewterMovementScript_WalkToGym: ; 1a581 (6:6581) ld a, BANK(Music_MuseumGuy) - ld [wc0ef], a - ld [wc0f0], a + ld [wAudioROMBank], a + ld [wAudioSavedROMBank], a ld a, MUSIC_MUSEUM_GUY - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound ld a, [wSpriteIndex] swap a diff --git a/engine/overworld/pokecenter.asm b/engine/overworld/pokecenter.asm index 5b2e4cbb..f302d994 100755 --- a/engine/overworld/pokecenter.asm +++ b/engine/overworld/pokecenter.asm @@ -24,12 +24,12 @@ DisplayPokemonCenterDialogue_: ; 6fe6 (1:6fe6) predef HealParty callba AnimateHealingMachine ; do the healing machine animation xor a - ld [wMusicHeaderPointer], a - ld a, [wc0f0] - ld [wc0ef], a - ld a, [wd35b] - ld [wcfca], a - ld [wc0ee], a + ld [wAudioFadeOutControl], a + ld a, [wAudioSavedROMBank] + ld [wAudioROMBank], a + ld a, [wMapMusicSoundID] + ld [wLastMusicSoundID], a + ld [wNewSoundID], a call PlaySound ld hl, PokemonFightingFitText call PrintText diff --git a/engine/slot_machine.asm b/engine/slot_machine.asm index 3b392dde..b68b9294 100755 --- a/engine/slot_machine.asm +++ b/engine/slot_machine.asm @@ -411,7 +411,7 @@ SlotMachine_CheckForMatches: ; 37588 (d:7588) call PrintText .done xor a - ld [wc002], a + ld [wMuteAudioAndPauseMusic], a ret .rollWheel3DownByOneSymbol call SlotMachine_AnimWheel3 @@ -654,7 +654,7 @@ SlotMachine_PrintPayoutCoins: ; 3775f (d:775f) SlotMachine_PayCoinsToPlayer: ; 3776b (d:776b) ld a, $1 - ld [wc002], a + ld [wMuteAudioAndPauseMusic], a call WaitForSoundToFinish ; Put 1 in the temp coins variable. This value is added to the player's coins diff --git a/engine/titlescreen.asm b/engine/titlescreen.asm index df47275b..17609786 100755 --- a/engine/titlescreen.asm +++ b/engine/titlescreen.asm @@ -18,8 +18,8 @@ SetDefaultNamesBeforeTitlescreen: ; 42b7 (1:42b7) ld [hli], a ld [hl], a ld a, BANK(Music_TitleScreen) - ld [wc0ef], a - ld [wc0f0], a + ld [wAudioROMBank], a + ld [wAudioSavedROMBank], a DisplayTitleScreen: ; 42dd (1:42dd) call GBPalWhiteOut @@ -219,7 +219,7 @@ ENDC call Delay3 call WaitForSoundToFinish ld a, MUSIC_TITLE_SCREEN - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound xor a ld [wcc5b], a diff --git a/home.asm b/home.asm index b18a4ec3..e850c858 100644 --- a/home.asm +++ b/home.asm @@ -332,9 +332,9 @@ GetCryData:: ; 13d9 (0:13d9) ld a, [hli] ld b, a ; cry id ld a, [hli] - ld [wc0f1], a + ld [wFrequencyModifier], a ld a, [hl] - ld [wc0f2], a + ld [wTempoModifier], a call BankswitchBack ; Cry headers have 3 channels, @@ -998,27 +998,27 @@ ResetPlayerSpriteData_ClearSpriteData:: ; 28c4 (0:28c4) xor a jp FillMemory -Func_28cb:: ; 28cb (0:28cb) - ld a, [wMusicHeaderPointer] +FadeOutAudio:: ; 28cb (0:28cb) + ld a, [wAudioFadeOutControl] and a jr nz, .asm_28dc ld a, [wd72c] bit 1, a ret nz ld a, $77 - ld [$ff24], a + ld [rNR50], a ret .asm_28dc - ld a, [wcfc9] + ld a, [wAudioFadeOutCounter] and a - jr z, .asm_28e7 + jr z, .counterReachedZero dec a - ld [wcfc9], a + ld [wAudioFadeOutCounter], a ret -.asm_28e7 - ld a, [wcfc8] - ld [wcfc9], a - ld a, [$ff24] +.counterReachedZero + ld a, [wAudioFadeOutCounterReloadValue] + ld [wAudioFadeOutCounter], a + ld a, [rNR50] and a jr z, .asm_2903 ld b, a @@ -1031,20 +1031,20 @@ Func_28cb:: ; 28cb (0:28cb) dec a swap a or c - ld [$ff24], a + ld [rNR50], a ret .asm_2903 - ld a, [wMusicHeaderPointer] + ld a, [wAudioFadeOutControl] ld b, a xor a - ld [wMusicHeaderPointer], a + ld [wAudioFadeOutControl], a ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound - ld a, [wc0f0] - ld [wc0ef], a + ld a, [wAudioSavedROMBank] + ld [wAudioROMBank], a ld a, b - ld [wc0ee], a + ld [wNewSoundID], a jp PlaySound ; this function is used to display sign messages, sprite dialog, etc. @@ -2604,12 +2604,12 @@ PlayTrainerMusic:: ; 33e8 (0:33e8) and a ret nz xor a - ld [wMusicHeaderPointer], a + ld [wAudioFadeOutControl], a ld a, $ff call PlaySound ld a, BANK(Music_MeetEvilTrainer) - ld [wc0ef], a - ld [wc0f0], a + ld [wAudioROMBank], a + ld [wAudioSavedROMBank], a ld a, [wEngagedTrainerClass] ld b, a ld hl, EvilTrainerList @@ -2634,7 +2634,7 @@ PlayTrainerMusic:: ; 33e8 (0:33e8) .maleTrainer ld a, MUSIC_MEET_MALE_TRAINER .PlaySound - ld [wc0ee], a + ld [wNewSoundID], a jp PlaySound INCLUDE "data/trainer_types.asm" @@ -3217,8 +3217,8 @@ WaitForSoundToFinish:: ; 3748 (0:3748) and $80 ret nz push hl -.asm_374f - ld hl, wc02a +.waitLoop + ld hl, wChannelSoundIDs + CH4 xor a or [hl] inc hl @@ -3226,7 +3226,7 @@ WaitForSoundToFinish:: ; 3748 (0:3748) inc hl inc hl or [hl] - jr nz, .asm_374f + jr nz, .waitLoop pop hl ret diff --git a/home/audio.asm b/home/audio.asm index 033f4067..2c46ec7a 100644 --- a/home/audio.asm +++ b/home/audio.asm @@ -3,112 +3,139 @@ PlayDefaultMusic:: ; 2307 (0:2307) xor a ld c, a ld d, a - ld [wcfca], a - jr Func_2324 + ld [wLastMusicSoundID], a + jr PlayDefaultMusicCommon -Func_2312:: ; 2312 (0:2312) - ld c, $a - ld d, $0 +PlayDefaultMusicFadeOutCurrent:: ; 2312 (0:2312) +; Fade out the current music and then play the default music. + ld c, 10 + ld d, 0 ld a, [wd72e] - bit 5, a - jr z, Func_2324 + bit 5, a ; has a battle just ended? + jr z, PlayDefaultMusicCommon xor a - ld [wcfca], a - ld c, $8 + ld [wLastMusicSoundID], a + ld c, 8 ld d, c -Func_2324:: ; 2324 (0:2324) + +PlayDefaultMusicCommon:: ; 2324 (0:2324) ld a, [wWalkBikeSurfState] and a - jr z, .asm_2343 + jr z, .walking cp $2 - jr z, .asm_2332 + jr z, .surfing ld a, MUSIC_BIKE_RIDING - jr .asm_2334 -.asm_2332 + jr .next + +.surfing ld a, MUSIC_SURFING -.asm_2334 + +.next ld b, a ld a, d - and a + and a ; should current music be faded out first? ld a, BANK(Music_BikeRiding) - jr nz, .asm_233e - ld [wc0ef], a -.asm_233e - ld [wc0f0], a - jr .asm_234c -.asm_2343 - ld a, [wd35b] + jr nz, .next2 + +; Only change the audio ROM bank if the current music isn't going to be faded +; out before the default music begins. + ld [wAudioROMBank], a + +.next2 +; [wAudioSavedROMBank] will be copied to [wAudioROMBank] after fading out the +; current music (if the current music is faded out). + ld [wAudioSavedROMBank], a + jr .next3 + +.walking + ld a, [wMapMusicSoundID] ld b, a - call Func_2385 - jr c, .asm_2351 -.asm_234c - ld a, [wcfca] - cp b - ret z -.asm_2351 + call CompareMapMusicBankWithCurrentBank + jr c, .next4 + +.next3 + ld a, [wLastMusicSoundID] + cp b ; is the default music already playing? + ret z ; if so, do nothing + +.next4 ld a, c - ld [wMusicHeaderPointer], a + ld [wAudioFadeOutControl], a ld a, b - ld [wcfca], a - ld [wc0ee], a + ld [wLastMusicSoundID], a + ld [wNewSoundID], a jp PlaySound -Func_235f:: ; 235f (0:235f) - ld a, [wc0ef] +UpdateMusic6Times:: ; 235f (0:235f) +; This is called when entering a map, before fading out the current music and +; playing the default music (i.e. the map's music or biking/surfing music). + ld a, [wAudioROMBank] ld b, a cp BANK(Audio1_UpdateMusic) jr nz, .checkForAudio2 -.audio1 + +; audio 1 ld hl, Audio1_UpdateMusic - jr .asm_2378 + jr .next + .checkForAudio2 cp BANK(Audio2_UpdateMusic) jr nz, .audio3 -.audio2 + +; audio 2 ld hl, Audio2_UpdateMusic - jr .asm_2378 + jr .next + .audio3 ld hl, Audio3_UpdateMusic -.asm_2378 - ld c, $6 -.asm_237a + +.next + ld c, 6 +.loop push bc push hl call Bankswitch pop hl pop bc dec c - jr nz, .asm_237a + jr nz, .loop ret -Func_2385:: ; 2385 (0:2385) - ld a, [wd35c] +CompareMapMusicBankWithCurrentBank:: ; 2385 (0:2385) +; Compares the map music's audio ROM bank with the current audio ROM bank +; and updates the audio ROM bank variables. +; Returns whether the banks are different in carry. + ld a, [wMapMusicROMBank] ld e, a - ld a, [wc0ef] + ld a, [wAudioROMBank] cp e - jr nz, .asm_2394 - ld [wc0f0], a + jr nz, .differentBanks + ld [wAudioSavedROMBank], a and a ret -.asm_2394 - ld a, c +.differentBanks + ld a, c ; this is a fade-out counter value and it's always non-zero and a ld a, e - jr nz, .asm_239c - ld [wc0ef], a -.asm_239c - ld [wc0f0], a + jr nz, .next +; If the fade-counter is non-zero, we don't change the audio ROM bank because +; it's needed to keep playing the music as it fades out. The FadeOutAudio +; routine will take care of copying [wAudioSavedROMBank] to [wAudioROMBank] +; when the music has faded out. + ld [wAudioROMBank], a +.next + ld [wAudioSavedROMBank], a scf ret PlayMusic:: ; 23a1 (0:23a1) ld b, a - ld [wc0ee], a + ld [wNewSoundID], a xor a - ld [wMusicHeaderPointer], a + ld [wAudioFadeOutControl], a ld a, c - ld [wc0ef], a - ld [wc0f0], a + ld [wAudioROMBank], a + ld [wAudioSavedROMBank], a ld a, b ; plays music specified by a. If value is $ff, music is stopped @@ -117,66 +144,74 @@ PlaySound:: ; 23b1 (0:23b1) push de push bc ld b, a - ld a, [wc0ee] + ld a, [wNewSoundID] and a - jr z, .asm_23c8 + jr z, .next xor a - ld [wc02a], a - ld [wc02b], a - ld [wc02c], a - ld [wc02d], a -.asm_23c8 - ld a, [wMusicHeaderPointer] - and a - jr z, .asm_23e3 - ld a, [wc0ee] - and a - jr z, .asm_2425 + ld [wChannelSoundIDs + CH4], a + ld [wChannelSoundIDs + CH5], a + ld [wChannelSoundIDs + CH6], a + ld [wChannelSoundIDs + CH7], a +.next + ld a, [wAudioFadeOutControl] + and a ; has a fade-out length been specified? + jr z, .noFadeOut + ld a, [wNewSoundID] + and a ; is the new sound ID 0? + jr z, .done ; if so, do nothing xor a - ld [wc0ee], a - ld a, [wcfca] - cp $ff - jr nz, .asm_2414 + ld [wNewSoundID], a + ld a, [wLastMusicSoundID] + cp $ff ; has the music been stopped? + jr nz, .fadeOut ; if not, fade out the current music +; If it has been stopped, start playing the new music immediately. xor a - ld [wMusicHeaderPointer], a -.asm_23e3 + ld [wAudioFadeOutControl], a +.noFadeOut xor a - ld [wc0ee], a + ld [wNewSoundID], a ld a, [H_LOADEDROMBANK] - ld [$ffb9], a - ld a, [wc0ef] + ld [hSavedROMBank], a + ld a, [wAudioROMBank] ld [H_LOADEDROMBANK], a ld [MBC1RomBank], a - cp BANK(Audio1_9876) + cp BANK(Audio1_PlaySound) jr nz, .checkForAudio2 -.audio1 + +; audio 1 ld a, b - call Audio1_9876 - jr .asm_240b + call Audio1_PlaySound + jr .next2 + .checkForAudio2 - cp BANK(Audio2_22035) + cp BANK(Audio2_PlaySound) jr nz, .audio3 -.audio2 + +; audio 2 ld a, b - call Audio2_22035 - jr .asm_240b + call Audio2_PlaySound + jr .next2 + .audio3 ld a, b - call Audio3_7d8ea -.asm_240b - ld a, [$ffb9] + call Audio3_PlaySound + +.next2 + ld a, [hSavedROMBank] ld [H_LOADEDROMBANK], a ld [MBC1RomBank], a - jr .asm_2425 -.asm_2414 + jr .done + +.fadeOut ld a, b - ld [wcfca], a - ld a, [wMusicHeaderPointer] - ld [wcfc8], a - ld [wcfc9], a + ld [wLastMusicSoundID], a + ld a, [wAudioFadeOutControl] + ld [wAudioFadeOutCounterReloadValue], a + ld [wAudioFadeOutCounter], a ld a, b - ld [wMusicHeaderPointer], a -.asm_2425 + ld [wAudioFadeOutControl], a + +.done pop bc pop de pop hl diff --git a/home/init.asm b/home/init.asm index 624a4d6a..cb5c6583 100644 --- a/home/init.asm +++ b/home/init.asm @@ -98,8 +98,8 @@ rLCDC_DEFAULT EQU %11100011 predef LoadSGB ld a, BANK(SFX_Shooting_Star) - ld [wc0ef], a - ld [wc0f0], a + ld [wAudioROMBank], a + ld [wAudioSavedROMBank], a ld a, $9c ld [H_AUTOBGTRANSFERDEST + 1], a xor a @@ -127,11 +127,11 @@ ClearVram: StopAllSounds:: ld a, BANK(Audio1_UpdateMusic) - ld [wc0ef], a - ld [wc0f0], a + ld [wAudioROMBank], a + ld [wAudioSavedROMBank], a xor a - ld [wMusicHeaderPointer], a - ld [wc0ee], a - ld [wcfca], a + ld [wAudioFadeOutControl], a + ld [wNewSoundID], a + ld [wLastMusicSoundID], a dec a jp PlaySound diff --git a/home/overworld.asm b/home/overworld.asm index f8d6e7e1..eba47df2 100644 --- a/home/overworld.asm +++ b/home/overworld.asm @@ -658,7 +658,7 @@ CheckMapConnections:: ; 07ba (0:07ba) ld [wCurrentTileBlockMapViewPointer + 1],a .loadNewMap ; load the connected map that was entered call LoadMapHeader - call Func_2312 ; music + call PlayDefaultMusicFadeOutCurrent ld b,$09 call GoPAL_SET ; Since the sprite set shouldn't change, this will just update VRAM slots at @@ -750,16 +750,16 @@ HandleBlackOut:: ld [MBC1RomBank], a call ResetStatusAndHalveMoneyOnBlackout call SpecialWarpIn - call Func_2312 + call PlayDefaultMusicFadeOutCurrent jp SpecialEnterMap StopMusic:: - ld [wMusicHeaderPointer], a + ld [wAudioFadeOutControl], a ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound .wait - ld a, [wMusicHeaderPointer] + ld a, [wAudioFadeOutControl] and a jr nz, .wait jp StopAllSounds @@ -1224,7 +1224,7 @@ CollisionCheckOnLand:: ; 0bd1 (0:0bd1) call CheckTilePassable jr nc,.noCollision .collision - ld a,[wc02a] + ld a,[wChannelSoundIDs + CH4] cp a,SFX_COLLISION ; check if collision sound is already playing jr z,.setCarry ld a,SFX_COLLISION @@ -1927,7 +1927,7 @@ CollisionCheckOnWater:: ; 0fb7 (0:0fb7) jr z,.stopSurfing ; stop surfing if the tile is passable jr .loop .collision - ld a,[wc02a] + ld a,[wChannelSoundIDs + CH4] cp a,SFX_COLLISION ; check if collision sound is already playing jr z,.setCarry ld a,SFX_COLLISION @@ -2279,9 +2279,9 @@ LoadMapHeader:: ; 107c (0:107c) add hl,bc add hl,bc ld a,[hli] - ld [wd35b],a ; music 1 + ld [wMapMusicSoundID],a ; music 1 ld a,[hl] - ld [wd35c],a ; music 2 + ld [wMapMusicROMBank],a ; music 2 pop af ld [H_LOADEDROMBANK],a ld [MBC1RomBank],a @@ -2352,8 +2352,8 @@ LoadMapData:: ; 1241 (0:1241) ld a,[W_FLAGS_D733] bit 1,a jr nz,.restoreRomBank - call Func_235f ; music related - call Func_2312 ; music related + call UpdateMusic6Times + call PlayDefaultMusicFadeOutCurrent .restoreRomBank pop af ld [H_LOADEDROMBANK],a diff --git a/home/vblank.asm b/home/vblank.asm index 6abc3756..3bdbe7cb 100644 --- a/home/vblank.asm +++ b/home/vblank.asm @@ -38,21 +38,21 @@ VBlank:: ld a, [H_VBLANKOCCURRED] and a - jr z, .vblanked + jr z, .skipZeroing xor a ld [H_VBLANKOCCURRED], a -.vblanked +.skipZeroing ld a, [H_FRAMECOUNTER] and a - jr z, .decced + jr z, .skipDec dec a ld [H_FRAMECOUNTER], a -.decced - call Func_28cb +.skipDec + call FadeOutAudio - ld a, [wc0ef] ; music ROM bank + ld a, [wAudioROMBank] ; music ROM bank ld [H_LOADEDROMBANK], a ld [MBC1RomBank], a diff --git a/hram.asm b/hram.asm index 2f70b91a..3f331cfb 100644 --- a/hram.asm +++ b/hram.asm @@ -182,7 +182,9 @@ hJoy5 EQU $FFB5 hJoy6 EQU $FFB6 hJoy7 EQU $FFB7 -H_LOADEDROMBANK EQU $FFB8 +H_LOADEDROMBANK EQU $FFB8 + +hSavedROMBank EQU $FFB9 ; is automatic background transfer during V-blank enabled? ; if nonzero, yes diff --git a/scripts/ceruleancity.asm b/scripts/ceruleancity.asm index 158a683d..d5aa57c1 100755 --- a/scripts/ceruleancity.asm +++ b/scripts/ceruleancity.asm @@ -65,7 +65,7 @@ CeruleanCityScript0: ; 194c8 (6:54c8) and a jr z, .asm_19512 ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound .asm_19512 ld c, BANK(Music_MeetRival) @@ -172,7 +172,7 @@ CeruleanCityScript2: ; 195b1 (6:55b1) ld [hSpriteIndexOrTextID], a call DisplayTextID ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound callba Music_RivalAlternateStart ld a, $1 diff --git a/scripts/oakslab.asm b/scripts/oakslab.asm index c52f00cf..db6fa696 100755 --- a/scripts/oakslab.asm +++ b/scripts/oakslab.asm @@ -511,7 +511,7 @@ OaksLabScript15: ; 1ceb0 (7:4eb0) ld [hJoyHeld], a call EnableAutoTextBoxDrawing ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound callba Music_RivalAlternateStart ld a, $15 @@ -612,7 +612,7 @@ OaksLabScript16: ; 1cf12 (7:4f12) call FillMemory ld [hl], $ff ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound callba Music_RivalAlternateStart ld a, $1 diff --git a/scripts/pewterpokecenter.asm b/scripts/pewterpokecenter.asm index 584878eb..25c07be6 100755 --- a/scripts/pewterpokecenter.asm +++ b/scripts/pewterpokecenter.asm @@ -59,9 +59,9 @@ PewterPokecenterText3: ; 5c59b (17:459b) ld c, 24 call DelayFrames - ld a, [wc026] + ld a, [wChannelSoundIDs] ld b, a - ld a, [wc027] + ld a, [wChannelSoundIDs + CH1] or b jr nz, .loop diff --git a/scripts/pokemontower2.asm b/scripts/pokemontower2.asm index a569b60b..5422d887 100755 --- a/scripts/pokemontower2.asm +++ b/scripts/pokemontower2.asm @@ -23,7 +23,7 @@ PokemonTower2Script0: ; 6050f (18:450f) call ArePlayerCoordsInArray ret nc ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound ld c, BANK(Music_MeetRival) ld a, MUSIC_MEET_RIVAL @@ -77,7 +77,7 @@ PokemonTower2Script1: ; 60563 (18:4563) ld [H_SPRITEINDEX], a call MoveSprite ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound callba Music_RivalAlternateStart ld a, $2 diff --git a/scripts/redshouse1f.asm b/scripts/redshouse1f.asm index 09ce97dc..f9c7193f 100755 --- a/scripts/redshouse1f.asm +++ b/scripts/redshouse1f.asm @@ -29,14 +29,14 @@ MomHealPokemon: ; 4818a (12:418a) call ReloadMapData predef HealParty ld a, MUSIC_PKMN_HEALED - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound .next - ld a, [wc026] + ld a, [wChannelSoundIDs] cp MUSIC_PKMN_HEALED jr z, .next - ld a, [wd35b] - ld [wc0ee], a + ld a, [wMapMusicSoundID] + ld [wNewSoundID], a call PlaySound call GBFadeInFromWhite ld hl, MomHealText2 diff --git a/scripts/route22.asm b/scripts/route22.asm index 041f75e6..f6f6778e 100755 --- a/scripts/route22.asm +++ b/scripts/route22.asm @@ -89,7 +89,7 @@ Route22Script0: ; 50f00 (14:4f00) and a jr z, .asm_50f4e ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound .asm_50f4e ld c, BANK(Music_MeetRival) @@ -168,7 +168,7 @@ Route22Script2: ; 50fb5 (14:4fb5) ld [hSpriteIndexOrTextID], a call DisplayTextID ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound callba Music_RivalAlternateStart ld a, [wcf0d] @@ -242,11 +242,11 @@ Route22Script_5104e: ; 5104e (14:504e) and a jr z, .skipYVisibilityTesta ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound .skipYVisibilityTesta ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound callba Music_RivalAlternateTempo ld a, $2 @@ -327,7 +327,7 @@ Route22Script5: ; 510df (14:50df) ld [hSpriteIndexOrTextID], a call DisplayTextID ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound callba Music_RivalAlternateStartAndTempo ld a, [wcf0d] diff --git a/scripts/silphco7.asm b/scripts/silphco7.asm index 525405c7..0de4b324 100755 --- a/scripts/silphco7.asm +++ b/scripts/silphco7.asm @@ -131,7 +131,7 @@ SilphCo7Script0: ; 51c23 (14:5c23) ld a, PLAYER_DIR_DOWN ld [wPlayerMovingDirection], a ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound ld c, BANK(Music_MeetRival) ld a, MUSIC_MEET_RIVAL @@ -220,7 +220,7 @@ SilphCo7Script4: ; 51cc8 (14:5cc8) ld [hSpriteIndexOrTextID], a call DisplayTextID ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound callba Music_RivalAlternateStart ld de, MovementData_51d1d diff --git a/scripts/ssanne2.asm b/scripts/ssanne2.asm index b95c5723..c4afd9d0 100755 --- a/scripts/ssanne2.asm +++ b/scripts/ssanne2.asm @@ -25,7 +25,7 @@ SSAnne2Script0: ; 613be (18:53be) call ArePlayerCoordsInArray ret nc ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound ld c, BANK(Music_MeetRival) ld a, MUSIC_MEET_RIVAL @@ -146,7 +146,7 @@ SSAnne2Script2: ; 6146d (18:546d) ld [H_SPRITEINDEX], a call MoveSprite ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound callba Music_RivalAlternateStart ld a, $3 diff --git a/scripts/ssanne7.asm b/scripts/ssanne7.asm index b99f5bb2..911dac7f 100755 --- a/scripts/ssanne7.asm +++ b/scripts/ssanne7.asm @@ -44,21 +44,21 @@ SSAnne7Text1: ; 618ad (18:58ad) SSAnne7RubText: ; 618ec (18:58ec) TX_FAR _SSAnne7RubText TX_ASM - ld a, [wc0ef] + ld a, [wAudioROMBank] cp BANK(Audio3_UpdateMusic) - ld [wc0f0], a + ld [wAudioSavedROMBank], a jr nz, .asm_61908 ld a, $ff - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound ld a, Bank(Music_PkmnHealed) - ld [wc0ef], a + ld [wAudioROMBank], a .asm_61908 ld a, MUSIC_PKMN_HEALED - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound .asm_61910 - ld a, [wc026] + ld a, [wChannelSoundIDs] cp MUSIC_PKMN_HEALED jr z, .asm_61910 call PlayDefaultMusic diff --git a/scripts/vermiliondock.asm b/scripts/vermiliondock.asm index a65b3603..8c2173cc 100755 --- a/scripts/vermiliondock.asm +++ b/scripts/vermiliondock.asm @@ -40,7 +40,7 @@ VermilionDock_1db9b: ; 1db9b (7:5b9b) SetEventForceReuseHL EVENT_SS_ANNE_LEFT ld a, $ff ld [wJoyIgnore], a - ld [wc0ee], a + ld [wNewSoundID], a call PlaySound ld c, BANK(Music_Surfing) ld a, MUSIC_SURFING diff --git a/wram.asm b/wram.asm index 872d1e8e..2fc94e8d 100755 --- a/wram.asm +++ b/wram.asm @@ -61,66 +61,146 @@ ENDM SECTION "WRAM Bank 0", WRAM0 -wc000:: ds 1 -wc001:: ds 1 -wc002:: ds 1 -wc003:: ds 1 -wc004:: ds 1 -wc005:: ds 1 -wc006:: ds 8 -wc00e:: ds 4 -wc012:: ds 4 -wc016:: ds 16 -wc026:: ds 1 -wc027:: ds 1 -wc028:: ds 2 -wc02a:: ds 1 -wc02b:: ds 1 -wc02c:: ds 1 -wc02d:: ds 1 -wc02e:: ds 8 -wc036:: ds 8 -wc03e:: ds 8 -wc046:: ds 8 -wc04e:: ds 8 -wc056:: ds 8 -wc05e:: ds 8 -wc066:: ds 8 -wc06e:: ds 8 -wc076:: ds 8 -wc07e:: ds 8 -wc086:: ds 8 -wc08e:: ds 8 -wc096:: ds 8 -wc09e:: ds 8 -wc0a6:: ds 8 -wc0ae:: ds 8 -wc0b6:: ds 8 -wc0be:: ds 8 -wc0c6:: ds 8 -wc0ce:: ds 1 -wc0cf:: ds 1 -wc0d0:: ds 1 -wc0d1:: ds 1 -wc0d2:: ds 1 -wc0d3:: ds 1 -wc0d4:: ds 1 -wc0d5:: ds 1 -wc0d6:: ds 8 -wc0de:: ds 8 -wc0e6:: ds 1 -wc0e7:: ds 1 -wc0e8:: ds 1 -wc0e9:: ds 1 -wc0ea:: ds 1 -wc0eb:: ds 1 -wc0ec:: ds 1 -wc0ed:: ds 1 -wc0ee:: ds 1 -wc0ef:: ds 1 -wc0f0:: ds 1 -wc0f1:: ds 1 -wc0f2:: ds 14 +wUnusedC000:: ; c000 + ds 1 + +wSoundID:: ; c001 + ds 1 + +wMuteAudioAndPauseMusic:: ; c002 +; bit 7: whether sound has been muted +; all bits: whether the effective is active +; Store 1 to activate effect (any value in the range [1, 127] works). +; All audio is muted and music is paused. Sfx continues playing until it +; ends normally. +; Store 0 to resume music. + ds 1 + +wDisableChannelOutputWhenSfxEnds:: ; c003 + ds 1 + +wStereoPanning:: ; c004 + ds 1 + +wSavedVolume:: ; c005 + ds 1 + +wChannelCommandPointers:: ; c006 + ds 16 + +wChannelReturnAddresses:: ; c016 + ds 16 + +wChannelSoundIDs:: ; c026 + ds 8 + +wChannelFlags1:: ; c02e + ds 8 + +wChannelFlags2:: ; c036 + ds 8 + +wChannelDuties:: ; c03e + ds 8 + +wChannelDutyCycles:: ; c046 + ds 8 + +wChannelVibratoDelayCounters:: ; c04e +; reloaded at the beginning of a note. counts down until the vibrato begins. + ds 8 + +wChannelVibratoExtents:: ; c056 + ds 8 + +wChannelVibratoRates:: ; c05e +; high nybble is rate (counter reload value) and low nybble is counter. +; time between applications of vibrato. + ds 8 + +wChannelFrequencyLowBytes:: ; c066 + ds 8 + +wChannelVibratoDelayCounterReloadValues:: ; c06e +; delay of the beginning of the vibrato from the start of the note + ds 8 + +wChannelPitchBendLengthModifiers:: ; c076 + ds 8 + +wChannelPitchBendFrequencySteps:: ; c07e + ds 8 + +wChannelPitchBendFrequencyStepsFractionalPart:: ; c086 + ds 8 + +wChannelPitchBendCurrentFrequencyFractionalPart:: ; c08e + ds 8 + +wChannelPitchBendCurrentFrequencyHighBytes:: ; c096 + ds 8 + +wChannelPitchBendCurrentFrequencyLowBytes:: ; c09e + ds 8 + +wChannelPitchBendTargetFrequencyHighBytes:: ; c0a6 + ds 8 + +wChannelPitchBendTargetFrequencyLowBytes:: ; c0ae + ds 8 + +wChannelNoteDelayCounters:: ; c0b6 +; Note delays are stored as 16-bit fixed-point numbers where the integer part +; is 8 bits and the fractional part is 8 bits. + ds 8 + +wChannelLoopCounters:: ; c0be + ds 8 + +wChannelNoteSpeeds:: ; c0c6 + ds 8 + +wChannelNoteDelayCountersFractionalPart:: ; c0ce + ds 8 + +wChannelOctaves:: ; c0d6 + ds 8 + +wChannelVolumes:: ; c0de +; also includes fade for hardware channels that support it + ds 8 + +wMusicWaveInstrument:: + ds 1 + +wSfxWaveInstrument:: + ds 1 + +wMusicTempo:: ; c0e8 + ds 2 + +wSfxTempo:: ; c0ea + ds 2 + +wSfxHeaderPointer:: ; c0ec + ds 2 + +wNewSoundID:: ; c0ee + ds 1 + +wAudioROMBank:: ; c0ef + ds 1 + +wAudioSavedROMBank:: ; c0f0 + ds 1 + +wFrequencyModifier:: ; c0f1 + ds 1 + +wTempoModifier:: ; c0f2 + ds 1 + + ds 13 SECTION "Sprite State Data", WRAM0[$c100] @@ -1289,13 +1369,35 @@ wTileInFrontOfPlayer:: ; cfc6 ; background tile number in front of the player (either 1 or 2 steps ahead) ds 1 -wMusicHeaderPointer:: ; cfc7 -; (the current music channel address - $4000) / 3 +wAudioFadeOutControl:: ; cfc7 +; The desired fade counter reload value is stored here prior to calling +; PlaySound in order to cause the current music to fade out before the new +; music begins playing. Storing 0 causes no fade out to occur and the new music +; to begin immediately. +; This variable has another use related to fade-out, as well. PlaySound stores +; the sound ID of the music that should be played after the fade-out is finished +; in this variable. FadeOutAudio checks if it's non-zero every V-Blank and +; fades out the current audio if it is. Once it has finished fading out the +; audio, it zeroes this variable and starts playing the sound ID stored in it. ds 1 -wcfc8:: ds 1 ; used with audio -wcfc9:: ds 1 ; also used with audio -wcfca:: ds 1 ; also used with audio too +wAudioFadeOutCounterReloadValue:: ; cfc8 + ds 1 + +wAudioFadeOutCounter:: ; cfc9 + ds 1 + +wLastMusicSoundID:: ; cfca +; This is used to determine whether the default music is already playing when +; attempting to play the default music (in order to avoid restarting the same +; music) and whether the music has already been stopped when attempting to +; fade out the current music (so that the new music can be begin immediately +; instead of waiting). +; It sometimes contains the sound ID of the last music played, but it may also +; contain $ff (if the music has been stopped) or 0 (because some routines zero +; it in order to prevent assumptions from being made about the current state of +; the music). + ds 1 wUpdateSpritesEnabled:: ; cfcb ; $00 = causes sprites to be hidden and the value to change to $ff @@ -2126,8 +2228,11 @@ wLetterPrintingDelayFlags:: ; d358 wPlayerID:: ; d359 ds 2 -wd35b:: ds 1 ; used with audio stuff -wd35c:: ds 1 ; storage for audio bank for current map? +wMapMusicSoundID:: ; d35b + ds 1 + +wMapMusicROMBank:: ; d35c + ds 1 wMapPalOffset:: ; d35d ; offset subtracted from FadePal4 to get the background and object palettes for the current map