「OSを作れる」「仕組みが学べる」という言葉に惹かれて、プログラミング軽くかじった程度の私が、OSを自作しようと思い立ちました。

2019年の目標の一つは『OS自作入門でOSを作る』です。

目標を次のように設定。

「2019年3月31日までに、完読してわからないなりにもOSを自作してみよう。」

 

・・・・・

本日は、文字を画面に書けるように頑張ります。

 

◆ harib02a (起動情報の受け取り)

起動情報を “asmhead.nas” から受け取れるように変更。

binfoはbootinfo、scrnはscreen(画面)の略。どちらも “asmhead.nas” に書かれている。

背景画面を書く部分は、別関数「init_screen」として独立。

 

◆ harib02b (構造体を使う)

構造体:最初に新しい変数型で、abcという変数を一つ作って、その中の細かい変数にいろんな値を入れる。

構造体の中の細かい変数は、構造体変数名のあとにピリオドをつけて、それで中身の変数名を書く。

 

これをポインタ化したものが、本項での使い方。

「struct命令」:変数のかたまりを「struct BOOTINFO」という名前で宣言。

 

ポインタ化は、変数型の名前 *番地変数名; (今回の変数型は struct BOOTINFO、変数名が binfoなので)

struct BOOTINFO *binfo;

番地変数になったので、番地をセットする。警告がうるさいのでキャストをつけている。

binfo = (struct BOOTINFO *) 0x0ff0;

ーxsize = (*binfo). scrnx;

カッコを省略するとコンパイラは *(binfo.scrnx)と認識してエラーとなる。

 

◆ harib02c (矢印表記->を使う)

矢印表記(->)を使うと、xsize  = (*binfo).scrnx;が次のように書ける。

xsize = binfo->scrnx;

もっと簡単にしたいので、xsizeという関数を使わず、直接 binfo->scrnxを使う。

 

◆ haribo2d (文字を出す)

文字を 8 x 16 の長方形の画素の集まりで書けるとすると、左のようなデータを考えて、0 と 1に置き換えることができる。(8ビットで 1バイトなので、1文字は 16バイト)

文字のためのデータをフォント(font)データと言う。

 

 

プログラムに書く方法。16進数に置き換え。

 

8画素を書くプログラムをfor文で16回回す。

もともとは、{ vram[(y + i)  * xsize + x + 0 ] = c } と書いたものを

 p = vram + (y + i) * xsize + x ; と置き換えている。

「if文」は、()内の条件式を調べて、条件が成り立っていれば、{}中を実行する。成り立っていなければ何もしない。

「&」は、AND演算子。0x80は2進数で10000000のことなので、ANDした結果が0ならば、dの一番左のビットが0ということ。同様に、0x40は01000000、0x20は00100000、0x10は00010000。

「!=」は「等しくない」という意味。

 

あー、文字が書けてる・・・。

 

普段何気なく書いている文字も、表示するだけで、こんなことをしているのですね。しかもたった1文字。

すごいなぁ、作っている人。

 

以上。

スポンサーリンク