制御命令

@ラベル

プログラムやデータの位置を示す識別子

・GOTO, GOSUB,命令で指定するジャンプ飛び先やRESTORE命令で指定するREAD命令の読み込み先を定義する。
・ラベルは、英数字とアンダースコア(_)からなる識別子の先頭に@をつけたもの。

@MAINLOOP

GOTO @ラベル
GOTO 文字列

指定したラベル位置に処理を移す

引数

@ラベル

ジャンプ先のラベル

文字列

ラベルのかわりにラベル名の入った文字列も指定できる
・"1:@ラベル名" の形式でプログラムスロット指定も可能。
・プログラムスロット指定をする場合、あらかじめEXEC命令で対象スロット内のプログラムを実行可能にしておくこと。

GOTO @MAIN
JP$="@MAIN":GOTO JP$

GOSUB @ラベル
GOSUB 文字列

指定したラベル位置に処理を移す

・GOTOと違い、RETURN命令でGOSUBの次の命令に戻ってくる。

引数

@ラベル

ジャンプ先のラベル

文字列

ラベルのかわりにラベル名の入った文字列も指定できる
・"1:@ラベル名" の形式でプログラムスロット指定も可能。
・プログラムスロット指定をする場合、あらかじめEXEC命令で対象スロット内のプログラムを実行可能にしておくこと。

GOSUB @SUB
JP$="@MAIN":GOSUB JP$

RETURN

直前に使用したGOSUB命令の次の命令に処理を移す

RETURN

ON 式 GOTO @ラベル0,@ラベル1…

式の値に対応したラベル行に分岐する

引数

ここに書かれた式の値によってジャンプ先を選択する。
・値は数値でなければならない。

@ラベル0

式の値が0のときのジャンプ先

@ラベル1

式の値が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

ON 式 GOSUB @ラベル0,@ラベル1…

式の値に対応したラベル行に分岐し、RETURN命令の使用でON GOSUBの次の命令に戻る

引数

ここに書かれた式の値によってジャンプ先を選択する。
値は数値でなければならない。

@ラベル0

式の値が0のときのジャンプ先

@ラベル1

式の値が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 @ラベル

ユーザーがプログラムを停止させようとした時のジャンプ先を登録する

・プログラム実行中に+ボタン等を押した場合、通常はプログラムが停止するが、ON BREAK GOTOを使用すると指定したラベルにジャンプさせる事ができる。
・一度登録ラベルにジャンプすると、登録は解除される。
・エラー、TRACE,STOP実行、+ボタン長押しによる強制停止、TOPMENUからのプログラム起動等によりプログラムが停止する場合はラベルを登録していてもジャンプしない。

引数

@ラベル

プログラム停止時のジャンプ先

ON BREAK GOTO @FINISH
LOOP
ENDLOOP

@FINISH
PRINT "ていししました!" 

IF 式 THEN 処理1
IF 式 THEN 処理1 ELSE 処理2

式の値が真(0以外)の時に処理1を実行する
ELSEがある場合、偽(0)の時に処理2を実行する

・THENやELSE直後のGOTOは、GOTOを省略可能。

IF A==1 THEN PRINT OK
IF A>1 THEN @JMP1 ELSE PRINT DATE$
@JMP1
END

IF 式 THEN [改行] 処理1 ENDIF
IF 式 THEN [改行] 処理1 ELSE [改行] 処理2 ENDIF

式の値が真(0以外)の時に処理1を実行する
ELSEがある場合、偽(0)の時に処理2を実行する

・THENやELSEの直後で改行すると、処理1または処理2で複数行の処理を書く事ができる。
・THENやELSEの直後で改行する場合、IF文の終了を明示するためにENDIFを最後に記述する。

IF A==1 THEN
 PRINT "オメデトウ" 
 BEEP 2
ELSE
 PRINT "ザンネン" 
ENDIF

ELSEIF 式 THEN ...

IF文による条件不成立時にさらに追加IF文を実行する場合のキーワード

