SmileBASIC 4.4.8
リファレンスマニュアル
更新日 2023/12/07
目次
- 命令概要(基本命令)
- 命令概要(表示命令)
- 命令概要(入力、サウンド、その他)
- ダイレクトモード専用命令
- 変数や配列の定義、操作に関する命令
- 制御命令
- 数学関連
- 文字列操作
- その他
- 各種入力
- 各種入力(Toy-Con)
- ファイル
- スクリーン制御
- テキストスクリーン入出力
- グラフィック
- スプライト
- レイヤー
- サウンド
- 高度な演算
- ソースコード操作
- サブプログラム
更新日 2023/12/07
・GOTO, GOSUB,命令で指定するジャンプ飛び先やRESTORE命令で指定するREAD命令の読み込み先を定義する。
・ラベルは、英数字とアンダースコア(_)からなる識別子の先頭に@をつけたもの。
@MAINLOOP
ジャンプ先のラベル
ラベルのかわりにラベル名の入った文字列も指定できる
・"1:@ラベル名" の形式でプログラムスロット指定も可能。
・プログラムスロット指定をする場合、あらかじめEXEC命令で対象スロット内のプログラムを実行可能にしておくこと。
GOTO @MAIN JP$="@MAIN":GOTO JP$
・GOTOと違い、RETURN命令でGOSUBの次の命令に戻ってくる。
ジャンプ先のラベル
ラベルのかわりにラベル名の入った文字列も指定できる
・"1:@ラベル名" の形式でプログラムスロット指定も可能。
・プログラムスロット指定をする場合、あらかじめEXEC命令で対象スロット内のプログラムを実行可能にしておくこと。
GOSUB @SUB JP$="@MAIN":GOSUB JP$
RETURN
ここに書かれた式の値によってジャンプ先を選択する。
・値は数値でなければならない。
式の値が0のときのジャンプ先
式の値が1のときのジャンプ先
・必要な数だけ飛び先を用意する。
・ON~GOTOのラベルには、文字列は使えない。
ON IDX GOTO @JMP_A,@JMP_B PRINT OVER:END @JMP_A PRINT "IDX=0":END @JMP_B PRINT "IDX=1":END
ここに書かれた式の値によってジャンプ先を選択する。
値は数値でなければならない。
式の値が0のときのジャンプ先
式の値が1のときのジャンプ先
:
・必要な数だけ飛び先を用意する。
・ON~GOSUBのラベルには、文字列は使えない。
ON IDX GOSUB @SUB_A,@SUB_B PRINT EXIT:END @SUB_A PRINT "IDX=0":RETURN @SUB_B PRINT "IDX=1":RETURN
・プログラム実行中に+ボタン等を押した場合、通常はプログラムが停止するが、ON BREAK GOTOを使用すると指定したラベルにジャンプさせる事ができる。
・一度登録ラベルにジャンプすると、登録は解除される。
・エラー、TRACE,STOP実行、+ボタン長押しによる強制停止、TOPMENUからのプログラム起動等によりプログラムが停止する場合はラベルを登録していてもジャンプしない。
プログラム停止時のジャンプ先
ON BREAK GOTO @FINISH LOOP ENDLOOP @FINISH PRINT "ていししました!"
・THENやELSE直後のGOTOは、GOTOを省略可能。
IF A==1 THEN PRINT OK IF A>1 THEN @JMP1 ELSE PRINT DATE$ @JMP1 END
・THENやELSEの直後で改行すると、処理1または処理2で複数行の処理を書く事ができる。
・THENやELSEの直後で改行する場合、IF文の終了を明示するためにENDIFを最後に記述する。
IF A==1 THEN PRINT "オメデトウ" BEEP 2 ELSE PRINT "ザンネン" ENDIF
・ELSEのかわりにELSEIFを使う事で、条件不成立時に続けて条件判断を行う事ができる。
・ELSEIF と ELSE IFで以降のコード記述内容が変化するので注意が必要。例の2つのコードは同じ意味。
IF A==1 THEN PRINT "オメデトウ":BEEP 0 ELSEIF A==2 THEN PRINT "ザンネン" ELSE PRINT "まあまあ" ENDIF IF A==1 THEN PRINT "オメデトウ":BEEP 0 ELSE IF A==2 THEN PRINT "ザンネン" ELSE PRINT "まあまあ" ENDIF ' ELSE IF の場合は必要 ENDIF
・ラベルにはラベル文字列も使用できる。
・ELSE直後でのGOTO省略時に文字列は使えない。
× IF A==0 GOTO "@LABEL1" ELSE "@LABEL2"
○ IF A==0 GOTO "@LABEL1" ELSE @LABEL2
○ IF A==0 GOTO "@LABEL1" ELSE GOTO "@LABEL2"
IF A==1 GOTO @MAIN IF X<0 GOTO @JMP1 ELSE PRINT A$ IF Y==5 GOTO @JMP1 ELSE @JMP2 @JMP1 PRINT "@JMP1" @JMP2 PRINT "@JMP2" END
・ENDCASEで分岐処理を終了する。
・分岐条件はWHEN,OTHERWISEで指定する。
CASEで条件として参照する式
・WHENで指定する式との比較に使用する。
A=1 CASE A WHEN 0: PRINT"A" WHEN 1: PRINT"B" OTHERWISE: PRINT"X" ENDCASE
・WHENで指定した式の値とCASEで指定した式の値が同じだった場合、WHENの次の命令にジャンプし、値が違った場合は次のWHENまたはOTHERWISEにジャンプする。
・WHENの次の命令にジャンプした場合、次のWHENの直前まで実行するとENDCASEにジャンプする。
・WHENを連続して書いた場合は、ひとまとまりのグループとして扱う。
・つまり、WHEN A:WHEN Bと書いた場合、「CASEの値がAまたはBの場合」という意味になる。
・CASE~ENDCASE内でのみ使用できる。
分岐条件となる式
・全てのWHENに該当しなかった場合はOTHERWISEの次の命令にジャンプする。
・IF文でのELSE相当の処理。
・OTHERWISEの後にWHENを使用する事はできない。
・CASEで条件分岐を開始した後は必ずENDCASEを使用しなければならない。
・この命令自体は何も行わない。
・ENDLOOP命令実行時に、対応するLOOPキーワードの直後の命令に処理を移す。
I=0 LOOP PRINT I;","; I=I+1 IF I>100 THEN BREAK ENDLOOP
・FOR,WHILE,REPEATといった他のループ命令と異なり、無限にループし続ける。
・ループから抜けるには、BREAK命令を使用する必要がある。
I=0 LOOP PRINT I;","; I=I+1 IF I>100 THEN BREAK ENDLOOP
・処理の最後にはNEXT命令を置く。
・条件が満たされない場合、1回も実行されないことがある。
ループのたびに自動更新される変数
・1ループごとに増分が加算される。
ループ開始時のループ変数の値
ループを終了させるループ変数の値
・ループ変数の値がこの値を超えるとループを終了させる。
・ループ終わりにループ変数に加算する増分。
・省略時は1が増分値として使用される。
・負の数を指定すると値が減る方向にループさせる事ができる。
・増分が小数の場合、演算誤差で意図した回数にならない可能性がある。
FOR I=0 TO 9 STEP 2 PRINT I;","; NEXT
・対応するFOR変数を更新し、TOの値を超えていなければFOR直後の命令にジャンプし、超えていればNEXT直後の命令にジャンプする。
・FOR変数にはSTEPがあればSTEPの値を加算し、STEPがなければ1を加算する。
FOR I=0 TO 9 STEP 2 PRINT I;","; NEXT
・式が真(0以外)の場合WHILEの次の命令に処理を移し、WEND命令が来たらWHILEに戻って再度式を計算する。
A=0:B=4 WHILE A<B A=A+1 WEND
A=0:B=4 WHILE A<B A=A+1 WEND
・この命令自体は何も行わない。
・UNTIL命令でループ実行が継続される場合に、対応するREPEAT命令に処理を移す。
A=0:B=4 REPEAT A=A+1 UNTIL A>B
・式の評価結果が真(0以外)の場合、ループを終了しUNTIL文の次の命令に処理を移す。
・ループの始まりにREPEAT命令を置く。
・WHILE命令とは異なりループ内処理を実行した後で条件判定を行う。
A=0:B=4 REPEAT A=A+1 UNTIL A>B
・LOOP~ENDLOOP、FOR~NEXT、WHILE~WEND、REPEAT~UNTIL内で使用可能。
・LOOP文では、CONTINUEを実行するとLOOPにジャンプする。
・FOR文では、CONTINUEを実行するとFORにジャンプし、ループ変数が更新される。
・WHILE文では、CONTINUEを実行するとWHILEにジャンプする。
・REPEAT文では、CONTINUEを実行するとUNTILにジャンプする。
FOR I=0 TO 9 IF I==1 THEN CONTINUE IF I==7 THEN BREAK PRINT I;","; NEXT
・LOOP~ENDLOOP、FOR~NEXT、WHILE~WEND、REPEAT~UNTIL内で使用可能。
・BREAKを使用すると、すべてのループ文でループ直後の命令に処理を移す。
FOR I=0 TO 9 IF I==1 THEN CONTINUE IF I==7 THEN BREAK PRINT I;","; NEXT
END
・中断したプログラムスロット:行番号が表示される。
・STOPで中断したプログラムはCONT命令で継続続行可能。
停止メッセージとして表示する文字列を指定する
・文字列は255文字まで表示可能。
・省略した場合停止メッセージは表示されない。
STOP STOP "とまりました"
1) USER ※引数なし、返値なし
2) USER X,Y ※引数あり、返値なし
3) A=USER(X) ※引数あり、返値1つ
4) USER X OUT A,B ※引数あり、返値複数
・DEF~ENDまでが定義範囲となる。
・DEF~END範囲で定義された変数やラベルはDEF外から使用できない(ローカル変数)。
・DEF~END範囲をまたがったGOTO,GOSUBはできない。
・COMMON を付けることで定義したプログラムスロット外から使用可能な命令を定義できる。
' 文字表示 DEF FUNC PRINT "SAMPLE" END ' 呼び出し FUNC
関数に渡したい引数があれば必要な分の引数名をカンマで区切って指定する
・ここで指定した引数名はDEF~END内で変数として使用できる。
' 指定位置に文字表示 DEF FUNC2 X,Y LOCATE X,Y PRINT "SAMPLE" END ' 呼び出し FUNC2 10,4
関数に渡したい引数があれば必要な分の引数名をカンマで区切って指定する
・ここで指定した引数名はDEF~END内で変数として使用できる。
結果として呼び出し側に返したい値は、DEF~END内でRETURN命令を使用して設定する(RETURN ANS のような記述)
'足し算 DEF ADD(X,Y) RETURN X+Y END ' 再帰を使った階乗計算 DEF FACTORIAL(N) IF N==1 THEN RETURN N RETURN N*FACTORIAL(N-1) END ' 文字列反転 DEF REVERSE$(T$) VAR A$="" 'ローカル文字列 VAR L=LEN(T$) 'ローカル WHILE L>0 A$=A$+MID$(T$,L-1,1) DEC L WEND RETURN A$ END ' 呼び出し PRINT ADD(10,5) PRINT FACTORIAL(4) PRINT REVERSE$("BASIC")
関数に渡したい引数があれば必要な分の引数名をカンマで区切って指定する
・ここで指定した引数名はDEF~END内で変数として使用できる。
結果として返したい数分の変数名をOUTの後に記述する
・DEF~END内でここで指定した変数に値を代入すると、呼び出し側に値を返す事ができる。
' 足し算と掛け算 DEF CALCPM A,B OUT OP,OM OP=A+B OM=A*B END ' 呼び出し CALCPM 5,10 OUT P,M PRINT P,M
・引数だけ可変長にしたり、返値だけ可変長にしたりする事も可能。
命令名の後ろに*(アスタリスク)を書くと、引数の数が可変である事を宣言できる
・DEFARGC,DEFARG,TYPEOFを使用して引数の数・内容・型を調査できる。
OUTの後ろに*(アスタリスク)を書くと、返値の数が可変である事を宣言できる
・DEFOUTC,DEFOUTを使用して返値の数を調査したり、返値を設定したりできる。
DEF VARFUNC * OUT * FOR I=0 TO DEFOUTC()-1 DEFOUT I, DEFARG(I)*2 NEXT END
・異なるプログラムスロット間でプログラムを使う場合はEXECで先に実行しておくこと。
1) COMMON DEF USER
2) COMMON DEF USER(X)
3) COMMON DEF USER X OUT A,B
COMMON DEF FOO(X,Y,Z)
・関数型として定義されたDEF命令内で値を返す場合に利用する。
DEF CALC(A,B) RETURN A*B END PRINT CALC(2,3)
DEF FUNC PRINT FUNC END
・ユーザー定義命令・関数内でのみ使用可能。
・可変長引数と組合わせると便利。
ユーザー定義命令・関数の引数の個数
DEF FOO X,Y PRINT DEFARGC() END
・ユーザー定義命令・関数内でのみ使用可能。
・可変長引数と組合わせると便利。
調べたい引数の番号
・最初の引数から順に0,1,2,3…と指定する。
指定引数の値
DEF FOO X,Y PRINT DEFARG(0) 'Xの値が返る PRINT DEFARG(1) 'Yの値が返る END
・ユーザー定義命令・関数内でのみ使用可能。
・可変長返値と組合わせると便利。
ユーザー定義命令・関数の返値の個数
DEF FOO OUT X,Y PRINT DEFOUTC() END
・ユーザー定義命令・関数内でのみ使用可能。
・可変長返値と組合わせると便利。
設定する返値の番号
・最初の返値から順に0,1,2,3…と指定する。
指定返値に設定する値
DEF FOO OUT X,Y DEFOUT 0,10 'X=10と同じ意味 DEFOUT 1,20 'Y=20と同じ意味 END
・呼び出すユーザー定義命令名の文字列。
・文字列なので""でかこうか文字列変数を使用。
・"1:ユーザー定義命令名" の形式でプログラムスロット指定も可能。
・あらかじめEXEC命令で対象スロット内のプログラムを実行可能にしておくこと。
指定した命令に必要な引数
結果として返したい数分の変数名をOUTの後に記述
CALL "USERCD",X,Y OUT A,B ' DEF USERCD X,Y OUT A,B A=X+Y:B=X*Y END
・組み込み関数、ユーザー定義関数どちらでも指定可能。
・呼び出すユーザー定義関数名の文字列。
・文字列なので""でかこうか文字列変数を使用。
・"1:ユーザー定義関数名" の形式でプログラムスロット指定も可能。
・あらかじめEXEC命令で対象スロット内のプログラムを実行可能にしておくこと。
指定した関数に必要な引数を列挙する
指定した関数が返した値
A=CALL("USERFC",X,Y) ' DEF USERFC(X,Y) RETURN X*Y END
・SPFUNC, TFUNCで設定されたコールバック処理を一斉に呼び出す。
・SPFUNCで設定されたコールバックはCALL SPRITEで呼び出す。
・TFUNCで設定されたコールバックはCALL TEXTで呼び出す。
・呼び出したコールバックに関連するスプライト管理番号やテキストスクリーンIDはCALLIDX()で取得できる。
CALL SPRITE CALL TEXT