|
|
1.1 root 1: //
2: // nono
1.1.1.3 root 3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
1.1 root 5: //
6:
7: #pragma once
8:
9: #include "device.h"
10:
11: class LCDDevice : public Device
12: {
1.1.1.3 root 13: using inherited = Device;
1.1 root 14: public:
15: LCDDevice();
1.1.1.3 root 16: ~LCDDevice() override;
1.1 root 17:
1.1.1.3 root 18: bool PowerOff() override;
1.1.1.4 ! root 19: void MonitorUpdate(TextScreen&) override;
1.1 root 20:
21: // リセット信号はない
22:
1.1.1.3 root 23: // R/~W を val にセットする。%1=R、%0=W
1.1 root 24: void SetRW(bool val);
25:
1.1.1.3 root 26: // RS を val にセットする。
1.1 root 27: // %0=コマンド(W)/ステータス(R)レジスタ
28: // %1=データレジスタ
29: void SetRS(int);
30:
1.1.1.3 root 31: // E を val にセットする。
1.1 root 32: void SetE(bool);
33:
34: // E, RS, R/W 線の状態を取得する。
35: // PIO1 のポートC 読み込み用。
36: uint8 Get() const;
37:
1.1.1.3 root 38: // 読み込む。
1.1 root 39: uint8 Read();
40:
1.1.1.3 root 41: // 書き込む。
1.1 root 42: void Write(uint8 data);
43:
1.1.1.2 root 44: // PIO1 のポートA ピーク用
45: uint8 Peek() const;
46:
1.1.1.4 ! root 47: // バッファを取得 (内容表示用)
! 48: const uint8 *GetDDRAM() const { return ddram; }
! 49:
! 50: // フォントを取得
! 51: const uint8 *GetFont(int ch) const;
! 52:
! 53: // 更新カウンタ取得
! 54: uint32 GetCounter() const { return update; }
! 55:
1.1 root 56: private:
57: bool en = false; // Enable
58: bool rw = false; // R/~W
59: int rs = 0; // レジスタセレクト
60:
61: bool addr_inc = false; // アドレス・インクリメント
62: bool disp_char = false; // 文字表示をするか
63: int addr = 0; // アドレスカウンタ
1.1.1.4 ! root 64:
! 65: // CGRAM と DDRAM はコマンドでのアドレス指定と同じ位置にマップさせておく。
! 66: // そのため先頭の 64(0x40)バイトは使わず肥やしにする。
! 67: union {
! 68: struct {
! 69: uint8 unused[0x40];
! 70: uint8 cgram[0x40];
! 71: uint8 ddram[0x80];
! 72: };
! 73: uint8 ram[256] {};
! 74: };
! 75:
! 76: // RAM 更新カウンタ。
! 77: // CGRAM や DDRAM など表示内容が変化するごとに 1 ずつ上がるカウンタ。
! 78: // GUI 側にて前回描画時のカウンタと比較して異なっていれば前回から
! 79: // 何かしらの更新があったものとして再描画する。どこがどう変化したかの
! 80: // 情報は持っていない。
! 81: // XXX もうちょっといい方法
! 82: // XXX 電源オフどうするか
! 83: uint32 update = 0;
! 84:
! 85: static const uint8 CGROM[12 * 16 * 8];
1.1 root 86: };
87:
1.1.1.2 root 88: extern std::unique_ptr<LCDDevice> gLCD;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.