summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/ondra.cpp
blob: 86af7833ba29b3a3ae993da424ffb71bb979487f (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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// license:BSD-3-Clause
// copyright-holders:Miodrag Milanovic
/***************************************************************************

        Ondra driver by Miodrag Milanovic

        08/09/2008 Preliminary driver.

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


#include "emu.h"
#include "includes/ondra.h"


u8 ondra_state::keyboard_r(offs_t offset)
{
	u8 data = 0x60;
	offset &= 15;

	data |= (m_cassette->input() < 0.00) ? 0x80: 0;

	if (offset < m_io_keyboard.size())
		data |= (m_io_keyboard[offset]->read() & 0x1f);
	else
		data |= 0x1f;

	return data;
}

void ondra_state::update_banks()
{
	address_space &space = m_maincpu->space(AS_PROGRAM);
	u8 *m = m_rom->base();
	u8 *r = m_ram->pointer();

	if (BIT(m_bank_status, 0) != BIT(m_bank_old, 0))
	{
		if (BIT(m_bank_status, 0))
		{
			space.install_write_bank(0x0000, 0x3fff, "bank1");
			m_bank1->set_base(r);
		}
		else
		{
			space.unmap_write(0x0000, 0x3fff);
			m_bank1->set_base(m);
		}
	}

	if (BIT(m_bank_status, 1) != BIT(m_bank_old, 1))
	{
		if (BIT(m_bank_status, 1))
		{
			space.unmap_write(0xe000, 0xffff);
			space.install_read_handler (0xe000, 0xffff, read8sm_delegate(*this, FUNC(ondra_state::keyboard_r)));
		}
		else
		{
			space.install_readwrite_bank(0xe000, 0xffff, "bank3");
			m_bank3->set_base(r + 0xe000);
		}
	}

	m_bank_old = m_bank_status;
}

/*
0 - video on/off
1 - banking
2 - banking
3 - cassette out
4 - A0 on pits
5 - A1 on pits */
void ondra_state::port03_w(u8 data)
{
	if (BIT(data, 1, 2) != m_bank_status)
	{
		m_bank_status = BIT(data, 1, 2);
		update_banks();
	}

	m_video_enable = BIT(data, 0);
	m_cassette->output(BIT(data, 3) ? -1.0 : +1.0);
}


// external connection
u8 ondra_state::port09_r()
{
	return 0xff;
}

/*
0 - a LED next to keyboard
1 - a LED next to keyboard
2 - external
3 - external
4 - cassette relay
5 - speaker
6 - speaker
7 - speaker */
void ondra_state::port0a_w(u8 data)
{
	static u16 tones[8] = { 0, 110, 156, 220, 311, 440, 622, 880 };  // a guess

	m_cassette->change_state(BIT(data,4) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
	u16 tone = tones[BIT(data, 5, 3)];
	m_beep->set_state(tone? 1 : 0);
	if (tone)
		m_beep->set_clock(tone);
}

void ondra_state::machine_reset()
{
	m_beep->set_state(0);
	m_video_enable = 0;
	m_bank_status = 0;
	m_bank_old = 0xff;
	update_banks();
}

void ondra_state::machine_start()
{
	save_item(NAME(m_video_enable));
	save_item(NAME(m_bank_status));
	save_item(NAME(m_bank_old));
	membank("bank2")->set_base(m_ram->pointer() + 0x4000);
}