summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/mz80.cpp
blob: d1a5a42c1742db332aba4d21f6455ece01bb1764 (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
// license:BSD-3-Clause
// copyright-holders:Miodrag Milanovic
/***************************************************************************

        MZ80 driver by Miodrag Milanovic

        22/11/2008 Preliminary driver.

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

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


/* Driver initialization */
void mz80_state::init_mz80k()
{
}

void mz80_state::machine_reset()
{
	m_mz80k_tempo_strobe = 0;
	m_mz80k_vertical = 0;
	m_mz80k_cursor_cnt = 0;
	m_mz80k_keyboard_line = 0;
}


uint8_t mz80_state::mz80k_8255_portb_r()
{
	char kbdrow[8];
	sprintf(kbdrow,"LINE%d", m_mz80k_keyboard_line);
	if (m_mz80k_keyboard_line > 9)
		return 0xff;
	else
		return ioport(kbdrow)->read();
}

uint8_t mz80_state::mz80k_8255_portc_r()
{
	uint8_t val = 0;
	val |= m_mz80k_vertical ? 0x80 : 0x00;
	val |= ((m_mz80k_cursor_cnt & 0x3f) > 31) ? 0x40 : 0x00;
	val |= (m_cassette->get_state() & CASSETTE_MASK_UISTATE)!= CASSETTE_STOPPED ? 0x10 : 0x00;

	if (m_cassette->input() > 0.00)
		val |= 0x20;

	return val;
}

void mz80_state::mz80k_8255_porta_w(uint8_t data)
{
	m_mz80k_keyboard_line = data & 0x0f;
}

void mz80_state::mz80k_8255_portc_w(uint8_t data)
{
//  logerror("mz80k_8255_portc_w %02x\n",data);
	m_cassette->output(BIT(data, 1) ? -1.0 : +1.0);
}


WRITE_LINE_MEMBER( mz80_state::pit_out0_changed )
{
	if(!m_prev_state && state)
		m_speaker_level++;

	m_prev_state = state;
	m_speaker->level_w(BIT(m_speaker_level, 1));
}

WRITE_LINE_MEMBER( mz80_state::pit_out2_changed )
{
	m_maincpu->set_input_line(0, HOLD_LINE);
}

uint8_t mz80_state::mz80k_strobe_r()
{
	return 0x7e | (uint8_t)m_mz80k_tempo_strobe;
}

void mz80_state::mz80k_strobe_w(uint8_t data)
{
	m_pit->write_gate0(BIT(data, 0));
}