AICA: fixed DSP r/w

This commit is contained in:
Angelo Salese 2013-09-09 21:10:22 +00:00
parent cf3a84d62a
commit 45f68ceedd
2 changed files with 68 additions and 3 deletions

View File

@ -999,15 +999,21 @@ static void AICA_w16(aica_state *AICA,address_space &space,unsigned int addr,uns
else if (addr == 0x2d00)
{
AICA->IRQL = val;
popmessage("AICA: write to IRQL?");
}
else if (addr == 0x2d04)
{
AICA->IRQR = val;
if (val)
if (val & 1)
{
AICA->IntARMCB(0);
}
if (val & 0x100)
popmessage("AICA: SH-4 write protection enabled!");
if (val & 0xfefe)
popmessage("AICA: IRQR %04x!",val);
}
}
else
@ -1026,6 +1032,35 @@ static void AICA_w16(aica_state *AICA,address_space &space,unsigned int addr,uns
aica_dsp_start(&AICA->DSP);
}
}
else if(addr<0x4000)
{
popmessage("AICADSP write to undocumented reg %04x -> %04x",addr,val);
}
else if(addr<0x4400)
{
if(addr & 4)
AICA->DSP.TEMP[(addr >> 3) & 0x7f] = (AICA->DSP.TEMP[(addr >> 3) & 0x7f] & 0xffff0000) | (val & 0xffff);
else
AICA->DSP.TEMP[(addr >> 3) & 0x7f] = (AICA->DSP.TEMP[(addr >> 3) & 0x7f] & 0xffff) | (val << 16);
}
else if(addr<0x4500)
{
if(addr & 4)
AICA->DSP.MEMS[(addr >> 3) & 0x1f] = (AICA->DSP.MEMS[(addr >> 3) & 0x1f] & 0xffff0000) | (val & 0xffff);
else
AICA->DSP.MEMS[(addr >> 3) & 0x1f] = (AICA->DSP.MEMS[(addr >> 3) & 0x1f] & 0xffff) | (val << 16);
}
else if(addr<0x4580)
{
if(addr & 4)
AICA->DSP.MIXS[(addr >> 3) & 0xf] = (AICA->DSP.MIXS[(addr >> 3) & 0xf] & 0xffff0000) | (val & 0xffff);
else
AICA->DSP.MIXS[(addr >> 3) & 0xf] = (AICA->DSP.MIXS[(addr >> 3) & 0xf] & 0xffff) | (val << 16);
}
else if(addr<0x45c0)
*((unsigned short *) (AICA->DSP.EFREG+(addr-0x4580)/2))=val;
else if(addr<0x45c8)
*((unsigned short *) (AICA->DSP.EXTS+(addr-0x45c0)/2))=val;
}
}
@ -1058,6 +1093,7 @@ static unsigned short AICA_r16(aica_state *AICA, address_space &space, unsigned
}
else if (addr == 0x2d04)
{
//popmessage("AICA: read to IRQR?");
return AICA->IRQR;
}
}
@ -1069,7 +1105,36 @@ static unsigned short AICA_r16(aica_state *AICA, address_space &space, unsigned
v= *((unsigned short *) (AICA->DSP.MADRS+(addr-0x3200)/2));
else if(addr<0x3c00)
v= *((unsigned short *) (AICA->DSP.MPRO+(addr-0x3400)/2));
else if(addr<0x4000)
{
v= 0xffff;
popmessage("AICADSP read to undocumented reg %04x",addr);
}
else if(addr<0x4400)
{
if(addr & 4)
v= AICA->DSP.TEMP[(addr >> 3) & 0x7f] & 0xffff;
else
v= AICA->DSP.TEMP[(addr >> 3) & 0x7f] >> 16;
}
else if(addr<0x4500)
{
if(addr & 4)
v= AICA->DSP.MEMS[(addr >> 3) & 0x1f] & 0xffff;
else
v= AICA->DSP.MEMS[(addr >> 3) & 0x1f] >> 16;
}
else if(addr<0x4580)
{
if(addr & 4)
v= AICA->DSP.MIXS[(addr >> 3) & 0xf] & 0xffff;
else
v= AICA->DSP.MIXS[(addr >> 3) & 0xf] >> 16;
}
else if(addr<0x45c0)
v = *((unsigned short *) (AICA->DSP.EFREG+(addr-0x4580)/2));
else if(addr<0x45c8)
v = *((unsigned short *) (AICA->DSP.EXTS+(addr-0x45c0)/2));
}
// else if (addr<0x700)
// v=AICA->RINGBUF[(addr-0x600)/2];

View File

@ -154,7 +154,7 @@
EXT Input (0202)
ok
DSP Data (0203)
NG (ADDR=0xa0704000 W=0xff R=0x00)
ok
S_Clock (03xx)
50MSEC (0301)
NG