[OSASK 6615] Re: p0cref.html

  こんばんは、川合です。


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/

ML番号でジャンプ
ML単語検索