個人用雑記

勉強したことを書いていければなーと

自作OS、始まります! #4

続・GUIのようなもの

マウスのようなものを作ってみる・・・はずが

晴れて任意の画素に色を付けることができるようになったので、今度は描画したドットをマウスで動かしてみます。なんとUEFIには最初からマウスの移動を取得できるEFI_SIMPLE_POINTER_PROTOCOLがあるのです。UEFIすげぇ・・・
しかし、このSIMPLE_POINTER_PROTOCOLは、自分の環境ではQEMUに対応してませんでした。設定を変えたりするのがめんどくさいという理由でUSBからブートしてこなかったのがここにきて響いてくるとは・・・とりあえず実装だけはして、本当に必要になったら試すことにしました。(SIMPLE_POINTER_PROTOCOLはマウスの移動・左クリック・右クリックに対応しているものの、スクロールには対応してないようです・・・?(試してないのでもしかしたら違うかもしれません。ごめんなさい。))

EFI_SIMPLE_POINTER_PROTOCOL

とりあえず、実装はしておきます。
このプロトコルも前のグラフィックスプロトコルの時と同様にGUIDを使ってLocateProtocolで先頭アドレスを取得します。このプロトコルのGUIDは以下です。

EFI::EFI_GUID SimplePointerProtocol_GUID = {
    0x31878c87, 0xb75, 0x11d5,
   {0x9a, 0x4f, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d}
};

EFI_SIMPLE_POINTER_PROTOCOLにはReset関数、GetState関数、WaitForInputが存在しています。基本的な使い方の流れは、最初にReset関数でマウスをリセットして置いたら、キー入力と同様にWaitForInputを引数に渡し、WaitForEvent関数を使ってマウスの入力を待機します。マウスの入力が起きたらGetState関数を呼び出すことでその入力を取得することができます。
QEMUではそもそもWaitForEvent関数が終了しなかったのでおそらくマウスの入力自体受け付けてもらえませんでした・・・ 本当であればGetState関数の引数に渡したEFI_SIMPLE_POINTER_STATE構造体の変数にマウスの移動値が格納され、その値をもとにマウスの座標を再計算し、描画という流れで動くはずだったんですけどね~
別の方法でマウスの入力を受け付けるか、何らかの方法でマウスの代替を作るしかなさそうです。

さて、何も進捗が無いように見えますがとりあえずこれでSIMPLE_POINTER_PROTOCOLの使い方は分かったので次に進めます。中途半端に前回が長くて今回が短い記事になってしまいましたが、仕方ないですね。

次回以降の目標

次回はファイルの読み書き周りのプロトコルです。それが終わるとひとまず参考にさせていただいた本の内容は踏襲できた形になるので、そこからが本当の意味で自作OS、始まります!になりそうですね。
その前にとりあえずロードマップのようなものを作ってみるのもアリかなと漠然と思ってます。必要そうだったら都度更新していって、記事ができたらリンクを貼っていくという感じの。という妄想は置いといて、とりあえず30日OSの方で基礎を勉強して来いという話ですね。