summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/bbc/rom/genie.cpp
blob: c3b1ef8afc0496b220e55849ba46405e3085ca46 (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
110
111
112
113
114
115
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
// thanks-to:Derek Mathieson (original author of Genie)
/***************************************************************************

    PMS Genie

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

#include "emu.h"
#include "genie.h"


//**************************************************************************
//  DEVICE DEFINITIONS
//**************************************************************************

DEFINE_DEVICE_TYPE(BBC_PMSGENIE, bbc_pmsgenie_device, "bbc_pmsgenie", "PMS Genie ROM Board")


//**************************************************************************
//  LIVE DEVICE
//**************************************************************************

//-------------------------------------------------
//  bbc_palprom_device - constructor
//-------------------------------------------------

bbc_pmsgenie_device::bbc_pmsgenie_device(const machine_config &mconfig, const char *tag, device_t *owner, const XTAL &clock)
	: device_t(mconfig, BBC_PMSGENIE, tag, owner, clock)
	, device_bbc_rom_interface(mconfig, *this)
	, m_write_latch(0)
	, m_bank_latch(0)
{
}


//-------------------------------------------------
//  device_start - device-specific startup
//-------------------------------------------------

void bbc_pmsgenie_device::device_start()
{
	save_item(NAME(m_write_latch));
	save_item(NAME(m_bank_latch));
}

//-------------------------------------------------
//  read
//-------------------------------------------------

uint8_t bbc_pmsgenie_device::read(offs_t offset)
{
	uint8_t data = 0xff;

	if (!machine().side_effects_disabled())
	{
		switch (offset >> 8)
		{
		case 0x1e:
			/* &9E00-&9EFF - Write value latch */
			m_write_latch = offset & 0xff;
			break;
		case 0x1f:
			/* &9F00-&9FFF - Bank select latch
		 Bit
		 0-2: RAM bank select
		   3: Not used
		 4-5: ROM bank select
		   6: Not used
		   7: Read / NOT Write for internal RAM */
			m_bank_latch = offset & 0xff;
			break;
		}
	}

	switch (offset & 0x2000)
	{
	case 0x0000:
		/* &8000-&9FFF - 4 Pages of 8K ROM (32K in total) */
		data = get_rom_base()[(offset & 0x1fff) | (m_bank_latch & 0x30) << 9];
		break;

	case 0x2000:
		/* &A000-&BFFF - 8 Pages of 8K RAM (64K in total) */
		if (m_bank_latch & 0x80)
		{
			/* RAM read */
			if (m_bank_latch & 0x04)
			{
				data = get_nvram_base()[(offset & 0x1fff) | (m_bank_latch & 0x03) << 13];
			}
			else
			{
				data = get_ram_base()[(offset & 0x1fff) | (m_bank_latch & 0x03) << 13];
			}
		}
		else
		{
			/* RAM write */
			if (m_bank_latch & 0x04)
			{
				get_nvram_base()[(offset & 0x1fff) | (m_bank_latch & 0x03) << 13] = m_write_latch;
			}
			else
			{
				get_ram_base()[(offset & 0x1fff) | (m_bank_latch & 0x03) << 13] = m_write_latch;
			}
			data = m_write_latch;
		}
		break;
	}

	return data;
}