あんたいとる

無駄の中に宝がある!

30日でできる! OS自作入門(七日目)

FIFOとマウス制御

新しく学んだ知識

  • PICにIRQの発生を受付たことを通知するにはOCW2に「0x60 + IRQ番号」をoutすればよい。
  • マウスを動かすにはマウス制御回路とマウスに「有効化命令」を発行しなければいけない。
  • キーボード制御回路のモードを設定するためのコマンドが0x60、マウスを利用するためのモードが0x47
  • キーボード制御回路に0xd4というコマンドを送ると、次に書き込んだデータをマウスへ送信してくれる。
  • マウスからデータを送るよというのが0xfa
  • マウスからは3バイト単位でデータが送られる。

FIFOバッファのデータ構造

  • データを入れる配列と書込み位置の情報を持つ変数をメンバとして持つ構造体で実現する方法(配列からデータを取り出すたびに配列のデータをずらす必要があり効率が悪い)
struct KEYBUF {
    unsigned char data[32];
    int next;
};
  • データを入れる配列と書込み位置と読み込み位置、バッファの使用数の各変数をメンバに持つ構造体で実現する方法
struct KEYBUF {
    unsigned char data[32];
    int next_r, next_w, len;
};
/* lenは何バイトをバッファに覚えているか */    
  • 他の用途でも使えるように汎用化
struct FIFO8 {
    unsigned char *buf;
    int p, q, size, free, flags;
};
/* pはnext_r, qはnext_w, sizeはlenの代わり
  freeはバッファに何バイト空きがあるか */
/* FIFO8の初期化 */
void fifo8_init(struct FIFO8 *fifo, int size, unsigned char *buf){
    fifo->size = size;
    fifo->buf = buf;
    fifo->free = size
    fifo->flag = 0;
    fifo->p = 0;
    fifo->q =0;
    return;
}

7日目の感想

これ一つずつプログラムを動かしながら30日で読み切るの無理だろう。しかも1回で理解できるとは思えない。
ただ サンプルプログラムを写経してるだけだけど、マウスの制御データを画面に表示できたときはテンションが上がった。