diff options
Diffstat (limited to 'audio/low_health_alarm.asm')
-rw-r--r-- | audio/low_health_alarm.asm | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/audio/low_health_alarm.asm b/audio/low_health_alarm.asm new file mode 100644 index 00000000..a550cf70 --- /dev/null +++ b/audio/low_health_alarm.asm @@ -0,0 +1,80 @@ +Music_DoLowHealthAlarm:: + ld a, [wLowHealthAlarm] + cp $ff + jr z, .disableAlarm + + bit 7, a ;alarm enabled? + ret z ;nope + + and $7f ;low 7 bits are the timer. + jr nz, .asm_21383 ;if timer > 0, play low tone. + + call .playToneHi + ld a, 30 ;keep this tone for 30 frames. + jr .asm_21395 ;reset the timer. + +.asm_21383 + cp 20 + jr nz, .asm_2138a ;if timer == 20, + call .playToneLo ;actually set the sound registers. + +.asm_2138a + ld a, $86 + ld [wChannelSoundIDs + Ch5], a ;disable sound channel? + ld a, [wLowHealthAlarm] + and $7f ;decrement alarm timer. + dec a + +.asm_21395 + ; reset the timer and enable flag. + set 7, a + ld [wLowHealthAlarm], a + ret + +.disableAlarm + xor a + ld [wLowHealthAlarm], a ;disable alarm + ld [wChannelSoundIDs + Ch5], a ;re-enable sound channel? + ld de, .toneDataSilence + jr .playTone + +;update the sound registers to change the frequency. +;the tone set here stays until we change it. +.playToneHi + ld de, .toneDataHi + jr .playTone + +.playToneLo + ld de, .toneDataLo + +;update sound channel 1 to play the alarm, overriding all other sounds. +.playTone + ld hl, rNR10 ;channel 1 sound register + ld c, $5 + xor a + +.copyLoop + ld [hli], a + ld a, [de] + inc de + dec c + jr nz, .copyLoop + ret + +alarm_tone: MACRO + db \1 ; length + db \2 ; envelope + dw \3 ; frequency +ENDM + +;bytes to write to sound channel 1 registers for health alarm. +;starting at FF11 (FF10 is always zeroed). +.toneDataHi + alarm_tone $A0, $E2, $8750 + +.toneDataLo + alarm_tone $B0, $E2, $86EE + +;written to stop the alarm +.toneDataSilence + alarm_tone $00, $00, $8000 |