ファミリーベーシック 関数一覧|RND・ASC・MID$ を実機で確かめた辞典

ファミリーベーシック(Family BASIC)の関数は、RND(6) のように 値を返す命令です。数値計算(ABSSGNRND)、文字列操作(ASCCHR$MID$)、入力取得(STICKSTRIGINKEY$)、画面・メモリ参照(SCR$PEEKFRE)まで、本ページは関数を一覧にし、エミュレータ上で実際に呼び出して戻り値を確かめた辞典です。

ポイントは、実機の挙動がマニュアルの語り口とずれる関数があること。たとえば 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つでよく的を外します。

  1. RND は決定的 — 同じシードなら同じ系列。RND(10) を3回呼ぶと 0,9,7。「毎回ランダム」を前提にしたコードは再現テストでつまずく。
  2. STRIG(0) は A/B 別ではない — 1つの戻り値の異なるビットに乗る。A 押下で 8、B 押下で 4STRIG(1) は 2P 側で、A/B の区別ではない。
  3. 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 → 1x = 0 → 0x < 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 で残量確認の定型です。CLEARRUN の直後は大きな値で、プログラムが書き加わると減っていきます。残りが小さくなってきたら 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 が検出されました。続けて押した B1 は 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$ のような入力系は、ループで関数を連続評価しながらキー操作を自動で送り込み、どのタイミングでどの値が返るかを観察しました。検証の詳細は連載で扱っています。

関連