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
133
134
135
136
137
138
139
140
141
|
/***************************************************************************
Hitachi HD44780 LCD controller
***************************************************************************/
#pragma once
#ifndef __HD44780_H__
#define __HD44780_H__
#define MCFG_HD44780_ADD( _tag ) \
MCFG_DEVICE_ADD( _tag, HD44780, 0 )
#define MCFG_KS0066_F05_ADD( _tag ) \
MCFG_DEVICE_ADD( _tag, KS0066_F05, 0 )
#define MCFG_HD44780_LCD_SIZE(_lines, _chars) \
hd44780_device::static_set_lcd_size(*device, _lines, _chars);
#define MCFG_HD44780_PIXEL_UPDATE_CB(_cb) \
hd44780_device::static_set_pixel_update_cb(*device, _cb);
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
typedef void (*hd44780_pixel_update_func)(device_t &device, bitmap_ind16 &bitmap, UINT8 line, UINT8 pos, UINT8 y, UINT8 x, int state);
#define HD44780_PIXEL_UPDATE(name) void name(device_t &device, bitmap_ind16 &bitmap, UINT8 line, UINT8 pos, UINT8 y, UINT8 x, int state)
// ======================> hd44780_device
class hd44780_device : public device_t
{
public:
// construction/destruction
hd44780_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
hd44780_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock);
// static configuration helpers
static void static_set_lcd_size(device_t &device, int _lines, int _chars) { hd44780_device &dev=downcast<hd44780_device &>(device); dev.m_lines = _lines; dev.m_chars = _chars; }
static void static_set_pixel_update_cb(device_t &device, hd44780_pixel_update_func _cb) { downcast<hd44780_device &>(device).m_pixel_update_func = _cb; }
// device interface
virtual DECLARE_WRITE8_MEMBER(write);
virtual DECLARE_READ8_MEMBER(read);
virtual DECLARE_WRITE8_MEMBER(control_write);
virtual DECLARE_READ8_MEMBER(control_read);
virtual DECLARE_WRITE8_MEMBER(data_write);
virtual DECLARE_READ8_MEMBER(data_read);
virtual UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
protected:
// device-level overrides
virtual void device_start();
virtual void device_reset();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
// optional information overrides
virtual const rom_entry *device_rom_region() const;
// charset
enum
{
CHARSET_HD44780_A00,
CHARSET_KS0066_F05,
/*
CHARSET_HD44780_A01,
CHARSET_HD44780_A02,
CHARSET_KS0066_F00,
CHARSET_KS0066_F03,
CHARSET_KS0066_F04,
CHARSET_KS0066_F06,
CHARSET_KS0066_F59,
*/
};
void set_charset_type(int type);
private:
// internal helper
void set_busy_flag(UINT16 usec);
void update_ac(int direction);
void update_nibble(int rs, int rw);
void shift_display(int direction);
void pixel_update(bitmap_ind16 &bitmap, UINT8 line, UINT8 pos, UINT8 y, UINT8 x, int state);
// internal state
static const device_timer_id TIMER_BUSY = 0;
static const device_timer_id TIMER_BLINKING = 1;
emu_timer * m_blink_timer;
emu_timer * m_busy_timer;
UINT8 m_lines; // number of lines
UINT8 m_chars; // chars for line
hd44780_pixel_update_func m_pixel_update_func; // pixel update callback
bool m_busy_flag; // busy flag
UINT8 m_ddram[0x80]; // internal display data RAM
UINT8 m_cgram[0x40]; // internal chargen RAM
UINT8 * m_cgrom; // internal chargen ROM
INT8 m_ac; // address counter
UINT8 m_dr; // data register
UINT8 m_ir; // instruction register
UINT8 m_active_ram; // DDRAM or CGRAM
bool m_display_on; // display on/off
bool m_cursor_on; // cursor on/off
bool m_blink_on; // blink on/off
bool m_shift_on; // shift on/off
UINT8 m_disp_shift; // display shift
INT8 m_direction; // auto increment/decrement
UINT8 m_data_len; // interface data length 4 or 8 bit
UINT8 m_num_line; // number of lines
UINT8 m_char_size; // char size 5x8 or 5x10
bool m_blink;
bool m_first_cmd;
int m_rs_state;
int m_rw_state;
bool m_nibble;
int m_charset_type;
enum { DDRAM, CGRAM };
};
// ======================> ks0066_f05_device
class ks0066_f05_device : public hd44780_device
{
public:
// construction/destruction
ks0066_f05_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
};
// device type definition
extern const device_type HD44780;
extern const device_type KS0066_F05;
#endif
|