summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/neogeo/banked_cart.cpp
blob: 05f677c5c3c9206893db0931a19110a6453e5400 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// license:BSD-3-Clause
// copyright-holders:S. Smith,David Haywood
#include "emu.h"
#include "banked_cart.h"



extern const device_type NEOGEO_BANKED_CART = &device_creator<neogeo_banked_cart_device>;


neogeo_banked_cart_device::neogeo_banked_cart_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
	: device_t(mconfig, NEOGEO_BANKED_CART, "NeoGeo Banked Cartridge", tag, owner, clock, "neogeo_banked_cart", __FILE__),
	m_bank_cartridge(0), 
	m_main_cpu_bank_address(0),
	m_region(0), 
	m_region_size(0)

{
}

void neogeo_banked_cart_device::postload()
{
	_set_main_cpu_bank_address();
}

void neogeo_banked_cart_device::device_start()
{
	save_item(NAME(m_main_cpu_bank_address));
	machine().save().register_postload(save_prepost_delegate(FUNC(neogeo_banked_cart_device::postload), this));
}

void neogeo_banked_cart_device::device_reset()
{
}






/*************************************
 *
 *  Main CPU banking
 *
 *************************************/

void neogeo_banked_cart_device::_set_main_cpu_bank_address(void)
{
	if (!m_region)
		printf("region is null\n");

	if (!m_bank_cartridge)
		printf("bank_cartridge is null\n");

	if (m_region && m_bank_cartridge) m_bank_cartridge->set_base(m_region + m_main_cpu_bank_address);
}


void neogeo_banked_cart_device::neogeo_set_main_cpu_bank_address( UINT32 bank_address )
{
//  if (LOG_MAIN_CPU_BANKING) logerror("MAIN CPU PC %06x: neogeo_set_main_cpu_bank_address %06x\n", m_maincpu->pc(), bank_address);

	m_main_cpu_bank_address = bank_address;

	_set_main_cpu_bank_address();
}


WRITE16_MEMBER(neogeo_banked_cart_device::main_cpu_bank_select_w)
{
	UINT32 bank_address;
	UINT32 len = m_region_size;

	if ((len <= 0x100000) && (data & 0x07))
		logerror("PC %06x: warning: bankswitch to %02x but no banks available\n", space.device().safe_pc(), data);
	else
	{
		bank_address = ((data & 0x07) + 1) * 0x100000;

		if (bank_address >= len)
		{
			logerror("PC %06x: warning: bankswitch to empty bank %02x\n", space.device().safe_pc(), data);
			bank_address = 0x100000;
		}

		neogeo_set_main_cpu_bank_address(bank_address);
	}
}

void neogeo_banked_cart_device::init_banks(void)
{
	/* set initial main CPU bank */
	if (m_region_size > 0x100000)
		neogeo_set_main_cpu_bank_address(0x100000);
	else
		neogeo_set_main_cpu_bank_address(0x000000);
}

void neogeo_banked_cart_device::install_banks(running_machine& machine, cpu_device* maincpu, UINT8* region, UINT32 region_size)
{
	maincpu->space(AS_PROGRAM).install_read_bank(0x200000, 0x2fffff, 0, 0, "cartridge");
	maincpu->space(AS_PROGRAM).install_write_handler(0x2ffff0, 0x2fffff, write16_delegate(FUNC(neogeo_banked_cart_device::main_cpu_bank_select_w),this));

	m_bank_cartridge = machine.root_device().membank("cartridge");
	m_region = region;
	m_region_size = region_size;

	init_banks();
}