・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

IF 式 GOTO @ラベル [ELSE 不成立時処理]

式が真(0以外)の時ラベルに分岐する

ラベルに文字列を使う場合の注意事項

・ラベルにはラベル文字列も使用できる。
・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

CASE 式

CASEによる条件分岐を開始する

・ENDCASEで分岐処理を終了する。
・分岐条件はWHEN,OTHERWISEで指定する。

引数

CASEで条件として参照する式
・WHENで指定する式との比較に使用する。

A=1
CASE A
WHEN 0: PRINT"A" 
WHEN 1: PRINT"B" 
OTHERWISE: PRINT"X" 
ENDCASE

WHEN 式

CASE~ENDCASE内で分岐条件を指定する

・WHENで指定した式の値とCASEで指定した式の値が同じだった場合、WHENの次の命令にジャンプし、値が違った場合は次のWHENまたはOTHERWISEにジャンプする。
・WHENの次の命令にジャンプした場合、次のWHENの直前まで実行するとENDCASEにジャンプする。
・WHENを連続して書いた場合は、ひとまとまりのグループとして扱う。
・つまり、WHEN A:WHEN Bと書いた場合、「CASEの値がAまたはBの場合」という意味になる。
・CASE~ENDCASE内でのみ使用できる。

引数

分岐条件となる式

OTHERWISE

CASE~ENDCASE内でどのWHENにも該当しなかった場合の処理を指定する

・全てのWHENに該当しなかった場合はOTHERWISEの次の命令にジャンプする。
・IF文でのELSE相当の処理。
・OTHERWISEの後にWHENを使用する事はできない。

ENDCASE

CASEによる条件分岐を終了する

・CASEで条件分岐を開始した後は必ずENDCASEを使用しなければならない。

LOOP

LOOP~ENDLOOPループの開始キーワード

・この命令自体は何も行わない。
・ENDLOOP命令実行時に、対応するLOOPキーワードの直後の命令に処理を移す。

I=0
LOOP
 PRINT I;",";
 I=I+1
 IF I>100 THEN BREAK
ENDLOOP

ENDLOOP

対応するLOOPキーワード直後の命令に処理を移す

・FOR,WHILE,REPEATといった他のループ命令と異なり、無限にループし続ける。
・ループから抜けるには、BREAK命令を使用する必要がある。

I=0
LOOP
 PRINT I;",";
 I=I+1
 IF I>100 THEN BREAK
ENDLOOP

FOR ループ変数=初期値 TO 終了値
FOR ループ変数=初期値 TO 終了値 STEP 増分

処理を指定回数繰り返す

・処理の最後にはNEXT命令を置く。
・条件が満たされない場合、1回も実行されないことがある。

引数

ループ変数

ループのたびに自動更新される変数
・1ループごとに増分が加算される。

初期値

ループ開始時のループ変数の値

TO 終了値

ループを終了させるループ変数の値
・ループ変数の値がこの値を超えるとループを終了させる。

STEP 増分

・ループ終わりにループ変数に加算する増分。
・省略時は1が増分値として使用される。
・負の数を指定すると値が減る方向にループさせる事ができる。
・増分が小数の場合、演算誤差で意図した回数にならない可能性がある。

FOR I=0 TO 9 STEP 2
 PRINT I;",";
NEXT

NEXT

FORループの終わりを示す命令

・対応するFOR変数を更新し、TOの値を超えていなければFOR直後の命令にジャンプし、超えていればNEXT直後の命令にジャンプする。
・FOR変数にはSTEPがあればSTEPの値を加算し、STEPがなければ1を加算する。

FOR I=0 TO 9 STEP 2
 PRINT I;",";
NEXT

WHILE 式

式の計算結果が偽(0)の場合、続くWENDの次の命令に処理を移す

・式が真(0以外)の場合WHILEの次の命令に処理を移し、WEND命令が来たらWHILEに戻って再度式を計算する。

A=0:B=4
WHILE A<B
 A=A+1
