[index > X68kの読み物や資料の部屋]

[前へ戻る] [次へ進む]

関数呼び出し(引数・戻り値)


環境

[戻る]


引数のインタフェース

引数の数や型の定義については「関数定義」を参照してください。

引数はスタックを介して渡されてきます。 先頭(sp+4)に引数の数(1w)が積まれ、引数1つに対し10バイトがそれに続きます。 フォーマットは以下の通りです。

Addr.  Sz. 意味
====== === ==================================
sp+4   1w  引数の数
------ --- ----------------------------------
sp+6   1w  第1引数の型
             0 : float型
             1 : int型
             2 : char型
             3 : str型
             -1: 省略された
sp+8   2l  第1引数(上位バイトは0埋めされる)
------ --- ----------------------------------
sp+16  1w  第2引数の型。以下省略

ポインタを渡す引数(文字列・配列含む)の場合に引数の型にどのような値が入るかは不明です。 また、引数は下位に格納され、上位バイトが余る場合は0埋めされます(第1引数がchar型の場合は、 sp+8〜sp+14がすべて0で、sp+15に引数が入っています)。

セットする必要のないパラメータはきちんと設定されないという噂です。 引数を省略できない場合の引数の数など、値が自明であるパラメータは参照しない方が無難です。

引数を省略できる関数にした場合、BAStoC時に引数が省略されている部分に'NASI'を当てはめる (C言語は引数を省略できないため)ので注意が必要です。 勿論、引数がfloat型の場合はdoubleに型変換された'NASI'が渡されてきます (X68kでは浮動小数点数のフォーマットにFLOAT1のシャープフォーマットとFLOAT2/3/4のIEEEフォーマットの2種類があり、 2つの間に互換性がありませんが、FLOAT1はまったく使われないので無視して構いません)。

[戻る]


戻り値のインタフェース

戻り値の型の定義については「関数定義」を参照してください。

戻り値は特定のフォーマットの領域(FACと呼ばれる)に設定し、その先頭アドレスをa0に代入します。 関数が戻り値を持たないとき(voidで宣言されているとき)はa0は参照されません(不定でよい)。 FACの内容は以下の通りです。 (書きませんでしたが、引数の1つ1つもこの形式で格納されていて、これもFACと呼ばれます)

fac:    .dc.w  0  * 書き換え不可。ここのアドレスをa0に代入する
fac+2:  .ds.l  2  * 下位に詰めて代入する。余った上位は不定のままでよい

d0にはシステム変数のerrnoに設定する値を指定します。 d0に0以外の値を設定してrtsすると、 インタプリタは外部関数エラーとしてBASICプログラムの実行を停止します。 ただしerror offモードの場合は実行を継続します。

a1には外部関数エラーのとき(d0に0以外の値を持ってrtsするとき)に表示するエラーメッセージを指定します。 d0が0のときは外部関数エラーではないのでa1は参照されません。また、d0が負のときも参照されず、 システム定義のエラーメッセージが表示されます(DOSコールのエラーメッセージに対応しているようです)。 そのシステム定義のエラーメッセージは以下の通りです。(以下は純正での一覧です。 ぺけBでは発生することがないと思われるメッセージが省略されているようです)

<-26 未定義のファンクションコールエラーです
-1   無効なファンクションコードを実行しました
-2   指定したファイルは見つかりません
-3   指定したディレクトリは見つかりません
-4   オープンしているファイルが多すぎます
-5   ディレクトリやボリュームラベルはアクセスできません
-6   指定したハンドルはオープンされていません
-7   メモリ管理領域がこわされました
-8   実行するのに必要なメモリがありません
-9   無効なメモリ管理ポインタを指定しました
-10  不正な環境を指定しました
-11  実行ファイルのフォーマットが異常です
-12  オープンでアクセスモードが異常です
-13  ファイル名の指定に誤りがあります
-14  無効なパラメータでコールしました
-15  ドライブ指定に誤りがあります
-16  カレントディレクトリは削除できません
-17  ioctrlできないデバイスです
-18  これ以上ファイルは見つかりません
-19  このファイルは書き込みができません
-20  このディレクトリはすでに登録されています
-21  ファイルがあるので削除できません
-22  ファイルがあるのでリネームできません
-23  ディスクがいっぱいでファイルが作れません
-24  ディレクトリがいっぱいでファイルが作れません
-25  指定の位置にはシークできません
-26  スーパーバイザ状態で、再びスーパバイザモードの指定を行いました

[戻る]


変数

普通の変数は特に注意することはありません。任意のアドレスに値が入っているだけです。

文字列変数

文字列は、Cやアセンブラと同じく、&h00を文字列末尾の識別子にするバイト列です。 &h00から後ろはおそらく不定です。

BASICでは文字列変数の最大長(宣言したときの長さ)を得る方法はありません。 なお、コンパイル時、C言語レベルでは得ることができます。

配列変数

BASICの配列変数にはヘッダが付き、外部関数から配列変数に関する情報を得ることができます。

 + 0 ┌───────┐
     │    2words    │データ領域へのオフセット
 + 4 ├───────┤
     │    1word     │配列の次元数-1(0:1次元配列)
 + 6 ├───────┤
     │    1word     │データのサイズ(char:1・int:4・float:8・str:1(2?)〜255(256?))
 + 8 ├───────┤
     │    1word     │添字の値(0〜65535)
(+10)├───────┤
     │   (1word)    │(2次元目の添字の値)
(+12)├───────┤
     │   (2words)   │((*,0)へのオフセット(=(0,0)〜(0,最後)のサイズ)
 + n ├───────┤
     :              :データ領域 

※1次元配列の時は()付のところは存在しません。

3次元配列以上の場合は同様な情報が続きます。

[戻る]


[前へ戻る] [次へ進む]

[index > X68kの読み物や資料の部屋]

Written by mor.

最終更新は2001年10月31日(水)です。