summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--audio/engine.asm165
-rw-r--r--constants/audio_constants.asm4
-rw-r--r--shim.sym2
-rw-r--r--wram.asm17
4 files changed, 180 insertions, 8 deletions
diff --git a/audio/engine.asm b/audio/engine.asm
index 3e590f6..0d1d065 100644
--- a/audio/engine.asm
+++ b/audio/engine.asm
@@ -251,8 +251,8 @@ IsAnySFXOn: ; 3a:42d0
SECTION "Function_e82f0", ROMX[$42f0], BANK[$3a]
Function_e82f0: ; 3a:42f0
- call Function_e8352
- call Function_e8307
+ call IncrementTempo
+ call PlayDanger
call FadeMusic
call Function_e841d
ld a, [wVolume]
@@ -261,7 +261,166 @@ Function_e82f0: ; 3a:42f0
ld [rNR51], a
ret
-SECTION "FadeMusic", ROMX[$43ce], BANK[$3a]
+PlayDanger: ; 3a:4307
+ ld a, [wLowHealthAlarm]
+ bit DANGER_ON_F, a
+ ret z
+
+ ; Don't do anything if SFX is being played
+ and $ff ^ (1 << DANGER_ON_F)
+ ld d, a
+ call IsAnySFXOn
+ jr c, .increment
+
+ ; Play the high tone
+ and a
+ jr z, .begin
+
+ ; Play the low tone
+ cp 16
+ jr z, .halfway
+
+ jr .increment
+
+.halfway
+ ld hl, DangerSoundLow
+ jr .applychannel
+
+.begin
+ ld hl, DangerSoundHigh
+
+.applychannel
+ xor a
+ ld [rNR10], a
+ ld a, [hli]
+ ld [rNR11], a
+ ld a, [hli]
+ ld [rNR12], a
+ ld a, [hli]
+ ld [rNR13], a
+ ld a, [hli]
+ ld [rNR14], a
+
+.increment
+ ld a, d
+ inc a
+ cp 30 ; Ending frame
+ jr c, .noreset
+ xor a
+.noreset
+ ; Make sure the danger sound is kept on
+ or 1 << DANGER_ON_F
+ ld [wLowHealthAlarm], a
+
+ ; Make sure channel 1 is on
+ ld a, [wSoundOutput]
+ or $11
+ ld [wSoundOutput], a
+ ret
+
+DangerSoundHigh: ; 3a:434a
+ db $80 ; duty 50%
+ db $e2 ; volume 14, envelope decrease sweep 2
+ db $50 ; frequency: $750
+ db $87 ; restart sound
+
+DangerSoundLow: ; 3a:434e
+ db $80 ; duty 50%
+ db $e2 ; volume 14, envelope decrease sweep 2
+ db $ee ; frequency: $6ee
+ db $86 ; restart sound
+
+IncrementTempo: ; 3a:4352
+ call IsAnyChannelOn
+ ret c
+
+ ld a, [wIncrementTempo]
+ ld e, a
+ ld a, [wIncrementTempo + 1]
+ ld d, a
+ or e
+ ret z
+
+ ld hl, wChannel1Tempo
+ call .addtempo
+ ld hl, wChannel2Tempo
+ call .addtempo
+ ld hl, wChannel3Tempo
+ call .addtempo
+ ld hl, wChannel4Tempo
+ call .addtempo
+ xor a
+ ld [wIncrementTempo], a
+ ld [wIncrementTempo + 1], a
+ ret
+
+.addtempo
+ ; (int16)[hl] += de
+ push de
+ 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 de
+ ret
+
+IsAnyChannelOn: ; 3a:438e
+; Check if any music channel is on and isn't on the last frame
+
+ ld hl, wChannel1Flags1
+ bit SOUND_CHANNEL_ON, [hl]
+ jr z, .check_channel2
+
+ ld hl, wChannel1NoteDuration
+ ld a, [hl]
+ cp 1
+ jr nz, .on
+
+.check_channel2
+ ld hl, wChannel2Flags1
+ bit SOUND_CHANNEL_ON, [hl]
+ jr z, .check_channel3
+
+ ld hl, wChannel2NoteDuration
+ ld a, [hl]
+ cp 1
+ jr nz, .on
+
+.check_channel3
+ ld hl, wChannel3Flags1
+ bit SOUND_CHANNEL_ON, [hl]
+ jr z, .check_channel4
+
+ ld hl, wChannel3NoteDuration
+ ld a, [hl]
+ cp 1
+ jr nz, .on
+
+.check_channel4
+ ld hl, wChannel4Flags1
+ bit SOUND_CHANNEL_ON, [hl]
+ jr z, .off
+
+ ld hl, wChannel4NoteDuration
+ ld a, [hl]
+ cp 1
+ jr nz, .on
+
+.off
+ and a
+ ret
+
+.on
+ scf
+ ret
+
FadeMusic: ; 3a:43ce
; Fade music if applicable
; usage:
diff --git a/constants/audio_constants.asm b/constants/audio_constants.asm
index 0f197f3..e6d56ac 100644
--- a/constants/audio_constants.asm
+++ b/constants/audio_constants.asm
@@ -94,5 +94,9 @@ VOLUME_SO1_LEVEL EQU %00000111
VOLUME_SO2_LEVEL EQU %01110000
MAX_VOLUME EQU $77
+; wLowHealthAlarm
+DANGER_PITCH_F EQU 4
+DANGER_ON_F EQU 7
+
; wMusicFade
MUSIC_FADE_IN_F EQU 7
diff --git a/shim.sym b/shim.sym
index f05010d..a5a820f 100644
--- a/shim.sym
+++ b/shim.sym
@@ -150,8 +150,6 @@
33:4000 Function_cc000
33:4000 Function_cc000_2
33:4001 Function_cc001
-3A:4307 Function_e8307
-3A:4352 Function_e8352
3A:441D Function_e841d
3A:45D8 Function_e85d8
3A:47F9 Function_e87f9
diff --git a/wram.asm b/wram.asm
index 5d09b77..5ae4140 100644
--- a/wram.asm
+++ b/wram.asm
@@ -28,14 +28,24 @@ wc195:: db ; c195
wCurChannel:: db ; c198
wVolume:: db ; c199
-wSoundOutput:: db ; c19a
+wSoundOutput:: ; c19a
+; corresponds to $ff25
+; bit 4-7: ch1-4 so2 on/off
+; bit 0-3: ch1-4 so1 on/off
+ db
ds 1 ; TODO
wMusicID:: dw ; c19c
wMusicBank:: db ; c19e
- ds 6 ; TODO
+ ds 5 ; TODO
+
+wLowHealthAlarm:: ; c1a4
+; bit 7: on/off
+; bit 4: pitch
+; bit 0-3: counter
+ db
wMusicFade:: ; c1a5
; fades volume over x frames
@@ -46,8 +56,9 @@ wMusicFade:: ; c1a5
wMusicFadeCount:: db ; c1a6
wMusicFadeID:: dw ; c1a7
- ds 4 ; TODO
+ ds 2 ; TODO
+wIncrementTempo: dw ; c1ab
wMapMusic:: db ; c1ad
wCryPitch:: dw ; c1ae
wCryLength:: dw ; c1b0