雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。

THE-BBLのコンソールは小さいよね?。もっと大きくしたいなぁ。

とりあえずVGA相当。80x24で作ってみよう。

まずは・・・ anchor.png Edit

P338。ここからコンソールは作られているよね。

コンソールを作っているのは、bootpac.c内にある*open_console関数。

さっそく見ていると・・・あったあった。

	sheet_setbuf(sht, buf, 256, 165, -1); /* 透明色なし */
	make_window8(buf, 256, 165, "console", 0);
	make_textbox8(sht, 8, 28, 240, 128, COL8_000000);

在来のカーソルは、8x28。これを、とりあえず倍にしてみよう。

	sheet_setbuf(sht, buf, 512, 330, -1); /* 透明色なし */
	make_window8(buf, 512, 330, "console", 0);
	make_textbox8(sht, 8, 28, 480, 256, COL8_000000);

これをさっそく変更してみる。

・・・しかし、これだけじゃまったくうまくいかないんだよね。(^^

このコンソールはわりと決め打ちで窓やバッファが書かれている。将来、これを可変式にするなんてこともあるかもしれない。そこで、コンソール構造体そのものに、「文字数」を定義できるようにしてみる。

まず、CONSOLE構造体の定義はbootpac.h内で定義されているので、これにchr_x、chr_yと いう変数を搭載する。(chr。キャラクタでいくつかの意味のつもり)

さらに、OSのディフォルト値も決めておこう。これもbootpac.hに書いておこう。(とりあえず、20x16にしておこうか)

/* console.c */
struct CONSOLE {
	struct SHEET *sht;
	int cur_x, cur_y, cur_c;
	struct TIMER *timer;
 int chr_x,chr_y;
};
#define CHRX_DEF 20
#define CHRY_DEF 16

この初期値から計算して、初期のウィンドゥを作らせてみよう。まず、先のbootpac.cの部分。主役は内部のテキストボックス。文字の大きさは8x16だから、ここは

	sheet_setbuf(sht, buf, CHRX_DEF * 8 + 16, CHRY_DEF * 16+37, -1); /* 透明色なし */
	make_window8(buf, CHRX_DEF * 8 + 16, CHRY_DEF * 16+37, "console", 0);
	make_textbox8(sht, 8, 28, CHRX_DEF * 8, CHRY_DEF * 16, COL8_000000);

この変更でかなりうまくいったように見えるが、dirなどをするとすぐにボロがでる。内部の各所動作部が固定値になっているためだ。

まず最初に、CONSOLE構造体の定義時に、現在(とりあえずディフォルト値)の大きさを設定しておく。

console.c
	cons.sht = sheet;
	cons.cur_x =  8;
	cons.cur_y = 28;
	cons.cur_c = -1;
	cons.chr_x = CHRX_DEF; /*これ*/
	cons.chr_y = CHRY_DEF;/*これ*/
	task->cons = &cons;
	task->cmdline = cmdline;

あとは、P343あたりから続いているスクロール等の部分をこれら変数で計算させるようにする。

Page Top

右端限界点 anchor.png Edit

現在の仕様では、一行の限界に達すると意向入力できなくしている。この数値はconsole.cの上のほうの char cmdline[30]; でおこなっているので、この30を cons->chr_x に書き換えておけばよい。(ただし、その後でcons_chr_xを定義しているので、移動を忘れずに)

Page Top

スクロール anchor.png Edit

スクロールは cons_newline関数で処理している。決め打ちの値を修正すればいい。

void cons_newline(struct CONSOLE *cons)
{
	int x, y;
	struct SHEET *sheet = cons->sht;
	struct TASK *task = task_now();
	if (cons->cur_y < 28 + (cons->chr_y -1) * 16) {
		cons->cur_y += 16; /* 次の行へ */
	} else {
		/* スクロール */
		if (sheet != 0) {
			for (y = 28; y < 28 + (cons->chr_y -1) * 16; y++) {
				for (x = 8; x < 8 + cons->chr_x * 8; x++) {
					sheet->buf[x + y * sheet->bxsize] = sheet->buf[x + (y + 16) * sheet->bxsize];
				}
			}
			for (y = 28 + (cons->chr_y -1) * 16; y < 28 + cons->chr_y * 16; y++) {
				for (x = 8; x < 8 + cons->chr_x * 8; x++) {
					sheet->buf[x + y * sheet->bxsize] = COL8_000000;
				}
			}
			sheet_refresh(sheet, 8, 28, 8 + cons->chr_x * 8, 28 + cons->chr_y * 16);
		}
	}
	cons->cur_x = 8;
	if (task->langmode == 1 && task->langbyte1 != 0) {
		cons->cur_x = 16;
	}
	return;
}
Page Top

ウィンドゥを移動すると乱れる anchor.png Edit

ウィンドゥを描画and再描画している値がずれるから。通常これは、bootpack.cのopen_console関数内でバッファを確保しているのだが、この値がずれるため。

unsigned char *buf = (unsigned char *) memman_alloc_4k(memman, 256 * 165 );

                   ↓

unsigned char *buf = (unsigned char *) memman_alloc_4k(memman, (CHRX_DEF * 8 + 16)*(CHRY_DEF * 16+37) );
Page Top

折り返し文字の表示時、デスクトップにゴミが出る anchor.png Edit

たとえば「AAAAAAA・・・・」なんて文字を表示するプログラムを作ったとする。 この文字数がなすぎると、当然右の壁に達し、そして次の行に折り返し表示されるのだが、この時にデスクトップの上方にゴミが出る。

Page Top

でけた〜!! (^^ anchor.png Edit

ウチではVESA対応で640x480なので、 50x20くらいが使いやすいかな???


最終更新: 2024-01-06 (土) 22:39:13 (JST) (110d) by