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
130
131
132
|
// license:BSD-3-Clause
// copyright-holders:Sandro Ronco
/**********************************************************************
Hitachi HD61202 LCD Driver
**********************************************************************/
#include "emu.h"
#include "hd61202.h"
#include "screen.h"
DEFINE_DEVICE_TYPE(HD61202, hd61202_device, "hd61202", "Hitachi HD61202 LCD Driver")
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// hd61202_device - constructor
//-------------------------------------------------
hd61202_device::hd61202_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, HD61202, tag, owner, clock)
, m_screen_update_cb(*this)
{
}
void hd61202_device::device_resolve_objects()
{
m_screen_update_cb.resolve();
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void hd61202_device::device_start()
{
save_item(NAME(m_bf));
save_item(NAME(m_lcd_on));
save_item(NAME(m_out_data));
save_item(NAME(m_page));
save_item(NAME(m_addr));
save_item(NAME(m_start_line));
save_item(NAME(m_ddr));
}
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
void hd61202_device::device_reset()
{
m_bf = 0;
m_lcd_on = 0;
m_out_data = 0;
m_page = 0;
m_addr = 0;
m_start_line = 0;
std::fill(std::begin(m_ddr), std::end(m_ddr), 0);
}
//-------------------------------------------------
// status_r - status register read
//-------------------------------------------------
uint8_t hd61202_device::status_r()
{
// x--- ---- Busy
// --x- ---- LCD on/off
uint8_t data = 0;
data |= (m_lcd_on << 5);
data |= (m_bf << 7);
return data;
}
//-------------------------------------------------
// control_w - instruction register write
//-------------------------------------------------
void hd61202_device::control_w(uint8_t data)
{
if ((data & 0xfe) == 0x3e) // Display on/off
m_lcd_on = data & 0x01;
else if ((data & 0xf8) == 0xb8) // Set page
m_page = data & 0x07;
else if ((data & 0xc0) == 0x40) // Set address
m_addr = data & 0x3f;
else if ((data & 0xc0) == 0xc0) // Set display start line
m_start_line = data & 0x3f;
}
//-------------------------------------------------
// data_r - data register read
//-------------------------------------------------
uint8_t hd61202_device::data_r()
{
uint8_t data = m_out_data;
m_out_data = m_ddr[(m_page * 0x40 + m_addr) & 0x1ff];
m_addr++;
return data;
}
//-------------------------------------------------
// data_w - data register write
//-------------------------------------------------
void hd61202_device::data_w(uint8_t data)
{
m_ddr[(m_page * 0x40 + m_addr) & 0x1ff] = data;
m_addr++;
}
//-------------------------------------------------
// update_screen - update screen
//-------------------------------------------------
uint32_t hd61202_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
return m_screen_update_cb(bitmap, cliprect, m_lcd_on, m_start_line, m_ddr);
}
|