こんばんは、川合です。 I.Tak. さんは 2003/10/28 15:25:08 の「[OSASK 6614] Re: p0cref.ht ml」で書きました: > ……デバッグしたくなりました。デバッグしないと不便ですし。 引用順序を変えてまでして最初に言いますが、僕としてはバグじゃな いと思っているので、デバッグとは言えない気がします。 > ところで, 特別コマンド関係で考えられる組合わせは > 初期化前: > 1. 特別コマンド + 特別終了 > 2. 特別コマンド + 初期化コマンド + 一般コマンド > 初期化後: > 3. 特別コマンド + 特別終了 > 4. 特別コマンド + 一般コマンド > 5. 一般コマンド + 特別コマンド + 特別終了 > 6. 一般コマンド + 特別コマンド + 一般コマンド >このように6通りありますが, 今回のルールでは1と3しか許さないという >ことでいいのでしょうか。 いや、これは失礼しました。僕の表現では確かにそう読めます。 1と3の他に、2も認めます。 今だと、5のパターンは正常動作しないと思います。 >> ・特別モード終了 / バグ >> 僕の記憶が正しければ、NOPを入れてcmd004を呼ぶのは誤動作する >> はずです。というか、cmd004については、以下のルールに必ず従う >> ものとしましょう。 >> 1.利用するなら、かならずコマンドの先頭。 >> 2.特別モード終了(-1)以外では終了しない。 > > 私がそこに書いた回避策は「初期化後」の話ですので, 誤動作はしません。 >初期化前にNOPを入れるのは違反ですね。 そうか、初期化後であれば、I.Tak.さんのコードはうまく走るのか・ ・・。しかし初期化コマンドで始めて通常コマンドに移行しておかしく する人とか、逆に通常コマンドで始めて初期化コマンドに入って特別終 了するとか、そういう組み合わせミスの温床になりやすそうなので、こ れは廃止にしたいです。 > ところで, APIの実装を見ると別なコマンドが繋げられるように*わざわざ* >判定する処理があり, 当初の計画では特別コマンドをほかのコマンドと混ぜ >て使うことを意図していたようです。今回のように制限を厳しくするのは, >バグのために仕様を変えているようで腑に落ちません。デバッグして混ぜら >れるようにするという選択肢はないのでしょうか? special2のところのことですね。最初はそういう方が便利かと思った んですが、かえって混乱するだけのようなので、やめる方向で検討して います。もともと自分でもどうするべきか迷っていたので、この機能の ことは明確には説明してきませんでした。 結局この問題は、コマンド列の途中にtek0展開を入れたり、tek0展開 の後に、コマンドを続けたいということなんだと思います。そうである なら、通常コマンドとしてtek0やl2d3展開のサポートを追加するほうが ずっと自然でしょう(これはI.Tak.さんの要望にありました)。これを Jenny2でやることにします。これなら、不自然なNOPを入れる必要もな くなります。 special2の部分は、nextcmdに分岐するのではなく、ワークエリア初 期化として認識するように改訂しようと思います(これは急にやるとよ くないともう少し先のバージョンでやります)。 --- softintに関して最初に説明するのが、一番分かりやすそうなので、 まずはそこから行きます。softintというのは、ようするにシグナルハ ンドラのシステム版です。 シグナルハンドラにnestカウントがあるのと同じように、softintに もnestカウントがあります。pioneer0内のsoftintハンドラは、ワーク エリアがないと動きません。ということで、ワークエリアのポインタを スロット0x1f0にセットするまでは、softintのnestをノンゼロにキープ します。これなら、ハンドラは呼び出されずに済むわけです。 タスクが起動したとき、幸いなことに(というか最初はsoftintハン ドラが不明なので当然ですが)、softint.nestは0xffになっています。 ということで、softintボックスにメッセージが溜まっても、ハンドラ が呼び出される心配はありません。 いつnestが0になるのかというと、それはまさに、初期化コマンドを 実行してその後cmd000を通ったときです。初期化コマンドではaddnest に+0x81が指定されるため、softint.nestは0x80になります(softint のnest値は8bitです)。・・・より正確に言うと、初期化コマンドは 、与えられたワークエリアを初期値で初期化して、スロット0x1f0にワ ークエリアのポインタをセットして、その後にaddnest +0x81を実行し ます。そして最後に特別コマンドモードを抜けます。 またnestはpioneerで入るときも抜けるときも、増減します。もし最 初のコマンドがcmd004でなければ、プロローグルーチンでaddnest +0x80されます。またcmd000もaddnest +0x80します。・・・なんでこ んなことをするのかというと、コマンド実行中にsoftintハンドラに分 岐されるとややこしくなるからです。 結局、softint.nest値はこうなります。 初期化する前で、CS = 0x0007: 0xff 初期化する前で、CS = 0x00c7: 0xff 初期化した後で、CS = 0x0007: 0x00 (softintイネーブル) 初期化した後で、CS = 0x00c7: 0x80 pioneerがプロローグルーチンでaddnest +0x80するかしないかは、 最初のコマンドがcmd004であるかどうかで決まります。また、 cmd0000では必ずエピローグルーチンを通り、addnest +0x80します。 pioneerとしては、最初がcmd004であれば、まだ初期化する前だと判 断するわけです。そしてcmd004で初期化コマンドを実行しないのなら エピローグルーチンを通ってはいけないので(誤って通るとnest値が 狂う)、特別終了コマンドがあるわけです。 --- 本題に戻ります。 > デバッグは, 「最初のコマンドがなんであろうとスロット0x01f0を使って >ワークエリアのポインタを取得する」ようにすれば終わりだと思います。 >今は初期化コマンド (と特別コマンド) が先頭の場合は取得しないようになっ >ていますが, 初期化前にスロットを読んだところで意味のないデータが読ま >れるて時間の無駄であるという以外の害はありませんよね。その後の呼び出し >では判定がなくなる分速くなるわけですし, タスクの生涯で一回だけなら無駄 >も許されるかな, と。初期化していないスロットを読んではいけないという >規定だとどうしようもありませんが…… これも賛成ではありません。今のアルゴリズムだと、プロローグとエ ピローグのaddnestコマンドは、ワークエリア内にあることになってい ます。これのおかげで、スタックへのPUSHを減らしているわけです。 I.Tak.さんの方法にするとなると、プロローグルーチンではワークエリ アの中に何が書いてあるか分からないときがあるので、PUSHして呼び出 す方法に変えなければいけません。これだとcmd0004かどうかの判定を なくす以上に、速度が落ちそうな気がします。 それでは。 -- 川合 秀実(KAWAI Hidemi) OSASK計画代表 / システム設計開発担当 E-mail:kawai !Atmark! imasy.org Homepage http://www.imasy.org/~kawai/