ファミリーベーシック 関数一覧|RND・ASC・MID$ を実機で確かめた辞典
ファミリーベーシック(Family BASIC)の関数は、RND(6) のように 値を返す命令です。数値計算(ABS・SGN・RND)、文字列操作(ASC・CHR$・MID$)、入力取得(STICK・STRIG・INKEY$)、画面・メモリ参照(SCR$・PEEK・FRE)まで、本ページは関数を一覧にし、エミュレータ上で実際に呼び出して戻り値を確かめた辞典です。
ポイントは、実機の挙動がマニュアルの語り口とずれる関数があること。たとえば RND は同じシードなら決まった系列を返し(RND(10) を3回呼ぶと最初は 0,9,7)、STRIG(0) は A/B 別々ではなく1つの値の異なるビット(A=8・B=4)として返ります。CSRLIN(0) のように引数付きで呼ぶと余計な値が出るなど、呼び出し方の落とし穴もあります。AI(LLM)に Family BASIC を書かせると、まさにこのあたりで間違えます。下表から各関数へ飛んでください。
辞典シリーズ:この辞典は命令カテゴリごとに分かれています。総目次は ファミリーベーシック 命令・コマンド完全リファレンス(hub)から。
対応バージョンと凡例
本ページの関数は基本的に Family BASIC V2.0A / V2.1 で共通です(特記なき関数は V2.0A 相当の実機で確認)。各エントリの先頭にマークを付けています。
- ✅ 実機確認 … エミュレータで実際に呼び出し、戻り値・画面表示まで観察したもの
- 📖 規格 … マニュアル記載の関数。本検証では未観察(挙動は規格ベース)
関数早見表
| 関数 | 意味 | 実機での注意 | 詳細 |
|---|---|---|---|
XPOS(n) |
スプライトの現在 X 座標 | MOVE 直後は反映されないことがある | XPOS |
YPOS(n) |
スプライトの現在 Y 座標 | XPOS と対で使う | YPOS |
MOVE(n) |
動作 n が進行中か(-1/0) | 距離 255 だと常に -1 | MOVE |
ABS(x) |
絶対値 | 結果は常に非負 | ABS |
SGN(x) |
符号(-1/0/1) | 方向のトライナリ値に | SGN |
RND(x) |
0〜x-1 の乱数 | 同じシードで決定的(最初が 0,9,7) | RND |
ASC(s) |
先頭1文字のコード | 先頭1文字のみ変換 | ASC |
CHR$(x) |
コード→1文字 | CHR$(13)=改行 |
CHR$ |
VAL(s) |
文字列→数値 | 数字でない文字で停止 | VAL |
STR$(x) |
数値→文字列 | 正の値は先頭にスペース | STR$ |
HEX$(x) |
数値→16進文字列 | &H は付かない |
HEX$ |
LEFT$(s,n) |
左 n 文字 | n=0 で空文字列 | LEFT$ |
RIGHT$(s,n) |
右 n 文字 | n=0 で空文字列 | RIGHT$ |
MID$(s,m,n) |
m 文字目から n 文字 | m は 1 始まり | MID$ |
LEN(s) |
文字数 | 空文字列は 0 | LEN |
PEEK(a) |
メモリ1バイト | POKE と対 | PEEK |
POS(0) |
カーソル水平位置 | 引数は形式的に 0 | POS |
FRE |
残りユーザメモリ | PRINT FRE で残量確認 |
FRE |
STICK(x) |
十字キー(ビット和) | 上8・下4・左2・右1 | STICK |
STRIG(x) |
トリガーボタン(ビット和) | A=8・B=4 が同じ値の別ビット | STRIG |
CSRLIN |
カーソル垂直位置 | 引数なしが安全 | CSRLIN |
SCR$(x,y,sw) |
画面位置の文字/配色 | 書き込み・読み取りが対称 | SCR$ |
INKEY$ |
キー即時入力 | 待たない・空なら “” | INKEY$ |
知っておきたい関数の挙動(先に押さえておきたい3つ)
AI にコードを書かせるとき、この3つでよく的を外します。
RNDは決定的 — 同じシードなら同じ系列。RND(10)を3回呼ぶと0,9,7。「毎回ランダム」を前提にしたコードは再現テストでつまずく。STRIG(0)は A/B 別ではない — 1つの戻り値の異なるビットに乗る。A 押下で8、B 押下で4。STRIG(1)は 2P 側で、A/B の区別ではない。CSRLIN(0)のように引数を付けると余計な値が出る —PRINT CSRLIN(0);POS(0)は(0)を独立した式として評価してしまう。CSRLIN/POS(0)は規格どおりの呼び方で。
各関数の詳細
XPOS|スプライトの現在 X 座標
✅ 実機確認 ・ 構文 XPOS(n) ・ 戻り値 数値(0-255)
動作:DEF MOVE で定義した動作番号 n のスプライトの現在の水平座標(X)を返します。動作前は POSITION で指定した値(デフォルト 120)、動作中は MOVE の進行に応じて変化します。
使いどころ:衝突判定や軌跡記録。YPOS と組み合わせて (X, Y) を取得します。
実機観察:MOVE 直後・FOR 300 ループ後ともに 80 100 が表示され、PRINT 時点では座標が更新されていませんでした。一方で実行後のスプライトの内部座標(OAM。画面に出すスプライトの一覧表)は x=112-120 まで動いています。XPOS/YPOS は BASIC 文の実行タイミングだけ評価され、FOR 300 程度の短い遅延では MOVE が反映されないことを示唆します(MOVE の更新は VBlank(画面の書き換えが一瞬止まる合間。約60フレーム/秒=毎秒約60回の描画の合間に処理が進む)で非同期に進むため、ループ内の即時参照には間に合いません)。
10 SPRITE ON
20 DEF MOVE(0)=SPRITE(0,3,8,100,1,0)
30 POSITION 0,80,100
40 PRINT XPOS(0);YPOS(0)
50 MOVE 0
60 FOR I=0 TO 300:NEXT
70 PRINT XPOS(0);YPOS(0)
80 100
80 100
YPOS|スプライトの現在 Y 座標
📖 規格 ・ 構文 YPOS(n) ・ 戻り値 数値(0-255)
動作:動作番号 n のスプライトの現在の垂直座標(Y)を返します。XPOS と対で使います。評価タイミングの注意は XPOS と同じです。
MOVE|動作 n が進行中か
📖 規格 ・ 構文 MOVE(n) ・ 戻り値 数値(0 または -1)
動作:動作番号 n の動きが進行中かを調べます。動作中なら -1(=TRUE)、終了済/未開始なら 0(=FALSE)。IF MOVE(0) THEN ... で「動いている間だけ何かする」、IF NOT MOVE(0) THEN ... で「動きが終わったら何かする」と書けます。
注意:DEF MOVE で D(距離)を 255 に設定すると永遠に動くため MOVE(n) は常に -1 になります。距離を指定すれば、その分動き終わると 0 に戻ります。
ABS|絶対値
✅ 実機確認 ・ 構文 ABS(x) ・ 戻り値 数値(整数 0 〜 +32767)
動作:数式 x の絶対値 |x| を返します。結果は常に非負です。距離計算や誤差処理に頻用します。
10 PRINT ABS(-7):PRINT ABS(7)
7
7
SGN|符号
✅ 実機確認 ・ 構文 SGN(x) ・ 戻り値 数値(-1, 0, 1)
動作:x の符号を返します。x > 0 → 1、x = 0 → 0、x < 0 → -1。「方向」を -1, 0, 1 のトライナリ値として扱えます。
10 PRINT SGN(-5):PRINT SGN(0):PRINT SGN(5)
-1
0
1
RND|乱数
✅ 実機確認 ・ 構文 RND(x) ・ 戻り値 数値(整数)
動作:0 から x-1 の範囲の整数乱数を返します。サイコロは RND(6) + 1 で 1〜6、範囲指定は RND(高 - 低 + 1) + 低 で「低〜高」の整数です。
実機観察:同じシードなら同じ系列が出る決定的な擬似乱数です。RND(10) を3回呼ぶと最初は 0, 9, 7。「毎回ランダム」を前提にしたコードは、リセット直後の再現テストでつまずきます。シード初期化の仕様は未明です。
10 PRINT RND(10):PRINT RND(10):PRINT RND(10)
0
9
7
ASC|文字→コード
✅ 実機確認 ・ 構文 ASC(文字列) ・ 戻り値 数値(0-255)
動作:文字列の最初の 1 文字のキャラクタコードを返します(CHR$ の逆)。2文字以上でも先頭1文字のみ。空文字列 "" はヌルストリングとして異常になります。INKEY$ で取得したキー入力をコードで判定するときに頻用します。
10 PRINT ASC("A"):PRINT ASC("0")
65
48
CHR$|コード→文字
✅ 実機確認 ・ 構文 CHR$(x) ・ 戻り値 文字列(1 文字)
動作:数値 x に対応する1文字の文字列を返します(ASC の逆)。CHR$(13) = 改行、CHR$(0) = ヌル。DEF SPRITE / DEF MOVE 等で特殊コードを文字列引数に組み込むとき((...) + CHR$(64) + CHR$(65))に頻用します。
10 PRINT CHR$(65);CHR$(66);CHR$(67)
ABC
VAL|文字列→数値
✅ 実機確認 ・ 構文 VAL(文字列) ・ 戻り値 数値(-32768 〜 +32767)
動作:文字列を数値に変換します。"&H"(16進数)の接頭辞があれば 16 進数として変換。数字以外の文字に当たるとその手前まで変換し(VAL("123ABC") = 123)、完全に変換できない場合(空文字列・文字のみ)は 0 を返します。INPUT で文字列として受け取ってから数値化する用途に使います。
10 PRINT VAL("123"):PRINT VAL("12X3"):PRINT VAL("XYZ")
123
12
0
STR$|数値→文字列
✅ 実機確認 ・ 構文 STR$(x) ・ 戻り値 文字列
動作:数値を文字列に変換します(VAL の逆)。正の場合は先頭にスペースが1文字(符号位置のため)、負の場合は先頭に - が付きます。PRINT "X=" + STR$(X) のように + で連結する場合に必要です。
注意:正の値の先頭スペースに注意(LEN(STR$(123)) = 4、つまり " 123")。
10 A$=STR$(42):PRINT "["+A$+"]"
10 A$=STR$(42):PRINT " "+
A$+" "
42
HEX$|数値→16進文字列
✅ 実機確認 ・ 構文 HEX$(x) ・ 戻り値 文字列
動作:数値を 16 進数表記の文字列に変換します。&H は付かない、ただの数字列です(HEX$(255) → "FF"、HEX$(0) → "0")。負の値は 16 ビット 2 の補数表現で変換されます。メモリダンプ表示や PEEK 結果の表示に有用です。
10 PRINT HEX$(255):PRINT HEX$(16)
FF
10
LEFT$|左 n 文字
✅ 実機確認 ・ 構文 LEFT$(文字列, n) ・ 戻り値 文字列
動作:文字列の左 n 文字を返します。n が文字列長より大きければ全部、n = 0 なら空文字列。元の文字列は変更されません。文字列長は最大 31 なので n もそれ以下です。
10 PRINT LEFT$("ABCDE",3)
ABC
RIGHT$|右 n 文字
✅ 実機確認 ・ 構文 RIGHT$(文字列, n) ・ 戻り値 文字列
動作:文字列の右 n 文字を返します。n が文字列長より大きければ全部、n = 0 なら空文字列。
10 PRINT RIGHT$("ABCDE",3)
CDE
MID$|部分文字列
✅ 実機確認 ・ 構文 MID$(文字列, 開始位置, n) ・ 戻り値 文字列
動作:文字列の「開始位置」から n 文字を返します。開始位置は 1 始まり(LEFT$ / RIGHT$ と違って明示)。開始位置 + n が文字列長を超えた場合は文字列の最後まで、n = 0 なら空文字列です。
注意:開始位置が 1 ベースである点に注意(LEFT$/RIGHT$ は文字数指定なので 0 ベース感覚になりがち)。
10 PRINT MID$("ABCDE",2,3)
BCD
LEN|文字数
✅ 実機確認 ・ 構文 LEN(文字列) ・ 戻り値 数値(0-31)
動作:文字列に含まれるすべての文字数を返します。空文字列なら 0。空白やコントロールコードなど画面に表示されない文字も 1 文字として数えます。31 文字制限の確認や FOR I = 1 TO LEN(A$) のループ条件に使います。
10 PRINT LEN("HELLO"):PRINT LEN("")
5
0
PEEK|メモリ読み取り
✅ 実機確認 ・ 構文 PEEK(アドレス) ・ 戻り値 数値(0-255)
動作:メモリの指定アドレスから 1 バイト(8 ビット)のデータを返します(POKE と対)。読み込み可能とされた範囲のみ有効で、読めない領域(&H0800-1FFF(16進数)等)の挙動は不定です。&H7000 以降のユーザ領域や &H8000-FFFF の ROM が主な対象です。
10 PRINT PEEK(&H7AF6)
191
POS|カーソル水平位置
📖 規格 ・ 構文 POS(0) ・ 戻り値 数値(0-27)
動作:カーソルの現在の水平位置(0-27)を返します。引数は形式的に 0 を入れます(他言語の POS との互換のため)。垂直位置は CSRLIN を使います。PRINT 中のカーソル位置取得や、改行までの残り文字数の計算に使います。
FRE|残りメモリ
✅ 実機確認 ・ 構文 FRE ・ 戻り値 数値(バイト数)
動作:BASIC のプログラムが使っていないユーザメモリのバイト数を返します。PRINT FRE で残量確認の定型です。CLEAR や RUN の直後は大きな値で、プログラムが書き加わると減っていきます。残りが小さくなってきたら DIM を整理する判断材料になります。
10 PRINT FRE(0)
1970 0
STICK|十字キー
✅ 実機確認 ・ 構文 STICK(x) ・ 戻り値 数値(ビット和)
動作:指定したコントローラ(0 = I、1 = II)の十字キーの押下状態をビットフラグで返します。
| ビット値 | 方向 |
|---|---|
| 0 | 何も押されていない |
| 1 | 右 |
| 2 | 左 |
| 4 | 下 |
| 8 | 上 |
斜めは複合ビット(OR 値):右上=9、右下=5、左上=10、左下=6。
使いどころ:IF (S AND 1) THEN PRINT "右" のようにビット単位で判定します(単独押下なら IF S = 1 でも可)。斜めも検出するなら AND マスクが必須です。連続取得ではループでアンチチャタリング(ボタンのバタつき除去)が必要です。
実機観察:実機で 上=8 (bit3)・下=4 (bit2)・左=2 (bit1)・右=1 (bit0) を確定。UP と RIGHT を同時に押すと STICK(0) = 9 = 8|1 になります。
10 FOR I=1 TO 16
20 PRINT "T";I;"=";STICK(0)
30 FOR J=0 TO 1500:NEXT
40 NEXT
T 1= 0
T 2= 0
T 3= 8
T 4= 8
T 5= 8
T 6= 0
T 7= 1
T 8= 1
T 9= 1
T 10= 0
T 11= 0
T 12= 4
T 13= 4
T 14= 0
T 15= 0
T 16= 2
STRIG|トリガーボタン
✅ 実機確認 ・ 構文 STRIG(x) ・ 戻り値 数値(ビット和)
動作:指定したコントローラ(0 = I、1 = II)のトリガーボタンの押下状態をビット和で返します。
実機観察:STRIG(0) と STRIG(1) は A/B 別ではなく、引数はコントローラ番号です(1P=0、2P=1)。これは想定されがちな誤りです。1P で A 押下 → STRIG(0) = 8 (bit3)、B 押下 → STRIG(0) = 4 (bit2)。STICK と同じくビットフラグで、A/B は同じ STRIG(0) の異なるビットに反映されます。判定は IF STRIG(0) AND 8 THEN ...(A 単独)のようにビット演算で行い、アンチチャタリングも STICK と同様に必要です。
10 FOR I=1 TO 12
20 PRINT "T";I;"A=";STRIG(0);"B=";STRIG(1)
30 FOR J=0 TO 1500:NEXT
40 NEXT
T 1A= 0B= 0
T 2A= 0B= 0
T 3A= 0B= 0
T 4A= 8B= 0
T 5A= 8B= 0
T 6A= 8B= 0
T 7A= 0B= 0
T 8A= 0B= 0
T 9A= 4B= 0
T 10A= 4B= 0
T 11A= 4B= 0
T 12A= 0B= 0
CSRLIN|カーソル垂直位置
✅ 実機確認 ・ 構文 CSRLIN ・ 戻り値 数値(0-23)
動作:カーソルの現在の垂直位置(0-23)を返します。引数なし(POS と違い括弧も不要)。水平位置は POS(0) を使います。
実機観察:LOCATE 5,7 後の PRINT CSRLIN(0);POS(0) は 7 0 9 の3数字を出しました。7 は CSRLIN(row 7、LOCATE と整合)ですが、続く 0 9 は (0) を独立した式として評価してしまったもの。CSRLIN / POS は引数なし(POS は POS(0))の規格どおりの呼び方が安全です。
10 LOCATE 5,7
20 PRINT CSRLIN(0);POS(0)
7 0 9
SCR$|画面位置の文字/配色
✅ 実機確認 ・ 構文 SCR$(X, Y, Sw) ・ 戻り値 文字列 or 数値
動作:BG GRAPHIC 面の (X, Y) 位置の文字または配色を取得します。Sw=0 → その位置の文字(CHR$ 形式の1文字)、Sw=1 → パレット番号(0-3)。衝突検知(画面上のキャラクタを読み取って判定)やスクリーンダンプに使います。
実機観察:LOCATE 3,5:PRINT "X" で (3,5) に X を置き、PRINT SCR$(3,5) で読み戻すと "X" が返り、書き込み・読み取りの対称性を確認しました。
10 LOCATE 3,5:PRINT "X"
20 PRINT SCR$(3,5)
X
X
INKEY$|キー即時入力
✅ 実機確認 ・ 構文 INKEY$ [(n)] ・ 戻り値 文字列(0 or 1 文字)
動作:キーボードから1文字を即時取得します(キー押下を待たない、ノンブロッキング)。押されていなければ空文字列 ""、押されていればその1文字を返します。A$ = INKEY$: IF A$ = "" THEN ... で「キー入力待ち」の定型に。INPUT と違い待たないので、ゲームループのキーポーリングに必須です。
実機観察:FOR ループの21回目の繰り返しで A が検出されました。続けて押した B と 1 は BASIC ループ完走後の押下だったため、即時モードのプロンプトに B1 として残りました。INKEY$ のリアルタイム性と、プログラム終了後のキー入力が即時モードへ流れる挙動の両方が観察できます。
10 FOR I=1 TO 30
20 A$=INKEY$
30 IF A$<>"" THEN PRINT I,A$
40 FOR J=0 TO 300:NEXT
50 NEXT
1
21 A
B1
どうやって確かめたか
各関数は、Family BASIC のエミュレータに上記のコードを流し込み、RUN した後の画面表示をそのまま記録しています。STICK / STRIG / INKEY$ のような入力系は、ループで関数を連続評価しながらキー操作を自動で送り込み、どのタイミングでどの値が返るかを観察しました。検証の詳細は連載で扱っています。
関連
- 辞典の総目次:ファミリーベーシック 命令辞典
- 制作の物語(hub):命令・コマンド完全リファレンス
- 他カテゴリ:ステートメント/関数/演算子・記法/エラーコード/システム・メモリ/仕様・文字コード