OS学習メモ7(30日OS自作入門7日目)
さてさて続き。
前回はマウスが反応しなかったところで終わりました。
今日3本目の記事でちょっと疲れてきましたがやっていきましょう。
int.cを見た。
void inthandler21(int *esp) { struct BOOTINFO *binfo = (struct BOOTINFO *) ADR_BOOTINFO; unsigned char data, s[1]; io_out8(PIC0_OCW2, 0x61); data = io_in8(PORT_KEYDAT); sprintf(s,"%02x",data); boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 15, 31); putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16, COL8_FFFFFF, s); return; }
キーボードを入力した時に、受け取ったキーコードを出力して割り込み処理を終了するプログラム。sprintfについてすっかり知識が抜けていたのでちょっと復習した。あとはそんなに難しいところはない。
順調に先に進めて…
FIFOバッファの説明とかを読みまして…
だいぶ飛びますがマウスの説明に入ります
(疲れてきたから説明端折ってラクしようとかじゃないですよ…多分)
初期の頃のPCにはマウスが標準でついておらず、当然当時のほぼ全てのOSはマウスに対応していなかった。後になって対応したけれど、それを使おうと思おうと思ったら有効化命令を実行しなければならない仕組みになっていた(だから6日目の時はマウスを動かしてもクリックしても反応しなかった)
というわけで、「制御回路」と「マウスそのもの」の2つに有効化命令を出す。実はマウスの制御回路はキーボード制御回路の中に入っているらしいので、そっちをうまく設定すればいい感じにできるとのこと(説明が雑になってきた)
void wait_KBC_sendready(void) { for (;;) { if ((io_in8(PORT_KEYSTA) & KEYSTA_SEND_NOTREADY) == 0) { break; } } return; }
CPUとキーボード制御回路の回路の速さを比べた時、CPUの方が早いので、制御回路側で命令を受け取る準備ができていないのにCPUが命令を出してしまうと誤作動を起こしかねない。CPUはキーボード制御回路側が命令を受けられるようになるまで待つ必要があり、このプログラムがやっているのはまさにそれ。命令を受けられるようになると0x0064番の装置から読み取ったデータの中のあるビットが0になるので、それが確認できるまではループする(これをポーリングって言ったっけ?)
そして
void init_keyboard(void) { wait_KBC_sendready(); io_out8(PORT_KEYCMD, KEYCMD_WRITE_MODE); wait_KBC_sendready(); io_out8(PORT_KEYDAT, KBC_MODE); return; }
キーボード制御回路にデータを送れるようになるのを待ち、マウスを利用するモードにすることを伝える。
...ここまでが制御回路有効化
ここからがマウスの有効化
#define MOUSECMD_ENABLE 0xf4 void enable_mouse(void) { wait_KBC_sendready(); io_out8(PORT_KEYCMD,0xd4); wait_KBC_sendready(); io_out8(PORT_KEYDAT, MOUSECMD_ENABLE); return; }
マウス有効化もキーボード制御回路を使う。制御回路に0xd4と送ると次のデータをマウスに送信してくれるのを利用し、マウスに有効化命令を送っている。
さて実行し、ちゃんとマウスから割り込みがきていることを確認した。
あとは本にあるとおりにプログラムを書いていけば…
ちゃんとマウス反応してくれました。
キーボードも今までと同じようにちゃんと動いてくれてます。
さて、今日はいっぱいやったので、これでおしまいです。明日はこのマウスデータを解読して、ついにマウスカーソルを動かしましょう!楽しみですねえ。……あ、そこのきみ、だめだよ先を読んじゃ。今日は寝るの。続きはあした。分かった?
分かりましたーーー!!
んーーっ!疲れた!