// license:BSD-3-Clause
// copyright-holders:David Haywood
#include "emu.h"
#include "k054000.h"
#define VERBOSE 0
#include "logmacro.h"
/***************************************************************************/
/* */
/* 054000 */
/* */
/***************************************************************************/
/*
054000
------
Sort of a protection device, used for collision detection.
It is passed a few parameters, and returns a boolean telling if collision
happened. It has no access to gfx data, it only does arithmetical operations
on the parameters.
Memory map:
00 unused
01-03 W A center X
04 W unknown, needed by thndrx2 to pass the startup check, we use a hack
05 unused
06 W A semiaxis X
07 W A semiaxis Y
08 unused
09-0b W A center Y
0c W unknown, needed by thndrx2 to pass the startup check, we use a hack
0d unused
0e W B semiaxis X
0f W B semiaxis Y
10 unused
11-13 W B center Y
14 unused
15-17 W B center X
18 R 0 = collision, 1 = no collision
*/
/***************************************************************************/
/* */
/* 054000 */
/* */
/***************************************************************************/
DEFINE_DEVICE_TYPE(K054000, k054000_device, "k054000", "K054000 Protection")
k054000_device::k054000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, K054000, tag, owner, clock)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void k054000_device::device_start()
{
save_item(NAME(m_regs));
}
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
void k054000_device::device_reset()
{
int i;
for (i = 0; i < 0x20; i++)
m_regs[i] = 0;
}
/*****************************************************************************
DEVICE HANDLERS
*****************************************************************************/
WRITE8_MEMBER( k054000_device::write )
{
//logerror("%s: write %02x to 054000 address %02x\n",m_maincpu->pc(),data,offset);
m_regs[offset] = data;
}
READ8_MEMBER( k054000_device::read )
{
int Acx, Acy, Aax, Aay;
int Bcx, Bcy, Bax, Bay;
//logerror("%s: read 054000 address %02x\n", m_maincpu->pc(), offset);
if (offset != 0x18)
return 0;
Acx = (m_regs[0x01] << 16) | (m_regs[0x02] << 8) | m_regs[0x03];
Acy = (m_regs[0x09] << 16) | (m_regs[0x0a] << 8) | m_regs[0x0b];
/* TODO: this is a hack to make thndrx2 pass the startup check. It is certainly wrong. */
if (m_regs[0x04] == 0xff)
Acx+=3;
if (m_regs[0x0c] == 0xff)
Acy+=3;
Aax = m_regs[0x06] + 1;
Aay = m_regs[0x07] + 1;
Bcx = (m_regs[0x15] << 16) | (m_regs[0x16] << 8) | m_regs[0x17];
Bcy = (m_regs[0x11] << 16) | (m_regs[0x12] << 8) | m_regs[0x13];
Bax = m_regs[0x0e] + 1;
Bay = m_regs[0x0f] + 1;
if (Acx + Aax < Bcx - Bax)
return 1;
if (Bcx + Bax < Acx - Aax)
return 1;
if (Acy + Aay < Bcy - Bay)
return 1;
if (Bcy + Bay < Acy - Aay)
return 1;
return 0;
}
READ16_MEMBER( k054000_device::lsb_r )
{
return read(space, offset);
}
WRITE16_MEMBER( k054000_device::lsb_w )
{
if (ACCESSING_BITS_0_7)
write(space, offset, data & 0xff);
}