More work (nw)

This commit is contained in:
angelosa 2016-07-03 20:49:41 +02:00
parent 8b1c5b90c7
commit f487ca3bcc
2 changed files with 61 additions and 77 deletions

View File

@ -7,6 +7,9 @@
Notice that only the bare minimum is supported, which is what the bootleg device actually Notice that only the bare minimum is supported, which is what the bootleg device actually
do. do.
Apparently it's an Actel PL84c FPGA programmed to be a Seibu COP clone.
The internal operations are actually loaded via the ROMs, we use the original algorithm
for the trigger until we find the proper hookup.
********************************************************************************************/ ********************************************************************************************/
@ -46,8 +49,22 @@ WRITE16_MEMBER(seibu_cop_bootleg_device::cmd_trigger_w)
//printf("trigger write %04x\n",data); //printf("trigger write %04x\n",data);
break; break;
case 0x0000: case 0x0000:
case 0xf105:
break; break;
case 0xdde5:
{
UINT8 offs;
int div;
INT16 dir_offset;
offs = (offset & 3) * 4;
div = m_host_space->read_word(m_reg[4] + offs);
dir_offset = m_host_space->read_word(m_reg[4] + offs + 8);
if (div == 0) { div = 1; }
m_host_space->write_word((m_reg[6] + offs + 4), ((m_host_space->read_word(m_reg[5] + offs + 4) + dir_offset) / div));
break;
}
case 0x0205: case 0x0205:
{ {
UINT8 offs; UINT8 offs;
@ -62,27 +79,33 @@ WRITE16_MEMBER(seibu_cop_bootleg_device::cmd_trigger_w)
break; break;
} }
case 0x138e:
case 0xe30e:
case 0xe18e: case 0xe18e:
{ {
int dy = m_host_space->read_dword(m_reg[1]+4) - m_host_space->read_dword(m_reg[0]+4); int target_reg = data & 0x200 ? 2 : 1;
int dx = m_host_space->read_dword(m_reg[1]+8) - m_host_space->read_dword(m_reg[0]+8); int dy = (m_host_space->read_dword(m_reg[target_reg]+4) >> 16) - (m_host_space->read_dword(m_reg[0]+4) >> 16);
UINT16 angle; int dx = (m_host_space->read_dword(m_reg[target_reg]+8) >> 16) - (m_host_space->read_dword(m_reg[0]+8) >> 16);
//m_raiden2cop->cop_status = 7; //m_status = 7;
if(!dx) { if(!dx) {
//m_raiden2cop->cop_status |= 0x8000; m_status = 0x8000;
angle = 0; m_angle = 0;
} else { } else {
angle = atan(double(dy)/double(dx)) * 128.0 / M_PI; m_status = 0;
m_angle = atan(double(dy)/double(dx)) * 128.0 / M_PI;
if(dx<0) if(dx<0)
angle += 0x80; {
m_angle += 0x80;
}
} }
m_dy = dy; m_dy = dy;
m_dx = dx; m_dx = dx;
//if(m_cop_mcu_ram[offset] & 0x80) if(data & 0x80)
m_host_space->write_word(m_reg[0]+(0x34^2), angle & 0xff); m_host_space->write_word(m_reg[0]+(0x34^2), m_angle & 0xff);
break; break;
} }
@ -91,13 +114,12 @@ WRITE16_MEMBER(seibu_cop_bootleg_device::cmd_trigger_w)
{ {
int dy = m_dy; int dy = m_dy;
int dx = m_dx; int dx = m_dx;
UINT16 dist;
dx >>= 16; dx >>= 16;
dy >>= 16; dy >>= 16;
dist = sqrt((double)(dx*dx+dy*dy)); m_dist = sqrt((double)(dx*dx+dy*dy));
m_host_space->write_word(m_reg[0]+(0x38), dist); m_host_space->write_word(m_reg[0]+(0x38), m_dist);
break; break;
} }
@ -143,11 +165,31 @@ WRITE16_MEMBER(seibu_cop_bootleg_device::cmd_trigger_w)
} }
READ16_MEMBER(seibu_cop_bootleg_device::status_r)
{
return m_status;
}
READ16_MEMBER(seibu_cop_bootleg_device::dist_r)
{
return m_dist;
}
READ16_MEMBER(seibu_cop_bootleg_device::angle_r)
{
return m_angle;
}
// anything that is read thru ROM range 0xc**** is replacement code, therefore on this HW they are latches.
static ADDRESS_MAP_START( seibucopbl_map, AS_0, 16, seibu_cop_bootleg_device ) static ADDRESS_MAP_START( seibucopbl_map, AS_0, 16, seibu_cop_bootleg_device )
AM_RANGE(0x070, 0x07f) AM_RAM // DMA registers, resolved at PC=0xc0034 AM_RANGE(0x01e, 0x01f) AM_RAM // angle step, PC=0xc0186
AM_RANGE(0x070, 0x07f) AM_RAM // DMA registers, PC=0xc0034
AM_RANGE(0x0a0, 0x0af) AM_READWRITE(reg_hi_addr_r,reg_hi_addr_w) AM_RANGE(0x0a0, 0x0af) AM_READWRITE(reg_hi_addr_r,reg_hi_addr_w)
AM_RANGE(0x0c0, 0x0cf) AM_READWRITE(reg_lo_addr_r,reg_lo_addr_w) AM_RANGE(0x0c0, 0x0cf) AM_READWRITE(reg_lo_addr_r,reg_lo_addr_w)
AM_RANGE(0x100, 0x105) AM_WRITE(cmd_trigger_w) AM_RANGE(0x100, 0x105) AM_WRITE(cmd_trigger_w)
AM_RANGE(0x1b0, 0x1b1) AM_READ(status_r)
AM_RANGE(0x1b2, 0x1b3) AM_READ(dist_r)
AM_RANGE(0x1b4, 0x1b5) AM_READ(angle_r)
ADDRESS_MAP_END ADDRESS_MAP_END
seibu_cop_bootleg_device::seibu_cop_bootleg_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) seibu_cop_bootleg_device::seibu_cop_bootleg_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
@ -216,66 +258,4 @@ READ16_MEMBER( seibu_cop_bootleg_device::copdxbl_0_r )
WRITE16_MEMBER( seibu_cop_bootleg_device::copdxbl_0_w ) WRITE16_MEMBER( seibu_cop_bootleg_device::copdxbl_0_w )
{ {
write_word(offset,data); write_word(offset,data);
switch((offset+0x400)/2)
{
default:
{
//logerror("%06x: COPX unhandled write data %04x at offset %04x\n", space.device().safe_pc(), data, offset*2+0x400);
break;
}
#if 0
case (0x500/2):
case (0x502/2):
case (0x504/2):
switch(m_cop_mcu_ram[offset])
{
case 0x130e:
case 0x138e:
{
int dy = m_host_space.read_dword(m_reg[1]+4) - m_host_space.read_dword(m_reg[0]+4);
int dx = m_host_space.read_dword(m_reg[1]+8) - m_host_space.read_dword(m_reg[0]+8);
m_raiden2cop->cop_status = 7;
if(!dx) {
m_raiden2cop->cop_status |= 0x8000;
m_raiden2cop->cop_angle = 0;
} else {
m_raiden2cop->cop_angle = atan(double(dy)/double(dx)) * 128.0 / M_PI;
if(dx<0)
m_raiden2cop->cop_angle += 0x80;
}
m_dy = dy;
m_dx = dx;
if(m_cop_mcu_ram[offset] & 0x80)
m_host_space.write_word(m_reg[0]+(0x34^2), m_raiden2cop->cop_angle);
break;
}
case 0x3b30:
case 0x3bb0:
{
int dy = m_raiden2cop->m_LEGACY_r0;
int dx = m_raiden2cop->m_LEGACY_r1;
dx >>= 16;
dy >>= 16;
m_raiden2cop->cop_dist = sqrt((double)(dx*dx+dy*dy));
if(m_cop_mcu_ram[offset] & 0x80)
m_host_space.write_word(m_reg[0]+(0x38), m_raiden2cop->cop_dist);
break;
}
default:
printf("%04x\n",m_cop_mcu_ram[offset]);
break;
}
break;
#endif
}
} }

