--- nono/lib/textscreen.cpp 2026/04/29 17:04:37 1.1.1.4 +++ nono/lib/textscreen.cpp 2026/04/29 17:04:54 1.1.1.7 @@ -28,12 +28,16 @@ TextScreen::~TextScreen() // 初期化 void -TextScreen::Init(int arg_col, int arg_row) +TextScreen::Init(int arg_col, int arg_row, ModeKind mode) { + assert(arg_col > 0); + assert(arg_row > 0); + col = arg_col; row = arg_row; + Mode = mode; - textbuf.reset(new uint16 [col * row]); + textbuf.resize(col * row); X = 0; Y = 0; @@ -52,22 +56,50 @@ TextScreen::Clear() Locate(0, 0); } +// 1 行上スクロール +void +TextScreen::ScrollUp() +{ + memmove(&textbuf[0], &textbuf[col], + (row - 1) * col * sizeof(textbuf[0])); + for (int i = 0; i < col; i++) { + textbuf[(row - 1) * col + i] = 0x0020; + } +} + + // 現在のカーソル位置に1文字出力する。 -// 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。 -// XXX どっかで拾えてもいいような void TextScreen::Putc(uint16 ch) { - if (X >= col || Y >= row) { + if (OutOfScreen) { return; } - textbuf[(Y * col) + X] = ch; - X++; + if (ch == '\n') { + CRLF(); + } else { + textbuf[(Y * col) + X] = ch; + Ascend(); + } +} + +// 現在のカーソル位置の文字を取得 +// カーソルは移動する。 +// カーソルが範囲外だったときは 0 を返す。 +uint16 +TextScreen::Getc() +{ + if (OutOfScreen) { + return 0; + } + + uint16 ch = textbuf[(Y * col) + X]; + Ascend(); + return ch; } // テキストスクリーンに文字列を出力する。 -// 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。 void TextScreen::Puts(const char *str) { @@ -77,7 +109,6 @@ TextScreen::Puts(const char *str) } // テキストスクリーンに文字列を出力する。 -// 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。 void TextScreen::Puts(TA attr, const char *str) { @@ -87,7 +118,6 @@ TextScreen::Puts(TA attr, const char *st } // テキストスクリーンの現在位置から書式付き文字列を出力する。 -// 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。 void TextScreen::Print(const char *fmt, ...) { @@ -102,7 +132,6 @@ TextScreen::Print(const char *fmt, ...) } // テキストスクリーンに座標を指定して書式付き文字列を出力する。 -// 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。 void TextScreen::Print(int x, int y, const char *fmt, ...) { @@ -118,7 +147,6 @@ TextScreen::Print(int x, int y, const ch } // テキストスクリーンに座標と属性を指定して、書式付き文字列を出力する。 -// 出力後カーソルは移動する。移動後画面からはみ出しても何もしない。 void TextScreen::Print(int x, int y, TA attr, const char *fmt, ...) { @@ -133,57 +161,27 @@ TextScreen::Print(int x, int y, TA attr, Puts(attr, buf); } -// -// テキストコンソール -// (行折り返しと行送りがある) -// - -// コンストラクタ -TextConsole::TextConsole() - : inherited() +// 現在位置の属性を取得 +// カーソルが画面外の場合は TA::Normal を返す。 +TA +TextScreen::GetAttr() const { -} + if (OutOfScreen) { + return TA::Normal; + } -// デストラクタ -TextConsole::~TextConsole() -{ + return TA(textbuf[(Y * col) + X] & 0xff00); } -// 現在のカーソル位置に1文字出力する。 -// 出力後カーソルは移動する。 -// 移動した結果右にはみ出した場合は次行左端に移動、 -// 下にはみ出した場合はカーソル位置はそのままで上に1行スクロールさせる。 +// 現在位置の属性を attr に設定する。 +// カーソルは移動しない。 void -TextConsole::Putc(uint16 ch) +TextScreen::SetAttr(TA attr) { - if (X >= col || Y >= row) { + if (OutOfScreen) { return; } - if (ch == '\n') { - CRLF(); - } else { - textbuf[(Y * col) + X] = ch; - X++; - - if (X >= col) { - CRLF(); - } - } -} - -// 改行 -void -TextConsole::CRLF() -{ - X = 0; - Y++; - - if (Y >= row) { - // スクロール - memmove(&textbuf[0], &textbuf[col], - (col - 1) * row * sizeof(textbuf[0])); - // カーソル位置は最下行 - Y = row - 1; - } + auto& ch = textbuf[(Y * col) + X]; + ch = (ch & 0xff) | (uint)attr; }