Yabu.log

ITなどの雑記

30日OS自作本7日目

7日目は6日目で作った割り込みを少しカスタマイズしました。 マウスからの入力が感知できるようになりましたが、まだ動かす部分は作っていません。

7日目終了時の画面。表示されているデータの左側がキーボード、右側がマウス入力のもの

割り込み処理の中身を小さく

  • ハンドラの関数内部にVRAMにピクセルを書き込む処理(キー入力の文字表示)
    • ハンドラの中で行う処理としては重すぎる
      • 改善案1
        • ハンドラの中では割り込みが発生したフラグを立てる
        • かつ入力されたキーの情報も変数で保持
        • 同時に(ctrl)2バイトが送られてるキーだとうまくいかない。
          • ctrl押下時に(E0 1D),離した時に(E0 9D)を受信する
          • 改善案1適応時にE0が表示されない(読み捨てられる)
          • ちなみにこの挙動は自分の環境では再現しなかった。(harib04aでも0Eは表示されず((まぁあくまで私の肉眼で確認できなかっただけですが。)))
      • 改善案2
        • バッファを利用して同時に複数バイトが送信されるケースも対応する
        • 配列でFIFOバッファ(キュー)をつくる
        • 最終的にリングバッファを採用する

マウス操作にも使えるバッファに

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);
}

感想

ネットに転がっている感想を読み漁って気になるものがありました。

まあ,この本を読んでいくうちにわかってくるが, PC/AT アーキテクチャ自体が,資料無し,の山のようだから.

http://www.makisima.org/wiki/wiki.cgi?HariboteOS

そうなの?OSを作るような人は資料の無い一つ一つのハードウェアにオシロスコープとか使ってリバースエンジニアリングでもして仕様を掘り当てるのかな?大変そう(小並感)。