diff options
Diffstat (limited to 'audio/engine_4.asm')
-rw-r--r-- | audio/engine_4.asm | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/audio/engine_4.asm b/audio/engine_4.asm new file mode 100644 index 00000000..f152ff80 --- /dev/null +++ b/audio/engine_4.asm @@ -0,0 +1,193 @@ +Audio4_PlaySound:: +; Duplicate of Audio3_PlaySound + ld [wSoundID], a + ld a, [wSoundID] + cp $ff + jp z, Audio4_7d18e + cp $98 + jp z, Audio4_7d12d + jp c, Audio4_7d12d + cp $a3 + jr z, .asm_7d127 + jp nc, Audio4_7d12d + +.asm_7d127 + call InitMusicVariables + jp Audio4_7d192 + +Audio4_7d12d: + ld l, a + ld e, a + ld h, $0 + ld d, h + add hl, hl + add hl, de + ld de, SFX_Headers_4 + add hl, de + ld a, h + ld [wSfxHeaderPointer], a + ld a, l + ld [wSfxHeaderPointer + 1], a + ld a, [hl] + and $c0 + rlca + rlca + ld c, a +.asm_7d146 + ld d, c + ld a, c + add a + add c + ld c, a + ld b, $0 + ld a, [wSfxHeaderPointer] + ld h, a + ld a, [wSfxHeaderPointer + 1] + ld l, a + add hl, bc + ld c, d + ld a, [hl] + and $f + ld e, a + ld d, $0 + ld hl, wChannelSoundIDs + add hl, de + ld a, [hl] + and a + jr z, .asm_7d182 + ld a, e + cp $7 + jr nz, .asm_7d179 + ld a, [wSoundID] + cp $14 + jr nc, .asm_7d172 + ret + +.asm_7d172 + ld a, [hl] + cp $14 + jr z, .asm_7d182 + jr c, .asm_7d182 +.asm_7d179 + ld a, [wSoundID] + cp [hl] + jr z, .asm_7d182 + jr c, .asm_7d182 + ret + +.asm_7d182 + call InitSFXVariables + ld a, c + and a + jp z, Audio4_7d192 + dec c + jp .asm_7d146 + +Audio4_7d18e: + call StopAllAudio + ret + +Audio4_7d192: + ld a, [wSoundID] + ld l, a + ld e, a + ld h, $0 + ld d, h + add hl, hl + add hl, de + ld de, SFX_Headers_4 + add hl, de + ld e, l + ld d, h + ld hl, wChannelCommandPointers + ld a, [de] ; get channel number + ld b, a + rlca + rlca + and $3 + ld c, a + ld a, b + and $f + ld b, c + inc b + inc de + ld c, $0 +.asm_7d1b4 + cp c + jr z, .asm_7d1bc + inc c + inc hl + inc hl + jr .asm_7d1b4 +.asm_7d1bc + push af + push hl + push bc + ld b, $0 + ld c, a + cp $3 + jr c, .asm_7d1cc + ld hl, wChannelFlags1 + add hl, bc + set 2, [hl] +.asm_7d1cc + pop bc + pop hl + ld a, [de] ; get channel pointer + ld [hli], a + inc de + ld a, [de] + ld [hli], a + inc de + pop af + push hl + push bc + ld b, $0 + ld c, a + ld hl, wChannelSoundIDs + add hl, bc + ld a, [wSoundID] + ld [hl], a + pop bc + pop hl + inc c + dec b + ld a, b + and a + ld a, [de] + inc de + jr nz, .asm_7d1b4 + ld a, [wSoundID] + cp $14 + jr nc, .asm_7d1f5 + jr .asm_7d21f + +.asm_7d1f5 + ld a, [wSoundID] + cp $86 + jr z, .asm_7d21f + jr c, .asm_7d200 + jr .asm_7d21f +.asm_7d200 + ld hl, wChannelSoundIDs + CH4 + ld [hli], a + ld [hli], a + ld [hli], a + ld [hl], a + ld hl, wChannelCommandPointers + CH6 * 2 ; sfx noise channel pointer + ld de, Noise4_endchannel + ld [hl], e + inc hl + ld [hl], d ; overwrite pointer to point to endchannel + ld a, [wSavedVolume] + and a + jr nz, .asm_7d21f + ld a, [rNR50] + ld [wSavedVolume], a + ld a, $77 + ld [rNR50], a +.asm_7d21f + ret + +Noise4_endchannel: + endchannel |