// license:BSD-3-Clause
// copyright-holders:S. Smith,David Haywood,Fabio Priuli
/***********************************************************************************************************

 Neo Geo cart emulation
 Crouching Tiger Hidden Dragon Bootleg cart type

 ***********************************************************************************************************/


#include "emu.h"
#include "boot_cthd.h"


//-------------------------------------------------
//  neogeo_cthd2k3_cart_device - constructor
//-------------------------------------------------

DEFINE_DEVICE_TYPE(NEOGEO_CTHD2K3_CART, neogeo_cthd2k3_cart_device, "neocart_ct2k3", "Neo Geo CTHD 2003 Cart")


neogeo_cthd2k3_cart_device::neogeo_cthd2k3_cart_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint16_t clock) :
	neogeo_rom_device(mconfig, type, tag, owner, clock),
	m_prot(*this, "cthd_prot")
{
}

neogeo_cthd2k3_cart_device::neogeo_cthd2k3_cart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint16_t clock) :
	neogeo_cthd2k3_cart_device(mconfig, NEOGEO_CTHD2K3_CART, tag, owner, clock)
{
}


//-------------------------------------------------
//  mapper specific start/reset
//-------------------------------------------------

void neogeo_cthd2k3_cart_device::device_start()
{
}

void neogeo_cthd2k3_cart_device::device_reset()
{
}


/*-------------------------------------------------
 mapper specific handlers
 -------------------------------------------------*/

MACHINE_CONFIG_START(neogeo_cthd2k3_cart_device::device_add_mconfig)
	MCFG_CTHD_PROT_ADD("cthd_prot")
MACHINE_CONFIG_END


/*************************************************
 cthd2k3
 **************************************************/


void neogeo_cthd2k3_cart_device::decrypt_all(DECRYPT_ALL_PARAMS)
{
	m_prot->decrypt_cthd2003(spr_region, spr_region_size, audiocpu_region, audio_region_size, fix_region, fix_region_size);
	m_prot->patch_cthd2003(cpuregion, cpuregion_size);
}


/*************************************************
 ct2k3sp
 **************************************************/


DEFINE_DEVICE_TYPE(NEOGEO_CT2K3SP_CART, neogeo_ct2k3sp_cart_device, "neocart_ct2k3sp", "Neo Geo CTHD 2003 Sp Cart")

neogeo_ct2k3sp_cart_device::neogeo_ct2k3sp_cart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
	neogeo_cthd2k3_cart_device(mconfig, NEOGEO_CT2K3SP_CART, tag, owner, clock)
{
}

void neogeo_ct2k3sp_cart_device::decrypt_all(DECRYPT_ALL_PARAMS)
{
	m_prot->decrypt_ct2k3sp(spr_region, spr_region_size, audiocpu_region, audio_region_size, fix_region, fix_region_size);
	m_prot->patch_cthd2003(cpuregion, cpuregion_size);
}

/*************************************************
 ct2k3sa
 **************************************************/

DEFINE_DEVICE_TYPE(NEOGEO_CT2K3SA_CART, neogeo_ct2k3sa_cart_device, "neocart_ct2k3sa", "Neo Geo CTHD 2003 Sp Alt Cart")

neogeo_ct2k3sa_cart_device::neogeo_ct2k3sa_cart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
	neogeo_cthd2k3_cart_device(mconfig, NEOGEO_CT2K3SA_CART, tag, owner, clock)
{
}

void neogeo_ct2k3sa_cart_device::decrypt_all(DECRYPT_ALL_PARAMS)
{
	m_prot->decrypt_ct2k3sa(spr_region, spr_region_size, audiocpu_region, audio_region_size);
	m_prot->patch_ct2k3sa(cpuregion, cpuregion_size);
}


/*************************************************
 matrimbl
 **************************************************/

DEFINE_DEVICE_TYPE(NEOGEO_MATRIMBL_CART, neogeo_matrimbl_cart_device, "neocart_matrimbl", "Neo Geo Matrimelee Bootleg Cart")

neogeo_matrimbl_cart_device::neogeo_matrimbl_cart_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
	neogeo_cthd2k3_cart_device(mconfig, NEOGEO_MATRIMBL_CART, tag, owner, clock),
	m_cmc_prot(*this, "cmc_prot"),
	m_kof2k2_prot(*this, "kof2k2_prot")
{
}

void neogeo_matrimbl_cart_device::decrypt_all(DECRYPT_ALL_PARAMS)
{
	m_kof2k2_prot->matrim_decrypt_68k(cpuregion, cpuregion_size);
	m_cmc_prot->sfix_decrypt(spr_region, spr_region_size, fix_region, fix_region_size); // required for text layer
	m_prot->matrimbl_decrypt(spr_region, spr_region_size, audiocpu_region, audio_region_size);
}


 MACHINE_CONFIG_START(neogeo_matrimbl_cart_device::device_add_mconfig)
	MCFG_KOF2002_PROT_ADD("kof2k2_prot")
	MCFG_CMC_PROT_ADD("cmc_prot")
	MCFG_CTHD_PROT_ADD("cthd_prot")
MACHINE_CONFIG_END
