Pocket BASIC 仕様
基本仕様
大項目 中項目 小項目 説明 型 数値型 32bit整数(-2,147,483,648 ~ 2,147,483,647) 文字列型 ANCの表示可能文字(0x20~0x7E)で構成する。コメントのみEUC-JPを含めることができる。
※ EUC-JP:1Byte目が、0xA1~0xFE,0x8Eは2Byte、0x8Fは3byteとして扱う演算子 四則演算 +,-,*,/ 四則演算をする。文字列の場合は、+のみ可能。真、偽指定した場合、1と0として数値と演算する。 関係演算子 =,<>,<,>,<=,>= 左右の辺を比較し、真、偽を返す。 0:偽 1:真 論理演算 &&,|| 左右の辺の真偽に対してAND(&&)または、OR(||)の論理演算をし、真偽を返す。 0:偽 1:真 ビット演算 &,| 未サポート プログラムの構造 行(Line)が複数集まったものをプログラムと呼ぶ 行は、行番号(LineNo),ステートメント列(statement sequence)で構成する。 ステートメント列は、コロン(:)で複数のステートメントとつなげたものである。 行番号 行の実行順を示す数字(範囲:1~65535)。行の先頭に必ず存在する。 コメント ステートメントの先頭がシングルクォーテーション(')の場合、続く文字列はコメントとして扱う。
コロンをエスケープできないので、コメントの後ろにステートメントを書くことはできない。配列 dim 変数名[要素数]{,変数名[要素数]} 配列を宣言する。(添字は、0から要素数-1まで) 1次元のみサポート 変数 数名は、アルファベット(大文字または、小文字)から始まり、アルファベット(大文字または、小文字)と数字とアンダーバー(_)から構成する文字列。
宣言は不要だが、初期化しないまま参照するとエラーとなる。
代入時に型が決まり、その語は型に従って演算される。(異なる型を代入すると、代入の時点でそれまでの型から代入した値の型に変わる)命令、関数名 ほとんどはすべて小文字(一部大文字交じり ex.isColM等)。 制約 行番号の最大値 65535 プログラム行数 最大2000行 1行のステートメント数 最大32 変数の数 最大512個 配列の要素数 最大4096 1行の文字数 最大256文字 1行のステートメント数 最大32 GOSUBのネスト 最大100 フレームメモリの数 最大128
ステートメント
大項目 中項目 小項目 説明 代入 左辺=右辺の形で、左辺に右辺の値を代入する 宣言 dim 変数名[要素数]{,変数名[要素数]} 配列を宣言する。(添字は、0から要素数-1まで) 分岐命令 if(行型) if 論理式 then 命令1 {else 命令2} 1行で構成する場合のif文である。論理式が真(値:1)のときthenに続く命令を、論理式が偽(値:0)の場合elseに続く命令を実行する。命令1、命令2はコロン(:)で区切って複数のステートメントを含むことができる。
if A then if B then 処理1 else 処理2 の場合、if B が真の時、処理1、if Bが偽の時、処理2が実行され、if A が偽の時は何も実行されない。
if A then if B then 処理1 else 処理2 else 処理3 の場合は、if Aが偽の時は、処理3が実行される。if(ブロック型) if 論理式1 then
命令1
{else if 論理式2 then
命令2}
{else if 論理式3 then
命令3}
{else
命令4}
end if複数の行で構成する場合のif文である。
論理式が真の場合thenに続く命令を、論理式が偽の場合elseに対応する命令を実行する。
命令は複数行記述可能で、その中にif文を含んでも良い。while while 条件
命令1
{ exit while| continue while}
{命令2}
end while条件が真の間、whileからend whileの間を繰り返す。条件に0でない値を指定すると無限ループとなる。
exit whileを実行した場合は、繰り返しを止めてend whileの次から実行する。
continue whileを実行した場合は、continue while以降の命令(continue while?end whileまでの命令)を実行せずに、whileに戻る。for for 変数 = 初期値 to 評価値 {step 増分}
命令1
{ exit for| continue for}
{命令2}
next変数が範囲の間、命令を繰り返し実行する。
①変数に初期値を代入する
②評価値と変数を比べ、初期値から評価値の範囲に入っていなければ、繰り返しを止めてnextの次から実行する。
③命令を実行する
④変数に増分を加える。
②から④を繰り返す。
exit forを実行した場合は、繰り返しを止めてnextの次から実行する。
continue forを実行した場合は、continue for以降の命令(continue for?nextまでの命令)を実行せずに、forに戻る。
※ 変数に配列は指定不可。初期値と評価値は式を指定可能。増分は、-32,768から+32,767の十進数のみ指定可能(式不可)。goto goto 行番号 行番号に分岐する。 gosub gosub 行番号 行番号のサブルーチンに分岐する。 return return 直前に実行したgosubに戻る。(gosubの次のステートメントから実行する) gosubM gosubM 配列,要素番号変数,式1,分岐先1{・・・,式n,分岐先n}
配列に含まれる数値に応じたサブルーチンを実行する。
配列を最初から最後の要素まで、配列の値と式の値が一致する場合、分岐先の行番号のサブルーチンに分岐する動作を繰り返す。
分岐する際に、処理中の配列のインデックスを要素番号変数に格納する。
サブルーチンからはreturn命令で復帰する。
例)
gosubM sts,idx,4,4000,5,5000,6,6000
stsの値:0,0,4,0,5,0,5,6,1の時
最初に idx=2に設定し、行番号4000から始まるサブルーチンを実行する。
次に idx=4に設定し、行番号5000から始まるサブルーチンを実行する。
次に idx=6に設定し、行番号5000から始まるサブルーチンを実行する。
次に idx=7に設定し、行番号6000から始まるサブルーチンを実行する。
その後、命令を終了し、次のインストラクションを実行する。gosubS gosubS 配列,要素番号変数,式1,分岐先1{・・・,式n,分岐先n}
gosubMと分岐する条件は同じだが、gosubSは最初に条件と合致した1回だけサブルーチンを実行する。 gosubC gosubC 式,分岐先0{・・・,分岐先n}
式の値に従って分岐する。
式の値は0以上の連続した整数でなければならず、変数が取りうる値の数だけ、分岐先を指定しなければならない。
例えば、値が0から2の時、分岐先は3つ指定しなければならず、0の時最初の分岐先、1の時2番めの分岐先、2の時3番めの分岐先に分岐する。
例)
gosubC sts,1000,2000,3000
sts=0の時 1000から始まるサブルーチンを実行
sts=1の時 2000から始まるサブルーチンを実行
sts=2の時 1000から始まるサブルーチンを実行
stsが上記以外の時 VALUE_OUT_OF_RANGEのエラーになる。表示 print print 式 式の値を、SCI経由でPC上のターミナルに出力する。 cls cls {bUpdate,FMID} 画面を消去する bUpdate T:表示を更新する F:フレームメモリのみに描画 省略時はT FMID 描画対象のフレームメモリー 省略時は画面(0) pset pset x,y,c{,dm,bUpdate,FMID} (x,y)に点を表示する c:1or0 1が黒0が白 dm:set,or,xor,not,and bUpdate: T,F FMID 描画対象のフレームメモリー 省略時は画面(0)
※ 指定できる座標は描画対象のフレームメモリー内に限るline line x1,y1,x2,y2,c{,dm,bUpdate,FMID} (x1,y1)-(x2,y2)に線を引く c:1or0 1が黒0が白 dm:set,or,xor,not,and bUpdate: T,F FMID 描画対象のフレームメモリー 省略時は画面(0)
※ 指定できる座標は描画対象のフレームメモリー内に限るbox box x1,y1,x2,y2,c{,dm,bUpdate,FMID} (x1,y1)-(x2,y2)の四角形(塗潰し無し)を描く c:1or0 1が黒0が白 dm:set,or,xor,not,and bUpdate: T,F FMID 描画対象のフレームメモリー 省略時は画面(0)
※ 指定できる座標は描画対象のフレームメモリー内に限るfill fill x1,y1,x2,y2,c{,dm,bUpdate,FMID} (x1,y1)-(x2,y2)の四角形(塗潰し)を描く c:1or0 1が黒0が白 dm:set,or,xor,not,and bUpdate: T,F FMID 描画対象のフレームメモリー 省略時は画面(0)
※ 指定できる座標は描画対象のフレームメモリー内に限るputStr putStr x,y,文字列,c{,dm,bUpdate,FMID} x,yを文字の左上の座標として、文字を描く c:1or0 1が黒0が白 dm:set,or,xor,not,and bUpdate: T,F FMID 描画対象のフレームメモリー 省略時は画面(0)
※ フォントの幅は6ドット、高さは8ドットを前提に描画するエリアを想定し、描画するエリアが描画対象のフレームメモリー内に収まるようにパラメータを指定することget get x,y,参照FMID,x1,y1,幅,高さ{,dm,bUpdate,操作FMID} 参照FMIDで指定したフレームメモリーのx1,y1を左上とする幅、高さで指定した広さのイメージを操作FMIDのx,yで指定した場所にフレームメモリーに取得する。
dm:set,or,xor,not,and bUpdate: T,F FMID 描画対象のフレームメモリー 省略時は画面(0)
※ 描画するエリアが描画対象のフレームメモリー内に収まるようにパラメータを指定することput put x,y,参照FMID {,dm,bUpdate,操作FMID} 指定した座標に参照FMID で指定したイメージを描く。
dm:set,or,xor,not,and bUpdate: T,F FMID 描画対象のフレームメモリー 省略時は画面(0)
※ 描画対象のフレームメモリーからはみ出した描画エリアは描画しないupdate update {x,y,width,hight} FMID0の(x,y)を左上とするwidth,hightの大きさのエリアをLCDに転送する。省略時は全画面を転送する。 setBM setBM FMID,y,ビットマップデータ FMIDで指定したフレームメモリーにビットマップデータを設定する。
y:ビットマップデータを設定するy座標(0からフレームメモリーの高さ-1)
ビットマップデータ 左のビットから順に1文字を対応させて、0と1で構成した文字列でビットマップの値を指定する。
※ ビットマップデータを定数で指定すると、圧縮されるのでメモリーを節約できる音 sound sound チャネルNo,文字列
指定したチャネルに出力したい音を設定する。音を設定するだけなのでこの時点では音はでない。
サウンドチャネルに音を設定するチャネルNo:0 or 1
文字列: 音をMMLで表現した文字列
MML(Music Macro Langauge)
・音程 ドレミファソラシ → CDEFGAB
半音上げるときは#をつける
オクターブ 音程の後に0?9をつけて表現する
数字が大きいほど高い音を表す。
基準音のラ(440Hz)をA4に設定している。
・音の長さ Lの後に音符の種類を指定する。L4であれば4部音符。全音符はL1。
付点はL4H のように後ろにHをつける。
・休符 ピリオード(.)で表す。
・テンポ Tの後に4分音符が1分間に入る数を指定する。
・音量 Vの後に0?255の数字をつけて音の大きさを表す。
数字が大きいほど音が大きい。0は消音。
音量と音の長さは、一旦指定するとその後に引き継がれる。
区切り文字 記号と記号の間の_は無視。
記号とパラメータの間の_はNG(L_8などはNG)
例)4分音符が1分間に160入るテンポで、
音量200で4分音符のド#レミファソラシドを表現する文字列 最後のドだけ付点8分音符
T160V200L4_C#4D4E4F4G4A5B5L8HC5.play play チャネルNo サウンドチャネルに設定した音を出力する。
この命令は、他の命令と違って、非同期なので音の出力の終了を待たずにBASICに制御が戻る。その他 sleep sleep 時間 指定した時間待機する。時間 待機する時間をmsで指定する。(0から60000ms) ただし、待機時間は余り正確ではない。 write write アドレス,文字列 不揮発性メモリーに指定した文字列を書き込む。文字列の1文字を格納するのにアドレス1つを消費する。
アドレス:書き込む先頭アドレス(0から8191)
文字列:書き込む文字列strToA strToA 文字列,開始インデックス,式,幅1,配列1,{,幅2,配列2,・・・,幅n,配列n}
文字列の開始インデックスから幅で指定した文字数分を10進数と仮定して指定した配列の式で指定したインデックスに代入する。
配列を複数並べて書くと、続けて指定した幅の文字数分を10進数と仮定して代入する。
幅は0~65535の10進数表現のみが可能である。(変数や式の利用不可)
例)
strToA str,4,idx,3,x,3,y,1,sts
strの値が “01230100205”,idxが5の時、x[5]=10,y[5]=20,sts[5]=5が実行される。
関数
書式 説明 keyX()
※ Xは、A,B,U,D,L,Rの6つがある。スイッチの状態を返す。スイッチ押下中:1 スイッチを押していない時:0 format(書式文字列,式)
数値型の変数の式の値を書式文字列に従って文字列に変換する。
例:format(“%05D”,10) は、00010に変換される。
format(“%-5D”,60)は、左に3つのスペースを付けた60に変換される。
書式文字列 %[フラグ][フィールド幅][変換文字]
・フラグ マイナスを指定すると右詰になる
・フィールド幅 変換文字にDを指定した場合、1~10が有効範囲
変換文字にXを指定した場合、1~8が有効範囲
フィールド幅の先頭の数字が0の場合、フラグの指定に関係なく右詰めとする。(足りない桁は0で埋める)
フィールド幅の先頭の数字が0でない、かつ、右詰めの場合、右詰とする。(足りない桁はスペースで埋める)
フィールド幅の先頭の数字が0でない、かつ、左詰めの場合、 左詰めとする。(足りない桁はスペースで埋める)
数値の桁数または文字列の文字数がフィールド幅を超える場合、左からフィールド幅で切断する
・変換文字
D:10進数に変換する
X:16進数に変換するrand() 0から255の乱数を取得する strlen(文字列) 文字列の文字数を取得する asc(文字列) 文字列の先頭1文字の文字コード(アスキーコード)を取得する。 chr(文字コード) 指定した文字コードを1文字の文字列に変換する。 val(文字列) 指定した文字列を10進数と仮定して数値に変換する。 mid(文字列,先頭文字No,終了文字No)
指定した文字列の一部を取得する。
先頭文字No:取得する先頭の文字の番号を指定する。
番号は0から始まり、左から1文字目を0番で表す。
先頭文字Noで指定した文字は取得する文字列に含む。
終了文字No:取得する終端の文字の番号を指定する。
番号は0から始まり、左から1文字目を0番で表す。
終了文字Noで指定した文字は取得する文字列に含まない。
※先頭文字Noと終了文字Noに同じ値を指定すると、空の文字列を取得する。
※文字列全体を取得するときには、先頭文字Noに0、終了文字Noに文字列の文字数を指定すmod(a,b) aをbで割った余りを返す abs(a) aの絶対値を返す sin(a) sinの値を10000倍した値を返す。aには角度(0から360)を10倍した値を指定する。 cos(a) cosの値を10000倍した値を返す。aには角度(0から360)を10倍した値を指定する。 createFM(幅,高さ) フレームメモリーを生成し、そのIDを取得する。幅、高さは式で記述可能。幅:横方向のドット数高さ:縦方向のドット数 point(FMID,x,y) 指定したフレームメモリーのx,yの位置の色を返す。 0:黒 1:白
FMIDで指定したフレームメモリーの範囲外の座標を指定した場合、無条件に0を返す。soundXstatus() 指定したサウンドチャネルが音の出力が終わったかどうかを調べる。 X:0 or 1 出力中の時1、出力していない時0を返す。 read(アドレス, 最大文字数)
不揮発性メモリーの指定したアドレスから文字列を読み出す。
アドレス:読み出す先頭アドレス(0から8191)
最大文字:読み出す最大文字数を指定する。
writeで文字列を書き込むときに、文字列の最後に0を付けて書き込んでおり、
readでは文字列の終端を0を目印に読み出す。
writeで書き込んだ時に、終端を示す0を上書きしてしまった場合などは、暴走する
可能性もあるので、最大読み出す文字数を指定する。isOut(sx,sy,sw,sh,dx,dy,dw,dh)
sx,syを左上に持つswの幅,shの高さを持つ単形領域の中からdx,dyを左上に持つdwの幅,dhの高さを持つ単形領域がはみ出しているかを調べる。
はみ出しあり:1 はみ出しなし:0
isCol(sx,sy,sw,sh,dx,dy,dw,dh)
sx,syを左上に持つswの幅,shの高さを持つ単形領域とdx,dyを左上に持つdwの幅,dhの高さを持つ単形領域が重なっているかどうかを調べる。
衝突あり:1 衝突なし:0
isColM(sx,sy,sw,sh,dx,dy,dw,dh,sts,val1{,・・・valn})
sx,syを左上に持つswの幅,shの高さを持つ単形領域が重なっているかどうかを調べる。
重なりを調べる対象は、sts[]の値がval1~valnのいずれかと一致したインデックスと同じ値のインデックスのdx[],dy[],dw[],dh[]で表現される単形領域である。
衝突あり:衝突していた単形領域の配列のインデックス(最初にたまたま見つけたもの)
衝突なし:配列の要素数(最大のインデックス値+1)
コマンドプロンプトで直接実行する命令
書式 説明 list {ラインNo} BASICプログラムを表示する。ラインNoを指定した時は、指定した行だけを表示する。 run プログラムを実行する。 vlist 変数の一覧を表示する。 free フリーメモリーを表示する。 clear プログラムをrunする前の状態に戻す。変数などが未初期化の状態に戻る。 new プログラムを消去する。
PocketBASICとSimpleBASICの主な違い
SimpleBASICは、ほとんどの部品が秋月電子で
入手可能なAKI-H8/3052ベースのマイコン用に開発したBASICだ。
プロトタイプではあるがハードウエア的には、メモリーやビープ音のチャネル数が多く、キーボードも接続できるなど、今回のマイコンよりスペックは上だった。(今回のマイコンがジム、前回のはガンダムみないなもの ^^;)
今回のPocketBASICでは、SimpleBASICの仕様を以下のように変更した。