summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZumi Daxuya <daxuya.zumi+code@protonmail.com>2020-12-17 13:40:55 +0700
committerZumi Daxuya <daxuya.zumi+code@protonmail.com>2020-12-17 13:40:55 +0700
commitc63e33f04170e24bee0546f97381d7fcc5840a6d (patch)
tree01996801c5895a152f7d3164a715330f7d9d3373
parentdd5fd058034e087165afe5e6b6ffc669781fffd6 (diff)
Begin disassembling the rest of the audio engine
-rw-r--r--audio/engine.asm2362
-rw-r--r--constants/audio_constants.asm14
-rw-r--r--layout.link7
-rw-r--r--ram/wram.asm27
-rwxr-xr-xshim.sym12
5 files changed, 2379 insertions, 43 deletions
diff --git a/audio/engine.asm b/audio/engine.asm
index 157734c..06b4e33 100644
--- a/audio/engine.asm
+++ b/audio/engine.asm
@@ -170,15 +170,15 @@ Functione80b6:
ld [wCurTrackFrequency], a
ld a, [hl]
ld [wCurTrackFrequency + 1], a
- ld a, $3f
- ld [wc195], a
+ ld a, $3F
+ ld [wSoundLength], a
call Functione85d8
call Functione87f9
call Functione8839
call IsChannelSFXOn
jr nc, .end
- call Functione80fa
+ call UpdateChannels
ld hl, CHANNEL_TRACKS
add hl, bc
ld a, [wSoundOutput]
@@ -192,7 +192,7 @@ Functione80b6:
ld [hl], a
ret
-Functione80fa:
+UpdateChannels:
ld hl, .jumptable
ld a, [wCurChannel]
maskbits NUM_CHANNELS
@@ -206,9 +206,280 @@ Functione80fa:
jp hl
.jumptable
- ; TODO
+; Music channels
+ dw .Channel1
+ dw .Channel2
+ dw .Channel3
+ dw .Channel4
+; SFX channels
+ dw .Channel5
+ dw .Channel6
+ dw .Channel7
+ dw .Channel8
+
+.Channel1:
+ ld a, [wLowHealthAlarm]
+ bit 7, a
+ ret nz
+
+.Channel5:
+ ld hl, CHANNEL_NOTE_FLAGS
+ add hl, bc
+ bit NOTE_PITCH_SWEEP, [hl]
+ jr z, .ch1_no_sweep
+
+ ld a, [wPitchSweep]
+ ldh [rNR10], a
+
+.ch1_no_sweep
+ bit NOTE_REST, [hl]
+ jr nz, .ch1_rest
+ bit NOTE_NOISE_SAMPLING, [hl]
+ jr nz, .ch1_noise_sampling
+ bit NOTE_FREQ_OVERRIDE, [hl]
+ call nz, .ch1_freq_override
+ bit NOTE_INTENSITY_OVERRIDE, [hl]
+ call nz, .ch1_intensity_override
+ bit NOTE_DUTY_OVERRIDE, [hl]
+ call nz, .ch1_duty_override
+ ret
+
+.ch1_rest
+ ld a, %1000 ; stop envelope
+ ldh [rNR12], a
+ ld a, [wCurTrackFrequency + 1]
+ or $80 ; restart ch1
+ ldh [rNR14], a
+ ret
+
+.ch1_noise_sampling
+ ld hl, wCurTrackDuty
+ ld a, [wSoundLength]
+ or [hl]
+ ldh [rNR11], a
+ ld a, [wCurTrackIntensity]
+ ldh [rNR12], a
+ ld a, [wCurTrackFrequency]
+ ldh [rNR13], a
+ ld a, [wCurTrackFrequency + 1]
+ or $80
+ ldh [rNR14], a
+ ret
+
+.ch1_duty_override
+ ld a, [wCurTrackDuty]
+ ldh a, [rNR11]
+ and $3f
+ or d
+ ldh [rNR11], a
+ ret
+
+.ch1_intensity_override
+ ld a, [wCurTrackIntensity]
+ ldh [rNR12], a
+ ld a, [wCurTrackFrequency + 1]
+ or $80
+ ldh [rNR14], a
+ ret
+
+.ch1_freq_override
+ ld a, [wCurTrackFrequency]
+ ldh [rNR13], a
+ ld a, [wCurTrackFrequency + 1]
+ ldh [rNR14], a
+ ret
+
+.Channel2:
+.Channel6:
+ ld hl, CHANNEL_NOTE_FLAGS
+ add hl, bc
+ bit NOTE_REST, [hl]
+ jr nz, .ch2_rest
+ bit NOTE_NOISE_SAMPLING, [hl]
+ jr nz, .ch2_noise_sampling
+ bit NOTE_FREQ_OVERRIDE, [hl]
+ call nz, .ch2_freq_override
+ bit NOTE_INTENSITY_OVERRIDE, [hl]
+ call nz, .ch2_intensity_override
+ bit NOTE_DUTY_OVERRIDE, [hl]
+ call nz, .ch2_duty_override
+ ret
+
+.ch2_rest
+ ld a, $08
+ ldh [rNR22], a
+ ld a, [wCurTrackFrequency + 1]
+ or $80
+ ldh [rNR24], a
+ ret
+
+.ch2_noise_sampling
+ ld hl, wCurTrackDuty
+ ld a, [wSoundLength]
+ or [hl]
+ ldh [rNR21], a
+ ld a, [wCurTrackIntensity]
+ ldh [rNR22], a
+ ld a, [wCurTrackFrequency]
+ ldh [rNR23], a
+ ld a, [wCurTrackFrequency + 1]
+ or $80
+ ldh [rNR24], a
+ ret
+
+.ch2_duty_override
+ ld a, [wCurTrackDuty]
+ ld d, a
+ ldh a, [rNR21]
+ and $3f
+ or d
+ ldh [rNR21], a
+ ret
+
+.ch2_intensity_override
+ ld a, [wCurTrackIntensity]
+ ldh [rNR22], a
+ ld a, [wCurTrackFrequency + 1]
+ or $80
+ ldh [rNR24], a
+ ret
+
+.ch2_freq_override
+ ld a, [wCurTrackFrequency]
+ ldh [rNR23], a
+ ld a, [wCurTrackFrequency + 1]
+ ldh [rNR24], a
+ ret
+
+.Channel3:
+.Channel7:
+ ld hl, CHANNEL_NOTE_FLAGS
+ add hl, bc
+ bit NOTE_REST, [hl]
+ jr nz, .ch3_rest
+ bit NOTE_NOISE_SAMPLING, [hl]
+ jr nz, .ch3_noise_sampling
+ bit NOTE_FREQ_OVERRIDE, [hl]
+ call nz, .ch3_freq_override
+ bit NOTE_INTENSITY_OVERRIDE, [hl]
+ call nz, .ch3_intensity_override
+ ret
+
+.ch3_rest
+ xor a
+ ldh [rNR30], a
+ ret
+
+.ch3_noise_sampling
+ ld a, [wSoundLength]
+ ldh [rNR31], a
+ xor a
+ ldh [rNR30], a
+ call .load_wave_pattern
+ ld a, $80
+ ldh [rNR30], a
+ ld a, [wCurTrackFrequency]
+ ldh [rNR33], a
+ ld a, [wCurTrackFrequency + 1]
+ or $80
+ ldh [rNR34], a
+ ret
+
+.ch3_freq_override
+ ld a, [wCurTrackFrequency]
+ ldh [rNR33], a
+ ld a, [wCurTrackFrequency + 1]
+ ldh [rNR34], a
+ ret
+
+.ch3_intensity_override
+ xor a
+ ldh [rNR30], a
+ call .load_wave_pattern
+ ld a, $80
+ ldh [rNR30], a
+ ld a, [wCurTrackFrequency]
+ ldh [rNR33], a
+ ld a, [wCurTrackFrequency + 1]
+ or $80
+ ldh [rNR34], a
+ ret
+
+.load_wave_pattern
+ push hl
+ ld a, [wCurTrackIntensity]
+; only patterns 0 - 9 are valid
+ and $f
+ ld l, a
+ ld h, 0
+; hl << 4 (hl * $10), because each pattern is $f bytes
+rept 4
+ add hl, hl
+endr
+ ld de, WaveSamples
+ add hl, de
+ ld de, rWave_0
+ push bc
+ ld b, $10
+.load_pattern
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec b
+ jr nz, .load_pattern
+
+ pop bc
+ pop hl
+ ld a, [wCurTrackIntensity]
+ and $f0
+ sla a
+ ldh [rNR32], a
+ ret
+
+.Channel4:
+.Channel8:
+ ld hl, CHANNEL_NOTE_FLAGS
+ add hl, bc
+ bit NOTE_REST, [hl]
+ jr nz, .ch4_rest
+ bit NOTE_NOISE_SAMPLING, [hl]
+ jr nz, .ch4_noise_sampling
+ bit NOTE_FREQ_OVERRIDE, [hl]
+ call nz, .ch4_freq_override
+ bit NOTE_INTENSITY_OVERRIDE, [hl]
+ call nz, .ch4_intensity_override
+ ret
+
+.ch4_rest
+ ld a, $08
+ ldh [rNR42], a
+ ld a, $80
+ ldh [rNR44], a
+ ret
+
+.ch4_noise_sampling
+ ld a, [wSoundLength]
+ ldh [rNR41], a
+ ld a, [wCurTrackIntensity]
+ ldh [rNR42], a
+ ld a, [wCurTrackFrequency]
+ ldh [rNR43], a
+ ld a, $80
+ ldh [rNR44], a
+ ret
+
+.ch4_freq_override
+ ld a, [wCurTrackFrequency]
+ ldh [rNR43], a
+ ret
+
+.ch4_intensity_override
+ ld a, [wCurTrackIntensity]
+ ldh [rNR42], a
+ ld a, $80
+ ldh [rNR44], a
+ ret
-SECTION "audio/engine.asm@IsChannelSFXOn", ROMX
IsChannelSFXOn:
; If it's not a valid channel, return
ld a, [wCurChannel]
@@ -249,12 +520,11 @@ IsAnySFXOn:
scf
ret
-SECTION "audio/engine.asm@Functione82f0", ROMX
Functione82f0:
call IncrementTempo
call PlayDanger
call FadeMusic
- call Functione841d
+ call DoSweepingFade
ld a, [wVolume]
ld [rNR50], a
ld a, [wSoundOutput]
@@ -502,7 +772,1725 @@ FadeMusic:
ld [wVolume], a
ret
-SECTION "audio/engine.asm@Audio engine, part 2", ROMX
+DoSweepingFade::
+; performs a sweeping fade effect starting from the
+; left channel, then the right, then repeats
+
+ ld a, [wSweepingFadeIndex]
+ and a
+ ret z
+
+; first nybble of wSweepingFadeIndex is the subroutine index
+; second is the fade length
+ swap a
+ and 7
+ ld e, a
+ ld d, 0
+ ld hl, .jumptable
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+.jumptable
+ dw .DoFade1
+ dw .DoFade2
+ dw .DoFade3
+ dw .DoFade4
+ dw .DoFade5
+ dw .DoFade6
+ dw .DoFade1
+ dw .DoFade1
+
+.DoFade1:
+ ld a, 1
+ call .SetIndex
+ xor a
+ ld [wSweepingFadeCounter], a
+ ld [wVolume], a
+
+.DoFade2:
+ call .LeftChannel
+ call .DecrementCounter
+ ret nc
+ call .IncreaseVolume
+ ret nc
+ ld a, 2
+ call .SetIndex
+
+.DoFade3:
+ call .LeftChannel
+ call .DecrementCounter
+ ret nc
+ call .DecreaseVolume
+ ret nc
+ ld a, 3
+ call .SetIndex
+
+.DoFade4:
+ call .RightChannel
+ call .DecrementCounter
+ ret nc
+ call .IncreaseVolume
+ ret nc
+ ld a, 4
+ call .SetIndex
+.DoFade5:
+ call .RightChannel
+ call .DecrementCounter
+ ret nc
+ call .DecreaseVolume
+ ret nc
+ ld a, 0
+ call .SetIndex
+ ret
+
+.DoFade6:
+ xor a
+ ld [wSweepingFadeIndex], a
+ ld a, $77
+ ld [wVolume], a
+ ret
+
+.SetIndex:
+ swap a
+ ld d, a
+ ld a, [wSweepingFadeIndex]
+ and $f
+ or d
+ ld [wSweepingFadeIndex], a
+ ret
+
+.DecrementCounter:
+ ld a, [wSweepingFadeCounter]
+ and a
+ jr z, .reset_counter
+ dec a
+ ld [wSweepingFadeCounter], a
+ and a
+ ret
+ .reset_counter
+ ld a, [wSweepingFadeIndex]
+ and $f
+ ld [wSweepingFadeCounter], a
+ scf
+ ret
+
+.IncreaseVolume:
+ ld a, [wVolume]
+ and 7
+ cp 7
+ jr nc, .max_volume
+ inc a
+ ld d, a
+ swap a
+ or d
+ ld [wVolume], a
+ and a
+ ret
+.max_volume
+ scf
+ ret
+
+.DecreaseVolume:
+ ld a, [wVolume]
+ and $f
+ jr z, .min_volume
+ dec a
+ ld d, a
+ swap a
+ or d
+ ld [wVolume], a
+ and a
+ ret
+.min_volume
+ scf
+ ret
+
+.LeftChannel:
+ call IsAnySFXOn
+ ret c
+ ld a, [wSoundOutput]
+ and $f0
+ ld [wSoundOutput], a
+ ret
+
+.RightChannel:
+ call IsAnySFXOn
+ ret c
+ ld a, [wSoundOutput]
+ and $0f
+ ld [wSoundOutput], a
+ ret
+
+Call_03a_44fe:
+ ld hl, CHANNEL_FLAGS2
+ add hl, bc
+ bit SOUND_PITCH_WHEEL, [hl]
+ call nz, .pitch_wheel
+ bit SOUND_VIBRATO, [hl]
+ call nz, .vibrato
+ bit SOUND_UNKN_0E, [hl]
+ call nz, .flag_0e
+ bit SOUND_UNKN_0D, [hl]
+ call nz, .flag_0d
+ bit SOUND_UNKN_0B, [hl]
+ call nz, .flag_0b
+ ret
+
+.pitch_wheel:
+ push hl
+ ld hl, CHANNEL_NOTE_DURATION
+ add hl, bc
+ ld a, [hl]
+ ld hl, wc196
+ sub [hl]
+ jr nc, .jr_03a_452a
+
+ ld a, $01
+
+.jr_03a_452a
+ ld [hl], a
+ ld hl, $0010
+ add hl, bc
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, $0021
+ add hl, bc
+ ld a, e
+ sub [hl]
+ ld e, a
+ ld a, d
+ sbc $00
+ ld d, a
+ ld hl, $0022
+ add hl, bc
+ sub [hl]
+ jr nc, .jr_03a_4565
+
+ ld hl, $0005
+ add hl, bc
+ set 1, [hl]
+ ld hl, $0010
+ add hl, bc
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, $0021
+ add hl, bc
+ ld a, [hl]
+ sub e
+ ld e, a
+ ld a, d
+ sbc $00
+ ld d, a
+ ld hl, $0022
+ add hl, bc
+ ld a, [hl]
+ sub d
+ ld d, a
+ jr .jr_03a_4583
+
+.jr_03a_4565
+ ld hl, $0005
+ add hl, bc
+ res 1, [hl]
+ ld hl, $0010
+ add hl, bc
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, $0021
+ add hl, bc
+ ld a, e
+ sub [hl]
+ ld e, a
+ ld a, d
+ sbc $00
+ ld d, a
+ ld hl, $0022
+ add hl, bc
+ sub [hl]
+ ld d, a
+
+.jr_03a_4583
+ push bc
+ ld hl, wc196
+ ld b, $00
+
+.jr_03a_4589
+ inc b
+ ld a, e
+ sub [hl]
+ ld e, a
+ jr nc, .jr_03a_4589
+
+ ld a, d
+ and a
+ jr z, .jr_03a_4596
+
+ dec d
+ jr .jr_03a_4589
+
+.jr_03a_4596
+ ld a, e
+ add [hl]
+ ld d, b
+ pop bc
+ ld hl, $0023
+ add hl, bc
+ ld [hl], d
+ ld hl, $0024
+ add hl, bc
+ ld [hl], a
+ ld hl, $0025
+ add hl, bc
+ xor a
+ ld [hl], a
+ pop hl
+ ret
+
+
+.vibrato:
+ push hl
+ ld hl, $001e
+ add hl, bc
+ ld a, [hl]
+ ld hl, $001d
+ add hl, bc
+ ld [hl], a
+ pop hl
+ ret
+
+
+.flag_0e:
+ push hl
+ ld hl, $0005
+ add hl, bc
+ res 2, [hl]
+ pop hl
+ ret
+
+
+.flag_0d:
+ push hl
+ ld hl, $002b
+ add hl, bc
+
+.Call_03a_45c7:
+ xor a
+ ld [hl], a
+ pop hl
+ ret
+
+
+.flag_0b:
+ push hl
+ ld hl, $002c
+ add hl, bc
+ ld a, [hl]
+ ld hl, $0026
+ add hl, bc
+ ld [hl], a
+
+.Call_03a_45d6:
+ pop hl
+ ret
+
+
+Functione85d8::
+ ld hl, $0004
+ add hl, bc
+ bit 2, [hl]
+ call nz, Call_03a_4605
+ bit 6, [hl]
+ call nz, Call_03a_472b
+ bit 4, [hl]
+ call nz, Call_03a_4713
+ bit 1, [hl]
+ call nz, Call_03a_461b
+ bit 0, [hl]
+ call nz, Call_03a_46ad
+ bit 5, [hl]
+ call nz, Call_03a_475e
+ bit 3, [hl]
+ call nz, Call_03a_46ff
+ bit 7, [hl]
+ call nz, Call_03a_47bb
+ ret
+
+
+Call_03a_4605:
+ push hl
+ ld hl, $001c
+ add hl, bc
+ ld a, [hl]
+ rlca
+ rlca
+ ld [hl], a
+ and $c0
+ ld [wCurTrackDuty], a
+ ld hl, $000c
+ add hl, bc
+ set 0, [hl]
+ pop hl
+ ret
+
+
+Call_03a_461b:
+ push hl
+ ld hl, $0010
+ add hl, bc
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, $0005
+ add hl, bc
+ bit 1, [hl]
+ jr z, .jr_03a_465e
+
+ ld hl, $0023
+ add hl, bc
+ ld l, [hl]
+ ld h, $00
+ add hl, de
+ ld d, h
+ ld e, l
+ ld hl, $0024
+ add hl, bc
+ ld a, [hl]
+ ld hl, $0025
+ add hl, bc
+ add [hl]
+ ld [hl], a
+ ld a, $00
+ adc e
+ ld e, a
+ ld a, $00
+ adc d
+ ld d, a
+ ld hl, $0022
+ add hl, bc
+ ld a, [hl]
+ cp d
+ jp c, .Jump_03a_468b
+
+ jr nz, .jr_03a_469e
+
+ ld hl, $0021
+ add hl, bc
+ ld a, [hl]
+ cp e
+ jp c, .Jump_03a_468b
+
+ jr .jr_03a_469e
+
+.jr_03a_465e
+ ld a, e
+ ld hl, $0023
+ add hl, bc
+ ld e, [hl]
+ sub e
+ ld e, a
+ ld a, d
+ sbc $00
+ ld d, a
+ ld hl, $0024
+ add hl, bc
+ ld a, [hl]
+ add a
+ ld [hl], a
+ ld a, e
+ sbc $00
+ ld e, a
+ ld a, d
+ sbc $00
+ ld d, a
+ ld hl, $0022
+ add hl, bc
+ ld a, d
+ cp [hl]
+ jr c, .jr_03a_468b
+
+ jr nz, .jr_03a_469e
+
+ ld hl, $0021
+ add hl, bc
+ ld a, e
+ cp [hl]
+ jr nc, .jr_03a_469e
+
+.Jump_03a_468b
+.jr_03a_468b
+ ld hl, $0004
+ add hl, bc
+ res 1, [hl]
+ ld hl, $0005
+ add hl, bc
+ res 1, [hl]
+ ld hl, $0022
+ add hl, bc
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+
+.jr_03a_469e
+ ld hl, $0010
+ add hl, bc
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld hl, $000c
+ add hl, bc
+ set 1, [hl]
+ pop hl
+ ret
+
+
+Call_03a_46ad:
+ push hl
+ ld hl, $001d
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr nz, .jr_03a_46bf
+
+ ld hl, $0020
+ add hl, bc
+ ld a, [hl]
+ and $0f
+ jr z, .jr_03a_46c2
+
+.jr_03a_46bf
+ dec [hl]
+ jr .jr_03a_46fd
+
+.jr_03a_46c2
+ ld a, [hl]
+ swap [hl]
+ or [hl]
+ ld [hl], a
+ ld hl, $001f
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .jr_03a_46fd
+
+ ld hl, $0005
+ add hl, bc
+ bit 0, [hl]
+ jr z, .jr_03a_46e5
+
+ res 0, [hl]
+ and $0f
+ ld d, a
+ ld a, [wCurTrackFrequency]
+ sub d
+ jr nc, .jr_03a_46f4
+
+ xor a
+ jr .jr_03a_46f4
+
+.jr_03a_46e5
+ set 0, [hl]
+ and $f0
+ swap a
+ ld d, a
+ ld a, [wCurTrackFrequency]
+ add d
+ jr nc, .jr_03a_46f4
+
+ ld a, $ff
+
+.jr_03a_46f4
+ ld [wCurTrackFrequency], a
+ ld hl, $000c
+ add hl, bc
+ set 1, [hl]
+
+.jr_03a_46fd
+ pop hl
+ ret
+
+
+Call_03a_46ff:
+ push hl
+ ld hl, $0026
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .jr_03a_470b
+
+ dec [hl]
+ jr .jr_03a_4711
+
+.jr_03a_470b
+ ld hl, $000c
+ add hl, bc
+ set 5, [hl]
+
+.jr_03a_4711
+ pop hl
+ ret
+
+
+Call_03a_4713:
+ push hl
+ ld hl, $0027
+ add hl, bc
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, wCurTrackFrequency
+ push hl
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ add hl, de
+ ld e, l
+ ld d, h
+ pop hl
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ pop hl
+ ret
+
+
+Call_03a_472b:
+ push hl
+ ld hl, $0005
+ add hl, bc
+ bit 2, [hl]
+ jr nz, .jr_03a_4738
+
+ set 2, [hl]
+ jr .jr_03a_4756
+
+.jr_03a_4738
+ res 2, [hl]
+ ld hl, $0012
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .jr_03a_4756
+
+ ld hl, $0029
+ add hl, bc
+ add [hl]
+ ld e, a
+ ld hl, $0013
+ add hl, bc
+ ld d, [hl]
+ call Call_03a_4c84
+ ld hl, wCurTrackFrequency
+ ld [hl], e
+ inc hl
+ ld [hl], d
+
+.jr_03a_4756
+ ld hl, $000c
+ add hl, bc
+ set 1, [hl]
+ pop hl
+ ret
+
+
+Call_03a_475e:
+ push hl
+ ld hl, $002a
+ add hl, bc
+ ld e, [hl]
+ ld d, $00
+ ld a, [wCurChannel]
+ and $03
+ cp $02
+ jr nz, .jr_03a_4780
+
+ ld hl, $5125
+ call Call_03a_479b
+ jr c, .jr_03a_4788
+
+ ld d, a
+ ld a, [wCurTrackIntensity]
+ and $c0
+ or d
+ jr .jr_03a_4790
+
+.jr_03a_4780
+ ld hl, $5140
+ call Call_03a_479b
+ jr nc, .jr_03a_4790
+
+.jr_03a_4788
+ ld hl, $000c
+ add hl, bc
+ set 5, [hl]
+ pop hl
+ ret
+
+
+.jr_03a_4790
+ ld [wCurTrackIntensity], a
+ ld hl, $000c
+ add hl, bc
+ set 2, [hl]
+ pop hl
+ ret
+
+
+Call_03a_479b:
+ add hl, de
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, $002b
+ add hl, bc
+ push hl
+ ld l, [hl]
+ ld h, $00
+ add hl, de
+ ld a, [hl]
+ pop hl
+ cp $ff
+ jr z, .jr_03a_47b9
+
+ cp $fe
+ jr nz, .jr_03a_47b6
+
+ xor a
+ ld [hl], a
+ ld a, [de]
+
+.jr_03a_47b6
+ inc [hl]
+ and a
+ ret
+
+
+.jr_03a_47b9
+ scf
+ ret
+
+
+Call_03a_47bb:
+ ld hl, $002e
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .jr_03a_47cf
+
+ dec [hl]
+ ld hl, $0030
+ add hl, bc
+ ld a, [hl]
+ ld hl, $001b
+ add hl, bc
+ ld [hl], a
+ ret
+
+
+.jr_03a_47cf
+ ld hl, $002f
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .jr_03a_47e6
+
+ dec [hl]
+ ld hl, $0030
+ add hl, bc
+ ld a, [hl]
+ swap a
+ or [hl]
+ ld hl, $001b
+ add hl, bc
+ ld [hl], a
+ ret
+
+
+.jr_03a_47e6
+ ld hl, $0030
+ add hl, bc
+ ld a, [hl]
+ swap a
+ ld hl, $001b
+ add hl, bc
+ ld [hl], a
+ ld hl, $0004
+ add hl, bc
+ res 7, [hl]
+ ret
+
+
+Functione87f9::
+ ld hl, $0003
+ add hl, bc
+ bit 4, [hl]
+ ret z
+
+ ld a, [wc1a1]
+ and a
+ jr z, .jr_03a_480b
+
+ dec a
+ ld [wc1a1], a
+ ret
+
+
+.jr_03a_480b
+ ld hl, wc19f
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld a, [de]
+ inc de
+ cp $ff
+ jr z, .jr_03a_4838
+
+ and $0f
+ inc a
+ ld [wc1a1], a
+ ld a, [de]
+ inc de
+ ld [wCurTrackIntensity], a
+ ld a, [de]
+ inc de
+ ld [wCurTrackFrequency], a
+ xor a
+ ld [wCurTrackFrequency + 1], a
+ ld hl, wc19f
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld hl, $000c
+ add hl, bc
+ set 4, [hl]
+ ret
+
+
+.jr_03a_4838
+ ret
+
+
+Functione8839::
+ ld a, [wSFXPriority]
+ and a
+ ret z
+
+ ld a, [wCurChannel]
+ cp $04
+ ret nc
+
+ call IsAnySFXOn
+ ret nc
+
+ ld hl, $000c
+ add hl, bc
+ set 5, [hl]
+ ret
+
+
+Functione884f::
+ call Call_03a_4c65
+ cp $ff
+ jr z, .jr_03a_4876
+
+ cp $d0
+ jr nc, .jr_03a_489a
+
+ ld hl, $0003
+ add hl, bc
+ bit 3, [hl]
+ jr nz, .jr_03a_486e
+
+ bit 5, [hl]
+ jr nz, .jr_03a_486e
+
+ bit 4, [hl]
+ jr nz, .jr_03a_4872
+
+ call Call_03a_48be
+ ret
+
+
+.jr_03a_486e
+ call Call_03a_48f5
+ ret
+
+
+.jr_03a_4872
+ call Call_03a_4922
+ ret
+
+
+.jr_03a_4876
+ ld hl, $0003
+ add hl, bc
+ bit 1, [hl]
+ jr nz, .jr_03a_489a
+
+ call IsChannelSFXOn
+ jr nc, .jr_03a_4896
+
+ ld hl, $0003
+ add hl, bc
+ bit 5, [hl]
+ call nz, Call_03a_489f
+ ld a, [wCurChannel]
+ cp $04
+ jr nz, .jr_03a_4896
+
+ xor a
+ ldh [rNR10], a
+
+.jr_03a_4896
+ call StopChannel
+ ret
+
+
+.jr_03a_489a
+ call Call_03a_4958
+ jr Functione884f
+
+Call_03a_489f:
+ ld a, [wCurChannel]
+ cp $04
+ ret nz
+
+ xor a
+ ld hl, wChannel6CryPitch
+ ld [hli], a
+ ld [hl], a
+ ld hl, wChannel8CryPitch
+ ld [hli], a
+ ld [hl], a
+ ld a, [wLastVolume]
+ ld [wVolume], a
+ xor a
+ ld [wLastVolume], a
+ ld [wSFXPriority], a
+ ret
+
+
+Call_03a_48be:
+ ld a, [wCurMusicByte]
+ and $0f
+ call Call_03a_4cb4
+ ld a, [wCurMusicByte]
+ swap a
+ and $0f
+ jr z, .jr_03a_48ee
+
+ ld hl, $0012
+ add hl, bc
+ ld [hl], a
+ ld e, a
+ ld hl, $0013
+ add hl, bc
+ ld d, [hl]
+ call Call_03a_4c84
+ ld hl, $0010
+ add hl, bc
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld hl, $000c
+ add hl, bc
+ set 4, [hl]
+ call Call_03a_44fe
+ ret
+
+
+.jr_03a_48ee
+ ld hl, $000c
+ add hl, bc
+ set 5, [hl]
+ ret
+
+
+Call_03a_48f5:
+ ld hl, $000c
+ add hl, bc
+ set 4, [hl]
+ ld a, [wCurMusicByte]
+ call Call_03a_4cb4
+ call Call_03a_4c65
+ ld hl, $000f
+ add hl, bc
+ ld [hl], a
+ call Call_03a_4c65
+ ld hl, $0010
+ add hl, bc
+ ld [hl], a
+ ld a, [wCurChannel]
+ and $03
+ cp $03
+ ret z
+
+ call Call_03a_4c65
+ ld hl, $0011
+ add hl, bc
+ ld [hl], a
+ ret
+
+
+Call_03a_4922:
+ ld a, [wCurChannel]
+ cp $03
+ ret nz
+
+ ld a, [wCurMusicByte]
+ and $0f
+ call Call_03a_4cb4
+ ld a, [wc1a3]
+ ld e, a
+ ld d, $00
+ ld hl, $51f4
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [wCurMusicByte]
+ swap a
+ and $0f
+ ret z
+
+ ld e, a
+ ld d, $00
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld [wc19f], a
+ ld a, [hl]
+ ld [wc1a0], a
+ xor a
+ ld [wc1a1], a
+ ret
+
+
+Call_03a_4958:
+ ld a, [wCurMusicByte]
+ sub $d0
+ ld e, a
+ ld d, $00
+ ld hl, $4969
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+
+ jp nc, $d24b
+
+ ld c, e
+
+ db $d2, $4b, $d2, $4b, $d2, $4b, $d2, $4b, $d2, $4b
+
+ db $d2
+ ld c, e
+
+ db $8f, $4b
+
+ db $dd
+ ld c, e
+
+ db $c6, $4b, $b0, $4b
+
+ cp l
+ ld c, e
+
+ db $a3, $4b
+
+ ld b, [hl]
+ ld c, e
+ ld l, l
+ ld c, e
+
+ db $fd, $4a, $cb, $4a
+
+ cp h
+ ld c, d
+
+ db $7b, $4b
+
+ db $ec
+ ld c, e
+
+ db $f9, $4b
+
+ inc h
+ ld c, e
+ scf
+ ld c, e
+ ld e, [hl]
+ ld c, e
+ ld [$2f4c], sp
+ ld c, h
+ ld d, a
+ ld c, h
+ inc h
+ ld c, h
+ ld a, [hli]
+ ld c, h
+ add a
+ ld c, d
+ and $4b
+ ret
+
+
+ ld c, c
+ ret
+
+
+ ld c, c
+ ret
+
+
+ ld c, c
+ ret
+
+
+ ld c, c
+ ret
+
+
+ ld c, c
+ ret
+
+
+ ld c, c
+ ret
+
+
+ ld c, c
+ ret
+
+
+ ld c, c
+ ret
+
+
+ ld c, c
+
+ db $b6, $4a
+
+ ld d, a
+ ld c, d
+ ld h, b
+ ld c, d
+ dec b
+ ld c, d
+
+ db $15, $4a, $df, $49, $ca, $49
+
+ ret
+
+
+ ld hl, $0003
+ add hl, bc
+ res 1, [hl]
+ ld hl, $0008
+ add hl, bc
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, $0006
+ add hl, bc
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ret
+
+
+ call Call_03a_4c65
+ ld e, a
+ call Call_03a_4c65
+ ld d, a
+ push de
+ ld hl, $0006
+ add hl, bc
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, $0008
+ add hl, bc
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ pop de
+ ld hl, $0006
+ add hl, bc
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld hl, $0003
+ add hl, bc
+ set 1, [hl]
+ ret
+
+
+ call Call_03a_4c65
+ ld e, a
+ call Call_03a_4c65
+ ld d, a
+ ld hl, $0006
+ add hl, bc
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ret
+
+
+ call Call_03a_4c65
+ ld hl, $0003
+ add hl, bc
+ bit 2, [hl]
+ jr nz, .jr_03a_4a2b
+
+ and a
+ jr z, .jr_03a_4a34
+
+ dec a
+ set 2, [hl]
+ ld hl, $0018
+ add hl, bc
+ ld [hl], a
+
+.jr_03a_4a2b
+ ld hl, $0018
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .jr_03a_4a44
+
+ dec [hl]
+
+.jr_03a_4a34
+ call Call_03a_4c65
+ ld e, a
+ call Call_03a_4c65
+ ld d, a
+ ld hl, $0006
+ add hl, bc
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ret
+
+
+.jr_03a_4a44
+ ld hl, $0003
+ add hl, bc
+ res 2, [hl]
+ ld hl, $0006
+ add hl, bc
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc de
+ inc de
+ ld [hl], d
+ dec hl
+ ld [hl], e
+ ret
+
+
+ call Call_03a_4c65
+ ld hl, $000d
+ add hl, bc
+ ld [hl], a
+ ret
+
+
+ call Call_03a_4c65
+ ld hl, $000d
+ add hl, bc
+ cp [hl]
+ jr z, .jr_03a_4a77
+
+ ld hl, $0006
+ add hl, bc
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc de
+ inc de
+ ld [hl], d
+ dec hl
+ ld [hl], e
+ ret
+
+
+.jr_03a_4a77
+ call Call_03a_4c65
+ ld e, a
+ call Call_03a_4c65
+ ld d, a
+ ld hl, $0006
+ add hl, bc
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ret
+
+
+ ld a, [wCurChannel]
+ and $03
+ ld e, a
+ ld d, $00
+ ld hl, wChannel1JumpCondition
+ add hl, de
+ ld a, [hl]
+ and a
+ jr nz, .jr_03a_4aa4
+
+ ld hl, $0006
+ add hl, bc
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc de
+ inc de
+ ld [hl], d
+ dec hl
+ ld [hl], e
+ ret
+
+
+.jr_03a_4aa4
+ ld [hl], $00
+ call Call_03a_4c65
+ ld e, a
+ call Call_03a_4c65
+ ld d, a
+ ld hl, $0006
+ add hl, bc
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ret
+
+
+ ld a, $01
+ ld [wc1b3], a
+ ret
+
+
+ call Call_03a_4c65
+ ld hl, $002c
+ add hl, bc
+ ld [hl], a
+ ld hl, $0004
+ add hl, bc
+ set 3, [hl]
+ ret
+
+
+ ld hl, $0004
+ add hl, bc
+ set 0, [hl]
+ res 0, [hl]
+ call Call_03a_4c65
+ ld hl, $001e
+ add hl, bc
+ ld [hl], a
+ call Call_03a_4c65
+ ld hl, $001f
+ add hl, bc
+ ld d, a
+ and $f0
+ swap a
+ srl a
+ ld e, a
+ adc $00
+ swap a
+ or e
+ ld [hl], a
+ ld hl, $0020
+ add hl, bc
+ ld a, d
+ and $0f
+ ld d, a
+ swap a
+ or d
+ ld [hl], a
+ ret
+
+
+ call Call_03a_4c65
+ ld [wc196], a
+ call Call_03a_4c65
+ ld d, a
+ and $0f
+ ld e, a
+ ld a, d
+ swap a
+ and $0f
+ ld d, a
+ call Call_03a_4c84
+ ld hl, $0021
+ add hl, bc
+ ld [hl], e
+ ld hl, $0022
+ add hl, bc
+ ld [hl], d
+ ld hl, $0004
+ add hl, bc
+ set 1, [hl]
+
+Jump_03a_4b23:
+ ret
+
+
+ ld hl, $0004
+ add hl, bc
+ set 4, [hl]
+ ld hl, $0028
+ add hl, bc
+ call Call_03a_4c65
+ ld [hld], a
+ call Call_03a_4c65
+ ld [hl], a
+ ret
+
+
+ ld hl, $0004
+ add hl, bc
+ set 6, [hl]
+ call Call_03a_4c65
+ ld hl, $0029
+ add hl, bc
+ ld [hl], a
+ ret
+
+
+ ld hl, $0004
+ add hl, bc
+ set 2, [hl]
+ call Call_03a_4c65
+ rrca
+ rrca
+ ld hl, $001c
+ add hl, bc
+ ld [hl], a
+ and $c0
+ ld hl, $000e
+ add hl, bc
+ ld [hl], a
+ ret
+
+
+ ld hl, $0004
+ add hl, bc
+ set 5, [hl]
+ call Call_03a_4c65
+ ld hl, $002a
+ add hl, bc
+ ld [hl], a
+ ret
+
+
+ ld hl, $0003
+ add hl, bc
+ bit 3, [hl]
+ jr z, .jr_03a_4b78
+
+ res 3, [hl]
+ ret
+
+
+.jr_03a_4b78
+ set 3, [hl]
+ ret
+
+
+ ld hl, $0003
+ add hl, bc
+ bit 4, [hl]
+ jr z, .jr_03a_4b86
+
+ res 4, [hl]
+ ret
+
+
+.jr_03a_4b86
+ set 4, [hl]
+ call Call_03a_4c65
+ ld [wc1a3], a
+ ret
+
+
+ call Call_03a_4c65
+ ld hl, $002d
+ add hl, bc
+ ld [hl], a
+ ld a, [wCurChannel]
+ and $03
+ cp $03
+ ret z
+
+ call Call_03a_4bbd
+ ret
+
+
+ call Call_03a_4c65
+ ld [wPitchSweep], a
+ ld hl, $000c
+ add hl, bc
+ set 3, [hl]
+ ret
+
+
+ call Call_03a_4c65
+ rrca
+ rrca
+ and $c0
+ ld hl, $000e
+ add hl, bc
+ ld [hl], a
+ ret
+
+
+Call_03a_4bbd:
+ call Call_03a_4c65
+ ld hl, $000f
+ add hl, bc
+ ld [hl], a
+ ret
+
+
+ call Call_03a_4c65
+ ld d, a
+ call Call_03a_4c65
+ ld e, a
+ call SetGlobalTempo
+ ret
+
+
+ ld hl, $0013
+ add hl, bc
+ ld a, [wCurMusicByte]
+ and $07
+ ld [hl], a
+ ret
+
+
+ call Call_03a_4c65
+ ld hl, $0014
+ add hl, bc
+ ld [hl], a
+ ret
+
+
+ ld a, [wce5f]
+ bit 5, a
+ ret z
+
+ call SetLRTracks
+ call Call_03a_4c65
+ ld hl, $001b
+ add hl, bc
+ and [hl]
+ ld [hl], a
+ ret
+
+
+ call Call_03a_4c65
+ ld a, [wMusicFade]
+ and a
+ ret nz
+
+ ld a, [wCurMusicByte]
+ ld [wVolume], a
+ ret
+
+
+ call Call_03a_4c65
+ ld e, a
+ cp $80
+ jr nc, .jr_03a_4c14
+
+ ld d, $00
+ jr .jr_03a_4c16
+
+.jr_03a_4c14
+ ld d, $ff
+
+.jr_03a_4c16
+ ld hl, $0019
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ add hl, de
+ ld e, l
+ ld d, h
+ call SetGlobalTempo
+ ret
+
+
+ ld a, $01
+ ld [wSFXPriority], a
+ ret
+
+
+ xor a
+ ld [wSFXPriority], a
+ ret
+
+
+ ld hl, $0000
+ add hl, bc
+ ld a, [hli]
+ ld [wMusicID], a
+ ld a, [hl]
+ ld [wMusicID + 1], a
+ ld hl, $0002
+ add hl, bc
+ ld a, [hl]
+ ld [wMusicBank], a
+ call Call_03a_4c65
+ ld l, a
+ call Call_03a_4c65
+ ld h, a
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ push bc
+ call LoadChannel
+ call StartChannel
+ pop bc
+ ret
+
+
+ call Call_03a_4c65
+ ld e, a
+ call Call_03a_4c65
+ ld d, a
+ push bc
+ call _PlayMusic
+ pop bc
+ ret
+
+
+Call_03a_4c65:
+ push hl
+ push de
+ ld hl, $0006
+ add hl, bc
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, $0002
+ add hl, bc
+ ld a, [hl]
+ call _LoadMusicByte
+ ld [wCurMusicByte], a
+ inc de
+ ld hl, $0006
+ add hl, bc
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ pop de
+ pop hl
+ ret
+
+
+Call_03a_4c84:
+ ld hl, $0014
+ add hl, bc
+ ld a, [hl]
+ swap a
+ and $0f
+ add d
+ push af
+ ld hl, $0014
+ add hl, bc
+ ld a, [hl]
+ and $0f
+ ld l, a
+ ld d, $00
+ ld h, d
+ add hl, de
+ add hl, hl
+ ld de, $4f73
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ pop af
+
+.jr_03a_4ca4
+ cp $07
+ jr nc, .jr_03a_4caf
+
+ sra d
+ rr e
+ inc a
+ jr .jr_03a_4ca4
+
+.jr_03a_4caf
+ ld a, d
+ and $07
+ ld d, a
+ ret
+
+
+Call_03a_4cb4:
+ inc a
+ ld e, a
+ ld d, $00
+ ld hl, $002d
+ add hl, bc
+ ld a, [hl]
+ ld l, $00
+ call Call_03a_4cdf
+ ld a, l
+ ld hl, $0019
+ add hl, bc
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, $0016
+ add hl, bc
+ ld l, [hl]
+ call Call_03a_4cdf
+ ld e, l
+ ld d, h
+ ld hl, $0016
+ add hl, bc
+ ld [hl], e
+ ld hl, $0015
+ add hl, bc
+ ld [hl], d
+ ret
+
+
+Call_03a_4cdf:
+ ld h, $00
+
+.jr_03a_4ce1
+ srl a
+ jr nc, .jr_03a_4ce6
+
+ add hl, de
+
+.jr_03a_4ce6
+ sla e
+ rl d
+ and a
+ jr nz, .jr_03a_4ce1
+
+ ret
SetGlobalTempo:
push bc
@@ -573,7 +2561,7 @@ SetLRTracks:
maskbits NUM_MUSIC_CHANS
ld e, a
ld d, 0
- ld hl, $52B3 ; FIXME
+ ld hl, Data_03a_52b3
add hl, de
ld a, [hl]
ld hl, CHANNEL_TRACKS
@@ -610,7 +2598,359 @@ _PlayMusic::
dec a
jr nz, .loop
xor a
- ; TODO
+ ld [wc1b3], a
+ ld [wChannel1JumpCondition], a
+ ld [wChannel2JumpCondition], a
+ ld [wChannel3JumpCondition], a
+ ld [wChannel4JumpCondition], a
+ ret
+
+
+_PlayCryHeader::
+ ld hl, wMusicID
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld hl, CryHeaderPointers
+ add hl, de
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld [wMusicBank], a
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ call LoadMusicByte
+ rlca
+ rlca
+ and $03
+ inc a
+
+.jr_03a_4db8
+ push af
+ call LoadChannel
+ ld hl, $0003
+ add hl, bc
+ set 5, [hl]
+ ld hl, $0004
+ add hl, bc
+ set 4, [hl]
+ ld hl, $0027
+ add hl, bc
+ ld a, [wCryPitch]
+ ld [hli], a
+ ld a, [wCryPitch + 1]
+ ld [hl], a
+ ld a, [wCurChannel]
+ and $03
+ cp $03
+ jr nc, .jr_03a_4de9
+
+ ld hl, $0019
+ add hl, bc
+ ld a, [wCryLength]
+ ld [hli], a
+ ld a, [wCryLength + 1]
+ ld [hl], a
+
+.jr_03a_4de9
+ call StartChannel
+ ld a, [wc1b9]
+ and a
+ jr z, .jr_03a_4e07
+
+ ld a, [wce5f]
+ bit 5, a
+ jr z, .jr_03a_4e07
+
+ ld hl, $001b
+ add hl, bc
+ ld a, [hl]
+ ld hl, wc1ba
+ and [hl]
+ ld hl, $001b
+ add hl, bc
+ ld [hl], a
+
+.jr_03a_4e07
+ pop af
+ dec a
+ jr nz, .jr_03a_4db8
+
+ ld a, [wLastVolume]
+ and a
+ jr nz, .jr_03a_4e1c
+
+ ld a, [wVolume]
+ ld [wLastVolume], a
+ ld a, $77
+ ld [wVolume], a
+
+.jr_03a_4e1c
+ ld a, $01
+ ld [wSFXPriority], a
+ ret
+
+
+_PlaySFX::
+ ld hl, wMusicID
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld hl, $536d
+ add hl, de
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld [wMusicBank], a
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ call LoadMusicByte
+ rlca
+ rlca
+ and $03
+ inc a
+
+.jr_03a_4e3d
+ push af
+ call LoadChannel
+ ld hl, $0003
+ add hl, bc
+ set 3, [hl]
+ call StartChannel
+ pop af
+ dec a
+ jr nz, .jr_03a_4e3d
+
+ ret
+
+
+ ld a, [wce5f]
+ bit 5, a
+ jr z, _PlaySFX
+
+ ld hl, wMusicID
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld hl, $536d
+ add hl, de
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld [wMusicBank], a
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ call LoadMusicByte
+ rlca
+ rlca
+ and $03
+ inc a
+
+.jr_03a_4e71
+ push af
+ call LoadChannel
+ ld hl, $0003
+ add hl, bc
+ set 3, [hl]
+ push de
+ ld a, [wCurChannel]
+ and $03
+ ld e, a
+ ld d, $00
+ ld hl, $52b3
+ add hl, de
+ ld a, [hl]
+ ld hl, wc1b9
+ and [hl]
+ ld hl, $001b
+ add hl, bc
+ ld [hl], a
+ ld hl, $0030
+ add hl, bc
+ ld [hl], a
+ ld a, [wc1ba]
+ cp $02
+ jr c, .jr_03a_4eb1
+
+ ld a, [wc1bb]
+ ld hl, $002e
+ add hl, bc
+ ld [hl], a
+ ld hl, $002f
+ add hl, bc
+ ld [hl], a
+ ld hl, $0004
+ add hl, bc
+ set 7, [hl]
+
+.jr_03a_4eb1
+ pop de
+ ld hl, $0003
+ add hl, bc
+ set 0, [hl]
+ pop af
+ dec a
+ jr nz, .jr_03a_4e71
+
+ ret
+
+
+ ld hl, wMusicID
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld hl, $536d
+ add hl, de
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld [wMusicBank], a
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ call LoadMusicByte
+ rlca
+ rlca
+ and $03
+ inc a
+
+.jr_03a_4ed8
+ push af
+ call LoadChannel
+ ld hl, $0003
+ add hl, bc
+ set 3, [hl]
+ ld hl, $0004
+ add hl, bc
+ set 4, [hl]
+ ld hl, $0027
+ add hl, bc
+ ld a, [wCryPitch]
+ ld [hli], a
+ ld a, [wCryPitch + 1]
+ ld [hl], a
+ ld a, [wCurChannel]
+ and $03
+ cp $03
+ jr nc, .jr_03a_4f09
+
+ ld hl, $0019
+ add hl, bc
+ ld a, [wCryLength]
+ ld [hli], a
+ ld a, [wCryLength + 1]
+ ld [hl], a
+
+.jr_03a_4f09
+ call StartChannel
+ pop af
+ dec a
+ jr nz, .jr_03a_4ed8
+
+ ret
+
+
+LoadChannel::
+ call LoadMusicByte
+ inc de
+ and $07
+ ld [wCurChannel], a
+ ld c, a
+ ld b, $00
+ ld hl, $52b7
+ add hl, bc
+ add hl, bc
+ ld c, [hl]
+ inc hl
+ ld b, [hl]
+ ld hl, $0003
+ add hl, bc
+ res 0, [hl]
+ call Call_03a_4f51
+ ld hl, $0006
+ add hl, bc
+ call LoadMusicByte
+ ld [hli], a
+ inc de
+ call LoadMusicByte
+ ld [hl], a
+ inc de
+ ld hl, $0000
+ add hl, bc
+ ld a, [wMusicID]
+ ld [hli], a
+ ld a, [wMusicID + 1]
+ ld [hl], a
+ ld hl, $0002
+ add hl, bc
+ ld a, [wMusicBank]
+ ld [hl], a
+ ret
+
+
+Call_03a_4f51:
+ push de
+ xor a
+ ld hl, $0000
+ add hl, bc
+ ld e, $32
+
+.jr_03a_4f59
+ ld [hli], a
+ dec e
+ jr nz, .jr_03a_4f59
+
+ ld hl, $0019
+ add hl, bc
+ xor a
+ ld [hli], a
+ inc a
+ ld [hl], a
+ ld hl, $002d
+ add hl, bc
+ ld [hl], a
+ pop de
+ ret
+
+
+LoadMusicByte::
+ ld a, [wMusicBank]
+ call _LoadMusicByte
+ ret
+
+Data_4f73:
+ db $00, $00, $2C, $F8, $9D, $F8, $07, $F9, $6B, $F9, $CA, $F9, $23, $FA, $77, $FA, $C7, $FA, $12, $FB, $58, $FB, $9B, $FB, $DA, $FB, $16, $FC, $4E, $FC, $83, $FC, $B5, $FC, $E5, $FC, $11, $FD, $3B, $FD, $63, $FD, $89, $FD, $AC, $FD, $CD, $FD, $ED, $FD
+
+WaveSamples:
+ db $02, $46, $8A, $CE, $FF, $FE, $ED, $DC, $CB, $A9, $87, $65, $44, $33, $22, $11 ; 0
+ db $02, $46, $8A, $CE, $EF, $FF, $FE, $EE, $DD, $CB, $A9, $87, $65, $43, $22, $11 ; 1
+ db $13, $69, $BD, $EE, $EE, $FF, $FF, $ED, $DE, $FF, $FF, $EE, $EE, $DB, $96, $31 ; 2
+ db $02, $46, $8A, $CD, $EF, $FE, $DE, $FF, $EE, $DC, $BA, $98, $76, $54, $32, $10 ; 3
+ db $01, $23, $45, $67, $8A, $CD, $EE, $F7, $7F, $EE, $DC, $A8, $76, $54, $32, $10 ; 4
+ db $00, $23, $45, $67, $8A, $C7, $EE, $F7, $7F, $EE, $D7, $A8, $76, $54, $32, $14 ; 5
+ db $01, $02, $03, $04, $05, $06, $07, $08, $09, $0A, $0B, $0C, $0D, $0E, $0F, $0F ; 6
+ db $0F, $0F, $0E, $0E, $0D, $0D, $0C, $0C, $0B, $0B, $0A, $0A, $09, $09, $08, $08 ; 7
+ db $07, $07, $06, $06, $05, $05, $04, $04, $03, $03, $02, $02, $01, $01, $00, $00 ; 8
+ db $FF, $FF, $FF, $FF, $88, $88, $88, $88, $00, $00, $00, $00, $88, $88, $88, $88 ; 9
+ db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $00, $00, $00, $00, $00, $00, $00, $00 ; a
+ db $EE, $EE, $EE, $EE, $EE, $EE, $EE, $EE, $00, $00, $00, $00, $00, $00, $00, $00 ; b
+ db $DD, $DD, $DD, $DD, $DD, $DD, $DD, $DD, $00, $00, $00, $00, $00, $00, $00, $00 ; c
+ db $CC, $CC, $CC, $CC, $CC, $CC, $CC, $CC, $00, $00, $00, $00, $00, $00, $00, $00 ; d
+ db $BB, $BB, $BB, $BB, $BB, $BB, $BB, $BB, $00, $00, $00, $00, $00, $00, $00, $00 ; e
+ db $AA, $AA, $AA, $AA, $AA, $AA, $AA, $AA, $00, $00, $00, $00, $00, $00, $00, $00 ; f
+
+Filler_03a_50a5:
+ db $99, $99, $99, $99, $99, $99, $99, $99, $00, $00, $00, $00, $00, $00, $00, $00, $88, $88, $88, $88, $88, $88, $88, $88, $00, $00, $00, $00, $00, $00, $00, $00, $77, $77, $77, $77, $77, $77, $77, $77, $00, $00, $00, $00, $00, $00, $00, $00, $66, $66, $66, $66, $66, $66, $66, $66, $00, $00, $00, $00, $00, $00, $00, $00, $55, $55, $55, $55, $55, $55, $55, $55, $00, $00, $00, $00, $00, $00, $00, $00, $44, $44, $44, $44, $44, $44, $44, $44, $00, $00, $00, $00, $00, $00, $00, $00, $33, $33, $33, $33, $33, $33, $33, $33, $00, $00, $00, $00, $00, $00, $00, $00, $22, $22, $22, $22, $22, $22, $22, $22, $00, $00, $00, $00, $00, $00, $00, $00, $31, $51, $31, $51, $31, $51, $31, $51, $31, $51, $31, $51, $0A, $0B, $0C, $0D, $0E, $0F, $10, $11, $12, $13, $14, $15, $16, $17, $FF, $4C, $51, $99, $51, $BA, $51, $E3, $51, $F4, $51, $F4, $51, $11, $21, $31, $41, $51, $61, $71, $81, $91, $A1, $B1, $C1, $D1, $E1, $F1, $F1, $F1, $F1, $F1, $F1, $E1, $E1, $E1, $E1, $D1, $D1, $D1, $D1, $C1, $C1, $C1, $C1, $B1, $B1, $B1, $B1, $A1, $A1, $A1, $A1, $91, $91, $91, $91, $81, $81, $81, $81, $71, $71, $71, $71, $61, $61, $61, $61, $51, $51, $51, $51, $41, $41, $41, $41, $31, $31, $31, $31, $21, $21, $21, $21, $11, $11, $11, $11, $FF, $11, $91, $D1, $F1, $F1, $F1, $F1, $F1, $D1, $D1, $D1, $D1, $A1, $A1, $A1, $A1, $81, $81, $81, $81, $61, $61, $61, $61, $41, $41, $41, $41, $21, $21, $21, $21, $FF, $31, $51, $A1, $51, $F1, $51, $F1, $51, $F1, $51, $F1, $51, $D1, $51, $D1, $51, $B1, $51, $B1, $51, $91, $51, $91, $51, $71, $51, $71, $51, $51, $51, $51, $51, $31, $51, $31, $51, $11, $51, $11, $51, $FF, $F0, $E0, $D0, $C0, $B0, $A0, $90, $80, $70, $60, $50, $40, $30, $20, $10, $00, $FF, $00, $52, $1A, $52, $34, $52, $4E, $52, $4E, $52, $4E, $52, $4E, $52, $4F, $52, $53, $52, $57, $52, $5B, $52, $5F, $52, $72, $52, $76, $52, $7D, $52, $81, $52, $85, $52, $89, $52, $8D, $52, $4E, $52, $7D, $52, $81, $52, $85, $52, $89, $52, $8D, $52, $91, $52, $95, $52, $99, $52, $A0, $52, $A7, $52, $AB, $52, $AF, $52, $4E, $52, $4F, $52, $A7, $52, $AB, $52, $AF, $52, $5F, $52, $72, $52, $76, $52, $7D, $52, $81, $52, $85, $52, $89, $52, $8D, $52, $FF, $20, $C1, $33, $FF, $20, $B1, $33, $FF, $20, $A1, $33, $FF, $20, $81, $33, $FF, $27, $84, $37, $26, $84, $36, $25, $83, $35, $24, $83, $34, $23, $82, $33, $22, $81, $32, $FF, $20, $51, $2A, $FF, $21, $41, $2B, $20, $61, $2A, $FF, $20, $81, $10, $FF, $20, $82, $23, $FF, $20, $82, $25, $FF, $20, $82, $26, $FF, $20, $A1, $10, $FF, $20, $A2, $11, $FF, $20, $A2, $50, $FF, $20, $A1, $18, $20, $31, $33, $FF, $22, $91, $28, $20, $71, $18, $FF, $20, $91, $22, $FF, $20, $71, $22, $FF, $20, $61, $22, $FF
+
+Data_03a_52b3:
+ db $11, $22, $44, $88, $00, $c0, $32, $c0, $64, $c0, $96, $c0, $c8, $c0, $fa, $c0
+ db $2c, $c1, $5e, $c1
+
SECTION "audio/engine.asm@Song Header Pointers", ROMX
+
+Music::
INCLUDE "audio/song_header_pointers.inc"
diff --git a/constants/audio_constants.asm b/constants/audio_constants.asm
index 51dc36f..b85298a 100644
--- a/constants/audio_constants.asm
+++ b/constants/audio_constants.asm
@@ -96,13 +96,13 @@ NOISE_CHAN_F EQU 2 ; bit set in CHAN5-CHAN7
; NoteFlags
const_def
- const NOTE_DUTY_OVERRIDE ; 0
- const NOTE_FREQ_OVERRIDE ; 1
- const NOTE_UNUSED ; 2
- const NOTE_UNKN_3 ; 3
- const NOTE_NOISE_SAMPLING ; 4
- const NOTE_REST ; 5
- const NOTE_VIBRATO_OVERRIDE ; 6
+ const NOTE_DUTY_OVERRIDE ; 0
+ const NOTE_FREQ_OVERRIDE ; 1
+ const NOTE_INTENSITY_OVERRIDE ; 2
+ const NOTE_PITCH_SWEEP ; 3
+ const NOTE_NOISE_SAMPLING ; 4
+ const NOTE_REST ; 5
+ const NOTE_VIBRATO_OVERRIDE ; 6
; wVolume
VOLUME_SO1_F EQU 3
diff --git a/layout.link b/layout.link
index e03d166..5a7ee25 100644
--- a/layout.link
+++ b/layout.link
@@ -907,14 +907,7 @@ ROMX $39
ROMX $3a
org $4000
"audio/engine.asm@Audio"
- org $42bd
- "audio/engine.asm@IsChannelSFXOn"
- "audio/engine.asm@Functione82f0"
- org $4cee
- "audio/engine.asm@Audio engine, part 2"
- org $52c7
"audio/engine.asm@Song Header Pointers"
- org $52ee
"audio/songs/none.asm"
ROMX $3b
diff --git a/ram/wram.asm b/ram/wram.asm
index da6d364..37209c3 100644
--- a/ram/wram.asm
+++ b/ram/wram.asm
@@ -22,9 +22,9 @@ wChannel8:: channel_struct wChannel8
wCurTrackDuty:: db
wCurTrackIntensity:: db
wCurTrackFrequency:: dw
-wc195:: db
-
- ds 2 ; TODO
+wSoundLength:: db
+wc196:: db
+wCurMusicByte:: db
wCurChannel:: db
wVolume:: db
@@ -34,12 +34,16 @@ wSoundOutput::
; bit 0-3: ch1-4 so1 on/off
db
- ds 1 ; TODO
+wPitchSweep:: db
wMusicID:: dw
wMusicBank:: db
- ds 5 ; TODO
+wc19f:: db
+wc1a0:: db
+wc1a1:: db
+wc1a2:: db
+wc1a3:: db
wLowHealthAlarm::
; bit 7: on/off
@@ -58,19 +62,26 @@ wMusicFadeID::
wMusicFadeIDLow:: db
wMusicFadeIDHigh:: db
- ds 2 ; TODO
+wSweepingFadeIndex:: db
+wSweepingFadeCounter:: db
wIncrementTempo: dw
wMapMusic:: db
wCryPitch:: dw
wCryLength:: dw
- ds 7 ; TODO
+wLastVolume:: db
+wc1b3:: db
+wSFXPriority:: db
+wChannel1JumpCondition:: db
+wChannel2JumpCondition:: db
+wChannel3JumpCondition:: db
+wChannel4JumpCondition:: db
wc1b9:: db
wc1ba:: db
; either wChannelsEnd or wMusicEnd, unsure
- ds 1 ; TODO
+wc1bb:: db
wMusicInitEnd::
diff --git a/shim.sym b/shim.sym
index a34e54f..2db8e06 100755
--- a/shim.sym
+++ b/shim.sym
@@ -154,16 +154,8 @@
38:4000 PikachuMiniGame
39:4000 GameFreakIntro
39:432F OpeningCutscene
-3A:441D Functione841d
-3A:45D8 Functione85d8
-3A:47F9 Functione87f9
-3A:4839 Functione8839
-3A:484F Functione884f
-3A:4D9D _PlayCryHeader
-3A:4E22 _PlaySFX
-3A:4F11 LoadChannel
-3A:4F6C LoadMusicByte
-3A:52C7 Music
+
+3A:52FB CryHeaderPointers
3F:40E9 InGameDebugMenu
3F:4305 TrainerGear