From 6d33fadbc57f0285189e6f094d7d4cf5f665ca59 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 9 Mar 2023 20:00:15 -0500 Subject: [PATCH] finish this later --- src/engine/platform/amiga.cpp | 49 ++++++++++++++++++++++++++++++++++- src/engine/platform/amiga.h | 31 +++++++++++++++++++++- 2 files changed, 78 insertions(+), 2 deletions(-) diff --git a/src/engine/platform/amiga.cpp b/src/engine/platform/amiga.cpp index b86beb19..bb0eb1c6 100644 --- a/src/engine/platform/amiga.cpp +++ b/src/engine/platform/amiga.cpp @@ -84,6 +84,52 @@ void DivPlatformAmiga::acquire(short** buf, size_t len) { outR=0; // NEW CODE + for (int i=0; i<4; i++) { + amiga.volPos=(amiga.volPos+1)&AMIGA_VPMASK; + + // run DMA + if (amiga.audEn[i]) { + amiga.audTick[i]-=AMIGA_DIVIDER; + if (amiga.audTick[i]<0) { + if (amiga.audByte[i]) { + // read next samples + amiga.audDat[0][i]=sampleMem[((amiga.dmaLoc[i]+amiga.dmaPos[i])<<1)&chipMask]; + amiga.audDat[1][i]=sampleMem[(1+((amiga.dmaLoc[i]+amiga.dmaPos[i])<<1))&chipMask]; + + // check for length + if (amiga.dmaPos[i]>amiga.dmaLen[i]) { + if (amiga.audInt[i]) irq(i); + amiga.dmaLoc[i]=amiga.audLoc[i]; + amiga.dmaPos[i]=0; + amiga.dmaLen[i]=amiga.audLen[i]; + } + } + + amiga.audByte[i]=!amiga.audByte[i]; + } + } + + // output + if (!isMuted[i]) { + if (amiga.audVol[i]>=64) { + output=amiga.audDat[amiga.audByte[i]][i]<<6; + } else if (amiga.audVol[i]<=0) { + output=0; + } else { + output=amiga.audDat[amiga.audByte[i]][i]*volTable[amiga.audVol[i]][amiga.volPos]; + } + if (i==0 || i==3) { + outL+=(output*sep1)>>7; + outR+=(output*sep2)>>7; + } else { + outL+=(output*sep2)>>7; + outR+=(output*sep1)>>7; + } + oscBuf[i]->data[oscBuf[i]->needle++]=output<<2; + } else { + oscBuf[i]->data[oscBuf[i]->needle++]=0; + } + } // OLD CODE for (int i=0; i<4; i++) { @@ -498,7 +544,8 @@ void DivPlatformAmiga::renderSamples(int sysID) { memset(sampleOff,0,256*sizeof(unsigned int)); memset(sampleLoaded,0,256*sizeof(bool)); - size_t memPos=0; + // first 1024 bytes reserved for wavetable + size_t memPos=1024; for (int i=0; isong.sampleLen; i++) { DivSample* s=parent->song.sample[i]; if (!s->renderOn[0][sysID]) { diff --git a/src/engine/platform/amiga.h b/src/engine/platform/amiga.h index f1da65d3..b2311405 100644 --- a/src/engine/platform/amiga.h +++ b/src/engine/platform/amiga.h @@ -67,10 +67,37 @@ class DivPlatformAmiga: public DivDispatch { bool amigaModel; bool filterOn; + struct Amiga { + // register state + bool audInt[4]; // interrupt on + bool audEn[4]; // audio DMA on + bool useP[4]; // period modulation + bool useV[4]; // volume modulatiom + + unsigned int audLoc[4]; // address + unsigned short audLen[4]; // length + unsigned short audPer[4]; // period + unsigned char audVol[4]; // volume + signed char audDat[2][4]; // data + + + // internal state + int audTick[4]; // tick of period + unsigned int dmaLoc[4]; // address + unsigned short dmaPos[4]; // position + + bool audByte[4]; // which byte of audDat to output + unsigned char volPos; // position of volume PWM + + Amiga() { + memset(this,0,sizeof(*this)); + } + } amiga; + int filter[2][4]; int filtConst; int filtConstOff, filtConstOn; - int chipMem; + int chipMem, chipMask; unsigned char volTable[64][64]; @@ -85,6 +112,8 @@ class DivPlatformAmiga: public DivDispatch { friend void putDispatchChip(void*,int); friend void putDispatchChan(void*,int,int); + void irq(int ch); + public: void acquire(short** buf, size_t len); int dispatch(DivCommand c);