diff options
author | yenatch <yenatch@gmail.com> | 2014-01-06 22:34:14 -0500 |
---|---|---|
committer | yenatch <yenatch@gmail.com> | 2014-01-06 22:34:14 -0500 |
commit | 94d755003ebd0abee80e276f2af964a453ec3ca1 (patch) | |
tree | f58c9efc10c810392f921e87dfeab0cd17f5d6b5 | |
parent | 65245542c7e6f8b1c0bdb46354285dbde32c67ab (diff) |
split out the audio engines
-rw-r--r-- | audio/engine_1.asm | 1682 | ||||
-rw-r--r-- | audio/engine_2.asm | 1733 | ||||
-rw-r--r-- | audio/engine_3.asm | 1682 | ||||
-rwxr-xr-x | main.asm | 5082 |
4 files changed, 5100 insertions, 5079 deletions
diff --git a/audio/engine_1.asm b/audio/engine_1.asm new file mode 100644 index 00000000..0d60308a --- /dev/null +++ b/audio/engine_1.asm @@ -0,0 +1,1682 @@ +; The first of three duplicated sound engines. + +Func_9103: ; 0x9103 + ld c, CH0 +.loop + ld b, $0 + ld hl, $c026 + 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, [$c002] + and a + jr z, .asm_912e + bit 7, a + jr nz, .nextChannel + set 7, a + ld [$c002], a + xor a + ld [$ff00+$25], a + ld [$ff00+$1a], a + ld a, $80 + ld [$ff00+$1a], a + jr .nextChannel +.asm_912e + call Music2_ApplyMusicAffects +.nextChannel + ld a, c + inc c ; inc channel number + cp CH7 + jr nz, .loop + ret + +; this routine checks flags for music effects currently applied +; to the channel and calls certain functions based on flags. +; known flags for $c02e: +; 1: call has been used +; 3: a toggle used only by this routine for vibrato +; 4: pitchbend flag +; 6: dutycycle flag +Music2_ApplyMusicAffects: ; 0x9138 + ld b, $0 + ld hl, $c0b6 ; delay unitl next note + add hl, bc + ld a, [hl] + cp $1 ; if the delay is 1, play next note + jp z, Music2_PlayNextNote + dec a ; otherwise, decrease the delay timer + ld [hl], a + ld a, c + cp CH4 + jr nc, .startChecks ; if a sfx channel + ld hl, $c02a + add hl, bc + ld a, [hl] + and a + jr z, .startChecks + ret +.startChecks + ld hl, $c02e + add hl, bc + bit 6, [hl] ; dutycycle + jr z, .checkForExecuteMusic + call Music2_ApplyDutyCycle +.checkForExecuteMusic + ld b, $0 + ld hl, $c036 + add hl, bc + bit 0, [hl] + jr nz, .checkForPitchBend + ld hl, $c02e + add hl, bc + bit 2, [hl] + jr nz, .disablePitchBendVibrato +.checkForPitchBend + ld hl, $c02e + add hl, bc + bit 4, [hl] ; pitchbend + jr z, .checkVibratoDelay + jp Music2_ApplyPitchBend +.checkVibratoDelay + ld hl, $c04e ; vibrato delay + add hl, bc + ld a, [hl] + and a ; check if delay is over + jr z, .checkForVibrato + dec [hl] ; otherwise, dec delay +.disablePitchBendVibrato + ret +.checkForVibrato + ld hl, $c056 ; vibrato rate + add hl, bc + ld a, [hl] + and a + jr nz, .vibrato + ret ; no vibrato +.vibrato + ld d, a + ld hl, $c05e + add hl, bc + ld a, [hl] + and $f + and a + jr z, .vibratoAlreadyDone + dec [hl] ; apply vibrato pitch change + ret +.vibratoAlreadyDone + ld a, [hl] + swap [hl] + or [hl] + ld [hl], a ; reset the vibrato value and start again + ld hl, $c066 + add hl, bc + ld e, [hl] ; get note pitch + ld hl, $c02e + 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] + ld a, d + and $f + ld d, a + ld a, e + sub d + jr nc, .noCarry + ld a, $0 +.noCarry + jr .done +.unset + set 3, [hl] + ld a, d + and $f0 + swap a + add e + jr nc, .done + ld a, $ff +.done + ld d, a + ld b, $3 + call Func_9838 + ld [hl], d + ret + +; this routine executes all music commands that take up no time, +; like tempo changes, duty changes etc. and doesn't return +; until the first note is reached +Music2_PlayNextNote ; 0x91d0 + ld hl, $c06e + add hl, bc + ld a, [hl] + ld hl, $c04e + add hl, bc + ld [hl], a + ld hl, $c02e + add hl, bc + res 4, [hl] + res 5, [hl] + call Music2_endchannel + ret + +Music2_endchannel: ; 0x91e6 + call Music2_GetNextMusicByte + ld d, a + cp $ff ; is this command an endchannel? + jp nz, Music2_callchannel ; no + ld b, $0 ; yes + ld hl, $c02e + add hl, bc + bit 1, [hl] + jr nz, .returnFromCall + ld a, c + cp CH3 + jr nc, .noiseOrSfxChannel + jr .asm_923f +.noiseOrSfxChannel + res 2, [hl] + ld hl, $c036 + add hl, bc + res 0, [hl] + cp CH6 + jr nz, .notSfxChannel3 + ld a, $0 + ld [$ff00+$1a], a + ld a, $80 + ld [$ff00+$1a], a +.notSfxChannel3 + jr nz, .asm_9222 + ld a, [$c003] + and a + jr z, .asm_9222 + xor a + ld [$c003], a + jr .asm_923f +.asm_9222 + jr .asm_9248 +.returnFromCall + res 1, [hl] + ld d, $0 + ld a, c + add a + ld e, a + ld hl, $c006 + add hl, de + push hl ; store current channel address + ld hl, $c016 + add hl, de + ld e, l + ld d, h + pop hl + ld a, [de] + ld [hli], a + inc de + ld a, [de] + ld [hl], a ; loads channel address to return to + jp Music2_endchannel +.asm_923f + ld hl, Unknown_9b1f + add hl, bc + ld a, [$ff00+$25] + and [hl] + ld [$ff00+$25], a +.asm_9248 + ld a, [$c02a] + cp $14 + jr nc, .asm_9251 + jr .asm_926e +.asm_9251 + ld a, [$c02a] + cp $86 + jr z, .asm_926e + jr c, .asm_925c + jr .asm_926e +.asm_925c + ld a, c + cp CH4 + jr z, .asm_9265 + call Func_96c7 + ret c +.asm_9265 + ld a, [$c005] + ld [$ff00+$24], a + xor a + ld [$c005], a +.asm_926e + ld hl, $c026 + add hl, bc + ld [hl], b + ret + +Music2_callchannel: ; 0x9274 + cp $fd ; is this command a callchannel? + jp nz, Music2_loopchannel ; no + call Music2_GetNextMusicByte ; yes + push af + call Music2_GetNextMusicByte + ld d, a + pop af + ld e, a + push de ; store pointer + ld d, $0 + ld a, c + add a + ld e, a + ld hl, $c006 + add hl, de + push hl + ld hl, $c016 + add hl, de + ld e, l + ld d, h + pop hl + ld a, [hli] + ld [de], a + inc de + ld a, [hld] + ld [de], a ; copy current channel address + pop de + ld [hl], e + inc hl + ld [hl], d ; overwrite current address with pointer + ld b, $0 + ld hl, $c02e + add hl, bc + set 1, [hl] ; set the call flag + jp Music2_endchannel + +Music2_loopchannel: ; 0x92a9 + cp $fe ; is this command a loopchannel? + jp nz, Music2_notetype ; no + call Music2_GetNextMusicByte ; yes + ld e, a + and a + jr z, .infiniteLoop + ld b, $0 + ld hl, $c0be + add hl, bc + ld a, [hl] + cp e + jr nz, .loopAgain + ld a, $1 ; if no more loops to make, + ld [hl], a + call Music2_GetNextMusicByte ; skip pointer + call Music2_GetNextMusicByte + jp Music2_endchannel +.loopAgain ; inc loop count + inc a + ld [hl], a + ; fall through +.infiniteLoop ; overwrite current address with pointer + call Music2_GetNextMusicByte + push af + call Music2_GetNextMusicByte + ld b, a + ld d, $0 + ld a, c + add a + ld e, a + ld hl, $c006 + add hl, de + pop af + ld [hli], a + ld [hl], b + jp Music2_endchannel + +Music2_notetype: ; 0x92e4 + and $f0 + cp $d0 ; is this command a notetype? + jp nz, Music2_togglecall ; no + ld a, d ; yes + and $f + ld b, $0 + ld hl, $c0c6 + add hl, bc + ld [hl], a ; store low nibble as speed + ld a, c + cp CH3 + jr z, .noiseChannel ; noise channel has 0 params + call Music2_GetNextMusicByte + ld d, a + ld a, c + cp CH2 + jr z, .musicChannel3 + cp CH6 + jr nz, .notChannel3 + ld hl, $c0e7 + jr .sfxChannel3 +.musicChannel3 + ld hl, $c0e6 +.sfxChannel3 + ld a, d + and $f + ld [hl], a ; store low nibble of param as duty + ld a, d + and $30 + sla a + ld d, a + ; fall through + + ; if channel 3, store high nibble as volume + ; else, store volume (high nibble) and fade (low nibble) +.notChannel3 + ld b, $0 + ld hl, $c0de + add hl, bc + ld [hl], d +.noiseChannel + jp Music2_endchannel + +Music2_togglecall: ; 0x9323 + ld a, d + cp $e8 ; is this command an togglecall? + jr nz, Music2_vibrato ; no + ld b, $0 ; yes + ld hl, $c02e + add hl, bc + ld a, [hl] + xor $1 + ld [hl], a ; flip bit 0 of $c02e (toggle returning from call) + jp Music2_endchannel + +Music2_vibrato: ; 0x9335 + cp $ea ; is this command a vibrato? + jr nz, Music2_pitchbend ; no + call Music2_GetNextMusicByte ; yes + ld b, $0 + ld hl, $c04e + add hl, bc + ld [hl], a ; store delay + ld hl, $c06e + add hl, bc + ld [hl], a ; store delay + call Music2_GetNextMusicByte + ld d, a + and $f0 + swap a + ld b, $0 + ld hl, $c056 + 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 a, d + and $f + ld d, a + ld hl, $c05e + add hl, bc + swap a + or d + ld [hl], a ; store depth as both high and low nibbles + jp Music2_endchannel + +Music2_pitchbend: ; 0x936d + cp $eb ; is this command a pitchbend? + jr nz, Music2_duty ; no + call Music2_GetNextMusicByte ; yes + ld b, $0 + ld hl, $c076 + add hl, bc + ld [hl], a ; store first param + call Music2_GetNextMusicByte + ld d, a + and $f0 + swap a + ld b, a + ld a, d + and $f + call Func_9858 + ld b, $0 + ld hl, $c0a6 + add hl, bc + ld [hl], d ; store unknown part of second param + ld hl, $c0ae + add hl, bc + ld [hl], e ; store unknown part of second param + ld b, $0 + ld hl, $c02e + add hl, bc + set 4, [hl] ; set pitchbend flag + call Music2_GetNextMusicByte + ld d, a + jp Music2_notelength + +Music2_duty: ; 0x93a5 + cp $ec ; is this command a duty? + jr nz, Music2_tempo ; no + call Music2_GetNextMusicByte ; yes + rrca + rrca + and $c0 + ld b, $0 + ld hl, $c03e + add hl, bc + ld [hl], a ; store duty + jp Music2_endchannel + +Music2_tempo: ; 0x93ba + cp $ed ; is this command a tempo? + jr nz, Music2_unknownmusic0xee ; no + ld a, c ; yes + cp CH4 + jr nc, .sfxChannel + call Music2_GetNextMusicByte + ld [$c0e8], a ; store first param + call Music2_GetNextMusicByte + ld [$c0e9], a ; store second param + xor a + ld [$c0ce], a ; clear RAM + ld [$c0cf], a + ld [$c0d0], a + ld [$c0d1], a + jr .musicChannelDone +.sfxChannel + call Music2_GetNextMusicByte + ld [$c0ea], a ; store first param + call Music2_GetNextMusicByte + ld [$c0eb], a ; store second param + xor a + ld [$c0d2], a ; clear RAM + ld [$c0d3], a + ld [$c0d4], a + ld [$c0d5], a +.musicChannelDone + jp Music2_endchannel + +Music2_unknownmusic0xee: ; 0x93fa + cp $ee ; is this command an unknownmusic0xee? + jr nz, Music2_unknownmusic0xef ; no + call Music2_GetNextMusicByte ; yes + ld [$c004], a ; store first param + jp Music2_endchannel + +; this appears to never be used +Music2_unknownmusic0xef ; 0x9407 + cp $ef ; is this command an unknownmusic0xef? + jr nz, Music2_dutycycle ; no + call Music2_GetNextMusicByte ; yes + push bc + call Func_9876 + pop bc + ld a, [$c003] + and a + jr nz, .skip + ld a, [$c02d] + ld [$c003], a + xor a + ld [$c02d], a +.skip + jp Music2_endchannel + +Music2_dutycycle: ; 0x9426 + cp $fc ; is this command a dutycycle? + jr nz, Music2_stereopanning ; no + call Music2_GetNextMusicByte ; yes + ld b, $0 + ld hl, $c046 + add hl, bc + ld [hl], a ; store full cycle + and $c0 + ld hl, $c03e + add hl, bc + ld [hl], a ; store first duty + ld hl, $c02e + add hl, bc + set 6, [hl] ; set dutycycle flag + jp Music2_endchannel + +Music2_stereopanning: ; 0x9444 + cp $f0 ; is this command a stereopanning? + jr nz, Music2_executemusic ; no + call Music2_GetNextMusicByte ; yes + ld [$ff00+$24], a ; store stereopanning + jp Music2_endchannel + +Music2_executemusic: ; 0x9450 + cp $f8 ; is this command an executemusic? + jr nz, Music2_octave ; no + ld b, $0 ; yes + ld hl, $c036 + add hl, bc + set 0, [hl] + jp Music2_endchannel + +Music2_octave: ; 0x945f + and $f0 + cp $e0 ; is this command an octave? + jr nz, Music2_unknownsfx0x20 ; no + ld hl, $c0d6 ; yes + ld b, $0 + add hl, bc + ld a, d + and $f + ld [hl], a ; store low nibble as octave + jp Music2_endchannel + +Music2_unknownsfx0x20: ; 0x9472 + cp $20 ; is this command an unknownsfx0x20? + jr nz, Music2_unknownsfx0x10 ; no + ld a, c + cp CH3 ; is this a noise or sfx channel? + jr c, Music2_unknownsfx0x10 ; no + ld b, $0 + ld hl, $c036 + add hl, bc + bit 0, [hl] + jr nz, Music2_unknownsfx0x10 ; no + call Music2_notelength ; yes + ld d, a + ld b, $0 + ld hl, $c03e + add hl, bc + ld a, [hl] + or d + ld d, a + ld b, $1 + call Func_9838 + ld [hl], d + call Music2_GetNextMusicByte + ld d, a + ld b, $2 + call Func_9838 + ld [hl], d + call Music2_GetNextMusicByte + ld e, a + ld a, c + cp CH7 + ld a, $0 + jr z, .sfxNoiseChannel ; only two params for noise channel + push de + call Music2_GetNextMusicByte + pop de +.sfxNoiseChannel + ld d, a + push de + call Func_9629 + call Func_95f8 + pop de + call Func_964b + ret + +Music2_unknownsfx0x10: + ld a, c + cp CH4 + jr c, Music2_note ; if not a sfx + ld a, d + cp $10 ; is this command a unknownsfx0x10? + jr nz, Music2_note ; no + ld b, $0 + ld hl, $c036 + add hl, bc + bit 0, [hl] + jr nz, Music2_note ; no + call Music2_GetNextMusicByte ; yes + ld [$ff00+$10], a + jp Music2_endchannel + +Music2_note: + ld a, c + cp CH3 + jr nz, Music2_notelength ; if not noise channel + ld a, d + and $f0 + cp $b0 ; is this command a dnote? + jr z, Music2_dnote ; yes + jr nc, Music2_notelength ; no + swap a + ld b, a + ld a, d + and $f + ld d, a + ld a, b + push de + push bc + jr asm_94fd + +Music2_dnote: + ld a, d + and $f + push af + push bc + call Music2_GetNextMusicByte ; get dnote instrument +asm_94fd + ld d, a + ld a, [$c003] + and a + jr nz, .asm_9508 + ld a, d + call Func_9876 +.asm_9508 + pop bc + pop de + +Music2_notelength: ; 0x950a + ld a, d + push af + and $f + inc a + ld b, $0 + ld e, a ; store note length (in 16ths) + ld d, b + ld hl, $c0c6 + add hl, bc + ld a, [hl] + ld l, b + call Func_9847 + ld a, c + cp CH4 + jr nc, .sfxChannel + ld a, [$c0e8] + ld d, a + ld a, [$c0e9] + ld e, a + jr .skip +.sfxChannel + ld d, $1 + ld e, $0 + cp CH7 + jr z, .skip ; if noise channel + call Func_9693 + ld a, [$c0ea] + ld d, a + ld a, [$c0eb] + ld e, a +.skip + ld a, l + ld b, $0 + ld hl, $c0ce + add hl, bc + ld l, [hl] + call Func_9847 + ld e, l + ld d, h + ld hl, $c0ce + add hl, bc + ld [hl], e + ld a, d + ld hl, $c0b6 + add hl, bc + ld [hl], a + ld hl, $c036 + add hl, bc + bit 0, [hl] + jr nz, Music2_notepitch + ld hl, $c02e + add hl, bc + bit 2, [hl] + jr z, Music2_notepitch + pop hl + ret + +Music2_notepitch: ; 0x9568 + pop af + and $f0 + cp $c0 ; compare to rest + jr nz, .notRest + ld a, c + cp CH4 + jr nc, .sfxChannel + ld hl, $c02a + add hl, bc + ld a, [hl] + and a + jr nz, .done + ; fall through +.sfxChannel + ld a, c + cp CH2 + jr z, .musicChannel3 + cp CH6 + jr nz, .notSfxChannel3 +.musicChannel3 + ld b, $0 + ld hl, Unknown_9b1f + add hl, bc + ld a, [$ff00+$25] + and [hl] + ld [$ff00+$25], a + jr .done +.notSfxChannel3 + ld b, $2 + call Func_9838 + ld a, $8 + ld [hli], a + inc hl + ld a, $80 + ld [hl], a +.done + ret +.notRest + swap a + ld b, $0 + ld hl, $c0d6 + add hl, bc + ld b, [hl] + call Func_9858 + ld b, $0 + ld hl, $c02e + add hl, bc + bit 4, [hl] + jr z, .asm_95b8 + call Func_978f +.asm_95b8 + push de + ld a, c + cp CH4 + jr nc, .skip ; if sfx channel + ld hl, $c02a + ld d, $0 + ld e, a + add hl, de + ld a, [hl] + and a + jr nz, .asm_95cb + jr .skip +.asm_95cb + pop de + ret +.skip + ld b, $0 + ld hl, $c0de + add hl, bc + ld d, [hl] + ld b, $2 + call Func_9838 + ld [hl], d + call Func_9629 + call Func_95f8 + pop de + ld b, $0 + ld hl, $c02e + add hl, bc + bit 0, [hl] + jr z, .asm_95ef + inc e + jr nc, .asm_95ef + inc d +.asm_95ef + ld hl, $c066 + add hl, bc + ld [hl], e + call Func_964b + ret + +Func_95f8: ; 0x95f8 + ld b, $0 + ld hl, Unknown_9b27 + add hl, bc + ld a, [$ff00+$25] + or [hl] + ld d, a + ld a, c + cp CH7 + jr z, .sfxNoiseChannel + cp CH4 + jr nc, .skip ; if sfx channel + ld hl, $c02a + add hl, bc + ld a, [hl] + and a + jr nz, .skip +.sfxNoiseChannel + ld a, [$c004] + ld hl, Unknown_9b27 + add hl, bc + and [hl] + ld d, a + ld a, [$ff00+$25] + ld hl, Unknown_9b1f + add hl, bc + and [hl] + or d + ld d, a +.skip + ld a, d + ld [$ff00+$25], a + ret + +Func_9629: ; 0x9629 + ld b, $0 + ld hl, $c0b6 + add hl, bc + ld d, [hl] + ld a, c + cp CH2 + jr z, .channel3 ; if music channel 3 + cp CH6 + jr z, .channel3 ; if sfx channel 3 + ld a, d + and $3f + ld d, a + ld hl, $c03e + add hl, bc + ld a, [hl] + or d + ld d, a +.channel3 + ld b, $1 + call Func_9838 + ld [hl], d + ret + +Func_964b: ; 0x964b + ld a, c + cp CH2 + jr z, .channel3 + cp CH6 + jr nz, .notSfxChannel3 + ; fall through +.channel3 + push de + ld de, $c0e6 + cp CH2 + jr z, .musicChannel3 + ld de, $c0e7 +.musicChannel3 + ld a, [de] + add a + ld d, $0 + ld e, a + ld hl, Music2_Channel3DutyPointers + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld hl, $ff30 + ld b, $f + ld a, $0 + ld [$ff00+$1a], a +.loop + ld a, [de] + inc de + ld [hli], a + ld a, b + dec b + and a + jr nz, .loop + ld a, $80 + ld [$ff00+$1a], a + pop de +.notSfxChannel3 + ld a, d + or $80 + and $c7 + ld d, a + ld b, $3 + call Func_9838 + ld [hl], e + inc hl + ld [hl], d + call Func_96b5 + ret + +Func_9693: ; 0x9693 + call Func_96e5 + jr nc, .asm_96ab + ld d, $0 + ld a, [$c0f2] + add $80 + jr nc, .asm_96a2 + inc d +.asm_96a2 + ld [$c0eb], a + ld a, d + ld [$c0ea], a + jr .asm_96b4 +.asm_96ab + xor a + ld [$c0eb], a + ld a, $1 + ld [$c0ea], a +.asm_96b4 + ret + +Func_96b5: ; 0x96b5 + call Func_96e5 + jr nc, .asm_96c6 + ld a, [$c0f1] + add e + jr nc, .asm_96c1 + inc d +.asm_96c1 + dec hl + ld e, a + ld [hl], e + inc hl + ld [hl], d +.asm_96c6 + ret + +Func_96c7: ; 0x96c7 + call Func_96e5 + jr nc, .asm_96e2 + ld hl, $c006 + ld e, c + ld d, $0 + sla e + rl d + add hl, de + ld a, [hl] + sub $1 + ld [hl], a + inc hl + ld a, [hl] + sbc $0 + ld [hl], a + scf + ret +.asm_96e2 + scf + ccf + ret + +Func_96e5: ; 0x96e5 + ld a, [$c02a] + cp $14 + jr nc, .asm_96ee + jr .asm_96f4 +.asm_96ee + cp $86 + jr z, .asm_96f4 + jr c, .asm_96f7 +.asm_96f4 + scf + ccf + ret +.asm_96f7 + scf + ret + +Music2_ApplyPitchBend: ; 0x96f9 + ld hl, $c02e + add hl, bc + bit 5, [hl] + jp nz, .asm_9740 + ld hl, $c09e + add hl, bc + ld e, [hl] + ld hl, $c096 + add hl, bc + ld d, [hl] + ld hl, $c07e + add hl, bc + ld l, [hl] + ld h, b + add hl, de + ld d, h + ld e, l + ld hl, $c08e + add hl, bc + push hl + ld hl, $c086 + add hl, bc + ld a, [hl] + pop hl + add [hl] + ld [hl], a + ld a, $0 + adc e + ld e, a + ld a, $0 + adc d + ld d, a + ld hl, $c0a6 + add hl, bc + ld a, [hl] + cp d + jp c, .asm_9786 + jr nz, .asm_9773 + ld hl, $c0ae + add hl, bc + ld a, [hl] + cp e + jp c, .asm_9786 + jr .asm_9773 +.asm_9740 + ld hl, $c09e + add hl, bc + ld a, [hl] + ld hl, $c096 + add hl, bc + ld d, [hl] + ld hl, $c07e + add hl, bc + ld e, [hl] + sub e + ld e, a + ld a, d + sbc b + ld d, a + ld hl, $c086 + add hl, bc + ld a, [hl] + add a + ld [hl], a + ld a, e + sbc b + ld e, a + ld a, d + sbc b + ld d, a + ld hl, $c0a6 + add hl, bc + ld a, d + cp [hl] + jr c, .asm_9786 + jr nz, .asm_9773 + ld hl, $c0ae + add hl, bc + ld a, e + cp [hl] + jr c, .asm_9786 +.asm_9773 + ld hl, $c09e + add hl, bc + ld [hl], e + ld hl, $c096 + add hl, bc + ld [hl], d + ld b, $3 + call Func_9838 + ld a, e + ld [hli], a + ld [hl], d + ret +.asm_9786 + ld hl, $c02e + add hl, bc + res 4, [hl] + res 5, [hl] + ret + +Func_978f: ; 0x978f + ld hl, $c096 + add hl, bc + ld [hl], d + ld hl, $c09e + add hl, bc + ld [hl], e + ld hl, $c0b6 + add hl, bc + ld a, [hl] + ld hl, $c076 + add hl, bc + sub [hl] + jr nc, .asm_97a7 + ld a, $1 +.asm_97a7 + ld [hl], a + ld hl, $c0ae + add hl, bc + ld a, e + sub [hl] + ld e, a + ld a, d + sbc b + ld hl, $c0a6 + add hl, bc + sub [hl] + jr c, .asm_97c3 + ld d, a + ld b, $0 + ld hl, $c02e + add hl, bc + set 5, [hl] + jr .asm_97e6 +.asm_97c3 + ld hl, $c096 + add hl, bc + ld d, [hl] + ld hl, $c09e + add hl, bc + ld e, [hl] + ld hl, $c0ae + add hl, bc + ld a, [hl] + sub e + ld e, a + ld a, d + sbc b + ld d, a + ld hl, $c0a6 + add hl, bc + ld a, [hl] + sub d + ld d, a + ld b, $0 + ld hl, $c02e + add hl, bc + res 5, [hl] +.asm_97e6 + ld hl, $c076 + add hl, bc +.asm_97ea + inc b + ld a, e + sub [hl] + ld e, a + jr nc, .asm_97ea + ld a, d + and a + jr z, .asm_97f8 + dec a + ld d, a + jr .asm_97ea +.asm_97f8 + ld a, e + add [hl] + ld d, b + ld b, $0 + ld hl, $c07e + add hl, bc + ld [hl], d + ld hl, $c086 + add hl, bc + ld [hl], a + ld hl, $c08e + add hl, bc + ld [hl], a + ret + +Music2_ApplyDutyCycle: ; 0x980d + ld b, $0 + ld hl, $c046 + add hl, bc + ld a, [hl] + rlca + rlca + ld [hl], a + and $c0 + ld d, a + ld b, $1 + call Func_9838 + ld a, [hl] + and $3f + or d + ld [hl], a + ret + +Music2_GetNextMusicByte: ; 0x9825 + ld d, $0 + ld a, c + add a + ld e, a + ld hl, $c006 + add hl, de + ld a, [hli] + ld e, a + ld a, [hld] + ld d, a + ld a, [de] ; get next music command + inc de + ld [hl], e ; store address of next command + inc hl + ld [hl], d + ret + +Func_9838: ; 0x9838 + ld a, c + ld hl, Unknown_9b17 + add l + jr nc, .noCarry + inc h +.noCarry + ld l, a + ld a, [hl] + add b + ld l, a + ld h, $ff + ret + +Func_9847: ; 0x9847 + ld h, $0 +.loop + srl a + jr nc, .noCarry + add hl, de +.noCarry + sla e + rl d + and a + jr z, .done + jr .loop +.done + ret + +Func_9858: ; 0x9858 + ld h, $0 + ld l, a + add hl, hl + ld d, h + ld e, l + ld hl, Unknown_9b2f + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld a, b +.loop + cp $7 + jr z, .done + sra d + rr e + inc a + jr .loop +.done + ld a, $8 + add d + ld d, a + ret + +Func_9876: ; 0x9876 + ld [$c001], a + cp $ff + jp z, Func_9a34 + cp $b9 + jp z, Func_994e + jp c, Func_994e + cp $fe + jr z, .asm_988d + jp nc, Func_994e +.asm_988d + xor a + ld [$c000], a + ld [$c003], a + ld [$c0e9], a + ld [$c0e6], a + ld [$c0e7], a + ld d, $8 + ld hl, $c016 + call FillMusicRAM2 + ld hl, $c006 + call FillMusicRAM2 + ld d, $4 + ld hl, $c026 + call FillMusicRAM2 + ld hl, $c02e + call FillMusicRAM2 + ld hl, $c03e + call FillMusicRAM2 + ld hl, $c046 + call FillMusicRAM2 + ld hl, $c04e + call FillMusicRAM2 + ld hl, $c056 + call FillMusicRAM2 + ld hl, $c05e + call FillMusicRAM2 + ld hl, $c066 + call FillMusicRAM2 + ld hl, $c06e + call FillMusicRAM2 + ld hl, $c036 + call FillMusicRAM2 + ld hl, $c076 + call FillMusicRAM2 + ld hl, $c07e + call FillMusicRAM2 + ld hl, $c086 + call FillMusicRAM2 + ld hl, $c08e + call FillMusicRAM2 + ld hl, $c096 + call FillMusicRAM2 + ld hl, $c09e + call FillMusicRAM2 + ld hl, $c0a6 + call FillMusicRAM2 + ld hl, $c0ae + call FillMusicRAM2 + ld a, $1 + ld hl, $c0be + call FillMusicRAM2 + ld hl, $c0b6 + call FillMusicRAM2 + ld hl, $c0c6 + call FillMusicRAM2 + ld [$c0e8], a + ld a, $ff + ld [$c004], a + xor a + ld [$ff00+$24], a + ld a, $8 + ld [$ff00+$10], a + ld a, $0 + ld [$ff00+$25], a + xor a + ld [$ff00+$1a], a + ld a, $80 + ld [$ff00+$1a], a + ld a, $77 + ld [$ff00+$24], a + jp Func_9a8f + +Func_994e: ; 0x994e + ld l, a + ld e, a + ld h, $0 + ld d, h + add hl, hl + add hl, de + ld de, SFX_Headers_02 + add hl, de + ld a, h + ld [$c0ec], a + ld a, l + ld [$c0ed], a + ld a, [hl] + and $c0 + rlca + rlca + ld c, a +.asm_9967 + ld d, c + ld a, c + add a + add c + ld c, a + ld b, $0 + ld a, [$c0ec] + ld h, a + ld a, [$c0ed] + ld l, a + add hl, bc + ld c, d + ld a, [hl] + and $f + ld e, a + ld d, $0 + ld hl, $c026 + add hl, de + ld a, [hl] + and a + jr z, .asm_99a3 + ld a, e + cp $7 + jr nz, .asm_999a + ld a, [$c001] + cp $14 + jr nc, .asm_9993 + ret +.asm_9993 + ld a, [hl] + cp $14 + jr z, .asm_99a3 + jr c, .asm_99a3 +.asm_999a + ld a, [$c001] + cp [hl] + jr z, .asm_99a3 + jr c, .asm_99a3 + ret +.asm_99a3 + xor a + push de + ld h, d + ld l, e + add hl, hl + ld d, h + ld e, l + ld hl, $c016 + add hl, de + ld [hli], a + ld [hl], a + ld hl, $c006 + add hl, de + ld [hli], a + ld [hl], a + pop de + ld hl, $c026 + add hl, de + ld [hl], a + ld hl, $c02e + add hl, de + ld [hl], a + ld hl, $c03e + add hl, de + ld [hl], a + ld hl, $c046 + add hl, de + ld [hl], a + ld hl, $c04e + add hl, de + ld [hl], a + ld hl, $c056 + add hl, de + ld [hl], a + ld hl, $c05e + add hl, de + ld [hl], a + ld hl, $c066 + add hl, de + ld [hl], a + ld hl, $c06e + add hl, de + ld [hl], a + ld hl, $c076 + add hl, de + ld [hl], a + ld hl, $c07e + add hl, de + ld [hl], a + ld hl, $c086 + add hl, de + ld [hl], a + ld hl, $c08e + add hl, de + ld [hl], a + ld hl, $c096 + add hl, de + ld [hl], a + ld hl, $c09e + add hl, de + ld [hl], a + ld hl, $c0a6 + add hl, de + ld [hl], a + ld hl, $c0ae + add hl, de + ld [hl], a + ld hl, $c036 + add hl, de + ld [hl], a + ld a, $1 + ld hl, $c0be + add hl, de + ld [hl], a + ld hl, $c0b6 + add hl, de + ld [hl], a + ld hl, $c0c6 + add hl, de + ld [hl], a + ld a, e + cp $4 + jr nz, .asm_9a2b + ld a, $8 + ld [$ff00+$10], a +.asm_9a2b + ld a, c + and a + jp z, Func_9a8f + dec c + jp .asm_9967 + +Func_9a34: ; 0x9a34 + ld a, $80 + ld [$ff00+$26], a + ld [$ff00+$1a], a + xor a + ld [$ff00+$25], a + ld [$ff00+$1c], a + ld a, $8 + ld [$ff00+$10], a + ld [$ff00+$12], a + ld [$ff00+$17], a + ld [$ff00+$21], a + ld a, $40 + ld [$ff00+$14], a + ld [$ff00+$19], a + ld [$ff00+$23], a + ld a, $77 + ld [$ff00+$24], a + xor a + ld [$c000], a + ld [$c003], a + ld [$c002], a + ld [$c0e9], a + ld [$c0eb], a + ld [$c0e6], a + ld [$c0e7], a + ld d, $a0 + ld hl, $c006 + call FillMusicRAM2 + ld a, $1 + ld d, $18 + ld hl, $c0b6 + call FillMusicRAM2 + ld [$c0e8], a + ld [$c0ea], a + ld a, $ff + ld [$c004], a + ret + +; fills d bytes at hl with a +FillMusicRAM2: ; 0x9a89 + ld b, d +.loop + ld [hli], a + dec b + jr nz, .loop + ret + +Func_9a8f: ; 0x9a8f + ld a, [$c001] + ld l, a + ld e, a + ld h, $0 + ld d, h + add hl, hl + add hl, de + ld de, SFX_Headers_02 + add hl, de + ld e, l + ld d, h + ld hl, $c006 + ld a, [de] ; get channel number + ld b, a + rlca + rlca + and $3 + ld c, a + ld a, b + and $f + ld b, c + inc b + inc de + ld c, $0 +.asm_9ab1 + cp c + jr z, .asm_9ab9 + inc c + inc hl + inc hl + jr .asm_9ab1 +.asm_9ab9 + push hl + push bc + push af + ld b, $0 + ld c, a + ld hl, $c026 + add hl, bc + ld a, [$c001] + ld [hl], a + pop af + cp $3 + jr c, .asm_9ad2 + ld hl, $c02e + add hl, bc + set 2, [hl] +.asm_9ad2 + pop bc + pop hl + ld a, [de] ; get channel pointer + ld [hli], a + inc de + ld a, [de] + ld [hli], a + inc de + inc c + dec b + ld a, b + and a + ld a, [de] + inc de + jr nz, .asm_9ab1 + ld a, [$c001] + cp $14 + jr nc, .asm_9aeb + jr .asm_9b15 +.asm_9aeb + ld a, [$c001] + cp $86 + jr z, .asm_9b15 + jr c, .asm_9af6 + jr .asm_9b15 +.asm_9af6 + ld hl, $c02a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hl], a + ld hl, $c012 ; sfx noise channel pointer + ld de, Noise2_endchannel + ld [hl], e + inc hl + ld [hl], d ; overwrite pointer to point to endchannel + ld a, [$c005] + and a + jr nz, .asm_9b15 + ld a, [$ff00+$24] + ld [$c005], a + ld a, $77 + ld [$ff00+$24], a +.asm_9b15 + ret + +Noise2_endchannel: ; 0x9b16 + endchannel + +Unknown_9b17: ; 0x9b17 + db $10, $15, $1A, $1F ; channels 0-3 + db $10, $15, $1A, $1F ; channels 4-7 + +Unknown_9b1f: ; 0x9b1f + db $EE, $DD, $BB, $77 ; channels 0-3 + db $EE, $DD, $BB, $77 ; channels 4-7 + +Unknown_9b27: ; 0x9b27 + db $11, $22, $44, $88 ; channels 0-3 + db $11, $22, $44, $88 ; channels 4-7 + +Unknown_9b2f: ; 0x9b2f + dw $F82C + dw $F89D + dw $F907 + dw $F96B + dw $F9CA + dw $FA23 + dw $FA77 + dw $FAC7 + dw $FB12 + dw $FB58 + dw $FB9B + dw $FBDA + + diff --git a/audio/engine_2.asm b/audio/engine_2.asm new file mode 100644 index 00000000..deb65357 --- /dev/null +++ b/audio/engine_2.asm @@ -0,0 +1,1733 @@ +; The second of three duplicated sound engines. + +Func_21879: ; 21879 (8:5879) + ld c, CH0 +.loop + ld b, $0 + ld hl, $c026 + add hl, bc + ld a, [hl] + and a + jr z, .nextChannel + ld a, c + cp CH4 + jr nc, .applyAffects ; if sfx channel + ld a, [$c002] + and a + jr z, .applyAffects + bit 7, a + jr nz, .nextChannel + set 7, a + ld [$c002], a + xor a + ld [$FF00+$25], a + ld [$FF00+$1a], a + ld a, $80 + ld [$FF00+$1a], a + jr .nextChannel +.applyAffects + call Music8_ApplyMusicAffects +.nextChannel + ld a, c + inc c + cp CH7 + jr nz, .loop + ret + +; this routine checks flags for music effects currently applied +; to the channel and calls certain functions based on flags. +; known flags for $c02e: +; 1: call has been used +; 3: a toggle used only by this routine for vibrato +; 4: pitchbend flag +; 6: dutycycle flag +Music8_ApplyMusicAffects: ; 218ae (8:58ae) + ld b, $0 + ld hl, $c0b6 ; delay unitl next note + add hl, bc + ld a, [hl] + cp $1 ; if the delay is 1, play next note + jp z, Music8_PlayNextNote + dec a ; otherwise, decrease the delay timer + ld [hl], a + ld a, c + cp CH4 + jr nc, .startChecks ; if a sfx channel + ld hl, $c02a + add hl, bc + ld a, [hl] + and a + jr z, .startChecks + ret +.startChecks + ld hl, $c02e + add hl, bc + bit 6, [hl] ; dutycycle + jr z, .checkForExecuteMusic + call Music8_ApplyDutyCycle +.checkForExecuteMusic + ld b, $0 + ld hl, $c036 + add hl, bc + bit 0, [hl] + jr nz, .checkForPitchBend + ld hl, $c02e + add hl, bc + bit 2, [hl] + jr nz, .disablePitchBendVibrato +.checkForPitchBend + ld hl, $c02e + add hl, bc + bit 4, [hl] ; pitchbend + jr z, .checkVibratoDelay + jp Music8_ApplyPitchBend +.checkVibratoDelay + ld hl, $c04e ; vibrato delay + add hl, bc + ld a, [hl] + and a ; check if delay is over + jr z, .checkForVibrato + dec [hl] ; otherwise, dec delay +.disablePitchBendVibrato + ret +.checkForVibrato + ld hl, $c056 ; vibrato rate + add hl, bc + ld a, [hl] + and a + jr nz, .vibrato + ret ; no vibrato +.vibrato + ld d, a + ld hl, $c05e + add hl, bc + ld a, [hl] + and $f + and a + jr z, .vibratoAlreadyDone + dec [hl] ; apply vibrato pitch change + ret +.vibratoAlreadyDone + ld a, [hl] + swap [hl] + or [hl] + ld [hl], a ; reset the vibrato value and start again + ld hl, $c066 + add hl, bc + ld e, [hl] ; get note pitch + ld hl, $c02e + 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] + ld a, d + and $f + ld d, a + ld a, e + sub d + jr nc, .noCarry + ld a, $0 +.noCarry + jr .done +.unset + set 3, [hl] + ld a, d + and $f0 + swap a + add e + jr nc, .done + ld a, $ff +.done + ld d, a + ld b, $3 + call Func_21ff7 + ld [hl], d + ret + +; this routine executes all music commands that take up no time, +; like tempo changes, duty changes etc. and doesn't return +; until the first note is reached +Music8_PlayNextNote: ; 21946 (8:5946) + ld hl, $c06e + add hl, bc + ld a, [hl] + ld hl, $c04e + add hl, bc + ld [hl], a + ld hl, $c02e + add hl, bc + res 4, [hl] + res 5, [hl] + ld a, c + cp CH4 + jr nz, .beginChecks + ld a, [$d083] + bit 7, a + ret nz +.beginChecks + call Music8_endchannel + ret + +Music8_endchannel: ; 21967 (8:5967) + call Music8_GetNextMusicByte + ld d, a + cp $ff ; is this command an endchannel? + jp nz, Music8_callchannel ; no + ld b, $0 ; yes + ld hl, $c02e + add hl, bc + bit 1, [hl] + jr nz, .returnFromCall + ld a, c + cp CH3 + jr nc, .noiseOrSfxChannel + jr .asm_219c0 +.noiseOrSfxChannel + res 2, [hl] + ld hl, $c036 + add hl, bc + res 0, [hl] + cp CH6 + jr nz, .notSfxChannel3 + ld a, $0 + ld [$FF00+$1a], a + ld a, $80 + ld [$FF00+$1a], a +.notSfxChannel3 + jr nz, .asm_219a3 + ld a, [$c003] + and a + jr z, .asm_219a3 + xor a + ld [$c003], a + jr .asm_219c0 +.asm_219a3 + jr .asm_219c9 +.returnFromCall + res 1, [hl] + ld d, $0 + ld a, c + add a + ld e, a + ld hl, $c006 + add hl, de + push hl ; store current channel address + ld hl, $c016 + add hl, de + ld e, l + ld d, h + pop hl + ld a, [de] + ld [hli], a + inc de + ld a, [de] + ld [hl], a ; loads channel address to return to + jp Music8_endchannel +.asm_219c0 + ld hl, Unknown_222de + add hl, bc + ld a, [$FF00+$25] + and [hl] + ld [$FF00+$25], a +.asm_219c9 + ld a, [$c02a] + cp $14 + jr nc, .asm_219d2 + jr .asm_219ef +.asm_219d2 + ld a, [$c02a] + cp $86 + jr z, .asm_219ef + jr c, .asm_219dd + jr .asm_219ef +.asm_219dd + ld a, c + cp CH4 + jr z, .asm_219e6 + call Func_21e6d + ret c +.asm_219e6 + ld a, [$c005] + ld [$FF00+$24], a + xor a + ld [$c005], a +.asm_219ef + ld hl, $c026 + add hl, bc + ld [hl], b + ret + +Music8_callchannel: ; 219f5 (8:59f5) + cp $fd ; is this command a callchannel? + jp nz, Music8_loopchannel ; no + call Music8_GetNextMusicByte ; yes + push af + call Music8_GetNextMusicByte + ld d, a + pop af + ld e, a + push de ; store pointer + ld d, $0 + ld a, c + add a + ld e, a + ld hl, $c006 + add hl, de + push hl + ld hl, $c016 + add hl, de + ld e, l + ld d, h + pop hl + ld a, [hli] + ld [de], a + inc de + ld a, [hld] + ld [de], a ; copy current channel address + pop de + ld [hl], e + inc hl + ld [hl], d ; overwrite current address with pointer + ld b, $0 + ld hl, $c02e + add hl, bc + set 1, [hl] ; set the call flag + jp Music8_endchannel + +Music8_loopchannel: ; 21a2a (8:5a2a) + cp $fe ; is this command a loopchannel? + jp nz, Music8_notetype ; no + call Music8_GetNextMusicByte ; yes + ld e, a + and a + jr z, .infiniteLoop + ld b, $0 + ld hl, $c0be + add hl, bc + ld a, [hl] + cp e + jr nz, .loopAgain + ld a, $1 ; if no more loops to make, + ld [hl], a + call Music8_GetNextMusicByte ; skip pointer + call Music8_GetNextMusicByte + jp Music8_endchannel +.loopAgain ; inc loop count + inc a + ld [hl], a + ; fall through +.infiniteLoop ; overwrite current address with pointer + call Music8_GetNextMusicByte + push af + call Music8_GetNextMusicByte + ld b, a + ld d, $0 + ld a, c + add a + ld e, a + ld hl, $c006 + add hl, de + pop af + ld [hli], a + ld [hl], b + jp Music8_endchannel + +Music8_notetype: ; 21a65 (8:5a65) + and $f0 + cp $d0 ; is this command a notetype? + jp nz, Music8_togglecall ; no + ld a, d ; yes + and $f + ld b, $0 + ld hl, $c0c6 + add hl, bc + ld [hl], a ; store low nibble as speed + ld a, c + cp CH3 + jr z, .noiseChannel ; noise channel has 0 params + call Music8_GetNextMusicByte + ld d, a + ld a, c + cp CH2 + jr z, .musicChannel3 + cp CH6 + jr nz, .notChannel3 + ld hl, $c0e7 + jr .sfxChannel3 +.musicChannel3 + ld hl, $c0e6 +.sfxChannel3 + ld a, d + and $f + ld [hl], a ; store low nibble of param as duty + ld a, d + and $30 + sla a + ld d, a + ; fall through + + ; if channel 3, store high nibble as volume + ; else, store volume (high nibble) and fade (low nibble) +.notChannel3 + ld b, $0 + ld hl, $c0de + add hl, bc + ld [hl], d +.noiseChannel + jp Music8_endchannel + +Music8_togglecall: ; 21aa4 (8:5aa4) + ld a, d + cp $e8 ; is this command an togglecall? + jr nz, Music8_vibrato ; no + ld b, $0 ; yes + ld hl, $c02e + add hl, bc + ld a, [hl] + xor $1 + ld [hl], a ; flip bit 0 of $c02e (toggle returning from call) + jp Music8_endchannel + +Music8_vibrato: ; 21ab6 (8:5ab6) + cp $ea ; is this command a vibrato? + jr nz, Music8_pitchbend ; no + call Music8_GetNextMusicByte ; yes + ld b, $0 + ld hl, $c04e + add hl, bc + ld [hl], a ; store delay + ld hl, $c06e + add hl, bc + ld [hl], a ; store delay + call Music8_GetNextMusicByte + ld d, a + and $f0 + swap a + ld b, $0 + ld hl, $c056 + 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 a, d + and $f + ld d, a + ld hl, $c05e + add hl, bc + swap a + or d + ld [hl], a ; store depth as both high and low nibbles + jp Music8_endchannel + +Music8_pitchbend: ; 21aee (8:5aee) + cp $eb ; is this command a pitchbend? + jr nz, Music8_duty ; no + call Music8_GetNextMusicByte ; yes + ld b, $0 + ld hl, $c076 + add hl, bc + ld [hl], a ; store first param + call Music8_GetNextMusicByte + ld d, a + and $f0 + swap a + ld b, a + ld a, d + and $f + call Func_22017 + ld b, $0 + ld hl, $c0a6 + add hl, bc + ld [hl], d ; store unknown part of second param + ld hl, $c0ae + add hl, bc + ld [hl], e ; store unknown part of second param + ld b, $0 + ld hl, $c02e + add hl, bc + set 4, [hl] ; set pitchbend flag + call Music8_GetNextMusicByte + ld d, a + jp Music8_notelength + +Music8_duty: ; 21b26 (8:5b26) + cp $ec ; is this command a duty? + jr nz, Music8_tempo ; no + call Music8_GetNextMusicByte ; yes + rrca + rrca + and $c0 + ld b, $0 + ld hl, $c03e + add hl, bc + ld [hl], a ; store duty + jp Music8_endchannel + +Music8_tempo: ; 21b3b (8:5b3b) + cp $ed ; is this command a tempo? + jr nz, Music8_unknownmusic0xee ; no + ld a, c ; yes + cp CH4 + jr nc, .sfxChannel + call Music8_GetNextMusicByte + ld [$c0e8], a ; store first param + call Music8_GetNextMusicByte + ld [$c0e9], a ; store second param + xor a + ld [$c0ce], a ; clear RAM + ld [$c0cf], a + ld [$c0d0], a + ld [$c0d1], a + jr .musicChannelDone +.sfxChannel + call Music8_GetNextMusicByte + ld [$c0ea], a ; store first param + call Music8_GetNextMusicByte + ld [$c0eb], a ; store second param + xor a + ld [$c0d2], a ; clear RAM + ld [$c0d3], a + ld [$c0d4], a + ld [$c0d5], a +.musicChannelDone + jp Music8_endchannel + +Music8_unknownmusic0xee: ; 21b7b (8:5b7b) + cp $ee ; is this command an unknownmusic0xee? + jr nz, Music8_unknownmusic0xef ; no + call Music8_GetNextMusicByte ; yes + ld [$c004], a ; store first param + jp Music8_endchannel + +; this appears to never be used +Music8_unknownmusic0xef: ; 21b88 (8:5b88) + cp $ef ; is this command an unknownmusic0xef? + jr nz, Music8_dutycycle ; no + call Music8_GetNextMusicByte ; yes + push bc + call Func_22035 + pop bc + ld a, [$c003] + and a + jr nz, .skip + ld a, [$c02d] + ld [$c003], a + xor a + ld [$c02d], a +.skip + jp Music8_endchannel + +Music8_dutycycle: ; 21ba7 (8:5ba7) + cp $fc ; is this command a dutycycle? + jr nz, Music8_stereopanning ; no + call Music8_GetNextMusicByte ; yes + ld b, $0 + ld hl, $c046 + add hl, bc + ld [hl], a ; store full cycle + and $c0 + ld hl, $c03e + add hl, bc + ld [hl], a ; store first duty + ld hl, $c02e + add hl, bc + set 6, [hl] ; set dutycycle flag + jp Music8_endchannel + +Music8_stereopanning: ; 21bc5 (8:5bc5) + cp $f0 ; is this command a stereopanning? + jr nz, Music8_executemusic ; no + call Music8_GetNextMusicByte ; yes + ld [$FF00+$24], a + jp Music8_endchannel + +Music8_executemusic: ; 21bd1 (8:5bd1) + cp $f8 ; is this command an executemusic? + jr nz, Music8_octave ; no + ld b, $0 ; yes + ld hl, $c036 + add hl, bc + set 0, [hl] + jp Music8_endchannel + +Music8_octave: ; 21be0 (8:5be0) + and $f0 + cp $e0 ; is this command an octave? + jr nz, Music8_unknownsfx0x20 ; no + ld hl, $c0d6 ; yes + ld b, $0 + add hl, bc + ld a, d + and $f + ld [hl], a ; store low nibble as octave + jp Music8_endchannel + +Music8_unknownsfx0x20: ; 21bf3 + cp $20 ; is this command an unknownsfx0x20? + jr nz, Music8_unknownsfx0x10 ; no + ld a, c + cp CH3 ; is this a noise or sfx channel? + jr c, Music8_unknownsfx0x10 ; no + ld b, $0 + ld hl, $c036 + add hl, bc + bit 0, [hl] + jr nz, Music8_unknownsfx0x10 ; no + call Music8_notelength + ld d, a + ld b, $0 + ld hl, $c03e + add hl, bc + ld a, [hl] + or d + ld d, a + ld b, $1 + call Func_21ff7 + ld [hl], d + call Music8_GetNextMusicByte + ld d, a + ld b, $2 + call Func_21ff7 + ld [hl], d + call Music8_GetNextMusicByte + ld e, a + ld a, c + cp CH7 + ld a, $0 + jr z, .sfxNoiseChannel ; only two params for noise channel + push de + call Music8_GetNextMusicByte + pop de +.sfxNoiseChannel + ld d, a + push de + call Func_21daa + call Func_21d79 + pop de + call Func_21dcc + ret + +Music8_unknownsfx0x10: ; 21c40 (8:5c40) + ld a, c + cp CH4 + jr c, Music8_note ; if not a sfx + ld a, d + cp $10 ; is this command a unknownsfx0x10? + jr nz, Music8_note ; no + ld b, $0 + ld hl, $c036 + add hl, bc + bit 0, [hl] + jr nz, Music8_note ; no + call Music8_GetNextMusicByte ; yes + ld [$FF00+$10], a + jp Music8_endchannel + +Music8_note: ; 21c5c (8:5c5c) + ld a, c + cp CH3 + jr nz, Music8_notelength ; if not noise channel + ld a, d + and $f0 + cp $b0 ; is this command a dnote? + jr z, Music8_dnote ; yes + jr nc, Music8_notelength ; no + swap a + ld b, a + ld a, d + and $f + ld d, a + ld a, b + push de + push bc + jr asm_21c7e + +Music8_dnote: ; 21c76 (8:5c76) + ld a, d + and $f + push af + push bc + call Music8_GetNextMusicByte ; get dnote instrument +asm_21c7e + ld d, a + ld a, [$c003] + and a + jr nz, .asm_21c89 + ld a, d + call Func_22035 +.asm_21c89 + pop bc + pop de + +Music8_notelength: ; 21c8b (8:5c8b) + ld a, d + push af + and $f + inc a + ld b, $0 + ld e, a ; store note length (in 16ths) + ld d, b + ld hl, $c0c6 + add hl, bc + ld a, [hl] + ld l, b + call Func_22006 + ld a, c + cp CH4 + jr nc, .sfxChannel + ld a, [$c0e8] + ld d, a + ld a, [$c0e9] + ld e, a + jr .skip +.sfxChannel + ld d, $1 + ld e, $0 + cp CH7 + jr z, .skip ; if noise channel + call Func_21e2f + ld a, [$c0ea] + ld d, a + ld a, [$c0eb] + ld e, a +.skip + ld a, l + ld b, $0 + ld hl, $c0ce + add hl, bc + ld l, [hl] + call Func_22006 + ld e, l + ld d, h + ld hl, $c0ce + add hl, bc + ld [hl], e + ld a, d + ld hl, $c0b6 + add hl, bc + ld [hl], a + ld hl, $c036 + add hl, bc + bit 0, [hl] + jr nz, Music8_notepitch + ld hl, $c02e + add hl, bc + bit 2, [hl] + jr z, Music8_notepitch + pop hl + ret + +Music8_notepitch: ; 21ce9 (8:5ce9) + pop af + and $f0 + cp $c0 ; compare to rest + jr nz, .notRest + ld a, c + cp CH4 + jr nc, .sfxChannel + ld hl, $c02a + add hl, bc + ld a, [hl] + and a + jr nz, .done + ; fall through +.sfxChannel + ld a, c + cp CH2 + jr z, .musicChannel3 + cp CH6 + jr nz, .notSfxChannel3 +.musicChannel3 + ld b, $0 + ld hl, Unknown_222de + add hl, bc + ld a, [$FF00+$25] + and [hl] + ld [$FF00+$25], a + jr .done +.notSfxChannel3 + ld b, $2 + call Func_21ff7 + ld a, $8 + ld [hli], a + inc hl + ld a, $80 + ld [hl], a +.done + ret +.notRest + swap a + ld b, $0 + ld hl, $c0d6 + add hl, bc + ld b, [hl] + call Func_22017 + ld b, $0 + ld hl, $c02e + add hl, bc + bit 4, [hl] + jr z, .asm_21d39 + call Func_21f4e +.asm_21d39 + push de + ld a, c + cp CH4 + jr nc, .skip ; if sfx channel + ld hl, $c02a + ld d, $0 + ld e, a + add hl, de + ld a, [hl] + and a + jr nz, .asm_21d4c + jr .skip +.asm_21d4c + pop de + ret +.skip + ld b, $0 + ld hl, $c0de + add hl, bc + ld d, [hl] + ld b, $2 + call Func_21ff7 + ld [hl], d + call Func_21daa + call Func_21d79 + pop de + ld b, $0 + ld hl, $c02e + add hl, bc + bit 0, [hl] + jr z, .asm_21d70 + inc e + jr nc, .asm_21d70 + inc d +.asm_21d70 + ld hl, $c066 + add hl, bc + ld [hl], e + call Func_21dcc + ret + +Func_21d79: ; 21d79 (8:5d79) + ld b, $0 + ld hl, Unknown_222e6 + add hl, bc + ld a, [$FF00+$25] + or [hl] + ld d, a + ld a, c + cp CH7 + jr z, .sfxNoiseChannel + cp CH4 + jr nc, .skip ; if sfx channel + ld hl, $c02a + add hl, bc + ld a, [hl] + and a + jr nz, .skip +.sfxNoiseChannel + ld a, [$c004] + ld hl, Unknown_222e6 + add hl, bc + and [hl] + ld d, a + ld a, [$FF00+$25] + ld hl, Unknown_222de + add hl, bc + and [hl] + or d + ld d, a +.skip + ld a, d + ld [$FF00+$25], a + ret + +Func_21daa: ; 21daa (8:5daa) + ld b, $0 + ld hl, $c0b6 + add hl, bc + ld d, [hl] + ld a, c + cp CH2 + jr z, .channel3 ; if music channel 3 + cp CH6 + jr z, .channel3 ; if sfx channel 3 + ld a, d + and $3f + ld d, a + ld hl, $c03e + add hl, bc + ld a, [hl] + or d + ld d, a +.channel3 + ld b, $1 + call Func_21ff7 + ld [hl], d + ret + +Func_21dcc: ; 21dcc (8:5dcc) + ld a, c + cp CH2 + jr z, .channel3 + cp CH6 + jr nz, .notSfxChannel3 + ; fall through +.channel3 + push de + ld de, $c0e6 + cp CH2 + jr z, .musicChannel3 + ld de, $c0e7 +.musicChannel3 + ld a, [de] + add a + ld d, $0 + ld e, a + ld hl, Music8_Channel3DutyPointers + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld hl, $ff30 + ld b, $f + ld a, $0 + ld [$FF00+$1a], a +.loop + ld a, [de] + inc de + ld [hli], a + ld a, b + dec b + and a + jr nz, .loop + ld a, $80 + ld [$FF00+$1a], a + pop de +.notSfxChannel3 + ld a, d + or $80 + and $c7 + ld d, a + ld b, $3 + call Func_21ff7 + ld [hl], e + inc hl + ld [hl], d + ld a, c + cp CH4 + jr c, .musicChannel + call Func_21e56 +.musicChannel + ret + +Func_21e19: ; 21e19 (8:5e19) + ld a, c + cp CH4 + jr nz, .asm_21e2e + ld a, [$d083] + bit 7, a + jr z, .asm_21e2e + xor a + ld [$c0f1], a + ld a, $80 + ld [$c0f2], a +.asm_21e2e + ret + +Func_21e2f: ; 21e2f (8:5e2f) + call Func_21e8b + jr c, .asm_21e39 + call Func_21e9f + jr nc, .asm_21e4c +.asm_21e39 + ld d, $0 + ld a, [$c0f2] + add $80 + jr nc, .asm_21e43 + inc d +.asm_21e43 + ld [$c0eb], a + ld a, d + ld [$c0ea], a + jr .asm_21e55 +.asm_21e4c + xor a + ld [$c0eb], a + ld a, $1 + ld [$c0ea], a +.asm_21e55 + ret + +Func_21e56: ; 21e56 (8:5e56) + call Func_21e8b + jr c, .asm_21e60 + call Func_21e9f + jr nc, .asm_21e6c +.asm_21e60 + ld a, [$c0f1] + add e + jr nc, .asm_21e67 + inc d +.asm_21e67 + dec hl + ld e, a + ld [hl], e + inc hl + ld [hl], d +.asm_21e6c + ret + +Func_21e6d: ; 21e6d (8:5e6d) + call Func_21e8b + jr nc, .asm_21e88 + ld hl, $c006 + ld e, c + ld d, $0 + sla e + rl d + add hl, de + ld a, [hl] + sub $1 + ld [hl], a + inc hl + ld a, [hl] + sbc $0 + ld [hl], a + scf + ret +.asm_21e88 + scf + ccf + ret + +Func_21e8b: ; 21e8b (8:5e8b) + ld a, [$c02a] + cp $14 + jr nc, .asm_21e94 + jr .asm_21e9a +.asm_21e94 + cp $86 + jr z, .asm_21e9a + jr c, .asm_21e9d +.asm_21e9a + scf + ccf + ret +.asm_21e9d + scf + ret + +Func_21e9f: ; 21e9f (8:5e9f) + ld a, [$c02d] + ld b, a + ld a, [$c02a] + or b + cp $9d + jr nc, .asm_21ead + jr .asm_21eb3 +.asm_21ead + cp $ea + jr z, .asm_21eb3 + jr c, .asm_21eb6 +.asm_21eb3 + scf + ccf + ret +.asm_21eb6 + scf + ret + +Music8_ApplyPitchBend: ; 21eb8 (8:5eb8) + ld hl, $c02e + add hl, bc + bit 5, [hl] + jp nz, .asm_21eff + ld hl, $c09e + add hl, bc + ld e, [hl] + ld hl, $c096 + add hl, bc + ld d, [hl] + ld hl, $c07e + add hl, bc + ld l, [hl] + ld h, b + add hl, de + ld d, h + ld e, l + ld hl, $c08e + add hl, bc + push hl + ld hl, $c086 + add hl, bc + ld a, [hl] + pop hl + add [hl] + ld [hl], a + ld a, $0 + adc e + ld e, a + ld a, $0 + adc d + ld d, a + ld hl, $c0a6 + add hl, bc + ld a, [hl] + cp d + jp c, .asm_21f45 + jr nz, .asm_21f32 + ld hl, $c0ae + add hl, bc + ld a, [hl] + cp e + jp c, .asm_21f45 + jr .asm_21f32 +.asm_21eff + ld hl, $c09e + add hl, bc + ld a, [hl] + ld hl, $c096 + add hl, bc + ld d, [hl] + ld hl, $c07e + add hl, bc + ld e, [hl] + sub e + ld e, a + ld a, d + sbc b + ld d, a + ld hl, $c086 + add hl, bc + ld a, [hl] + add a + ld [hl], a + ld a, e + sbc b + ld e, a + ld a, d + sbc b + ld d, a + ld hl, $c0a6 + add hl, bc + ld a, d + cp [hl] + jr c, .asm_21f45 + jr nz, .asm_21f32 + ld hl, $c0ae + add hl, bc + ld a, e + cp [hl] + jr c, .asm_21f45 +.asm_21f32 + ld hl, $c09e + add hl, bc + ld [hl], e + ld hl, $c096 + add hl, bc + ld [hl], d + ld b, $3 + call Func_21ff7 + ld a, e + ld [hli], a + ld [hl], d + ret +.asm_21f45 + ld hl, $c02e + add hl, bc + res 4, [hl] + res 5, [hl] + ret + +Func_21f4e: ; 21f4e (8:5f4e) + ld hl, $c096 + add hl, bc + ld [hl], d + ld hl, $c09e + add hl, bc + ld [hl], e + ld hl, $c0b6 + add hl, bc + ld a, [hl] + ld hl, $c076 + add hl, bc + sub [hl] + jr nc, .asm_21f66 + ld a, $1 +.asm_21f66 + ld [hl], a + ld hl, $c0ae + add hl, bc + ld a, e + sub [hl] + ld e, a + ld a, d + sbc b + ld hl, $c0a6 + add hl, bc + sub [hl] + jr c, .asm_21f82 + ld d, a + ld b, $0 + ld hl, $c02e + add hl, bc + set 5, [hl] + jr .asm_21fa5 +.asm_21f82 + ld hl, $c096 + add hl, bc + ld d, [hl] + ld hl, $c09e + add hl, bc + ld e, [hl] + ld hl, $c0ae + add hl, bc + ld a, [hl] + sub e + ld e, a + ld a, d + sbc b + ld d, a + ld hl, $c0a6 + add hl, bc + ld a, [hl] + sub d + ld d, a + ld b, $0 + ld hl, $c02e + add hl, bc + res 5, [hl] +.asm_21fa5 + ld hl, $c076 + add hl, bc +.asm_21fa9 + inc b + ld a, e + sub [hl] + ld e, a + jr nc, .asm_21fa9 + ld a, d + and a + jr z, .asm_21fb7 + dec a + ld d, a + jr .asm_21fa9 +.asm_21fb7 + ld a, e + add [hl] + ld d, b + ld b, $0 + ld hl, $c07e + add hl, bc + ld [hl], d + ld hl, $c086 + add hl, bc + ld [hl], a + ld hl, $c08e + add hl, bc + ld [hl], a + ret + +Music8_ApplyDutyCycle: ; 21fcc (8:5fcc) + ld b, $0 + ld hl, $c046 + add hl, bc + ld a, [hl] + rlca + rlca + ld [hl], a + and $c0 + ld d, a + ld b, $1 + call Func_21ff7 + ld a, [hl] + and $3f + or d + ld [hl], a + ret + +Music8_GetNextMusicByte: ; 21fe4 (8:5fe4) + ld d, $0 + ld a, c + add a + ld e, a + ld hl, $c006 + add hl, de + ld a, [hli] + ld e, a + ld a, [hld] + ld d, a + ld a, [de] ; get next music command + inc de + ld [hl], e ; store address of next command + inc hl + ld [hl], d + ret + +Func_21ff7: ; 21ff7 (8:5ff7) + ld a, c + ld hl, Unknown_222d6 + add l + jr nc, .noCarry + inc h +.noCarry + ld l, a + ld a, [hl] + add b + ld l, a + ld h, $ff + ret + +Func_22006: ; 22006 (8:6006) + ld h, $0 +.loop + srl a + jr nc, .noCarry + add hl, de +.noCarry + sla e + rl d + and a + jr z, .done + jr .loop +.done + ret + +Func_22017: ; 22017 (8:6017) + ld h, $0 + ld l, a + add hl, hl + ld d, h + ld e, l + ld hl, Unknown_222ee + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld a, b +.loop + cp CH7 + jr z, .done + sra d + rr e + inc a + jr .loop +.done + ld a, $8 + add d + ld d, a + ret + +Func_22035: ; 22035 (8:6035) + ld [$c001], a + cp $ff + jp z, Func_221f3 + cp $e9 + jp z, Func_2210d + jp c, Func_2210d + cp $fe + jr z, .asm_2204c + jp nc, Func_2210d +.asm_2204c + xor a + ld [$c000], a + ld [$c003], a + ld [$c0e9], a + ld [$c0e6], a + ld [$c0e7], a + ld d, $8 + ld hl, $c016 + call FillMusicRAM8 + ld hl, $c006 + call FillMusicRAM8 + ld d, $4 + ld hl, $c026 + call FillMusicRAM8 + ld hl, $c02e + call FillMusicRAM8 + ld hl, $c03e + call FillMusicRAM8 + ld hl, $c046 + call FillMusicRAM8 + ld hl, $c04e + call FillMusicRAM8 + ld hl, $c056 + call FillMusicRAM8 + ld hl, $c05e + call FillMusicRAM8 + ld hl, $c066 + call FillMusicRAM8 + ld hl, $c06e + call FillMusicRAM8 + ld hl, $c036 + call FillMusicRAM8 + ld hl, $c076 + call FillMusicRAM8 + ld hl, $c07e + call FillMusicRAM8 + ld hl, $c086 + call FillMusicRAM8 + ld hl, $c08e + call FillMusicRAM8 + ld hl, $c096 + call FillMusicRAM8 + ld hl, $c09e + call FillMusicRAM8 + ld hl, $c0a6 + call FillMusicRAM8 + ld hl, $c0ae + call FillMusicRAM8 + ld a, $1 + ld hl, $c0be + call FillMusicRAM8 + ld hl, $c0b6 + call FillMusicRAM8 + ld hl, $c0c6 + call FillMusicRAM8 + ld [$c0e8], a + ld a, $ff + ld [$c004], a + xor a + ld [$FF00+$24], a + ld a, $8 + ld [$FF00+$10], a + ld a, $0 + ld [$FF00+$25], a + xor a + ld [$FF00+$1a], a + ld a, $80 + ld [$FF00+$1a], a + ld a, $77 + ld [$FF00+$24], a + jp Func_2224e + +Func_2210d: ; 2210d (8:610d) + ld l, a + ld e, a + ld h, $0 + ld d, h + add hl, hl + add hl, de + ld de, SFX_Headers_08 + add hl, de + ld a, h + ld [$c0ec], a + ld a, l + ld [$c0ed], a + ld a, [hl] + and $c0 + rlca + rlca + ld c, a +.asm_22126 + ld d, c + ld a, c + add a + add c + ld c, a + ld b, $0 + ld a, [$c0ec] + ld h, a + ld a, [$c0ed] + ld l, a + add hl, bc + ld c, d + ld a, [hl] + and $f + ld e, a + ld d, $0 + ld hl, $c026 + add hl, de + ld a, [hl] + and a + jr z, .asm_22162 + ld a, e + cp $7 + jr nz, .asm_22159 + ld a, [$c001] + cp $14 + jr nc, .asm_22152 + ret +.asm_22152 + ld a, [hl] + cp $14 + jr z, .asm_22162 + jr c, .asm_22162 +.asm_22159 + ld a, [$c001] + cp [hl] + jr z, .asm_22162 + jr c, .asm_22162 + ret +.asm_22162 + xor a + push de + ld h, d + ld l, e + add hl, hl + ld d, h + ld e, l + ld hl, $c016 + add hl, de + ld [hli], a + ld [hl], a + ld hl, $c006 + add hl, de + ld [hli], a + ld [hl], a + pop de + ld hl, $c026 + add hl, de + ld [hl], a + ld hl, $c02e + add hl, de + ld [hl], a + ld hl, $c03e + add hl, de + ld [hl], a + ld hl, $c046 + add hl, de + ld [hl], a + ld hl, $c04e + add hl, de + ld [hl], a + ld hl, $c056 + add hl, de + ld [hl], a + ld hl, $c05e + add hl, de + ld [hl], a + ld hl, $c066 + add hl, de + ld [hl], a + ld hl, $c06e + add hl, de + ld [hl], a + ld hl, $c076 + add hl, de + ld [hl], a + ld hl, $c07e + add hl, de + ld [hl], a + ld hl, $c086 + add hl, de + ld [hl], a + ld hl, $c08e + add hl, de + ld [hl], a + ld hl, $c096 + add hl, de + ld [hl], a + ld hl, $c09e + add hl, de + ld [hl], a + ld hl, $c0a6 + add hl, de + ld [hl], a + ld hl, $c0ae + add hl, de + ld [hl], a + ld hl, $c036 + add hl, de + ld [hl], a + ld a, $1 + ld hl, $c0be + add hl, de + ld [hl], a + ld hl, $c0b6 + add hl, de + ld [hl], a + ld hl, $c0c6 + add hl, de + ld [hl], a + ld a, e + cp $4 + jr nz, .asm_221ea + ld a, $8 + ld [$FF00+$10], a +.asm_221ea + ld a, c + and a + jp z, Func_2224e + dec c + jp .asm_22126 + +Func_221f3: ; 221f3 (8:61f3) + ld a, $80 + ld [$FF00+$26], a + ld [$FF00+$1a], a + xor a + ld [$FF00+$25], a + ld [$FF00+$1c], a + ld a, $8 + ld [$FF00+$10], a + ld [$FF00+$12], a + ld [$FF00+$17], a + ld [$FF00+$21], a + ld a, $40 + ld [$FF00+$14], a + ld [$FF00+$19], a + ld [$FF00+$23], a + ld a, $77 + ld [$FF00+$24], a + xor a + ld [$c000], a + ld [$c003], a + ld [$c002], a + ld [$c0e9], a + ld [$c0eb], a + ld [$c0e6], a + ld [$c0e7], a + ld d, $a0 + ld hl, $c006 + call FillMusicRAM8 + ld a, $1 + ld d, $18 + ld hl, $c0b6 + call FillMusicRAM8 + ld [$c0e8], a + ld [$c0ea], a + ld a, $ff + ld [$c004], a + ret + +; fills d bytes at hl with a +FillMusicRAM8: ; 22248 (8:6248) + ld b, d +.loop + ld [hli], a + dec b + jr nz, .loop + ret + +Func_2224e: ; 2224e (8:624e) + ld a, [$c001] + ld l, a + ld e, a + ld h, $0 + ld d, h + add hl, hl + add hl, de + ld de, SFX_Headers_08 + add hl, de + ld e, l + ld d, h + ld hl, $c006 + ld a, [de] ; get channel number + ld b, a + rlca + rlca + and $3 + ld c, a + ld a, b + and $f + ld b, c + inc b + inc de + ld c, $0 +.asm_22270 + cp c + jr z, .asm_22278 + inc c + inc hl + inc hl + jr .asm_22270 +.asm_22278 + push hl + push bc + push af + ld b, $0 + ld c, a + ld hl, $c026 + add hl, bc + ld a, [$c001] + ld [hl], a + pop af + cp $3 + jr c, .asm_22291 + ld hl, $c02e + add hl, bc + set 2, [hl] +.asm_22291 + pop bc + pop hl + ld a, [de] ; get channel pointer + ld [hli], a + inc de + ld a, [de] + ld [hli], a + inc de + inc c + dec b + ld a, b + and a + ld a, [de] + inc de + jr nz, .asm_22270 + ld a, [$c001] + cp $14 + jr nc, .asm_222aa + jr .asm_222d4 +.asm_222aa + ld a, [$c001] + cp $86 + jr z, .asm_222d4 + jr c, .asm_222b5 + jr .asm_222d4 +.asm_222b5 + ld hl, $c02a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hl], a + ld hl, $c012 ; sfx noise channel pointer + ld de, Noise8_endchannel + ld [hl], e + inc hl + ld [hl], d ; overwrite pointer to point to endchannel + ld a, [$c005] + and a + jr nz, .asm_222d4 + ld a, [$FF00+$24] + ld [$c005], a + ld a, $77 + ld [$FF00+$24], a +.asm_222d4 + ret + +Noise8_endchannel: ; 222d5 (8:62d5) + endchannel + +Unknown_222d6: ; 222d6 (8:62d6) + db $10, $15, $1A, $1F ; channels 0-3 + db $10, $15, $1A, $1F ; channels 4-7 + +Unknown_222de: ; 222de (8:62de) + db $EE, $DD, $BB, $77 ; channels 0-3 + db $EE, $DD, $BB, $77 ; channels 4-7 + +Unknown_222e6: ; 222e6 (8:62e6) + db $11, $22, $44, $88 ; channels 0-3 + db $11, $22, $44, $88 ; channels 4-7 + +Unknown_222ee: ; 222ee (8:62ee) + dw $F82C + dw $F89D + dw $F907 + dw $F96B + dw $F9CA + dw $FA23 + dw $FA77 + dw $FAC7 + dw $FB12 + dw $FB58 + dw $FB9B + dw $FBDA + + diff --git a/audio/engine_3.asm b/audio/engine_3.asm new file mode 100644 index 00000000..1f285ee6 --- /dev/null +++ b/audio/engine_3.asm @@ -0,0 +1,1682 @@ +; The third of three duplicated sound engines. + +Func_7d177: ; 7d177 (1f:5177) + ld c, CH0 +.loop + ld b, $0 + ld hl, $c026 + add hl, bc + ld a, [hl] + and a + jr z, .nextChannel + ld a, c + cp CH4 + jr nc, .applyAffects ; if sfx channel + ld a, [$c002] + and a + jr z, .applyAffects + bit 7, a + jr nz, .nextChannel + set 7, a + ld [$c002], a + xor a + ld [$FF00+$25], a + ld [$FF00+$1a], a + ld a, $80 + ld [$FF00+$1a], a + jr .nextChannel +.applyAffects + call Music1f_Music2_ApplyMusicAffects +.nextChannel + ld a, c + inc c ; inc channel number + cp CH7 + jr nz, .loop + ret + +; this routine checks flags for music effects currently applied +; to the channel and calls certain functions based on flags. +; known flags for $c02e: +; 1: call has been used +; 3: a toggle used only by this routine for vibrato +; 4: pitchbend flag +; 6: dutycycle flag +Music1f_Music2_ApplyMusicAffects: ; 7d1ac (1f:51ac) + ld b, $0 + ld hl, $c0b6 ; delay until next note + add hl, bc + ld a, [hl] + cp $1 ; if delay is 1, play next note + jp z, Music1f_Music2_PlayNextNote + dec a ; otherwise, decrease the delay timer + ld [hl], a + ld a, c + cp CH4 + jr nc, .startChecks ; if a sfx channel + ld hl, $c02a + add hl, bc + ld a, [hl] + and a + jr z, .startChecks + ret +.startChecks + ld hl, $c02e + add hl, bc + bit 6, [hl] ; dutycycle + jr z, .checkForExecuteMusic + call Music1f_ApplyDutyCycle +.checkForExecuteMusic + ld b, $0 + ld hl, $c036 + add hl, bc + bit 0, [hl] + jr nz, .checkForPitchBend + ld hl, $c02e + add hl, bc + bit 2, [hl] + jr nz, .disablePitchBendVibrato +.checkForPitchBend + ld hl, $c02e + add hl, bc + bit 4, [hl] ; pitchbend + jr z, .checkVibratoDelay + jp Music1f_ApplyPitchBend +.checkVibratoDelay + ld hl, $c04e ; vibrato delay + add hl, bc + ld a, [hl] + and a ; check if delay is over + jr z, .checkForVibrato + dec [hl] ; otherwise, dec delay +.disablePitchBendVibrato + ret +.checkForVibrato + ld hl, $c056 ; vibrato rate + add hl, bc + ld a, [hl] + and a + jr nz, .vibrato + ret ; no vibrato +.vibrato + ld d, a + ld hl, $c05e + add hl, bc + ld a, [hl] + and $f + and a + jr z, .vibratoAlreadyDone + dec [hl] ; apply vibrato pitch change + ret +.vibratoAlreadyDone + ld a, [hl] + swap [hl] + or [hl] + ld [hl], a ; reset the vibrato value and start again + ld hl, $c066 + add hl, bc + ld e, [hl] ; get note pitch + ld hl, $c02e + 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] + ld a, d + and $f + ld d, a + ld a, e + sub d + jr nc, .noCarry + ld a, $0 +.noCarry + jr .done +.unset + set 3, [hl] + ld a, d + and $f0 + swap a + add e + jr nc, .done + ld a, $ff +.done + ld d, a + ld b, $3 + call Func_7d8ac + ld [hl], d + ret + +; this routine executes all music commands that take up no time, +; like tempo changes, duty changes etc. and doesn't return +; until the first note is reached +Music1f_Music2_PlayNextNote: ; 7d244 (1f:5244) + ld hl, $c06e + add hl, bc + ld a, [hl] + ld hl, $c04e + add hl, bc + ld [hl], a + ld hl, $c02e + add hl, bc + res 4, [hl] + res 5, [hl] + call Music1f_endchannel + ret + +Music1f_endchannel: ; 7d25a (1f:525a) + call Music1f_GetNextMusicByte + ld d, a + cp $ff ; is this command an endchannel? + jp nz, Music1f_callchannel ; no + ld b, $0 ; yes + ld hl, $c02e + add hl, bc + bit 1, [hl] + jr nz, .returnFromCall + ld a, c + cp CH3 + jr nc, .noiseOrSfxChannel + jr .asm_7d2b3 +.noiseOrSfxChannel + res 2, [hl] + ld hl, $c036 + add hl, bc + res 0, [hl] + cp CH6 + jr nz, .notSfxChannel3 + ld a, $0 + ld [$FF00+$1a], a + ld a, $80 + ld [$FF00+$1a], a +.notSfxChannel3 + jr nz, .asm_7d296 + ld a, [$c003] + and a + jr z, .asm_7d296 + xor a + ld [$c003], a + jr .asm_7d2b3 +.asm_7d296 + jr .asm_7d2bc +.returnFromCall + res 1, [hl] + ld d, $0 + ld a, c + add a + ld e, a + ld hl, $c006 + add hl, de + push hl ; store current channel address + ld hl, $c016 + add hl, de + ld e, l + ld d, h + pop hl + ld a, [de] + ld [hli], a + inc de + ld a, [de] + ld [hl], a ; loads channel address to return to + jp Music1f_endchannel +.asm_7d2b3 + ld hl, Unknown_7db93 + add hl, bc + ld a, [$FF00+$25] + and [hl] + ld [$FF00+$25], a +.asm_7d2bc + ld a, [$c02a] + cp $14 + jr nc, .asm_7d2c5 + jr .asm_7d2e2 +.asm_7d2c5 + ld a, [$c02a] + cp $86 + jr z, .asm_7d2e2 + jr c, .asm_7d2d0 + jr .asm_7d2e2 +.asm_7d2d0 + ld a, c + cp CH4 + jr z, .asm_7d2d9 + call Func_7d73b + ret c +.asm_7d2d9 + ld a, [$c005] + ld [$FF00+$24], a + xor a + ld [$c005], a +.asm_7d2e2 + ld hl, $c026 + add hl, bc + ld [hl], b + ret + +Music1f_callchannel: ; 7d2e8 (1f:52e8) + cp $fd ; is this command a callchannel? + jp nz, Music1f_loopchannel ; no + call Music1f_GetNextMusicByte ; yes + push af + call Music1f_GetNextMusicByte + ld d, a + pop af + ld e, a + push de ; store pointer + ld d, $0 + ld a, c + add a + ld e, a + ld hl, $c006 + add hl, de + push hl + ld hl, $c016 + add hl, de + ld e, l + ld d, h + pop hl + ld a, [hli] + ld [de], a + inc de + ld a, [hld] + ld [de], a ; copy current channel address + pop de + ld [hl], e + inc hl + ld [hl], d ; overwrite current address with pointer + ld b, $0 + ld hl, $c02e + add hl, bc + set 1, [hl] ; set the call flag + jp Music1f_endchannel + +Music1f_loopchannel: ; 7d31d (1f:531d) + cp $fe ; is this command a loopchannel? + jp nz, Music1f_notetype ; no + call Music1f_GetNextMusicByte ; yes + ld e, a + and a + jr z, .infiniteLoop + ld b, $0 + ld hl, $c0be + add hl, bc + ld a, [hl] + cp e + jr nz, .loopAgain + ld a, $1 ; if no more loops to make + ld [hl], a + call Music1f_GetNextMusicByte ; skip pointer + call Music1f_GetNextMusicByte + jp Music1f_endchannel +.loopAgain ; inc loop count + inc a + ld [hl], a + ; fall through +.infiniteLoop ; overwrite current address with pointer + call Music1f_GetNextMusicByte + push af + call Music1f_GetNextMusicByte + ld b, a + ld d, $0 + ld a, c + add a + ld e, a + ld hl, $c006 + add hl, de + pop af + ld [hli], a + ld [hl], b + jp Music1f_endchannel + +Music1f_notetype: ; 7d358 (1f:5358) + and $f0 + cp $d0 ; is this command a notetype? + jp nz, Music1f_togglecall ; no + ld a, d ; yes + and $f + ld b, $0 + ld hl, $c0c6 + add hl, bc + ld [hl], a ; store low nibble as speed + ld a, c + cp CH3 + jr z, .noiseChannel ; noise channel has 0 params + call Music1f_GetNextMusicByte + ld d, a + ld a, c + cp CH2 + jr z, .musicChannel3 + cp CH6 + jr nz, .notChannel3 + ld hl, $c0e7 + jr .sfxChannel3 +.musicChannel3 + ld hl, $c0e6 +.sfxChannel3 + ld a, d + and $f + ld [hl], a ; store low nibble of param as duty + ld a, d + and $30 + sla a + ld d, a + ; fall through + + ; if channel 3, store high nibble as volume + ; else, store volume (high nibble) and fade (low nibble) +.notChannel3 + ld b, $0 + ld hl, $c0de + add hl, bc + ld [hl], d +.noiseChannel + jp Music1f_endchannel + +Music1f_togglecall: ; 7d397 (1f:5397) + ld a, d + cp $e8 ; is this command an togglecall? + jr nz, Music1f_vibrato ; no + ld b, $0 ; yes + ld hl, $c02e + add hl, bc + ld a, [hl] + xor $1 + ld [hl], a ; flip bit 0 of $c02e (toggle returning from call) + jp Music1f_endchannel + +Music1f_vibrato: ; 7d3a9 (1f:53a9) + cp $ea ; is this command a vibrato? + jr nz, Music1f_pitchbend ; no + call Music1f_GetNextMusicByte ; yes + ld b, $0 + ld hl, $c04e + add hl, bc + ld [hl], a ; store delay + ld hl, $c06e + add hl, bc + ld [hl], a ; store delay + call Music1f_GetNextMusicByte + ld d, a + and $f0 + swap a + ld b, $0 + ld hl, $c056 + 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 a, d + and $f + ld d, a + ld hl, $c05e + add hl, bc + swap a + or d + ld [hl], a ; store depth as both high and low nibbles + jp Music1f_endchannel + +Music1f_pitchbend: ; 7d3e1 (1f:53e1) + cp $eb ; is this command a pitchbend? + jr nz, Music1f_duty ; no + call Music1f_GetNextMusicByte ; yes + ld b, $0 + ld hl, $c076 + add hl, bc + ld [hl], a ; store first param + call Music1f_GetNextMusicByte + ld d, a + and $f0 + swap a + ld b, a + ld a, d + and $f + call Func_7d8cc + ld b, $0 + ld hl, $c0a6 + add hl, bc + ld [hl], d ; store unknown part of second param + ld hl, $c0ae + add hl, bc + ld [hl], e ; store unknown part of second param + ld b, $0 + ld hl, $c02e + add hl, bc + set 4, [hl] ; set pitchbend flag + call Music1f_GetNextMusicByte + ld d, a + jp Music1f_notelength + +Music1f_duty: ; 7d419 (1f:5419) + cp $ec ; is this command a duty? + jr nz, Music1f_tempo ; no + call Music1f_GetNextMusicByte ; yes + rrca + rrca + and $c0 + ld b, $0 + ld hl, $c03e + add hl, bc + ld [hl], a ; store duty + jp Music1f_endchannel + +Music1f_tempo: ; 7d42e (1f:542e) + cp $ed ; is this command a tempo? + jr nz, Music1f_unknownmusic0xee ; no + ld a, c ; yes + cp CH4 + jr nc, .sfxChannel + call Music1f_GetNextMusicByte + ld [$c0e8], a ; store first param + call Music1f_GetNextMusicByte + ld [$c0e9], a ; store second param + xor a + ld [$c0ce], a ; clear RAM + ld [$c0cf], a + ld [$c0d0], a + ld [$c0d1], a + jr .musicChannelDone +.sfxChannel + call Music1f_GetNextMusicByte + ld [$c0ea], a ; store first param + call Music1f_GetNextMusicByte + ld [$c0eb], a ; store second param + xor a + ld [$c0d2], a ; clear RAM + ld [$c0d3], a + ld [$c0d4], a + ld [$c0d5], a +.musicChannelDone + jp Music1f_endchannel + +Music1f_unknownmusic0xee: ; 7d46e (1f:546e) + cp $ee ; is this command an unknownmusic0xee? + jr nz, Music1f_unknownmusic0xef ; no + call Music1f_GetNextMusicByte ; yes + ld [$c004], a ; store first param + jp Music1f_endchannel + +; this appears to never be used +Music1f_unknownmusic0xef: ; 7d47b (1f:547b) + cp $ef ; is this command an unknownmusic0xef? + jr nz, Music1f_dutycycle ; no + call Music1f_GetNextMusicByte ; yes + push bc + call Func_7d8ea + pop bc + ld a, [$c003] + and a + jr nz, .skip + ld a, [$c02d] + ld [$c003], a + xor a + ld [$c02d], a +.skip + jp Music1f_endchannel + +Music1f_dutycycle: ; 7d49a (1f:549a) + cp $fc ; is this command a dutycycle? + jr nz, Music1f_stereopanning ; no + call Music1f_GetNextMusicByte ; yes + ld b, $0 + ld hl, $c046 + add hl, bc + ld [hl], a ; store full cycle + and $c0 + ld hl, $c03e + add hl, bc + ld [hl], a ; store first duty + ld hl, $c02e + add hl, bc + set 6, [hl] ; set duty flag + jp Music1f_endchannel + +Music1f_stereopanning: ; 7d4b8 (1f:54b8) + cp $f0 ; is this command a stereopanning? + jr nz, Music1f_executemusic ; no + call Music1f_GetNextMusicByte ; yes + ld [$FF00+$24], a ; store stereopanning + jp Music1f_endchannel + +Music1f_executemusic: ; 7d4c4 (1f:54c4) + cp $f8 ; is this command an executemusic? + jr nz, Music1f_octave ; no + ld b, $0 ; yes + ld hl, $c036 + add hl, bc + set 0, [hl] + jp Music1f_endchannel + +Music1f_octave: ; 7d4d3 (1f:54d3) + and $f0 + cp $e0 ; is this command an octave? + jr nz, Music1f_unknownsfx0x20 ; no + ld hl, $c0d6 ; yes + ld b, $0 + add hl, bc + ld a, d + and $f + ld [hl], a ; store low nibble as octave + jp Music1f_endchannel + +Music1f_unknownsfx0x20: ; 7d4e6 (1f:54e6) + cp $20 ; is this command an unknownsfx0x20? + jr nz, Music1f_unknownsfx0x10 ; no + ld a, c + cp CH3 ; is this a noise or sfx channel? + jr c, Music1f_unknownsfx0x10 ; no + ld b, $0 + ld hl, $c036 + add hl, bc + bit 0, [hl] + jr nz, Music1f_unknownsfx0x10 ; no + call Music1f_notelength ; yes + ld d, a + ld b, $0 + ld hl, $c03e + add hl, bc + ld a, [hl] + or d + ld d, a + ld b, $1 + call Func_7d8ac + ld [hl], d + call Music1f_GetNextMusicByte + ld d, a + ld b, $2 + call Func_7d8ac + ld [hl], d + call Music1f_GetNextMusicByte + ld e, a + ld a, c + cp CH7 + ld a, $0 + jr z, .sfxNoiseChannel ; only two params for noise channel + push de + call Music1f_GetNextMusicByte + pop de +.sfxNoiseChannel + ld d, a + push de + call Func_7d69d + call Func_7d66c + pop de + call Func_7d6bf + ret + +Music1f_unknownsfx0x10 ; 7d533 (1f:5533) + ld a, c + cp CH4 + jr c, Music1f_note ; if not a sfx + ld a, d + cp $10 ; is this command an unknownsfx0x10? + jr nz, Music1f_note ; no + ld b, $0 + ld hl, $c036 + add hl, bc + bit 0, [hl] + jr nz, Music1f_note ; no + call Music1f_GetNextMusicByte ; yes + ld [$FF00+$10], a + jp Music1f_endchannel + +Music1f_note: ; 7d54f (1f:554f) + ld a, c + cp CH3 + jr nz, Music1f_notelength ; if not noise channel + ld a, d + and $f0 + cp $b0 ; is this command a dnote? + jr z, Music1f_dnote ; yes + jr nc, Music1f_notelength ; no + swap a + ld b, a + ld a, d + and $f + ld d, a + ld a, b + push de + push bc + jr asm_7d571 + +Music1f_dnote: ; 7d569 (1f:5569) + ld a, d + and $f + push af + push bc + call Music1f_GetNextMusicByte ; get dnote instrument +asm_7d571 + ld d, a + ld a, [$c003] + and a + jr nz, .asm_7d57c + ld a, d + call Func_7d8ea +.asm_7d57c + pop bc + pop de + +Music1f_notelength: ; 7d57e (1f:557e) + ld a, d + push af + and $f + inc a + ld b, $0 + ld e, a ; store note length (in 16ths) + ld d, b + ld hl, $c0c6 + add hl, bc + ld a, [hl] + ld l, b + call Func_7d8bb + ld a, c + cp CH4 + jr nc, .sfxChannel + ld a, [$c0e8] + ld d, a + ld a, [$c0e9] + ld e, a + jr .skip +.sfxChannel + ld d, $1 + ld e, $0 + cp CH7 + jr z, .skip ; if noise channel + call Func_7d707 + ld a, [$c0ea] + ld d, a + ld a, [$c0eb] + ld e, a +.skip + ld a, l + ld b, $0 + ld hl, $c0ce + add hl, bc + ld l, [hl] + call Func_7d8bb + ld e, l + ld d, h + ld hl, $c0ce + add hl, bc + ld [hl], e + ld a, d + ld hl, $c0b6 + add hl, bc + ld [hl], a + ld hl, $c036 + add hl, bc + bit 0, [hl] + jr nz, Music1f_notepitch + ld hl, $c02e + add hl, bc + bit 2, [hl] + jr z, Music1f_notepitch + pop hl + ret + +Music1f_notepitch: ; 7d5dc (1f:55dc) + pop af + and $f0 + cp $c0 ; compare to rest + jr nz, .notRest + ld a, c + cp CH4 + jr nc, .sfxChannel + ld hl, $c02a + add hl, bc + ld a, [hl] + and a + jr nz, .quit + ; fall through +.sfxChannel + ld a, c + cp CH2 + jr z, .musicChannel3 + cp CH6 + jr nz, .notSfxChannel3 +.musicChannel3 + ld b, $0 + ld hl, Unknown_7db93 + add hl, bc + ld a, [$FF00+$25] + and [hl] + ld [$FF00+$25], a + jr .quit +.notSfxChannel3 + ld b, $2 + call Func_7d8ac + ld a, $8 + ld [hli], a + inc hl + ld a, $80 + ld [hl], a +.quit + ret +.notRest + swap a + ld b, $0 + ld hl, $c0d6 + add hl, bc + ld b, [hl] + call Func_7d8cc + ld b, $0 + ld hl, $c02e + add hl, bc + bit 4, [hl] + jr z, .asm_7d62c + call Func_7d803 +.asm_7d62c + push de + ld a, c + cp CH4 + jr nc, .skip ; if sfx Channel + ld hl, $c02a + ld d, $0 + ld e, a + add hl, de + ld a, [hl] + and a + jr nz, .done + jr .skip +.done + pop de + ret +.skip + ld b, $0 + ld hl, $c0de + add hl, bc + ld d, [hl] + ld b, $2 + call Func_7d8ac + ld [hl], d + call Func_7d69d + call Func_7d66c + pop de + ld b, $0 + ld hl, $c02e + add hl, bc + bit 0, [hl] + jr z, .asm_7d663 + inc e + jr nc, .asm_7d663 + inc d +.asm_7d663 + ld hl, $c066 + add hl, bc + ld [hl], e + call Func_7d6bf + ret + +Func_7d66c: ; 7d66c (1f:566c) + ld b, $0 + ld hl, Unknown_7db9b + add hl, bc + ld a, [$FF00+$25] + or [hl] + ld d, a + ld a, c + cp CH7 + jr z, .sfxNoiseChannel + cp CH4 + jr nc, .skip ; if sfx channel + ld hl, $c02a + add hl, bc + ld a, [hl] + and a + jr nz, .skip +.sfxNoiseChannel + ld a, [$c004] + ld hl, Unknown_7db9b + add hl, bc + and [hl] + ld d, a + ld a, [$FF00+$25] + ld hl, Unknown_7db93 + add hl, bc + and [hl] + or d + ld d, a +.skip + ld a, d + ld [$FF00+$25], a + ret + +Func_7d69d: ; 7d69d (1f:569d) + ld b, $0 + ld hl, $c0b6 + add hl, bc + ld d, [hl] + ld a, c + cp CH2 + jr z, .channel3 ; if music channel 3 + cp CH6 + jr z, .channel3 ; if sfx channel 3 + ld a, d + and $3f + ld d, a + ld hl, $c03e + add hl, bc + ld a, [hl] + or d + ld d, a +.channel3 + ld b, $1 + call Func_7d8ac + ld [hl], d + ret + +Func_7d6bf: ; 7d6bf (1f:56bf) + ld a, c + cp CH2 + jr z, .channel3 + cp CH6 + jr nz, .notSfxChannel3 + ; fall through +.channel3 + push de + ld de, $c0e6 + cp CH2 + jr z, .musicChannel3 + ld de, $c0e7 +.musicChannel3 + ld a, [de] + add a + ld d, $0 + ld e, a + ld hl, Music1f_Channel3DutyPointers + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld hl, $ff30 + ld b, $f + ld a, $0 + ld [$FF00+$1a], a +.loop + ld a, [de] + inc de + ld [hli], a + ld a, b + dec b + and a + jr nz, .loop + ld a, $80 + ld [$FF00+$1a], a + pop de +.notSfxChannel3 + ld a, d + or $80 + and $c7 + ld d, a + ld b, $3 + call Func_7d8ac + ld [hl], e + inc hl + ld [hl], d + call Func_7d729 + ret + +Func_7d707: ; 7d707 (1f:5707) + call Func_7d759 + jr nc, .asm_7d71f + ld d, $0 + ld a, [$c0f2] + add $80 + jr nc, .asm_7d716 + inc d +.asm_7d716 + ld [$c0eb], a + ld a, d + ld [$c0ea], a + jr .asm_7d728 +.asm_7d71f + xor a + ld [$c0eb], a + ld a, $1 + ld [$c0ea], a +.asm_7d728 + ret + +Func_7d729: ; 7d729 (1f:5729) + call Func_7d759 + jr nc, .asm_7d73a + ld a, [$c0f1] + add e + jr nc, .asm_7d735 + inc d +.asm_7d735 + dec hl + ld e, a + ld [hl], e + inc hl + ld [hl], d +.asm_7d73a + ret + +Func_7d73b: ; 7d73b (1f:573b) + call Func_7d759 + jr nc, .asm_7d756 + ld hl, $c006 + ld e, c + ld d, $0 + sla e + rl d + add hl, de + ld a, [hl] + sub $1 + ld [hl], a + inc hl + ld a, [hl] + sbc $0 + ld [hl], a + scf + ret +.asm_7d756 + scf + ccf + ret + +Func_7d759: ; 7d759 (1f:5759) + ld a, [$c02a] + cp $14 + jr nc, .asm_7d762 + jr .asm_7d768 +.asm_7d762 + cp $86 + jr z, .asm_7d768 + jr c, .asm_7d76b +.asm_7d768 + scf + ccf + ret +.asm_7d76b + scf + ret + +Music1f_ApplyPitchBend: ; 7d76d (1f:576d) + ld hl, $c02e + add hl, bc + bit 5, [hl] + jp nz, .asm_7d7b4 + ld hl, $c09e + add hl, bc + ld e, [hl] + ld hl, $c096 + add hl, bc + ld d, [hl] + ld hl, $c07e + add hl, bc + ld l, [hl] + ld h, b + add hl, de + ld d, h + ld e, l + ld hl, $c08e + add hl, bc + push hl + ld hl, $c086 + add hl, bc + ld a, [hl] + pop hl + add [hl] + ld [hl], a + ld a, $0 + adc e + ld e, a + ld a, $0 + adc d + ld d, a + ld hl, $c0a6 + add hl, bc + ld a, [hl] + cp d + jp c, .asm_7d7fa + jr nz, .asm_7d7e7 + ld hl, $c0ae + add hl, bc + ld a, [hl] + cp e + jp c, .asm_7d7fa + jr .asm_7d7e7 +.asm_7d7b4 + ld hl, $c09e + add hl, bc + ld a, [hl] + ld hl, $c096 + add hl, bc + ld d, [hl] + ld hl, $c07e + add hl, bc + ld e, [hl] + sub e + ld e, a + ld a, d + sbc b + ld d, a + ld hl, $c086 + add hl, bc + ld a, [hl] + add a + ld [hl], a + ld a, e + sbc b + ld e, a + ld a, d + sbc b + ld d, a + ld hl, $c0a6 + add hl, bc + ld a, d + cp [hl] + jr c, .asm_7d7fa + jr nz, .asm_7d7e7 + ld hl, $c0ae + add hl, bc + ld a, e + cp [hl] + jr c, .asm_7d7fa +.asm_7d7e7 + ld hl, $c09e + add hl, bc + ld [hl], e + ld hl, $c096 + add hl, bc + ld [hl], d + ld b, $3 + call Func_7d8ac + ld a, e + ld [hli], a + ld [hl], d + ret +.asm_7d7fa + ld hl, $c02e + add hl, bc + res 4, [hl] + res 5, [hl] + ret + +Func_7d803: ; 7d803 (1f:5803) + ld hl, $c096 + add hl, bc + ld [hl], d + ld hl, $c09e + add hl, bc + ld [hl], e + ld hl, $c0b6 + add hl, bc + ld a, [hl] + ld hl, $c076 + add hl, bc + sub [hl] + jr nc, .asm_7d81b + ld a, $1 +.asm_7d81b + ld [hl], a + ld hl, $c0ae + add hl, bc + ld a, e + sub [hl] + ld e, a + ld a, d + sbc b + ld hl, $c0a6 + add hl, bc + sub [hl] + jr c, .asm_7d837 + ld d, a + ld b, $0 + ld hl, $c02e + add hl, bc + set 5, [hl] + jr .asm_7d85a +.asm_7d837 + ld hl, $c096 + add hl, bc + ld d, [hl] + ld hl, $c09e + add hl, bc + ld e, [hl] + ld hl, $c0ae + add hl, bc + ld a, [hl] + sub e + ld e, a + ld a, d + sbc b + ld d, a + ld hl, $c0a6 + add hl, bc + ld a, [hl] + sub d + ld d, a + ld b, $0 + ld hl, $c02e + add hl, bc + res 5, [hl] +.asm_7d85a + ld hl, $c076 + add hl, bc +.asm_7d85e + inc b + ld a, e + sub [hl] + ld e, a + jr nc, .asm_7d85e + ld a, d + and a + jr z, .asm_7d86c + dec a + ld d, a + jr .asm_7d85e +.asm_7d86c + ld a, e + add [hl] + ld d, b + ld b, $0 + ld hl, $c07e + add hl, bc + ld [hl], d + ld hl, $c086 + add hl, bc + ld [hl], a + ld hl, $c08e + add hl, bc + ld [hl], a + ret + +Music1f_ApplyDutyCycle: ; 7d881 (1f:5881) + ld b, $0 + ld hl, $c046 + add hl, bc + ld a, [hl] + rlca + rlca + ld [hl], a + and $c0 + ld d, a + ld b, $1 + call Func_7d8ac + ld a, [hl] + and $3f + or d + ld [hl], a + ret + +Music1f_GetNextMusicByte: ; 7d899 (1f:5899) + ld d, $0 + ld a, c + add a + ld e, a + ld hl, $c006 + add hl, de + ld a, [hli] + ld e, a + ld a, [hld] + ld d, a + ld a, [de] ; get next music command + inc de + ld [hl], e ; store address of next command + inc hl + ld [hl], d + ret + +Func_7d8ac: ; 7d8ac (1f:58ac) + ld a, c + ld hl, Unknown_7db8b + add l + jr nc, .noCarry + inc h +.noCarry + ld l, a + ld a, [hl] + add b + ld l, a + ld h, $ff + ret + +Func_7d8bb: ; 7d8bb (1f:58bb) + ld h, $0 +.loop + srl a + jr nc, .noCarry + add hl, de +.noCarry + sla e + rl d + and a + jr z, .done + jr .loop +.done + ret + +Func_7d8cc: ; 7d8cc (1f:58cc) + ld h, $0 + ld l, a + add hl, hl + ld d, h + ld e, l + ld hl, Unknown_7dba3 + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld a, b +.loop + cp $7 + jr z, .done + sra d + rr e + inc a + jr .loop +.done + ld a, $8 + add d + ld d, a + ret + +Func_7d8ea: ; 7d8ea (1f:58ea) + ld [$c001], a + cp $ff + jp z, Func_7daa8 + cp $c2 + jp z, Func_7d9c2 + jp c, Func_7d9c2 + cp $fe + jr z, .asm_7d901 + jp nc, Func_7d9c2 +.asm_7d901 + xor a + ld [$c000], a + ld [$c003], a + ld [$c0e9], a + ld [$c0e6], a + ld [$c0e7], a + ld d, $8 + ld hl, $c016 + call FillMusicRAM1f + ld hl, $c006 + call FillMusicRAM1f + ld d, $4 + ld hl, $c026 + call FillMusicRAM1f + ld hl, $c02e + call FillMusicRAM1f + ld hl, $c03e + call FillMusicRAM1f + ld hl, $c046 + call FillMusicRAM1f + ld hl, $c04e + call FillMusicRAM1f + ld hl, $c056 + call FillMusicRAM1f + ld hl, $c05e + call FillMusicRAM1f + ld hl, $c066 + call FillMusicRAM1f + ld hl, $c06e + call FillMusicRAM1f + ld hl, $c036 + call FillMusicRAM1f + ld hl, $c076 + call FillMusicRAM1f + ld hl, $c07e + call FillMusicRAM1f + ld hl, $c086 + call FillMusicRAM1f + ld hl, $c08e + call FillMusicRAM1f + ld hl, $c096 + call FillMusicRAM1f + ld hl, $c09e + call FillMusicRAM1f + ld hl, $c0a6 + call FillMusicRAM1f + ld hl, $c0ae + call FillMusicRAM1f + ld a, $1 + ld hl, $c0be + call FillMusicRAM1f + ld hl, $c0b6 + call FillMusicRAM1f + ld hl, $c0c6 + call FillMusicRAM1f + ld [$c0e8], a + ld a, $ff + ld [$c004], a + xor a + ld [$FF00+$24], a + ld a, $8 + ld [$FF00+$10], a + ld a, $0 + ld [$FF00+$25], a + xor a + ld [$FF00+$1a], a + ld a, $80 + ld [$FF00+$1a], a + ld a, $77 + ld [$FF00+$24], a + jp Func_7db03 + +Func_7d9c2: ; 7d9c2 (1f:59c2) + ld l, a + ld e, a + ld h, $0 + ld d, h + add hl, hl + add hl, de + ld de, SFX_Headers_1f + add hl, de + ld a, h + ld [$c0ec], a + ld a, l + ld [$c0ed], a + ld a, [hl] + and $c0 + rlca + rlca + ld c, a +.asm_7d9db + ld d, c + ld a, c + add a + add c + ld c, a + ld b, $0 + ld a, [$c0ec] + ld h, a + ld a, [$c0ed] + ld l, a + add hl, bc + ld c, d + ld a, [hl] + and $f + ld e, a + ld d, $0 + ld hl, $c026 + add hl, de + ld a, [hl] + and a + jr z, .asm_7da17 + ld a, e + cp $7 + jr nz, .asm_7da0e + ld a, [$c001] + cp $14 + jr nc, .asm_7da07 + ret +.asm_7da07 + ld a, [hl] + cp $14 + jr z, .asm_7da17 + jr c, .asm_7da17 +.asm_7da0e + ld a, [$c001] + cp [hl] + jr z, .asm_7da17 + jr c, .asm_7da17 + ret +.asm_7da17 + xor a + push de + ld h, d + ld l, e + add hl, hl + ld d, h + ld e, l + ld hl, $c016 + add hl, de + ld [hli], a + ld [hl], a + ld hl, $c006 + add hl, de + ld [hli], a + ld [hl], a + pop de + ld hl, $c026 + add hl, de + ld [hl], a + ld hl, $c02e + add hl, de + ld [hl], a + ld hl, $c03e + add hl, de + ld [hl], a + ld hl, $c046 + add hl, de + ld [hl], a + ld hl, $c04e + add hl, de + ld [hl], a + ld hl, $c056 + add hl, de + ld [hl], a + ld hl, $c05e + add hl, de + ld [hl], a + ld hl, $c066 + add hl, de + ld [hl], a + ld hl, $c06e + add hl, de + ld [hl], a + ld hl, $c076 + add hl, de + ld [hl], a + ld hl, $c07e + add hl, de + ld [hl], a + ld hl, $c086 + add hl, de + ld [hl], a + ld hl, $c08e + add hl, de + ld [hl], a + ld hl, $c096 + add hl, de + ld [hl], a + ld hl, $c09e + add hl, de + ld [hl], a + ld hl, $c0a6 + add hl, de + ld [hl], a + ld hl, $c0ae + add hl, de + ld [hl], a + ld hl, $c036 + add hl, de + ld [hl], a + ld a, $1 + ld hl, $c0be + add hl, de + ld [hl], a + ld hl, $c0b6 + add hl, de + ld [hl], a + ld hl, $c0c6 + add hl, de + ld [hl], a + ld a, e + cp $4 + jr nz, .asm_7da9f + ld a, $8 + ld [$FF00+$10], a +.asm_7da9f + ld a, c + and a + jp z, Func_7db03 + dec c + jp .asm_7d9db + +Func_7daa8: ; 7daa8 (1f:5aa8) + ld a, $80 + ld [$FF00+$26], a + ld [$FF00+$1a], a + xor a + ld [$FF00+$25], a + ld [$FF00+$1c], a + ld a, $8 + ld [$FF00+$10], a + ld [$FF00+$12], a + ld [$FF00+$17], a + ld [$FF00+$21], a + ld a, $40 + ld [$FF00+$14], a + ld [$FF00+$19], a + ld [$FF00+$23], a + ld a, $77 + ld [$FF00+$24], a + xor a + ld [$c000], a + ld [$c003], a + ld [$c002], a + ld [$c0e9], a + ld [$c0eb], a + ld [$c0e6], a + ld [$c0e7], a + ld d, $a0 + ld hl, $c006 + call FillMusicRAM1f + ld a, $1 + ld d, $18 + ld hl, $c0b6 + call FillMusicRAM1f + ld [$c0e8], a + ld [$c0ea], a + ld a, $ff + ld [$c004], a + ret + +; fills d bytes at hl with a +FillMusicRAM1f: ; 7dafd (1f:5afd) + ld b, d +.loop + ld [hli], a + dec b + jr nz, .loop + ret + +Func_7db03: ; 7db03 (1f:5b03) + ld a, [$c001] + ld l, a + ld e, a + ld h, $0 + ld d, h + add hl, hl + add hl, de + ld de, SFX_Headers_1f + add hl, de + ld e, l + ld d, h + ld hl, $c006 + ld a, [de] ; get channel number + ld b, a + rlca + rlca + and $3 + ld c, a + ld a, b + and $f + ld b, c + inc b + inc de + ld c, $0 +.asm_7db25 + cp c + jr z, .asm_7db2d + inc c + inc hl + inc hl + jr .asm_7db25 +.asm_7db2d + push hl + push bc + push af + ld b, $0 + ld c, a + ld hl, $c026 + add hl, bc + ld a, [$c001] + ld [hl], a + pop af + cp $3 + jr c, .asm_7db46 + ld hl, $c02e + add hl, bc + set 2, [hl] +.asm_7db46 + pop bc + pop hl + ld a, [de] ; get channel pointer + ld [hli], a + inc de + ld a, [de] + ld [hli], a + inc de + inc c + dec b + ld a, b + and a + ld a, [de] + inc de + jr nz, .asm_7db25 + ld a, [$c001] + cp $14 + jr nc, .asm_7db5f + jr .asm_7db89 +.asm_7db5f + ld a, [$c001] + cp $86 + jr z, .asm_7db89 + jr c, .asm_7db6a + jr .asm_7db89 +.asm_7db6a + ld hl, $c02a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hl], a + ld hl, $c012 ; sfx noise channel pointer + ld de, Noise1f_endchannel + ld [hl], e + inc hl + ld [hl], d ; overwrite pointer to point to endchannel + ld a, [$c005] + and a + jr nz, .asm_7db89 + ld a, [$FF00+$24] + ld [$c005], a + ld a, $77 + ld [$FF00+$24], a +.asm_7db89 + ret + +Noise1f_endchannel: ; 7db8a (1f:5b8a) + endchannel + +Unknown_7db8b: ; 7db8b (1f:5b8b) + db $10, $15, $1A, $1F ; channels 0-3 + db $10, $15, $1A, $1F ; channels 4-7 + +Unknown_7db93: ; 7db93 (1f:5b93) + db $EE, $DD, $BB, $77 ; channels 0-3 + db $EE, $DD, $BB, $77 ; channels 4-7 + +Unknown_7db9b: ; 7db9b (1f:5b9b) + db $11, $22, $44, $88 ; channels 0-3 + db $11, $22, $44, $88 ; channels 4-7 + +Unknown_7dba3: ; 7dba3 (1f:5ba3) + dw $F82C + dw $F89D + dw $F907 + dw $F96B + dw $F9CA + dw $FA23 + dw $FA77 + dw $FAC7 + dw $FB12 + dw $FB58 + dw $FB9B + dw $FBDA + + @@ -18485,1684 +18485,9 @@ PlayBattleMusic: ; 0x90c6 .playSong jp PlayMusic -Func_9103: ; 0x9103 - ld c, CH0 -.loop - ld b, $0 - ld hl, $c026 - 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, [$c002] - and a - jr z, .asm_912e - bit 7, a - jr nz, .nextChannel - set 7, a - ld [$c002], a - xor a - ld [$ff00+$25], a - ld [$ff00+$1a], a - ld a, $80 - ld [$ff00+$1a], a - jr .nextChannel -.asm_912e - call Music2_ApplyMusicAffects -.nextChannel - ld a, c - inc c ; inc channel number - cp CH7 - jr nz, .loop - ret - -; this routine checks flags for music effects currently applied -; to the channel and calls certain functions based on flags. -; known flags for $c02e: -; 1: call has been used -; 3: a toggle used only by this routine for vibrato -; 4: pitchbend flag -; 6: dutycycle flag -Music2_ApplyMusicAffects: ; 0x9138 - ld b, $0 - ld hl, $c0b6 ; delay unitl next note - add hl, bc - ld a, [hl] - cp $1 ; if the delay is 1, play next note - jp z, Music2_PlayNextNote - dec a ; otherwise, decrease the delay timer - ld [hl], a - ld a, c - cp CH4 - jr nc, .startChecks ; if a sfx channel - ld hl, $c02a - add hl, bc - ld a, [hl] - and a - jr z, .startChecks - ret -.startChecks - ld hl, $c02e - add hl, bc - bit 6, [hl] ; dutycycle - jr z, .checkForExecuteMusic - call Music2_ApplyDutyCycle -.checkForExecuteMusic - ld b, $0 - ld hl, $c036 - add hl, bc - bit 0, [hl] - jr nz, .checkForPitchBend - ld hl, $c02e - add hl, bc - bit 2, [hl] - jr nz, .disablePitchBendVibrato -.checkForPitchBend - ld hl, $c02e - add hl, bc - bit 4, [hl] ; pitchbend - jr z, .checkVibratoDelay - jp Music2_ApplyPitchBend -.checkVibratoDelay - ld hl, $c04e ; vibrato delay - add hl, bc - ld a, [hl] - and a ; check if delay is over - jr z, .checkForVibrato - dec [hl] ; otherwise, dec delay -.disablePitchBendVibrato - ret -.checkForVibrato - ld hl, $c056 ; vibrato rate - add hl, bc - ld a, [hl] - and a - jr nz, .vibrato - ret ; no vibrato -.vibrato - ld d, a - ld hl, $c05e - add hl, bc - ld a, [hl] - and $f - and a - jr z, .vibratoAlreadyDone - dec [hl] ; apply vibrato pitch change - ret -.vibratoAlreadyDone - ld a, [hl] - swap [hl] - or [hl] - ld [hl], a ; reset the vibrato value and start again - ld hl, $c066 - add hl, bc - ld e, [hl] ; get note pitch - ld hl, $c02e - 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] - ld a, d - and $f - ld d, a - ld a, e - sub d - jr nc, .noCarry - ld a, $0 -.noCarry - jr .done -.unset - set 3, [hl] - ld a, d - and $f0 - swap a - add e - jr nc, .done - ld a, $ff -.done - ld d, a - ld b, $3 - call Func_9838 - ld [hl], d - ret - -; this routine executes all music commands that take up no time, -; like tempo changes, duty changes etc. and doesn't return -; until the first note is reached -Music2_PlayNextNote ; 0x91d0 - ld hl, $c06e - add hl, bc - ld a, [hl] - ld hl, $c04e - add hl, bc - ld [hl], a - ld hl, $c02e - add hl, bc - res 4, [hl] - res 5, [hl] - call Music2_endchannel - ret - -Music2_endchannel: ; 0x91e6 - call Music2_GetNextMusicByte - ld d, a - cp $ff ; is this command an endchannel? - jp nz, Music2_callchannel ; no - ld b, $0 ; yes - ld hl, $c02e - add hl, bc - bit 1, [hl] - jr nz, .returnFromCall - ld a, c - cp CH3 - jr nc, .noiseOrSfxChannel - jr .asm_923f -.noiseOrSfxChannel - res 2, [hl] - ld hl, $c036 - add hl, bc - res 0, [hl] - cp CH6 - jr nz, .notSfxChannel3 - ld a, $0 - ld [$ff00+$1a], a - ld a, $80 - ld [$ff00+$1a], a -.notSfxChannel3 - jr nz, .asm_9222 - ld a, [$c003] - and a - jr z, .asm_9222 - xor a - ld [$c003], a - jr .asm_923f -.asm_9222 - jr .asm_9248 -.returnFromCall - res 1, [hl] - ld d, $0 - ld a, c - add a - ld e, a - ld hl, $c006 - add hl, de - push hl ; store current channel address - ld hl, $c016 - add hl, de - ld e, l - ld d, h - pop hl - ld a, [de] - ld [hli], a - inc de - ld a, [de] - ld [hl], a ; loads channel address to return to - jp Music2_endchannel -.asm_923f - ld hl, Unknown_9b1f - add hl, bc - ld a, [$ff00+$25] - and [hl] - ld [$ff00+$25], a -.asm_9248 - ld a, [$c02a] - cp $14 - jr nc, .asm_9251 - jr .asm_926e -.asm_9251 - ld a, [$c02a] - cp $86 - jr z, .asm_926e - jr c, .asm_925c - jr .asm_926e -.asm_925c - ld a, c - cp CH4 - jr z, .asm_9265 - call Func_96c7 - ret c -.asm_9265 - ld a, [$c005] - ld [$ff00+$24], a - xor a - ld [$c005], a -.asm_926e - ld hl, $c026 - add hl, bc - ld [hl], b - ret - -Music2_callchannel: ; 0x9274 - cp $fd ; is this command a callchannel? - jp nz, Music2_loopchannel ; no - call Music2_GetNextMusicByte ; yes - push af - call Music2_GetNextMusicByte - ld d, a - pop af - ld e, a - push de ; store pointer - ld d, $0 - ld a, c - add a - ld e, a - ld hl, $c006 - add hl, de - push hl - ld hl, $c016 - add hl, de - ld e, l - ld d, h - pop hl - ld a, [hli] - ld [de], a - inc de - ld a, [hld] - ld [de], a ; copy current channel address - pop de - ld [hl], e - inc hl - ld [hl], d ; overwrite current address with pointer - ld b, $0 - ld hl, $c02e - add hl, bc - set 1, [hl] ; set the call flag - jp Music2_endchannel - -Music2_loopchannel: ; 0x92a9 - cp $fe ; is this command a loopchannel? - jp nz, Music2_notetype ; no - call Music2_GetNextMusicByte ; yes - ld e, a - and a - jr z, .infiniteLoop - ld b, $0 - ld hl, $c0be - add hl, bc - ld a, [hl] - cp e - jr nz, .loopAgain - ld a, $1 ; if no more loops to make, - ld [hl], a - call Music2_GetNextMusicByte ; skip pointer - call Music2_GetNextMusicByte - jp Music2_endchannel -.loopAgain ; inc loop count - inc a - ld [hl], a - ; fall through -.infiniteLoop ; overwrite current address with pointer - call Music2_GetNextMusicByte - push af - call Music2_GetNextMusicByte - ld b, a - ld d, $0 - ld a, c - add a - ld e, a - ld hl, $c006 - add hl, de - pop af - ld [hli], a - ld [hl], b - jp Music2_endchannel - -Music2_notetype: ; 0x92e4 - and $f0 - cp $d0 ; is this command a notetype? - jp nz, Music2_togglecall ; no - ld a, d ; yes - and $f - ld b, $0 - ld hl, $c0c6 - add hl, bc - ld [hl], a ; store low nibble as speed - ld a, c - cp CH3 - jr z, .noiseChannel ; noise channel has 0 params - call Music2_GetNextMusicByte - ld d, a - ld a, c - cp CH2 - jr z, .musicChannel3 - cp CH6 - jr nz, .notChannel3 - ld hl, $c0e7 - jr .sfxChannel3 -.musicChannel3 - ld hl, $c0e6 -.sfxChannel3 - ld a, d - and $f - ld [hl], a ; store low nibble of param as duty - ld a, d - and $30 - sla a - ld d, a - ; fall through - - ; if channel 3, store high nibble as volume - ; else, store volume (high nibble) and fade (low nibble) -.notChannel3 - ld b, $0 - ld hl, $c0de - add hl, bc - ld [hl], d -.noiseChannel - jp Music2_endchannel - -Music2_togglecall: ; 0x9323 - ld a, d - cp $e8 ; is this command an togglecall? - jr nz, Music2_vibrato ; no - ld b, $0 ; yes - ld hl, $c02e - add hl, bc - ld a, [hl] - xor $1 - ld [hl], a ; flip bit 0 of $c02e (toggle returning from call) - jp Music2_endchannel - -Music2_vibrato: ; 0x9335 - cp $ea ; is this command a vibrato? - jr nz, Music2_pitchbend ; no - call Music2_GetNextMusicByte ; yes - ld b, $0 - ld hl, $c04e - add hl, bc - ld [hl], a ; store delay - ld hl, $c06e - add hl, bc - ld [hl], a ; store delay - call Music2_GetNextMusicByte - ld d, a - and $f0 - swap a - ld b, $0 - ld hl, $c056 - 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 a, d - and $f - ld d, a - ld hl, $c05e - add hl, bc - swap a - or d - ld [hl], a ; store depth as both high and low nibbles - jp Music2_endchannel - -Music2_pitchbend: ; 0x936d - cp $eb ; is this command a pitchbend? - jr nz, Music2_duty ; no - call Music2_GetNextMusicByte ; yes - ld b, $0 - ld hl, $c076 - add hl, bc - ld [hl], a ; store first param - call Music2_GetNextMusicByte - ld d, a - and $f0 - swap a - ld b, a - ld a, d - and $f - call Func_9858 - ld b, $0 - ld hl, $c0a6 - add hl, bc - ld [hl], d ; store unknown part of second param - ld hl, $c0ae - add hl, bc - ld [hl], e ; store unknown part of second param - ld b, $0 - ld hl, $c02e - add hl, bc - set 4, [hl] ; set pitchbend flag - call Music2_GetNextMusicByte - ld d, a - jp Music2_notelength - -Music2_duty: ; 0x93a5 - cp $ec ; is this command a duty? - jr nz, Music2_tempo ; no - call Music2_GetNextMusicByte ; yes - rrca - rrca - and $c0 - ld b, $0 - ld hl, $c03e - add hl, bc - ld [hl], a ; store duty - jp Music2_endchannel - -Music2_tempo: ; 0x93ba - cp $ed ; is this command a tempo? - jr nz, Music2_unknownmusic0xee ; no - ld a, c ; yes - cp CH4 - jr nc, .sfxChannel - call Music2_GetNextMusicByte - ld [$c0e8], a ; store first param - call Music2_GetNextMusicByte - ld [$c0e9], a ; store second param - xor a - ld [$c0ce], a ; clear RAM - ld [$c0cf], a - ld [$c0d0], a - ld [$c0d1], a - jr .musicChannelDone -.sfxChannel - call Music2_GetNextMusicByte - ld [$c0ea], a ; store first param - call Music2_GetNextMusicByte - ld [$c0eb], a ; store second param - xor a - ld [$c0d2], a ; clear RAM - ld [$c0d3], a - ld [$c0d4], a - ld [$c0d5], a -.musicChannelDone - jp Music2_endchannel - -Music2_unknownmusic0xee: ; 0x93fa - cp $ee ; is this command an unknownmusic0xee? - jr nz, Music2_unknownmusic0xef ; no - call Music2_GetNextMusicByte ; yes - ld [$c004], a ; store first param - jp Music2_endchannel - -; this appears to never be used -Music2_unknownmusic0xef ; 0x9407 - cp $ef ; is this command an unknownmusic0xef? - jr nz, Music2_dutycycle ; no - call Music2_GetNextMusicByte ; yes - push bc - call Func_9876 - pop bc - ld a, [$c003] - and a - jr nz, .skip - ld a, [$c02d] - ld [$c003], a - xor a - ld [$c02d], a -.skip - jp Music2_endchannel - -Music2_dutycycle: ; 0x9426 - cp $fc ; is this command a dutycycle? - jr nz, Music2_stereopanning ; no - call Music2_GetNextMusicByte ; yes - ld b, $0 - ld hl, $c046 - add hl, bc - ld [hl], a ; store full cycle - and $c0 - ld hl, $c03e - add hl, bc - ld [hl], a ; store first duty - ld hl, $c02e - add hl, bc - set 6, [hl] ; set dutycycle flag - jp Music2_endchannel - -Music2_stereopanning: ; 0x9444 - cp $f0 ; is this command a stereopanning? - jr nz, Music2_executemusic ; no - call Music2_GetNextMusicByte ; yes - ld [$ff00+$24], a ; store stereopanning - jp Music2_endchannel - -Music2_executemusic: ; 0x9450 - cp $f8 ; is this command an executemusic? - jr nz, Music2_octave ; no - ld b, $0 ; yes - ld hl, $c036 - add hl, bc - set 0, [hl] - jp Music2_endchannel - -Music2_octave: ; 0x945f - and $f0 - cp $e0 ; is this command an octave? - jr nz, Music2_unknownsfx0x20 ; no - ld hl, $c0d6 ; yes - ld b, $0 - add hl, bc - ld a, d - and $f - ld [hl], a ; store low nibble as octave - jp Music2_endchannel - -Music2_unknownsfx0x20: ; 0x9472 - cp $20 ; is this command an unknownsfx0x20? - jr nz, Music2_unknownsfx0x10 ; no - ld a, c - cp CH3 ; is this a noise or sfx channel? - jr c, Music2_unknownsfx0x10 ; no - ld b, $0 - ld hl, $c036 - add hl, bc - bit 0, [hl] - jr nz, Music2_unknownsfx0x10 ; no - call Music2_notelength ; yes - ld d, a - ld b, $0 - ld hl, $c03e - add hl, bc - ld a, [hl] - or d - ld d, a - ld b, $1 - call Func_9838 - ld [hl], d - call Music2_GetNextMusicByte - ld d, a - ld b, $2 - call Func_9838 - ld [hl], d - call Music2_GetNextMusicByte - ld e, a - ld a, c - cp CH7 - ld a, $0 - jr z, .sfxNoiseChannel ; only two params for noise channel - push de - call Music2_GetNextMusicByte - pop de -.sfxNoiseChannel - ld d, a - push de - call Func_9629 - call Func_95f8 - pop de - call Func_964b - ret - -Music2_unknownsfx0x10: - ld a, c - cp CH4 - jr c, Music2_note ; if not a sfx - ld a, d - cp $10 ; is this command a unknownsfx0x10? - jr nz, Music2_note ; no - ld b, $0 - ld hl, $c036 - add hl, bc - bit 0, [hl] - jr nz, Music2_note ; no - call Music2_GetNextMusicByte ; yes - ld [$ff00+$10], a - jp Music2_endchannel - -Music2_note: - ld a, c - cp CH3 - jr nz, Music2_notelength ; if not noise channel - ld a, d - and $f0 - cp $b0 ; is this command a dnote? - jr z, Music2_dnote ; yes - jr nc, Music2_notelength ; no - swap a - ld b, a - ld a, d - and $f - ld d, a - ld a, b - push de - push bc - jr asm_94fd - -Music2_dnote: - ld a, d - and $f - push af - push bc - call Music2_GetNextMusicByte ; get dnote instrument -asm_94fd - ld d, a - ld a, [$c003] - and a - jr nz, .asm_9508 - ld a, d - call Func_9876 -.asm_9508 - pop bc - pop de - -Music2_notelength: ; 0x950a - ld a, d - push af - and $f - inc a - ld b, $0 - ld e, a ; store note length (in 16ths) - ld d, b - ld hl, $c0c6 - add hl, bc - ld a, [hl] - ld l, b - call Func_9847 - ld a, c - cp CH4 - jr nc, .sfxChannel - ld a, [$c0e8] - ld d, a - ld a, [$c0e9] - ld e, a - jr .skip -.sfxChannel - ld d, $1 - ld e, $0 - cp CH7 - jr z, .skip ; if noise channel - call Func_9693 - ld a, [$c0ea] - ld d, a - ld a, [$c0eb] - ld e, a -.skip - ld a, l - ld b, $0 - ld hl, $c0ce - add hl, bc - ld l, [hl] - call Func_9847 - ld e, l - ld d, h - ld hl, $c0ce - add hl, bc - ld [hl], e - ld a, d - ld hl, $c0b6 - add hl, bc - ld [hl], a - ld hl, $c036 - add hl, bc - bit 0, [hl] - jr nz, Music2_notepitch - ld hl, $c02e - add hl, bc - bit 2, [hl] - jr z, Music2_notepitch - pop hl - ret - -Music2_notepitch: ; 0x9568 - pop af - and $f0 - cp $c0 ; compare to rest - jr nz, .notRest - ld a, c - cp CH4 - jr nc, .sfxChannel - ld hl, $c02a - add hl, bc - ld a, [hl] - and a - jr nz, .done - ; fall through -.sfxChannel - ld a, c - cp CH2 - jr z, .musicChannel3 - cp CH6 - jr nz, .notSfxChannel3 -.musicChannel3 - ld b, $0 - ld hl, Unknown_9b1f - add hl, bc - ld a, [$ff00+$25] - and [hl] - ld [$ff00+$25], a - jr .done -.notSfxChannel3 - ld b, $2 - call Func_9838 - ld a, $8 - ld [hli], a - inc hl - ld a, $80 - ld [hl], a -.done - ret -.notRest - swap a - ld b, $0 - ld hl, $c0d6 - add hl, bc - ld b, [hl] - call Func_9858 - ld b, $0 - ld hl, $c02e - add hl, bc - bit 4, [hl] - jr z, .asm_95b8 - call Func_978f -.asm_95b8 - push de - ld a, c - cp CH4 - jr nc, .skip ; if sfx channel - ld hl, $c02a - ld d, $0 - ld e, a - add hl, de - ld a, [hl] - and a - jr nz, .asm_95cb - jr .skip -.asm_95cb - pop de - ret -.skip - ld b, $0 - ld hl, $c0de - add hl, bc - ld d, [hl] - ld b, $2 - call Func_9838 - ld [hl], d - call Func_9629 - call Func_95f8 - pop de - ld b, $0 - ld hl, $c02e - add hl, bc - bit 0, [hl] - jr z, .asm_95ef - inc e - jr nc, .asm_95ef - inc d -.asm_95ef - ld hl, $c066 - add hl, bc - ld [hl], e - call Func_964b - ret - -Func_95f8: ; 0x95f8 - ld b, $0 - ld hl, Unknown_9b27 - add hl, bc - ld a, [$ff00+$25] - or [hl] - ld d, a - ld a, c - cp CH7 - jr z, .sfxNoiseChannel - cp CH4 - jr nc, .skip ; if sfx channel - ld hl, $c02a - add hl, bc - ld a, [hl] - and a - jr nz, .skip -.sfxNoiseChannel - ld a, [$c004] - ld hl, Unknown_9b27 - add hl, bc - and [hl] - ld d, a - ld a, [$ff00+$25] - ld hl, Unknown_9b1f - add hl, bc - and [hl] - or d - ld d, a -.skip - ld a, d - ld [$ff00+$25], a - ret - -Func_9629: ; 0x9629 - ld b, $0 - ld hl, $c0b6 - add hl, bc - ld d, [hl] - ld a, c - cp CH2 - jr z, .channel3 ; if music channel 3 - cp CH6 - jr z, .channel3 ; if sfx channel 3 - ld a, d - and $3f - ld d, a - ld hl, $c03e - add hl, bc - ld a, [hl] - or d - ld d, a -.channel3 - ld b, $1 - call Func_9838 - ld [hl], d - ret - -Func_964b: ; 0x964b - ld a, c - cp CH2 - jr z, .channel3 - cp CH6 - jr nz, .notSfxChannel3 - ; fall through -.channel3 - push de - ld de, $c0e6 - cp CH2 - jr z, .musicChannel3 - ld de, $c0e7 -.musicChannel3 - ld a, [de] - add a - ld d, $0 - ld e, a - ld hl, Music2_Channel3DutyPointers - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - ld hl, $ff30 - ld b, $f - ld a, $0 - ld [$ff00+$1a], a -.loop - ld a, [de] - inc de - ld [hli], a - ld a, b - dec b - and a - jr nz, .loop - ld a, $80 - ld [$ff00+$1a], a - pop de -.notSfxChannel3 - ld a, d - or $80 - and $c7 - ld d, a - ld b, $3 - call Func_9838 - ld [hl], e - inc hl - ld [hl], d - call Func_96b5 - ret - -Func_9693: ; 0x9693 - call Func_96e5 - jr nc, .asm_96ab - ld d, $0 - ld a, [$c0f2] - add $80 - jr nc, .asm_96a2 - inc d -.asm_96a2 - ld [$c0eb], a - ld a, d - ld [$c0ea], a - jr .asm_96b4 -.asm_96ab - xor a - ld [$c0eb], a - ld a, $1 - ld [$c0ea], a -.asm_96b4 - ret - -Func_96b5: ; 0x96b5 - call Func_96e5 - jr nc, .asm_96c6 - ld a, [$c0f1] - add e - jr nc, .asm_96c1 - inc d -.asm_96c1 - dec hl - ld e, a - ld [hl], e - inc hl - ld [hl], d -.asm_96c6 - ret - -Func_96c7: ; 0x96c7 - call Func_96e5 - jr nc, .asm_96e2 - ld hl, $c006 - ld e, c - ld d, $0 - sla e - rl d - add hl, de - ld a, [hl] - sub $1 - ld [hl], a - inc hl - ld a, [hl] - sbc $0 - ld [hl], a - scf - ret -.asm_96e2 - scf - ccf - ret - -Func_96e5: ; 0x96e5 - ld a, [$c02a] - cp $14 - jr nc, .asm_96ee - jr .asm_96f4 -.asm_96ee - cp $86 - jr z, .asm_96f4 - jr c, .asm_96f7 -.asm_96f4 - scf - ccf - ret -.asm_96f7 - scf - ret - -Music2_ApplyPitchBend: ; 0x96f9 - ld hl, $c02e - add hl, bc - bit 5, [hl] - jp nz, .asm_9740 - ld hl, $c09e - add hl, bc - ld e, [hl] - ld hl, $c096 - add hl, bc - ld d, [hl] - ld hl, $c07e - add hl, bc - ld l, [hl] - ld h, b - add hl, de - ld d, h - ld e, l - ld hl, $c08e - add hl, bc - push hl - ld hl, $c086 - add hl, bc - ld a, [hl] - pop hl - add [hl] - ld [hl], a - ld a, $0 - adc e - ld e, a - ld a, $0 - adc d - ld d, a - ld hl, $c0a6 - add hl, bc - ld a, [hl] - cp d - jp c, .asm_9786 - jr nz, .asm_9773 - ld hl, $c0ae - add hl, bc - ld a, [hl] - cp e - jp c, .asm_9786 - jr .asm_9773 -.asm_9740 - ld hl, $c09e - add hl, bc - ld a, [hl] - ld hl, $c096 - add hl, bc - ld d, [hl] - ld hl, $c07e - add hl, bc - ld e, [hl] - sub e - ld e, a - ld a, d - sbc b - ld d, a - ld hl, $c086 - add hl, bc - ld a, [hl] - add a - ld [hl], a - ld a, e - sbc b - ld e, a - ld a, d - sbc b - ld d, a - ld hl, $c0a6 - add hl, bc - ld a, d - cp [hl] - jr c, .asm_9786 - jr nz, .asm_9773 - ld hl, $c0ae - add hl, bc - ld a, e - cp [hl] - jr c, .asm_9786 -.asm_9773 - ld hl, $c09e - add hl, bc - ld [hl], e - ld hl, $c096 - add hl, bc - ld [hl], d - ld b, $3 - call Func_9838 - ld a, e - ld [hli], a - ld [hl], d - ret -.asm_9786 - ld hl, $c02e - add hl, bc - res 4, [hl] - res 5, [hl] - ret - -Func_978f: ; 0x978f - ld hl, $c096 - add hl, bc - ld [hl], d - ld hl, $c09e - add hl, bc - ld [hl], e - ld hl, $c0b6 - add hl, bc - ld a, [hl] - ld hl, $c076 - add hl, bc - sub [hl] - jr nc, .asm_97a7 - ld a, $1 -.asm_97a7 - ld [hl], a - ld hl, $c0ae - add hl, bc - ld a, e - sub [hl] - ld e, a - ld a, d - sbc b - ld hl, $c0a6 - add hl, bc - sub [hl] - jr c, .asm_97c3 - ld d, a - ld b, $0 - ld hl, $c02e - add hl, bc - set 5, [hl] - jr .asm_97e6 -.asm_97c3 - ld hl, $c096 - add hl, bc - ld d, [hl] - ld hl, $c09e - add hl, bc - ld e, [hl] - ld hl, $c0ae - add hl, bc - ld a, [hl] - sub e - ld e, a - ld a, d - sbc b - ld d, a - ld hl, $c0a6 - add hl, bc - ld a, [hl] - sub d - ld d, a - ld b, $0 - ld hl, $c02e - add hl, bc - res 5, [hl] -.asm_97e6 - ld hl, $c076 - add hl, bc -.asm_97ea - inc b - ld a, e - sub [hl] - ld e, a - jr nc, .asm_97ea - ld a, d - and a - jr z, .asm_97f8 - dec a - ld d, a - jr .asm_97ea -.asm_97f8 - ld a, e - add [hl] - ld d, b - ld b, $0 - ld hl, $c07e - add hl, bc - ld [hl], d - ld hl, $c086 - add hl, bc - ld [hl], a - ld hl, $c08e - add hl, bc - ld [hl], a - ret - -Music2_ApplyDutyCycle: ; 0x980d - ld b, $0 - ld hl, $c046 - add hl, bc - ld a, [hl] - rlca - rlca - ld [hl], a - and $c0 - ld d, a - ld b, $1 - call Func_9838 - ld a, [hl] - and $3f - or d - ld [hl], a - ret - -Music2_GetNextMusicByte: ; 0x9825 - ld d, $0 - ld a, c - add a - ld e, a - ld hl, $c006 - add hl, de - ld a, [hli] - ld e, a - ld a, [hld] - ld d, a - ld a, [de] ; get next music command - inc de - ld [hl], e ; store address of next command - inc hl - ld [hl], d - ret - -Func_9838: ; 0x9838 - ld a, c - ld hl, Unknown_9b17 - add l - jr nc, .noCarry - inc h -.noCarry - ld l, a - ld a, [hl] - add b - ld l, a - ld h, $ff - ret - -Func_9847: ; 0x9847 - ld h, $0 -.loop - srl a - jr nc, .noCarry - add hl, de -.noCarry - sla e - rl d - and a - jr z, .done - jr .loop -.done - ret - -Func_9858: ; 0x9858 - ld h, $0 - ld l, a - add hl, hl - ld d, h - ld e, l - ld hl, Unknown_9b2f - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - ld a, b -.loop - cp $7 - jr z, .done - sra d - rr e - inc a - jr .loop -.done - ld a, $8 - add d - ld d, a - ret -Func_9876: ; 0x9876 - ld [$c001], a - cp $ff - jp z, Func_9a34 - cp $b9 - jp z, Func_994e - jp c, Func_994e - cp $fe - jr z, .asm_988d - jp nc, Func_994e -.asm_988d - xor a - ld [$c000], a - ld [$c003], a - ld [$c0e9], a - ld [$c0e6], a - ld [$c0e7], a - ld d, $8 - ld hl, $c016 - call FillMusicRAM2 - ld hl, $c006 - call FillMusicRAM2 - ld d, $4 - ld hl, $c026 - call FillMusicRAM2 - ld hl, $c02e - call FillMusicRAM2 - ld hl, $c03e - call FillMusicRAM2 - ld hl, $c046 - call FillMusicRAM2 - ld hl, $c04e - call FillMusicRAM2 - ld hl, $c056 - call FillMusicRAM2 - ld hl, $c05e - call FillMusicRAM2 - ld hl, $c066 - call FillMusicRAM2 - ld hl, $c06e - call FillMusicRAM2 - ld hl, $c036 - call FillMusicRAM2 - ld hl, $c076 - call FillMusicRAM2 - ld hl, $c07e - call FillMusicRAM2 - ld hl, $c086 - call FillMusicRAM2 - ld hl, $c08e - call FillMusicRAM2 - ld hl, $c096 - call FillMusicRAM2 - ld hl, $c09e - call FillMusicRAM2 - ld hl, $c0a6 - call FillMusicRAM2 - ld hl, $c0ae - call FillMusicRAM2 - ld a, $1 - ld hl, $c0be - call FillMusicRAM2 - ld hl, $c0b6 - call FillMusicRAM2 - ld hl, $c0c6 - call FillMusicRAM2 - ld [$c0e8], a - ld a, $ff - ld [$c004], a - xor a - ld [$ff00+$24], a - ld a, $8 - ld [$ff00+$10], a - ld a, $0 - ld [$ff00+$25], a - xor a - ld [$ff00+$1a], a - ld a, $80 - ld [$ff00+$1a], a - ld a, $77 - ld [$ff00+$24], a - jp Func_9a8f +INCLUDE "audio/engine_1.asm" -Func_994e: ; 0x994e - ld l, a - ld e, a - ld h, $0 - ld d, h - add hl, hl - add hl, de - ld de, SFX_Headers_02 - add hl, de - ld a, h - ld [$c0ec], a - ld a, l - ld [$c0ed], a - ld a, [hl] - and $c0 - rlca - rlca - ld c, a -.asm_9967 - ld d, c - ld a, c - add a - add c - ld c, a - ld b, $0 - ld a, [$c0ec] - ld h, a - ld a, [$c0ed] - ld l, a - add hl, bc - ld c, d - ld a, [hl] - and $f - ld e, a - ld d, $0 - ld hl, $c026 - add hl, de - ld a, [hl] - and a - jr z, .asm_99a3 - ld a, e - cp $7 - jr nz, .asm_999a - ld a, [$c001] - cp $14 - jr nc, .asm_9993 - ret -.asm_9993 - ld a, [hl] - cp $14 - jr z, .asm_99a3 - jr c, .asm_99a3 -.asm_999a - ld a, [$c001] - cp [hl] - jr z, .asm_99a3 - jr c, .asm_99a3 - ret -.asm_99a3 - xor a - push de - ld h, d - ld l, e - add hl, hl - ld d, h - ld e, l - ld hl, $c016 - add hl, de - ld [hli], a - ld [hl], a - ld hl, $c006 - add hl, de - ld [hli], a - ld [hl], a - pop de - ld hl, $c026 - add hl, de - ld [hl], a - ld hl, $c02e - add hl, de - ld [hl], a - ld hl, $c03e - add hl, de - ld [hl], a - ld hl, $c046 - add hl, de - ld [hl], a - ld hl, $c04e - add hl, de - ld [hl], a - ld hl, $c056 - add hl, de - ld [hl], a - ld hl, $c05e - add hl, de - ld [hl], a - ld hl, $c066 - add hl, de - ld [hl], a - ld hl, $c06e - add hl, de - ld [hl], a - ld hl, $c076 - add hl, de - ld [hl], a - ld hl, $c07e - add hl, de - ld [hl], a - ld hl, $c086 - add hl, de - ld [hl], a - ld hl, $c08e - add hl, de - ld [hl], a - ld hl, $c096 - add hl, de - ld [hl], a - ld hl, $c09e - add hl, de - ld [hl], a - ld hl, $c0a6 - add hl, de - ld [hl], a - ld hl, $c0ae - add hl, de - ld [hl], a - ld hl, $c036 - add hl, de - ld [hl], a - ld a, $1 - ld hl, $c0be - add hl, de - ld [hl], a - ld hl, $c0b6 - add hl, de - ld [hl], a - ld hl, $c0c6 - add hl, de - ld [hl], a - ld a, e - cp $4 - jr nz, .asm_9a2b - ld a, $8 - ld [$ff00+$10], a -.asm_9a2b - ld a, c - and a - jp z, Func_9a8f - dec c - jp .asm_9967 - -Func_9a34: ; 0x9a34 - ld a, $80 - ld [$ff00+$26], a - ld [$ff00+$1a], a - xor a - ld [$ff00+$25], a - ld [$ff00+$1c], a - ld a, $8 - ld [$ff00+$10], a - ld [$ff00+$12], a - ld [$ff00+$17], a - ld [$ff00+$21], a - ld a, $40 - ld [$ff00+$14], a - ld [$ff00+$19], a - ld [$ff00+$23], a - ld a, $77 - ld [$ff00+$24], a - xor a - ld [$c000], a - ld [$c003], a - ld [$c002], a - ld [$c0e9], a - ld [$c0eb], a - ld [$c0e6], a - ld [$c0e7], a - ld d, $a0 - ld hl, $c006 - call FillMusicRAM2 - ld a, $1 - ld d, $18 - ld hl, $c0b6 - call FillMusicRAM2 - ld [$c0e8], a - ld [$c0ea], a - ld a, $ff - ld [$c004], a - ret - -; fills d bytes at hl with a -FillMusicRAM2: ; 0x9a89 - ld b, d -.loop - ld [hli], a - dec b - jr nz, .loop - ret - -Func_9a8f: ; 0x9a8f - ld a, [$c001] - ld l, a - ld e, a - ld h, $0 - ld d, h - add hl, hl - add hl, de - ld de, SFX_Headers_02 - add hl, de - ld e, l - ld d, h - ld hl, $c006 - ld a, [de] ; get channel number - ld b, a - rlca - rlca - and $3 - ld c, a - ld a, b - and $f - ld b, c - inc b - inc de - ld c, $0 -.asm_9ab1 - cp c - jr z, .asm_9ab9 - inc c - inc hl - inc hl - jr .asm_9ab1 -.asm_9ab9 - push hl - push bc - push af - ld b, $0 - ld c, a - ld hl, $c026 - add hl, bc - ld a, [$c001] - ld [hl], a - pop af - cp $3 - jr c, .asm_9ad2 - ld hl, $c02e - add hl, bc - set 2, [hl] -.asm_9ad2 - pop bc - pop hl - ld a, [de] ; get channel pointer - ld [hli], a - inc de - ld a, [de] - ld [hli], a - inc de - inc c - dec b - ld a, b - and a - ld a, [de] - inc de - jr nz, .asm_9ab1 - ld a, [$c001] - cp $14 - jr nc, .asm_9aeb - jr .asm_9b15 -.asm_9aeb - ld a, [$c001] - cp $86 - jr z, .asm_9b15 - jr c, .asm_9af6 - jr .asm_9b15 -.asm_9af6 - ld hl, $c02a - ld [hli], a - ld [hli], a - ld [hli], a - ld [hl], a - ld hl, $c012 ; sfx noise channel pointer - ld de, Noise2_endchannel - ld [hl], e - inc hl - ld [hl], d ; overwrite pointer to point to endchannel - ld a, [$c005] - and a - jr nz, .asm_9b15 - ld a, [$ff00+$24] - ld [$c005], a - ld a, $77 - ld [$ff00+$24], a -.asm_9b15 - ret - -Noise2_endchannel: ; 0x9b16 - endchannel - -Unknown_9b17: ; 0x9b17 - db $10, $15, $1A, $1F ; channels 0-3 - db $10, $15, $1A, $1F ; channels 4-7 - -Unknown_9b1f: ; 0x9b1f - db $EE, $DD, $BB, $77 ; channels 0-3 - db $EE, $DD, $BB, $77 ; channels 4-7 - -Unknown_9b27: ; 0x9b27 - db $11, $22, $44, $88 ; channels 0-3 - db $11, $22, $44, $88 ; channels 4-7 - -Unknown_9b2f: ; 0x9b2f - dw $F82C - dw $F89D - dw $F907 - dw $F96B - dw $F9CA - dw $FA23 - dw $FA77 - dw $FAC7 - dw $FB12 - dw $FB58 - dw $FB9B - dw $FBDA ; an alternate start for MeetRival which has a different first measure Music_RivalAlternateStart: ; 0x9b47 @@ -45308,1735 +43633,9 @@ UnnamedText_21865: ; 21865 (8:5865) Unknown_21878: ; 21878 (8:5878) db $FD -Func_21879: ; 21879 (8:5879) - ld c, CH0 -.loop - ld b, $0 - ld hl, $c026 - add hl, bc - ld a, [hl] - and a - jr z, .nextChannel - ld a, c - cp CH4 - jr nc, .applyAffects ; if sfx channel - ld a, [$c002] - and a - jr z, .applyAffects - bit 7, a - jr nz, .nextChannel - set 7, a - ld [$c002], a - xor a - ld [$FF00+$25], a - ld [$FF00+$1a], a - ld a, $80 - ld [$FF00+$1a], a - jr .nextChannel -.applyAffects - call Music8_ApplyMusicAffects -.nextChannel - ld a, c - inc c - cp CH7 - jr nz, .loop - ret - -; this routine checks flags for music effects currently applied -; to the channel and calls certain functions based on flags. -; known flags for $c02e: -; 1: call has been used -; 3: a toggle used only by this routine for vibrato -; 4: pitchbend flag -; 6: dutycycle flag -Music8_ApplyMusicAffects: ; 218ae (8:58ae) - ld b, $0 - ld hl, $c0b6 ; delay unitl next note - add hl, bc - ld a, [hl] - cp $1 ; if the delay is 1, play next note - jp z, Music8_PlayNextNote - dec a ; otherwise, decrease the delay timer - ld [hl], a - ld a, c - cp CH4 - jr nc, .startChecks ; if a sfx channel - ld hl, $c02a - add hl, bc - ld a, [hl] - and a - jr z, .startChecks - ret -.startChecks - ld hl, $c02e - add hl, bc - bit 6, [hl] ; dutycycle - jr z, .checkForExecuteMusic - call Music8_ApplyDutyCycle -.checkForExecuteMusic - ld b, $0 - ld hl, $c036 - add hl, bc - bit 0, [hl] - jr nz, .checkForPitchBend - ld hl, $c02e - add hl, bc - bit 2, [hl] - jr nz, .disablePitchBendVibrato -.checkForPitchBend - ld hl, $c02e - add hl, bc - bit 4, [hl] ; pitchbend - jr z, .checkVibratoDelay - jp Music8_ApplyPitchBend -.checkVibratoDelay - ld hl, $c04e ; vibrato delay - add hl, bc - ld a, [hl] - and a ; check if delay is over - jr z, .checkForVibrato - dec [hl] ; otherwise, dec delay -.disablePitchBendVibrato - ret -.checkForVibrato - ld hl, $c056 ; vibrato rate - add hl, bc - ld a, [hl] - and a - jr nz, .vibrato - ret ; no vibrato -.vibrato - ld d, a - ld hl, $c05e - add hl, bc - ld a, [hl] - and $f - and a - jr z, .vibratoAlreadyDone - dec [hl] ; apply vibrato pitch change - ret -.vibratoAlreadyDone - ld a, [hl] - swap [hl] - or [hl] - ld [hl], a ; reset the vibrato value and start again - ld hl, $c066 - add hl, bc - ld e, [hl] ; get note pitch - ld hl, $c02e - 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] - ld a, d - and $f - ld d, a - ld a, e - sub d - jr nc, .noCarry - ld a, $0 -.noCarry - jr .done -.unset - set 3, [hl] - ld a, d - and $f0 - swap a - add e - jr nc, .done - ld a, $ff -.done - ld d, a - ld b, $3 - call Func_21ff7 - ld [hl], d - ret -; this routine executes all music commands that take up no time, -; like tempo changes, duty changes etc. and doesn't return -; until the first note is reached -Music8_PlayNextNote: ; 21946 (8:5946) - ld hl, $c06e - add hl, bc - ld a, [hl] - ld hl, $c04e - add hl, bc - ld [hl], a - ld hl, $c02e - add hl, bc - res 4, [hl] - res 5, [hl] - ld a, c - cp CH4 - jr nz, .beginChecks - ld a, [$d083] - bit 7, a - ret nz -.beginChecks - call Music8_endchannel - ret +INCLUDE "audio/engine_2.asm" -Music8_endchannel: ; 21967 (8:5967) - call Music8_GetNextMusicByte - ld d, a - cp $ff ; is this command an endchannel? - jp nz, Music8_callchannel ; no - ld b, $0 ; yes - ld hl, $c02e - add hl, bc - bit 1, [hl] - jr nz, .returnFromCall - ld a, c - cp CH3 - jr nc, .noiseOrSfxChannel - jr .asm_219c0 -.noiseOrSfxChannel - res 2, [hl] - ld hl, $c036 - add hl, bc - res 0, [hl] - cp CH6 - jr nz, .notSfxChannel3 - ld a, $0 - ld [$FF00+$1a], a - ld a, $80 - ld [$FF00+$1a], a -.notSfxChannel3 - jr nz, .asm_219a3 - ld a, [$c003] - and a - jr z, .asm_219a3 - xor a - ld [$c003], a - jr .asm_219c0 -.asm_219a3 - jr .asm_219c9 -.returnFromCall - res 1, [hl] - ld d, $0 - ld a, c - add a - ld e, a - ld hl, $c006 - add hl, de - push hl ; store current channel address - ld hl, $c016 - add hl, de - ld e, l - ld d, h - pop hl - ld a, [de] - ld [hli], a - inc de - ld a, [de] - ld [hl], a ; loads channel address to return to - jp Music8_endchannel -.asm_219c0 - ld hl, Unknown_222de - add hl, bc - ld a, [$FF00+$25] - and [hl] - ld [$FF00+$25], a -.asm_219c9 - ld a, [$c02a] - cp $14 - jr nc, .asm_219d2 - jr .asm_219ef -.asm_219d2 - ld a, [$c02a] - cp $86 - jr z, .asm_219ef - jr c, .asm_219dd - jr .asm_219ef -.asm_219dd - ld a, c - cp CH4 - jr z, .asm_219e6 - call Func_21e6d - ret c -.asm_219e6 - ld a, [$c005] - ld [$FF00+$24], a - xor a - ld [$c005], a -.asm_219ef - ld hl, $c026 - add hl, bc - ld [hl], b - ret - -Music8_callchannel: ; 219f5 (8:59f5) - cp $fd ; is this command a callchannel? - jp nz, Music8_loopchannel ; no - call Music8_GetNextMusicByte ; yes - push af - call Music8_GetNextMusicByte - ld d, a - pop af - ld e, a - push de ; store pointer - ld d, $0 - ld a, c - add a - ld e, a - ld hl, $c006 - add hl, de - push hl - ld hl, $c016 - add hl, de - ld e, l - ld d, h - pop hl - ld a, [hli] - ld [de], a - inc de - ld a, [hld] - ld [de], a ; copy current channel address - pop de - ld [hl], e - inc hl - ld [hl], d ; overwrite current address with pointer - ld b, $0 - ld hl, $c02e - add hl, bc - set 1, [hl] ; set the call flag - jp Music8_endchannel - -Music8_loopchannel: ; 21a2a (8:5a2a) - cp $fe ; is this command a loopchannel? - jp nz, Music8_notetype ; no - call Music8_GetNextMusicByte ; yes - ld e, a - and a - jr z, .infiniteLoop - ld b, $0 - ld hl, $c0be - add hl, bc - ld a, [hl] - cp e - jr nz, .loopAgain - ld a, $1 ; if no more loops to make, - ld [hl], a - call Music8_GetNextMusicByte ; skip pointer - call Music8_GetNextMusicByte - jp Music8_endchannel -.loopAgain ; inc loop count - inc a - ld [hl], a - ; fall through -.infiniteLoop ; overwrite current address with pointer - call Music8_GetNextMusicByte - push af - call Music8_GetNextMusicByte - ld b, a - ld d, $0 - ld a, c - add a - ld e, a - ld hl, $c006 - add hl, de - pop af - ld [hli], a - ld [hl], b - jp Music8_endchannel - -Music8_notetype: ; 21a65 (8:5a65) - and $f0 - cp $d0 ; is this command a notetype? - jp nz, Music8_togglecall ; no - ld a, d ; yes - and $f - ld b, $0 - ld hl, $c0c6 - add hl, bc - ld [hl], a ; store low nibble as speed - ld a, c - cp CH3 - jr z, .noiseChannel ; noise channel has 0 params - call Music8_GetNextMusicByte - ld d, a - ld a, c - cp CH2 - jr z, .musicChannel3 - cp CH6 - jr nz, .notChannel3 - ld hl, $c0e7 - jr .sfxChannel3 -.musicChannel3 - ld hl, $c0e6 -.sfxChannel3 - ld a, d - and $f - ld [hl], a ; store low nibble of param as duty - ld a, d - and $30 - sla a - ld d, a - ; fall through - - ; if channel 3, store high nibble as volume - ; else, store volume (high nibble) and fade (low nibble) -.notChannel3 - ld b, $0 - ld hl, $c0de - add hl, bc - ld [hl], d -.noiseChannel - jp Music8_endchannel - -Music8_togglecall: ; 21aa4 (8:5aa4) - ld a, d - cp $e8 ; is this command an togglecall? - jr nz, Music8_vibrato ; no - ld b, $0 ; yes - ld hl, $c02e - add hl, bc - ld a, [hl] - xor $1 - ld [hl], a ; flip bit 0 of $c02e (toggle returning from call) - jp Music8_endchannel - -Music8_vibrato: ; 21ab6 (8:5ab6) - cp $ea ; is this command a vibrato? - jr nz, Music8_pitchbend ; no - call Music8_GetNextMusicByte ; yes - ld b, $0 - ld hl, $c04e - add hl, bc - ld [hl], a ; store delay - ld hl, $c06e - add hl, bc - ld [hl], a ; store delay - call Music8_GetNextMusicByte - ld d, a - and $f0 - swap a - ld b, $0 - ld hl, $c056 - 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 a, d - and $f - ld d, a - ld hl, $c05e - add hl, bc - swap a - or d - ld [hl], a ; store depth as both high and low nibbles - jp Music8_endchannel - -Music8_pitchbend: ; 21aee (8:5aee) - cp $eb ; is this command a pitchbend? - jr nz, Music8_duty ; no - call Music8_GetNextMusicByte ; yes - ld b, $0 - ld hl, $c076 - add hl, bc - ld [hl], a ; store first param - call Music8_GetNextMusicByte - ld d, a - and $f0 - swap a - ld b, a - ld a, d - and $f - call Func_22017 - ld b, $0 - ld hl, $c0a6 - add hl, bc - ld [hl], d ; store unknown part of second param - ld hl, $c0ae - add hl, bc - ld [hl], e ; store unknown part of second param - ld b, $0 - ld hl, $c02e - add hl, bc - set 4, [hl] ; set pitchbend flag - call Music8_GetNextMusicByte - ld d, a - jp Music8_notelength - -Music8_duty: ; 21b26 (8:5b26) - cp $ec ; is this command a duty? - jr nz, Music8_tempo ; no - call Music8_GetNextMusicByte ; yes - rrca - rrca - and $c0 - ld b, $0 - ld hl, $c03e - add hl, bc - ld [hl], a ; store duty - jp Music8_endchannel - -Music8_tempo: ; 21b3b (8:5b3b) - cp $ed ; is this command a tempo? - jr nz, Music8_unknownmusic0xee ; no - ld a, c ; yes - cp CH4 - jr nc, .sfxChannel - call Music8_GetNextMusicByte - ld [$c0e8], a ; store first param - call Music8_GetNextMusicByte - ld [$c0e9], a ; store second param - xor a - ld [$c0ce], a ; clear RAM - ld [$c0cf], a - ld [$c0d0], a - ld [$c0d1], a - jr .musicChannelDone -.sfxChannel - call Music8_GetNextMusicByte - ld [$c0ea], a ; store first param - call Music8_GetNextMusicByte - ld [$c0eb], a ; store second param - xor a - ld [$c0d2], a ; clear RAM - ld [$c0d3], a - ld [$c0d4], a - ld [$c0d5], a -.musicChannelDone - jp Music8_endchannel - -Music8_unknownmusic0xee: ; 21b7b (8:5b7b) - cp $ee ; is this command an unknownmusic0xee? - jr nz, Music8_unknownmusic0xef ; no - call Music8_GetNextMusicByte ; yes - ld [$c004], a ; store first param - jp Music8_endchannel - -; this appears to never be used -Music8_unknownmusic0xef: ; 21b88 (8:5b88) - cp $ef ; is this command an unknownmusic0xef? - jr nz, Music8_dutycycle ; no - call Music8_GetNextMusicByte ; yes - push bc - call Func_22035 - pop bc - ld a, [$c003] - and a - jr nz, .skip - ld a, [$c02d] - ld [$c003], a - xor a - ld [$c02d], a -.skip - jp Music8_endchannel - -Music8_dutycycle: ; 21ba7 (8:5ba7) - cp $fc ; is this command a dutycycle? - jr nz, Music8_stereopanning ; no - call Music8_GetNextMusicByte ; yes - ld b, $0 - ld hl, $c046 - add hl, bc - ld [hl], a ; store full cycle - and $c0 - ld hl, $c03e - add hl, bc - ld [hl], a ; store first duty - ld hl, $c02e - add hl, bc - set 6, [hl] ; set dutycycle flag - jp Music8_endchannel - -Music8_stereopanning: ; 21bc5 (8:5bc5) - cp $f0 ; is this command a stereopanning? - jr nz, Music8_executemusic ; no - call Music8_GetNextMusicByte ; yes - ld [$FF00+$24], a - jp Music8_endchannel - -Music8_executemusic: ; 21bd1 (8:5bd1) - cp $f8 ; is this command an executemusic? - jr nz, Music8_octave ; no - ld b, $0 ; yes - ld hl, $c036 - add hl, bc - set 0, [hl] - jp Music8_endchannel - -Music8_octave: ; 21be0 (8:5be0) - and $f0 - cp $e0 ; is this command an octave? - jr nz, Music8_unknownsfx0x20 ; no - ld hl, $c0d6 ; yes - ld b, $0 - add hl, bc - ld a, d - and $f - ld [hl], a ; store low nibble as octave - jp Music8_endchannel - -Music8_unknownsfx0x20: ; 21bf3 - cp $20 ; is this command an unknownsfx0x20? - jr nz, Music8_unknownsfx0x10 ; no - ld a, c - cp CH3 ; is this a noise or sfx channel? - jr c, Music8_unknownsfx0x10 ; no - ld b, $0 - ld hl, $c036 - add hl, bc - bit 0, [hl] - jr nz, Music8_unknownsfx0x10 ; no - call Music8_notelength - ld d, a - ld b, $0 - ld hl, $c03e - add hl, bc - ld a, [hl] - or d - ld d, a - ld b, $1 - call Func_21ff7 - ld [hl], d - call Music8_GetNextMusicByte - ld d, a - ld b, $2 - call Func_21ff7 - ld [hl], d - call Music8_GetNextMusicByte - ld e, a - ld a, c - cp CH7 - ld a, $0 - jr z, .sfxNoiseChannel ; only two params for noise channel - push de - call Music8_GetNextMusicByte - pop de -.sfxNoiseChannel - ld d, a - push de - call Func_21daa - call Func_21d79 - pop de - call Func_21dcc - ret - -Music8_unknownsfx0x10: ; 21c40 (8:5c40) - ld a, c - cp CH4 - jr c, Music8_note ; if not a sfx - ld a, d - cp $10 ; is this command a unknownsfx0x10? - jr nz, Music8_note ; no - ld b, $0 - ld hl, $c036 - add hl, bc - bit 0, [hl] - jr nz, Music8_note ; no - call Music8_GetNextMusicByte ; yes - ld [$FF00+$10], a - jp Music8_endchannel - -Music8_note: ; 21c5c (8:5c5c) - ld a, c - cp CH3 - jr nz, Music8_notelength ; if not noise channel - ld a, d - and $f0 - cp $b0 ; is this command a dnote? - jr z, Music8_dnote ; yes - jr nc, Music8_notelength ; no - swap a - ld b, a - ld a, d - and $f - ld d, a - ld a, b - push de - push bc - jr asm_21c7e - -Music8_dnote: ; 21c76 (8:5c76) - ld a, d - and $f - push af - push bc - call Music8_GetNextMusicByte ; get dnote instrument -asm_21c7e - ld d, a - ld a, [$c003] - and a - jr nz, .asm_21c89 - ld a, d - call Func_22035 -.asm_21c89 - pop bc - pop de - -Music8_notelength: ; 21c8b (8:5c8b) - ld a, d - push af - and $f - inc a - ld b, $0 - ld e, a ; store note length (in 16ths) - ld d, b - ld hl, $c0c6 - add hl, bc - ld a, [hl] - ld l, b - call Func_22006 - ld a, c - cp CH4 - jr nc, .sfxChannel - ld a, [$c0e8] - ld d, a - ld a, [$c0e9] - ld e, a - jr .skip -.sfxChannel - ld d, $1 - ld e, $0 - cp CH7 - jr z, .skip ; if noise channel - call Func_21e2f - ld a, [$c0ea] - ld d, a - ld a, [$c0eb] - ld e, a -.skip - ld a, l - ld b, $0 - ld hl, $c0ce - add hl, bc - ld l, [hl] - call Func_22006 - ld e, l - ld d, h - ld hl, $c0ce - add hl, bc - ld [hl], e - ld a, d - ld hl, $c0b6 - add hl, bc - ld [hl], a - ld hl, $c036 - add hl, bc - bit 0, [hl] - jr nz, Music8_notepitch - ld hl, $c02e - add hl, bc - bit 2, [hl] - jr z, Music8_notepitch - pop hl - ret - -Music8_notepitch: ; 21ce9 (8:5ce9) - pop af - and $f0 - cp $c0 ; compare to rest - jr nz, .notRest - ld a, c - cp CH4 - jr nc, .sfxChannel - ld hl, $c02a - add hl, bc - ld a, [hl] - and a - jr nz, .done - ; fall through -.sfxChannel - ld a, c - cp CH2 - jr z, .musicChannel3 - cp CH6 - jr nz, .notSfxChannel3 -.musicChannel3 - ld b, $0 - ld hl, Unknown_222de - add hl, bc - ld a, [$FF00+$25] - and [hl] - ld [$FF00+$25], a - jr .done -.notSfxChannel3 - ld b, $2 - call Func_21ff7 - ld a, $8 - ld [hli], a - inc hl - ld a, $80 - ld [hl], a -.done - ret -.notRest - swap a - ld b, $0 - ld hl, $c0d6 - add hl, bc - ld b, [hl] - call Func_22017 - ld b, $0 - ld hl, $c02e - add hl, bc - bit 4, [hl] - jr z, .asm_21d39 - call Func_21f4e -.asm_21d39 - push de - ld a, c - cp CH4 - jr nc, .skip ; if sfx channel - ld hl, $c02a - ld d, $0 - ld e, a - add hl, de - ld a, [hl] - and a - jr nz, .asm_21d4c - jr .skip -.asm_21d4c - pop de - ret -.skip - ld b, $0 - ld hl, $c0de - add hl, bc - ld d, [hl] - ld b, $2 - call Func_21ff7 - ld [hl], d - call Func_21daa - call Func_21d79 - pop de - ld b, $0 - ld hl, $c02e - add hl, bc - bit 0, [hl] - jr z, .asm_21d70 - inc e - jr nc, .asm_21d70 - inc d -.asm_21d70 - ld hl, $c066 - add hl, bc - ld [hl], e - call Func_21dcc - ret - -Func_21d79: ; 21d79 (8:5d79) - ld b, $0 - ld hl, Unknown_222e6 - add hl, bc - ld a, [$FF00+$25] - or [hl] - ld d, a - ld a, c - cp CH7 - jr z, .sfxNoiseChannel - cp CH4 - jr nc, .skip ; if sfx channel - ld hl, $c02a - add hl, bc - ld a, [hl] - and a - jr nz, .skip -.sfxNoiseChannel - ld a, [$c004] - ld hl, Unknown_222e6 - add hl, bc - and [hl] - ld d, a - ld a, [$FF00+$25] - ld hl, Unknown_222de - add hl, bc - and [hl] - or d - ld d, a -.skip - ld a, d - ld [$FF00+$25], a - ret - -Func_21daa: ; 21daa (8:5daa) - ld b, $0 - ld hl, $c0b6 - add hl, bc - ld d, [hl] - ld a, c - cp CH2 - jr z, .channel3 ; if music channel 3 - cp CH6 - jr z, .channel3 ; if sfx channel 3 - ld a, d - and $3f - ld d, a - ld hl, $c03e - add hl, bc - ld a, [hl] - or d - ld d, a -.channel3 - ld b, $1 - call Func_21ff7 - ld [hl], d - ret - -Func_21dcc: ; 21dcc (8:5dcc) - ld a, c - cp CH2 - jr z, .channel3 - cp CH6 - jr nz, .notSfxChannel3 - ; fall through -.channel3 - push de - ld de, $c0e6 - cp CH2 - jr z, .musicChannel3 - ld de, $c0e7 -.musicChannel3 - ld a, [de] - add a - ld d, $0 - ld e, a - ld hl, Music8_Channel3DutyPointers - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - ld hl, $ff30 - ld b, $f - ld a, $0 - ld [$FF00+$1a], a -.loop - ld a, [de] - inc de - ld [hli], a - ld a, b - dec b - and a - jr nz, .loop - ld a, $80 - ld [$FF00+$1a], a - pop de -.notSfxChannel3 - ld a, d - or $80 - and $c7 - ld d, a - ld b, $3 - call Func_21ff7 - ld [hl], e - inc hl - ld [hl], d - ld a, c - cp CH4 - jr c, .musicChannel - call Func_21e56 -.musicChannel - ret - -Func_21e19: ; 21e19 (8:5e19) - ld a, c - cp CH4 - jr nz, .asm_21e2e - ld a, [$d083] - bit 7, a - jr z, .asm_21e2e - xor a - ld [$c0f1], a - ld a, $80 - ld [$c0f2], a -.asm_21e2e - ret - -Func_21e2f: ; 21e2f (8:5e2f) - call Func_21e8b - jr c, .asm_21e39 - call Func_21e9f - jr nc, .asm_21e4c -.asm_21e39 - ld d, $0 - ld a, [$c0f2] - add $80 - jr nc, .asm_21e43 - inc d -.asm_21e43 - ld [$c0eb], a - ld a, d - ld [$c0ea], a - jr .asm_21e55 -.asm_21e4c - xor a - ld [$c0eb], a - ld a, $1 - ld [$c0ea], a -.asm_21e55 - ret - -Func_21e56: ; 21e56 (8:5e56) - call Func_21e8b - jr c, .asm_21e60 - call Func_21e9f - jr nc, .asm_21e6c -.asm_21e60 - ld a, [$c0f1] - add e - jr nc, .asm_21e67 - inc d -.asm_21e67 - dec hl - ld e, a - ld [hl], e - inc hl - ld [hl], d -.asm_21e6c - ret - -Func_21e6d: ; 21e6d (8:5e6d) - call Func_21e8b - jr nc, .asm_21e88 - ld hl, $c006 - ld e, c - ld d, $0 - sla e - rl d - add hl, de - ld a, [hl] - sub $1 - ld [hl], a - inc hl - ld a, [hl] - sbc $0 - ld [hl], a - scf - ret -.asm_21e88 - scf - ccf - ret - -Func_21e8b: ; 21e8b (8:5e8b) - ld a, [$c02a] - cp $14 - jr nc, .asm_21e94 - jr .asm_21e9a -.asm_21e94 - cp $86 - jr z, .asm_21e9a - jr c, .asm_21e9d -.asm_21e9a - scf - ccf - ret -.asm_21e9d - scf - ret - -Func_21e9f: ; 21e9f (8:5e9f) - ld a, [$c02d] - ld b, a - ld a, [$c02a] - or b - cp $9d - jr nc, .asm_21ead - jr .asm_21eb3 -.asm_21ead - cp $ea - jr z, .asm_21eb3 - jr c, .asm_21eb6 -.asm_21eb3 - scf - ccf - ret -.asm_21eb6 - scf - ret - -Music8_ApplyPitchBend: ; 21eb8 (8:5eb8) - ld hl, $c02e - add hl, bc - bit 5, [hl] - jp nz, .asm_21eff - ld hl, $c09e - add hl, bc - ld e, [hl] - ld hl, $c096 - add hl, bc - ld d, [hl] - ld hl, $c07e - add hl, bc - ld l, [hl] - ld h, b - add hl, de - ld d, h - ld e, l - ld hl, $c08e - add hl, bc - push hl - ld hl, $c086 - add hl, bc - ld a, [hl] - pop hl - add [hl] - ld [hl], a - ld a, $0 - adc e - ld e, a - ld a, $0 - adc d - ld d, a - ld hl, $c0a6 - add hl, bc - ld a, [hl] - cp d - jp c, .asm_21f45 - jr nz, .asm_21f32 - ld hl, $c0ae - add hl, bc - ld a, [hl] - cp e - jp c, .asm_21f45 - jr .asm_21f32 -.asm_21eff - ld hl, $c09e - add hl, bc - ld a, [hl] - ld hl, $c096 - add hl, bc - ld d, [hl] - ld hl, $c07e - add hl, bc - ld e, [hl] - sub e - ld e, a - ld a, d - sbc b - ld d, a - ld hl, $c086 - add hl, bc - ld a, [hl] - add a - ld [hl], a - ld a, e - sbc b - ld e, a - ld a, d - sbc b - ld d, a - ld hl, $c0a6 - add hl, bc - ld a, d - cp [hl] - jr c, .asm_21f45 - jr nz, .asm_21f32 - ld hl, $c0ae - add hl, bc - ld a, e - cp [hl] - jr c, .asm_21f45 -.asm_21f32 - ld hl, $c09e - add hl, bc - ld [hl], e - ld hl, $c096 - add hl, bc - ld [hl], d - ld b, $3 - call Func_21ff7 - ld a, e - ld [hli], a - ld [hl], d - ret -.asm_21f45 - ld hl, $c02e - add hl, bc - res 4, [hl] - res 5, [hl] - ret - -Func_21f4e: ; 21f4e (8:5f4e) - ld hl, $c096 - add hl, bc - ld [hl], d - ld hl, $c09e - add hl, bc - ld [hl], e - ld hl, $c0b6 - add hl, bc - ld a, [hl] - ld hl, $c076 - add hl, bc - sub [hl] - jr nc, .asm_21f66 - ld a, $1 -.asm_21f66 - ld [hl], a - ld hl, $c0ae - add hl, bc - ld a, e - sub [hl] - ld e, a - ld a, d - sbc b - ld hl, $c0a6 - add hl, bc - sub [hl] - jr c, .asm_21f82 - ld d, a - ld b, $0 - ld hl, $c02e - add hl, bc - set 5, [hl] - jr .asm_21fa5 -.asm_21f82 - ld hl, $c096 - add hl, bc - ld d, [hl] - ld hl, $c09e - add hl, bc - ld e, [hl] - ld hl, $c0ae - add hl, bc - ld a, [hl] - sub e - ld e, a - ld a, d - sbc b - ld d, a - ld hl, $c0a6 - add hl, bc - ld a, [hl] - sub d - ld d, a - ld b, $0 - ld hl, $c02e - add hl, bc - res 5, [hl] -.asm_21fa5 - ld hl, $c076 - add hl, bc -.asm_21fa9 - inc b - ld a, e - sub [hl] - ld e, a - jr nc, .asm_21fa9 - ld a, d - and a - jr z, .asm_21fb7 - dec a - ld d, a - jr .asm_21fa9 -.asm_21fb7 - ld a, e - add [hl] - ld d, b - ld b, $0 - ld hl, $c07e - add hl, bc - ld [hl], d - ld hl, $c086 - add hl, bc - ld [hl], a - ld hl, $c08e - add hl, bc - ld [hl], a - ret - -Music8_ApplyDutyCycle: ; 21fcc (8:5fcc) - ld b, $0 - ld hl, $c046 - add hl, bc - ld a, [hl] - rlca - rlca - ld [hl], a - and $c0 - ld d, a - ld b, $1 - call Func_21ff7 - ld a, [hl] - and $3f - or d - ld [hl], a - ret - -Music8_GetNextMusicByte: ; 21fe4 (8:5fe4) - ld d, $0 - ld a, c - add a - ld e, a - ld hl, $c006 - add hl, de - ld a, [hli] - ld e, a - ld a, [hld] - ld d, a - ld a, [de] ; get next music command - inc de - ld [hl], e ; store address of next command - inc hl - ld [hl], d - ret - -Func_21ff7: ; 21ff7 (8:5ff7) - ld a, c - ld hl, Unknown_222d6 - add l - jr nc, .noCarry - inc h -.noCarry - ld l, a - ld a, [hl] - add b - ld l, a - ld h, $ff - ret - -Func_22006: ; 22006 (8:6006) - ld h, $0 -.loop - srl a - jr nc, .noCarry - add hl, de -.noCarry - sla e - rl d - and a - jr z, .done - jr .loop -.done - ret - -Func_22017: ; 22017 (8:6017) - ld h, $0 - ld l, a - add hl, hl - ld d, h - ld e, l - ld hl, Unknown_222ee - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - ld a, b -.loop - cp CH7 - jr z, .done - sra d - rr e - inc a - jr .loop -.done - ld a, $8 - add d - ld d, a - ret - -Func_22035: ; 22035 (8:6035) - ld [$c001], a - cp $ff - jp z, Func_221f3 - cp $e9 - jp z, Func_2210d - jp c, Func_2210d - cp $fe - jr z, .asm_2204c - jp nc, Func_2210d -.asm_2204c - xor a - ld [$c000], a - ld [$c003], a - ld [$c0e9], a - ld [$c0e6], a - ld [$c0e7], a - ld d, $8 - ld hl, $c016 - call FillMusicRAM8 - ld hl, $c006 - call FillMusicRAM8 - ld d, $4 - ld hl, $c026 - call FillMusicRAM8 - ld hl, $c02e - call FillMusicRAM8 - ld hl, $c03e - call FillMusicRAM8 - ld hl, $c046 - call FillMusicRAM8 - ld hl, $c04e - call FillMusicRAM8 - ld hl, $c056 - call FillMusicRAM8 - ld hl, $c05e - call FillMusicRAM8 - ld hl, $c066 - call FillMusicRAM8 - ld hl, $c06e - call FillMusicRAM8 - ld hl, $c036 - call FillMusicRAM8 - ld hl, $c076 - call FillMusicRAM8 - ld hl, $c07e - call FillMusicRAM8 - ld hl, $c086 - call FillMusicRAM8 - ld hl, $c08e - call FillMusicRAM8 - ld hl, $c096 - call FillMusicRAM8 - ld hl, $c09e - call FillMusicRAM8 - ld hl, $c0a6 - call FillMusicRAM8 - ld hl, $c0ae - call FillMusicRAM8 - ld a, $1 - ld hl, $c0be - call FillMusicRAM8 - ld hl, $c0b6 - call FillMusicRAM8 - ld hl, $c0c6 - call FillMusicRAM8 - ld [$c0e8], a - ld a, $ff - ld [$c004], a - xor a - ld [$FF00+$24], a - ld a, $8 - ld [$FF00+$10], a - ld a, $0 - ld [$FF00+$25], a - xor a - ld [$FF00+$1a], a - ld a, $80 - ld [$FF00+$1a], a - ld a, $77 - ld [$FF00+$24], a - jp Func_2224e - -Func_2210d: ; 2210d (8:610d) - ld l, a - ld e, a - ld h, $0 - ld d, h - add hl, hl - add hl, de - ld de, SFX_Headers_08 - add hl, de - ld a, h - ld [$c0ec], a - ld a, l - ld [$c0ed], a - ld a, [hl] - and $c0 - rlca - rlca - ld c, a -.asm_22126 - ld d, c - ld a, c - add a - add c - ld c, a - ld b, $0 - ld a, [$c0ec] - ld h, a - ld a, [$c0ed] - ld l, a - add hl, bc - ld c, d - ld a, [hl] - and $f - ld e, a - ld d, $0 - ld hl, $c026 - add hl, de - ld a, [hl] - and a - jr z, .asm_22162 - ld a, e - cp $7 - jr nz, .asm_22159 - ld a, [$c001] - cp $14 - jr nc, .asm_22152 - ret -.asm_22152 - ld a, [hl] - cp $14 - jr z, .asm_22162 - jr c, .asm_22162 -.asm_22159 - ld a, [$c001] - cp [hl] - jr z, .asm_22162 - jr c, .asm_22162 - ret -.asm_22162 - xor a - push de - ld h, d - ld l, e - add hl, hl - ld d, h - ld e, l - ld hl, $c016 - add hl, de - ld [hli], a - ld [hl], a - ld hl, $c006 - add hl, de - ld [hli], a - ld [hl], a - pop de - ld hl, $c026 - add hl, de - ld [hl], a - ld hl, $c02e - add hl, de - ld [hl], a - ld hl, $c03e - add hl, de - ld [hl], a - ld hl, $c046 - add hl, de - ld [hl], a - ld hl, $c04e - add hl, de - ld [hl], a - ld hl, $c056 - add hl, de - ld [hl], a - ld hl, $c05e - add hl, de - ld [hl], a - ld hl, $c066 - add hl, de - ld [hl], a - ld hl, $c06e - add hl, de - ld [hl], a - ld hl, $c076 - add hl, de - ld [hl], a - ld hl, $c07e - add hl, de - ld [hl], a - ld hl, $c086 - add hl, de - ld [hl], a - ld hl, $c08e - add hl, de - ld [hl], a - ld hl, $c096 - add hl, de - ld [hl], a - ld hl, $c09e - add hl, de - ld [hl], a - ld hl, $c0a6 - add hl, de - ld [hl], a - ld hl, $c0ae - add hl, de - ld [hl], a - ld hl, $c036 - add hl, de - ld [hl], a - ld a, $1 - ld hl, $c0be - add hl, de - ld [hl], a - ld hl, $c0b6 - add hl, de - ld [hl], a - ld hl, $c0c6 - add hl, de - ld [hl], a - ld a, e - cp $4 - jr nz, .asm_221ea - ld a, $8 - ld [$FF00+$10], a -.asm_221ea - ld a, c - and a - jp z, Func_2224e - dec c - jp .asm_22126 - -Func_221f3: ; 221f3 (8:61f3) - ld a, $80 - ld [$FF00+$26], a - ld [$FF00+$1a], a - xor a - ld [$FF00+$25], a - ld [$FF00+$1c], a - ld a, $8 - ld [$FF00+$10], a - ld [$FF00+$12], a - ld [$FF00+$17], a - ld [$FF00+$21], a - ld a, $40 - ld [$FF00+$14], a - ld [$FF00+$19], a - ld [$FF00+$23], a - ld a, $77 - ld [$FF00+$24], a - xor a - ld [$c000], a - ld [$c003], a - ld [$c002], a - ld [$c0e9], a - ld [$c0eb], a - ld [$c0e6], a - ld [$c0e7], a - ld d, $a0 - ld hl, $c006 - call FillMusicRAM8 - ld a, $1 - ld d, $18 - ld hl, $c0b6 - call FillMusicRAM8 - ld [$c0e8], a - ld [$c0ea], a - ld a, $ff - ld [$c004], a - ret - -; fills d bytes at hl with a -FillMusicRAM8: ; 22248 (8:6248) - ld b, d -.loop - ld [hli], a - dec b - jr nz, .loop - ret - -Func_2224e: ; 2224e (8:624e) - ld a, [$c001] - ld l, a - ld e, a - ld h, $0 - ld d, h - add hl, hl - add hl, de - ld de, SFX_Headers_08 - add hl, de - ld e, l - ld d, h - ld hl, $c006 - ld a, [de] ; get channel number - ld b, a - rlca - rlca - and $3 - ld c, a - ld a, b - and $f - ld b, c - inc b - inc de - ld c, $0 -.asm_22270 - cp c - jr z, .asm_22278 - inc c - inc hl - inc hl - jr .asm_22270 -.asm_22278 - push hl - push bc - push af - ld b, $0 - ld c, a - ld hl, $c026 - add hl, bc - ld a, [$c001] - ld [hl], a - pop af - cp $3 - jr c, .asm_22291 - ld hl, $c02e - add hl, bc - set 2, [hl] -.asm_22291 - pop bc - pop hl - ld a, [de] ; get channel pointer - ld [hli], a - inc de - ld a, [de] - ld [hli], a - inc de - inc c - dec b - ld a, b - and a - ld a, [de] - inc de - jr nz, .asm_22270 - ld a, [$c001] - cp $14 - jr nc, .asm_222aa - jr .asm_222d4 -.asm_222aa - ld a, [$c001] - cp $86 - jr z, .asm_222d4 - jr c, .asm_222b5 - jr .asm_222d4 -.asm_222b5 - ld hl, $c02a - ld [hli], a - ld [hli], a - ld [hli], a - ld [hl], a - ld hl, $c012 ; sfx noise channel pointer - ld de, Noise8_endchannel - ld [hl], e - inc hl - ld [hl], d ; overwrite pointer to point to endchannel - ld a, [$c005] - and a - jr nz, .asm_222d4 - ld a, [$FF00+$24] - ld [$c005], a - ld a, $77 - ld [$FF00+$24], a -.asm_222d4 - ret - -Noise8_endchannel: ; 222d5 (8:62d5) - endchannel - -Unknown_222d6: ; 222d6 (8:62d6) - db $10, $15, $1A, $1F ; channels 0-3 - db $10, $15, $1A, $1F ; channels 4-7 - -Unknown_222de: ; 222de (8:62de) - db $EE, $DD, $BB, $77 ; channels 0-3 - db $EE, $DD, $BB, $77 ; channels 4-7 - -Unknown_222e6: ; 222e6 (8:62e6) - db $11, $22, $44, $88 ; channels 0-3 - db $11, $22, $44, $88 ; channels 4-7 - -Unknown_222ee: ; 222ee (8:62ee) - dw $F82C - dw $F89D - dw $F907 - dw $F96B - dw $F9CA - dw $FA23 - dw $FA77 - dw $FAC7 - dw $FB12 - dw $FB58 - dw $FB9B - dw $FBDA Music_PokeFluteInBattle: ; 22306 (8:6306) ld a, (SFX_08_46 - $4000) / 3 ; PokeFlute outside of battle @@ -120486,1684 +117085,9 @@ PokedexRatingSfxPointers: ; 7d162 (1f:5162) OwnedMonValues: ; 7d170 (1f:5170) db 10, 40, 60, 90, 120, 150, $ff -Func_7d177: ; 7d177 (1f:5177) - ld c, CH0 -.loop - ld b, $0 - ld hl, $c026 - add hl, bc - ld a, [hl] - and a - jr z, .nextChannel - ld a, c - cp CH4 - jr nc, .applyAffects ; if sfx channel - ld a, [$c002] - and a - jr z, .applyAffects - bit 7, a - jr nz, .nextChannel - set 7, a - ld [$c002], a - xor a - ld [$FF00+$25], a - ld [$FF00+$1a], a - ld a, $80 - ld [$FF00+$1a], a - jr .nextChannel -.applyAffects - call Music1f_Music2_ApplyMusicAffects -.nextChannel - ld a, c - inc c ; inc channel number - cp CH7 - jr nz, .loop - ret - -; this routine checks flags for music effects currently applied -; to the channel and calls certain functions based on flags. -; known flags for $c02e: -; 1: call has been used -; 3: a toggle used only by this routine for vibrato -; 4: pitchbend flag -; 6: dutycycle flag -Music1f_Music2_ApplyMusicAffects: ; 7d1ac (1f:51ac) - ld b, $0 - ld hl, $c0b6 ; delay until next note - add hl, bc - ld a, [hl] - cp $1 ; if delay is 1, play next note - jp z, Music1f_Music2_PlayNextNote - dec a ; otherwise, decrease the delay timer - ld [hl], a - ld a, c - cp CH4 - jr nc, .startChecks ; if a sfx channel - ld hl, $c02a - add hl, bc - ld a, [hl] - and a - jr z, .startChecks - ret -.startChecks - ld hl, $c02e - add hl, bc - bit 6, [hl] ; dutycycle - jr z, .checkForExecuteMusic - call Music1f_ApplyDutyCycle -.checkForExecuteMusic - ld b, $0 - ld hl, $c036 - add hl, bc - bit 0, [hl] - jr nz, .checkForPitchBend - ld hl, $c02e - add hl, bc - bit 2, [hl] - jr nz, .disablePitchBendVibrato -.checkForPitchBend - ld hl, $c02e - add hl, bc - bit 4, [hl] ; pitchbend - jr z, .checkVibratoDelay - jp Music1f_ApplyPitchBend -.checkVibratoDelay - ld hl, $c04e ; vibrato delay - add hl, bc - ld a, [hl] - and a ; check if delay is over - jr z, .checkForVibrato - dec [hl] ; otherwise, dec delay -.disablePitchBendVibrato - ret -.checkForVibrato - ld hl, $c056 ; vibrato rate - add hl, bc - ld a, [hl] - and a - jr nz, .vibrato - ret ; no vibrato -.vibrato - ld d, a - ld hl, $c05e - add hl, bc - ld a, [hl] - and $f - and a - jr z, .vibratoAlreadyDone - dec [hl] ; apply vibrato pitch change - ret -.vibratoAlreadyDone - ld a, [hl] - swap [hl] - or [hl] - ld [hl], a ; reset the vibrato value and start again - ld hl, $c066 - add hl, bc - ld e, [hl] ; get note pitch - ld hl, $c02e - 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] - ld a, d - and $f - ld d, a - ld a, e - sub d - jr nc, .noCarry - ld a, $0 -.noCarry - jr .done -.unset - set 3, [hl] - ld a, d - and $f0 - swap a - add e - jr nc, .done - ld a, $ff -.done - ld d, a - ld b, $3 - call Func_7d8ac - ld [hl], d - ret - -; this routine executes all music commands that take up no time, -; like tempo changes, duty changes etc. and doesn't return -; until the first note is reached -Music1f_Music2_PlayNextNote: ; 7d244 (1f:5244) - ld hl, $c06e - add hl, bc - ld a, [hl] - ld hl, $c04e - add hl, bc - ld [hl], a - ld hl, $c02e - add hl, bc - res 4, [hl] - res 5, [hl] - call Music1f_endchannel - ret - -Music1f_endchannel: ; 7d25a (1f:525a) - call Music1f_GetNextMusicByte - ld d, a - cp $ff ; is this command an endchannel? - jp nz, Music1f_callchannel ; no - ld b, $0 ; yes - ld hl, $c02e - add hl, bc - bit 1, [hl] - jr nz, .returnFromCall - ld a, c - cp CH3 - jr nc, .noiseOrSfxChannel - jr .asm_7d2b3 -.noiseOrSfxChannel - res 2, [hl] - ld hl, $c036 - add hl, bc - res 0, [hl] - cp CH6 - jr nz, .notSfxChannel3 - ld a, $0 - ld [$FF00+$1a], a - ld a, $80 - ld [$FF00+$1a], a -.notSfxChannel3 - jr nz, .asm_7d296 - ld a, [$c003] - and a - jr z, .asm_7d296 - xor a - ld [$c003], a - jr .asm_7d2b3 -.asm_7d296 - jr .asm_7d2bc -.returnFromCall - res 1, [hl] - ld d, $0 - ld a, c - add a - ld e, a - ld hl, $c006 - add hl, de - push hl ; store current channel address - ld hl, $c016 - add hl, de - ld e, l - ld d, h - pop hl - ld a, [de] - ld [hli], a - inc de - ld a, [de] - ld [hl], a ; loads channel address to return to - jp Music1f_endchannel -.asm_7d2b3 - ld hl, Unknown_7db93 - add hl, bc - ld a, [$FF00+$25] - and [hl] - ld [$FF00+$25], a -.asm_7d2bc - ld a, [$c02a] - cp $14 - jr nc, .asm_7d2c5 - jr .asm_7d2e2 -.asm_7d2c5 - ld a, [$c02a] - cp $86 - jr z, .asm_7d2e2 - jr c, .asm_7d2d0 - jr .asm_7d2e2 -.asm_7d2d0 - ld a, c - cp CH4 - jr z, .asm_7d2d9 - call Func_7d73b - ret c -.asm_7d2d9 - ld a, [$c005] - ld [$FF00+$24], a - xor a - ld [$c005], a -.asm_7d2e2 - ld hl, $c026 - add hl, bc - ld [hl], b - ret - -Music1f_callchannel: ; 7d2e8 (1f:52e8) - cp $fd ; is this command a callchannel? - jp nz, Music1f_loopchannel ; no - call Music1f_GetNextMusicByte ; yes - push af - call Music1f_GetNextMusicByte - ld d, a - pop af - ld e, a - push de ; store pointer - ld d, $0 - ld a, c - add a - ld e, a - ld hl, $c006 - add hl, de - push hl - ld hl, $c016 - add hl, de - ld e, l - ld d, h - pop hl - ld a, [hli] - ld [de], a - inc de - ld a, [hld] - ld [de], a ; copy current channel address - pop de - ld [hl], e - inc hl - ld [hl], d ; overwrite current address with pointer - ld b, $0 - ld hl, $c02e - add hl, bc - set 1, [hl] ; set the call flag - jp Music1f_endchannel - -Music1f_loopchannel: ; 7d31d (1f:531d) - cp $fe ; is this command a loopchannel? - jp nz, Music1f_notetype ; no - call Music1f_GetNextMusicByte ; yes - ld e, a - and a - jr z, .infiniteLoop - ld b, $0 - ld hl, $c0be - add hl, bc - ld a, [hl] - cp e - jr nz, .loopAgain - ld a, $1 ; if no more loops to make - ld [hl], a - call Music1f_GetNextMusicByte ; skip pointer - call Music1f_GetNextMusicByte - jp Music1f_endchannel -.loopAgain ; inc loop count - inc a - ld [hl], a - ; fall through -.infiniteLoop ; overwrite current address with pointer - call Music1f_GetNextMusicByte - push af - call Music1f_GetNextMusicByte - ld b, a - ld d, $0 - ld a, c - add a - ld e, a - ld hl, $c006 - add hl, de - pop af - ld [hli], a - ld [hl], b - jp Music1f_endchannel - -Music1f_notetype: ; 7d358 (1f:5358) - and $f0 - cp $d0 ; is this command a notetype? - jp nz, Music1f_togglecall ; no - ld a, d ; yes - and $f - ld b, $0 - ld hl, $c0c6 - add hl, bc - ld [hl], a ; store low nibble as speed - ld a, c - cp CH3 - jr z, .noiseChannel ; noise channel has 0 params - call Music1f_GetNextMusicByte - ld d, a - ld a, c - cp CH2 - jr z, .musicChannel3 - cp CH6 - jr nz, .notChannel3 - ld hl, $c0e7 - jr .sfxChannel3 -.musicChannel3 - ld hl, $c0e6 -.sfxChannel3 - ld a, d - and $f - ld [hl], a ; store low nibble of param as duty - ld a, d - and $30 - sla a - ld d, a - ; fall through - - ; if channel 3, store high nibble as volume - ; else, store volume (high nibble) and fade (low nibble) -.notChannel3 - ld b, $0 - ld hl, $c0de - add hl, bc - ld [hl], d -.noiseChannel - jp Music1f_endchannel -Music1f_togglecall: ; 7d397 (1f:5397) - ld a, d - cp $e8 ; is this command an togglecall? - jr nz, Music1f_vibrato ; no - ld b, $0 ; yes - ld hl, $c02e - add hl, bc - ld a, [hl] - xor $1 - ld [hl], a ; flip bit 0 of $c02e (toggle returning from call) - jp Music1f_endchannel - -Music1f_vibrato: ; 7d3a9 (1f:53a9) - cp $ea ; is this command a vibrato? - jr nz, Music1f_pitchbend ; no - call Music1f_GetNextMusicByte ; yes - ld b, $0 - ld hl, $c04e - add hl, bc - ld [hl], a ; store delay - ld hl, $c06e - add hl, bc - ld [hl], a ; store delay - call Music1f_GetNextMusicByte - ld d, a - and $f0 - swap a - ld b, $0 - ld hl, $c056 - 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 a, d - and $f - ld d, a - ld hl, $c05e - add hl, bc - swap a - or d - ld [hl], a ; store depth as both high and low nibbles - jp Music1f_endchannel - -Music1f_pitchbend: ; 7d3e1 (1f:53e1) - cp $eb ; is this command a pitchbend? - jr nz, Music1f_duty ; no - call Music1f_GetNextMusicByte ; yes - ld b, $0 - ld hl, $c076 - add hl, bc - ld [hl], a ; store first param - call Music1f_GetNextMusicByte - ld d, a - and $f0 - swap a - ld b, a - ld a, d - and $f - call Func_7d8cc - ld b, $0 - ld hl, $c0a6 - add hl, bc - ld [hl], d ; store unknown part of second param - ld hl, $c0ae - add hl, bc - ld [hl], e ; store unknown part of second param - ld b, $0 - ld hl, $c02e - add hl, bc - set 4, [hl] ; set pitchbend flag - call Music1f_GetNextMusicByte - ld d, a - jp Music1f_notelength +INCLUDE "audio/engine_3.asm" -Music1f_duty: ; 7d419 (1f:5419) - cp $ec ; is this command a duty? - jr nz, Music1f_tempo ; no - call Music1f_GetNextMusicByte ; yes - rrca - rrca - and $c0 - ld b, $0 - ld hl, $c03e - add hl, bc - ld [hl], a ; store duty - jp Music1f_endchannel - -Music1f_tempo: ; 7d42e (1f:542e) - cp $ed ; is this command a tempo? - jr nz, Music1f_unknownmusic0xee ; no - ld a, c ; yes - cp CH4 - jr nc, .sfxChannel - call Music1f_GetNextMusicByte - ld [$c0e8], a ; store first param - call Music1f_GetNextMusicByte - ld [$c0e9], a ; store second param - xor a - ld [$c0ce], a ; clear RAM - ld [$c0cf], a - ld [$c0d0], a - ld [$c0d1], a - jr .musicChannelDone -.sfxChannel - call Music1f_GetNextMusicByte - ld [$c0ea], a ; store first param - call Music1f_GetNextMusicByte - ld [$c0eb], a ; store second param - xor a - ld [$c0d2], a ; clear RAM - ld [$c0d3], a - ld [$c0d4], a - ld [$c0d5], a -.musicChannelDone - jp Music1f_endchannel - -Music1f_unknownmusic0xee: ; 7d46e (1f:546e) - cp $ee ; is this command an unknownmusic0xee? - jr nz, Music1f_unknownmusic0xef ; no - call Music1f_GetNextMusicByte ; yes - ld [$c004], a ; store first param - jp Music1f_endchannel - -; this appears to never be used -Music1f_unknownmusic0xef: ; 7d47b (1f:547b) - cp $ef ; is this command an unknownmusic0xef? - jr nz, Music1f_dutycycle ; no - call Music1f_GetNextMusicByte ; yes - push bc - call Func_7d8ea - pop bc - ld a, [$c003] - and a - jr nz, .skip - ld a, [$c02d] - ld [$c003], a - xor a - ld [$c02d], a -.skip - jp Music1f_endchannel - -Music1f_dutycycle: ; 7d49a (1f:549a) - cp $fc ; is this command a dutycycle? - jr nz, Music1f_stereopanning ; no - call Music1f_GetNextMusicByte ; yes - ld b, $0 - ld hl, $c046 - add hl, bc - ld [hl], a ; store full cycle - and $c0 - ld hl, $c03e - add hl, bc - ld [hl], a ; store first duty - ld hl, $c02e - add hl, bc - set 6, [hl] ; set duty flag - jp Music1f_endchannel - -Music1f_stereopanning: ; 7d4b8 (1f:54b8) - cp $f0 ; is this command a stereopanning? - jr nz, Music1f_executemusic ; no - call Music1f_GetNextMusicByte ; yes - ld [$FF00+$24], a ; store stereopanning - jp Music1f_endchannel - -Music1f_executemusic: ; 7d4c4 (1f:54c4) - cp $f8 ; is this command an executemusic? - jr nz, Music1f_octave ; no - ld b, $0 ; yes - ld hl, $c036 - add hl, bc - set 0, [hl] - jp Music1f_endchannel - -Music1f_octave: ; 7d4d3 (1f:54d3) - and $f0 - cp $e0 ; is this command an octave? - jr nz, Music1f_unknownsfx0x20 ; no - ld hl, $c0d6 ; yes - ld b, $0 - add hl, bc - ld a, d - and $f - ld [hl], a ; store low nibble as octave - jp Music1f_endchannel - -Music1f_unknownsfx0x20: ; 7d4e6 (1f:54e6) - cp $20 ; is this command an unknownsfx0x20? - jr nz, Music1f_unknownsfx0x10 ; no - ld a, c - cp CH3 ; is this a noise or sfx channel? - jr c, Music1f_unknownsfx0x10 ; no - ld b, $0 - ld hl, $c036 - add hl, bc - bit 0, [hl] - jr nz, Music1f_unknownsfx0x10 ; no - call Music1f_notelength ; yes - ld d, a - ld b, $0 - ld hl, $c03e - add hl, bc - ld a, [hl] - or d - ld d, a - ld b, $1 - call Func_7d8ac - ld [hl], d - call Music1f_GetNextMusicByte - ld d, a - ld b, $2 - call Func_7d8ac - ld [hl], d - call Music1f_GetNextMusicByte - ld e, a - ld a, c - cp CH7 - ld a, $0 - jr z, .sfxNoiseChannel ; only two params for noise channel - push de - call Music1f_GetNextMusicByte - pop de -.sfxNoiseChannel - ld d, a - push de - call Func_7d69d - call Func_7d66c - pop de - call Func_7d6bf - ret - -Music1f_unknownsfx0x10 ; 7d533 (1f:5533) - ld a, c - cp CH4 - jr c, Music1f_note ; if not a sfx - ld a, d - cp $10 ; is this command an unknownsfx0x10? - jr nz, Music1f_note ; no - ld b, $0 - ld hl, $c036 - add hl, bc - bit 0, [hl] - jr nz, Music1f_note ; no - call Music1f_GetNextMusicByte ; yes - ld [$FF00+$10], a - jp Music1f_endchannel - -Music1f_note: ; 7d54f (1f:554f) - ld a, c - cp CH3 - jr nz, Music1f_notelength ; if not noise channel - ld a, d - and $f0 - cp $b0 ; is this command a dnote? - jr z, Music1f_dnote ; yes - jr nc, Music1f_notelength ; no - swap a - ld b, a - ld a, d - and $f - ld d, a - ld a, b - push de - push bc - jr asm_7d571 - -Music1f_dnote: ; 7d569 (1f:5569) - ld a, d - and $f - push af - push bc - call Music1f_GetNextMusicByte ; get dnote instrument -asm_7d571 - ld d, a - ld a, [$c003] - and a - jr nz, .asm_7d57c - ld a, d - call Func_7d8ea -.asm_7d57c - pop bc - pop de - -Music1f_notelength: ; 7d57e (1f:557e) - ld a, d - push af - and $f - inc a - ld b, $0 - ld e, a ; store note length (in 16ths) - ld d, b - ld hl, $c0c6 - add hl, bc - ld a, [hl] - ld l, b - call Func_7d8bb - ld a, c - cp CH4 - jr nc, .sfxChannel - ld a, [$c0e8] - ld d, a - ld a, [$c0e9] - ld e, a - jr .skip -.sfxChannel - ld d, $1 - ld e, $0 - cp CH7 - jr z, .skip ; if noise channel - call Func_7d707 - ld a, [$c0ea] - ld d, a - ld a, [$c0eb] - ld e, a -.skip - ld a, l - ld b, $0 - ld hl, $c0ce - add hl, bc - ld l, [hl] - call Func_7d8bb - ld e, l - ld d, h - ld hl, $c0ce - add hl, bc - ld [hl], e - ld a, d - ld hl, $c0b6 - add hl, bc - ld [hl], a - ld hl, $c036 - add hl, bc - bit 0, [hl] - jr nz, Music1f_notepitch - ld hl, $c02e - add hl, bc - bit 2, [hl] - jr z, Music1f_notepitch - pop hl - ret - -Music1f_notepitch: ; 7d5dc (1f:55dc) - pop af - and $f0 - cp $c0 ; compare to rest - jr nz, .notRest - ld a, c - cp CH4 - jr nc, .sfxChannel - ld hl, $c02a - add hl, bc - ld a, [hl] - and a - jr nz, .quit - ; fall through -.sfxChannel - ld a, c - cp CH2 - jr z, .musicChannel3 - cp CH6 - jr nz, .notSfxChannel3 -.musicChannel3 - ld b, $0 - ld hl, Unknown_7db93 - add hl, bc - ld a, [$FF00+$25] - and [hl] - ld [$FF00+$25], a - jr .quit -.notSfxChannel3 - ld b, $2 - call Func_7d8ac - ld a, $8 - ld [hli], a - inc hl - ld a, $80 - ld [hl], a -.quit - ret -.notRest - swap a - ld b, $0 - ld hl, $c0d6 - add hl, bc - ld b, [hl] - call Func_7d8cc - ld b, $0 - ld hl, $c02e - add hl, bc - bit 4, [hl] - jr z, .asm_7d62c - call Func_7d803 -.asm_7d62c - push de - ld a, c - cp CH4 - jr nc, .skip ; if sfx Channel - ld hl, $c02a - ld d, $0 - ld e, a - add hl, de - ld a, [hl] - and a - jr nz, .done - jr .skip -.done - pop de - ret -.skip - ld b, $0 - ld hl, $c0de - add hl, bc - ld d, [hl] - ld b, $2 - call Func_7d8ac - ld [hl], d - call Func_7d69d - call Func_7d66c - pop de - ld b, $0 - ld hl, $c02e - add hl, bc - bit 0, [hl] - jr z, .asm_7d663 - inc e - jr nc, .asm_7d663 - inc d -.asm_7d663 - ld hl, $c066 - add hl, bc - ld [hl], e - call Func_7d6bf - ret - -Func_7d66c: ; 7d66c (1f:566c) - ld b, $0 - ld hl, Unknown_7db9b - add hl, bc - ld a, [$FF00+$25] - or [hl] - ld d, a - ld a, c - cp CH7 - jr z, .sfxNoiseChannel - cp CH4 - jr nc, .skip ; if sfx channel - ld hl, $c02a - add hl, bc - ld a, [hl] - and a - jr nz, .skip -.sfxNoiseChannel - ld a, [$c004] - ld hl, Unknown_7db9b - add hl, bc - and [hl] - ld d, a - ld a, [$FF00+$25] - ld hl, Unknown_7db93 - add hl, bc - and [hl] - or d - ld d, a -.skip - ld a, d - ld [$FF00+$25], a - ret - -Func_7d69d: ; 7d69d (1f:569d) - ld b, $0 - ld hl, $c0b6 - add hl, bc - ld d, [hl] - ld a, c - cp CH2 - jr z, .channel3 ; if music channel 3 - cp CH6 - jr z, .channel3 ; if sfx channel 3 - ld a, d - and $3f - ld d, a - ld hl, $c03e - add hl, bc - ld a, [hl] - or d - ld d, a -.channel3 - ld b, $1 - call Func_7d8ac - ld [hl], d - ret - -Func_7d6bf: ; 7d6bf (1f:56bf) - ld a, c - cp CH2 - jr z, .channel3 - cp CH6 - jr nz, .notSfxChannel3 - ; fall through -.channel3 - push de - ld de, $c0e6 - cp CH2 - jr z, .musicChannel3 - ld de, $c0e7 -.musicChannel3 - ld a, [de] - add a - ld d, $0 - ld e, a - ld hl, Music1f_Channel3DutyPointers - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - ld hl, $ff30 - ld b, $f - ld a, $0 - ld [$FF00+$1a], a -.loop - ld a, [de] - inc de - ld [hli], a - ld a, b - dec b - and a - jr nz, .loop - ld a, $80 - ld [$FF00+$1a], a - pop de -.notSfxChannel3 - ld a, d - or $80 - and $c7 - ld d, a - ld b, $3 - call Func_7d8ac - ld [hl], e - inc hl - ld [hl], d - call Func_7d729 - ret - -Func_7d707: ; 7d707 (1f:5707) - call Func_7d759 - jr nc, .asm_7d71f - ld d, $0 - ld a, [$c0f2] - add $80 - jr nc, .asm_7d716 - inc d -.asm_7d716 - ld [$c0eb], a - ld a, d - ld [$c0ea], a - jr .asm_7d728 -.asm_7d71f - xor a - ld [$c0eb], a - ld a, $1 - ld [$c0ea], a -.asm_7d728 - ret - -Func_7d729: ; 7d729 (1f:5729) - call Func_7d759 - jr nc, .asm_7d73a - ld a, [$c0f1] - add e - jr nc, .asm_7d735 - inc d -.asm_7d735 - dec hl - ld e, a - ld [hl], e - inc hl - ld [hl], d -.asm_7d73a - ret - -Func_7d73b: ; 7d73b (1f:573b) - call Func_7d759 - jr nc, .asm_7d756 - ld hl, $c006 - ld e, c - ld d, $0 - sla e - rl d - add hl, de - ld a, [hl] - sub $1 - ld [hl], a - inc hl - ld a, [hl] - sbc $0 - ld [hl], a - scf - ret -.asm_7d756 - scf - ccf - ret - -Func_7d759: ; 7d759 (1f:5759) - ld a, [$c02a] - cp $14 - jr nc, .asm_7d762 - jr .asm_7d768 -.asm_7d762 - cp $86 - jr z, .asm_7d768 - jr c, .asm_7d76b -.asm_7d768 - scf - ccf - ret -.asm_7d76b - scf - ret - -Music1f_ApplyPitchBend: ; 7d76d (1f:576d) - ld hl, $c02e - add hl, bc - bit 5, [hl] - jp nz, .asm_7d7b4 - ld hl, $c09e - add hl, bc - ld e, [hl] - ld hl, $c096 - add hl, bc - ld d, [hl] - ld hl, $c07e - add hl, bc - ld l, [hl] - ld h, b - add hl, de - ld d, h - ld e, l - ld hl, $c08e - add hl, bc - push hl - ld hl, $c086 - add hl, bc - ld a, [hl] - pop hl - add [hl] - ld [hl], a - ld a, $0 - adc e - ld e, a - ld a, $0 - adc d - ld d, a - ld hl, $c0a6 - add hl, bc - ld a, [hl] - cp d - jp c, .asm_7d7fa - jr nz, .asm_7d7e7 - ld hl, $c0ae - add hl, bc - ld a, [hl] - cp e - jp c, .asm_7d7fa - jr .asm_7d7e7 -.asm_7d7b4 - ld hl, $c09e - add hl, bc - ld a, [hl] - ld hl, $c096 - add hl, bc - ld d, [hl] - ld hl, $c07e - add hl, bc - ld e, [hl] - sub e - ld e, a - ld a, d - sbc b - ld d, a - ld hl, $c086 - add hl, bc - ld a, [hl] - add a - ld [hl], a - ld a, e - sbc b - ld e, a - ld a, d - sbc b - ld d, a - ld hl, $c0a6 - add hl, bc - ld a, d - cp [hl] - jr c, .asm_7d7fa - jr nz, .asm_7d7e7 - ld hl, $c0ae - add hl, bc - ld a, e - cp [hl] - jr c, .asm_7d7fa -.asm_7d7e7 - ld hl, $c09e - add hl, bc - ld [hl], e - ld hl, $c096 - add hl, bc - ld [hl], d - ld b, $3 - call Func_7d8ac - ld a, e - ld [hli], a - ld [hl], d - ret -.asm_7d7fa - ld hl, $c02e - add hl, bc - res 4, [hl] - res 5, [hl] - ret - -Func_7d803: ; 7d803 (1f:5803) - ld hl, $c096 - add hl, bc - ld [hl], d - ld hl, $c09e - add hl, bc - ld [hl], e - ld hl, $c0b6 - add hl, bc - ld a, [hl] - ld hl, $c076 - add hl, bc - sub [hl] - jr nc, .asm_7d81b - ld a, $1 -.asm_7d81b - ld [hl], a - ld hl, $c0ae - add hl, bc - ld a, e - sub [hl] - ld e, a - ld a, d - sbc b - ld hl, $c0a6 - add hl, bc - sub [hl] - jr c, .asm_7d837 - ld d, a - ld b, $0 - ld hl, $c02e - add hl, bc - set 5, [hl] - jr .asm_7d85a -.asm_7d837 - ld hl, $c096 - add hl, bc - ld d, [hl] - ld hl, $c09e - add hl, bc - ld e, [hl] - ld hl, $c0ae - add hl, bc - ld a, [hl] - sub e - ld e, a - ld a, d - sbc b - ld d, a - ld hl, $c0a6 - add hl, bc - ld a, [hl] - sub d - ld d, a - ld b, $0 - ld hl, $c02e - add hl, bc - res 5, [hl] -.asm_7d85a - ld hl, $c076 - add hl, bc -.asm_7d85e - inc b - ld a, e - sub [hl] - ld e, a - jr nc, .asm_7d85e - ld a, d - and a - jr z, .asm_7d86c - dec a - ld d, a - jr .asm_7d85e -.asm_7d86c - ld a, e - add [hl] - ld d, b - ld b, $0 - ld hl, $c07e - add hl, bc - ld [hl], d - ld hl, $c086 - add hl, bc - ld [hl], a - ld hl, $c08e - add hl, bc - ld [hl], a - ret - -Music1f_ApplyDutyCycle: ; 7d881 (1f:5881) - ld b, $0 - ld hl, $c046 - add hl, bc - ld a, [hl] - rlca - rlca - ld [hl], a - and $c0 - ld d, a - ld b, $1 - call Func_7d8ac - ld a, [hl] - and $3f - or d - ld [hl], a - ret - -Music1f_GetNextMusicByte: ; 7d899 (1f:5899) - ld d, $0 - ld a, c - add a - ld e, a - ld hl, $c006 - add hl, de - ld a, [hli] - ld e, a - ld a, [hld] - ld d, a - ld a, [de] ; get next music command - inc de - ld [hl], e ; store address of next command - inc hl - ld [hl], d - ret - -Func_7d8ac: ; 7d8ac (1f:58ac) - ld a, c - ld hl, Unknown_7db8b - add l - jr nc, .noCarry - inc h -.noCarry - ld l, a - ld a, [hl] - add b - ld l, a - ld h, $ff - ret - -Func_7d8bb: ; 7d8bb (1f:58bb) - ld h, $0 -.loop - srl a - jr nc, .noCarry - add hl, de -.noCarry - sla e - rl d - and a - jr z, .done - jr .loop -.done - ret - -Func_7d8cc: ; 7d8cc (1f:58cc) - ld h, $0 - ld l, a - add hl, hl - ld d, h - ld e, l - ld hl, Unknown_7dba3 - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - ld a, b -.loop - cp $7 - jr z, .done - sra d - rr e - inc a - jr .loop -.done - ld a, $8 - add d - ld d, a - ret - -Func_7d8ea: ; 7d8ea (1f:58ea) - ld [$c001], a - cp $ff - jp z, Func_7daa8 - cp $c2 - jp z, Func_7d9c2 - jp c, Func_7d9c2 - cp $fe - jr z, .asm_7d901 - jp nc, Func_7d9c2 -.asm_7d901 - xor a - ld [$c000], a - ld [$c003], a - ld [$c0e9], a - ld [$c0e6], a - ld [$c0e7], a - ld d, $8 - ld hl, $c016 - call FillMusicRAM1f - ld hl, $c006 - call FillMusicRAM1f - ld d, $4 - ld hl, $c026 - call FillMusicRAM1f - ld hl, $c02e - call FillMusicRAM1f - ld hl, $c03e - call FillMusicRAM1f - ld hl, $c046 - call FillMusicRAM1f - ld hl, $c04e - call FillMusicRAM1f - ld hl, $c056 - call FillMusicRAM1f - ld hl, $c05e - call FillMusicRAM1f - ld hl, $c066 - call FillMusicRAM1f - ld hl, $c06e - call FillMusicRAM1f - ld hl, $c036 - call FillMusicRAM1f - ld hl, $c076 - call FillMusicRAM1f - ld hl, $c07e - call FillMusicRAM1f - ld hl, $c086 - call FillMusicRAM1f - ld hl, $c08e - call FillMusicRAM1f - ld hl, $c096 - call FillMusicRAM1f - ld hl, $c09e - call FillMusicRAM1f - ld hl, $c0a6 - call FillMusicRAM1f - ld hl, $c0ae - call FillMusicRAM1f - ld a, $1 - ld hl, $c0be - call FillMusicRAM1f - ld hl, $c0b6 - call FillMusicRAM1f - ld hl, $c0c6 - call FillMusicRAM1f - ld [$c0e8], a - ld a, $ff - ld [$c004], a - xor a - ld [$FF00+$24], a - ld a, $8 - ld [$FF00+$10], a - ld a, $0 - ld [$FF00+$25], a - xor a - ld [$FF00+$1a], a - ld a, $80 - ld [$FF00+$1a], a - ld a, $77 - ld [$FF00+$24], a - jp Func_7db03 - -Func_7d9c2: ; 7d9c2 (1f:59c2) - ld l, a - ld e, a - ld h, $0 - ld d, h - add hl, hl - add hl, de - ld de, SFX_Headers_1f - add hl, de - ld a, h - ld [$c0ec], a - ld a, l - ld [$c0ed], a - ld a, [hl] - and $c0 - rlca - rlca - ld c, a -.asm_7d9db - ld d, c - ld a, c - add a - add c - ld c, a - ld b, $0 - ld a, [$c0ec] - ld h, a - ld a, [$c0ed] - ld l, a - add hl, bc - ld c, d - ld a, [hl] - and $f - ld e, a - ld d, $0 - ld hl, $c026 - add hl, de - ld a, [hl] - and a - jr z, .asm_7da17 - ld a, e - cp $7 - jr nz, .asm_7da0e - ld a, [$c001] - cp $14 - jr nc, .asm_7da07 - ret -.asm_7da07 - ld a, [hl] - cp $14 - jr z, .asm_7da17 - jr c, .asm_7da17 -.asm_7da0e - ld a, [$c001] - cp [hl] - jr z, .asm_7da17 - jr c, .asm_7da17 - ret -.asm_7da17 - xor a - push de - ld h, d - ld l, e - add hl, hl - ld d, h - ld e, l - ld hl, $c016 - add hl, de - ld [hli], a - ld [hl], a - ld hl, $c006 - add hl, de - ld [hli], a - ld [hl], a - pop de - ld hl, $c026 - add hl, de - ld [hl], a - ld hl, $c02e - add hl, de - ld [hl], a - ld hl, $c03e - add hl, de - ld [hl], a - ld hl, $c046 - add hl, de - ld [hl], a - ld hl, $c04e - add hl, de - ld [hl], a - ld hl, $c056 - add hl, de - ld [hl], a - ld hl, $c05e - add hl, de - ld [hl], a - ld hl, $c066 - add hl, de - ld [hl], a - ld hl, $c06e - add hl, de - ld [hl], a - ld hl, $c076 - add hl, de - ld [hl], a - ld hl, $c07e - add hl, de - ld [hl], a - ld hl, $c086 - add hl, de - ld [hl], a - ld hl, $c08e - add hl, de - ld [hl], a - ld hl, $c096 - add hl, de - ld [hl], a - ld hl, $c09e - add hl, de - ld [hl], a - ld hl, $c0a6 - add hl, de - ld [hl], a - ld hl, $c0ae - add hl, de - ld [hl], a - ld hl, $c036 - add hl, de - ld [hl], a - ld a, $1 - ld hl, $c0be - add hl, de - ld [hl], a - ld hl, $c0b6 - add hl, de - ld [hl], a - ld hl, $c0c6 - add hl, de - ld [hl], a - ld a, e - cp $4 - jr nz, .asm_7da9f - ld a, $8 - ld [$FF00+$10], a -.asm_7da9f - ld a, c - and a - jp z, Func_7db03 - dec c - jp .asm_7d9db - -Func_7daa8: ; 7daa8 (1f:5aa8) - ld a, $80 - ld [$FF00+$26], a - ld [$FF00+$1a], a - xor a - ld [$FF00+$25], a - ld [$FF00+$1c], a - ld a, $8 - ld [$FF00+$10], a - ld [$FF00+$12], a - ld [$FF00+$17], a - ld [$FF00+$21], a - ld a, $40 - ld [$FF00+$14], a - ld [$FF00+$19], a - ld [$FF00+$23], a - ld a, $77 - ld [$FF00+$24], a - xor a - ld [$c000], a - ld [$c003], a - ld [$c002], a - ld [$c0e9], a - ld [$c0eb], a - ld [$c0e6], a - ld [$c0e7], a - ld d, $a0 - ld hl, $c006 - call FillMusicRAM1f - ld a, $1 - ld d, $18 - ld hl, $c0b6 - call FillMusicRAM1f - ld [$c0e8], a - ld [$c0ea], a - ld a, $ff - ld [$c004], a - ret - -; fills d bytes at hl with a -FillMusicRAM1f: ; 7dafd (1f:5afd) - ld b, d -.loop - ld [hli], a - dec b - jr nz, .loop - ret - -Func_7db03: ; 7db03 (1f:5b03) - ld a, [$c001] - ld l, a - ld e, a - ld h, $0 - ld d, h - add hl, hl - add hl, de - ld de, SFX_Headers_1f - add hl, de - ld e, l - ld d, h - ld hl, $c006 - ld a, [de] ; get channel number - ld b, a - rlca - rlca - and $3 - ld c, a - ld a, b - and $f - ld b, c - inc b - inc de - ld c, $0 -.asm_7db25 - cp c - jr z, .asm_7db2d - inc c - inc hl - inc hl - jr .asm_7db25 -.asm_7db2d - push hl - push bc - push af - ld b, $0 - ld c, a - ld hl, $c026 - add hl, bc - ld a, [$c001] - ld [hl], a - pop af - cp $3 - jr c, .asm_7db46 - ld hl, $c02e - add hl, bc - set 2, [hl] -.asm_7db46 - pop bc - pop hl - ld a, [de] ; get channel pointer - ld [hli], a - inc de - ld a, [de] - ld [hli], a - inc de - inc c - dec b - ld a, b - and a - ld a, [de] - inc de - jr nz, .asm_7db25 - ld a, [$c001] - cp $14 - jr nc, .asm_7db5f - jr .asm_7db89 -.asm_7db5f - ld a, [$c001] - cp $86 - jr z, .asm_7db89 - jr c, .asm_7db6a - jr .asm_7db89 -.asm_7db6a - ld hl, $c02a - ld [hli], a - ld [hli], a - ld [hli], a - ld [hl], a - ld hl, $c012 ; sfx noise channel pointer - ld de, Noise1f_endchannel - ld [hl], e - inc hl - ld [hl], d ; overwrite pointer to point to endchannel - ld a, [$c005] - and a - jr nz, .asm_7db89 - ld a, [$FF00+$24] - ld [$c005], a - ld a, $77 - ld [$FF00+$24], a -.asm_7db89 - ret - -Noise1f_endchannel: ; 7db8a (1f:5b8a) - endchannel - -Unknown_7db8b: ; 7db8b (1f:5b8b) - db $10, $15, $1A, $1F ; channels 0-3 - db $10, $15, $1A, $1F ; channels 4-7 - -Unknown_7db93: ; 7db93 (1f:5b93) - db $EE, $DD, $BB, $77 ; channels 0-3 - db $EE, $DD, $BB, $77 ; channels 4-7 - -Unknown_7db9b: ; 7db9b (1f:5b9b) - db $11, $22, $44, $88 ; channels 0-3 - db $11, $22, $44, $88 ; channels 4-7 - -Unknown_7dba3: ; 7dba3 (1f:5ba3) - dw $F82C - dw $F89D - dw $F907 - dw $F96B - dw $F9CA - dw $FA23 - dw $FA77 - dw $FAC7 - dw $FB12 - dw $FB58 - dw $FB9B - dw $FBDA INCLUDE "music/bikeriding.asm" INCLUDE "music/dungeon1.asm" |