ref: 4b4ad9894eb165de673346348493e02d83549746
dir: /audio/low_health_alarm.asm/
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