diff options
Diffstat (limited to 'audio/low_health_alarm.asm')
-rw-r--r-- | audio/low_health_alarm.asm | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/audio/low_health_alarm.asm b/audio/low_health_alarm.asm new file mode 100644 index 00000000..514db55f --- /dev/null +++ b/audio/low_health_alarm.asm @@ -0,0 +1,75 @@ +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 + +;bytes to write to sound channel 1 registers for health alarm. +;starting at FF11 (FF10 is always zeroed), so these bytes are: +;length, envelope, freq lo, freq hi +.toneDataHi + db $A0,$E2,$50,$87 + +.toneDataLo + db $B0,$E2,$EE,$86 + +;written to stop the alarm +.toneDataSilence + db $00,$00,$00,$80 |