From 3aacf3d2cedfdeca49ceb57533389870bfc688a9 Mon Sep 17 00:00:00 2001 From: sik Date: Sun, 23 Jul 2017 03:20:35 -0300 Subject: Now with pausing and other niceties --- src-z80/core/sfx.z80 | 48 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 9 deletions(-) (limited to 'src-z80/core/sfx.z80') diff --git a/src-z80/core/sfx.z80 b/src-z80/core/sfx.z80 index 4bca4c7..8c5e7dd 100644 --- a/src-z80/core/sfx.z80 +++ b/src-z80/core/sfx.z80 @@ -25,9 +25,6 @@ PlaySFX: PollPCM - xor a ; Command parsed - ld (RAM_Command), a - ld hl, RAM_SFXData ; Set SFX as playing ld (hl), $01 inc l ; No delays! @@ -45,7 +42,7 @@ PlaySFX: ld (DoTick_SFX+1), hl PollPCM - jp IdleLoop ; End of subroutine + jp EndOfCommand ; End of subroutine ;**************************************************************************** ; ProcessSFX @@ -153,6 +150,14 @@ ProcessSFXRun: jp c, SetFMParamSFX cp $FA ; Events $F8-$F9: set FM register jp c, SetFMRegSFX + jp z, SetFlagsSFX ; Events $FA-$FB: set/clear flags + cp $FB + jp z, ClearFlagsSFX + + cp $FC + jp z, LoopSFX ; Event $FC: loop SFX + cp $FD + jp z, SetLoopSFX ; Event $FD: set loop point ;**************************************************************************** ; StopSFX* [command $03, event $FF] @@ -166,10 +171,8 @@ StopSFXEvent: jp DoTick_SFXSkip ; End of subroutine StopSFXCmd: - xor a ; Command parsed - ld (RAM_Command), a call StopSFX ; We're just a wrapper - jp IdleLoop ; End of subroutine + jp EndOfCommand ; End of subroutine StopSFX: PollPCM @@ -283,9 +286,36 @@ ClearSFX: .fmfree: dec e ; Go for next FM channel to unlock - dec b - jp nz, .unlockfm + djnz .unlockfm ;---------------------------------------------------------------------------- ret ; End of subroutine + +;**************************************************************************** +; LoopSFX [event $FC] +; Makes a SFX loop +;**************************************************************************** + +LoopSFX: + PollPCM + + ld hl, (RAM_SFXLoopPoint+1) ; Get looping address + ld a, (RAM_SFXLoopPoint) + ld c, a + + jp ProcessSFXRun ; End of subroutine + +;**************************************************************************** +; SetLoopSFX [event $FD] +; Sets the SFX loop point +;**************************************************************************** + +SetLoopSFX: + PollPCM + + ld a, c ; Store loop point address + ld (RAM_SFXLoopPoint), a + ld (RAM_SFXLoopPoint+1), hl + + jp ProcessSFXRun ; End of subroutine -- cgit v1.2.3