[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[OSASK 602] Re: knimu2.



  こんばんは、川合です。


ODP さんは 2000/05/07 20:36:51 の「[OSASK 600] Re: knimu2.」で書
きました:

>        こんにちは、ODPです

  おひさしぶり〜。元気?・・・やっぱり、このMLにODPさんの発言が
あるとうれしいです(注:OSASK-MLの始まりをたどると、僕とODPさん
との個人的なやり取りがきっかけだったのです)。

>恥ずかしいですが、今回初です。やってみたらカウンタ表示が出なくて
>「うお〜なぜだ〜」とか叫びましたが、メールを読み直して正しくやり直す
>ことで無事カウンタを回すことができました。

  もしかして、ANK16.FNTをコピーしてなかったとか?

>さて、2時間ほど回しっぱなしにしましたが、問題のハングはありません
>でした。これでTAPIのOSASKバージョン(の根幹部分)ができたという
>事でしょうか?

  ふむ。やっぱり問題無しか。良かった〜。もう、一時はどうなるかと
思ったからねえ。あんなに不安定じゃWin以下だし、かと言ってバグは
「なぜかしばらくすると発生する(しかも同じ条件でも毎回発生タイミ
ングが違う)」っていう一番原因がわかりにくいやつだったし・・・。
どうにかしてごまかせないかと最初は真剣に考えたよ。とりあえずごま
かしておいて、ソース公開のときに誰かに直してもらおうかと・・・。

  でもさ、まだ15KBにも満たないサイズなのに、デバッグできないなん
てあまりにも情けないから、がんばったよ。ここであきらめたら、マイ
クロソフトに負けちゃうもんね。

  TAPIの完成度についての質問だけど、開発部長らしい良い質問です。

  根幹部分ができた、といえなくもないのですが、やっぱり正確には、
根幹部分の「一部」ができた、といったところでしょう。

  TAPIは、おおざっぱにいって、以下の部分に分けられます。

・コア(根幹部分)
・システム高速インターフェース
・アプリ高速インターフェース
・アプリ安全インターフェース

  (注:3種類のインターフェースの違いについては、[OSASK:039]な
どで説明されています。)

  そして、この「コア」部分は以下の部分で構成されています。

・タイマー割り込みハンドラ(時分割マルチタスク用)
・タスク切り替えルーチン
・グローバルレベルコントローラー
・インナーレベルコントローラー
・ローカルレベルコントローラー
・拡張レジスタローダー/セーバー(FPU、MMX、3DNow!、SSEなど)
・タスク間通信メッセージバッファコントローラー
・タスク間通信シグナルコントローラー

  ・・・他にもあるかも・・・。

  このうち、グローバル・インナー・ローカルのレベルを制御する部分
は全然書いていません。メッセージバッファコントローラーも書いてい
ません。拡張レジスタのローダー/セーバーもありません。・・・って
いうか、タイマールーチン自身がまだぼろぼろで、TAPIに機能を拡張で
きる段階にないんです。

  さらにひどいことに、タイマーもTAPIもインターフェース部は全くで
きていません。

  これはですね、リリースに追い立てられると、どうしても「デモ・オ
リエンテッド」なプログラミングになってしまうせいなんです。見える
部分の完成を急いでしまって、見えない部分は後回しになってしまうん
です。見える部分を先に作ると、達成感があるので、開発ははかどりま
す。・・・多分、ASKA/OSASKをリリースするころには、この悪癖は収ま
るでしょう。なぜなら、僕以外の人がアプリケーションを書くようにな
れば、ちゃんとシステムコールできるようにしてほしいって周りから急
かされるようになるでしょうから。

  多分、ODPさんには興味を持ってもらえると思って、カウントタスク
のコードをお目にかけます。

void near Init_Countup()
// これが、メインルーチン。単なる永久ループ。
{
    int counter == EAX;

    counter = 0;
    EBP = 0xffffffb8;

    for (;;) {
        [SS:EBP] = counter;
        counter++;
    }
}

void far Init_SoftInt0()
// タイマーシグナルで呼び出される。
// EAX以外の汎用レジスタは保存しなくてよい。
{
    PUSH(DS);
    PUSH(GS);
    PUSH(EAX);
    ESP -= 12; // スタック上にストリングバッファを確保。
    AX = SS;
    ESI = ESP;
    DS = AX;
    GS = AX;
    /* (char) [DS:ESI+8] = 0 */ asmout("MOV BYTE PTR DS:[ESI+8],0");
    EAX = [SS:0xffffffb8]; // カウント値リード
    ui32toa(); // itoaのunsigned int版。
               // EAXの値をDS:ESIからの8バイトに16進数で書く。
    EAX = [SS:0xffffffb0]; // 表示位置のx座標。タスクごとに違う。
    ECX = 250; // 表示位置のy座標。
    EDX = 0x0200; // 表示色
    output_string(); // GS:ESIからのASCIZ文字列を出力
    ESP += 12;
    POP(EAX);
    POP(GS);
    POP(DS);
    return;
}

  ui32toa()は大した事ないストリングルーチンで、output_string()は
GAPIを呼び出しているだけの面白くないくせい長いルーチンなので、こ
こでは割愛します。

  こういう、プログラム関係の質問や意見もお待ちしておりますから、
いつでもメールしてください。


  それでは。

--
    川合 秀実(KAWAI Hidemi)
川合堂社長 / OSASK計画総指揮 / カーネル開発班
E-mail:kawai !Atmark! imasy.or.jp
Homepage http://www.imasy.or.jp/~kawai/