From d30f9bc8a02f80d337ba6239b7d1a38d8152c96b Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 11 Aug 2022 01:24:53 -0500 Subject: [PATCH] Game Boy: software envelopes, part 3 zombie mode --- src/engine/platform/gb.cpp | 29 +++++++++++++++++++++++++---- src/engine/platform/gb.h | 6 ++++-- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/engine/platform/gb.cpp b/src/engine/platform/gb.cpp index 39ccaf56..2fad226a 100644 --- a/src/engine/platform/gb.cpp +++ b/src/engine/platform/gb.cpp @@ -171,12 +171,13 @@ void DivPlatformGB::tick(bool sysTick) { chan[i].outVol=VOL_SCALE_LINEAR(chan[i].vol&15,MIN(15,chan[i].std.vol.val),15); if (chan[i].outVol<0) chan[i].outVol=0; - // temporary until zombie mode is implemented chan[i].envLen=0; - chan[i].envDir=0; + chan[i].envDir=1; chan[i].envVol=chan[i].outVol; chan[i].soundLen=64; - chan[i].keyOn=true; + + if (!chan[i].keyOn) chan[i].killIt=true; + chan[i].freqChanged=true; } } if (chan[i].std.arp.had) { @@ -327,6 +328,7 @@ void DivPlatformGB::tick(bool sysTick) { } else { rWrite(16+i*5+1,((chan[i].duty&3)<<6)|(63-(chan[i].soundLen&63))); rWrite(16+i*5+2,((chan[i].envVol<<4))|(chan[i].envLen&7)|((chan[i].envDir&1)<<3)); + chan[i].lastKill=chan[i].envVol; } } if (chan[i].keyOff) { @@ -346,6 +348,25 @@ void DivPlatformGB::tick(bool sysTick) { if (chan[i].keyOn) chan[i].keyOn=false; if (chan[i].keyOff) chan[i].keyOff=false; chan[i].freqChanged=false; + + if (chan[i].killIt) { + if (i!=2) { + //rWrite(16+i*5+2,8); + int killDelta=chan[i].lastKill-chan[i].outVol+1; + if (killDelta<0) killDelta+=16; + chan[i].lastKill=chan[i].outVol; + + if (killDelta!=1) { + rWrite(16+i*5+2,((chan[i].envVol<<4))|8); + for (int j=0; jgb.alwaysInit) { + if ((chan[c.chan].insChanged || ins->gb.alwaysInit) && !chan[c.chan].softEnv) { chan[c.chan].envVol=ins->gb.envVol; chan[c.chan].envLen=ins->gb.envLen; chan[c.chan].envDir=ins->gb.envDir; diff --git a/src/engine/platform/gb.h b/src/engine/platform/gb.h index ce582979..9498317b 100644 --- a/src/engine/platform/gb.h +++ b/src/engine/platform/gb.h @@ -30,8 +30,8 @@ class DivPlatformGB: public DivDispatch { struct Channel { int freq, baseFreq, pitch, pitch2, note, ins; unsigned char duty, sweep; - bool active, insChanged, freqChanged, sweepChanged, keyOn, keyOff, inPorta, released, softEnv; - signed char vol, outVol, wave; + bool active, insChanged, freqChanged, sweepChanged, keyOn, keyOff, inPorta, released, softEnv, killIt; + signed char vol, outVol, wave, lastKill; unsigned char envVol, envDir, envLen, soundLen; unsigned short hwSeqPos; short hwSeqDelay; @@ -58,9 +58,11 @@ class DivPlatformGB: public DivDispatch { inPorta(false), released(false), softEnv(false), + killIt(false), vol(15), outVol(15), wave(-1), + lastKill(0), envVol(0), envDir(0), envLen(0),