From 4e7d566791efd7ffbd0771b06414c72053ef5932 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 2 Aug 2024 02:47:55 -0500 Subject: [PATCH] FDS: implement auto-mod I don't like it. improvements welcome. --- src/engine/platform/fds.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/engine/platform/fds.cpp b/src/engine/platform/fds.cpp index 8cc729038..1e42738af 100644 --- a/src/engine/platform/fds.cpp +++ b/src/engine/platform/fds.cpp @@ -200,6 +200,15 @@ void DivPlatformFDS::tick(bool sysTick) { } rWrite(0x4082,chan[i].freq&0xff); rWrite(0x4083,(chan[i].freq>>8)&15); + + if (chan[i].autoModNum>0 && chan[i].autoModDen>0) { + chan[i].modFreq=(chan[i].freq*chan[i].autoModNum)/chan[i].autoModDen; + if (chan[i].modFreq>4095) chan[i].modFreq=4095; + if (chan[i].modFreq<0) chan[i].modFreq=0; + rWrite(0x4086,chan[i].modFreq&0xff); + rWrite(0x4087,chan[i].modFreq>>8); + } + if (chan[i].keyOn) chan[i].keyOn=false; if (chan[i].keyOff) chan[i].keyOff=false; chan[i].freqChanged=false; @@ -346,7 +355,8 @@ int DivPlatformFDS::dispatch(DivCommand c) { chan[c.chan].autoModNum=c.value>>4; chan[c.chan].autoModDen=c.value&15; chan[c.chan].freqChanged=true; - chan[c.chan].modOn=(chan[c.chan].autoModNum || chan[c.chan].autoModDen); + chan[c.chan].modOn=(chan[c.chan].autoModNum && chan[c.chan].autoModDen); + rWrite(0x4084,(chan[c.chan].modOn<<7)|0x40|chan[c.chan].modDepth); break; case DIV_CMD_NOTE_PORTA: { int destFreq=NOTE_FREQUENCY(c.value2);