よもぎのメモ帳

備忘録的な感じで技術的なことをストックしていきます。

よもぎのOS自作入門 8日目/30日

はじめに

これは2020年夏休み企画「30日でOS自作してみよう!」8日目の記事です。

企画についてはこちら

y0m0g1.hatenablog.com

昨日やったことを書いていきます。

昨日の進捗

f:id:y0m0g1:20200825144649p:plain
動くようになったカーソル

カーソルが動くようになりました。左上の()がマウスカーソルの座標、2行目の最初がキーコードです。 その次の[]はマウスの情報で、左中央右どのボタンが押されているか、x軸方向の速度、y軸方向の速度です。 押されているボタンは文字が大文字になる。

昨日やったこと

マウス入力から受け取るデータは3バイトずつになっているみたい。

f:id:y0m0g1:20200825145304p:plain
2行目右から3バイトがマウスから

1バイト目をよく観察してみるとこんな感じになっていました

f:id:y0m0g1:20200825152247j:plain
クリックごとの値

下から1~3ビットに、左クリック・右クリック・中央クリックが対応していて、たとえば左クリックと右クリックを同時押ししたら0x0Bになる。 ので、0x01,0x02,0x04 とANDをとればわかりそう。

f:id:y0m0g1:20200825152640j:plain
マウスの動かす方向と値

x軸マイナス方向に動かすと下から5ビット目が1になって、y軸マイナス方向に動かすと下から6ビット目が1になるみたい。 ので、0x10,0x20とANDをとればわかりそう。

2バイト目はx軸方向の速度、3バイト目はy軸方向の速度っぽい。 ただ1バイトのデータなのでint型で扱うなら、負方向に動いたときに上位3バイトを1埋めなきゃいけない*1

// mdecはマウスの構造体
if ((mdec->buf[0] & 0x10) != 0) // x軸マイナス方向に動いていたら
{
    // mdec->x = 0x000000fd(例えば)
    mdec->x |= 0xffffff00; // 上位3バイトを1埋め
   // mdec->x = mdec->x | 0xffffff00; と同じ
}

こんな感じで処理していた。 あと、画面上でのy軸は反転している(下に行くほど値が増える)*2のでy方向の値は反転させる。

こうやってマウスから入力されたデータを解釈した結果はこんな感じ。

f:id:y0m0g1:20200825154048p:plain
解釈した結果

解釈しただけで動かないので、今度はこの解釈した結果からマウスカーソルを動かします。

処理としての流れは、

  • カーソルを消す
  • 新しいカーソルの位置を計算
    • カーソルの位置が画面からはみ出てしまうなら、値を切り捨てて端で止まるようにする
  • カーソルを描画する

だけども問題があって……

f:id:y0m0g1:20200825154338p:plain
このカーソルには問題がある!

もともとカーソルの描画として、16x16の画像の中でカーソルではない部分は緑色≒背景色で塗りつぶしていました。 ニアリーイコールで書いてあるとおり、ちゃんと背景をとってきているわけではない……というのでこれは今後の課題とします。

あとは16bitのBIOSから32bitモードに移るために色々しているasmhead.nasの解説がありました

今日も一日頑張るぞい!

*1:算術右シフトみたいな感じ

*2:左上を原点としている