[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]
[OSASK 3186] Re: BMPV05 Release
- Subject: [OSASK 3186] Re: BMPV05 Release
- From: Hidemi KAWAI <kawai !Atmark! imasy.org>
- Date: Mon, 11 Feb 2002 00:11:20 -0000
こんにちは、川合です。
rakkyo さんは 2002/02/10 23:49:25 の「[OSASK 3184] BMPV05 Releas
e」で書きました:
>川合さんご指摘ありがとうございました(^^
どういたしまして。こちらこそ、よいアプリケーションを作って公開
していただいてとても助かっています。
>BMPV04で指摘された所を修正した、BMPV05を公開しました。
>http://homepage2.nifty.com/rakkyo-taro/
>の小物よりダウンロード出来ます。
>
>修正点ですが、ファイルサイズ0問題に今度こそ対応したのと、mallocを使わな
>いようにしたので、906バイトまで縮みました。
非常に良くなりましたね。mallocの部分は無駄に感じていたので、こ
れがなくなってすっきりしたのはとても嬉しいです。
>何か不都合を見つけた方はご一報下さいm(_ _)m
たいしたことではないのですが、Macバイナリーの部分にちょっと不
安を感じました。285行目の「EDI+=128;」を以下の文と差し替えた方が
いいのではないでしょうか?
EAX -= 128; /* skip Mac binary header */
EDI += 128;
if (EAX < 0x07)
goto error;
ちなみにこれも128の代わりに-128という定数を使うとコンパクトにな
るというテクニックを使うと6バイトほど節約できるので、どうせなら
こちらがお勧めです。
EAX += 0 - 128; /* skip Mac binary header */
EDI -= 0 - 128;
if (EAX < 0x07)
goto error;
---
ついでなので、いくつか「せこい」ことを伝授します。気に入ったら
使ってみてください。
301〜302行目の
> if(EAX < 136)work->lib_openwindow.x_size = 136;
> else work->lib_openwindow.x_size = EAX;
ですが、このように-128〜+127でない定数が何度も出てくるなら、適当
なレジスタに入れておくとサイズが稼げます。
EDX = 136;
if (EAX < EDX)
work->lib_openwindow.x_size = EDX;
else
work->lib_openwindow.x_size = EAX;
また、elseを使わずに済むなら、使わない方が速くてコンパクトです。
・・・ということで、お勧めは以下の通りです。
EDX = 136;
if (EDX <= EAX)
EDX = EAX;
work->lib_openwindow.x_size = EDX;
次に433〜436行目の
> SHR(AL, 1);
> asmout("JC w_skip_2");
> [DS:ESI] = CH;
>asmout("w_skip_2:");
ですが、ASKAでは普通こう書きます(書き直してもコンパクトにはなり
ません。ソースが読みやすくなるだけです)。
SHR(AL, 1);
if (CF == 0)
[DS:ESI] = CH;
それと、337行目の
> EDI = work->fp;
はいらないと思います。だって、誰もEDIの値をいじっていませんから
。API呼び出しの際にtek0の展開コマンドを使わない限り、EDIの値は変
化しません。安心してください。変わるのはEBXだけです。
・・・そうなると、288行目の
> work->fp = EDI;
もいらなくなりますし、そもそもfpという変数が不要ということになり
ます。・・・そういえば、malloc_addr0もいりませんね。freeも。
それでは。
--
川合 秀実(KAWAI Hidemi)
川合堂社長 / OSASK計画総指揮 / カーネル開発班
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/