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;
でパレット番号をメモリに格納するだけで色が表示されるというのが明確に理解できてない。ハードウェア的にそうなっているということなのか。