THE-BBLのコンソールは小さいよね?。もっと大きくしたいなぁ。
とりあえずVGA相当。80x24で作ってみよう。
まずは・・・
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あたりから続いているスクロール等の部分をこれら変数で計算させるようにする。
右端限界点
現在の仕様では、一行の限界に達すると意向入力できなくしている。この数値はconsole.cの上のほうの char cmdline[30]; でおこなっているので、この30を cons->chr_x に書き換えておけばよい。(ただし、その後でcons_chr_xを定義しているので、移動を忘れずに)
スクロール
スクロールは 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; }
ウィンドゥを移動すると乱れる
ウィンドゥを描画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) );