30日OS自作入門25日目(Win10)
はじめに
今回はコンソールを増やしたりする操作を行うようです。API等の処理も担っているコンソールをどう増やしていくか気になっている気持ちでやっていきます。
目次
コンソールを増やそう
BEEPサウンド(harib22a)
BEEPサウンドの制御を行うようです。Qemuでやれないのが悲しい…
仕様はここにのっている感じですね。
この仕様書の通りにAPIの処理を設定して、プログラムをかけば完成のようです。
実行すると
30日自作OS本(harib22a)
— 猫(1010) (@Wagahaiha_toto) 2020年2月13日
BEEP音を実機以外で聞く方法があったら、知りたかったりする。 pic.twitter.com/PU8jS5DsTX
この章はシンプルですね。
色を増やそう(1)(harib22b)
現状は16色の色しかないので240色の残りも使っていこうといった感じのようです。
コードのgraphic.cでは、bufの16~231番目までを使って、table2のカラー登録を行っているようです。記事の計算式はおそらく、for文のパターンから計算しているのだと思います。
実行してみると
少しキレイ
色を増やそう(2)(harib22c)
実行すると
よく見ると、細かく色を変えているのが見える。
ウィンドウの初期位置(harib22d)
上記のcolorを出したときにウィンドウの位置がはみ出してしまう現象を何とかしようとのことです。
ここで、sheet_updownでマウスと同じ高さにしていますが、マウスが自動的に1個上になるので大丈夫なのだと思います(詳細はsheet.cのsheet_updownに書かれています。)。また、調整内容もウィンドウを出した後に自動で移動させるという手段のようですね。一瞬で終わるから気づかない…
実行すると
30日自作OS本(harib22d)
— 猫(1010) (@Wagahaiha_toto) 2020年2月14日
真ん中に表示されるようになった! pic.twitter.com/CW1bmHPRTU
コンソールを増やそう(1)(harib22e)
実行すると
30日自作OS本(harib22e)
— 猫(1010) (@Wagahaiha_toto) 2020年2月14日
無理矢理配列でコンソールを増やした姿! pic.twitter.com/I74IMMfO0N
Shift+F1はしてはいけない…しろ...って感じでやったら、ハリボテOSのマウスがフリーズしました。(よいこはまねしないでね)
コンソールを増やそう(2)(harib22f)
これの原因は0x0fec番地をデータを読み取る先にしているわけですが、どちらからデータを送っても、結果が送られるコンソールは決まっているという状況になっているようです。要は、2つのコンソールタスクごとにデータをメモする場所を別々にすればよいということになります。
実行してみると
30日自作OS本(harib22f)
— 猫(1010) (@Wagahaiha_toto) 2020年2月14日
このごちゃごちゃ感すき pic.twitter.com/VtUfPCGlTb
コンソールを増やそう(3)(harib22g)
書籍を読んだら、かなりえぐいことが起きてたようですね。コードセグメントとデータセグメントが二つあることに対応してなくて、1つずつを上書きしていっていたようです。
set_segmdesc(gdt + 1003, finfo->size - 1, (int) p, AR_CODE32_ER + 0x60); /* アプリ用のセグメント設定 */ set_segmdesc(gdt + 1004, segsiz - 1, (int) q, AR_DATA32_RW + 0x60); /* たぶんアクセス権がらみ? */
ここが1003や1004が固定値のままなのが問題になっているので、直すようです。こういう配列で、同じデータの複数コピーを作るときはデータを構造体で管理させるのがベストなのかな?ただ、そのまま構造体のメンバを持ってきているわけではなくて、数値をいじっているので、そこに気を付けたいです。
実行してみると
30日自作OS本(harib22g)
— 猫(1010) (@Wagahaiha_toto) 2020年2月14日
セグメントには、ほんと気を付けようと思いました。 pic.twitter.com/ipx4U5Ip6U
コンソールを増やそう(4)(harib22h)
この改造は、Shift+F1やXボタンで使用していた強制終了の仕組みの修正になるようです。強制終了ではtask_cons[0]の構造体を割り当てていたところを、それぞれのコンソールウィンドウの管理下にしたりやXボタンだとAPPのウィンドウのデータを操作するように変更されています。
実行すると
30日自作OS本(harib22h)
— 猫(1010) (@Wagahaiha_toto) 2020年2月15日
強制終了の方にも対応 pic.twitter.com/eAUtc6AFiY
もっとOSらしく(1)(harib22i)
修正していたところを箇条書きで書いてみると
・キー入力のためのbuf_winがなくなり、カーソル点滅のためにtimerを回す必要もなくなった。そして、Enterとバックスペースのキーコードもkeytableで管理することに変更している(変更前は直接キーコードでの条件分岐)。その結果、Enterやバックスペースから来ていたデータをキーコード判別することなくfifoバッファへ送り出すことになっている。そして、task_aはなくなるので、windowの管理をbootpack.cがする必要がなくなった結果消している。sht_mouseからもtask_aが起動時からいることが無いため、sheetの高さ設定の際にその部分を除いている。
・ウィンドウ選択に関する処理に影響している。ここでHariMainの変数cursor_cに色のデータを渡す必要があったが、HariMainからtask_aが消えたことにより、keywin_on・keywin_offで管理することになっている。
・またtask_aが誤って閉じる心配をしなくてよくなるので、F11の処理にあったtask_aを例外にする処理はなくなる。
・無限ループ内にあった、カーソルのtimerによる点滅とカーソルを再表示させる処理もなくなる。
・keywin_onとkeywin_offは構造体でコンソール以外のウィンドウが管理されるので、構造体のアドレスを引数として受け取れば済むようになる。また、返り値を渡さずにfifoバッファで渡した方が各タスクにデータを渡しやすいからなのか、そう修正されている。
実行してみると
30日自作OS本(harib22i)
— 猫(1010) (@Wagahaiha_toto) 2020年2月15日
再起動病が再現できてなかったっぽい?けどカーソルの不具合は再現できていた。 pic.twitter.com/8PYQHtkrRs
もっとOSらしく(2)(harib22j)
色々な不具合が発生していた原因は、FIFOバッファの初期化はコンソールタスクの優先順位で実行されているわけです。そのせいで、HariMainのタスクが0になってコンソールタスクに優先度が写らないと実行ができないわけでFIFOバッファの初期化が行われていないという状況が起きていたようです。タスクの優先度を作ったときは、タスクの優先度のことをふんわり考えていましたが、ここまでくると、システム面との違いを意識できるようになってきました。
実行してみると
30日自作OS本(harib22j)
— 猫(1010) (@Wagahaiha_toto) 2020年2月16日
見た目がめちゃめちゃOSらしくなってきた。 pic.twitter.com/K6oCN3A3LN
メモ
・色番号ではパレットという配列を用意し、最大256色分(8bitで表せる最大のパターン
)を登録することで楽
に画面表示ができるようになっている。これをVRAMの指定箇所にデータとして書き込むことでGUIを表現している。パレットは楽に登録するための工夫であって、ハードウェアやBIOSの仕様ではない。(VRAMに直接色データを叩きこめばパレットがなくてもできる)
・key_winは最初に選択されているwindowがどれであるかを示している。
最後に
途中趣味であることを忘れかけてたので、初心に帰ろうかと思います。