1: 2007-01-22 (月) 22:36:46 |
2: 2007-01-23 (火) 01:19:11 |
| | | |
| ***まずは・・・ [#oeb14c1c] | | ***まずは・・・ [#oeb14c1c] |
- | P338。ここからコンソールは作られているよね。(そして最後には、console.cに分離されている。) | + | P338。ここからコンソールは作られているよね。 |
| | | |
- | さっそくconsole.cを見ていると・・・ | + | コンソールを作っているのは、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_x = 8; |
| cons.cur_y = 28; | | 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あたりから続いているスクロール等の部分をこれら変数で計算させるようにする。 |
| + | |
| + | ***右端限界点 [#t7ed87db] |
| + | 現在の仕様では、一行の限界に達すると意向入力できなくしている。この数値はconsole.cの上のほうの char cmdline[30]; でおこなっているので、この30を cons->chr_x に書き換えておけばよい。(ただし、その後でcons_chr_xを定義しているので、移動を忘れずに) |
| + | |
| + | |
| + | ***スクロール [#bf3a6bed] |
| + | スクロールは 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; |
| + | } |
| + | |
| + | ***ウィンドゥを移動すると乱れる [#o824c76a] |
| + | ウィンドゥを描画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) ); |
| + | |
| + | |
| + | |
| + | ***でけた〜!! (^^ [#tc27c71c] |
| + | |
| + | ウチではVESA対応で640x480なので、 50x20くらいが使いやすいかな??? |
| + | |
| + | #ref(console.gif) |