よもぎのOS自作入門 8日目/30日
はじめに
これは2020年夏休み企画「30日でOS自作してみよう!」8日目の記事です。
企画についてはこちら
昨日やったことを書いていきます。
昨日の進捗
カーソルが動くようになりました。左上の()がマウスカーソルの座標、2行目の最初がキーコードです。 その次の[]はマウスの情報で、左中央右どのボタンが押されているか、x軸方向の速度、y軸方向の速度です。 押されているボタンは文字が大文字になる。
昨日やったこと
マウス入力から受け取るデータは3バイトずつになっているみたい。
1バイト目をよく観察してみるとこんな感じになっていました
下から1~3ビットに、左クリック・右クリック・中央クリックが対応していて、たとえば左クリックと右クリックを同時押ししたら0x0B
になる。
ので、0x01
,0x02
,0x04
とANDをとればわかりそう。
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方向の値は反転させる。
こうやってマウスから入力されたデータを解釈した結果はこんな感じ。
解釈しただけで動かないので、今度はこの解釈した結果からマウスカーソルを動かします。
処理としての流れは、
- カーソルを消す
- 新しいカーソルの位置を計算
- カーソルの位置が画面からはみ出てしまうなら、値を切り捨てて端で止まるようにする
- カーソルを描画する
だけども問題があって……
もともとカーソルの描画として、16x16の画像の中でカーソルではない部分は緑色≒背景色で塗りつぶしていました。 ニアリーイコールで書いてあるとおり、ちゃんと背景をとってきているわけではない……というのでこれは今後の課題とします。
あとは16bitのBIOSから32bitモードに移るために色々しているasmhead.nas
の解説がありました
今日も一日頑張るぞい!