mirror of
https://github.com/holub/mame
synced 2025-07-01 16:19:38 +03:00
More work (nw)
This commit is contained in:
parent
8b1c5b90c7
commit
f487ca3bcc
@ -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
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user