4章〜7章にまつわるQ&Aのまとめ
- (by K, 2006.03.28)
- いろいろQ&Aが集まったと思うので、ここにまとめておこうと思います。
- ここで答えが見つからなければ、q_and_aへ!
質問と答え
- [p.83(COLUMN-4)] p[i]はi[p]と書いてもいいとか、a[2]を2[a]と書いてもいいなどといい加減なことが書いてあるが、厳密には違うのではないか?
- いいえ。本文中で何度も念を押しているように、これは厳密に同じです。疑いたくなる気持ちがわからないではないですが、まずは自分で試してみたらどうでしょうか?(簡単に試したり改造したりできるように、CD-ROMを付録につけているのですから)。○○なので同じになるはずがないとか言っている人がたまにいますが、まずは論より証拠です。どんなにもっともらしい理由があっても、事実は事実なのですから。
- [p.86(4-6)] staticをつけた場合とつけない場合の違いの理解に自信がないので、確認をかねてもう少し詳しく説明してほしい。
- それでは、 char a[3] = { 1, 2, 3 }; と static char a[3] = { 1, 2, 3 }; を例に具体的にやってみます。
- [p.87(4-6)] set_paletteに io_out8(0x03c9, rgb[0] / 4); とあるが、この / 4 の意味は?
- どうもすみません。その部分の説明を書いていませんでした(書いたつもりになっていました)。私たちは通常、輝度を00-ffつまり0〜255として扱っていますが、ビデオカードの標準状態では、輝度を0〜63の範囲で指定しなければいけないのです(63で255の明るさになる)。そのための割り算です。モードを変えれば普通の0〜255での指定ができるそうなのですが、めんどうなのでやっていません。
- [p.93(4-7)] VRAMの番地で、0xa000+319+199*320=0xaf9ffと0xaffffの値の違いの意味は?
- メモリマップ上ではVRAMは0xa0000〜0xaffffとなっています。しかし(319,199)の座標の画素に相当するのは0xaf9ff番地です。したがって0xa0000〜0xaf9ffを塗りつぶすだけで全画面に描画できます。
- この食い違いはちょっとヘンです。では0xafa00番地に書き込んだらどうなるでしょうか。はい、何もおきません。でも書き込んだ値はもちろん記憶されます。つまりVRAMというメモリはあるのですが、画面外になってしまうので表示されないのです。おそらくもっと画素の多い画面モードになると、0xafa00〜0xaffffの内容も表示できるようになるのでしょう。
- [p.154(7-7)] キーボードとマウスのデータ受け取り用ポートが同じなので心配がある。もしキーボード割り込みが起きて割り込みルーチンが io_out8(PIC0_OCW2, 0x61); を実行した直後にマウス割り込みが起きたらどうなるのか?
- まずPICは割り込みの監視を再開してはいますが、CPUのIF(割り込み許可フラグ)はIRETDするまでは割り込み禁止のままになっているので、マウス割り込みルーチンは呼び出されません。IRETDが実行されるまで割り込みは待機になります(IRETDした瞬間にマウス割り込みルーチンへ行くことになる)。この仕組みがあるので、「処理の追い越し」が起きる心配はありません。
- 次の心配はデータでしょう。キーボードコントローラの中にFIFOバッファが内蔵されていて、この場合はキーデータを読み出すまで、マウスからのデータはコントローラチップの中で保留されます。だからこれも大丈夫なのです。・・・逆にいうともしキー割り込みの処理関数が、1回の割り込みに対して2度もデータ受け取り用ポートをINしたりすると、誤動作してしまうことになります。
こめんと欄
|