OS自作入門 五日目

「OS自作入門 五日目」の編集履歴(バックアップ)一覧はこちら

OS自作入門 五日目 - (2007/07/09 (月) 21:51:49) の1つ前との変更点

追加された行は緑色になります。

削除された行は赤色になります。

*OS自作入門5日目のまとめ 自分のためのまとめなので、他の人には意味不かも。 **構造体(struct) struct BOOTINFO { char cyls, leds, vmode, reserve; short scrnx, scrny; char *vram; } このように型宣言する。使いかたは struct BOOTINFO *binfo; としてBOOTINFO型のポインタを定義、 binfo = (struct BOOTINFO *) 0x0ff0; としてアドレスを格納。参照は xsize = (*binfo).sccrnx; のようにドットを用いる。 **文字の描画 フォントデータ↓ ******** *** *** *** *** *** *** *** *** ** ** ** ** ** ** ** ** ** ** ** ** * * * **** * * **** * * **** * ** ******** ******** たとえばこれがAになっている。アスキーアートですね。これが連続したデータ列となっているような感じ。それでこれが↓のように 11111111 11100111 11100111 11100111 11100111 11011011 11011011 11011011 11011011 10000001 10111101 10111101 10111101 00011000 11111111 11111111 1と0の羅列だとすれば、バイナリデータとして扱うことができる。このデータは1列8ビットで16列ある。なので一文字16バイトのデータ。これを描画するには、各列について以下の処理を行う。 例えば1列目は 11111111 10000000 AND) 10000000 ANDをとった結果を左上の画素から順に保存していく。 ----
*OS自作入門5日目のまとめ 自分のためのまとめなので、他の人には意味不かも。 **構造体(struct) struct BOOTINFO { char cyls, leds, vmode, reserve; short scrnx, scrny; char *vram; } このように型宣言する。使いかたは struct BOOTINFO *binfo; としてBOOTINFO型のポインタを定義、 binfo = (struct BOOTINFO *) 0x0ff0; としてアドレスを格納。参照は xsize = (*binfo).sccrnx; のようにドットを用いる。 **文字の描画 フォントデータ↓ ******** *** *** *** *** *** *** *** *** ** ** ** ** ** ** ** ** ** ** ** ** * * * **** * * **** * * **** * ** ******** ******** たとえばこれがAになっている。アスキーアートですね。これが連続したデータ列となっているような感じ。それでこれが↓のように 00000000 00011000 00011000 00011000 00011000 00100100 00100100 00100100 00100100 01111110 01000010 01000010 01000010 11100111 00000000 00000000 1と0の羅列だとすれば、バイナリデータとして扱うことができる。各ビットを画面上の画素として当てはめて、1のところに対応する画素には色データを入れれば文字が描画できる。 このデータは1列8ビットで16列ある。なので一文字16バイトのデータ。これを描画するには、各列について以下の処理を行う。 例えば1列目の1ビット目は |0|0000000 |1|0000000 AND) |0|0000000 次に1列目の2ビット目は 0|0|000000 0|1|000000 AND) 0|0|000000 これを繰り返し一列目が終わるまで繰り返す。ANDをとることで、そのビットのみの1か0の判定を行う。もしANDをとった結果が0であれば、そのビットは0ということなので、その画素に対応するアドレスには何も値を入れない。もし0でなければ、そのビットが1ということになるので、その画素に対応するアドレスに値を入れる。具体的には以下の様にする。 void putfont8(char *vram, int xsize, int x, int y, char c, char *font) { int i; char *p, d /*date*/; for(i=0; i < 16, i++)){ p = vram + (y+i) * xsize + x; d=font[i]; if((d & 0x80)!= 0){p[0]=c;} if((d & 0x80)!= 0){p[1]=c;} if((d & 0x80)!= 0){p[2]=c;} if((d & 0x80)!= 0){p[3]=c;} if((d & 0x80)!= 0){p[4]=c;} if((d & 0x80)!= 0){p[5]=c;} if((d & 0x80)!= 0){p[6]=c;} if((d & 0x80)!= 0){p[7]=c;} } return; } ----

表示オプション

横に並べて表示:
変化行の前後のみ表示:
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。