OS自作入門 / 2008/09/04 (Thu) / 編集 |
衝撃の事実、マウスはキーボードコントローラで制御されているらしい!でもってキーボード制御回路の初期化をうまい事すればマウス制御回路を有効にできるらしい(bootpack.c:wait_KBC_sendalready(),init_keyboard())
でもってその次はマウス自体の有効化、これもキーボード制御回路を通してやるらしい(bootpack.c : enable_mouse())
そしてマウスからの割り込みの受付、面倒なことにマウスのIRQは12、つまりPIC1についているらしい。なのでPIC1に「IRQ12の受付完了」と教えた後PIC1が繋がっているPIC0のIRQ2にも受付完了を知らせないといけないらしい
これでデータがキュー(mousefifo)に登録されるらしい。
でもってその次はマウス自体の有効化、これもキーボード制御回路を通してやるらしい(bootpack.c : enable_mouse())
そしてマウスからの割り込みの受付、面倒なことにマウスのIRQは12、つまりPIC1についているらしい。なのでPIC1に「IRQ12の受付完了」と教えた後PIC1が繋がっているPIC0のIRQ2にも受付完了を知らせないといけないらしい
//int.c void inthandler2c(int *esp) /* PS/2マウスからの割り込み */ { unsigned char data; /* IRQ-12受付完了をPIC1に通知 */ io_out8(PIC1_OCW2, 0x64); /* IRQ-02受付完了をPIC0に通知 */ io_out8(PIC0_OCW2, 0x62); data = io_in8(PORT_KEYDAT); fifo8_put(&mousefifo, data); return; }
これでデータがキュー(mousefifo)に登録されるらしい。
あとはデータを解読するわけで、マウスからのデータは次の4バイトらしい
カーソルの表示のほうは図形を表示するのといっしょなので「前回のカーソルを消す(つまり前回カーソルがあった場所を背景色で塗りつぶす)」ー>「新しい位置にカーソルを表示」
(bootpack.c:HariMain()のmousefifoがどうとか書いてあるとこ,mouse_decode(),MOUSE_DEC)
これくらい書いておけばソースコードと見比べればわかるかな?
- フェーズ0:最初の0xfa
- フェーズ1:ボタンの状態を表す このバイトの下位3bitがボタンの状態
- フェーズ2:xを表す
- フェーズ3:-yを表す マウスはy方向の符号がディスプレイと逆
カーソルの表示のほうは図形を表示するのといっしょなので「前回のカーソルを消す(つまり前回カーソルがあった場所を背景色で塗りつぶす)」ー>「新しい位置にカーソルを表示」
(bootpack.c:HariMain()のmousefifoがどうとか書いてあるとこ,mouse_decode(),MOUSE_DEC)
これくらい書いておけばソースコードと見比べればわかるかな?
PR
トラックバック
URL :
コメント