機械語と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,..) ... | ||
: |