WonderWitchメモ

!!! 無保証です !!!
ここに書かれている内容については、できるだけ正確を期すように 心がけてはいますが、一切の保証はできません。 もしおかしな記述を見つけた時には、お知らせ下さるとありがたいです。


FreyaBIOS内でのAXレジスタ破壊

FreyaBIOSをアセンブラなどから直接呼び出す場合、マニュアルに 「戻り値なし」と書かれていても、AXレジスタは破壊されるものとして 扱ったほうがいいようです。(サポートに問い合わせました)
もしかすると、x86系では常識に類することなのかもしれませんが、 私はx86のアセンブラでまともにプログラムを組むのはWonderWitchが 初めてなので、はまりました。
(でもたとえ常識だとしてもちゃんと明示しといてほしい…)


リソースアクセスのサンプルコード

WWitch/doc/appendix/toolext.htmにリソースアクセスの サンプルコードが載っていますが、このコードではリソース全体の 大きさが64kバイトを超えると正しく動作しません(DMC++の出力コードで確認)。 リソース一つではなく、結合されている全てのリソースの合計で 64kバイトまでです。_pc->_resourceが正規化されていない場合は さらに上限が小さくなる可能性があります (2001/11/24)ちゃんと正規化されている模様です。

「各リソースのサイズには、基本的に制限はありません」とあるので、 サンプルは64kバイト超のリソースに対応しているのかと思ったのですが、 「扱うプログラム側が対応していない」例のようです。(;p

動作しない原因は、「farポインタに対する演算ではセグメント値が 更新されない」ということのようです。
このことについて、PCプログラミングVol.3(技術評論社)の わんだらぁさんの記事中でも触れられています。


インダイレクトライブラリのメソッド数

インダイレクトライブラリ(以下IL)は実行時に動的にアドレス解決を しますが、アドレス解決に使用する構造体の大きさは、各ILに対応する ヘッダファイルで定義されることになっています。ILを呼び出したい プログラムは、この構造体へのポインタをOSに渡してアドレス解決を してもらうのですが、OSからは渡された構造体の大きさを知ることが できません。もし、ILがバージョンアップしてメソッド数が増えていたり すると、OSは構造体の範囲外のメモリ領域を書き換えることになるはずです。 (実際の動作は確認していません。ごめんなさい(^^;;)

ということで、ILのメソッド数を後から増やすことは極力避け、もし 増やす場合には、対応プログラムの再コンパイルを徹底する必要が あると思われます。


キャラクタフォント90度回転ルーチン集

キャラクタフォントを90度回転させるルーチンがBIOSやライブラリに 用意されていないので、作ってみました。時計回り90度回転のみですが、 それ以外の角度は上下/左右反転機能を組み合わせて作ってください。(^^;;
グレースケール/4色カラーモード用、16色カラーモード用、16色カラーパックト モード用の3種類あります。 NASM(Netwide Assembler)用のソースです。
これ

実は、実機ではまだ動作確認してません(^^;;
が、DOS上でテストプログラムを作って一応の検証はしましたので、 アルゴリズム自体はたぶん大丈夫と思います。

(2001/12/19)モノクロフォント(text_get_fontdata()で得られるフォント)用の 回転ルーチンを追加。あと、ファイル名・関数名を変更。
グレースケール/4色カラーモード用とモノクロフォント用については 実機で動作確認しました。…って言っても使い方まだ書いてないな(^^;;


LSI-C86 for WonderWitch処理系を使う際の一口メモ、あるいはバグリスト

===== kmmake =====

・.SUFFIXESのクリアができない
暗黙的ルールの適用順序を変更するために.SUFFIXESリストをいったんクリアしようとして、
.SUFFIXES:
のように書いても、実際にはリストがクリアされないようです。
そのため、意図しない暗黙的ルールの適用を避けられない場合があります。
(makedefファイルを書き換えるなりすればいいんですが、そうすると ソース配布時などに問題が…)

Digital Mars C/C++処理系を使う際の一口メモ、あるいはバグリスト

===== smake =====

・$**の展開に失敗する
$**は「全ての依存ファイル名のリスト」に展開されるマクロですが、 なぜかリスト全体を" "で括ってしまうため、正しくコマンド を実行できません。
・!command構文の読み取りに失敗する
smakeにはシェルスクリプトのforeach構文と似た動作をする「!command」 (コマンド名の前に!を付ける)という構文がありますが、読み取りに 失敗してエラーになります。どうやら、!で始まるディレクティブ形式の 一種と誤認しているようです。
内部処理自体はちゃんと残っているようで、「-!command」などとして !が先頭に来ないようにすれば動作します。
・!command構文中で$**の展開に失敗する
!command構文中で$**マクロを使うと通常とは違う動作になり、 依存ファイル名を一つずつ$**の位置に展開してコマンドを繰り返し 実行するようになります。
しかし、$**の展開処理がバグっていて、展開された依存ファイル名が 必ずコマンドラインの最後尾に来てしまいます。 このため、依存ファイル名を最後尾以外の場所に置きたい場合、 正しく動作させることができません。

==> 結局、私はsmakeを捨ててGNU makeに逃げました。(^^;;

===== lib =====

・/cオプションを使うと、その度にライブラリを新規作成してしまう
/cオプションは「指定したライブラリが存在しない場合、確認なしで ライブラリを新規作成する」というオプションですが、ライブラリが 既に存在する場合でもそれを消して新規作成してしまうようです。
このため、実質/cオプションは使えません。
・レスポンスファイルを途中で改行すると意図しない解釈をされる
このため、レスポンスファイルを使う場合は改行なしで書く方が安全です。
・オブジェクトファイルの指定方法を間違えるとライブラリが破壊される
ライブラリ中のオブジェクトを更新する際、
lib foo.lib -+hoge.obj
とするところを、間違えて
lib foo.lib hoge.obj
と書いて実行すると、ライブラリを破壊してしまうようです。
こうなった場合、素直にライブラリを削除して構築しなおした方がいいようです。

(2003/01/11補足)DMC8.31から、lib.exeが大きく変わっているようです。 コマンドラインの書式が違うようなので、これから調べてみます。
(2003/01/13補足)どうやら前の書式もサポートしているみたいです。 (ドキュメントをちらっと読んだだけで、確認してませんが)


WonderWitchへ戻る  トップページへ戻る