WEND

WEND

直前のWHILE命令に処理を移し、再度WHILEから実行する

A=0:B=4
WHILE A<B
 A=A+1
WEND

REPEAT

REPEAT~UNTILループの開始命令

・この命令自体は何も行わない。
・UNTIL命令でループ実行が継続される場合に、対応するREPEAT命令に処理を移す。

A=0:B=4
REPEAT
 A=A+1
UNTIL A>B

UNTIL 式

式の評価結果が偽(0)の場合、対応するREPEAT命令に処理を移す

・式の評価結果が真(0以外)の場合、ループを終了しUNTIL文の次の命令に処理を移す。
・ループの始まりにREPEAT命令を置く。
・WHILE命令とは異なりループ内処理を実行した後で条件判定を行う。

A=0:B=4
REPEAT
 A=A+1
UNTIL A>B

CONTINUE

強制的に次のループ処理を開始する

・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

BREAK

ループを強制的に脱出する

・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

プログラムを終了する

END

STOP [表示文字列]

実行中のプログラムを中断する

・中断したプログラムスロット:行番号が表示される。
・STOPで中断したプログラムはCONT命令で継続続行可能。

引数

表示文字列

停止メッセージとして表示する文字列を指定する
・文字列は255文字まで表示可能。
・省略した場合停止メッセージは表示されない。

STOP
STOP "とまりました" 

DEF ユーザー定義命令について

DEFを使うと下記のような命令を独自に定義できる

1) USER ※引数なし、返値なし
2) USER X,Y ※引数あり、返値なし
3) A=USER(X) ※引数あり、返値1つ
4) USER X OUT A,B ※引数あり、返値複数

DEF共通ルール

・DEF~ENDまでが定義範囲となる。
・DEF~END範囲で定義された変数やラベルはDEF外から使用できない(ローカル変数)。
・DEF~END範囲をまたがったGOTO,GOSUBはできない。
・COMMON を付けることで定義したプログラムスロット外から使用可能な命令を定義できる。

DEF 定義名

引数と返り値のないユーザー定義命令を定義する

' 文字表示
DEF FUNC
PRINT "SAMPLE" 
END
' 呼び出し
FUNC

DEF 定義名 引数[,引数…]

引数があり返値がないユーザー定義命令を定義する

引数

関数に渡したい引数があれば必要な分の引数名をカンマで区切って指定する
・ここで指定した引数名はDEF~END内で変数として使用できる。

' 指定位置に文字表示
DEF FUNC2 X,Y
LOCATE X,Y
PRINT "SAMPLE" 
END
' 呼び出し
FUNC2 10,4

DEF 関数名([引数[,引数…]])

ユーザー定義関数(返値が1つだけあるユーザー定義命令)を定義する

引数

関数に渡したい引数があれば必要な分の引数名をカンマで区切って指定する
・ここで指定した引数名は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 命令名[引数[,引数…]] OUT 返値[,返値…]]

複数の返値を持つユーザー命令を定義する

引数

関数に渡したい引数があれば必要な分の引数名をカンマで区切って指定する
・ここで指定した引数名は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

DEF 命令名 * [OUT *]

可変長の引数や可変長の返値を持つユーザー定義命令の定義

・引数だけ可変長にしたり、返値だけ可変長にしたりする事も可能。

引数

命令名の後ろに*(アスタリスク)を書くと、引数の数が可変である事を宣言できる
・DEFARGC,DEFARG,TYPEOFを使用して引数の数・内容・型を調査できる。

返値

OUTの後ろに*(アスタリスク)を書くと、返値の数が可変である事を宣言できる
・DEFOUTC,DEFOUTを使用して返値の数を調査したり、返値を設定したりできる。

DEF VARFUNC * OUT *
 FOR I=0 TO DEFOUTC()-1
  DEFOUT I, DEFARG(I)*2
 NEXT
END

COMMON について

プログラムスロットを超えてユーザー定義命令・関数を定義する場合に利用するキーワード

