MB-6892

機械語とBASIC

機械語ルーチンのメモリ確保

BASIC領域と機械語領域のメモリマップは以下の通り。

BASIC領域のメモリマップ

スタックポインタSはBASIC領域内のBASIC空き領域に設定されている。

機械語ルーチンを配置するためのメモリを確保するには、CLEAR文を使用する。

CLEAR <文字列領域のサイズ>[,<BASIC領域の終了アドレス>]

BASIC領域を小さくして空いた部分を機械語ルーチンの領域にできる。

機械語ルーチンについて

BASICに戻るにはRTSを使う。このときスタックポインタSとダイレクトポインタDPは機械語ルーチン呼び出し時と同じ値に戻しておく必要がある。

機械語ルーチンの呼び出し方

EXEC文

EXEC文に続いて開始アドレスを指定することで、機械語ルーチンを呼び出すことができる。

USR関数

まず、DEFUSR文で実行開始アドレスを設定し、その後USR関数を呼び出すことで機械語ルーチンを実行する。番号は0~9まで計10通り設定できる。

DEFUSR[<番号>] = <開始アドレス>
<戻り値(変数)> = USR[<番号>](<引数>)

USR関数を実行すると、レジスタAに引数の型が、レジスタXが示すアドレスに引数の値が入る。USR関数が返す戻り値は、Xが示すアドレスに設定する。戻り値の型は引数と同じにすること。

なお、Xには通常$0056が入る。

A=2の時 整数型の内部構造

位置 バイト数 内容 意味
X 2 不定
X+2 2 整数データ 2の補数表記、ビッグエンディアン

A=3の時 文字列型の内部構造

位置 バイト数 内容 意味
X 1 文字列長さ 絶対数表記なので最大255文字
X+1 2 文字列ポインタ ストリングデスクリプタ ここに示したアドレスに文字列が格納されている。

A=4の時 単精度実数型の内部構造

位置 バイト数 内容 意味
X 1 指数部
X+1 3 整数部+仮数部 上位1ビットが整数部で常に1、残り23ビットが仮数部
X+8 1 仮数部符号 0 or $FF

A=8の時 倍精度実数型の内部構造

位置 バイト数 内容 意味
X 1 指数部
X+1 7 整数部+仮数部 上位1ビットが整数部で常に1、残り55ビットが仮数部
X+8 1 仮数部符号 0 or $FF

BASIC変数の内部構造

単純変数

単純変数の内部構造は以下の通り。VARPTR関数はデータ部のアドレスを返す。

位置 バイト数 内容 意味
0 1 属性+長さ 上位4ビット:型(2:整数型,3:文字列型,4:単精度実数型,8:倍精度実数型)
下位4ビット:変数名長さ-1(0~15なので変数名長は1~16)
1 len 変数名
1+len 属性の上位4ビット データ部 型により異なる(*)

* 整数型のデータ部

位置 バイト数 内容 意味
0 2 整数データ 2の補数表記、ビッグエンディアン

* 文字列型のデータ部

位置 バイト数 内容 意味
0 1 文字列長さ 絶対数表記なので最大255文字
1 2 文字列ポインタ ストリングデスクリプタ ここに示したアドレスに文字列が格納されている。

* 単精度実数型のデータ部

位置 バイト数 内容 意味
0 1 指数部
1 3 符号+仮数部 上位1ビットが符号、残り23ビットが仮数部

* 倍精度実数型のデータ部

位置 バイト数 内容 意味
0 1 指数部
1 7 符号+仮数部 上位1ビットが符号、残り55ビットが仮数部

実数の計算方法

実数の計算方法

配列変数

VARPTR関数に配列変数の各要素を渡すとそのデータ部のアドレスを返す。

位置 バイト数 内容 意味
0 1 属性+長さ 上位4ビット:型(2:整数型,3:文字列型,4:単精度実数型,8:倍精度実数型)
下位4ビット:変数名長さ-1(0~15なので変数名長は1~16)
1 len 変数名
1+len 2 配列の大きさ ここから最後のデータまでのサイズ(バイト数)
3+len 1 次元数
4+len 2 要素数1 最も右の次元の要素数+1
:

2 要素数n 最も左の次元の要素数+1


最初のデータ 最も左の次元からのデータ (0,0,..) (1,0,..) (2,0,..) ...
:

 

TOP PAGE