[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:
R. Belmont 2008-02-17 18:28:36 +00:00
parent b469de6db7
commit 8877f5321b
13 changed files with 1983 additions and 22 deletions

5
.gitattributes vendored
View File

@ -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

View File

@ -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 },

View File

@ -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

File diff suppressed because it is too large Load Diff

30
src/emu/sound/aica.h Normal file
View 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
View 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
View 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
View 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];
}
}

View File

@ -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
#-------------------------------------------------

View File

@ -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) \

View File

@ -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 );

View File

@ -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);
}

View File

@ -303,7 +303,7 @@ SOUNDS += BEEP
#SOUNDS += SID6581
#SOUNDS += SID8580
SOUNDS += SP0256
SOUNDS += AICA
#-------------------------------------------------