マウスの情報を読み取る

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するのはプロテクトモードかどうかで機械語の解釈が変わるので、パイプラインで処理し始めていた命令をもう一度最初からやり直すため。その後、すべてのセグメントレジスタの値を入れ直している。0x0008gdt+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が必要な理由は不明。