ref: 7e4febba58e2ad2ca0cec38785ae44eed571f160
dir: /audio/engine_2.asm/
; 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