ユーザ用ツール


reference:制御命令

制御命令

@ラベル

プログラムやデータの位置を示す名前

・GOTO, GOSUB,命令で指定するジャンプ飛び先やをRESTORE命令で指定するREAD命令の読み込み先を定義する
・@で始まる英数字とアンダースコア(_)

@MAINLOOP

GOTO @ラベル

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

引数

@ラベル

・ジャンプ先の@ラベル名
・ラベル名の入った文字列でも良い
・"1:@ラベル名" の形式でプログラムスロット指定も可能
・あらかじめEXEC命令で対象スロット内のプログラムを実行可能にしておくこと

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

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 ELSE 不成立時処理2 [ENDIF]

式の評価結果が真(1)の時に処理1を、偽(0)の時に処理2を実行する

・THENやELSE直後のGOTOは、GOTOを省略可能
・処理が複数行にわたるときはENDIFを使用

IF A==1 THEN PRINT OK
IF A>1 THEN @JMP1 ELSE PRINT DATE$
IF A==1 THEN
 PRINT "オメデトウ":BEEP 2
ELSE
 PRINT "ザンネン" 
ENDIF
@JMP1
END

THEN 処理

IF文で条件が成立した時の処理の前に書くキーワード

・条件が成立した場合、THEN以下の処理が実行される

IF A==1 THEN PRINT OK
IF A>1 THEN @JMP1 'GOTOの省略
IF A==1 THEN
 PRINT "オメデトウ":BEEP 2
ELSE
 PRINT "ザンネン" 
ENDIF
@JMP1
END

ELSE 処理

IFによる条件が成立しない時の処理の前に書くキーワード

・条件が成立しなかった場合、ELSEがあればELSE以下の処理が実行される

IF A==1 THEN PRINT OK
IF A>1 THEN @JMP1 ELSE PRINT DATE$
IF A==1 THEN
 PRINT "オメデトウ":BEEP 2
ELSE
 PRINT "ザンネン" 
ENDIF
@JMP1
END

ELSEIF 式 THEN 成立時処理 ENDIF

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

・条件不成立時に続けて条件判断を行う場合に利用する

IF A==1 THEN
 PRINT "オメデトウ":BEEP 0
ELSEIF A==2 THEN 
 PRINT "ザンネン" 
ELSE IF A==3 THEN 
 PRINT "まあまあ" 
ENDIF ' ELSE IF の場合は必要
ENDIF

ENDIF

IFによる制御切替後処理が複数行になる場合にIF文を終了させる

IF A==0 THEN
 PRINT "A=0" 
ENDIF

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

式が真(1)の時@ラベルに分岐する

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

・ラベルにはラベル文字列も使用できる
・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 終了値 [STEP 増分]

処理を指定回数繰り返す

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

引数

ループ変数

ループ回数をカウントする変数(1ループごとに増分が加算)

初期値

ループ開始時のループ変数の値または式

TO 終了値

ループ終了時のループ変数の値または式

STEP 増分

・ループ終わりにループ変数に加算する増分(省略時=1)
・増分が小数の場合、演算誤差で意図した回数にならない可能性がある

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

TO 終了値

FOR~NEXTループの終了値を指定する

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

STEP 加算値

FOR~NEXTループでループ毎に加算する値を定義する

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命令に処理を移す

・ループの始まりに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 定義名

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

' 文字表示
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内でRETURN命令を使用して設定する(RETURN ANS のような記述)

引数

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

'足し算
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 V1[,V2…]]

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

引数

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

reference/制御命令.txt · 最終更新: 2019/06/14 20:07 (外部編集)

ページ用ツール