7日目は6日目で作った割り込みを少しカスタマイズしました。 マウスからの入力が感知できるようになりましたが、まだ動かす部分は作っていません。
割り込み処理の中身を小さく
- ハンドラの関数内部にVRAMにピクセルを書き込む処理(キー入力の文字表示)
- ハンドラの中で行う処理としては重すぎる
マウス操作にも使えるバッファに
struct FIFO8 { unsigned char *buf; int p, q, size, free, flags; };
- FIFO8という名前の構造体に。
- 構造体の定義はbootpack.hに
- 処理の定義はfifo.cに
- リングバッファの制御用の変数
p
:読み出しの位置q
:書き込みの位置
- 配列の長さ->無制限に
unsigned char *buf;
size
で長さを外部から設定できるようにする
- 空き容量を保存する
free
- バッファ溢れの情報を保持する
flags
マウスを使うための設定
- マウス制御回路の有効化
- マウス自体の有効化
http://oswiki.osask.jp/?cmd=read&page=%28AT%29keyboard&word=keyboard
#define PORT_KEYDAT 0x0060 #define PORT_KEYSTA 0x0064 #define PORT_KEYCMD 0x0064 #define KEYCMD_WRITE_MODE 0x60 #define KBC_MODE 0x47 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 KEYCMD_SENDTO_MOUSE 0xd4 #define MOUSECMD_ENABLE 0xf4 void enable_mouse(void) { /* マウス有効 */ wait_KBC_sendready(); io_out8(PORT_KEYCMD, KEYCMD_SENDTO_MOUSE); wait_KBC_sendready(); io_out8(PORT_KEYDAT, MOUSECMD_ENABLE); return; /* うまくいくとACK(0xfa)が送信されてくる */ }
マウスの設定値の根拠みたいなの、ググりまくってもよくわからない。まぁ見つかってもこの位置のbitはXXXを有効かするフラグです、 みたいなのが見つかるだけだと思うので、ちょっとここをググるのはやめよう。
この辺が情報元なのかな?
データ受け取り
マウス制御回路はキーボード制御回路の中にあるらしく、データの受け取り箇所はキーボードと全く同じらしい。 ので割り込み番号で判別して扱う。
if (fifo8_status(&keyfifo) != 0) { i = fifo8_get(&keyfifo); io_sti(); sprintf(s, "%02X", i); boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 15, 31); putfonts8_asc(binfo->vram, binfo->scrnx, 0, 16, COL8_FFFFFF, s); } else if (fifo8_status(&mousefifo) != 0) { i = fifo8_get(&mousefifo); io_sti(); sprintf(s, "%02X", i); boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 32, 16, 47, 31); putfonts8_asc(binfo->vram, binfo->scrnx, 32, 16, COL8_FFFFFF, s); }
感想
ネットに転がっている感想を読み漁って気になるものがありました。
http://www.makisima.org/wiki/wiki.cgi?HariboteOS
そうなの?OSを作るような人は資料の無い一つ一つのハードウェアにオシロスコープとか使ってリバースエンジニアリングでもして仕様を掘り当てるのかな?大変そう(小並感)。