[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/