マウスの情報を読み取る
1 | |00yx|1CRL| Y | X | |
1バイト目の下位3ビットCRLはボタン。
x,yはそれぞれ2,3バイト目のX,Yの変化量の8ビット目より上を1にするか。つまりマイナス方向の移動に対応してる。1だとマイナス。2の補数で表現しているから単純にマイナスにするだけではだめ。
2の補数
$2^n$より小さいある自然数$x$の負数$y$を$x+y=2^n$を満たすような$y$を$x$の2の補数という。
例えば、$x=1$、$n=4$とすると、$y=2^4-x=7$。2進法で表すと、$y=1000-001=111$
マウス描画
移動する前にクリアしてから書く。

asmhead.nas
初期化準備
PICで割り込みを禁止してからCPUでも割り込みを禁止する。
メモリを1MB以上使えるようにする
キーボードコントローラの「おまけ」出力ポートに0xdf
を出力せよと、キーボードコントローラにコマンドを送っている。互換性のための使えるメモリを1MBまでにする回路を解除する。waitkbdout
で各命令の終了を待つ。
プロテクトモード有効化
プロテクトモードとはCPUの機能でセグメントを利用してOSとアプリケーションを区別する。セグメントを使用するのでアドレスは各セグメントの先頭アドレス基準の相対アドレスになる。
CR1
(Control Register 0)
Bit | |
---|---|
0 | Protected mode enable |
31 | Paging |
https://wiki.osdev.org/CPU_Registers_x86#CR0
CR0
の代入後にJMP
するのはプロテクトモードかどうかで機械語の解釈が変わるので、パイプラインで処理し始めていた命令をもう一度最初からやり直すため。その後、すべてのセグメントレジスタの値を入れ直している。0x0008
はgdt+1
のセグメント。
新出アセンブリ
IMUL |
Integer Multiple |
SUB |
Substract |
SHR |
Shift Right |
JZ |
Jump if Zero. 直前の計算結果が0だったらゼロ |
JNZ |
Jump if not Zero. |
ALIGNB <N> |
アドレスがNの倍数になるまで0を入れる |
メモリコピー
メモリマップがまだよくわかっていないので飛ばす
GDT
メモリコピー前に仮にGDTを作っておいてある。GDTの1,2番だけが先に計算してデータが入ってる。仮のGDTが必要な理由は不明。