(本当はすごく使いたいけど)アセンブラは極力使わずにがんばる。アセンブラを使うとすぐに意味わからんと投げ出す人が増えそうなので。長いと読むほうが疲れちゃう。APIではファイル名指定ではなく、ファイルハンドル指定にした。すれば指定されたファイルが存在するかどうかをチェックする必要はなくなるし、とりあえずメモリに読み込まれた状態になっているから。APIではファイルが.hrb形式になっているかという最低限のチェックすらしてない。いう改造はきっと読者がやってくれるだろうと信じているのである(笑)。このページでは基本原理さえ示せばいいだろう。関数hrb_apiでは、適当にメモリ512KBを確保してhrb_api_osselectを呼び出しておしまい。hrb_api_osselectは3段ロケット方式になっている。CSを変更しなくてもできることをだいたいやってしまうhrb_api_osselect(以後first)、CSを変更後にCで記述できる範囲の仕事を全部やるhrb_api_osselect_second(以後second)、どうやってもアセンブラでしか記述できない処理をやるhrb_api_osselect_third(以後third)である。CSを変更しなければいけないかだが、ちょっと考えてみてほしい。bootpackの内容を入れ替えるためには、入れ替え処理プログラムが必要である。その入れ替えプログラムをメモリのどこに置くのか。CS=2*8のところに旧bootpackをおいたまま入れ替えプログラムを実行してしまうと、自分自身を上書きしてしまう事故がおきて、暴走してしまうだろう。それでとりあえず現在動作中のbootpack(というかharibote.sys全体)をメモリのあいたところに適当に転送し(これがtmp番地)、そこを指し示すコードセグメントを設定した後に、そこへfar-jmpする。これでCSは書き換わり、tmp上でOSは実行されるようになるのである。secondへ移行してしまえば、あとは.bhsファイルの内容をしかるべき番地へ転送する。secondがやっていることは本文p.170〜171のアセンブラがやっていたことをC言語でやっているだけである。高速化しようと思って32bitのコピーにするために式がややこしくなっているが、8bitのコピーでよければ、もう少しすっきりする。以下の書き方でも処理速度が落ちる以上の問題はないので、理解できなければ以下を使うのもいいかもしれない。12)));}thirdは何をしているのかというと、C言語だけでESPに代入する方法がどうしても思いつかなかったので、アセンブラでやっているというだけのことである。ついでにFSとGSに8を入れていなかったのでそれもやっている。ESPに代入した後はfar-jmpしか処理が残っていなかったので、それもアセンブラでやってしまっている(というか、そもそもESPを変更した後はCのプログラムに帰るのがややこしいので、呼び出しもとへ帰らずにfar-jmpするほうが処理が簡単で好ましい)。作り始めてしばらくして思ったのだが、普通のブートセレクタよりもこの方式のブートセレクタのほうが2点ほど利点がある。それは何かというと、ブートセレクタ自身がOS上で動くアプリなので、GUIでかっこいいブートセレクタが作りやすい。ブートセレクタに不要なAPIは削ってしまえばいいだろう。最初に起動するOSをブートセレクタ以外にも使うつもりなら、APIはすべて残しておいて普通に使えるようにしておいてもいいだろう。一点は、.bhsファイルは圧縮していてもかまわないということである。これでOSをコンパクトにまとめておけるので、よりたくさんのOSをディスクに入れておけるだろう。↑こめんと欄おぉおぉ〜感動です!!はりぼてファミリーをCD-Rに焼いて起動時に選択できるとすごぉ〜く嬉しいです。13:32:34とりあえずページ完成。試してみてくださいね。18:21:44原理は全然理解していないのですが・・・VirtualPC上で動作しました。QEMUではエラーになっちゃいましたけど。OSCでは、起動OSを選択できるCD-Rを配布したいところです。豪華なランチャーを作成する必要がありますなぁ〜。22:01:02あれえ、うちのQEMUではうまくいったんだけどなあ。IPLのCYLSが足りないということはありませんでしたか?まあとにかく楽しんで活用してください。22:36:36で、実機で試してみたのですが、切り替えた瞬間にリセット。どこでリセットがかかるのかを追っていませんが、初期化周りかなぁ。22:48:43ノーマルharib27fはバージョン6が適用されていないから、落ちるのは無理ないかなあと思います。他の切り替え先でも落ちるのは、なんかちょっとおかしいですね。そのうち当方でも試してみます。22:55:48はりぼてOSを参考にして大幅に書き換えられたBayOSは、QEMUでもVirtualPCでも切り替え直後にスタック例外が発生しました。22:56:25技術的に可能であることを提示していただけたので、私なりに「はりぼて友の会ランチャー」について検討してみます。22:58:40BayOSの中身はよく知らないのですが、asmhead.nasを大幅に書き換えているのではないでしょうか?「はりぼてOS」のように、アプリと同じフォーマットのbootpack.hrbをくっつけているタイプじゃないと、今回の方法では切り替えられません。・・・参考になったようなので、その点では幸いです。うまくいかない例があったのは僕個人としてくやしいので、時間を見つけてがんばります。切り替える実験をしたところ(QEMU上)、HiyOSに切り替わった後でキー入力したらおかしくなりました(つまり何もしなければ全く正常)。思い当たるところがあるので、しばらく研究しますね。23:57:12BayOSもasmhead.nasは変えていません。はりぼてOSと同じようにアプリと同じフォーマットのbootpack.hrbをくっつけています。その後は全然違いますが、そこまでは一緒です。11:25:14baysideさんコメントありがとうございます。それなら当方のバグさえ直せば、BayOSも対応できそうです。今のところ、harib12aまではどのOSでも無事に切り替えられて、harib12bにしても最初の10秒は順調に動きそうなことが確認できました(QEMU上でのテスト)。22:03:23大変お騒がせしましたが、バグは取れました。thirdに3行ほど書き足して、FSとGSに8が確実に入るようにしました。asmheadではこれをやっているのに、osselectでやり忘れたのがバグの原因だったようです。うちではHiyOSへの切り替えも問題なくできています(QEMU上でしかテストしていませんが・・・手抜きですみません)。00:48:27バグが取れて落ち着いてみると、「OSやアプリは友の会の自作なのにOSセレクタは自作じゃないのかよー」ってつっこまれたら(僕としては)悲しいので、「これでもう僕のせいじゃないぞ」と自分を納得させるためのコーナーだったかもしれません(苦笑)。00:55:24実機でもバッチリ動くようになりましたぁ〜。倍率変更もバッチリです!!でも、アプリは各OSで共通になるんですよね・・・。改変した場合オリジナルとファイル名を変えないと整合が取れなくなっちゃいますね・・・。00:40:42これからはみんな自作OSを.bhsファイルでも公開だ!・・・そしたら簡単に試せていいよー、と思った。そのためにはまずは僕がこのosselect入りのharibote.sysを入手しやすくしないとダメだな。マウスで選択できないのがミソ。11:23:35C言語だけでESPに代入する方法も、無くは無いです。Cコンパイラが適当に最適化してくれちゃうと上手く動かない。EBP,ESPが実行される。EBPでEBPがx+4書き換わった所でRET。EBPが実行され、結果としてESPにxが入る。(この説明じゃ多分よく分からないと思う・・・。13:25:31よくこんなロジック思いつきますね...せっかくなので検証してみました。下のソースをGO/gcc->gas2nask(tolset_h/z_new_wを使用)でnasにして紙の上でトレースしてみました。A(0x040000);}ちなみにnasはこんな感じ(抜粋)になりました。[0+EBP],EAXPOPEBPRETGLOBAL_tester_tester:PUSHEBPMOVEBP,ESPPUSH262144CALL_ALEAVERETその結果、espに入る値はどうやら0x040008になりそうです。*((int*)&x-2)=x+4;は*((int*)&x-2)=x-4;の書き間違いではないかと思います。私も頭の中で割と適当に考えただけのものなので、「PUSHとPOPでスタックがどっちの方向に進むか」という基本的なところでミスしていたようです。指摘してくれて、ありがとう。