Annotation of nono/vm/lcd.cpp, revision 1.1.1.2

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2018 [email protected]
                      4: //
                      5: 
                      6: #include "lcd.h"
                      7: 
1.1.1.2 ! root        8: std::unique_ptr<LCDDevice> gLCD;
1.1       root        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: 
1.1.1.2 ! root      149: // PIO1 からのピーク用
        !           150: uint8
        !           151: LCDDevice::Peek() const
        !           152: {
        !           153:        if (en == false || rw == false) {
        !           154:                // XXX どうなるんだろ
        !           155:                return 0xff;
        !           156:        }
        !           157:        if (rs == 0) {
        !           158:                return addr;
        !           159:        } else {
        !           160:                // データ読み込みは未実装
        !           161:        }
        !           162:        return 0xff;
        !           163: }
        !           164: 
1.1       root      165: bool
                    166: LCDDevice::MonitorUpdate()
                    167: {
                    168:        char buf[17];
                    169: 
                    170:        monitor.Clear();
                    171: 
                    172:        for (int y = 0; y < 2; y++) {
                    173:                memcpy(buf, &ddram[y * 0x40], 16);
                    174:                buf[16] = '\0';
                    175:                monitor.Print(0, y, "%s", buf);
                    176:        }
                    177:        return true;
                    178: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.