・異なるプログラムスロット間でプログラムを使う場合はEXECで先に実行しておくこと。

1) COMMON DEF USER
2) COMMON DEF USER(X)
3) COMMON DEF USER X OUT A,B

COMMON DEF FOO(X,Y,Z)

RETURN 値

DEFの返値を設定して呼び出し元に復帰する

・関数型として定義されたDEF命令内で値を返す場合に利用する。

DEF CALC(A,B)
 RETURN A*B
END
PRINT CALC(2,3)

END

ユーザー関数、ユーザー命令のDEF定義を終了する

DEF FUNC
 PRINT FUNC
END

DEFARGC()

ユーザー定義命令・関数の引数の個数を調べる

・ユーザー定義命令・関数内でのみ使用可能。
・可変長引数と組合わせると便利。

返値

ユーザー定義命令・関数の引数の個数

DEF FOO X,Y
PRINT DEFARGC()
END

DEFARG(引数番号)

ユーザー定義命令・関数の引数の値を調べる

・ユーザー定義命令・関数内でのみ使用可能。
・可変長引数と組合わせると便利。

引数

引数番号

調べたい引数の番号
・最初の引数から順に0,1,2,3…と指定する。

返値

指定引数の値

DEF FOO X,Y
PRINT DEFARG(0) 'Xの値が返る
PRINT DEFARG(1) 'Yの値が返る
END

DEFOUTC()

ユーザー定義命令・関数の返値の個数を調べる

・ユーザー定義命令・関数内でのみ使用可能。
・可変長返値と組合わせると便利。

返値

ユーザー定義命令・関数の返値の個数

DEF FOO OUT X,Y
PRINT DEFOUTC()
END

DEFOUT 返値番号,値

ユーザー定義命令・関数の返値を設定する

・ユーザー定義命令・関数内でのみ使用可能。
・可変長返値と組合わせると便利。

引数

返値番号

設定する返値の番号
・最初の返値から順に0,1,2,3…と指定する。

指定返値に設定する値

DEF FOO OUT X,Y
DEFOUT 0,10 'X=10と同じ意味
DEFOUT 1,20 'Y=20と同じ意味
END

CALL 命令名[,引数…][ OUT 変数1[,変数2…]]

指定名称を持つユーザー定義命令を呼び出す

引数

命令名

・呼び出すユーザー定義命令名の文字列。
・文字列なので""でかこうか文字列変数を使用。
・"1:ユーザー定義命令名" の形式でプログラムスロット指定も可能。
・あらかじめEXEC命令で対象スロット内のプログラムを実行可能にしておくこと。

引数~

指定した命令に必要な引数

返値

結果として返したい数分の変数名をOUTの後に記述

CALL "USERCD",X,Y OUT A,B
'
DEF USERCD X,Y OUT A,B
A=X+Y:B=X*Y
END

CALL(関数名[,引数…])

指定名称を持つ関数を呼び出す

・組み込み関数、ユーザー定義関数どちらでも指定可能。

引数

関数名

・呼び出すユーザー定義関数名の文字列。
・文字列なので""でかこうか文字列変数を使用。
・"1:ユーザー定義関数名" の形式でプログラムスロット指定も可能。
・あらかじめEXEC命令で対象スロット内のプログラムを実行可能にしておくこと。

引数

指定した関数に必要な引数を列挙する

返値

指定した関数が返した値

A=CALL("USERFC",X,Y)
'
DEF USERFC(X,Y)
RETURN X*Y
END

CALL SPRITE
CALL TEXT

コールバックを呼び出す

・SPFUNC, TFUNCで設定されたコールバック処理を一斉に呼び出す。
・SPFUNCで設定されたコールバックはCALL SPRITEで呼び出す。
・TFUNCで設定されたコールバックはCALL TEXTで呼び出す。
・呼び出したコールバックに関連するスプライト管理番号やテキストスクリーンIDはCALLIDX()で取得できる。

CALL SPRITE
CALL TEXT