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

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

目標を次のように設定。

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

 

・・・・・

C言語を使えるようになり、画面に色をつけられるようになり、シマシマも書けるようになりました。

p.83
OSにしましまなんて必要ないのです。

 

そうではありますが、シマシマでも書けるとうれしい・・・。

 

◆ harib01f (色番号設定)

今回は、まず色の設定をするようです。筆者の独断で決定した16色を設定。

bootpack.cの中身。

 

関数init_paletteを要約すると、

char a[3];

と書くと、aは定数となる。さらに、「RESB 3」が準備される。よって上記の記述は、

a:
RESB 3

char a[3] = { 1, 2, 3 };

とすると、次の記述とほぼ同等。

char a[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;

 

C言語でも、RESB命令の代わりにDB命令を使うように指示する方法がある。それが、宣言の時にstaticをつける方法。unsignedは、「ここで扱っているデータはBYTE(char)だけど、符号(sign)のない数(=0か正の整数)として扱ってくれ。」という指示。

char型の変数は3つモードがある。

  • signed型:-128~127の整数を表す量として計算に使う。
  • unsigned型:0~255の整数を表す量として計算に使う。
  • 特に指定がない型:コンパイラにおまかせ。

0xffを255という最大輝度を表しているので、これを負の数と扱われないようにunsighedモードにしている。

 

次は関数set_paletteについて。

関数 io_out8を何度も呼び出している。io_out8は、装置番号で指定した装置にデータを送る関数。

装置番号 0x03xc8, 0x03xc9 は、リンク先の「ビデオDAコンバータ」を参照。

http://oswiki.osask.jp/?VGA

 

残りの説明部分。

「CLI」:「clear interrupt flag」 割り込みフラグ(interrupt flag)というフラグを0にする命令。
「STI」:「set interrupt flag」割り込みフラグを1にする命令。
CPUに割り込み要求信号が来たときに、すなおに割り込み応対回路が動作するか(割り込みフラグが1)、それともとりあえず無視するか(割り込みフラグが0)。
このフラグを通じて、CPUの動作を設定できる。

「EFLAGS」:「FLAGS」という16ビットのレジスタが拡張された32ビットレジスタ。「FLAGS」はキャリーフラグや割り込みフラグが詰まったレジスタ。割り込みフラグを調べるためには、EFLAGSを読み込んでチェックする。

io_load_eflagsという関数で、eflagsの値を読み取っている。その処理が終わったあとで、io_store_eflagsという関数でeflagsをEFLAGSへ代入して元通りにしている。

これらはC言語ではできない。アセンブラ。

 

ということで、naskfunc.nasの中身。

 

「PUSHFD」:「push flags double-word」フラグをダブルワードで(スタックに)押し込む。PUSH EFLAGSをやっている。
「POPFD」:「pop flags double-word」フラグをダブルワードで(スタックから)ポンと飛ばす。POP EFLAGS。

スタックはデータ構造のひとつ。

PUSHFD POP EAXは、スタックにEFLAGSを押し込んで、ポンとはじけたところをEAXに代入。MOV EAX, EFLAGSの代わりになる。
PUSH EAX POPFDは、その逆になるので、MOV EFLAGS, EAXの代わりなる。

 

 

うーん、色の設定をしてシマシマを書いたけれど、C言語だけじゃできないというのがつらいなぁ。アセンブラを使いまくっているのですね。

 

◆ harib01g (四角形を書く)

今の画面モードは、320 x 200 ( = 64,000 ) の画素数。左上の座標を ( 0, 0 )、右下の座標 ( 319, 199 )とすると、画素数 ( x, y )に対応する VRAM の番地は、

0xa0000 + x + y * 320

この式を使って、画素の番地を計算して、そのメモリに色番号を記憶させると、画面上のその位置に指定した色がでる。これが1点の描画。xを増やしながら繰り返せば横に長い直線。この直線を下方向へ繰り返し、何本も直線を書くと長方形。

 

 

 

◆ harib01h (仕上げ)

 

 

分からないなりに、『本書』をそのまま真似ていって、ようやくここまできました。

 

それにしても、?マーク飛びまくっております。

ここで一旦振り返るべきか、進むべきかと再び悩んでおりますが、「Chapter 0」を読み返してまずは7日目まで突き進むことにしました。その方がキリがよさそうだから。

ともかく、今日は画面に色をつけることができて、定義することで形をつくることができました。

以上。

 

スポンサーリンク