Second batch of COP fixes, no whatsnew

This commit is contained in:
Angelo Salese 2010-12-24 11:14:34 +00:00
parent 6d7892ab13
commit f2168d89b2

View File

@ -2182,6 +2182,8 @@ READ16_HANDLER( raiden2_cop2_r )
which seems common to all the agmes
*/
static UINT16 cop_status,cop_dist,cop_angle;
static READ16_HANDLER( generic_cop_r )
{
UINT16 retvalue;
@ -2190,6 +2192,15 @@ static READ16_HANDLER( generic_cop_r )
switch (offset)
{
case 0x1b0/2:
return cop_status;
case 0x1b2/2:
return cop_dist;
case 0x1b4/2:
return cop_angle;
default:
seibu_cop_log("%06x: COPX unhandled read returning %04x from offset %04x\n", cpu_get_pc(space->cpu), retvalue, offset*2);
return retvalue;
@ -2198,6 +2209,8 @@ static READ16_HANDLER( generic_cop_r )
static UINT16 u1,u2;
static UINT16 test;
#define COP_CMD(_1_,_2_,_3_,_4_,_5_,_6_,_7_,_8_,_u1_,_u2_) \
(copd2_table[command+0] == _1_ && copd2_table[command+1] == _2_ && copd2_table[command+2] == _3_ && copd2_table[command+3] == _4_ && \
copd2_table[command+4] == _5_ && copd2_table[command+5] == _6_ && copd2_table[command+6] == _7_ && copd2_table[command+7] == _8_ && \
@ -2239,6 +2252,12 @@ static WRITE16_HANDLER( generic_cop_w )
case (0x03a/2): { cop_43a = data; break; }
case (0x03c/2): { cop_43c = data; break; }
case (0x040/2):
{
test = data;
break;
}
/* DMA / layer clearing */
case (0x076/2):
cop_dma_src_param[cop_dma_trigger] = data;
@ -2345,6 +2364,15 @@ static WRITE16_HANDLER( generic_cop_w )
//printf("%04x %04x %04x\n",cop_mcu_ram[offset],u1,u2);
cop_status &= 0x7fff;
/*
endianess changes:
dword no change
word Add / Subtract two
byte ?
*/
/* "automatic" movement */
if(COP_CMD(0x188,0x282,0x082,0xb8e,0x98e,0x000,0x000,0x000,6,0xffeb))
{
@ -2356,27 +2384,105 @@ static WRITE16_HANDLER( generic_cop_w )
return;
}
/* SINE math - WRONG */
/* SINE math - 0x8100 */
if(COP_CMD(0xb9a,0xb88,0x888,0x000,0x000,0x000,0x000,0x000,7,0xfdfb))
{
double angle = (space->read_word(cop_register[0]+0x34) & 0xff) * M_PI / 128;
double amp = 65536*(space->read_word(cop_register[0]+0x36) & 0xff);
double angle = (space->read_word(cop_register[0]+(0x34^2)) & 0xff) * M_PI / 128;
double amp = 65536*(space->read_word(cop_register[0]+(0x36^2)) & 0xff);
space->write_dword(cop_register[0] + 16, int(amp*sin(angle)) >> (5-cop_scale));
return;
}
/* COSINE math - WRONG */
/* COSINE math - 0x8900 */
if(COP_CMD(0xb9a,0xb8a,0x88a,0x000,0x000,0x000,0x000,0x000,7,0xfdfb))
{
double angle = (space->read_word(cop_register[0]+0x34) & 0xff) * M_PI / 128;
double amp = 65536*(space->read_word(cop_register[0]+0x36) & 0xff);
double angle = (space->read_word(cop_register[0]+(0x34^2)) & 0xff) * M_PI / 128;
double amp = 65536*(space->read_word(cop_register[0]+(0x36^2)) & 0xff);
space->write_dword(cop_register[0] + 20, int(amp*cos(angle)) >> (5-cop_scale));
return;
}
/* 0x130e / 0x138e */
if(COP_CMD(0x984,0xaa4,0xd82,0xaa2,0x39b,0xb9a,0xb9a,0xa9a,5,0xbf7f))
{
int dx = space->read_dword(cop_register[1]+4) - space->read_dword(cop_register[0]+4);
int dy = space->read_dword(cop_register[1]+8) - space->read_dword(cop_register[0]+8);
if(!dy) {
cop_status |= 0x8000;
cop_angle = 0;
} else {
cop_angle = atan(double(dx)/double(dy)) * 128 / M_PI;
if(dy<0)
cop_angle += 0x80;
}
dx = dx >> 16;
dy = dy >> 16;
cop_dist = sqrt((double)(dx*dx+dy*dy));
space->write_byte(cop_register[0]+(0x34^3), cop_angle);
space->write_word(cop_register[0]+(0x38^2), cop_dist);
return;
}
//(heatbrl) | 5 | bf7f | 138e | 984 aa4 d82 aa2 39b b9a b9a b9a
if(COP_CMD(0x984,0xaa4,0xd82,0xaa2,0x39b,0xb9a,0xb9a,0xb9a,5,0xbf7f))
{
int dx = space->read_dword(cop_register[1]+4) - space->read_dword(cop_register[0]+4);
int dy = space->read_dword(cop_register[1]+8) - space->read_dword(cop_register[0]+8);
if(!dy) {
cop_status |= 0x8000;
cop_angle = 0;
} else {
cop_angle = atan(double(dx)/double(dy)) * 128 / M_PI;
if(dy<0)
cop_angle += 0x80;
}
dx = dx >> 16;
dy = dy >> 16;
cop_dist = sqrt((double)(dx*dx+dy*dy));
/* is this the only difference? */
if(0)
{
space->write_byte(cop_register[0]+(0x34^3), cop_angle);
space->write_word(cop_register[0]+(0x38^2), cop_dist);
}
return;
}
/* Division - 0x42c2 - */
if(COP_CMD(0xf9a,0xb9a,0xb9c,0xb9c,0xb9c,0x29c,0x000,0x000,5,0xfcdd))
{
int div = space->read_word(cop_register[0]+(0x36^2));
if(!div)
div = 1;
space->write_word(cop_register[0]+(0x38^2), (space->read_word(cop_register[0]+(0x38^2)) << (5-cop_scale)) / div);
return;
}
if(0)
if(COP_CMD(0x194,0x288,0x088,0x000,0x000,0x000,0x000,0x000,6,0xfbfb))
{
}
if(cop_mcu_ram[offset] == 0xa100)
return;
if(cop_mcu_ram[offset] == 0xb080)
return;
if(cop_mcu_ram[offset] == 0xa900)
return;
if(cop_mcu_ram[offset] == 0xb880)
return;
//printf("%04x\n",cop_mcu_ram[offset]);
break;
}
@ -2488,9 +2594,6 @@ READ16_HANDLER( heatbrl_mcu_r )
case (0x184/2): //{ if(input_code_pressed(space->machine, KEYCODE_C)) { return 0; } else { return 3; } } /*---- ---- ---- --xx used bits*/
return 0xffff;
case (0x1b0/2): return (0xffff); /* bit 15 is branched on a few times in the $1938 area */
case (0x1b4/2): return (0xffff); /* read at $1932 and stored in ram before +0x5b0 bit 15 tested */
/*********************************************************************
700-7ff - Non-protection reads
*********************************************************************/
@ -2632,62 +2735,6 @@ WRITE16_HANDLER( cupsoc_mcu_w )
400-5ff - Protection writes
*********************************************************************/
#if 0
/* Trigger Macro Command */
case (0x100/2):
{
switch(cop_mcu_ram[offset])
{
/*???*/
case 0x8100:
{
UINT32 src = cop_register[0];
space->write_word(src+0x36,0xffc0);
break;
}
case 0x8900:
{
UINT32 src = cop_register[0];
space->write_word(src+0x36,0xff80);
break;
}
/*Right*/
case 0x0205:
{
UINT32 src = cop_register[0];
INT16 y = space->read_word(src+0x4);
INT16 x = space->read_word(src+0x8);
INT16 y_rel = space->read_word(src+0x10);
INT16 x_rel = space->read_word(src+0x14);
space->write_word(src+0x4,(y+y_rel));
space->write_word(src+0x8,(x+x_rel));
/*logerror("%08x %08x %08x %08x %08x\n",cop_register[0],
space->read_word(cop_reg[0]+0x4),
space->read_word(cop_reg[0]+0x8),
space->read_word(cop_reg[0]+0x10),
space->read_word(cop_reg[0]+0x14));*/
break;
}
/*???*/
case 0x3bb0:
{
//UINT32 dst = cop_register[0];
//UINT32 dst = cop_register[1];
//space->write_word(dst, mame_rand(space->machine)/*space->read_word(src)*/);
//space->write_word(dst+2,mame_rand(space->machine)/*space->read_word(src+2)*/);
//space->write_word(dst+4,mame_rand(space->machine)/*space->read_word(src+4)*/);
//space->write_word(dst+6,mame_rand(space->machine)/*space->read_word(src+6)*/);
//logerror("%04x\n",cop_register[0]);
break;
}
default:
//logerror("%04x\n",data);
break;
}
break;
}
#endif
/* Video Regs */
case (0x204/2):
{
@ -2779,62 +2826,6 @@ WRITE16_HANDLER( cupsocs_mcu_w )
400-5ff - Protection writes
*********************************************************************/
#if 0
/* Trigger Macro Command */
case (0x100/2):
{
switch(cop_mcu_ram[offset])
{
/*???*/
case 0x8100:
{
UINT32 src = cop_register[0];
space->write_word(src+0x36,0xffc0);
break;
}
case 0x8900:
{
UINT32 src = cop_register[0];
space->write_word(src+0x36,0xff80);
break;
}
/*Right*/
case 0x0205:
{
UINT32 src = cop_register[0];
INT16 y = space->read_word(src+0x4);
INT16 x = space->read_word(src+0x8);
INT16 y_rel = space->read_word(src+0x10);
INT16 x_rel = space->read_word(src+0x14);
space->write_word(src+0x4,(y+y_rel));
space->write_word(src+0x8,(x+x_rel));
/*logerror("%08x %08x %08x %08x %08x\n",cop_register[0],
space->read_word(cop_reg[0]+0x4),
space->read_word(cop_reg[0]+0x8),
space->read_word(cop_reg[0]+0x10),
space->read_word(cop_reg[0]+0x14));*/
break;
}
/*???*/
case 0x3bb0:
{
//UINT32 dst = cop_register[0];
//UINT32 dst = cop_register[1];
//space->write_word(dst, mame_rand(space->machine)/*space->read_word(src)*/);
//space->write_word(dst+2,mame_rand(space->machine)/*space->read_word(src+2)*/);
//space->write_word(dst+4,mame_rand(space->machine)/*space->read_word(src+4)*/);
//space->write_word(dst+6,mame_rand(space->machine)/*space->read_word(src+6)*/);
//logerror("%04x\n",cop_register[0]);
break;
}
default:
//logerror("%04x\n",data);
break;
}
break;
}
#endif
/* Video Regs */
case (0x204/2):
{
@ -3112,6 +3103,7 @@ WRITE16_HANDLER( grainbow_mcu_w )
{
if(cop_mcu_ram[offset] == 0xc480)
{
if(0)
dma_transfer(space);
s_i--;
if(s_i == 0)