Categories Books | Hard | Hardware | Linux | MCU | Misc | Publish | Radio | Repository | Thoughts | Time | UNIX | Writing | プロフィール
本日夜、UNIX USER 編集部より12月号が届く。GCCプログラミング工房・第23回では、かなり突っ込んだ VGA register programming のテクニックを紹介した。私としては、後半で紹介した「メモリープレーン操作」がお気に入り。
PC/AT におけるテキスト VRAM がセグメント B800 から始まることは、昔の DOS/V 小僧なら誰でも知っている事実。しかし、「誰が VRAM の開始セグメントを B800 と決めたの?」、「なぜ ASCII コードが偶数バイトで属性コードが奇数バイトなの?」という素朴な問いに答えられるプログラマーは、世界広しと言えども多くはないだろう。
第23回を読んで頂ければ、これらの疑問のすべてが氷解する(はず)。そして、ハードウェアを制御することで、普段は VGA カード上に隠されたメモリー空間のすべてを制覇できることの素晴らしさを、実感して頂けるのではないかと思う。
私達が普段目にしている 8x16 ドット型式のフォントは、VGA カードのメモリープレーン2上に存在している。そして、このメモリープレーンは RAM であるから、書き換えることができる。すなわち、PC/AT 上のフォントは自分の好きなようにデザインすることができるのだ!
「だからどうなのよ?」と言われると、シュンとなるしかない。しかし、日本のどこかにおられるであろう「同志」の方々のために、フォント書き換えに必要なテクニックのすべてを紹介した。
あの、Linus Torvalds 氏ですら、Linux 0.01 を公開した時点では、メモリープレーン操作の域には達していなかった。ソースツリー中の kernel/console.c を読むと、当時の Linus 氏は VRAM 操作、カーソル設定、VRAM 開始アドレス設定、などの基本テクニックしか使っていないことが分かる。つまり、VGA テキストモードに限定すれば、私達の知識は既に世界のトップクラスに達していると言える。
基本の鍛錬は一見地味である。派手ではなく、誰もが嫌がる作業だ。しかし、これら基本の積み重ねの上に、応用としてのカーネルが存在する事実を忘れてはならないだろう。
研究やプログラミングに相通じたことがある。それは「ひとつのことを究める」ということ。例を挙げると、機械語がある。
Cコンパイラーをマスターするためには、機械語の習得が不可欠である。なぜか?C言語は PDP-11 (正確には KA11 processor)のインストラクションセットを強く意識して設計されており、コンパイラーと言うよりは、昔で言う「マクロアセンブラー」が似合っているほどだ。インクリメント・デクリメント演算子は KA11 機械語そのものであるし、ポインター変数の実体は同 CPU が得意とする豊富な間接アドレッシングモードに基づいている。よって、Cを機械語抜きで語ることは不可能である。
さて、それではどの CPU をマスターするかだが、結論から言えば、これは何でも良い。往年の 8080 や Z80 でも良いし、最近流行の H8 や AVR でも良い。大切なことは、とにもかくにも「ひとつの CPU を究めること」だ。4ビットであろうが、64ビットであろうが関係ない。「確かに俺はこいつを制覇した」という感覚を持てるかどうか。全ては、この点にかかっている。
論理ゲートを思い浮かべてみてほしい。出力は0Vか5Vか、ハッキリしたデジタル値だ。しかし、その入力は往々にして0〜5Vの間を行き来するアナログ値であり、ある閾値(Threshold)を超えるかどうかで、その出力が決まる。
知識も論理ゲートと同じだ。閾値を超えることができなければ、例え100個の信号を重ねても、出力はゼロであり、何物も生まれない。
様々な CPU に関する知識を身につけることは良いことだ。しかし、中途半端な知識をいくら塗り重ねたところで意味はない。Itanimum を表面的にかじった程度の大学生よりは、PIC を制覇したマイコン小僧の方が、人材としては遙かに有望である。
「閾値を超える」ことはたやすいことではないが、ひとつの壁を自力で乗り越えることが出来た人間は、強く逞しい。