あんたいとる

無駄の中に宝がある!

30日でできる! OS自作入門(四日目)

C言語と画面表示の練習

新しく学んだ知識

ビット演算

演算子 説明
| OR演算。特定のビットを1にするときに使う。
& AND演算。特定のビットを0にするときに使う。
^ XOR演算。特定のビットを反転するときに使う。

ポインタ

メモリアドレスを指定して値を代入するときアセンブリ言語で、 MOV [0x1234], 0x56 と書くとエラーになる。これはBYTEなのかWORDなのかDWORD七日の指定がないため。

同じようにC言語でメモリを扱うときのサイズをコンパイラに教えてあげる必要がある。

char *p;   /* これはpというアドレス専用変数だという意味 */
*p = i & 0x0f;  /* pが指すアドレスのメモリに i & 0x0fを代入する */

char *p;   /* BYTE用アドレスの場合 */
short *p;  *  WORD用アドレスの場合 */
int *p;    /* DWORD用アドレスの場合 */

命令とフラグについて

命令 説明
CLI 割込みフラグ(interrupt flag)というフラグを0にする命令。
STI 割込みフラグ(interrupt flag)というフラグを1にする命令。
PUSH スタックに値を入れる。
POP スタックから値を取り出す。
IN 周辺機器からデータを入力。第1オペランドはデータを格納するレジスタ(ALorAX)、第2オペランドはI/Oポートのアドレス(即値orDZ) を指定。
OUT 周辺機器へデータを出力。第1オペランドに出力するポートアドレス(即値orDX)、第2オペランドに、出力するデータを格納しているレジスタを指定(ALorAX)
EFLAGS キャリーフラグや割込みフラグなどが詰まったレジスタ

よく分からなかった箇所

ビデオDAコンバータ

パレットのアクセス手順の箇所は何となく分かるような分からないような...

・パレットのアクセス手順 ・まず一連のアクセス中に割込みなどが入らないようにする(例えばCLI
・0x03c8に設定したいパレット番号を書き込み、、R、G、Bの順に0x03c9に書き込む。もし次のパレットも続けて設定したいのなら、パレット番号を省略して、さらにRGBの順に0x03c9に書き込んでよい。
・現在のパレット状態を読み出すときは、まず0x03c7にパレット番書き、0x03c9を3回読み出す。これが順にR、G、Bになっている。これも次のパレットを読み出したいとパレット番号を省略してRGBの順に読み出してよい。
・最初にCLIした場合は、最後にSTIする。

4日目の感想

コードをひとつひとつ追っていけば、それぞれ何をやっているのかは理解できるのだが、vram[y * xsize + x] = c;でパレット番号をメモリに格納するだけで色が表示されるというのが明確に理解できてない。ハードウェア的にそうなっているということなのか。