View File

@ -16,6 +16,9 @@ public:
DECLARE_READ16_MEMBER( reg_lo_addr_r ); DECLARE_READ16_MEMBER( reg_lo_addr_r );
DECLARE_READ16_MEMBER( reg_hi_addr_r ); DECLARE_READ16_MEMBER( reg_hi_addr_r );
DECLARE_READ16_MEMBER( status_r );
DECLARE_READ16_MEMBER( dist_r );
DECLARE_READ16_MEMBER( angle_r );
DECLARE_WRITE16_MEMBER( reg_lo_addr_w ); DECLARE_WRITE16_MEMBER( reg_lo_addr_w );
DECLARE_WRITE16_MEMBER( reg_hi_addr_w ); DECLARE_WRITE16_MEMBER( reg_hi_addr_w );
DECLARE_WRITE16_MEMBER( cmd_trigger_w ); DECLARE_WRITE16_MEMBER( cmd_trigger_w );
@ -35,6 +38,7 @@ private:
inline void write_word(offs_t address, UINT16 data); inline void write_word(offs_t address, UINT16 data);
UINT32 m_reg[8]; UINT32 m_reg[8];
UINT16 m_angle,m_dist,m_status;
int m_dx,m_dy; int m_dx,m_dy;
//required_device<raiden2cop_device> m_raiden2cop; //required_device<raiden2cop_device> m_raiden2cop;
}; };