MacintoshのCarbonライブラリ関数は、PowerMops自体が既に相当数のものを利用していますが、まだ取り込まれていない関数は、"SYSCALL"宣言によって呼び出し可能となります。APPLEから配布されているユニバーサルヘッダに含まれているものは、パラメター情報がMops内に格納されているので、関数名を宣言するだけで大丈夫です。例えば、
SYSCALL GetGWorld
関数名は、宣言時には大文字と小文字を正確に書き分ける必要があります。これは、Macintosh APIの関数名が、大文字小文字の違いで関数を区別しているからです。
一旦、宣言されると、後はMopsワードと同じように、ポストフィックスのワードになります。つまり、パラメターをスタックに積み、関数を呼び出すと、パラメターは費消されて戻り値がスタックに残されます。スタックには特定の型はないので、変数の型は特に意識する必要はありません。もちろん、値そのものには「型」(意味)はありますから、例えば構造体のポインタを引数にしなければならない場合には、その構造の構造体をつくってそのアドレスを与える必要は当然あります。値としては引数のバイト幅も一般には問題になりませんが、整数であるのか/浮動小数点数であるのかは、意識しなければなりません。浮動小数点数パラメタは、FPスタックに置く必要があります。また、変数のアドレスを引数として渡す場合(大域変数か変数オブジェクトを使う -- Cではよくある)には、値の出し入れ(オブジェクトならクラスの決定)の際に、バイト幅が何バイトで格納されるのかを意識しなければなりません。
パラメタの順番は、Cでのプロトタイプ表示のパラメタの順になります。つまり、左端が、スタックの一番下ということになります。
OSStatus AFunc( long A, int B, void* C);
なら
A B C AFunc \ OSStatusがトップスタックに返る
新しいCarbon関数には、PowerMopsに登録されていないものもあります。関数が見つからないというエラーが表示された場合には、まず、スペルミスを疑うべきですが、それでもダメな場合には、このケースの疑いがあります。この場合でも、通常のCライブラリ関数を呼ぶためのlibcallをCarbonLibに適用してパラメターデータを与えることによって呼び出すことができます。
関数が見つからなかったとき、Mopsウィンドウにsymbol not found エラーが表示されます。
iMopsでは、syscallのときも、引数と戻り値を中括弧{}でくくって、合わせて宣言する必要があります。例えば、上のAFuncなら、
SYSCALL AFunc { A B C -- err }
のようにします。localsの宣言と同じです。
関数の呼び出し方は上と同じです。
関連項目:
最終更新:2020年02月19日 23:21