30日OS自作入門25日目(Win10)

はじめに

今回はコンソールを増やしたりする操作を行うようです。API等の処理も担っているコンソールをどう増やしていくか気になっている気持ちでやっていきます。

目次

コンソールを増やそう

BEEPサウンド(harib22a)

BEEPサウンドの制御を行うようです。Qemuでやれないのが悲しい…

仕様はここにのっている感じですね。

(PIT)8254 - os-wiki

この仕様書の通りにAPIの処理を設定して、プログラムをかけば完成のようです。

実行すると

この章はシンプルですね。

色を増やそう(1)(harib22b)

現状は16色の色しかないので240色の残りも使っていこうといった感じのようです。
コードのgraphic.cでは、bufの16~231番目までを使って、table2のカラー登録を行っているようです。記事の計算式はおそらく、for文のパターンから計算しているのだと思います。

実行してみると

f:id:No000:20200214144912p:plain
少しキレイ

色を増やそう(2)(harib22c)

実行すると
f:id:No000:20200214152232p:plain よく見ると、細かく色を変えているのが見える。

ウィンドウの初期位置(harib22d)

上記のcolorを出したときにウィンドウの位置がはみ出してしまう現象を何とかしようとのことです。
ここで、sheet_updownでマウスと同じ高さにしていますが、マウスが自動的に1個上になるので大丈夫なのだと思います(詳細はsheet.cのsheet_updownに書かれています。)。また、調整内容もウィンドウを出した後に自動で移動させるという手段のようですね。一瞬で終わるから気づかない…

実行すると

コンソールを増やそう(1)(harib22e)

実行すると

Shift+F1はしてはいけない…しろ...って感じでやったら、ハリボテOSのマウスがフリーズしました。(よいこはまねしないでね)

コンソールを増やそう(2)(harib22f)

これの原因は0x0fec番地をデータを読み取る先にしているわけですが、どちらからデータを送っても、結果が送られるコンソールは決まっているという状況になっているようです。要は、2つのコンソールタスクごとにデータをメモする場所を別々にすればよいということになります。

実行してみると

コンソールを増やそう(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が固定値のままなのが問題になっているので、直すようです。こういう配列で、同じデータの複数コピーを作るときはデータを構造体で管理させるのがベストなのかな?ただ、そのまま構造体のメンバを持ってきているわけではなくて、数値をいじっているので、そこに気を付けたいです。

実行してみると

コンソールを増やそう(4)(harib22h)

この改造は、Shift+F1やXボタンで使用していた強制終了の仕組みの修正になるようです。強制終了ではtask_cons[0]の構造体を割り当てていたところを、それぞれのコンソールウィンドウの管理下にしたりやXボタンだとAPPのウィンドウのデータを操作するように変更されています。

実行すると

もっと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バッファで渡した方が各タスクにデータを渡しやすいからなのか、そう修正されている。

実行してみると

もっとOSらしく(2)(harib22j)

色々な不具合が発生していた原因は、FIFOバッファの初期化はコンソールタスクの優先順位で実行されているわけです。そのせいで、HariMainのタスクが0になってコンソールタスクに優先度が写らないと実行ができないわけでFIFOバッファの初期化が行われていないという状況が起きていたようです。タスクの優先度を作ったときは、タスクの優先度のことをふんわり考えていましたが、ここまでくると、システム面との違いを意識できるようになってきました。

実行してみると

メモ

・色番号ではパレットという配列を用意し、最大256色分(8bitで表せる最大のパターン)を登録することでに画面表示ができるようになっている。これをVRAMの指定箇所にデータとして書き込むことでGUIを表現している。パレットは楽に登録するための工夫であって、ハードウェアやBIOSの仕様ではない。(VRAMに直接色データを叩きこめばパレットがなくてもできる)

・key_winは最初に選択されているwindowがどれであるかを示している。

最後に

途中趣味であることを忘れかけてたので、初心に帰ろうかと思います。