ref: 94d755003ebd0abee80e276f2af964a453ec3ca1
parent: 65245542c7e6f8b1c0bdb46354285dbde32c67ab
author: yenatch <[email protected]>
date: Mon Jan 6 17:34:14 EST 2014
split out the audio engines
--- /dev/null
+++ b/audio/engine_1.asm
@@ -1,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
+
+
--- /dev/null
+++ b/audio/engine_2.asm
@@ -1,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
+
+
--- /dev/null
+++ b/audio/engine_3.asm
@@ -1,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
+
+
--- a/main.asm
+++ b/main.asm
@@ -18485,1685 +18485,10 @@
.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
+INCLUDE "audio/engine_1.asm"
-; 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
-
; an alternate start for MeetRival which has a different first measure
Music_RivalAlternateStart: ; 0x9b47
ld c, BANK(Music_MeetRival)
@@ -45308,1736 +43633,10 @@
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
+INCLUDE "audio/engine_2.asm"
-; 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
-
Music_PokeFluteInBattle: ; 22306 (8:6306)
ld a, (SFX_08_46 - $4000) / 3 ; PokeFlute outside of battle
call PlaySoundWaitForCurrent
@@ -120486,1684 +117085,9 @@
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
+INCLUDE "audio/engine_3.asm"
-; 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
INCLUDE "music/bikeriding.asm"
INCLUDE "music/dungeon1.asm"