|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2018 [email protected]
4: //
5:
6: #include "lcd.h"
7:
8: LCDDevice *gLCD;
9:
10: LCDDevice::LCDDevice()
11: {
12: logname = "lcd";
13: devname = "LCD(HD44780)";
14: monitor.Init(16, 2);
15: }
16:
17: LCDDevice::~LCDDevice()
18: {
19: }
20:
21: bool
22: LCDDevice::PowerOff()
23: {
24: // オフをどう表現するかはあるが、とりあえずモニタ画面での表示を消すのが
25: // 主目的なので空白で埋める。
26: memset(ddram, 0x20, sizeof(ddram));
27: return true;
28: }
29:
30: void
31: LCDDevice::SetRW(bool val)
32: {
33: rw = val;
34: putlog(2, "R/W = %c", val ? 'R' : 'W');
35: }
36:
37: void
38: LCDDevice::SetRS(int val)
39: {
40: rs = val;
41: putlog(2, "RS = %d", rs);
42: }
43:
44: void
45: LCDDevice::SetE(bool val)
46: {
47: en = val;
48: putlog(2, "E = %d", en);
49: }
50:
51: // E, RS, R/W 線の状態を取得する (PIO1 のポートC 読み込み用)
52: uint8
53: LCDDevice::Get() const
54: {
55: return (en ? 0x80 : 0)
56: | (rs >> 6)
57: | (rw ? 0x20 : 0);
58: }
59:
60: uint8
61: LCDDevice::Read()
62: {
63: if (en == false || rw == false) {
64: // XXX どうなるんだろ
65: return 0xff;
66: }
67: if (rs == 0) {
68: // ステータスレジスタの読み込み
69: // B A A A A A A A
70: // | +-+-+-+-+-+-+-- アドレスカウンタ
71: // +---------------- ビジーフラグ %1=BUSY
72:
73: // XXX ビジーは未実装
74: return addr;
75: } else {
76: putlog(0, "未実装データ読み込み");
77: }
78: return 0xff;
79: }
80:
81: void
82: LCDDevice::Write(uint8 data)
83: {
84: if (en == false || rw == true) {
85: // どうなるんだろ
86: return;
87: }
88: if (rs == 0) {
89: // コマンド書き込み
90: if ((data & 0x80)) {
91: addr = data & 0x7f;
92: putlog(1, "DDRAM アドレスセット $%02x", addr);
93: } else if ((data & 0x40)) {
94: putlog(0, "コマンド書き込み $%02x CGRAM アドレスセット(未実装)",
95: data);
96: } else if ((data & 0x20)) {
97: // ファンクション・セット
98: // 0x38 (8ビットバス、2行表示、8ライン/行)モードのみサポート
99: if (data != 0x38) {
100: putlog(0, "コマンド書き込み $%02x ファンクションセット(未実装)",
101: data);
102: }
103: } else if ((data & 0x10)) {
104: // カーソル移動
105: putlog(0, "コマンド書き込み $%02x カーソル移動(未実装)", data);
106: } else if ((data & 0x08)) {
107: // 表示ON/OFF
108: // 文字表示 ON/OFF のみサポート
109: disp_char = (data & 0x04);
110: // XXX それ以外は未サポート
111: } else if ((data & 0x04)) {
112: // エントリモード
113: addr_inc = (data & 0x02);
114: // XXX 表示シフトは未サポート
115: } else if ((data & 0x02)) {
116: // カーソルホーム
117: addr = 0;
118: } else if ((data & 0x01)) {
119: // 表示クリア
120: memset(ddram, 0x20, sizeof(ddram));
121: addr = 0;
122: } else {
123: // $00 が書き込まれるんだけど、データシートにはないんだよね。
124: // 無視していいかな。
125: putlog(2, "未定義書き込み $%02x", data);
126: }
127: } else {
128: putlog(1, "データ書き込み $%02x (x=%2d,y=%d)", data,
129: (addr & 0x3f), (addr / 0x40));
130: ddram[addr] = data;
131: // アドレス更新
132: // 1行0x40バイト分あるが実際には0x27までしか存在していない
133: if (addr_inc) {
134: addr++;
135: if (addr == 0x28)
136: addr = 0x40;
137: if (addr == 0x68)
138: addr = 0;
139: } else {
140: addr--;
141: if (addr == -1)
142: addr = 0x67;
143: if (addr == 0x3f)
144: addr = 0x27;
145: }
146: }
147: }
148:
149: bool
150: LCDDevice::MonitorUpdate()
151: {
152: char buf[17];
153:
154: monitor.Clear();
155:
156: for (int y = 0; y < 2; y++) {
157: memcpy(buf, &ddram[y * 0x40], 16);
158: buf[16] = '\0';
159: monitor.Print(0, y, "%s", buf);
160: }
161: return true;
162: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.