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

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: }

unix.superglobalmegacorp.com

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