--- nono/lib/textscreen.h 2026/04/29 17:05:08 1.1.1.9 +++ nono/lib/textscreen.h 2026/04/29 17:05:22 1.1.1.13 @@ -18,18 +18,28 @@ class TA { public: enum TextAttr : uint { - Normal = 0x00 << 8, - // スイッチ用機能ビット - // On, Off, Disable は2ビットを使った3状態値。 - // これらが実際どう表現されるかはデバイスによる。 - On = 0x01 << 8, // ビットとかがオンであることを示す - Off = 0x02 << 8, // ビットとかがオフであることを示す - Disable = 0x03 << 8, // 機能などが無効であることを示す - // On, Off, Disable のスイッチ用機能のビットマスク - SwitchMask = 0x03 << 8, - - // Em は独立したビットによる状態。 - Em = 0x04 << 8, // 値の変化など強調することを示す + // 文字(2バイト)の上位バイトが属性。 + // + // 15 14 13 12 11 10 9 8 + // +---+---+---+---+---+---+---+---+ + // | B | - | Color Code | + // +---+---+---+---+---+---+---+---+ + // + // B はボールド。 + // Color Code は 4bit の前景色・背景色ペアの固定パレット。 + Normal = 0x00 << 8, // 通常描画色 + Reverse = 0x01 << 8, // 反転、背景黒 + Off = 0x02 << 8, // オフを示す + Disable = 0x03 << 8, // 無効を示す + ReverseRed = 0x04 << 8, // 反転、背景赤 + ReverseGreen = 0x05 << 8, // 反転、背景緑 + ReverseOrange = 0x06 << 8, // 反転、背景オレンジ + + Bold = 0x80 << 8, // ボールド + + // エイリアス + On = Reverse, // オンは反転で表現している + Em = Bold | Normal, // 通常色 + 強調のショートカット } attr {}; TA() { } @@ -42,21 +52,6 @@ class TA return (uint)attr; } - // スイッチ用機能ビット部を返す。 - TextAttr GetSwitch() const { - return (TextAttr)(attr & SwitchMask); - } - - // スイッチ用機能ビット部を設定する。 - void SetSwitch(TextAttr a) { - attr = (TextAttr)((attr & ~SwitchMask) | (a & SwitchMask)); - } - - // スイッチ用機能ビットの状態を調べる。 - bool IsOn() const { return GetSwitch() == TA::On; } - bool IsOff() const { return GetSwitch() == TA::Off; } - bool IsDisable() const { return GetSwitch() == TA::Disable; } - // static member // val によって On か Off を返す static const TA OnOff(bool val) { @@ -162,6 +157,18 @@ class TextScreen // 現在位置に1文字出力 (上位バイトは属性) void Putc(uint16 ch); + // 座標を指定して1文字出力 (上位バイトは属性) + void Putc(int x, int y, uint16 ch) { + Locate(x, y); + Putc(ch); + } + + // 座標と属性を指定して1文字出力 + void Putc(int x, int y, TA attr, uint16 ch) { + Locate(x, y); + Putc((uint)attr | ch); + } + // 現在位置に文字列を出力 void Puts(const char *str); @@ -215,6 +222,9 @@ class TextScreen // 行数を取得 int GetRow() const { return row; } + // 行単位のコピー + void CopyRowsFrom(int dst_y, int row, const TextScreen& src, int src_y); + // ユーザ定義の引数 // ご自由にお使いください。例えばモニタの出力開始オフセットやアドレス // など、呼び出し側が設定して書き出す側がそれに従った内容を出力する