--- nono/lib/textscreen.h 2026/04/29 17:04:31 1.1.1.2 +++ nono/lib/textscreen.h 2026/04/29 17:04:37 1.1.1.4 @@ -1,19 +1,39 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #pragma once +#include "header.h" + // 属性 -enum TA { - Normal = 0x00 << 8, - // On, Off, Disable は3ビットを使った状態値。 - // これらが実際どう表現されるかはデバイスによる。 - On = 0x01 << 8, // ビットとかがオンであることを示す - Off = 0x02 << 8, // ビットとかがオフであることを示す - Disable = 0x03 << 8, // 機能などが無効であることを示す - Em = 0x04 << 8, // 値の変化など強調することを示す +class TA +{ + public: + enum TextAttr : uint { + Normal = 0x00 << 8, + // On, Off, Disable は3ビットを使った状態値。 + // これらが実際どう表現されるかはデバイスによる。 + On = 0x01 << 8, // ビットとかがオンであることを示す + Off = 0x02 << 8, // ビットとかがオフであることを示す + Disable = 0x03 << 8, // 機能などが無効であることを示す + Em = 0x04 << 8, // 値の変化など強調することを示す + } attr {}; + + TA() { } + TA(TextAttr attr_) : attr(attr_) { } + + // uint へのキャスト + operator uint() const { + return (uint)attr; + } + + // val によって On か Off を返す + static const TA OnOff(bool val) { + return (val) ? TA::On : TA::Off; + } }; // @@ -39,32 +59,52 @@ class TextScreen // 初期化 void Init(int col, int row); - // 折り返しモードかどうか - bool foldmode {}; - - // クリア + // 画面をクリアして、カーソルをホームポジションに移動 void Clear(); // 現在位置を移動 - void Locate(int x, int y); + void Locate(int x, int y) { + X = x; + Y = y; + } // 現在位置に1文字出力 (上位バイトは属性) - void Putc(uint16 ch); + // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。 + virtual void Putc(uint16 ch); - // 現在位置に字列を出力 + // 現在位置に文字列を出力 + // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。 void Puts(const char *str); // 現在位置に指定の属性で文字列を出力 - void Puts(uint attr, const char *str); + // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。 + void Puts(TA attr, const char *str); + + // 座標を指定して文字列を出力 + // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。 + void Puts(int x, int y, const char *str) { + Locate(x, y); + Puts(str); + } + + // 座標と属性を指定して、文字列を出力 + // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。 + void Puts(int x, int y, TA attr, const char *str) { + Locate(x, y); + Puts(attr, str); + } // 現在位置に属性なしで書式付き文字列を出力 + // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。 void Print(const char *fmt, ...) __printflike(2, 3); // 座標を指定して属性なしで書式付き文字列を出力 + // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。 void Print(int x, int y, const char *fmt, ...) __printflike(4, 5); // 座標と属性を指定して、書式付き文字列を出力 - void Print(int x, int y, uint attr, const char *fmt, ...) + // 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。 + void Print(int x, int y, TA attr, const char *fmt, ...) __printflike(5, 6); // バッファアドレスを取得。(描画デバイス向け) @@ -86,10 +126,13 @@ class TextScreen // 行数を取得 int GetRow() const { return row; } - private: - // 改行(次の行の左端に移動) - void CRLF(); + // ユーザ定義の引数 + // ご自由にお使いください。例えばモニタの出力開始オフセットやアドレス + // など、呼び出し側が設定して書き出す側がそれに従った内容を出力する + // ような用途。 + uint64 userdata = 0; + protected: // バッファ (幅x高さちょうどの長さ、ゼロ終端文字列ではない) // 上位8ビットは属性、下位8ビットが文字コード。 std::unique_ptr textbuf {}; @@ -106,3 +149,40 @@ class TextScreen // カーソル Y 座標 int Y = 0; }; + +// +// テキストコンソール +// +class TextConsole : public TextScreen +{ + using inherited = TextScreen; + public: + TextConsole(); + virtual ~TextConsole() override; + + // 現在位置に1文字出力 (上位バイトは属性) + // 出力後カーソルは移動する。右端で改行、下端で行スクロールが起きる。 + void Putc(uint16 ch) override; + + private: + // 改行(次の行の左端に移動) + void CRLF(); +}; + +// +// モニターインタフェース +// +// モニターされる側はこのインタフェースを実装すること。 +// +class IMonitor +{ + public: + // 自身の現在の状態を TextScreen に書き出す + virtual void MonitorUpdate(TextScreen&) = 0; + + // このモニターが必要とするサイズ(桁数×行数)を取得する + virtual nnSize GetMonitorSize() = 0; + + // デストラクタ + virtual ~IMonitor() { } +};