mirror of
https://github.com/holub/mame
synced 2025-04-21 07:52:35 +03:00
[NAOMI] Added and hooked up AICA (sound chip). Naomi boot sounds now play.
Since it's an SCSPx2 with ADPCM instead of FM it's already feature-complete except filter envelopes. A bug in the ARM7 core causes incorrect pan/level values to be computed in e.g. the Naomi SOUND TEST menu (I've also been seeing this in DSF playback). This is not a defect in the AICA. Please credit ElSemi, Deunan Knute, kingshriek, and myself.
This commit is contained in:
parent
b469de6db7
commit
8877f5321b
5
.gitattributes
vendored
5
.gitattributes
vendored
@ -700,6 +700,11 @@ src/emu/sound/5110intf.c svneol=native#text/plain
|
||||
src/emu/sound/5110intf.h svneol=native#text/plain
|
||||
src/emu/sound/5220intf.c svneol=native#text/plain
|
||||
src/emu/sound/5220intf.h svneol=native#text/plain
|
||||
src/emu/sound/aica.c svneol=native#text/plain
|
||||
src/emu/sound/aica.h svneol=native#text/plain
|
||||
src/emu/sound/aicadsp.c svneol=native#text/plain
|
||||
src/emu/sound/aicadsp.h svneol=native#text/plain
|
||||
src/emu/sound/aicalfo.c svneol=native#text/plain
|
||||
src/emu/sound/astrocde.c svneol=native#text/plain
|
||||
src/emu/sound/astrocde.h svneol=native#text/plain
|
||||
src/emu/sound/ay8910.c svneol=native#text/plain
|
||||
|
@ -170,6 +170,7 @@ void sid6581_get_info(void *token, UINT32 state, sndinfo *info);
|
||||
void sid8580_get_info(void *token, UINT32 state, sndinfo *info);
|
||||
void sp0256_get_info(void *token, UINT32 state, sndinfo *info);
|
||||
void s14001a_get_info(void *token, UINT32 state, sndinfo *info);
|
||||
void aica_get_info(void *token, UINT32 state, sndinfo *info);
|
||||
|
||||
void filter_volume_get_info(void *token, UINT32 state, sndinfo *info);
|
||||
void filter_rc_get_info(void *token, UINT32 state, sndinfo *info);
|
||||
@ -473,6 +474,9 @@ static const struct
|
||||
#if (HAS_SP0256)
|
||||
{ SOUND_SP0256, sp0256_get_info },
|
||||
#endif
|
||||
#if (HAS_AICA)
|
||||
{ SOUND_AICA, aica_get_info },
|
||||
#endif
|
||||
|
||||
{ SOUND_FILTER_VOLUME, filter_volume_get_info },
|
||||
{ SOUND_FILTER_RC, filter_rc_get_info },
|
||||
|
@ -134,6 +134,7 @@ enum _sound_type
|
||||
SOUND_SID8580,
|
||||
SOUND_SP0256,
|
||||
SOUND_S14001A,
|
||||
SOUND_AICA,
|
||||
|
||||
/* filters start here */
|
||||
SOUND_FILTER_VOLUME,
|
||||
|
1336
src/emu/sound/aica.c
Normal file
1336
src/emu/sound/aica.c
Normal file
File diff suppressed because it is too large
Load Diff
30
src/emu/sound/aica.h
Normal file
30
src/emu/sound/aica.h
Normal file
@ -0,0 +1,30 @@
|
||||
/*
|
||||
|
||||
Sega/Yamaha AICA emulation
|
||||
*/
|
||||
|
||||
#ifndef _AICA_H_
|
||||
#define _AICA_H_
|
||||
|
||||
#define MAX_AICA (2)
|
||||
|
||||
struct AICAinterface
|
||||
{
|
||||
int region; /* region of 2M/8M RAM */
|
||||
int roffset; /* offset in the region */
|
||||
void (*irq_callback)(int state); /* irq callback */
|
||||
};
|
||||
|
||||
void AICA_set_ram_base(int which, void *base, int size);
|
||||
|
||||
// AICA register access
|
||||
READ16_HANDLER( AICA_0_r );
|
||||
WRITE16_HANDLER( AICA_0_w );
|
||||
READ16_HANDLER( AICA_1_r );
|
||||
WRITE16_HANDLER( AICA_1_w );
|
||||
|
||||
// MIDI I/O access
|
||||
WRITE16_HANDLER( AICA_MidiIn );
|
||||
READ16_HANDLER( AICA_MidiOutR );
|
||||
|
||||
#endif
|
348
src/emu/sound/aicadsp.c
Normal file
348
src/emu/sound/aicadsp.c
Normal file
@ -0,0 +1,348 @@
|
||||
#include <math.h>
|
||||
#include "sndintrf.h"
|
||||
#include "cpuintrf.h"
|
||||
#include "aica.h"
|
||||
#include "aicadsp.h"
|
||||
|
||||
static UINT16 PACK(INT32 val)
|
||||
{
|
||||
UINT32 temp;
|
||||
int sign,exponent,k;
|
||||
|
||||
sign = (val >> 23) & 0x1;
|
||||
temp = (val ^ (val << 1)) & 0xFFFFFF;
|
||||
exponent = 0;
|
||||
for (k=0; k<12; k++)
|
||||
{
|
||||
if (temp & 0x800000)
|
||||
break;
|
||||
temp <<= 1;
|
||||
exponent += 1;
|
||||
}
|
||||
if (exponent < 12)
|
||||
val = (val << exponent) & 0x3FFFFF;
|
||||
else
|
||||
val <<= 11;
|
||||
val >>= 11;
|
||||
val |= sign << 15;
|
||||
val |= exponent << 11;
|
||||
|
||||
return (UINT16)val;
|
||||
}
|
||||
|
||||
static INT32 UNPACK(UINT16 val)
|
||||
{
|
||||
int sign,exponent,mantissa;
|
||||
INT32 uval;
|
||||
|
||||
sign = (val >> 15) & 0x1;
|
||||
exponent = (val >> 11) & 0xF;
|
||||
mantissa = val & 0x7FF;
|
||||
uval = mantissa << 11;
|
||||
if (exponent > 11)
|
||||
exponent = 11;
|
||||
else
|
||||
uval |= (sign ^ 1) << 22;
|
||||
uval |= sign << 23;
|
||||
uval <<= 8;
|
||||
uval >>= 8;
|
||||
uval >>= exponent;
|
||||
|
||||
return uval;
|
||||
}
|
||||
|
||||
void AICADSP_Init(struct _AICADSP *DSP)
|
||||
{
|
||||
memset(DSP,0,sizeof(struct _AICADSP));
|
||||
DSP->RBL=0x8000;
|
||||
DSP->Stopped=1;
|
||||
}
|
||||
|
||||
void AICADSP_Step(struct _AICADSP *DSP)
|
||||
{
|
||||
INT32 ACC=0; //26 bit
|
||||
INT32 SHIFTED=0; //24 bit
|
||||
INT32 X=0; //24 bit
|
||||
INT32 Y=0; //13 bit
|
||||
INT32 B=0; //26 bit
|
||||
INT32 INPUTS=0; //24 bit
|
||||
INT32 MEMVAL=0;
|
||||
INT32 FRC_REG=0; //13 bit
|
||||
INT32 Y_REG=0; //24 bit
|
||||
UINT32 ADDR=0;
|
||||
UINT32 ADRS_REG=0; //13 bit
|
||||
int step;
|
||||
|
||||
if(DSP->Stopped)
|
||||
return;
|
||||
|
||||
memset(DSP->EFREG,0,2*16);
|
||||
#if 0
|
||||
int dump=0;
|
||||
FILE *f=NULL;
|
||||
if(dump)
|
||||
f=fopen("dsp.txt","wt");
|
||||
#endif
|
||||
for(step=0;step</*128*/DSP->LastStep;++step)
|
||||
{
|
||||
UINT16 *IPtr=DSP->MPRO+step*8;
|
||||
|
||||
// if(IPtr[0]==0 && IPtr[1]==0 && IPtr[2]==0 && IPtr[3]==0)
|
||||
// break;
|
||||
|
||||
UINT32 TRA=(IPtr[0]>>9)&0x7F;
|
||||
UINT32 TWT=(IPtr[0]>>8)&0x01;
|
||||
UINT32 TWA=(IPtr[0]>>1)&0x7F;
|
||||
|
||||
UINT32 XSEL=(IPtr[2]>>15)&0x01;
|
||||
UINT32 YSEL=(IPtr[2]>>13)&0x03;
|
||||
UINT32 IRA=(IPtr[2]>>7)&0x3F;
|
||||
UINT32 IWT=(IPtr[2]>>6)&0x01;
|
||||
UINT32 IWA=(IPtr[2]>>1)&0x1F;
|
||||
|
||||
UINT32 TABLE=(IPtr[4]>>15)&0x01;
|
||||
UINT32 MWT=(IPtr[4]>>14)&0x01;
|
||||
UINT32 MRD=(IPtr[4]>>13)&0x01;
|
||||
UINT32 EWT=(IPtr[4]>>12)&0x01;
|
||||
UINT32 EWA=(IPtr[4]>>8)&0x0F;
|
||||
UINT32 ADRL=(IPtr[4]>>7)&0x01;
|
||||
UINT32 FRCL=(IPtr[4]>>6)&0x01;
|
||||
UINT32 SHIFT=(IPtr[4]>>4)&0x03;
|
||||
UINT32 YRL=(IPtr[4]>>3)&0x01;
|
||||
UINT32 NEGB=(IPtr[4]>>2)&0x01;
|
||||
UINT32 ZERO=(IPtr[4]>>1)&0x01;
|
||||
UINT32 BSEL=(IPtr[4]>>0)&0x01;
|
||||
|
||||
UINT32 NOFL=(IPtr[6]>>15)&1; //????
|
||||
UINT32 COEF=step;
|
||||
|
||||
UINT32 MASA=(IPtr[6]>>9)&0x1f; //???
|
||||
UINT32 ADREB=(IPtr[6]>>8)&0x1;
|
||||
UINT32 NXADR=(IPtr[6]>>7)&0x1;
|
||||
|
||||
INT64 v;
|
||||
|
||||
//operations are done at 24 bit precision
|
||||
#if 0
|
||||
if(MASA)
|
||||
int a=1;
|
||||
if(NOFL)
|
||||
int a=1;
|
||||
|
||||
// int dump=0;
|
||||
|
||||
if(f)
|
||||
{
|
||||
#define DUMP(v) fprintf(f," " #v ": %04X",v);
|
||||
|
||||
fprintf(f,"%d: ",step);
|
||||
DUMP(ACC);
|
||||
DUMP(SHIFTED);
|
||||
DUMP(X);
|
||||
DUMP(Y);
|
||||
DUMP(B);
|
||||
DUMP(INPUTS);
|
||||
DUMP(MEMVAL);
|
||||
DUMP(FRC_REG);
|
||||
DUMP(Y_REG);
|
||||
DUMP(ADDR);
|
||||
DUMP(ADRS_REG);
|
||||
fprintf(f,"\n");
|
||||
}
|
||||
#endif
|
||||
//INPUTS RW
|
||||
assert(IRA<0x32);
|
||||
if(IRA<=0x1f)
|
||||
INPUTS=DSP->MEMS[IRA];
|
||||
else if(IRA<=0x2F)
|
||||
INPUTS=DSP->MIXS[IRA-0x20]<<4; //MIXS is 20 bit
|
||||
else if(IRA<=0x31)
|
||||
INPUTS=0;
|
||||
|
||||
INPUTS<<=8;
|
||||
INPUTS>>=8;
|
||||
//if(INPUTS&0x00800000)
|
||||
// INPUTS|=0xFF000000;
|
||||
|
||||
if(IWT)
|
||||
{
|
||||
DSP->MEMS[IWA]=MEMVAL; //MEMVAL was selected in previous MRD
|
||||
if(IRA==IWA)
|
||||
INPUTS=MEMVAL;
|
||||
}
|
||||
|
||||
//Operand sel
|
||||
//B
|
||||
if(!ZERO)
|
||||
{
|
||||
if(BSEL)
|
||||
B=ACC;
|
||||
else
|
||||
{
|
||||
B=DSP->TEMP[(TRA+DSP->DEC)&0x7F];
|
||||
B<<=8;
|
||||
B>>=8;
|
||||
//if(B&0x00800000)
|
||||
// B|=0xFF000000; //Sign extend
|
||||
}
|
||||
if(NEGB)
|
||||
B=0-B;
|
||||
}
|
||||
else
|
||||
B=0;
|
||||
|
||||
//X
|
||||
if(XSEL)
|
||||
X=INPUTS;
|
||||
else
|
||||
{
|
||||
X=DSP->TEMP[(TRA+DSP->DEC)&0x7F];
|
||||
X<<=8;
|
||||
X>>=8;
|
||||
//if(X&0x00800000)
|
||||
// X|=0xFF000000;
|
||||
}
|
||||
|
||||
//Y
|
||||
if(YSEL==0)
|
||||
Y=FRC_REG;
|
||||
else if(YSEL==1)
|
||||
Y=DSP->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)
|
||||
{
|
||||
SHIFTED=ACC*2;
|
||||
SHIFTED<<=8;
|
||||
SHIFTED>>=8;
|
||||
//SHIFTED&=0x00FFFFFF;
|
||||
//if(SHIFTED&0x00800000)
|
||||
// SHIFTED|=0xFF000000;
|
||||
}
|
||||
else if(SHIFT==3)
|
||||
{
|
||||
SHIFTED=ACC;
|
||||
SHIFTED<<=8;
|
||||
SHIFTED>>=8;
|
||||
//SHIFTED&=0x00FFFFFF;
|
||||
//if(SHIFTED&0x00800000)
|
||||
// SHIFTED|=0xFF000000;
|
||||
}
|
||||
|
||||
//ACCUM
|
||||
Y<<=19;
|
||||
Y>>=19;
|
||||
//if(Y&0x1000)
|
||||
// Y|=0xFFFFF000;
|
||||
|
||||
v=(((INT64) X*(INT64) Y)>>12);
|
||||
ACC=(int) v+B;
|
||||
|
||||
if(TWT)
|
||||
DSP->TEMP[(TWA+DSP->DEC)&0x7F]=SHIFTED;
|
||||
|
||||
if(FRCL)
|
||||
{
|
||||
if(SHIFT==3)
|
||||
FRC_REG=SHIFTED&0x0FFF;
|
||||
else
|
||||
FRC_REG=(SHIFTED>>11)&0x1FFF;
|
||||
}
|
||||
|
||||
if(MRD || MWT)
|
||||
//if(0)
|
||||
{
|
||||
ADDR=DSP->MADRS[MASA<<1];
|
||||
if(!TABLE)
|
||||
ADDR+=DSP->DEC;
|
||||
if(ADREB)
|
||||
ADDR+=ADRS_REG&0x0FFF;
|
||||
if(NXADR)
|
||||
ADDR++;
|
||||
if(!TABLE)
|
||||
ADDR&=DSP->RBL-1;
|
||||
else
|
||||
ADDR&=0xFFFF;
|
||||
//ADDR<<=1;
|
||||
//ADDR+=DSP->RBP<<13;
|
||||
//MEMVAL=DSP->AICARAM[ADDR>>1];
|
||||
ADDR+=DSP->RBP<<10;
|
||||
if(MRD && (step&1)) //memory only allowed on odd? DoA inserts NOPs on even
|
||||
{
|
||||
if(NOFL)
|
||||
MEMVAL=DSP->AICARAM[ADDR]<<8;
|
||||
else
|
||||
MEMVAL=UNPACK(DSP->AICARAM[ADDR]);
|
||||
}
|
||||
if(MWT && (step&1))
|
||||
{
|
||||
if(NOFL)
|
||||
DSP->AICARAM[ADDR]=SHIFTED>>8;
|
||||
else
|
||||
DSP->AICARAM[ADDR]=PACK(SHIFTED);
|
||||
}
|
||||
}
|
||||
|
||||
if(ADRL)
|
||||
{
|
||||
if(SHIFT==3)
|
||||
ADRS_REG=(SHIFTED>>12)&0xFFF;
|
||||
else
|
||||
ADRS_REG=(INPUTS>>16);
|
||||
}
|
||||
|
||||
if(EWT)
|
||||
DSP->EFREG[EWA]+=SHIFTED>>8;
|
||||
|
||||
}
|
||||
--DSP->DEC;
|
||||
memset(DSP->MIXS,0,4*16);
|
||||
// if(f)
|
||||
// fclose(f);
|
||||
}
|
||||
|
||||
void AICADSP_SetSample(struct _AICADSP *DSP,INT32 sample,int SEL,int MXL)
|
||||
{
|
||||
//DSP->MIXS[SEL]+=sample<<(MXL+1)/*7*/;
|
||||
DSP->MIXS[SEL]+=sample;
|
||||
// if(MXL)
|
||||
// int a=1;
|
||||
}
|
||||
|
||||
void AICADSP_Start(struct _AICADSP *DSP)
|
||||
{
|
||||
int i;
|
||||
DSP->Stopped=0;
|
||||
for(i=127;i>=0;--i)
|
||||
{
|
||||
UINT16 *IPtr=DSP->MPRO+i*8;
|
||||
|
||||
if(IPtr[0]!=0 || IPtr[2]!=0 || IPtr[4]!=0 || IPtr[6]!=0)
|
||||
break;
|
||||
}
|
||||
DSP->LastStep=i+1;
|
||||
|
||||
}
|
37
src/emu/sound/aicadsp.h
Normal file
37
src/emu/sound/aicadsp.h
Normal file
@ -0,0 +1,37 @@
|
||||
#ifndef AICADSP_H
|
||||
#define AICADSP_H
|
||||
|
||||
//the DSP Context
|
||||
struct _AICADSP
|
||||
{
|
||||
//Config
|
||||
UINT16 *AICARAM;
|
||||
UINT32 AICARAM_LENGTH;
|
||||
UINT32 RBP; //Ring buf pointer
|
||||
UINT32 RBL; //Delay ram (Ring buffer) size in words
|
||||
|
||||
//context
|
||||
|
||||
INT16 COEF[128*2]; //16 bit signed
|
||||
UINT16 MADRS[64*2]; //offsets (in words), 16 bit
|
||||
UINT16 MPRO[128*4*2*2]; //128 steps 64 bit
|
||||
INT32 TEMP[128]; //TEMP regs,24 bit signed
|
||||
INT32 MEMS[32]; //MEMS regs,24 bit signed
|
||||
UINT32 DEC;
|
||||
|
||||
//input
|
||||
INT32 MIXS[16]; //MIXS, 24 bit signed
|
||||
INT16 EXTS[2]; //External inputs (CDDA) 16 bit signed
|
||||
|
||||
//output
|
||||
INT16 EFREG[16]; //EFREG, 16 bit signed
|
||||
|
||||
int Stopped;
|
||||
int LastStep;
|
||||
};
|
||||
|
||||
void AICADSP_Init(struct _AICADSP *DSP);
|
||||
void AICADSP_SetSample(struct _AICADSP *DSP, INT32 sample, INT32 SEL, INT32 MXL);
|
||||
void AICADSP_Step(struct _AICADSP *DSP);
|
||||
void AICADSP_Start(struct _AICADSP *DSP);
|
||||
#endif
|
159
src/emu/sound/aicalfo.c
Normal file
159
src/emu/sound/aicalfo.c
Normal file
@ -0,0 +1,159 @@
|
||||
/*
|
||||
AICA LFO handling
|
||||
|
||||
Part of the AICA emulator package.
|
||||
(not compiled directly, #included from aica.c)
|
||||
|
||||
By ElSemi, kingshriek, Deunan Knute, and R. Belmont
|
||||
*/
|
||||
|
||||
#define LFO_SHIFT 8
|
||||
|
||||
struct _LFO
|
||||
{
|
||||
unsigned short phase;
|
||||
UINT32 phase_step;
|
||||
int *table;
|
||||
int *scale;
|
||||
};
|
||||
|
||||
#define LFIX(v) ((unsigned int) ((float) (1<<LFO_SHIFT)*(v)))
|
||||
|
||||
//Convert DB to multiply amplitude
|
||||
#define DB(v) LFIX(pow(10.0,v/20.0))
|
||||
|
||||
//Convert cents to step increment
|
||||
#define CENTS(v) LFIX(pow(2.0,v/1200.0))
|
||||
|
||||
static int PLFO_TRI[256],PLFO_SQR[256],PLFO_SAW[256],PLFO_NOI[256];
|
||||
static int ALFO_TRI[256],ALFO_SQR[256],ALFO_SAW[256],ALFO_NOI[256];
|
||||
static float LFOFreq[32]={0.17,0.19,0.23,0.27,0.34,0.39,0.45,0.55,0.68,0.78,0.92,1.10,1.39,1.60,1.87,2.27,
|
||||
2.87,3.31,3.92,4.79,6.15,7.18,8.60,10.8,14.4,17.2,21.5,28.7,43.1,57.4,86.1,172.3};
|
||||
static float ASCALE[8]={0.0,0.4,0.8,1.5,3.0,6.0,12.0,24.0};
|
||||
static float PSCALE[8]={0.0,7.0,13.5,27.0,55.0,112.0,230.0,494};
|
||||
static int PSCALES[8][256];
|
||||
static int ASCALES[8][256];
|
||||
|
||||
void AICALFO_Init(void)
|
||||
{
|
||||
int i,s;
|
||||
for(i=0;i<256;++i)
|
||||
{
|
||||
int a,p;
|
||||
// float TL;
|
||||
//Saw
|
||||
a=255-i;
|
||||
if(i<128)
|
||||
p=i;
|
||||
else
|
||||
p=i-256;
|
||||
ALFO_SAW[i]=a;
|
||||
PLFO_SAW[i]=p;
|
||||
|
||||
//Square
|
||||
if(i<128)
|
||||
{
|
||||
a=255;
|
||||
p=127;
|
||||
}
|
||||
else
|
||||
{
|
||||
a=0;
|
||||
p=-128;
|
||||
}
|
||||
ALFO_SQR[i]=a;
|
||||
PLFO_SQR[i]=p;
|
||||
|
||||
//Tri
|
||||
if(i<128)
|
||||
a=255-(i*2);
|
||||
else
|
||||
a=(i*2)-256;
|
||||
if(i<64)
|
||||
p=i*2;
|
||||
else if(i<128)
|
||||
p=255-i*2;
|
||||
else if(i<192)
|
||||
p=256-i*2;
|
||||
else
|
||||
p=i*2-511;
|
||||
ALFO_TRI[i]=a;
|
||||
PLFO_TRI[i]=p;
|
||||
|
||||
//noise
|
||||
//a=lfo_noise[i];
|
||||
a=mame_rand(Machine)&0xff;
|
||||
p=128-a;
|
||||
ALFO_NOI[i]=a;
|
||||
PLFO_NOI[i]=p;
|
||||
}
|
||||
|
||||
for(s=0;s<8;++s)
|
||||
{
|
||||
float limit=PSCALE[s];
|
||||
for(i=-128;i<128;++i)
|
||||
{
|
||||
PSCALES[s][i+128]=CENTS(((limit*(float) i)/128.0));
|
||||
}
|
||||
limit=-ASCALE[s];
|
||||
for(i=0;i<256;++i)
|
||||
{
|
||||
ASCALES[s][i]=DB(((limit*(float) i)/256.0));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
signed int INLINE AICAPLFO_Step(struct _LFO *LFO)
|
||||
{
|
||||
int p;
|
||||
|
||||
LFO->phase+=LFO->phase_step;
|
||||
#if LFO_SHIFT!=8
|
||||
LFO->phase&=(1<<(LFO_SHIFT+8))-1;
|
||||
#endif
|
||||
p=LFO->table[LFO->phase>>LFO_SHIFT];
|
||||
p=LFO->scale[p+128];
|
||||
return p<<(SHIFT-LFO_SHIFT);
|
||||
}
|
||||
|
||||
signed int INLINE AICAALFO_Step(struct _LFO *LFO)
|
||||
{
|
||||
int p;
|
||||
LFO->phase+=LFO->phase_step;
|
||||
#if LFO_SHIFT!=8
|
||||
LFO->phase&=(1<<(LFO_SHIFT+8))-1;
|
||||
#endif
|
||||
p=LFO->table[LFO->phase>>LFO_SHIFT];
|
||||
p=LFO->scale[p];
|
||||
return p<<(SHIFT-LFO_SHIFT);
|
||||
}
|
||||
|
||||
void AICALFO_ComputeStep(struct _LFO *LFO,UINT32 LFOF,UINT32 LFOWS,UINT32 LFOS,int ALFO)
|
||||
{
|
||||
float step=(float) LFOFreq[LFOF]*256.0/(float)44100.0;
|
||||
LFO->phase_step=(unsigned int) ((float) (1<<LFO_SHIFT)*step);
|
||||
if(ALFO)
|
||||
{
|
||||
switch(LFOWS)
|
||||
{
|
||||
case 0: LFO->table=ALFO_SAW; break;
|
||||
case 1: LFO->table=ALFO_SQR; break;
|
||||
case 2: LFO->table=ALFO_TRI; break;
|
||||
case 3: LFO->table=ALFO_NOI; break;
|
||||
default: printf("Unknown ALFO %d\n", LFOWS);
|
||||
}
|
||||
LFO->scale=ASCALES[LFOS];
|
||||
}
|
||||
else
|
||||
{
|
||||
switch(LFOWS)
|
||||
{
|
||||
case 0: LFO->table=PLFO_SAW; break;
|
||||
case 1: LFO->table=PLFO_SQR; break;
|
||||
case 2: LFO->table=PLFO_TRI; break;
|
||||
case 3: LFO->table=PLFO_NOI; break;
|
||||
default: printf("Unknown PLFO %d\n", LFOWS);
|
||||
}
|
||||
LFO->scale=PSCALES[LFOS];
|
||||
}
|
||||
}
|
@ -434,6 +434,7 @@ endif
|
||||
SOUNDDEFS += -DHAS_SEGAPCM=$(if $(filter SEGAPCM,$(SOUNDS)),1,0)
|
||||
SOUNDDEFS += -DHAS_MULTIPCM=$(if $(filter MULTIPCM,$(SOUNDS)),1,0)
|
||||
SOUNDDEFS += -DHAS_SCSP=$(if $(filter SCSP,$(SOUNDS)),1,0)
|
||||
SOUNDDEFS += -DHAS_AICA=$(if $(filter AICA,$(SOUNDS)),1,0)
|
||||
|
||||
ifneq ($(filter SEGAPCM,$(SOUNDS)),)
|
||||
SOUNDOBJS += $(SOUNDOBJ)/segapcm.o
|
||||
@ -447,6 +448,9 @@ ifneq ($(filter SCSP,$(SOUNDS)),)
|
||||
SOUNDOBJS += $(SOUNDOBJ)/scsp.o $(SOUNDOBJ)/scspdsp.o
|
||||
endif
|
||||
|
||||
ifneq ($(filter AICA,$(SOUNDS)),)
|
||||
SOUNDOBJS += $(SOUNDOBJ)/aica.o $(SOUNDOBJ)/aicadsp.o
|
||||
endif
|
||||
|
||||
|
||||
#-------------------------------------------------
|
||||
|
@ -507,7 +507,9 @@ Virtua Striker 2 2000 840-0010C 21929C 15 315-6213 317-025
|
||||
#include "machine/x76f100.h"
|
||||
#include "cpu/sh4/sh4.h"
|
||||
#include "cpu/arm7/arm7core.h"
|
||||
#include "sound/aica.h"
|
||||
#include "dc.h"
|
||||
#include "deprecat.h"
|
||||
|
||||
#define CPU_CLOCK 200000000
|
||||
/* MD2 MD1 MD0 MD6 MD4 MD3 MD5 MD7 MD8 */
|
||||
@ -544,15 +546,6 @@ static WRITE64_HANDLER( naomi_unknown1_w )
|
||||
{
|
||||
}
|
||||
|
||||
static READ32_HANDLER( dc_aica_arm_r )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static WRITE32_HANDLER( dc_aica_arm_w )
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
Naomi ROM board info from ElSemi:
|
||||
|
||||
@ -721,9 +714,14 @@ static READ32_HANDLER( test1 )
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void aica_irq(int irq)
|
||||
{
|
||||
cpunum_set_input_line(Machine, 1, ARM7_FIRQ_LINE, irq ? ASSERT_LINE : CLEAR_LINE);
|
||||
}
|
||||
|
||||
static ADDRESS_MAP_START( dc_audio_map, ADDRESS_SPACE_PROGRAM, 32 )
|
||||
AM_RANGE(0x00000000, 0x007fffff) AM_RAM AM_BASE( &dc_sound_ram ) /* shared with SH-4 */
|
||||
AM_RANGE(0x00800000, 0x00807fff) AM_READWRITE( dc_aica_arm_r, dc_aica_arm_w ) /* shared with SH-4 */
|
||||
AM_RANGE(0x00800000, 0x00807fff) AM_READWRITE(dc_arm_aica_r, dc_arm_aica_w)
|
||||
AM_RANGE(0x00808000, 0x008080ff) AM_READ( test1 ) // for bug (?) in sound bios
|
||||
ADDRESS_MAP_END
|
||||
|
||||
@ -733,6 +731,19 @@ static INPUT_PORTS_START( naomi )
|
||||
PORT_SERVICE_NO_TOGGLE( 0x01, IP_ACTIVE_LOW )
|
||||
INPUT_PORTS_END
|
||||
|
||||
static const struct AICAinterface aica_interface =
|
||||
{
|
||||
REGION_CPU1, // dummy, is fixed up in the reset handler
|
||||
0,
|
||||
aica_irq
|
||||
};
|
||||
|
||||
static MACHINE_RESET( naomi )
|
||||
{
|
||||
MACHINE_RESET_CALL(dc);
|
||||
AICA_set_ram_base(0, dc_sound_ram, 8*1024*1024);
|
||||
}
|
||||
|
||||
static MACHINE_DRIVER_START( naomi )
|
||||
/* basic machine hardware */
|
||||
MDRV_CPU_ADD_TAG("main", SH4, CPU_CLOCK) // SH4!!!
|
||||
@ -744,7 +755,7 @@ static MACHINE_DRIVER_START( naomi )
|
||||
MDRV_CPU_ADD_TAG("sound", ARM7, ((XTAL_33_8688MHz*2)/3)/8) // AICA bus clock is 2/3rds * 33.8688. ARM7 gets 1 bus cycle out of each 8.
|
||||
MDRV_CPU_PROGRAM_MAP(dc_audio_map, 0)
|
||||
|
||||
MDRV_MACHINE_RESET( dc )
|
||||
MDRV_MACHINE_RESET( naomi )
|
||||
|
||||
MDRV_SCREEN_REFRESH_RATE(60)
|
||||
MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
|
||||
@ -760,6 +771,12 @@ static MACHINE_DRIVER_START( naomi )
|
||||
|
||||
MDRV_VIDEO_START(dc)
|
||||
MDRV_VIDEO_UPDATE(dc)
|
||||
|
||||
MDRV_SPEAKER_STANDARD_STEREO("left", "right")
|
||||
MDRV_SOUND_ADD(AICA, 0)
|
||||
MDRV_SOUND_CONFIG(aica_interface)
|
||||
MDRV_SOUND_ROUTE(0, "left", 2.0)
|
||||
MDRV_SOUND_ROUTE(0, "right", 2.0)
|
||||
MACHINE_DRIVER_END
|
||||
|
||||
#define ROM_LOAD16_WORD_SWAP_BIOS(bios,name,offset,length,hash) \
|
||||
|
@ -26,6 +26,9 @@ WRITE64_HANDLER( dc_rtc_w );
|
||||
READ64_HANDLER( dc_aica_reg_r );
|
||||
WRITE64_HANDLER( dc_aica_reg_w );
|
||||
|
||||
READ32_HANDLER( dc_arm_aica_r );
|
||||
WRITE32_HANDLER( dc_arm_aica_w );
|
||||
|
||||
MACHINE_RESET( dc );
|
||||
|
||||
void dc_vblank( void );
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include "debugger.h"
|
||||
#include "dc.h"
|
||||
#include "cpu/sh4/sh4.h"
|
||||
#include "sound/aica.h"
|
||||
|
||||
#define DEBUG_REGISTERS (1)
|
||||
|
||||
@ -144,7 +145,7 @@ INLINE int decode_reg_64(UINT32 offset, UINT64 mem_mask, UINT64 *shift)
|
||||
{
|
||||
mame_printf_verbose("Wrong mask! (PC=%x)\n", activecpu_get_pc());
|
||||
#ifdef ENABLE_DEBUGGER
|
||||
mame_debug_break();
|
||||
// mame_debug_break();
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -222,7 +223,7 @@ READ64_HANDLER( dc_sysctrl_r )
|
||||
reg = decode_reg_64(offset, mem_mask, &shift);
|
||||
|
||||
#if DEBUG_SYSCTRL
|
||||
if ((reg != 0x40) && (reg != 0x42) && (reg != 0x23) && (reg > 2)) // filter out IRQ status reads
|
||||
if ((reg != 0x40) && (reg != 0x41) && (reg != 0x42) && (reg != 0x23) && (reg > 2)) // filter out IRQ status reads
|
||||
{
|
||||
mame_printf_verbose("SYSCTRL: [%08x] read %x @ %x (reg %x: %s), mask %llx (PC=%x)\n", 0x5f6800+reg*4, sysctrl_regs[reg], offset, reg, sysctrl_names[reg], mem_mask, activecpu_get_pc());
|
||||
}
|
||||
@ -752,7 +753,7 @@ WRITE64_HANDLER( dc_rtc_w )
|
||||
|
||||
MACHINE_RESET( dc )
|
||||
{
|
||||
int a;
|
||||
int a;
|
||||
|
||||
/* halt the ARM7 */
|
||||
cpunum_set_input_line(machine, 1, INPUT_LINE_RESET, ASSERT_LINE);
|
||||
@ -764,11 +765,12 @@ int a;
|
||||
sysctrl_regs[SB_SBREV] = 0x0b;
|
||||
for (a=0;a < 0x80;a++)
|
||||
maple0x86data1[a]=0x11+a;
|
||||
|
||||
// checksums
|
||||
maple0x86data1[0]=0xb9;
|
||||
maple0x86data1[1]=0xb1;
|
||||
maple0x86data1[18]=0xb8;
|
||||
maple0x86data1[19]=0x8a;
|
||||
maple0x86data1[0]=0xb9;
|
||||
maple0x86data1[1]=0xb1;
|
||||
maple0x86data1[18]=0xb8;
|
||||
maple0x86data1[19]=0x8a;
|
||||
}
|
||||
|
||||
READ64_HANDLER( dc_aica_reg_r )
|
||||
@ -778,8 +780,9 @@ READ64_HANDLER( dc_aica_reg_r )
|
||||
|
||||
reg = decode_reg_64(offset, mem_mask, &shift);
|
||||
|
||||
mame_printf_verbose("AICA REG: [%08x] read %llx, mask %llx\n", 0x700000+reg*4, (UINT64)offset, mem_mask);
|
||||
return 0;
|
||||
// mame_printf_verbose("AICA REG: [%08x] read %llx, mask %llx\n", 0x700000+reg*4, (UINT64)offset, mem_mask);
|
||||
|
||||
return (UINT64) AICA_0_r(offset*2, 0x0000)<<shift;
|
||||
}
|
||||
|
||||
WRITE64_HANDLER( dc_aica_reg_w )
|
||||
@ -804,5 +807,19 @@ WRITE64_HANDLER( dc_aica_reg_w )
|
||||
cpunum_set_input_line(Machine, 1, INPUT_LINE_RESET, CLEAR_LINE);
|
||||
}
|
||||
}
|
||||
mame_printf_verbose("AICA REG: [%08x=%x] write %llx to %x, mask %llx\n", 0x700000+reg*4, dat, data, offset, mem_mask);
|
||||
|
||||
AICA_0_w(offset*2, dat, shift ? ((mem_mask>>32)&0xffff) : (mem_mask & 0xffff));
|
||||
|
||||
// mame_printf_verbose("AICA REG: [%08x=%x] write %llx to %x, mask %llx\n", 0x700000+reg*4, dat, data, offset, mem_mask);
|
||||
}
|
||||
|
||||
READ32_HANDLER( dc_arm_aica_r )
|
||||
{
|
||||
return AICA_0_r(offset*2, 0x0000);
|
||||
}
|
||||
|
||||
WRITE32_HANDLER( dc_arm_aica_w )
|
||||
{
|
||||
AICA_0_w(offset*2, data, mem_mask&0xffff);
|
||||
}
|
||||
|
||||
|
@ -303,7 +303,7 @@ SOUNDS += BEEP
|
||||
#SOUNDS += SID6581
|
||||
#SOUNDS += SID8580
|
||||
SOUNDS += SP0256
|
||||
|
||||
SOUNDS += AICA
|
||||
|
||||
|
||||
#-------------------------------------------------
|
||||
|
Loading…
Reference in New Issue
Block a user