ref: 40c1ecb4374a83d9511fe2c5fa99704d9cfc521b
dir: /audio/engine_1.asm/
; The first of three duplicated sound engines. Audio1_UpdateMusic:: ; 0x9103 ld c, CH0 .loop ld b, $0 ld hl, wc026 add hl, bc ld a, [hl] and a jr z, .nextChannel ld a, c cp CH4 jr nc, .asm_912e ; if sfx channel ld a, [wc002] and a jr z, .asm_912e bit 7, a jr nz, .nextChannel set 7, a ld [wc002], a xor a ld [$ff25], a ld [$ff1a], a ld a, $80 ld [$ff1a], a jr .nextChannel .asm_912e call Audio1_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 wc02e: ; 0: toggleperfectpitch has been used ; 1: call has been used ; 3: a toggle used only by this routine for vibrato ; 4: pitchbend flag ; 6: dutycycle flag Audio1_ApplyMusicAffects: ; 0x9138 ld b, $0 ld hl, wc0b6 ; delay until next note add hl, bc ld a, [hl] cp $1 ; if the delay is 1, play next note jp z, Audio1_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, wc02a add hl, bc ld a, [hl] and a jr z, .startChecks ret .startChecks ld hl, wc02e add hl, bc bit 6, [hl] ; dutycycle jr z, .checkForExecuteMusic call Audio1_ApplyDutyCycle .checkForExecuteMusic ld b, $0 ld hl, wc036 add hl, bc bit 0, [hl] jr nz, .checkForPitchBend ld hl, wc02e add hl, bc bit 2, [hl] jr nz, .disablePitchBendVibrato .checkForPitchBend ld hl, wc02e add hl, bc bit 4, [hl] ; pitchbend jr z, .checkVibratoDelay jp Audio1_ApplyPitchBend .checkVibratoDelay ld hl, wc04e ; 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, wc056 ; vibrato rate add hl, bc ld a, [hl] and a jr nz, .vibrato ret ; no vibrato .vibrato ld d, a ld hl, wc05e 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, wc066 add hl, bc ld e, [hl] ; get note pitch ld hl, wc02e 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 Audio1_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 Audio1_PlayNextNote: ; 0x91d0 ld hl, wc06e add hl, bc ld a, [hl] ld hl, wc04e add hl, bc ld [hl], a ld hl, wc02e add hl, bc res 4, [hl] res 5, [hl] call Audio1_endchannel ret Audio1_endchannel: ; 0x91e6 call Audio1_GetNextMusicByte ld d, a cp $ff ; is this command an endchannel? jp nz, Audio1_callchannel ; no ld b, $0 ; yes ld hl, wc02e 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, wc036 add hl, bc res 0, [hl] cp CH6 jr nz, .notSfxChannel3 ld a, $0 ld [$ff1a], a ld a, $80 ld [$ff1a], a .notSfxChannel3 jr nz, .asm_9222 ld a, [wc003] and a jr z, .asm_9222 xor a ld [wc003], 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, wc006 add hl, de push hl ; store current channel address ld hl, wc016 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 Audio1_endchannel .asm_923f ld hl, Unknown_9b1f add hl, bc ld a, [$ff25] and [hl] ld [$ff25], a .asm_9248 ld a, [wc02a] cp $14 jr nc, .asm_9251 jr .asm_926e .asm_9251 ld a, [wc02a] 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 Audio1_96c7 ret c .asm_9265 ld a, [wc005] ld [$ff24], a xor a ld [wc005], a .asm_926e ld hl, wc026 add hl, bc ld [hl], b ret Audio1_callchannel: ; 0x9274 cp $fd ; is this command a callchannel? jp nz, Audio1_loopchannel ; no call Audio1_GetNextMusicByte ; yes push af call Audio1_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, wc006 add hl, de push hl ld hl, wc016 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, wc02e add hl, bc set 1, [hl] ; set the call flag jp Audio1_endchannel Audio1_loopchannel: ; 0x92a9 cp $fe ; is this command a loopchannel? jp nz, Audio1_notetype ; no call Audio1_GetNextMusicByte ; yes ld e, a and a jr z, .infiniteLoop ld b, $0 ld hl, wc0be add hl, bc ld a, [hl] cp e jr nz, .loopAgain ld a, $1 ; if no more loops to make, ld [hl], a call Audio1_GetNextMusicByte ; skip pointer call Audio1_GetNextMusicByte jp Audio1_endchannel .loopAgain ; inc loop count inc a ld [hl], a ; fall through .infiniteLoop ; overwrite current address with pointer call Audio1_GetNextMusicByte push af call Audio1_GetNextMusicByte ld b, a ld d, $0 ld a, c add a ld e, a ld hl, wc006 add hl, de pop af ld [hli], a ld [hl], b jp Audio1_endchannel Audio1_notetype: ; 0x92e4 and $f0 cp $d0 ; is this command a notetype? jp nz, Audio1_toggleperfectpitch ; no ld a, d ; yes and $f ld b, $0 ld hl, wc0c6 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 Audio1_GetNextMusicByte ld d, a ld a, c cp CH2 jr z, .musicChannel3 cp CH6 jr nz, .notChannel3 ld hl, wc0e7 jr .sfxChannel3 .musicChannel3 ld hl, wc0e6 .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, wc0de add hl, bc ld [hl], d .noiseChannel jp Audio1_endchannel Audio1_toggleperfectpitch: ; 0x9323 ld a, d cp $e8 ; is this command a toggleperfectpitch? jr nz, Audio1_vibrato ; no ld b, $0 ; yes ld hl, wc02e add hl, bc ld a, [hl] xor $1 ld [hl], a ; flip bit 0 of wc02e jp Audio1_endchannel Audio1_vibrato: ; 0x9335 cp $ea ; is this command a vibrato? jr nz, Audio1_pitchbend ; no call Audio1_GetNextMusicByte ; yes ld b, $0 ld hl, wc04e add hl, bc ld [hl], a ; store delay ld hl, wc06e add hl, bc ld [hl], a ; store delay call Audio1_GetNextMusicByte ld d, a and $f0 swap a ld b, $0 ld hl, wc056 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, wc05e add hl, bc swap a or d ld [hl], a ; store depth as both high and low nibbles jp Audio1_endchannel Audio1_pitchbend: ; 0x936d cp $eb ; is this command a pitchbend? jr nz, Audio1_duty ; no call Audio1_GetNextMusicByte ; yes ld b, $0 ld hl, wc076 add hl, bc ld [hl], a ; store first param call Audio1_GetNextMusicByte ld d, a and $f0 swap a ld b, a ld a, d and $f call Audio1_9858 ld b, $0 ld hl, wc0a6 add hl, bc ld [hl], d ; store unknown part of second param ld hl, wc0ae add hl, bc ld [hl], e ; store unknown part of second param ld b, $0 ld hl, wc02e add hl, bc set 4, [hl] ; set pitchbend flag call Audio1_GetNextMusicByte ld d, a jp Audio1_notelength Audio1_duty: ; 0x93a5 cp $ec ; is this command a duty? jr nz, Audio1_tempo ; no call Audio1_GetNextMusicByte ; yes rrca rrca and $c0 ld b, $0 ld hl, wc03e add hl, bc ld [hl], a ; store duty jp Audio1_endchannel Audio1_tempo: ; 0x93ba cp $ed ; is this command a tempo? jr nz, Audio1_stereopanning ; no ld a, c ; yes cp CH4 jr nc, .sfxChannel call Audio1_GetNextMusicByte ld [wc0e8], a ; store first param call Audio1_GetNextMusicByte ld [wc0e9], a ; store second param xor a ld [wc0ce], a ; clear RAM ld [wc0cf], a ld [wc0d0], a ld [wc0d1], a jr .musicChannelDone .sfxChannel call Audio1_GetNextMusicByte ld [wc0ea], a ; store first param call Audio1_GetNextMusicByte ld [wc0eb], a ; store second param xor a ld [wc0d2], a ; clear RAM ld [wc0d3], a ld [wc0d4], a ld [wc0d5], a .musicChannelDone jp Audio1_endchannel Audio1_stereopanning: ; 0x93fa cp $ee ; is this command a stereopanning? jr nz, Audio1_unknownmusic0xef ; no call Audio1_GetNextMusicByte ; yes ld [wc004], a ; store panning jp Audio1_endchannel ; this appears to never be used Audio1_unknownmusic0xef: ; 0x9407 cp $ef ; is this command an unknownmusic0xef? jr nz, Audio1_dutycycle ; no call Audio1_GetNextMusicByte ; yes push bc call Audio1_9876 pop bc ld a, [wc003] and a jr nz, .skip ld a, [wc02d] ld [wc003], a xor a ld [wc02d], a .skip jp Audio1_endchannel Audio1_dutycycle: ; 0x9426 cp $fc ; is this command a dutycycle? jr nz, Audio1_volume ; no call Audio1_GetNextMusicByte ; yes ld b, $0 ld hl, wc046 add hl, bc ld [hl], a ; store full cycle and $c0 ld hl, wc03e add hl, bc ld [hl], a ; store first duty ld hl, wc02e add hl, bc set 6, [hl] ; set dutycycle flag jp Audio1_endchannel Audio1_volume: ; 0x9444 cp $f0 ; is this command a volume? jr nz, Audio1_executemusic ; no call Audio1_GetNextMusicByte ; yes ld [$ff24], a ; store volume jp Audio1_endchannel Audio1_executemusic: ; 0x9450 cp $f8 ; is this command an executemusic? jr nz, Audio1_octave ; no ld b, $0 ; yes ld hl, wc036 add hl, bc set 0, [hl] jp Audio1_endchannel Audio1_octave: ; 0x945f and $f0 cp $e0 ; is this command an octave? jr nz, Audio1_unknownsfx0x20 ; no ld hl, wc0d6 ; yes ld b, $0 add hl, bc ld a, d and $f ld [hl], a ; store low nibble as octave jp Audio1_endchannel Audio1_unknownsfx0x20: ; 0x9472 cp $20 ; is this command an unknownsfx0x20? jr nz, Audio1_unknownsfx0x10 ; no ld a, c cp CH3 ; is this a noise or sfx channel? jr c, Audio1_unknownsfx0x10 ; no ld b, $0 ld hl, wc036 add hl, bc bit 0, [hl] jr nz, Audio1_unknownsfx0x10 ; no call Audio1_notelength ; yes ld d, a ld b, $0 ld hl, wc03e add hl, bc ld a, [hl] or d ld d, a ld b, $1 call Audio1_9838 ld [hl], d call Audio1_GetNextMusicByte ld d, a ld b, $2 call Audio1_9838 ld [hl], d call Audio1_GetNextMusicByte ld e, a ld a, c cp CH7 ld a, $0 jr z, .sfxNoiseChannel ; only two params for noise channel push de call Audio1_GetNextMusicByte pop de .sfxNoiseChannel ld d, a push de call Audio1_9629 call Audio1_95f8 pop de call Audio1_964b ret Audio1_unknownsfx0x10: ld a, c cp CH4 jr c, Audio1_note ; if not a sfx ld a, d cp $10 ; is this command a unknownsfx0x10? jr nz, Audio1_note ; no ld b, $0 ld hl, wc036 add hl, bc bit 0, [hl] jr nz, Audio1_note ; no call Audio1_GetNextMusicByte ; yes ld [$ff10], a jp Audio1_endchannel Audio1_note: ld a, c cp CH3 jr nz, Audio1_notelength ; if not noise channel ld a, d and $f0 cp $b0 ; is this command a dnote? jr z, Audio1_dnote ; yes jr nc, Audio1_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 Audio1_dnote: ld a, d and $f push af push bc call Audio1_GetNextMusicByte ; get dnote instrument asm_94fd ld d, a ld a, [wc003] and a jr nz, .asm_9508 ld a, d call Audio1_9876 .asm_9508 pop bc pop de Audio1_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, wc0c6 add hl, bc ld a, [hl] ld l, b call Audio1_9847 ld a, c cp CH4 jr nc, .sfxChannel ld a, [wc0e8] ld d, a ld a, [wc0e9] ld e, a jr .skip .sfxChannel ld d, $1 ld e, $0 cp CH7 jr z, .skip ; if noise channel call Audio1_9693 ld a, [wc0ea] ld d, a ld a, [wc0eb] ld e, a .skip ld a, l ld b, $0 ld hl, wc0ce add hl, bc ld l, [hl] call Audio1_9847 ld e, l ld d, h ld hl, wc0ce add hl, bc ld [hl], e ld a, d ld hl, wc0b6 add hl, bc ld [hl], a ld hl, wc036 add hl, bc bit 0, [hl] jr nz, Audio1_notepitch ld hl, wc02e add hl, bc bit 2, [hl] jr z, Audio1_notepitch pop hl ret Audio1_notepitch: ; 0x9568 pop af and $f0 cp $c0 ; compare to rest jr nz, .notRest ld a, c cp CH4 jr nc, .sfxChannel ld hl, wc02a 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, [$ff25] and [hl] ld [$ff25], a jr .done .notSfxChannel3 ld b, $2 call Audio1_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, wc0d6 add hl, bc ld b, [hl] call Audio1_9858 ld b, $0 ld hl, wc02e add hl, bc bit 4, [hl] jr z, .asm_95b8 call Audio1_978f .asm_95b8 push de ld a, c cp CH4 jr nc, .skip ; if sfx channel ld hl, wc02a 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, wc0de add hl, bc ld d, [hl] ld b, $2 call Audio1_9838 ld [hl], d call Audio1_9629 call Audio1_95f8 pop de ld b, $0 ld hl, wc02e add hl, bc bit 0, [hl] ; has toggleperfectpitch been used? jr z, .skip2 inc e ; if yes, increment the pitch by 1 jr nc, .skip2 inc d .skip2 ld hl, wc066 add hl, bc ld [hl], e call Audio1_964b ret Audio1_95f8: ; 0x95f8 ld b, $0 ld hl, Unknown_9b27 add hl, bc ld a, [$ff25] or [hl] ld d, a ld a, c cp CH7 jr z, .sfxNoiseChannel cp CH4 jr nc, .skip ; if sfx channel ld hl, wc02a add hl, bc ld a, [hl] and a jr nz, .skip .sfxNoiseChannel ld a, [wc004] ld hl, Unknown_9b27 add hl, bc and [hl] ld d, a ld a, [$ff25] ld hl, Unknown_9b1f add hl, bc and [hl] or d ld d, a .skip ld a, d ld [$ff25], a ret Audio1_9629: ; 0x9629 ld b, $0 ld hl, wc0b6 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, wc03e add hl, bc ld a, [hl] or d ld d, a .channel3 ld b, $1 call Audio1_9838 ld [hl], d ret Audio1_964b: ; 0x964b ld a, c cp CH2 jr z, .channel3 cp CH6 jr nz, .notSfxChannel3 ; fall through .channel3 push de ld de, wc0e6 cp CH2 jr z, .musicChannel3 ld de, wc0e7 .musicChannel3 ld a, [de] add a ld d, $0 ld e, a ld hl, Audio1_WavePointers add hl, de ld e, [hl] inc hl ld d, [hl] ld hl, $ff30 ld b, $f ld a, $0 ld [$ff1a], a .loop ld a, [de] inc de ld [hli], a ld a, b dec b and a jr nz, .loop ld a, $80 ld [$ff1a], a pop de .notSfxChannel3 ld a, d or $80 and $c7 ld d, a ld b, $3 call Audio1_9838 ld [hl], e inc hl ld [hl], d call Audio1_96b5 ret Audio1_9693: ; 0x9693 call Audio1_96e5 jr nc, .asm_96ab ld d, $0 ld a, [wc0f2] add $80 jr nc, .asm_96a2 inc d .asm_96a2 ld [wc0eb], a ld a, d ld [wc0ea], a jr .asm_96b4 .asm_96ab xor a ld [wc0eb], a ld a, $1 ld [wc0ea], a .asm_96b4 ret Audio1_96b5: ; 0x96b5 call Audio1_96e5 jr nc, .asm_96c6 ld a, [wc0f1] 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 Audio1_96c7: ; 0x96c7 call Audio1_96e5 jr nc, .asm_96e2 ld hl, wc006 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 Audio1_96e5: ; 0x96e5 ld a, [wc02a] cp $14 jr nc, .asm_96ee jr .asm_96f4 .asm_96ee cp $86 jr z, .asm_96f4 jr c, .asm_96f7 .asm_96f4 scf ccf ret .asm_96f7 scf ret Audio1_ApplyPitchBend: ; 0x96f9 ld hl, wc02e add hl, bc bit 5, [hl] jp nz, .asm_9740 ld hl, wc09e add hl, bc ld e, [hl] ld hl, wc096 add hl, bc ld d, [hl] ld hl, wc07e add hl, bc ld l, [hl] ld h, b add hl, de ld d, h ld e, l ld hl, wc08e add hl, bc push hl ld hl, wc086 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, wc0a6 add hl, bc ld a, [hl] cp d jp c, .asm_9786 jr nz, .asm_9773 ld hl, wc0ae add hl, bc ld a, [hl] cp e jp c, .asm_9786 jr .asm_9773 .asm_9740 ld hl, wc09e add hl, bc ld a, [hl] ld hl, wc096 add hl, bc ld d, [hl] ld hl, wc07e add hl, bc ld e, [hl] sub e ld e, a ld a, d sbc b ld d, a ld hl, wc086 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, wc0a6 add hl, bc ld a, d cp [hl] jr c, .asm_9786 jr nz, .asm_9773 ld hl, wc0ae add hl, bc ld a, e cp [hl] jr c, .asm_9786 .asm_9773 ld hl, wc09e add hl, bc ld [hl], e ld hl, wc096 add hl, bc ld [hl], d ld b, $3 call Audio1_9838 ld a, e ld [hli], a ld [hl], d ret .asm_9786 ld hl, wc02e add hl, bc res 4, [hl] res 5, [hl] ret Audio1_978f: ; 0x978f ld hl, wc096 add hl, bc ld [hl], d ld hl, wc09e add hl, bc ld [hl], e ld hl, wc0b6 add hl, bc ld a, [hl] ld hl, wc076 add hl, bc sub [hl] jr nc, .asm_97a7 ld a, $1 .asm_97a7 ld [hl], a ld hl, wc0ae add hl, bc ld a, e sub [hl] ld e, a ld a, d sbc b ld hl, wc0a6 add hl, bc sub [hl] jr c, .asm_97c3 ld d, a ld b, $0 ld hl, wc02e add hl, bc set 5, [hl] jr .asm_97e6 .asm_97c3 ld hl, wc096 add hl, bc ld d, [hl] ld hl, wc09e add hl, bc ld e, [hl] ld hl, wc0ae add hl, bc ld a, [hl] sub e ld e, a ld a, d sbc b ld d, a ld hl, wc0a6 add hl, bc ld a, [hl] sub d ld d, a ld b, $0 ld hl, wc02e add hl, bc res 5, [hl] .asm_97e6 ld hl, wc076 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, wc07e add hl, bc ld [hl], d ld hl, wc086 add hl, bc ld [hl], a ld hl, wc08e add hl, bc ld [hl], a ret Audio1_ApplyDutyCycle: ; 0x980d ld b, $0 ld hl, wc046 add hl, bc ld a, [hl] rlca rlca ld [hl], a and $c0 ld d, a ld b, $1 call Audio1_9838 ld a, [hl] and $3f or d ld [hl], a ret Audio1_GetNextMusicByte: ; 0x9825 ld d, $0 ld a, c add a ld e, a ld hl, wc006 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 Audio1_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 Audio1_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 Audio1_9858: ; 0x9858 ld h, $0 ld l, a add hl, hl ld d, h ld e, l ld hl, Audio1_Pitches 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 Audio1_9876:: ; 0x9876 ld [wc001], a cp $ff jp z, Audio1_9a34 cp $b9 jp z, Audio1_994e jp c, Audio1_994e cp $fe jr z, .asm_988d jp nc, Audio1_994e .asm_988d xor a ld [wc000], a ld [wc003], a ld [wc0e9], a ld [wc0e6], a ld [wc0e7], a ld d, $8 ld hl, wc016 call FillAudioRAM1 ld hl, wc006 call FillAudioRAM1 ld d, $4 ld hl, wc026 call FillAudioRAM1 ld hl, wc02e call FillAudioRAM1 ld hl, wc03e call FillAudioRAM1 ld hl, wc046 call FillAudioRAM1 ld hl, wc04e call FillAudioRAM1 ld hl, wc056 call FillAudioRAM1 ld hl, wc05e call FillAudioRAM1 ld hl, wc066 call FillAudioRAM1 ld hl, wc06e call FillAudioRAM1 ld hl, wc036 call FillAudioRAM1 ld hl, wc076 call FillAudioRAM1 ld hl, wc07e call FillAudioRAM1 ld hl, wc086 call FillAudioRAM1 ld hl, wc08e call FillAudioRAM1 ld hl, wc096 call FillAudioRAM1 ld hl, wc09e call FillAudioRAM1 ld hl, wc0a6 call FillAudioRAM1 ld hl, wc0ae call FillAudioRAM1 ld a, $1 ld hl, wc0be call FillAudioRAM1 ld hl, wc0b6 call FillAudioRAM1 ld hl, wc0c6 call FillAudioRAM1 ld [wc0e8], a ld a, $ff ld [wc004], a xor a ld [$ff24], a ld a, $8 ld [$ff10], a ld a, $0 ld [$ff25], a xor a ld [$ff1a], a ld a, $80 ld [$ff1a], a ld a, $77 ld [$ff24], a jp Audio1_9a8f Audio1_994e: ; 0x994e ld l, a ld e, a ld h, $0 ld d, h add hl, hl add hl, de ld de, SFX_Headers_1 add hl, de ld a, h ld [wc0ec], a ld a, l ld [wc0ed], 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, [wc0ec] ld h, a ld a, [wc0ed] ld l, a add hl, bc ld c, d ld a, [hl] and $f ld e, a ld d, $0 ld hl, wc026 add hl, de ld a, [hl] and a jr z, .asm_99a3 ld a, e cp $7 jr nz, .asm_999a ld a, [wc001] 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, [wc001] 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, wc016 add hl, de ld [hli], a ld [hl], a ld hl, wc006 add hl, de ld [hli], a ld [hl], a pop de ld hl, wc026 add hl, de ld [hl], a ld hl, wc02e add hl, de ld [hl], a ld hl, wc03e add hl, de ld [hl], a ld hl, wc046 add hl, de ld [hl], a ld hl, wc04e add hl, de ld [hl], a ld hl, wc056 add hl, de ld [hl], a ld hl, wc05e add hl, de ld [hl], a ld hl, wc066 add hl, de ld [hl], a ld hl, wc06e add hl, de ld [hl], a ld hl, wc076 add hl, de ld [hl], a ld hl, wc07e add hl, de ld [hl], a ld hl, wc086 add hl, de ld [hl], a ld hl, wc08e add hl, de ld [hl], a ld hl, wc096 add hl, de ld [hl], a ld hl, wc09e add hl, de ld [hl], a ld hl, wc0a6 add hl, de ld [hl], a ld hl, wc0ae add hl, de ld [hl], a ld hl, wc036 add hl, de ld [hl], a ld a, $1 ld hl, wc0be add hl, de ld [hl], a ld hl, wc0b6 add hl, de ld [hl], a ld hl, wc0c6 add hl, de ld [hl], a ld a, e cp $4 jr nz, .asm_9a2b ld a, $8 ld [$ff10], a .asm_9a2b ld a, c and a jp z, Audio1_9a8f dec c jp .asm_9967 Audio1_9a34: ; 0x9a34 ld a, $80 ld [$ff26], a ld [$ff1a], a xor a ld [$ff25], a ld [$ff1c], a ld a, $8 ld [$ff10], a ld [$ff12], a ld [$ff17], a ld [$ff21], a ld a, $40 ld [$ff14], a ld [$ff19], a ld [$ff23], a ld a, $77 ld [$ff24], a xor a ld [wc000], a ld [wc003], a ld [wc002], a ld [wc0e9], a ld [wc0eb], a ld [wc0e6], a ld [wc0e7], a ld d, $a0 ld hl, wc006 call FillAudioRAM1 ld a, $1 ld d, $18 ld hl, wc0b6 call FillAudioRAM1 ld [wc0e8], a ld [wc0ea], a ld a, $ff ld [wc004], a ret ; fills d bytes at hl with a FillAudioRAM1: ; 0x9a89 ld b, d .loop ld [hli], a dec b jr nz, .loop ret Audio1_9a8f: ; 0x9a8f ld a, [wc001] ld l, a ld e, a ld h, $0 ld d, h add hl, hl add hl, de ld de, SFX_Headers_1 add hl, de ld e, l ld d, h ld hl, wc006 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, wc026 add hl, bc ld a, [wc001] ld [hl], a pop af cp $3 jr c, .asm_9ad2 ld hl, wc02e 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, [wc001] cp $14 jr nc, .asm_9aeb jr .asm_9b15 .asm_9aeb ld a, [wc001] cp $86 jr z, .asm_9b15 jr c, .asm_9af6 jr .asm_9b15 .asm_9af6 ld hl, wc02a ld [hli], a ld [hli], a ld [hli], a ld [hl], a ld hl, wc012 ; sfx noise channel pointer ld de, Noise1_endchannel ld [hl], e inc hl ld [hl], d ; overwrite pointer to point to endchannel ld a, [wc005] and a jr nz, .asm_9b15 ld a, [$ff24] ld [wc005], a ld a, $77 ld [$ff24], a .asm_9b15 ret Noise1_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 Audio1_Pitches: ; 0x9b2f dw $F82C ; C_ dw $F89D ; C# dw $F907 ; D_ dw $F96B ; D# dw $F9CA ; E_ dw $FA23 ; F_ dw $FA77 ; F# dw $FAC7 ; G_ dw $FB12 ; G# dw $FB58 ; A_ dw $FB9B ; A# dw $FBDA ; B_