From 2af37adc822af7a006c12fa55ae68b018a036313 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Tue, 25 Oct 2022 15:47:27 -0400 Subject: [PATCH] Implement ADSR release phase. --- applecorn.po | Bin 819200 -> 819200 bytes mainmem.audio.s | 40 +++++++++++++++++++++++++++++++--------- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/applecorn.po b/applecorn.po index c093ca853098dbaa847e7115e9b62b6f3beb4204..35a2089cdd88bf5d4e06b3675199c4651f48143b 100644 GIT binary patch delta 605 zcmYk2O=uHQ6on`AlTKcg1~g^5dz(NCt%R()81V;$xOZc~=bahFf^=&jwDf^s3Z*rI zI6{dX5-Ay>kl8f2C}brhCDMV>|CrN7;2hMly<-E(|Jk5E!_Dqf? z?+Fj5lA{9uCD6dU%*lnE972gG2^Fw{3Zq6)Dk@UX$>eEK95d_Px8&|EZ4=rrTxEF^ z%FglA#H``Sp1yB0fAYj;;E0}1F;fPa z*3YCMvu}1tVnMaE`Bhe0#hM*+SO;5c%)i#LZF#5Bp>P?vMuyqZa-HEz9^5<&Ta^`^?J{@`nOz#f~Afm&Io?)z8T% z!7-wRJ2OaD)ujWxDG2pf7M Z^%pWUV%7Z}awx9p_T8eQ9E;hY!AQ-pB9F4Cg7%Q;i3z zq1}*f&z_%__*aPx&0=0H<<$^MMk%Oa)=(3uNmLjWY35ZuSC)UUX78DP{c2(xc8jjI zybV>QRieJuD^Wi0{;4ccA-NLC*-m;-zjGyLcZ?@kS)$1(X+wE}41hdh9pliPCvWfa zFIw*@^<@*tJ4gf8>ZI%R_Vn4AF0@vuAK3}{XLn@(5{Qsz5#}WJ^;n!Sp?Oxq?eWkl4o3S^5l&VdLI^VB#`frxlk z9pA9U;Aow~O5a`%SX=T_$ym2WcjYuZHy3L3eZU%VKJ)+4G%L$o*$h~vhBx@&ocXBV zDt@=|Pe@h8U#Y$nVRD>#Rl)qCL_5Y$$Q)#GO{V@vyFc9g*~ZQsrh9dlj8Y-%UK=@N z@e?ObTzlLb%)vqSG^cPG<0;Sp=l@uR0hkZ__A8J!t#Ps4 diff --git a/mainmem.audio.s b/mainmem.audio.s index 9107874..c8e7b0d 100644 --- a/mainmem.audio.s +++ b/mainmem.audio.s @@ -354,13 +354,10 @@ ENSQISR INC COUNTER+0 ; Increment centisecond timer BEQ :NONOTE ; No note playing DEC CHANTIMES,X BRA :NEXT -:NONOTE LDA #$FF ; $FF means 'no envelope' - STA CHANENV,X - LDY #$00 ; Zero volume - LDA #$00 ; Zero freq - JSR ENSQNOTE ; Silence channel Y - JSR PEEKAUDIO ; Inspect byte at head of queue +:NONOTE JSR NONOTE ; Handle end note / release phase + +:PEEK JSR PEEKAUDIO ; Inspect byte at head of queue BCS :NEXT ; Nothing in queue ; NOTE: A contains HS byte of &HSFC AND #$0F ; Mask out hold nybble @@ -439,6 +436,20 @@ ENSQISR INC COUNTER+0 ; Increment centisecond timer :CNT DB $05 ; Used to determine 20Hz cycles +* Helper function for ENSQISR - called when no note playing +* On entry: X is audio channel # +NONOTE LDA CHANENV,X ; See if envelope is in effect + CMP #$FF + BNE :RELEASE ; Has envelope, start release phase + LDY #$00 ; Zero volume + LDA #$00 ; Zero freq + JSR ENSQNOTE ; Silence channel Y + RTS +:RELEASE LDA #3 ; Phase 3 is release phase + STA AMPSECT,X ; Force release phase + RTS + + * Handle envelope tick counter * On entry: X is audio channel # * On return: CS if this cycle is an envelope tick, CC otherwise. @@ -562,8 +573,9 @@ ADSRENV LDA CHANENV,X ; Get envelope number BEQ :DECAY ; Decay, encoded as 1 CMP #$02 BEQ :SUSTAIN ; Sustain, encoded as 2 -* TODO: RELEASE logic here - RTS + CMP #$03 + BEQ :RELEASE ; Release, encoded as 3 + RTS ; Otherwise nothing to do :ATTACK LDY #ENVAA ; Parm: attack change/step LDA (A1L),Y ; Get value of parm PHA @@ -588,8 +600,18 @@ ADSRENV LDA CHANENV,X ; Get envelope number LDA #$00 ; Target level zero JSR ADSRPHASE ; Generic ADSR phase handler RTS +:RELEASE LDY #ENVAR ; Parm: attack change/step + LDA (A1L),Y ; Get value of parm + TAY + LDA #$00 ; Target level zero + JSR ADSRPHASE ; Generic ADSR phase handler + BCS :FINISH ; Level is zero + RTS :NEXTSECT INC AMPSECT,X ; Next section RTS +:FINISH LDA #$FF ; Finished with envelope + STA CHANENV,X + RTS * Handle any individual phase of the ADSR envelope. Called by ADSRENV. @@ -598,7 +620,7 @@ ADSRENV LDA CHANENV,X ; Get envelope number ADSRPHASE STX OSCNUM STA :TARGET ; Stash target level for later CPY #$00 ; Check sign of change/step - BEQ :DONE ; If change/step is zero + BEQ :DONE ; Change/step is zero BMI :DESCEND ; Descending amplitude :ASCEND CMP CURRAMP,X ; Compare tgt with current level BNE :S1 ; Not equal to target, keep going