diff options
Diffstat (limited to 'audio/engine.asm')
-rw-r--r-- | audio/engine.asm | 1119 |
1 files changed, 620 insertions, 499 deletions
diff --git a/audio/engine.asm b/audio/engine.asm index f3a67e5f3..ae6d0f33a 100644 --- a/audio/engine.asm +++ b/audio/engine.asm @@ -22,14 +22,14 @@ _MapSetup_Sound_Off:: ; e8000 ld [hli], a ; ff26 ; music channels ld hl, rNR10 ; sound channel registers - ld e, $04 ; number of channels + ld e, $4 ; number of channels .clearsound ; sound channel 1 2 3 4 xor a ld [hli], a ; rNR10, rNR20, rNR30, rNR40 ; sweep = 0 ld [hli], a ; rNR11, rNR21, rNR31, rNR41 ; length/wavepattern = 0 - ld a, $08 + ld a, $8 ld [hli], a ; rNR12, rNR22, rNR32, rNR42 ; envelope = 0 xor a ld [hli], a ; rNR13, rNR23, rNR33, rNR43 ; frequency lo = 0 @@ -39,7 +39,7 @@ _MapSetup_Sound_Off:: ; e8000 jr nz, .clearsound ld hl, Channel1 ; start of channel data - ld de, $01bf ; length of area to clear (entire sound wram area) + ld de, $1bf ; length of area to clear (entire sound wram area) .clearchannels ; clear Channel1-$c2bf xor a ld [hli], a @@ -55,6 +55,7 @@ _MapSetup_Sound_Off:: ; e8000 pop de pop hl ret + ; e803d MusicFadeRestart: ; e803d @@ -69,18 +70,21 @@ MusicFadeRestart: ; e803d pop af ld [MusicFadeIDHi], a ret + ; e8051 MusicOn: ; e8051 - ld a, $01 + ld a, 1 ld [MusicPlaying], a ret + ; e8057 MusicOff: ; e8057 xor a ld [MusicPlaying], a ret + ; e805c _UpdateSound:: ; e805c @@ -98,16 +102,17 @@ _UpdateSound:: ; e805c ; is the channel active? ld hl, Channel1Flags - Channel1 add hl, bc - bit 0, [hl] + bit SOUND_CHANNEL_ON, [hl] jp z, .nextchannel ; check time left in the current note ld hl, Channel1NoteDuration - Channel1 add hl, bc ld a, [hl] - cp a, $02 ; 1 or 0? + cp $2 ; 1 or 0? jr c, .noteover dec [hl] jr .asm_e8093 + .noteover ; reset vibrato delay ld hl, Channel1VibratoDelay - Channel1 @@ -119,7 +124,7 @@ _UpdateSound:: ; e805c ; turn vibrato off for now ld hl, Channel1Flags2 - Channel1 add hl, bc - res 1, [hl] + res SOUND_UNKN_09, [hl] ; get next note call ParseMusic .asm_e8093 @@ -129,15 +134,15 @@ _UpdateSound:: ; e805c ld hl, Channel1DutyCycle - Channel1 add hl, bc ld a, [hli] - ld [wc292], a + ld [wCurTrackDuty], a ; intensity ld a, [hli] - ld [wc293], a + ld [wCurTrackIntensity], a ; frequency ld a, [hli] - ld [wc294], a + ld [wCurTrackFrequency], a ld a, [hl] - ld [wc295], a + ld [wCurTrackFrequency + 1], a ; call Functione8466 ; handle vibrato and other things call HandleNoise @@ -147,34 +152,34 @@ _UpdateSound:: ; e805c jr z, .next ; are we in a sfx channel right now? ld a, [CurChannel] - cp a, $04 + cp $4 jr nc, .next ; are any sfx channels active? ; if so, mute ld hl, Channel5Flags - bit 0, [hl] + bit SOUND_CHANNEL_ON, [hl] jr nz, .restnote ld hl, Channel6Flags - bit 0, [hl] + bit SOUND_CHANNEL_ON, [hl] jr nz, .restnote ld hl, Channel7Flags - bit 0, [hl] + bit SOUND_CHANNEL_ON, [hl] jr nz, .restnote ld hl, Channel8Flags - bit 0, [hl] + bit SOUND_CHANNEL_ON, [hl] jr z, .next .restnote ld hl, Channel1NoteFlags - Channel1 add hl, bc - set 5, [hl] ; Rest + set NOTE_REST, [hl] ; Rest .next ; are we in a sfx channel right now? ld a, [CurChannel] - cp a, $04 ; sfx + cp $4 ; sfx jr nc, .asm_e80ee - ld hl, $00cb + ld hl, Channel5Flags - Channel1 add hl, bc - bit 0, [hl] + bit SOUND_CHANNEL_ON, [hl] jr nz, .asm_e80fc .asm_e80ee call UpdateChannels @@ -198,7 +203,7 @@ _UpdateSound:: ; e805c ld a, [CurChannel] inc a ld [CurChannel], a - cp a, $08 ; are we done? + cp $8 ; are we done? jp nz, .loop ; do it all again call PlayDanger @@ -211,21 +216,23 @@ _UpdateSound:: ; e805c ld a, [SoundOutput] ld [rNR51], a ret + ; e8125 UpdateChannels: ; e8125 ld hl, .ChannelFnPtrs ld a, [CurChannel] - and a, $07 + and $7 add a ld e, a - ld d, $00 + ld d, 0 add hl, de ld a, [hli] ld h, [hl] ld l, a jp [hl] + .ChannelFnPtrs dw .Channel1 dw .Channel2 @@ -245,64 +252,68 @@ UpdateChannels: ; e8125 .Channel5 ld hl, Channel1NoteFlags - Channel1 add hl, bc - bit 3, [hl] + bit NOTE_UNKN_3, [hl] jr z, .asm_e8159 ; ld a, [SoundInput] ld [rNR10], a .asm_e8159 - bit 5, [hl] ; rest + bit NOTE_REST, [hl] ; rest jr nz, .ch1rest - bit 4, [hl] + bit NOTE_UNKN_4, [hl] jr nz, .asm_e81a2 - bit 1, [hl] + bit NOTE_UNKN_1, [hl] jr nz, .asm_e816b - bit 6, [hl] + bit NOTE_UNKN_6, [hl] jr nz, .asm_e8184 jr .asm_e8175 + .asm_e816b - ld a, [wc294] + ld a, [wCurTrackFrequency] ld [rNR13], a - ld a, [wc295] + ld a, [wCurTrackFrequency + 1] ld [rNR14], a .asm_e8175 - bit 0, [hl] + bit NOTE_UNKN_0, [hl] ret z - ld a, [wc292] + ld a, [wCurTrackDuty] ld d, a ld a, [rNR11] - and a, $3f ; sound length + and $3f ; sound length or d ld [rNR11], a ret + .asm_e8184 - ld a, [wc292] + ld a, [wCurTrackDuty] ld d, a ld a, [rNR11] - and a, $3f ; sound length + and $3f ; sound length or d ld [rNR11], a - ld a, [wc294] + ld a, [wCurTrackFrequency] ld [rNR13], a ret + .ch1rest ld a, [rNR52] - and a, %10001110 ; ch1 off + and %10001110 ; ch1 off ld [rNR52], a ld hl, rNR10 call ClearChannel ret + .asm_e81a2 - ld hl, wc292 + ld hl, wCurTrackDuty ld a, $3f ; sound length or [hl] ld [rNR11], a - ld a, [wc293] + ld a, [wCurTrackIntensity] ld [rNR12], a - ld a, [wc294] + ld a, [wCurTrackFrequency] ld [rNR13], a - ld a, [wc295] - or a, $80 + ld a, [wCurTrackFrequency + 1] + or $80 ld [rNR14], a ret @@ -310,55 +321,59 @@ UpdateChannels: ; e8125 .Channel6 ld hl, Channel1NoteFlags - Channel1 add hl, bc - bit 5, [hl] ; rest + bit NOTE_REST, [hl] ; rest jr nz, .ch2rest - bit 4, [hl] + bit NOTE_UNKN_4, [hl] jr nz, .asm_e8204 - bit 6, [hl] + bit NOTE_UNKN_6, [hl] jr nz, .asm_e81e6 - bit 0, [hl] + bit NOTE_UNKN_0, [hl] ret z - ld a, [wc292] + ld a, [wCurTrackDuty] ld d, a ld a, [rNR21] - and a, $3f ; sound length + and $3f ; sound length or d ld [rNR21], a ret + .asm_e81db ; unused - ld a, [wc294] + ld a, [wCurTrackFrequency] ld [rNR23], a - ld a, [wc295] + ld a, [wCurTrackFrequency + 1] ld [rNR24], a ret + .asm_e81e6 - ld a, [wc292] + ld a, [wCurTrackDuty] ld d, a ld a, [rNR21] - and a, $3f ; sound length + and $3f ; sound length or d ld [rNR21], a - ld a, [wc294] + ld a, [wCurTrackFrequency] ld [rNR23], a ret + .ch2rest ld a, [rNR52] - and a, %10001101 ; ch2 off + and %10001101 ; ch2 off ld [rNR52], a ld hl, rNR20 call ClearChannel ret + .asm_e8204 - ld hl, wc292 + ld hl, wCurTrackDuty ld a, $3f ; sound length or [hl] ld [rNR21], a - ld a, [wc293] + ld a, [wCurTrackIntensity] ld [rNR22], a - ld a, [wc294] + ld a, [wCurTrackFrequency] ld [rNR23], a - ld a, [wc295] - or a, $80 ; initial (restart) + ld a, [wCurTrackFrequency + 1] + or $80 ; initial (restart) ld [rNR24], a ret @@ -366,30 +381,34 @@ UpdateChannels: ; e8125 .Channel7 ld hl, Channel1NoteFlags - Channel1 add hl, bc - bit 5, [hl] ; rest + bit NOTE_REST, [hl] ; rest jr nz, .ch3rest - bit 4, [hl] + bit NOTE_UNKN_4, [hl] jr nz, .asm_e824d - bit 6, [hl] + bit NOTE_UNKN_6, [hl] jr nz, .asm_e823a ret + .asm_e822f ; unused - ld a, [wc294] + ld a, [wCurTrackFrequency] ld [rNR33], a - ld a, [wc295] + ld a, [wCurTrackFrequency + 1] ld [rNR34], a ret + .asm_e823a - ld a, [wc294] + ld a, [wCurTrackFrequency] ld [rNR33], a ret + .ch3rest ld a, [rNR52] - and a, %10001011 ; ch3 off + and %10001011 ; ch3 off ld [rNR52], a ld hl, rNR30 call ClearChannel ret + .asm_e824d ld a, $3f ld [rNR31], a @@ -398,20 +417,21 @@ UpdateChannels: ; e8125 call .asm_e8268 ld a, $80 ld [rNR30], a - ld a, [wc294] + ld a, [wCurTrackFrequency] ld [rNR33], a - ld a, [wc295] - or a, $80 + ld a, [wCurTrackFrequency + 1] + or $80 ld [rNR34], a ret + .asm_e8268 push hl - ld a, [wc293] - and a, $0f ; only 0-9 are valid + ld a, [wCurTrackIntensity] + and $f ; only 0-9 are valid ld l, a - ld h, $00 + ld h, 0 ; hl << 4 - ; each wavepattern is $0f bytes long + ; each wavepattern is $f bytes long ; so seeking is done in $10s rept 4 add hl, hl @@ -452,8 +472,8 @@ endr ld a, [hli] ld [rWave_f], a pop hl - ld a, [wc293] - and a, $f0 + ld a, [wCurTrackIntensity] + and $f0 sla a ld [rNR32], a ret @@ -462,71 +482,79 @@ endr .Channel8 ld hl, Channel1NoteFlags - Channel1 add hl, bc - bit 5, [hl] ; rest + bit NOTE_REST, [hl] ; rest jr nz, .ch4rest - bit 4, [hl] + bit NOTE_UNKN_4, [hl] jr nz, .asm_e82d4 ret + .asm_e82c1 ; unused - ld a, [wc294] + ld a, [wCurTrackFrequency] ld [rNR43], a ret + .ch4rest ld a, [rNR52] - and a, %10000111 ; ch4 off + and %10000111 ; ch4 off ld [rNR52], a ld hl, rNR40 call ClearChannel ret + .asm_e82d4 ld a, $3f ; sound length ld [rNR41], a - ld a, [wc293] + ld a, [wCurTrackIntensity] ld [rNR42], a - ld a, [wc294] + ld a, [wCurTrackFrequency] ld [rNR43], a ld a, $80 ld [rNR44], a ret + ; e82e7 _CheckSFX: ; e82e7 ; return carry if any sfx channels are active ld hl, Channel5Flags - bit 0, [hl] + bit SOUND_CHANNEL_ON, [hl] jr nz, .sfxon ld hl, Channel6Flags - bit 0, [hl] + bit SOUND_CHANNEL_ON, [hl] jr nz, .sfxon ld hl, Channel7Flags - bit 0, [hl] + bit SOUND_CHANNEL_ON, [hl] jr nz, .sfxon ld hl, Channel8Flags - bit 0, [hl] + bit SOUND_CHANNEL_ON, [hl] jr nz, .sfxon and a ret + .sfxon scf ret + ; e8307 PlayDanger: ; e8307 ld a, [Danger] bit 7, a ret z - and a, $7f + and $7f ld d, a call _CheckSFX jr c, .asm_e8335 and a jr z, .asm_e8323 - cp a, 16 ; halfway + cp 16 ; halfway jr z, .asm_e831e jr .asm_e8335 + .asm_e831e ld hl, Tablee8354 jr .updatehw + .asm_e8323 ld hl, Tablee8350 .updatehw @@ -543,33 +571,34 @@ PlayDanger: ; e8307 .asm_e8335 ld a, d inc a - cp a, 30 + cp 30 jr c, .asm_e833c xor a .asm_e833c - or a, $80 + or $80 ld [Danger], a ; is hw ch1 on? ld a, [SoundOutput] - and a, $11 + and $11 ret nz ; if not, turn it on ld a, [SoundOutput] - or a, $11 + or $11 ld [SoundOutput], a ret + ; e8350 Tablee8350: ; e8350 db $80 ; duty 50% - db $e2 ; volume $e, envelope decrease sweep 2 + db $e2 ; volume 14, envelope decrease sweep 2 db $50 ; frequency: $750 db $87 ; restart sound ; e8354 Tablee8354: ; e8354 db $80 ; duty 50% - db $e2 ; volume $e, envelope decrease sweep 2 + db $e2 ; volume 14, envelope decrease sweep 2 db $ee ; frequency: $6ee db $86 ; restart sound ; e8358 @@ -596,15 +625,16 @@ FadeMusic: ; e8358 dec a ld [MusicFadeCount], a ret + .update ld a, [MusicFade] ld d, a ; get new count - and a, $3f + and $3f ld [MusicFadeCount], a ; get SO1 volume ld a, [Volume] - and a, $07 + and $7 ; which way are we fading? bit 7, d jr nz, .fadein @@ -614,13 +644,14 @@ FadeMusic: ; e8358 dec a jr .updatevolume + .novolume ; make sure volume is off xor a ld [Volume], a ; did we just get on a bike? ld a, [PlayerState] - cp a, $01 ; bicycle + cp $1 ; bicycle jr z, .bicycle push bc ; restart sound @@ -641,6 +672,7 @@ FadeMusic: ; e8358 xor a ld [MusicFade], a ret + .bicycle push bc ; restart sound @@ -664,16 +696,18 @@ FadeMusic: ; e8358 .fadein ; are we done? - cp a, $07 + cp $7 jr nc, .maxvolume ; inc volume inc a jr .updatevolume + .maxvolume ; we're done xor a ld [MusicFade], a ret + .updatevolume ; hi = lo ld d, a @@ -681,13 +715,14 @@ FadeMusic: ; e8358 or d ld [Volume], a ret + ; e83d1 LoadNote: ; e83d1 ; check mute?? ld hl, Channel1Flags2 - Channel1 add hl, bc - bit 1, [hl] + bit SOUND_UNKN_09, [hl] ret z ; get note duration ld hl, Channel1NoteDuration - Channel1 @@ -696,7 +731,7 @@ LoadNote: ; e83d1 ld hl, wc297 ; ???? sub [hl] jr nc, .ok - ld a, $01 + ld a, 1 .ok ld [hl], a ; get frequency @@ -706,23 +741,23 @@ LoadNote: ; e83d1 inc hl ld d, [hl] ; ???? - ld hl, $0021 + ld hl, Channel1Field0x21 - Channel1 add hl, bc ld a, e sub [hl] ld e, a ld a, d - sbc a, $00 + sbc a, 0 ld d, a ; ???? - ld hl, $0022 + ld hl, Channel1Field0x22 - Channel1 add hl, bc sub [hl] - jr nc, .asm_e8420 + jr nc, .greater_than ; ???? ld hl, Channel1Flags3 - Channel1 add hl, bc - set 1, [hl] + set SOUND_UNKN_11, [hl] ; get frequency ld hl, Channel1Frequency - Channel1 add hl, bc @@ -730,26 +765,27 @@ LoadNote: ; e83d1 inc hl ld d, [hl] ; ???? - ld hl, $0021 + ld hl, Channel1Field0x21 - Channel1 add hl, bc ld a, [hl] sub e ld e, a ld a, d - sbc a, $00 + sbc a, 0 ld d, a ; ???? - ld hl, $0022 + ld hl, Channel1Field0x22 - Channel1 add hl, bc ld a, [hl] sub d ld d, a - jr .asm_e843e -.asm_e8420 + jr .resume + +.greater_than ; ???? ld hl, Channel1Flags3 - Channel1 add hl, bc - res 1, [hl] + res SOUND_UNKN_11, [hl] ; get frequency ld hl, Channel1Frequency - Channel1 add hl, bc @@ -757,23 +793,23 @@ LoadNote: ; e83d1 inc hl ld d, [hl] ; ???? - ld hl, $0021 + ld hl, Channel1Field0x21 - Channel1 add hl, bc ld a, e sub [hl] ld e, a ld a, d - sbc a, $00 + sbc a, 0 ld d, a ; ???? - ld hl, $0022 + ld hl, Channel1Field0x22 - Channel1 add hl, bc sub [hl] ld d, a -.asm_e843e +.resume push bc ld hl, wc297 - ld b, $00 ; loop count + ld b, 0; loop count .loop inc b ld a, e @@ -785,62 +821,64 @@ LoadNote: ; e83d1 jr z, .quit dec d jr .loop + .quit ld a, e ; result add [hl] ld d, b ; loop count ; ???? pop bc - ld hl, $0023 + ld hl, Channel1Field0x23 - Channel1 add hl, bc ld [hl], d - ld hl, $0024 + ld hl, Channel1Field0x24 - Channel1 add hl, bc ld [hl], a ; clear ???? - ld hl, $0025 + ld hl, Channel1Field0x25 - Channel1 add hl, bc xor a ld [hl], a ret + ; e8466 Functione8466: ; e8466 ; handle vibrato and other things -; unknowns: wc292, wc294 +; unknowns: wCurTrackDuty, wCurTrackFrequency ld hl, Channel1Flags2 - Channel1 add hl, bc - bit 2, [hl] + bit SOUND_DUTY, [hl] ; duty jr z, .next - ld hl, $001c + ld hl, Channel1Field0x1c - Channel1 add hl, bc ld a, [hl] rlca rlca ld [hl], a - and a, $c0 - ld [wc292], a + and $c0 + ld [wCurTrackDuty], a ld hl, Channel1NoteFlags - Channel1 add hl, bc - set 0, [hl] + set NOTE_UNKN_0, [hl] .next ld hl, Channel1Flags2 - Channel1 add hl, bc - bit 4, [hl] + bit SOUND_CRY_PITCH, [hl] jr z, .vibrato ld hl, Channel1CryPitch - Channel1 add hl, bc ld e, [hl] inc hl ld d, [hl] - ld hl, wc294 + ld hl, wCurTrackFrequency ld a, [hli] ld h, [hl] ld l, a add hl, de ld e, l ld d, h - ld hl, wc294 + ld hl, wCurTrackFrequency ld [hl], e inc hl ld [hl], d @@ -848,7 +886,7 @@ Functione8466: ; e8466 ; is vibrato on? ld hl, Channel1Flags2 - Channel1 add hl, bc - bit 0, [hl] ; vibrato + bit SOUND_VIBRATO, [hl] ; vibrato jr z, .quit ; is vibrato active for this note yet? ; is the delay over? @@ -869,11 +907,12 @@ Functione8466: ; e8466 ld hl, Channel1VibratoRate - Channel1 add hl, bc ld a, [hl] - and a, $0f ; count + and $f ; count jr z, .toggle .subexit dec [hl] jr .quit + .toggle ; refresh count ld a, [hl] @@ -881,52 +920,54 @@ Functione8466: ; e8466 or [hl] ld [hl], a ; ???? - ld a, [wc294] + ld a, [wCurTrackFrequency] ld e, a ; toggle vibrato up/down ld hl, Channel1Flags3 - Channel1 add hl, bc - bit 0, [hl] ; vibrato up/down + bit SOUND_VIBRATO_DIR, [hl] ; vibrato up/down jr z, .down ; up ; vibrato down - res 0, [hl] + res SOUND_VIBRATO_DIR, [hl] ; get the delay ld a, d - and a, $0f ; lo + and $f ; lo ; ld d, a ld a, e sub d jr nc, .asm_e84ef - ld a, $00 + ld a, 0 jr .asm_e84ef + .down ; vibrato up - set 0, [hl] + set SOUND_VIBRATO_DIR, [hl] ; get the delay ld a, d - and a, $f0 ; hi + and $f0 ; hi swap a ; move it to lo ; add e jr nc, .asm_e84ef ld a, $ff .asm_e84ef - ld [wc294], a + ld [wCurTrackFrequency], a ; ld hl, Channel1NoteFlags - Channel1 add hl, bc - set 6, [hl] + set NOTE_UNKN_6, [hl] .quit ret + ; e84f9 Functione84f9: ; e84f9 ; quit if ???? ld hl, Channel1Flags2 - Channel1 add hl, bc - bit 1, [hl] + bit SOUND_UNKN_09, [hl] ret z ; de = Frequency ld hl, Channel1Frequency - Channel1 @@ -937,72 +978,73 @@ Functione84f9: ; e84f9 ; ld hl, Channel1Flags3 - Channel1 add hl, bc - bit 1, [hl] + bit SOUND_UNKN_11, [hl] jr z, .next ; - ld hl, $0023 + ld hl, Channel1Field0x23 - Channel1 add hl, bc ld l, [hl] - ld h, $00 + ld h, 0 add hl, de ld d, h ld e, l ; get ???? - ld hl, $0024 + ld hl, Channel1Field0x24 - Channel1 add hl, bc ld a, [hl] ; add it to ???? - ld hl, $0025 + ld hl, Channel1Field0x25 - Channel1 add hl, bc add [hl] ld [hl], a - ld a, $00 + ld a, 0 adc e ld e, a - ld a, $00 + ld a, 0 adc d ld d, a ; - ld hl, $0022 + ld hl, Channel1Field0x22 - Channel1 add hl, bc ld a, [hl] cp d jp c, .quit1 jr nz, .quit2 - ld hl, $0021 + ld hl, Channel1Field0x21 - Channel1 add hl, bc ld a, [hl] cp e jp c, .quit1 jr .quit2 + .next ld a, e - ld hl, $0023 + ld hl, Channel1Field0x23 - Channel1 add hl, bc ld e, [hl] sub e ld e, a ld a, d - sbc a, $00 + sbc a, 0 ld d, a - ld hl, $0024 + ld hl, Channel1Field0x24 - Channel1 add hl, bc ld a, [hl] add a ld [hl], a ld a, e - sbc a, $00 + sbc a, 0 ld e, a ld a, d - sbc a, $00 + sbc a, 0 ld d,a - ld hl, $0022 + ld hl, Channel1Field0x22 - Channel1 add hl, bc ld a, d cp [hl] jr c, .quit1 jr nz, .quit2 - ld hl, $0021 + ld hl, Channel1Field0x21 - Channel1 add hl, bc ld a, e cp [hl] @@ -1010,11 +1052,12 @@ Functione84f9: ; e84f9 .quit1 ld hl, Channel1Flags2 - Channel1 add hl, bc - res 1, [hl] + res SOUND_UNKN_09, [hl] ld hl, Channel1Flags3 - Channel1 add hl, bc - res 1, [hl] + res SOUND_UNKN_11, [hl] ret + .quit2 ld hl, Channel1Frequency - Channel1 add hl, bc @@ -1023,16 +1066,17 @@ Functione84f9: ; e84f9 ld [hl], d ld hl, Channel1NoteFlags - Channel1 add hl, bc - set 1, [hl] - set 0, [hl] + set NOTE_UNKN_1, [hl] + set NOTE_UNKN_0, [hl] ret + ; e858c HandleNoise: ; e858c ; is noise sampling on? ld hl, Channel1Flags - Channel1 add hl, bc - bit 4, [hl] ; noise sampling + bit SOUND_NOISE, [hl] ; noise sampling ret z ; are we in a sfx channel? ld a, [CurChannel] @@ -1040,19 +1084,20 @@ HandleNoise: ; e858c jr nz, .next ; is ch8 on? (noise) ld hl, Channel8Flags - bit 0, [hl] ; on? + bit SOUND_CHANNEL_ON, [hl] ; on? jr z, .next ; is ch8 playing noise? - bit 4, [hl] + bit SOUND_NOISE, [hl] ret nz ; quit if so ; .next - ld a, [wc2a2] + ld a, [wNoiseSampleDelay] and a jr z, ReadNoiseSample dec a - ld [wc2a2], a + ld [wNoiseSampleDelay], a ret + ; e85af ReadNoiseSample: ; e85af @@ -1082,15 +1127,15 @@ ReadNoiseSample: ; e85af and $f inc a - ld [wc2a2], a + ld [wNoiseSampleDelay], a ld a, [de] inc de - ld [wc293], a + ld [wCurTrackIntensity], a ld a, [de] inc de - ld [wc294], a + ld [wCurTrackFrequency], a xor a - ld [wc295], a + ld [wCurTrackFrequency + 1], a ld hl, NoiseSampleAddress ld [hl], e @@ -1099,18 +1144,20 @@ ReadNoiseSample: ; e85af ld hl, Channel1NoteFlags - Channel1 add hl, bc - set 4, [hl] + set NOTE_UNKN_4, [hl] ret + .quit ret + ; e85e1 ParseMusic: ; e85e1 ; parses until a note is read or the song is ended call GetMusicByte ; store next byte in a - cp a, $ff ; is the song over? - jr z, .readff - cp a, $d0 ; is it a note? + cp $ff ; is the song over? + jr z, .endchannel + cp $d0 ; is it a note? jr c, .readnote ; then it's a command .readcommand @@ -1122,22 +1169,22 @@ ParseMusic: ; e85e1 ; special notes ld hl, Channel1Flags - Channel1 add hl, bc - bit 3, [hl] + bit SOUND_SFX, [hl] jp nz, Functione8698 - bit 5, [hl] + bit SOUND_REST, [hl] ; rest jp nz, Functione8698 - bit 4, [hl] ; noise sample + bit SOUND_NOISE, [hl] ; noise sample jp nz, GetNoiseSample ; normal note ; set note duration (bottom nybble) ld a, [CurMusicByte] - and a, $0f + and $f call SetNoteDuration ; get note pitch (top nybble) ld a, [CurMusicByte] swap a - and a, $0f - jr z, .rest ; pitch $0 -> rest + and $f + jr z, .rest ; pitch 0-> rest ; update pitch ld hl, Channel1Pitch - Channel1 add hl, bc @@ -1158,37 +1205,41 @@ ParseMusic: ; e85e1 ; ???? ld hl, Channel1NoteFlags - Channel1 add hl, bc - set 4, [hl] + set NOTE_UNKN_4, [hl] jp LoadNote + + + .rest ; note = rest ld hl, Channel1NoteFlags - Channel1 add hl, bc - set 5, [hl] ; Rest + set NOTE_REST, [hl] ; Rest ret + ; -.readff +.endchannel ; $ff is reached in music data ld hl, Channel1Flags - Channel1 add hl, bc - bit 1, [hl] ; in a subroutine? + bit SOUND_SUBROUTINE, [hl] ; in a subroutine? jr nz, .readcommand ; execute ld a, [CurChannel] - cp a, $04 ; channels 0-3? - jr nc, .asm_e8651 + cp $4 ; channels 0-3? + jr nc, .chan_5to8 ; ???? - ld hl, $00cb + ld hl, Channel5Flags - Channel1 add hl, bc - bit 0, [hl] + bit SOUND_CHANNEL_ON, [hl] jr nz, .ok -.asm_e8651 +.chan_5to8 ld hl, Channel1Flags - Channel1 add hl, bc - bit 5, [hl] + bit SOUND_REST, [hl] call nz, RestoreVolume ; end music ld a, [CurChannel] - cp a, $04 ; channel 5? + cp $4 ; channel 5? jr nz, .ok ; ???? xor a @@ -1198,11 +1249,11 @@ ParseMusic: ; e85e1 ; turn channel off ld hl, Channel1Flags - Channel1 add hl, bc - res 0, [hl] + res SOUND_CHANNEL_ON, [hl] ; note = rest ld hl, Channel1NoteFlags - Channel1 add hl, bc - set 5, [hl] + set NOTE_REST, [hl] ; clear music id & bank ld hl, Channel1MusicID - Channel1 add hl, bc @@ -1211,12 +1262,13 @@ ParseMusic: ; e85e1 ld [hli], a ; id lo ld [hli], a ; bank ret + ; e8679 RestoreVolume: ; e8679 ; ch5 only ld a, [CurChannel] - cp a, $04 + cp $4 ret nz xor a ld hl, Channel6CryPitch @@ -1231,13 +1283,14 @@ RestoreVolume: ; e8679 ld [LastVolume], a ld [SFXPriority], a ret + ; e8698 Functione8698: ; e8698 ; turn noise sampling on ld hl, Channel1NoteFlags - Channel1 add hl, bc - set 4, [hl] ; noise sample + set NOTE_UNKN_4, [hl] ; noise sample ; update note duration ld a, [CurMusicByte] call SetNoteDuration ; top nybble doesnt matter? @@ -1253,8 +1306,8 @@ Functione8698: ; e8698 ld [hl], a ; are we on the last channel? (noise sampling) ld a, [CurChannel] - and a, $03 - cp a, $03 + and $3 + cp $3 ret z ; update hi frequency from next param call GetMusicByte @@ -1262,35 +1315,37 @@ Functione8698: ; e8698 add hl, bc ld [hl], a ret + ; e86c5 GetNoiseSample: ; e86c5 ; load ptr to sample header in NoiseSampleAddress ; are we on the last channel? ld a, [CurChannel] - and a, $03 - cp a, $03 + and $3 + cp $3 ; ret if not ret nz ; update note duration ld a, [CurMusicByte] - and a, $0f + and $f call SetNoteDuration ; check current channel ld a, [CurChannel] bit 2, a ; are we in a sfx channel? jr nz, .sfx ld hl, Channel8Flags - bit 0, [hl] ; is ch8 on? (noise) + bit SOUND_CHANNEL_ON, [hl] ; is ch8 on? (noise) ret nz ld a, [MusicNoiseSampleSet] jr .next + .sfx ld a, [SFXNoiseSampleSet] .next ; load noise sample set id into de ld e, a - ld d, $00 + ld d, 0 ; load ptr to noise sample set in hl ld hl, Drumkits rept 2 @@ -1303,11 +1358,11 @@ endr ld a, [CurMusicByte] swap a ; non-rest note? - and a, $0f + and $f ret z ; use 'pitch' to seek noise sample set ld e, a - ld d, $00 + ld d, 0 rept 2 add hl, de endr @@ -1318,8 +1373,9 @@ endr ld [NoiseSampleAddressHi], a ; clear ???? xor a - ld [wc2a2], a + ld [wNoiseSampleDelay], a ret + ; e870f ParseMusicCommand: ; e870f @@ -1328,7 +1384,7 @@ ParseMusicCommand: ; e870f ; get command # sub a, $d0 ; first command ld e, a - ld d, $00 + ld d, 0 ; seek command pointer ld hl, MusicCommands rept 2 @@ -1339,44 +1395,45 @@ endr ld h, [hl] ld l, a jp [hl] + ; e8720 MusicCommands: ; e8720 ; pointer to each command in order ; octaves - dw MusicD0 ; octave 8 - dw MusicD1 ; octave 7 - dw MusicD2 ; octave 6 - dw MusicD3 ; octave 5 - dw MusicD4 ; octave 4 - dw MusicD5 ; octave 3 - dw MusicD6 ; octave 2 - dw MusicD7 ; octave 1 - dw MusicD8 ; note length + intensity - dw MusicD9 ; set starting octave - dw MusicDA ; tempo - dw MusicDB ; duty cycle - dw MusicDC ; intensity - dw MusicDD ; update sound status + dw Music_Octave8 ; octave 8 + dw Music_Octave7 ; octave 7 + dw Music_Octave6 ; octave 6 + dw Music_Octave5 ; octave 5 + dw Music_Octave4 ; octave 4 + dw Music_Octave3 ; octave 3 + dw Music_Octave2 ; octave 2 + dw Music_Octave1 ; octave 1 + dw Music_NoteType ; note length + intensity + dw Music_ForceOctave ; set starting octave + dw Music_Tempo ; tempo + dw Music_DutyCycle ; duty cycle + dw Music_Intensity ; intensity + dw Music_SoundStatus ; update sound status dw MusicDE ; ???? + duty cycle - dw MusicDF ; + dw Music_ToggleSFX ; dw MusicE0 ; - dw MusicE1 ; vibrato - dw MusicE2 ; - dw MusicE3 ; music noise sampling - dw MusicE4 ; force panning - dw MusicE5 ; volume - dw MusicE6 ; tune - dw MusicE7 ; - dw MusicE8 ; - dw MusicE9 ; global tempo - dw MusicEA ; restart current channel from header - dw MusicEB ; new song - dw MusicEC ; sfx priority on - dw MusicED ; sfx priority off - dw MusicEE ; - dw MusicEF ; stereo panning - dw MusicF0 ; sfx noise sampling + dw Music_Vibrato ; vibrato + dw MusicE2 ; unused + dw Music_ToggleNoise ; music noise sampling + dw Music_Panning ; force panning + dw Music_Volume ; volume + dw Music_Tone ; tune + dw MusicE7 ; unused + dw MusicE8 ; unused + dw Music_TempoRelative ; global tempo + dw Music_RestartChannel ; restart current channel from header + dw Music_NewSong ; new song + dw Music_SFXPriorityOn ; sfx priority on + dw Music_SFXPriorityOff ; sfx priority off + dw MusicEE ; unused + dw Music_StereoPanning ; stereo panning + dw Music_SFXToggleNoise ; sfx noise sampling dw MusicF1 ; nothing dw MusicF2 ; nothing dw MusicF3 ; nothing @@ -1385,13 +1442,13 @@ MusicCommands: ; e8720 dw MusicF6 ; nothing dw MusicF7 ; nothing dw MusicF8 ; nothing - dw MusicF9 ; - dw MusicFA ; - dw MusicFB ; - dw MusicFC ; jump - dw MusicFD ; loop - dw MusicFE ; call - dw MusicFF ; return + dw MusicF9 ; unused + dw Music_SetCondition ; + dw Music_JumpIf ; + dw Music_JumpChannel ; jump + dw Music_LoopChannel ; loop + dw Music_CallChannel ; call + dw Music_EndChannel ; return ; e8780 MusicF1: ; e8780 @@ -1403,16 +1460,17 @@ MusicF6: ; e8780 MusicF7: ; e8780 MusicF8: ; e8780 ret + ; e8781 -MusicFF: ; e8781 +Music_EndChannel: ; e8781 ; called when $ff is encountered w/ subroutine flag set ; end music stream ; return to caller of the subroutine ; reset subroutine flag ld hl, Channel1Flags - Channel1 add hl, bc - res 1, [hl] + res SOUND_SUBROUTINE, [hl] ; copy LastMusicAddress to MusicAddress ld hl, Channel1LastMusicAddress - Channel1 add hl, bc @@ -1425,9 +1483,10 @@ MusicFF: ; e8781 inc hl ld [hl], d ret + ; e8796 -MusicFE: ; e8796 +Music_CallChannel: ; e8796 ; call music stream (subroutine) ; parameters: ll hh ; pointer to subroutine ; get pointer from next 2 bytes @@ -1457,11 +1516,12 @@ MusicFE: ; e8796 ; set subroutine flag ld hl, Channel1Flags - Channel1 add hl, bc - set 1, [hl] + set SOUND_SUBROUTINE, [hl] ret + ; e87bc -MusicFC: ; e87bc +Music_JumpChannel: ; e87bc ; jump ; parameters: ll hh ; pointer ; get pointer from next 2 bytes @@ -1475,9 +1535,10 @@ MusicFC: ; e87bc inc hl ld [hl], d ret + ; e87cc -MusicFD: ; e87cc +Music_LoopChannel: ; e87cc ; loops xx - 1 times ; 00: infinite ; params: 3 @@ -1489,13 +1550,13 @@ MusicFD: ; e87cc call GetMusicByte ld hl, Channel1Flags - Channel1 add hl, bc - bit 2, [hl] ; has the loop been initiated? + bit SOUND_LOOPING, [hl] ; has the loop been initiated? jr nz, .checkloop and a ; loop counter 0 = infinite jr z, .loop ; initiate loop dec a - set 2, [hl] ; set loop flag + set SOUND_LOOPING, [hl] ; set loop flag ld hl, Channel1LoopCount - Channel1 add hl, bc ld [hl], a ; store loop counter @@ -1524,7 +1585,7 @@ MusicFD: ; e87cc ; reset loop flag ld hl, Channel1Flags - Channel1 add hl, bc - res 2, [hl] + res SOUND_LOOPING, [hl] ; skip to next command ld hl, Channel1MusicAddress - Channel1 add hl, bc @@ -1537,9 +1598,10 @@ MusicFD: ; e87cc dec hl ld [hl], e ret + ; e880e -MusicFA: ; e880e +Music_SetCondition: ; e880e ; set condition for a jump ; used with FB ; params: 1 @@ -1551,9 +1613,10 @@ MusicFA: ; e880e add hl, bc ld [hl], a ret + ; e8817 -MusicFB: ; e8817 +Music_JumpIf: ; e8817 ; conditional jump ; used with FA ; params: 3 @@ -1584,6 +1647,7 @@ endr dec hl ld [hl], e ret + .jump ; jump to the new address ; get pointer @@ -1598,6 +1662,7 @@ endr inc hl ld [hl], d ret + ; e883e MusicEE; e883e @@ -1610,11 +1675,11 @@ MusicEE; e883e ; if ????, jump ; get channel ld a, [CurChannel] - and a, $03 ; ch0-3 + and $3 ; ch0-3 ld e, a - ld d, $00 - ; hl = wc2b8 + channel id - ld hl, wc2b8 + ld d, 0 + ; hl = Channel1JumpCondition + channel id + ld hl, Channel1JumpCondition add hl, de ; if set, jump ld a, [hl] @@ -1636,9 +1701,10 @@ endr dec hl ld [hl], e ret + .jump ; reset jump flag - ld [hl], $00 + ld [hl], 0 ; de = pointer call GetMusicByte ld e, a @@ -1651,31 +1717,34 @@ endr inc hl ld [hl], d ret + ; e886d MusicF9: ; e886d ; sets some flag ; seems to be unused ; params: 0 - ld a, $01 + ld a, 1 ld [wc2b5], a ret + ; e8873 MusicE2: ; e8873 ; seems to have been dummied out ; params: 1 call GetMusicByte - ld hl, $002c + ld hl, Channel1Field0x2c - Channel1 add hl, bc ld [hl], a ld hl, Channel1Flags2 - Channel1 add hl, bc - set 3, [hl] + set SOUND_UNKN_0B, [hl] ret + ; e8882 -MusicE1: ; e8882 +Music_Vibrato: ; e8882 ; vibrato ; params: 2 ; 1: [xx] @@ -1687,11 +1756,11 @@ MusicE1: ; e8882 ; set vibrato flag? ld hl, Channel1Flags2 - Channel1 add hl, bc - set 0, [hl] + set SOUND_VIBRATO, [hl] ; start at lower frequency (extent is positive) ld hl, Channel1Flags3 - Channel1 add hl, bc - res 0, [hl] + res SOUND_VIBRATO_DIR, [hl] ; get delay call GetMusicByte ; update delay @@ -1710,11 +1779,11 @@ MusicE1: ; e8882 add hl, bc ld d, a ; get top nybble - and a, $f0 + and $f0 swap a srl a ; halve ld e, a - adc a, $00 ; round up + adc a, 0; round up swap a or e ld [hl], a @@ -1723,12 +1792,13 @@ MusicE1: ; e8882 add hl, bc ; get bottom nybble ld a, d - and a, $0f + and $f ld d, a swap a or d ld [hl], a ret + ; e88bd MusicE0: ; e88bd @@ -1736,33 +1806,36 @@ MusicE0: ; e88bd ; params: 2 call GetMusicByte ld [wc297], a + call GetMusicByte ld d, a - and a, $0f + and $f ld e, a + ld a, d swap a - and a, $0f + and $f ld d, a call GetFrequency - ld hl, $0021 + ld hl, Channel1Field0x21 - Channel1 add hl, bc ld [hl], e - ld hl, $0022 + ld hl, Channel1Field0x22 - Channel1 add hl, bc ld [hl], d ld hl, Channel1Flags2 - Channel1 add hl, bc - set 1, [hl] + set SOUND_UNKN_09, [hl] ret + ; e88e4 -MusicE6: ; e88e4 +Music_Tone: ; e88e4 ; tone ; params: 2 ld hl, Channel1Flags2 - Channel1 add hl, bc - set 4, [hl] + set SOUND_CRY_PITCH, [hl] ld hl, Channel1CryPitch + 1 - Channel1 add hl, bc call GetMusicByte @@ -1770,19 +1843,21 @@ MusicE6: ; e88e4 call GetMusicByte ld [hl], a ret + ; e88f7 MusicE7: ; e88f7 -; shrug +; unused ; params: 1 ld hl, Channel1Flags2 - Channel1 add hl, bc - set 6, [hl] + set SOUND_UNKN_0E, [hl] call GetMusicByte - ld hl, $0029 + ld hl, Channel1Field0x29 - Channel1 add hl, bc ld [hl], a ret + ; e8906 MusicDE: ; e8906 @@ -1791,50 +1866,54 @@ MusicDE: ; e8906 ; ld hl, Channel1Flags2 - Channel1 add hl, bc - set 2, [hl] ; duty cycle + set SOUND_DUTY, [hl] ; duty cycle ; call GetMusicByte rrca rrca - ld hl, $001c + ld hl, Channel1Field0x1c - Channel1 add hl, bc ld [hl], a ; update duty cycle - and a, $c0 ; only uses top 2 bits + and $c0 ; only uses top 2 bits ld hl, Channel1DutyCycle - Channel1 add hl, bc ld [hl], a ret + ; e891e MusicE8: ; e891e -; shrug +; unused ; params: 1 ld hl, Channel1Flags2 - Channel1 add hl, bc - set 5, [hl] + set SOUND_UNKN_0D, [hl] call GetMusicByte - ld hl, $002a + ld hl, Channel1Field0x2a - Channel1 add hl, bc ld [hl], a ret + ; e892d -MusicDF: ; e892d +Music_ToggleSFX: ; e892d ; toggle something ; params: none ld hl, Channel1Flags - Channel1 add hl, bc - bit 3, [hl] + bit SOUND_SFX, [hl] jr z, .on - res 3, [hl] + res SOUND_SFX, [hl] ret + .on - set 3, [hl] + set SOUND_SFX, [hl] ret + ; e893b -MusicE3: ; e893b +Music_ToggleNoise: ; e893b ; toggle music noise sampling ; can't be used as a straight toggle since the param is not read from on->off ; params: @@ -1843,20 +1922,22 @@ MusicE3: ; e893b ; check if noise sampling is on ld hl, Channel1Flags - Channel1 add hl, bc - bit 4, [hl] + bit SOUND_NOISE, [hl] jr z, .on ; turn noise sampling off - res 4, [hl] + res SOUND_NOISE, [hl] ret + .on ; turn noise sampling on - set 4, [hl] + set SOUND_NOISE, [hl] call GetMusicByte ld [MusicNoiseSampleSet], a ret + ; e894f -MusicF0: ; e894f +Music_SFXToggleNoise: ; e894f ; toggle sfx noise sampling ; params: ; on: 1 @@ -1864,63 +1945,68 @@ MusicF0: ; e894f ; check if noise sampling is on ld hl, Channel1Flags - Channel1 add hl, bc - bit 4, [hl] + bit SOUND_NOISE, [hl] jr z, .on ; turn noise sampling off - res 4, [hl] + res SOUND_NOISE, [hl] ret + .on ; turn noise sampling on - set 4, [hl] + set SOUND_NOISE, [hl] call GetMusicByte ld [SFXNoiseSampleSet], a ret + ; e8963 -MusicD8: ; e8963 +Music_NoteType: ; e8963 ; note length ; # frames per 16th note -; intensity: see MusicDC +; intensity: see Music_Intensity ; params: 2 ; note length call GetMusicByte - ld hl, $002d + ld hl, Channel1NoteLength - Channel1 add hl, bc ld [hl], a ld a, [CurChannel] - and a, $03 - cp a, $03 + and $3 + cp CHAN4 ; CHAN8 & $3 ret z ; intensity - call MusicDC + call Music_Intensity ret + ; e8977 -MusicDD: ; e8977 +Music_SoundStatus: ; e8977 ; update sound status ; params: 1 call GetMusicByte ld [SoundInput], a ld hl, Channel1NoteFlags - Channel1 add hl, bc - set 3, [hl] + set NOTE_UNKN_3, [hl] ret + ; e8984 -MusicDB: ; e8984 +Music_DutyCycle: ; e8984 ; duty cycle ; params: 1 call GetMusicByte rrca rrca - and a, $c0 + and $c0 ld hl, Channel1DutyCycle - Channel1 add hl, bc ld [hl], a ret + ; e8991 -MusicDC: ; e8991 +Music_Intensity: ; e8991 ; intensity ; params: 1 ; hi: pressure @@ -1930,9 +2016,10 @@ MusicDC: ; e8991 add hl, bc ld [hl], a ret + ; e899a -MusicDA: ; e899a +Music_Tempo: ; e899a ; global tempo ; params: 2 ; de: tempo @@ -1942,16 +2029,17 @@ MusicDA: ; e899a ld e, a call SetGlobalTempo ret + ; e89a6 -MusicD0: ; e89a6 -MusicD1: ; e89a6 -MusicD2: ; e89a6 -MusicD3: ; e89a6 -MusicD4: ; e89a6 -MusicD5: ; e89a6 -MusicD6: ; e89a6 -MusicD7: ; e89a6 +Music_Octave8: ; e89a6 +Music_Octave7: ; e89a6 +Music_Octave6: ; e89a6 +Music_Octave5: ; e89a6 +Music_Octave4: ; e89a6 +Music_Octave3: ; e89a6 +Music_Octave2: ; e89a6 +Music_Octave1: ; e89a6 ; set octave based on lo nybble of the command ld hl, Channel1Octave - Channel1 add hl, bc @@ -1959,9 +2047,10 @@ MusicD7: ; e89a6 and 7 ld [hl], a ret + ; e89b1 -MusicD9: ; e89b1 +Music_ForceOctave: ; e89b1 ; set starting octave ; this forces all notes up by the starting octave ; params: 1 @@ -1970,21 +2059,23 @@ MusicD9: ; e89b1 add hl, bc ld [hl], a ret + ; e89ba -MusicEF: ; e89ba +Music_StereoPanning: ; e89ba ; stereo panning ; params: 1 ; stereo on? ld a, [Options] bit 5, a ; stereo - jr nz, MusicE4 + jr nz, Music_Panning ; skip param call GetMusicByte ret + ; e89c5 -MusicE4: ; e89c5 +Music_Panning: ; e89c5 ; force panning ; params: 1 call SetLRTracks @@ -1994,9 +2085,10 @@ MusicE4: ; e89c5 and [hl] ld [hl], a ret + ; e89d2 -MusicE5: ; e89d2 +Music_Volume: ; e89d2 ; set volume ; params: 1 ; see Volume @@ -2011,21 +2103,23 @@ MusicE5: ; e89d2 ; set volume ld [Volume], a ret + ; e89e1 -MusicE9: ; e89e1 +Music_TempoRelative: ; e89e1 ; set global tempo to current channel tempo +- param ; params: 1 signed call GetMusicByte ld e, a ; check sign - cp a, $80 + cp $80 jr nc, .negative ;positive - ld d, $00 + ld d, 0 jr .ok + .negative - ld d, $ff + ld d, -1 .ok ld hl, Channel1Tempo - Channel1 add hl, bc @@ -2037,25 +2131,28 @@ MusicE9: ; e89e1 ld d, h call SetGlobalTempo ret + ; e89fd -MusicEC: ; e89fd +Music_SFXPriorityOn: ; e89fd ; turn sfx priority on ; params: none - ld a, $01 + ld a, 1 ld [SFXPriority], a ret + ; e8a03 -MusicED: ; e8a03 +Music_SFXPriorityOff: ; e8a03 ; turn sfx priority off ; params: none xor a ld [SFXPriority], a ret + ; e8a08 -MusicEA: ; e8a08 +Music_RestartChannel: ; e8a08 ; restart current channel from channel header (same bank) ; params: 2 (5) ; ll hh: pointer to new channel header @@ -2088,9 +2185,10 @@ MusicEA: ; e8a08 call StartChannel pop bc ; restore current channel ret + ; e8a30 -MusicEB: ; e8a30 +Music_NewSong: ; e8a30 ; new song ; params: 2 ; de: song id @@ -2102,6 +2200,7 @@ MusicEB: ; e8a30 call _PlayMusic pop bc ret + ; e8a3e GetMusicByte: ; e8a3e @@ -2135,6 +2234,7 @@ GetMusicByte: ; e8a3e ; store channeldata in a ld a, [CurMusicByte] ret + ; e8a5d GetFrequency: ; e8a5d @@ -2151,7 +2251,7 @@ GetFrequency: ; e8a5d add hl, bc ld a, [hl] swap a ; hi nybble - and a, $0f + and $f ; add current octave add d push af ; we'll use this later @@ -2159,10 +2259,10 @@ GetFrequency: ; e8a5d ld hl, Channel1StartingOctave - Channel1 add hl, bc ld a, [hl] - and a, $0f ; lo nybble + and $f ; lo nybble ; ld l, a ; ok - ld d, $00 + ld d, 0 ld h, d add hl, de ; add current pitch add hl, hl ; skip 2 bytes for each @@ -2173,20 +2273,23 @@ GetFrequency: ; e8a5d ld d, [hl] ; get our octave pop af + ; shift right by [7 - octave] bits .loop ; [7 - octave] loops - cp a, $07 + cp $7 jr nc, .ok ; sra de sra d rr e inc a jr .loop + .ok ld a, d - and a, $07 ; top 3 bits for frequency (11 total) + and $7 ; top 3 bits for frequency (11 total) ld d, a ret + ; e8a8d SetNoteDuration: ; e8a8d @@ -2194,14 +2297,14 @@ SetNoteDuration: ; e8a8d ; store delay units in de inc a ld e, a - ld d, $00 + ld d, 0 ; store NoteLength in a ld hl, Channel1NoteLength - Channel1 add hl, bc ld a, [hl] ; multiply NoteLength by delay units - ld l, $00 ; just multiply - call MultiplySimple + ld l, 0; just multiply + call .Multiply ld a, l ; % $100 ; store Tempo in de ld hl, Channel1Tempo - Channel1 @@ -2210,16 +2313,16 @@ SetNoteDuration: ; e8a8d inc hl ld d, [hl] ; add ???? to the next result - ld hl, $0016 + ld hl, Channel1Field0x16 - Channel1 add hl, bc ld l, [hl] ; multiply Tempo by last result (NoteLength * delay % $100) - call MultiplySimple + call .Multiply ; copy result to de ld e, l ld d, h ; store result in ???? - ld hl, $0016 + ld hl, Channel1Field0x16 - Channel1 add hl, bc ld [hl], e ; store result in NoteDuration @@ -2227,13 +2330,14 @@ SetNoteDuration: ; e8a8d add hl, bc ld [hl], d ret + ; e8ab8 -MultiplySimple: ; e8ab8 +.Multiply: ; e8ab8 ; multiplies a and de ; adds the result to l ; stores the result in hl - ld h, $00 + ld h, 0 .loop ; halve a srl a @@ -2249,38 +2353,41 @@ MultiplySimple: ; e8ab8 and a jr nz, .loop ret + ; e8ac7 SetGlobalTempo: ; e8ac7 push bc ; save current channel ; are we dealing with music or sfx? ld a, [CurChannel] - cp a, $04 + cp CHAN5 jr nc, .sfxchannels ld bc, Channel1 - call SetTempo + call Tempo ld bc, Channel2 - call SetTempo + call Tempo ld bc, Channel3 - call SetTempo + call Tempo ld bc, Channel4 - call SetTempo + call Tempo jr .end + .sfxchannels ld bc, Channel5 - call SetTempo + call Tempo ld bc, Channel6 - call SetTempo + call Tempo ld bc, Channel7 - call SetTempo + call Tempo ld bc, Channel8 - call SetTempo + call Tempo .end pop bc ; restore current channel ret + ; e8b03 -SetTempo: ; e8b03 +Tempo: ; e8b03 ; input: ; de: note length ; update Tempo @@ -2291,18 +2398,20 @@ SetTempo: ; e8b03 ld [hl], d ; clear ???? xor a - ld hl, $0016 + ld hl, Channel1Field0x16 - Channel1 add hl, bc ld [hl], a ret + ; e8b11 StartChannel: ; e8b11 call SetLRTracks ld hl, Channel1Flags - Channel1 add hl, bc - set 0, [hl] ; turn channel on + set SOUND_CHANNEL_ON, [hl] ; turn channel on ret + ; e8b1b SetLRTracks: ; e8b1b @@ -2311,9 +2420,9 @@ SetLRTracks: ; e8b1b push de ; store current channel in de ld a, [CurChannel] - and a, $03 + and $3 ld e, a - ld d, $00 + ld d, 0 ; get this channel's lr tracks call GetLRTracks add hl, de ; de = channel 0-3 @@ -2324,6 +2433,7 @@ SetLRTracks: ; e8b1b ld [hl], a pop de ret + ; e8b30 _PlayMusic:: ; e8b30 @@ -2332,7 +2442,7 @@ _PlayMusic:: ; e8b30 ld hl, MusicID ld [hl], e ; song number inc hl - ld [hl], d ; MusicIDHi (always $00) + ld [hl], d ; MusicIDHi (always $) ld hl, Music add hl, de ; three add hl, de ; byte @@ -2345,7 +2455,7 @@ _PlayMusic:: ; e8b30 call LoadMusicByte ; store first byte of music header in a rlca rlca - and a, $03 ; get number of channels + and $3 ; get number of channels inc a .loop ; start playing channels @@ -2357,16 +2467,17 @@ _PlayMusic:: ; e8b30 jr nz, .loop xor a ld [wc2b5], a - ld [wc2b8], a - ld [wc2b9], a - ld [wc2ba], a - ld [wc2bb], a + ld [Channel1JumpCondition], a + ld [Channel2JumpCondition], a + ld [Channel3JumpCondition], a + ld [Channel4JumpCondition], a ld [NoiseSampleAddressLo], a ld [NoiseSampleAddressHi], a - ld [wc2a2], a + ld [wNoiseSampleDelay], a ld [MusicNoiseSampleSet], a call MusicOn ret + ; e8b79 _PlayCryHeader:: ; e8b79 @@ -2400,7 +2511,7 @@ endr ; Top 2 bits contain the number of channels rlca rlca - and a, 3 + and 3 ; For each channel: inc a @@ -2410,11 +2521,11 @@ endr ld hl, Channel1Flags - Channel1 add hl, bc - set 5, [hl] + set SOUND_REST, [hl] ld hl, Channel1Flags2 - Channel1 add hl, bc - set 4, [hl] + set SOUND_CRY_PITCH, [hl] ld hl, Channel1CryPitch - Channel1 add hl, bc @@ -2425,7 +2536,7 @@ endr ; No tempo for channel 4 ld a, [CurChannel] - and a, 3 + and 3 cp 3 jr nc, .start @@ -2454,7 +2565,7 @@ endr add hl, bc ld a, [hl] ld hl, CryTracks - and a, [hl] + and [hl] ld hl, Channel1Tracks - Channel1 add hl, bc ld [hl], a @@ -2480,18 +2591,19 @@ endr ld [SFXPriority], a call MusicOn ret + ; e8c04 _PlaySFX:: ; e8c04 ; clear channels if they aren't already call MusicOff ld hl, Channel5Flags - bit 0, [hl] ; ch5 on? + bit SOUND_CHANNEL_ON, [hl] ; ch5 on? jr z, .ch6 - res 0, [hl] ; turn it off + res SOUND_CHANNEL_ON, [hl] ; turn it off xor a ld [rNR11], a ; length/wavepattern = 0 - ld a, $08 + ld a, $8 ld [rNR12], a ; envelope = 0 xor a ld [rNR13], a ; frequency lo = 0 @@ -2502,12 +2614,12 @@ _PlaySFX:: ; e8c04 ld [rNR10], a ; sweep = 0 .ch6 ld hl, Channel6Flags - bit 0, [hl] + bit SOUND_CHANNEL_ON, [hl] jr z, .ch7 - res 0, [hl] ; turn it off + res SOUND_CHANNEL_ON, [hl] ; turn it off xor a ld [rNR21], a ; length/wavepattern = 0 - ld a, $08 + ld a, $8 ld [rNR22], a ; envelope = 0 xor a ld [rNR23], a ; frequency lo = 0 @@ -2515,13 +2627,13 @@ _PlaySFX:: ; e8c04 ld [rNR24], a ; restart sound (freq hi = 0) .ch7 ld hl, Channel7Flags - bit 0, [hl] + bit SOUND_CHANNEL_ON, [hl] jr z, .ch8 - res 0, [hl] ; turn it off + res SOUND_CHANNEL_ON, [hl] ; turn it off xor a ld [rNR30], a ; sound mode #3 off ld [rNR31], a ; length/wavepattern = 0 - ld a, $08 + ld a, $8 ld [rNR32], a ; envelope = 0 xor a ld [rNR33], a ; frequency lo = 0 @@ -2529,12 +2641,12 @@ _PlaySFX:: ; e8c04 ld [rNR34], a ; restart sound (freq hi = 0) .ch8 ld hl, Channel8Flags - bit 0, [hl] + bit SOUND_CHANNEL_ON, [hl] jr z, .chscleared - res 0, [hl] ; turn it off + res SOUND_CHANNEL_ON, [hl] ; turn it off xor a ld [rNR41], a ; length/wavepattern = 0 - ld a, $08 + ld a, $8 ld [rNR42], a ; envelope = 0 xor a ld [rNR43], a ; frequency lo = 0 @@ -2564,14 +2676,14 @@ _PlaySFX:: ; e8c04 call LoadMusicByte rlca ; top 2 rlca ; bits - and a, $03 + and $3 inc a ; # channels -> # loops .startchannels push af call LoadChannel ; bc = current channel ld hl, Channel1Flags - Channel1 add hl, bc - set 3, [hl] + set SOUND_SFX, [hl] call StartChannel pop af dec a @@ -2580,6 +2692,7 @@ _PlaySFX:: ; e8c04 xor a ld [SFXPriority], a ret + ; e8ca6 @@ -2626,14 +2739,14 @@ endr ld hl, Channel1Flags - Channel1 add hl, bc - set 3, [hl] + set SOUND_SFX, [hl] push de ; get tracks for this channel ld a, [CurChannel] and 3 ; ch1-4 ld e, a - ld d, $0 + ld d, 0 call GetLRTracks add hl, de ld a, [hl] @@ -2644,36 +2757,36 @@ endr add hl, bc ld [hl], a - ld hl, $0030 ; $c131 - Channel1 + ld hl, Channel1Field0x30 - Channel1 ; $c131 - Channel1 add hl, bc ld [hl], a ld a, [CryTracks] cp 2 ; ch 1-2 - jr c, .asm_e8d0c + jr c, .skip ; ch3-4 ld a, [wc2be] - ld hl, $002e ; $c12f - Channel1 + ld hl, Channel1Field0x2e - Channel1 ; $c12f - Channel1 add hl, bc ld [hl], a - ld hl, $002f ; $c130 - Channel1 + ld hl, Channel1Field0x2f - Channel1 ; $c130 - Channel1 add hl, bc ld [hl], a ld hl, Channel1Flags2 - Channel1 add hl, bc - set 7, [hl] + set SOUND_UNKN_0F, [hl] -.asm_e8d0c +.skip pop de ; turn channel on ld hl, Channel1Flags - Channel1 add hl, bc - set 0, [hl] ; on + set SOUND_CHANNEL_ON, [hl] ; on ; done? pop af @@ -2683,6 +2796,7 @@ endr ; we're done call MusicOn ret + ; e8d1b @@ -2693,10 +2807,10 @@ LoadChannel: ; e8d1b ; get pointer to current channel call LoadMusicByte inc de - and a, $07 ; bit 0-2 (current channel) + and $7 ; bit 0-2 (current channel) ld [CurChannel], a ld c, a - ld b, $00 + ld b, 0 ld hl, ChannelPointers rept 2 add hl, bc @@ -2706,7 +2820,7 @@ endr ld b, [hl] ; bc = channel pointer ld hl, Channel1Flags - Channel1 add hl, bc - res 0, [hl] ; channel off + res SOUND_CHANNEL_ON, [hl] ; channel off call ChannelInit ; load music pointer ld hl, Channel1MusicAddress - Channel1 @@ -2730,6 +2844,7 @@ endr ld a, [MusicBank] ld [hl], a ret + ; e8d5b ChannelInit: ; e8d5b @@ -2755,12 +2870,13 @@ ChannelInit: ; e8d5b ld [hli], a inc a ld [hl], a - ; set note length to default ($01) (fast) + ; set note length to default ($1) (fast) ld hl, Channel1NoteLength - Channel1 add hl, bc ld [hl], a pop de ret + ; e8d76 LoadMusicByte:: ; e8d76 @@ -2772,6 +2888,7 @@ LoadMusicByte:: ; e8d76 call _LoadMusicByte ld a, [CurMusicByte] ret + ; e8d80 FrequencyTable: ; e8d80 @@ -2805,16 +2922,16 @@ FrequencyTable: ; e8d80 WaveSamples: ; e8db2 ; these are streams of 32 4-bit values used as wavepatterns ; nothing interesting here! - db $02, $46, $8a, $ce, $ff, $fe, $ed, $dc, $cb, $a9, $87, $65, $44, $33, $22, $11 - db $02, $46, $8a, $ce, $ef, $ff, $fe, $ee, $dd, $cb, $a9, $87, $65, $43, $22, $11 - db $13, $69, $bd, $ee, $ee, $ff, $ff, $ed, $de, $ff, $ff, $ee, $ee, $db, $96, $31 - db $02, $46, $8a, $cd, $ef, $fe, $de, $ff, $ee, $dc, $ba, $98, $76, $54, $32, $10 - db $01, $23, $45, $67, $8a, $cd, $ee, $f7, $7f, $ee, $dc, $a8, $76, $54, $32, $10 - db $00, $11, $22, $33, $44, $33, $22, $11, $ff, $ee, $cc, $aa, $88, $aa, $cc, $ee - db $02, $46, $8a, $ce, $cb, $a9, $87, $65, $ff, $fe, $ed, $dc, $44, $33, $22, $11 - db $c0, $a9, $87, $f5, $ff, $fe, $ed, $dc, $44, $33, $22, $f1, $02, $46, $8a, $ce - db $44, $33, $22, $1f, $00, $46, $8a, $ce, $f8, $fe, $ed, $dc, $cb, $a9, $87, $65 - db $11, $00, $00, $08, $00, $13, $57, $9a, $b4, $ba, $a9, $98, $87, $65, $43, $21 + dn 0, 2, 4, 6, 8, 10, 12, 14, 15, 15, 15, 14, 14, 13, 13, 12, 12, 11, 10, 9, 8, 7, 6, 5, 4, 4, 3, 3, 2, 2, 1, 1 + dn 0, 2, 4, 6, 8, 10, 12, 14, 14, 15, 15, 15, 15, 14, 14, 14, 13, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 2, 1, 1 + dn 1, 3, 6, 9, 11, 13, 14, 14, 14, 14, 15, 15, 15, 15, 14, 13, 13, 14, 15, 15, 15, 15, 14, 14, 14, 14, 13, 11, 9, 6, 3, 1 + dn 0, 2, 4, 6, 8, 10, 12, 13, 14, 15, 15, 14, 13, 14, 15, 15, 14, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 + dn 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14, 14, 15, 7, 7, 15, 14, 14, 13, 12, 10, 8, 7, 6, 5, 4, 3, 2, 1, 0 + dn 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 3, 3, 2, 2, 1, 1, 15, 15, 14, 14, 12, 12, 10, 10, 8, 8, 10, 10, 12, 12, 14, 14 + dn 0, 2, 4, 6, 8, 10, 12, 14, 12, 11, 10, 9, 8, 7, 6, 5, 15, 15, 15, 14, 14, 13, 13, 12, 4, 4, 3, 3, 2, 2, 1, 1 + dn 12, 0, 10, 9, 8, 7, 15, 5, 15, 15, 15, 14, 14, 13, 13, 12, 4, 4, 3, 3, 2, 2, 15, 1, 0, 2, 4, 6, 8, 10, 12, 14 + dn 4, 4, 3, 3, 2, 2, 1, 15, 0, 0, 4, 6, 8, 10, 12, 14, 15, 8, 15, 14, 14, 13, 13, 12, 12, 11, 10, 9, 8, 7, 6, 5 + dn 1, 1, 0, 0, 0, 0, 0, 8, 0, 0, 1, 3, 5, 7, 9, 10, 11, 4, 11, 10, 10, 9, 9, 8, 8, 7, 6, 5, 4, 3, 2, 1 ; e8e52 Drumkits: ; e8e52 @@ -2914,209 +3031,209 @@ Drumkit5: ; e8ee0 Drum00: ; e8efa ; unused - noise $20, $11, $00 - db $ff ; end + noise C#, 1, $11, $00 + endchannel ; e8efe Snare1: ; e8efe - noise $20, $c1, $33 - db $ff ; end + noise C#, 1, $c1, $33 + endchannel ; e8f02 Snare2: ; e8f02 - noise $20, $b1, $33 - db $ff ; end + noise C#, 1, $b1, $33 + endchannel ; e8f06 Snare3: ; e8f06 - noise $20, $a1, $33 - db $ff ; end + noise C#, 1, $a1, $33 + endchannel ; e8f0a Snare4: ; e8f0a - noise $20, $81, $33 - db $ff ; end + noise C#, 1, $81, $33 + endchannel ; e8f0e Drum05: ; e8f0e - noise $27, $84, $37 - noise $26, $84, $36 - noise $25, $83, $35 - noise $24, $83, $34 - noise $23, $82, $33 - noise $22, $81, $32 - db $ff ; end + noise C#, 8, $84, $37 + noise C#, 7, $84, $36 + noise C#, 6, $83, $35 + noise C#, 5, $83, $34 + noise C#, 4, $82, $33 + noise C#, 3, $81, $32 + endchannel ; e8f21 Triangle1: ; e8f21 - noise $20, $51, $2a - db $ff ; end + noise C#, 1, $51, $2a + endchannel ; e8f25 Triangle2: ; e8f25 - noise $21, $41, $2b - noise $20, $61, $2a - db $ff ; end + noise C#, 2, $41, $2b + noise C#, 1, $61, $2a + endchannel ; e8f2c HiHat1: ; e8f2c - noise $20, $81, $10 - db $ff ; end + noise C#, 1, $81, $10 + endchannel ; e8f30 Snare5: ; e8f30 - noise $20, $82, $23 - db $ff ; end + noise C#, 1, $82, $23 + endchannel ; e8f34 Snare6: ; e8f34 - noise $20, $82, $25 - db $ff ; end + noise C#, 1, $82, $25 + endchannel ; e8f38 Snare7: ; e8f38 - noise $20, $82, $26 - db $ff ; end + noise C#, 1, $82, $26 + endchannel ; e8f3c HiHat2: ; e8f3c - noise $20, $a1, $10 - db $ff ; end + noise C#, 1, $a1, $10 + endchannel ; e8f40 HiHat3: ; e8f40 - noise $20, $a2, $11 - db $ff ; end + noise C#, 1, $a2, $11 + endchannel ; e8f44 Snare8: ; e8f44 - noise $20, $a2, $50 - db $ff ; end + noise C#, 1, $a2, $50 + endchannel ; e8f48 Triangle3: ; e8f48 - noise $20, $a1, $18 - noise $20, $31, $33 - db $ff ; end + noise C#, 1, $a1, $18 + noise C#, 1, $31, $33 + endchannel ; e8f4f Triangle4: ; e8f4f - noise $22, $91, $28 - noise $20, $71, $18 - db $ff ; end + noise C#, 3, $91, $28 + noise C#, 1, $71, $18 + endchannel ; e8f56 Snare9: ; e8f56 - noise $20, $91, $22 - db $ff ; end + noise C#, 1, $91, $22 + endchannel ; e8f5a Snare10: ; e8f5a - noise $20, $71, $22 - db $ff ; end + noise C#, 1, $71, $22 + endchannel ; e8f5e Snare11: ; e8f5e - noise $20, $61, $22 - db $ff ; end + noise C#, 1, $61, $22 + endchannel ; e8f62 Drum20: ; e8f62 - noise $20, $11, $11 - db $ff ; end + noise C#, 1, $11, $11 + endchannel ; e8f66 Drum21: ; e8f66 - db $ff + endchannel ; e8f67 Snare12: ; e8f67 - noise $20, $91, $33 - db $ff ; end + noise C#, 1, $91, $33 + endchannel ; e8f6b Snare13: ; e8f6b - noise $20, $51, $32 - db $ff ; end + noise C#, 1, $51, $32 + endchannel ; e8f6f Snare14: ; e8f6f - noise $20, $81, $31 - db $ff ; end + noise C#, 1, $81, $31 + endchannel ; e8f73 Kick1: ; e8f73 - noise $20, $88, $6b - noise $20, $71, $00 - db $ff ; end + noise C#, 1, $88, $6b + noise C#, 1, $71, $00 + endchannel ; e8f7a Triangle5: ; e8f7a - noise $30, $91, $18 - db $ff ; end + noise D_, 1, $91, $18 + endchannel ; e8f7e Drum27: ; e8f7e - noise $27, $92, $10 - db $ff ; end + noise C#, 8, $92, $10 + endchannel ; e8f82 Drum28: ; e8f82 - noise $33, $91, $00 - noise $33, $11, $00 - db $ff ; end + noise D_, 4, $91, $00 + noise D_, 4, $11, $00 + endchannel ; e8f89 Drum29: ; e8f89 - noise $33, $91, $11 - noise $33, $11, $00 - db $ff ; end + noise D_, 4, $91, $11 + noise D_, 4, $11, $00 + endchannel ; e8f90 Crash1: ; e8f90 - noise $33, $88, $15 - noise $20, $65, $12 - db $ff ; end + noise D_, 4, $88, $15 + noise C#, 1, $65, $12 + endchannel ; e8f97 Drum31: ; e8f97 - noise $33, $51, $21 - noise $33, $11, $11 - db $ff ; end + noise D_, 4, $51, $21 + noise D_, 4, $11, $11 + endchannel ; e8f9e Drum32: ; e8f9e - noise $33, $51, $50 - noise $33, $11, $11 - db $ff ; end + noise D_, 4, $51, $50 + noise D_, 4, $11, $11 + endchannel ; e8fa5 Drum33: ; e8fa5 - noise $20, $a1, $31 - db $ff ; end + noise C#, 1, $a1, $31 + endchannel ; e8fa9 Crash2: ; e8fa9 - noise $20, $84, $12 - db $ff ; end + noise C#, 1, $84, $12 + endchannel ; e8fad Drum35: ; e8fad - noise $33, $81, $00 - noise $33, $11, $00 - db $ff ; end + noise D_, 4, $81, $00 + noise D_, 4, $11, $00 + endchannel ; e8fb4 Drum36: ; e8fb4 - noise $33, $81, $21 - noise $33, $11, $11 - db $ff ; end + noise D_, 4, $81, $21 + noise D_, 4, $11, $11 + endchannel ; e8fbb Kick2: ; e8fbb - noise $20, $a8, $6b - noise $20, $71, $00 - db $ff ; end + noise C#, 1, $a8, $6b + noise C#, 1, $71, $00 + endchannel ; e8fc2 GetLRTracks: ; e8fc2 @@ -3128,9 +3245,11 @@ GetLRTracks: ; e8fc2 jr nz, .stereo ld hl, MonoTracks ret + .stereo ld hl, StereoTracks ret + ; e8fd1 MonoTracks: ; e8fd1 @@ -3170,12 +3289,13 @@ endr ld a, $80 ld [hli], a ld hl, rNR10 - ld e, $04 + ld e, $4 .loop call ClearChannel dec e jr nz, .loop ret + ; e8ffe ClearChannel: ; e8ffe @@ -3187,11 +3307,12 @@ ClearChannel: ; e8ffe ld [hli], a ; rNR10, rNR20, rNR30, rNR40 ; sweep = 0 ld [hli], a ; rNR11, rNR21, rNR31, rNR41 ; length/wavepattern = 0 - ld a, $08 + ld a, $8 ld [hli], a ; rNR12, rNR22, rNR32, rNR42 ; envelope = 0 xor a ld [hli], a ; rNR13, rNR23, rNR33, rNR43 ; frequency lo = 0 ld a, $80 ld [hli], a ; rNR14, rNR24, rNR34, rNR44 ; restart sound (freq hi = 0) ret + ; e900a |