// 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 *****************************************************************************/ void k054000_device::write(offs_t offset, u8 data) { //logerror("%s: write %02x to 054000 address %02x\n",m_maincpu->pc(),data,offset); m_regs[offset] = data; } u8 k054000_device::read(offs_t offset) { 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; }