雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。
1: 2007-01-22 (月) 22:36:46 ソース バックアップ No.1 を復元して編集 現: 2024-01-06 (土) 22:39:13 ソース 編集
Line 4: Line 4:
***まずは・・・ [#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) ); 
 + 
 + 
 +***折り返し文字の表示時、デスクトップにゴミが出る [#mf177c14] 
 +たとえば「AAAAAAA・・・・」なんて文字を表示するプログラムを作ったとする。 
 +この文字数がなすぎると、当然右の壁に達し、そして次の行に折り返し表示されるのだが、この時にデスクトップの上方にゴミが出る。 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 +***でけた〜!! (^^ [#tc27c71c] 
 + 
 +ウチではVESA対応で640x480なので、 50x20くらいが使いやすいかな??? 
 + 
 +#ref(console.gif)