「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;
}
----