summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/sound/aicadsp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/sound/aicadsp.cpp')
-rw-r--r--src/devices/sound/aicadsp.cpp379
1 files changed, 180 insertions, 199 deletions
diff --git a/src/devices/sound/aicadsp.cpp b/src/devices/sound/aicadsp.cpp
index 30881df4fb9..4ff8f6fa7d2 100644
--- a/src/devices/sound/aicadsp.cpp
+++ b/src/devices/sound/aicadsp.cpp
@@ -4,15 +4,14 @@
#include "emu.h"
#include "aicadsp.h"
-static uint16_t PACK(int32_t val)
-{
- uint32_t temp;
- int sign,exponent,k;
+#include <algorithm>
- sign = (val >> 23) & 0x1;
- temp = (val ^ (val << 1)) & 0xFFFFFF;
- exponent = 0;
- for (k=0; k<12; k++)
+static u16 PACK(s32 val)
+{
+ const int sign = (val >> 23) & 0x1;
+ u32 temp = (val ^ (val << 1)) & 0xFFFFFF;
+ int exponent = 0;
+ for (int k = 0; k < 12; k++)
{
if (temp & 0x800000)
break;
@@ -28,18 +27,15 @@ static uint16_t PACK(int32_t val)
val |= sign << 15;
val |= exponent << 11;
- return (uint16_t)val;
+ return (u16)val;
}
-static int32_t UNPACK(uint16_t val)
+static s32 UNPACK(u16 val)
{
- int sign,exponent,mantissa;
- int32_t uval;
-
- sign = (val >> 15) & 0x1;
- exponent = (val >> 11) & 0xF;
- mantissa = val & 0x7FF;
- uval = mantissa << 11;
+ const int sign = (val >> 15) & 0x1;
+ int exponent = (val >> 11) & 0xF;
+ const int mantissa = val & 0x7FF;
+ u32 uval = mantissa << 11;
if (exponent > 11)
{
exponent = 11;
@@ -58,84 +54,75 @@ static int32_t UNPACK(uint16_t val)
void AICADSP::init()
{
memset(this,0,sizeof(*this));
- RBL=(8 * 1024); // Initial RBL is 0
- Stopped=1;
+ RBL = (8 * 1024); // Initial RBL is 0
+ Stopped = true;
}
void AICADSP::step()
{
- int32_t ACC=0; //26 bit
- int32_t SHIFTED=0; //24 bit
- int32_t X; //24 bit
- int32_t Y=0; //13 bit
- int32_t B; //26 bit
- int32_t INPUTS=0; //24 bit
- int32_t MEMVAL=0;
- int32_t FRC_REG=0; //13 bit
- int32_t Y_REG=0; //24 bit
- uint32_t ADDR;
- uint32_t ADRS_REG=0; //13 bit
- int step;
-
- if(Stopped)
+ s32 ACC=0; //26 bit
+ s32 MEMVAL=0;
+ s32 FRC_REG=0; //13 bit
+ s32 Y_REG=0; //24 bit
+ u32 ADRS_REG=0; //13 bit
+
+ if (Stopped)
return;
- memset(EFREG,0,2*16);
+ std::fill(std::begin(EFREG), std::end(EFREG), 0);
#if 0
int dump=0;
FILE *f=nullptr;
- if(dump)
+ if (dump)
f=fopen("dsp.txt","wt");
#endif
- for(step=0;step</*128*/LastStep;++step)
+ for (int step = 0; step < /*128*/LastStep; ++step)
{
- uint16_t *IPtr=MPRO+step*8;
+ u16 *IPtr=MPRO+step*8;
-// if(IPtr[0]==0 && IPtr[1]==0 && IPtr[2]==0 && IPtr[3]==0)
+// if (IPtr[0]==0 && IPtr[1]==0 && IPtr[2]==0 && IPtr[3]==0)
// break;
- uint32_t TRA=(IPtr[0]>>9)&0x7F;
- uint32_t TWT=(IPtr[0]>>8)&0x01;
- uint32_t TWA=(IPtr[0]>>1)&0x7F;
-
- uint32_t XSEL=(IPtr[2]>>15)&0x01;
- uint32_t YSEL=(IPtr[2]>>13)&0x03;
- uint32_t IRA=(IPtr[2]>>7)&0x3F;
- uint32_t IWT=(IPtr[2]>>6)&0x01;
- uint32_t IWA=(IPtr[2]>>1)&0x1F;
-
- uint32_t TABLE=(IPtr[4]>>15)&0x01;
- uint32_t MWT=(IPtr[4]>>14)&0x01;
- uint32_t MRD=(IPtr[4]>>13)&0x01;
- uint32_t EWT=(IPtr[4]>>12)&0x01;
- uint32_t EWA=(IPtr[4]>>8)&0x0F;
- uint32_t ADRL=(IPtr[4]>>7)&0x01;
- uint32_t FRCL=(IPtr[4]>>6)&0x01;
- uint32_t SHIFT=(IPtr[4]>>4)&0x03;
- uint32_t YRL=(IPtr[4]>>3)&0x01;
- uint32_t NEGB=(IPtr[4]>>2)&0x01;
- uint32_t ZERO=(IPtr[4]>>1)&0x01;
- uint32_t BSEL=(IPtr[4]>>0)&0x01;
-
- uint32_t NOFL=(IPtr[6]>>15)&1; //????
- uint32_t COEF=step;
-
- uint32_t MASA=(IPtr[6]>>9)&0x1f; //???
- uint32_t ADREB=(IPtr[6]>>8)&0x1;
- uint32_t NXADR=(IPtr[6]>>7)&0x1;
-
- int64_t v;
+ const u32 TRA = (IPtr[0] >> 9) & 0x7F;
+ const u32 TWT = (IPtr[0] >> 8) & 0x01;
+ const u32 TWA = (IPtr[0] >> 1) & 0x7F;
+
+ const u32 XSEL = (IPtr[2] >> 15) & 0x01;
+ const u32 YSEL = (IPtr[2] >> 13) & 0x03;
+ const u32 IRA = (IPtr[2] >> 7) & 0x3F;
+ const u32 IWT = (IPtr[2] >> 6) & 0x01;
+ const u32 IWA = (IPtr[2] >> 1) & 0x1F;
+
+ const u32 TABLE = (IPtr[4] >> 15) & 0x01;
+ const u32 MWT = (IPtr[4] >> 14) & 0x01;
+ const u32 MRD = (IPtr[4] >> 13) & 0x01;
+ const u32 EWT = (IPtr[4] >> 12) & 0x01;
+ const u32 EWA = (IPtr[4] >> 8) & 0x0F;
+ const u32 ADRL = (IPtr[4] >> 7) & 0x01;
+ const u32 FRCL = (IPtr[4] >> 6) & 0x01;
+ const u32 SHIFT = (IPtr[4] >> 4) & 0x03;
+ const u32 YRL = (IPtr[4] >> 3) & 0x01;
+ const u32 NEGB = (IPtr[4] >> 2) & 0x01;
+ const u32 ZERO = (IPtr[4] >> 1) & 0x01;
+ const u32 BSEL = (IPtr[4] >> 0) & 0x01;
+
+ const u32 NOFL = (IPtr[6] >> 15) & 1; //????
+ const u32 COEF = step;
+
+ const u32 MASA = (IPtr[6] >> 9) & 0x1f; //???
+ const u32 ADREB = (IPtr[6] >> 8) & 0x1;
+ const u32 NXADR = (IPtr[6] >> 7) & 0x1;
//operations are done at 24 bit precision
#if 0
- if(MASA)
+ if (MASA)
int a=1;
- if(NOFL)
+ if (NOFL)
int a=1;
// int dump=0;
- if(f)
+ if (f)
{
#define DUMP(v) fprintf(f," " #v ": %04X",v);
@@ -156,196 +143,190 @@ void AICADSP::step()
#endif
//INPUTS RW
assert(IRA<0x32);
- if(IRA<=0x1f)
- INPUTS=MEMS[IRA];
- else if(IRA<=0x2F)
- INPUTS=MIXS[IRA-0x20]<<4; //MIXS is 20 bit
- else if(IRA<=0x31)
- INPUTS=EXTS[IRA-0x30]<<8; //EXTS is 16 bit
-
- INPUTS<<=8;
- INPUTS>>=8;
- //if(INPUTS&0x00800000)
- // INPUTS|=0xFF000000;
-
- if(IWT)
+ s32 INPUTS=0; //24 bit
+ if (IRA <= 0x1f)
+ INPUTS = MEMS[IRA];
+ else if (IRA <= 0x2F)
+ INPUTS = MIXS[IRA - 0x20] << 4; //MIXS is 20 bit
+ else if (IRA <= 0x31)
+ INPUTS = EXTS[IRA - 0x30] << 8; //EXTS is 16 bit
+
+ INPUTS <<= 8;
+ INPUTS >>= 8;
+ //if (INPUTS & 0x00800000)
+ // INPUTS |= 0xFF000000;
+
+ if (IWT)
{
- MEMS[IWA]=MEMVAL; //MEMVAL was selected in previous MRD
- if(IRA==IWA)
- INPUTS=MEMVAL;
+ MEMS[IWA] = MEMVAL; //MEMVAL was selected in previous MRD
+ if (IRA == IWA)
+ INPUTS = MEMVAL;
}
//Operand sel
//B
- if(!ZERO)
+ s32 B; //26 bit
+ if (!ZERO)
{
- if(BSEL)
- B=ACC;
+ if (BSEL)
+ B = ACC;
else
{
- B=TEMP[(TRA+DEC)&0x7F];
- B<<=8;
- B>>=8;
- //if(B&0x00800000)
- // B|=0xFF000000; //Sign extend
+ B = TEMP[(TRA + DEC) & 0x7F];
+ B <<= 8;
+ B >>= 8;
+ //if (B & 0x00800000)
+ // B |= 0xFF000000; //Sign extend
}
- if(NEGB)
- B=0-B;
+ if (NEGB)
+ B = 0 - B;
}
else
- B=0;
+ B = 0;
//X
- if(XSEL)
- X=INPUTS;
+ s32 X; //24 bit
+ if (XSEL)
+ X = INPUTS;
else
{
- X=TEMP[(TRA+DEC)&0x7F];
- X<<=8;
- X>>=8;
- //if(X&0x00800000)
- // X|=0xFF000000;
+ X = TEMP[(TRA + DEC) & 0x7F];
+ X <<= 8;
+ X >>= 8;
+ //if (X & 0x00800000)
+ // X |= 0xFF000000;
}
//Y
- if(YSEL==0)
- Y=FRC_REG;
- else if(YSEL==1)
- Y=this->COEF[COEF<<1]>>3; //COEF is 16 bits
- else if(YSEL==2)
- Y=(Y_REG>>11)&0x1FFF;
- else if(YSEL==3)
- Y=(Y_REG>>4)&0x0FFF;
-
- if(YRL)
- Y_REG=INPUTS;
+ s32 Y = 0; //13 bit
+ if (YSEL == 0)
+ Y = FRC_REG;
+ else if (YSEL == 1)
+ Y = this->COEF[COEF << 1] >> 3; //COEF is 16 bits
+ else if (YSEL == 2)
+ Y = (Y_REG >> 11) & 0x1FFF;
+ else if (YSEL == 3)
+ Y = (Y_REG >> 4) & 0x0FFF;
+
+ if (YRL)
+ Y_REG = INPUTS;
//Shifter
- if(SHIFT==0)
- {
- SHIFTED=ACC;
- if(SHIFTED>0x007FFFFF)
- SHIFTED=0x007FFFFF;
- if(SHIFTED<(-0x00800000))
- SHIFTED=-0x00800000;
- }
- else if(SHIFT==1)
- {
- SHIFTED=ACC*2;
- if(SHIFTED>0x007FFFFF)
- SHIFTED=0x007FFFFF;
- if(SHIFTED<(-0x00800000))
- SHIFTED=-0x00800000;
- }
- else if(SHIFT==2)
+ s32 SHIFTED = 0; //24 bit
+ if (SHIFT == 0)
+ SHIFTED = std::max<s32>(std::min<s32>(ACC, 0x007FFFFF), -0x00800000);
+ else if (SHIFT == 1)
+ SHIFTED = std::max<s32>(std::min<s32>(ACC * 2, 0x007FFFFF), -0x00800000);
+ else if (SHIFT == 2)
{
- SHIFTED=ACC*2;
- SHIFTED<<=8;
- SHIFTED>>=8;
- //SHIFTED&=0x00FFFFFF;
- //if(SHIFTED&0x00800000)
- // SHIFTED|=0xFF000000;
+ SHIFTED = ACC * 2;
+ SHIFTED <<= 8;
+ SHIFTED >>= 8;
+ //SHIFTED &= 0x00FFFFFF;
+ //if (SHIFTED & 0x00800000)
+ // SHIFTED |= 0xFF000000;
}
- else if(SHIFT==3)
+ else if (SHIFT == 3)
{
- SHIFTED=ACC;
- SHIFTED<<=8;
- SHIFTED>>=8;
- //SHIFTED&=0x00FFFFFF;
- //if(SHIFTED&0x00800000)
- // SHIFTED|=0xFF000000;
+ SHIFTED = ACC;
+ SHIFTED <<= 8;
+ SHIFTED >>= 8;
+ //SHIFTED &= 0x00FFFFFF;
+ //if (SHIFTED & 0x00800000)
+ // SHIFTED |= 0xFF000000;
}
//ACCUM
- Y<<=19;
- Y>>=19;
- //if(Y&0x1000)
- // Y|=0xFFFFF000;
+ Y <<= 19;
+ Y >>= 19;
+ //if (Y & 0x1000)
+ // Y |= 0xFFFFF000;
- v=(((int64_t) X*(int64_t) Y)>>12);
- ACC=(int) v+B;
+ const s64 v = (((s64)X * (s64)Y) >> 12);
+ ACC = (int)v + B;
- if(TWT)
- TEMP[(TWA+DEC)&0x7F]=SHIFTED;
+ if (TWT)
+ TEMP[(TWA + DEC) & 0x7F] = SHIFTED;
- if(FRCL)
+ if (FRCL)
{
- if(SHIFT==3)
- FRC_REG=SHIFTED&0x0FFF;
+ if (SHIFT == 3)
+ FRC_REG = SHIFTED & 0x0FFF;
else
- FRC_REG=(SHIFTED>>11)&0x1FFF;
+ FRC_REG = (SHIFTED >> 11) & 0x1FFF;
}
- if(MRD || MWT)
- //if(0)
+ u32 ADDR;
+ if (MRD || MWT)
+ //if (0)
{
- ADDR=MADRS[MASA<<1];
- if(!TABLE)
- ADDR+=DEC;
- if(ADREB)
- ADDR+=ADRS_REG&0x0FFF;
- if(NXADR)
+ ADDR = MADRS[MASA << 1];
+ if (!TABLE)
+ ADDR += DEC;
+ if (ADREB)
+ ADDR += ADRS_REG & 0x0FFF;
+ if (NXADR)
ADDR++;
- if(!TABLE)
- ADDR&=RBL-1;
+ if (!TABLE)
+ ADDR &= RBL - 1;
else
- ADDR&=0xFFFF;
- //ADDR<<=1;
- //ADDR+=RBP<<13;
- //MEMVAL=AICARAM[ADDR>>1];
- ADDR+=RBP<<10;
- if(MRD && (step&1)) //memory only allowed on odd? DoA inserts NOPs on even
+ ADDR &= 0xFFFF;
+ //ADDR <<= 1;
+ //ADDR += RBP << 13;
+ //MEMVAL = space->read_word(ADDR >> 1);
+ ADDR += RBP << 10;
+ if (MRD && (step & 1)) //memory only allowed on odd? DoA inserts NOPs on even
{
- if(NOFL)
- MEMVAL=AICARAM[ADDR]<<8;
+ if (NOFL)
+ MEMVAL = cache->read_word(ADDR) << 8;
else
- MEMVAL=UNPACK(AICARAM[ADDR]);
+ MEMVAL = UNPACK(cache->read_word(ADDR));
}
- if(MWT && (step&1))
+ if (MWT && (step&1))
{
- if(NOFL)
- AICARAM[ADDR]=SHIFTED>>8;
+ if (NOFL)
+ space->write_word(ADDR, SHIFTED>>8);
else
- AICARAM[ADDR]=PACK(SHIFTED);
+ space->write_word(ADDR, PACK(SHIFTED));
}
}
- if(ADRL)
+ if (ADRL)
{
- if(SHIFT==3)
- ADRS_REG=(SHIFTED>>12)&0xFFF;
+ if (SHIFT == 3)
+ ADRS_REG = (SHIFTED >> 12) & 0xFFF;
else
- ADRS_REG=(INPUTS>>16);
+ ADRS_REG = (INPUTS >> 16);
}
- if(EWT)
- EFREG[EWA]+=SHIFTED>>8;
+ if (EWT)
+ EFREG[EWA] += SHIFTED >> 8;
}
--DEC;
- memset(MIXS,0,4*16);
-// if(f)
+ std::fill(std::begin(MIXS), std::end(MIXS), 0);
+// if (f)
// fclose(f);
}
-void AICADSP::setsample(int32_t sample,int SEL,int MXL)
+void AICADSP::setsample(s32 sample, u8 SEL, s32 MXL)
{
- //MIXS[SEL]+=sample<<(MXL+1)/*7*/;
- MIXS[SEL]+=sample;
-// if(MXL)
+ //MIXS[SEL] += sample << (MXL + 1)/*7*/;
+ MIXS[SEL] += sample;
+// if (MXL)
// int a=1;
}
void AICADSP::start()
{
int i;
- Stopped=0;
- for(i=127;i>=0;--i)
+ Stopped = false;
+ for (i = 127; i >= 0; --i)
{
- uint16_t *IPtr=MPRO+i*8;
+ u16 *IPtr = MPRO + i * 8;
- if(IPtr[0]!=0 || IPtr[2]!=0 || IPtr[4]!=0 || IPtr[6]!=0)
+ if (IPtr[0] != 0 || IPtr[2] != 0 || IPtr[4] != 0 || IPtr[6] != 0)
break;
}
- LastStep=i+1;
+ LastStep = i + 1;
}