<html><head><title>Pioneer0 Command Reference</title></head><body><div> <h1 align=center>pioneer0 ライブラリ コマンドリファレンス</h1> <div align=center>Jenny5(OSASK v4.3)版<br>2004.01.30</div> <div align=center>編: I.Tak. <g240845@mail.ecc.u-tokyo.ac.jp><br>Under terms of Kawaido License-01</div> ---- *目次 -目次 -概要 -予備知識 --i.ライブラリコールの使い方 --ii.slot --iii.セグメントセレクタ --iv.用語の違い (「ボックス」と「キャラクタセット, フォント」) --v.アプリ起動時のレジスタ --vi.参照した資料 --vii.セグメントオフセット -リファレンス --<a href="#0000">0x0000:コマンド列終了</a> --<a href="#0004">0x0004:ライブラリ初期化</a> --<a href="#0004_1">0x0004.-1:特別モード終了</a> --<a href="#0004_7e">0x0004.-0x7e:tek0伸長</a> --<a href="#0004_7f">0x0004.-0x7f:l2d3伸長</a> --<a href="#0008">0x0008.0:ライブラリ終了</a> --<a href="#000c_0">0x000c.0:コマンドジャンプ相対</a> --<a href="#000c_1">0x000c.1:コマンドジャンプ位置</a> --<a href="#0010">0x0010:シグナルハンドラ定義</a> --<a href="#0014_10">0x0014.0x10:ウィンドウ推奨最大サイズ取得</a> --<a href="#0018_f">0x0018.0x0f:シグナル・時間待ち</a> --<a href="#0018_80">0x0018.0x80:シグナルハンドラ終了</a> --<a href="#001c">0x001c:ノーオペレーション</a> --<a href="#0020">0x0020.0:ウィンドウオープン</a> --<a href="#0020_1">0x0020.1:拡張ウィンドウオープン</a> --<a href="#0024">0x0024.0:ウィンドウクローズ</a> --<a href="#0028">0x0028.0x1011.テキストボックスオープン</a> --<a href="#002c">0x002c.テキストボックスクローズ</a> --<a href="#0030">0x0030.グラフィックボックスオープン・スクロールなし</a> --<a href="#0030_27">0x0030.0x27.16bpp,32bppグラフィックボックスオープン</a> --<a href="#0030_2">0x0030.2.グラフィックボックスオープン・スクロールあり</a> --<a href="#0030_0">0x0030.0.既存グラフィックボックスオープン</a> --<a href="#0038">0x0038.なし</a> --<a href="#003c">0x003c.0x33.ウィンドウ制御 (ソース上でかけ離れている)</a> --<a href="#0040">0x0040.0x051.テキストボックス文字列書き込み</a> --<a href="#0044">0x0044.0xf0.線・長方形描画</a> --<a href="#0048">0x0048.1.文字列描画</a> --<a href="#004c">0x004c.0x27.画像描画</a> --<a href="#004c_8027">0x004c.0x8027.画像描画やや安全 (グラフィックボックスフラッシュ)</a> --<a href="#0050">0x0050.0x80c0.点描複数</a> --<a href="#0054">0x0054.0x80c0.グラフィックボックス線描</a> --<a href="#0058">0x0058.0x2001.グラフィックボックススクロール</a> --<a href="#0058_3001">0x0058.0x3001.グラフィックボックス差分スクロール</a> --<a href="#0058_4027">0x0058.0x4027.グラフィックボックスフラッシュ</a> --<a href="#005c">0x005c.0x80c0.グラフィックボックス点描複数</a> --<a href="#0060">0x0060.シグナルボックスオープン</a> --<a href="#0064">0x0064.なし</a> --<a href="#0068">0x0068.シグナル定義</a> --<a href="#0068_10">0x0068.0x10.タイマーシグナル定義</a> --<a href="#0068_100">0x0068.0x100.文字入力シグナル定義</a> --<a href="#0068_200">0x0068.0x200.低レベルマウスシグナル</a> --<a href="#0068_0">0x0068.0.シグナル定義終端</a> --<a href="#006c">0x006c.シグナルを自分に送る</a> --<a href="#0070">0x0070.タイマーオープン</a> --<a href="#0074">0x0074.タイマークローズ</a> --<a href="#0078_1">0x0078.1.タイマー停止</a> --<a href="#0078_32">0x0078.0x32.タイマー設定</a> --<a href="#0078_81">0x0078.0x81.タイマー時間差設定</a> --<a href="#0078_82">0x0078.0x82.タイマー時間差取得</a> --<a href="#007c">0x007c.圧縮データ伸長</a> --<a href="#007c_0">0x007c.0.サブコマンド終了</a> --<a href="#007c_-7">0x007c.-7.書き込み先指定</a> --<a href="#007c_-7f">0x007c.-0x7f.l2d3データ伸長</a> --<a href="#007c_-7e">0x007c.-0x7e.tek0データ伸長</a> --<a href="#0080">0x0080.0.サウンドトラックオープン</a> --<a href="#0084">0x0084.サウンドトラッククローズ</a> --<a href="#0088">0x0088.なし</a> --<a href="#008c">0x008c.サウンドトラック制御</a> --<a href="#0090">0x0090.なし</a> --<a href="#0094">0x0094.なし</a> --<a href="#0098">0x0098.なし</a> --<a href="#009c">0x009c.なし</a> --<a href="#00a0">0x00a0.0x1c.モジュールハンドル初期化アプリ</a> --<a href="#00a0_e0">0x00a0.0xe0.モジュールハンドル初期化シェル</a> --<a href="#00a0_ff">0x00a0.-0xff.モジュールハンドル初期化シェルのサブコマンド</a> --<a href="#00a4">0x00a4.なし</a> --<a href="#00a8">0x00a8.モジュールハンドル複写 (未詳)</a> --<a href="#00ac">0x00ac.モジュールハンドル移動8.3</a> --<a href="#00ac_fd">0x00ac.-0xfd.モジュールハンドル移動8.3のサブコマンド</a> --<a href="#00b0">0x00b0.モジュール作成 (未詳)</a> --<a href="#00b4">0x00b4.なし</a> --<a href="#00b8">0x00b8.なし</a> --<a href="#00bc">0x00bc.なし</a> --<a href="#00c0">0x00c0.0.モジュールマッピング</a> --<a href="#00c4">0x00c4.モジュールマッピング解除 (未詳)</a> --<a href="#00c8_fe">0x00c8.-0xfe.モジュール種別取得 (未詳)</a> --<a href="#00c8_fd">0x00c8.-0xfd.モジュールサイズ取得 (未詳)</a> --<a href="#00cc">0x00cc.なし</a> --<a href="#00d0">0x00d0.-0x100.モジュールタグリスト (未詳)</a> --<a href="#00d4">0x00d4.なし</a> --<a href="#00d8">0x00d8.なし</a> --<a href="#00dc">0x00dc.なし</a> --<a href="#00e0">0x00e0.1.フォント定義</a> --<a href="#00e0_2">0x00e0.2.半高フォント定義</a> --<a href="#00e0_4">0x00e0.4.半高カラーフォント定義</a> --<a href="#00e0_80000001">0x00e0.0x80000001.システムANKフォント読み込み</a> --<a href="#00e0_80000002">0x00e0.0x80000002.システム半高ANKフォント読み込み</a> --<a href="#00e0_c0000011">0x00e0.0xc0000011.システムJIS+MSフォント読み込み</a> --<a href="#00e0_c0ffffff">0x00e0.0xc0ffffff.OSASK自動拡張フォント読み込み</a> --<a href="#00e4">0x00e4.0.フォント開放 (未詳)</a> --<a href="#00e8">0x00e8.フォントセット定義</a> --<a href="#00e8_0">0x00e8.0.フォントセット終端</a> --<a href="#00ec_1">0x00ec.1.シフトJISデコード</a> --<a href="#00ec_2">0x00ec.2.EUCデコード文字集合2</a> --<a href="#00ec_3">0x00ec.3.EUCデコード文字集合4</a> --<a href="#00f0">0x00f0.セグメント作成 (未詳)</a> --<a href="#00f4">0x00f4.なし</a> --<a href="#00f8">0x00f8.なし</a> --<a href="#00fc">0x00fc.なし</a> --<a href="#0100">0x0100.なし</a> --<a href="#0104">0x0104.なし</a> --<a href="#0108">0x0108.0x80c0.グラフィックボックス線描複数</a> --<a href="#010c">0x010c.0.線データ変換</a> --<a href="#0110">0x0110.0x80c0.線描複数</a> --<a href="#0114">0x0114.0.グラフィックボックス文字列描画</a> --<a href="#0114_ff">0x0114.0xff.メモリ文字列描画</a> --<a href="#0118">0x0118.0.乱数取得</a> --<a href="#11c">0x011c.なし</a> --<a href="#0120">0x0120.0.モジュールサイズ変更</a> -付録 --<a href="#a0">APIの実行を追い掛けてみよう</a> ---- *概要 これはOSASKのGUIGUI00仕様API, pioneer0ライブラリのコマンドを網羅的に扱う私製リファレンスです。 自分でプログラムする際に参照しています。 主にアセンブラの使用者を対象にしていますが, guigui00.hのマクロ名, 関数名もそれなりに掲載しているので Cから呼び出す方も使えるかと思います。 ---- *予備知識 **i.ライブラリコールの使い方 基本的には, コマンドをメモリ上に羅列し, 先頭のポインタをDS:EBXに代入して, ライブラリを呼び出します。ぐいぐい00仕様では, DSの値を起動時にシステムがセットしてくれるので, ユーザはEBXに代入するだけです。コマンド列の終端はコマンド列終了コマンドで指示します。 guigui00.hを使う場合, <code>lib_execcmd0</code> や <code>lib_execcmd1</code> がこの処理を肩代りします。 ***i.i.NASMで 以下のようにします。 mov ebx, work.lib_init call 0xc7:0 ***i.ii.Cで 説明不要かも知れませんが。 static void* cmd[]={hoge,rage, ..., 0 /* eoc */};<br> lib_execcmd(&cmd);<br> lib_execcmd0(hoge, rage, ..., 0 /* eoc */);<br> lib_execcmd1(12+4*2, hoge, rage, buf, ..., 0 /* eoc */); と書きます。配列を使う場合, 川合さんの例のように <code>void*[]</code> としてコマンドを定義するのが楽です。<code>execcmd1</code>の一つ目の引数は <code>12+4*n</code> となっており, コマンド列のn番目の数値を返り値にします (この場合, hogeがn=0の位置)。 **ii.slot アプリケーションが自由に使えるスロット番号は, 0x200から0x3f0までの16の倍数です。スロットの競合・共有は許されません。 **iii.セグメントセレクタ セグメントセレクタを特に指定しない (させてもらえない) 場合はdsが使われる模様です。またライブラリは ds=ss=fs を仮定しているため, コードセグメントにコマンドを置くことは許されません。 セグメントセレクタは16ビットですが, 32ビットデータとして書くときは上位16ビットを0で埋めなければなりません。 **iv.用語の違い (「ボックス」と「キャラクタセット, フォント」) -テキストボックス, グラフィックボックスなどの<q>ボックス</q><br> 画面に表示される四角い領域のことであるとします。また, その情報を保持するメモリ領域はバッファと呼んでおきます。川合さんは区別していないようですが, 区別しないと書きにくいので区別します (しかし「シグナルボックス」はただのメモリ領域です。ああややこしい)。 -キャラクタセット (文字集合) とフォント<br> 川合さんは「フォントはグリフ一つ, フォントセットはグリフの集合, フォントセットの集合が文字集合」という<strong>ような</strong>使い方をしていますが, ここでは一般的な (と思われる) 用語にしています。なお, 一般に, 文字集合は「扱う文字を規定し通し番号を振ったもの」とされています。 フォントは一定のデザインの図形の集合, フォントセットはフォントの集合です。 -オプションによってコマンドの動作が大幅に変わる場合, 同じコマンドの中でも分けて書いています。 **v.アプリ起動時のレジスタ eax=ecx=edx=ebx=esp=ebp=esi=edi=0<br> cs=7<br> ds=ss=es=fs=0xf<br> gs=未定<br> eip=0<br> CF=PF=AF=ZF=SF=DF=OF=0 この値は保証されていて, 決め打ち可能です。<br> 参考: <a href="http://www.afis.to/~mone/osask/osask_ml/200112/msg00166.html">[OSASK 2743] Re: ぐいぐいプログラミング質問</a><br> <a href="http://www.afis.to/~mone/osask/osask_ml/200201/msg00192.html">[OSASK 3035] エラー情報解説(1).</a> **vi.参照した資料 -OSASK-ML -test0??.c @beta(一部古い仕様のものあり) -music01d.ask @beta -beditc00.c -tviewc05.c -intro???.lzh -pack00?s.lzh (主に004s) -guide06.lzh -gglib8b.lzh -pokon0.c (ウィンドウ拡張オープン) -pioneer0.ask (コマンド取り次ぎだけの場合もある) -init.ask (そのときはこれを読むと分かることもある) -vgadrv0.ask (initも取り次ぎのときもあった) -go9s (gcc for OSASK のソース) 最近はtestシリーズのドキュメントを読みつつ, pioneer0のソースを読んでこっそり変更されているところを探すという感じです。 不明瞭なところには「未詳」などと書いておきました。 なお同封の introlst.txt にintroシリーズの順序および概要とpack, testシリーズの概要を書いてあります。不明の点は自分でサンプルを読んでみてください (もちろん, 改善案は歓迎します)。コマンドごとの解説では説明しにくい全体の概念もあると思います。 **vii.セグメントオフセット ダブルワードにアラインしておくべきです (ポインタを4の倍数にしておく。速くなる)。さもないと, APIが下位の2bitsをフラグとして使うことが多いので誤作動の原因になります。 ---- *リファレンス ---- *付録 **<a name=a0>APIの実行を追い掛けてみよう</a> アプリを作っていて, 「絶対OSASKのバグだ! 俺のせいじゃない!」と思ったら, ソースを読んでみましょう。 <ol> -まずユーザプログラムから far call されると, pioneer0.ask は初期化を始めます。 ソフト割り込みを禁止し, スロット 0x01f0 を使ってワークエリアのポインタを読みこみます。 最初のコマンドが初期化コマンドだと, 読み込みは初期化コマンドの中でされます。 -[ds:ebx] からコマンドを読みこみ, 適当に GUGUI統合 shell call をします。 0x0017:0x00000000 への far call は init.ask に繋がります (コールゲートというやつですかね)。 -init.ask の GUIGUI_shellcall に飛びこみます。ここでも [gs:ebp] からコマンドを読みながら実行していきます。 -tapi_sel への far call がよく出てきます。これは /* コマンドシグナル云々 */ と書いてあったらまず間違いなく winman0 へのシグナル送信です。 そのコマンドの中に 0x7f000000 + N, hoge, rage, ... というくだりがあり, 0x7f000000 + N 以降の N 個のdwordが winman0 が実際に受けとるシグナルになります。 一例として <blockquote> 0x0128, 0x3240 /* winman0 */ + 6, 0x7f000005, 0x0048, EAX, [DS:0x000c], cmd[0], cmd[4] </blockquote> というのを取り上げると, 左から順に, tapiのコマンド, tapi用送信先+長さ, pioneer用送信先 (ユーザアプリ) +長さ, winman0 が受け取るシグナル……, と読みます。 -シグナルを送信したりしてコマンドが終わったらreturnします。以下マルチタスク。 -winman0 の中では, シグナルを受信するループでほとんどの処理がされます。 しかし別なシグナルを待たないといけない処理はジョブとしてキューに入れられ, 後回しになります。 -pokon にシグナルを送りつけたり描画したりウィンドウを管理したり色々な処理がされます。 </ol>