Yabu.log

ITなどの雑記

30日OS自作本8日目

8日目の内容になります。 前回マウスを動かすための割り込み処理を完成させたので、 受信したデータを使ってマウスカーソルを動かす内容になります。

祝マウス初動作。灰色のバーはマウスが通った後再描画されないのでグチャグチャ

動画

動画を撮ってみました

www.youtube.com

マウスの受信データの解説

マウス入力は3バイトをワンセットとして送られてくるようです。意味のある入力として読み取るためにmdec.phaseという変数でこの3バイトの受信を同期させるようなことをやっています。

 if (mdec->phase == 0) {
        /* マウスの0xfaを待っている段階 */
        if (dat == 0xfa) {
            mdec->phase = 1;
        }
        return 0;
    }
    if (mdec->phase == 1) {
        /* マウスの1バイト目を待っている段階 */
        if ((dat & 0xc8) == 0x08) {
            /* 正しい1バイト目だった */
            mdec->buf[0] = dat;
            mdec->phase = 2;
        }
        return 0;
    }
    if (mdec->phase == 2) {
        /* マウスの2バイト目を待っている段階 */
        mdec->buf[1] = dat;
        mdec->phase = 3;
        return 0;
    }
    if (mdec->phase == 3) {
        /* マウスの3バイト目を待っている段階 */
        mdec->buf[2] = dat;
    //以下バッファの内容を加工してmdecにデータを詰めるコードが続く
    --(省略)--
        
        return 1;
    }

バッファから構造体へ変換

mdec->btn = mdec->buf[0] & 0x07;
mdec->x = mdec->buf[1];
mdec->y = mdec->buf[2];
 sprintf(s, "[lcr %4d %4d]", mdec.x, mdec.y);
 if ((mdec.btn & 0x01) != 0) {
   s[1] = 'L';
 }
 if ((mdec.btn & 0x02) != 0) {
   s[3] = 'R';
 }
 if ((mdec.btn & 0x04) != 0) {
   s[2] = 'C';
 }

受け取った3バイトのデータは以下のように対応しています。

  • 1バイト目:下位3bitがクリックに関する情報
  • 2バイト目:マウスカーソルの水平方向の動き
  • 3バイト目:マウスカーソルの縦方向の動き

マウスから送られてくるデータを四角括弧内に表示

[]の中身ですが左から1バイト目、2バイト目、3バイト目となります。

確かにこの3バイトをただ画面に表示しているharib05bなどを見ると、 限りなく縦にマウスを動かした場合は3バイト目しか反応せず、限りなく横だけにマウスを動かせば2バイト目が変化しているように見えます。

しかし、なぜかカーソルを動かしている際に1バイト目が反応することがあるようです

調べましたがこの辺の参考情報はWikiには乗っていないようです。*1

マウスはどのように制御するのですか? -- 名無しさん 2005-03-08 (火) 19:42:26
ご質問ありがとうございます。マウス関係はそのうちページを作りたいと思います。 -- K 2005-03-10 (木) 13:15:21

http://oswiki.osask.jp/?cmd=read&page=%28AT%29keyboard&word=keyboard

ちょっと割り込みの知識が整理しきれていないので、別途整理して日記に書こうと思います。

ちなみにMacbook Proトラックパッド単体で右クリックすることはできないようです。 macOSで右クリックに相当するダブルタップもLcRとして認識されませんでした。 commandキーを押しながらクリックすることで右クリックとして認識されました。 ただしこの動作はqemu内のhariborteOSのみで右クリックとして扱われているようで、macOS上でやっても特に右クリックメニューとかは出ません。

プロテクトモード

day3に書いてある内容、セグメントレジスタESとBXを使わない方法。 GDTを代わりに使うようです。 保護(プロテクト)モードにも種類があって16bit,32bitがあるそうです。 今回利用するのは32bitの保護モードです。

感想

後半の32ビットモードへの道に書いてあることは省略(お預け)されていることも多く、よくわからなかった。 とにかく、このOSかBIOSか何かはデフォルトで16ビットの非保護モードで起動してしまうので、起動直後に32ビットモードに切り替えてGDT,IDTを作り直すということをやっているのだと思う。

*1:Kさんは著者の川合さん