Basic イントロダクション

 Android6.0~9.0では起動時に
 SDカードにsaveを許可するか尋ねるパーミッションダイアログが表示されます。
 saveに外部SDカードを使用する場合は’許可:Allow’を選択して下さい。

 実行


 run ,i    インタプリタモード
 ステップ実行によるデバッグができます。
 速度は出ませんが、エラーチェックがより厳密になります。

 run ,c    中間コードコンパイル実行モード
 独自の中間コードに変換され、高速に実行されます。
 スイッチ省略時は中間コードコンパイルモードでの実行になります。

 フリーエリア(フレキシブル)
 プログラムリストで使用可能なメモリはデフォルトで十分な量に設定されていますが、
 この値を超えてもその機種が許容できる範囲で自動的に上限が上がるしくみになっています。
 変数・配列の使用メモリ量は'clear'文で再設定できます。


 使用キー
 [Arrow-keys] カーソルの移動。 画面のタッチによる移動も可。
 [Enter] 入力の決定。
 [Stop] プログラムの停止。
 [Space] 空白文字。
 [Bs] バックスペースで一文字消去。
 [Del] 位置はそのままで一文字消去。
 [Cls] 画面の消去。(テキストカラー=白、テキスト表示スイッチ=ON、BG表示スイッチ=OFF、ループ音楽の停止)
 2回連続で押すとグラフィック画面のクリアと スプライト表示スイッチ=OFF も行われます。
 [Ins] 文字挿入モードになります。(デフォルトで'Ins'ロック状態になっています)

 キー上部の文字はAltキーを押した後入力できます。
 大文字はShiftキーを押した後入力できます。
 AltキーとShiftキーは2回押すとロックされます。
 もう一度押すと解除されます。


 基本文法

 プログラムの入力
 行番号 コマンド パラメータ
 [例]
    100 print "parameter" [enter]

 コマンド パラメータの間は区切りとして一文字の空白が必要ですが、
 パラメータが括弧やダブルクォーテーションで始まる時は必要ありません。
 コマンドは大文字も小文字も使えます。
 表示の上書きと[enter]で修正できます。

 行番号がない時は即実行されるダイレクトコマンドになります。

 使用文字
  : コロン 1行に複数の文を書くマルチステートメントの区切りに使います。
  , コンマ 複数のパラメータの区切りに使います。
 [例]
    box(5,2)=7:print a,b

 行番号だけの時はその行の消去となります。
 [例]
    100 [enter]


 ラベル


 飛び先の指定は行番号の他に全般的にラベルが使用出来ます。(on~goto,gosub含む)
 ラベルは行の先頭で名前の後ろに ':'コロンを付けます。
 [例]
   100 label:
   110 input a$
   120 print a$
   130 goto label:

 もう一つの指定法はラベル名の前に * を付けます。
 [例]
   100 *label
   130 goto *label
 ver 3.15
 ダブルクォーテーション""で囲った
 ポケットコンピューター式のラベルに対応しました。例) "label"


 定数・変数


 定数は実数型と文字型の2種類あります。
 文字型は""で囲まれて表されます。
 [例]
  3.14
  "ABC"
 実数、数値変数は double (64bitの浮動小数点型)で
 有効桁15桁の精度を持っています。

 変数はデータを出し入れできる箱のようなものです。
 文字変数は変数名の後ろに $ が付けられます。
 変数の値の代入は = を使います。
 変数は最初に現れた時に自動宣言されます。

 変数はグローバルとローカル2つのスコープを持ちます。
 通常の宣言をされた変数はグローバル変数となり全体で参照、代入できます。
 ユーザー定義のfunctionの内側で宣言をされた変数はローカル変数となります。
 ローカル変数はユーザー定義の内側でしか参照、代入できません。
 変数名の大文字と小文字の違いは区別されます。
 参照:'func'命令‐グローバル変数定義位置の注意点 も一読して下さい。
 [例]
   10 no=5 : name$="tree" : 'global
   20 func test(f)
   30  d=f+n : ' f,d local
   40 endfunc d

 配列変数
 配列変数は番号を付けて多くのデータを扱うことができる変数です。
 多重配列も取り扱うことができます。
 配列変数もグローバルとローカル2つのスコープを持ちます。
 [例]
   10 dim no(20), a$(20)  : ' The range 0-19
   20 dim box(80,60)  : ' Multidimensional array


 計算式


 四則演算・べき算
 優先順位
 ------------------------------------------------------------
 指数演算(べき算) ^  例) 2^8
 マイナス符号    -  例) -16
 乗算、除算    * / 例) 5*2 10/3
 整数の割り算    \  例) 10\3
 剰余(除算の余り)mod 例) 10 mod 3
 加算、減算    + - 例) 12+4 20-2
 ------------------------------------------------------------

 括弧で囲まれた式が優先して計算されます。
  [例]
  print 5*(4+6)
   50
  *日本での'¥'(キャラクターコード92)は'\'(逆スラッシュ:同じく92)として扱われ、表示されます。


 関係演算
 2つの値を比較して結果を(真:-1:、偽:0)で返します。
 IF文の条件判断等に使われます。
 ------------------------------------------------------------
 等しい   A=B 
 等しくない A<>B 注) ><表記も可
 小さい   A<B  注) 左辺が小さい
 大きい   A>B 
 以下    A<=B 注) =<表記も可 AはB以下
 以上    A>=B 注) =>表記も可
 ------------------------------------------------------------
  [例]
  10 a=15
  20 if a>10 then print "large"
  large

 論理演算
 整数に置き換えられてビット単位の演算が実行されます。
 下の例は2進数で表現されています。
 優先順に
 ----------------------------------------
 NOT 0101 -> 1010
 0011 AND 0101 -> 0001
 0011 OR  0101 -> 0111
 0011 XOR 0101 -> 0110
 0011 INP 0101 -> 1101
 0011 EQV 0101 -> 1001
 ----------------------------------------
  [例]
  10 a=val("&b1010")
  20 b=val("&b1100")
  30 c=a and b
  40 d=a or b
  50 print "and ";bin$(c)
  60 print "or  ";bin$(d)
  and 1000
  or  1110

 ビットシフト演算
 2進数の桁を左右にシフトさせます。
 ----------------------------------------
 00010100<<2 -> 01010000
 00010100>>2 -> 00000101
 ----------------------------------------
 [例]
  10 a=val("&b1010")
  20 b=a>>1
  30 c=a<<2
  40 print "1010>>1 ";bin$(b)
  50 print "1010<<2 ";bin$(c)
  1010>>1 101
  1010<<2 101000

 複合代入演算子
 変数に演算を行い同時に値を代入します。
 書式: 変数名+=数値または計算式
 演算タイプは a+=1 a-=1 a*=1 a/=1 等、四則演算が使用できます。
 配列変数にも使用できます。
  [例1]
  変数 a に 5 を加えます。
  10 a=2
  20 a+=5
  30 print a
   7
  [例2]
  dt(5,7)+=b*2+1
  配列変数dt(5,7)に b*2+1 の値を加えます。

 文字列の演算
 文字列を比較して結果を(真:-1:、偽:0)で返します。
  "ABC"= "ABC"   Equal
  "ABC"<>"AB12" Not equa

  不等号での比較 < >
  "ABC"<"ABC" 等しいので偽:0になります。
  "ABC1">"ABC" 文字数が多い方が大なので真:-1になります。
  "ABD">"ABC" キャラクターコードの番号が大きいほうが大なので真:-1になります。

 文字列の結合
 + により文字列の結合ができます。
  [例]
  10 a$="ABC"+"123"
  20 print a$
  ABC123


 組み込み関数


 値を決められた方法で計算してその値を返します。
 [例]
    10 a=sin(3.14/2)
    20 print sqr(8)
     0.9999996829318346
     2.8284271247461903


 計算優先順位


 1. 括弧で囲われた式
 2. 関数
 3. 指数演算
 4. 符号
 5. 四則演算
 6. ビットシフト演算
 7. 関係演算
 8. 論理演算


 ユーザー関数


 サブルーチンとして呼ばれるユーザー関数を定義することができます。
 定義はどの場所でも配置することができます。
 文字関数の場合、引数が文字列の場合は末尾に $ が付けられます。
 関数定義内で出現した変数、仮引数の変数はローカル変数として定義されます。
 f=pow(8,4) のような形で呼び出されます。
 endfunc の後ろに返し値を記述することができます。(省略可)
 [例]
    10 f=pow(8,4)
    20 print f
    30 func pow(a,b)
    40  c=a^b
    50 endfunc c


 拡張命令


 Androidコントロール関係の拡張命令のコマンドは
 先頭2文字+アンダーラインで種別が区別されています。
  EX_ Androidコントロール関係拡張命令。
  SP_ スプライト操作関係。
  BG_ BGグラフィック操作関係。
  BT_ Bluetooth操作関係。
  RE_ 正規表現関係。
  UI_ Androidユーザーインターフェイス関係。


 ファイルシステム


  ファイルを扱う基本カレントフォルダは次の2つがあります。

  SDカード側を指定した場合。
  /mnt/sdcard/    Android4.4
  /storage/emulated/0/Android/data/and.bas/files/    Android10の場合
  起動時のサブパス(カレントの後ろに続きます)
  and.bas/    Android4.4
  Android10以降の場合は末尾がfiles/なので初期状態でのサブパスはヌル(文字なし)です。

  本体側を指定した場合。
  /data/data/and.bas/    Android4.4
  /data/user/0/and.bas/files/    Android10の場合
  起動時のサブパス(カレントの後ろに続きます)
  files/    Android4.4
  Android10以降の場合は末尾がfiles/なので初期状態でのサブパスはヌル(文字なし)です。

  SDカード側指定で起動した場合は通常ここで始まります。(and.bas/がサブパス)
  /mnt/sdcard/and.bas/    Android4.4
  /storage/emulated/0/Android/data/and.bas/files/    Android10以降の場合
  (機種によってこれと異なる場合もありますが大半の機種はこの場所になります)
  *パス名の'and.bas'の部分は、-Fバージョンでは'and.basf'、Runtimeでは'and.basr'になります。

  このサブパスの部分は'chdir'コマンドにより移動することはできます。
  基本カレントフォルダより上位には上がれません。
  新しいフォルダは'mkdir'コマンドにより作成できます。

  キーアサインの状態は本体側に保存されます。
  カレントフォルダ名は curdir$() で取得できます。

  コマンドでのセーブとロード。
      save"file1.bas"
      load"file1.bas"

  先頭が"/"で始まる場合はフルパスを指定したことになります。
  [例] (例はAndroid10以降の場合)
    (~/and.bas/files/までがカレントフォルダ、/my/test/はユーザーが作ったフォルダ)
  load"/storage/emulated/0/Android/data/and.bas/files/my/test/file1.bas" 記述されたままの場所
  またはカレントフォルダを表すcurdir$()関数を使って次のようにも記述できます。
  load curdir$()+"my/test/file1.bas"

  "/"で始まらない場合は、現在のカレントフォルダに継続するパス&ファイル名と判断されます。
  [例] load"file1.bas"
     -> /storage/emulated/0/Android/data/and.bas/files/file1.bas と判断される

  また、上位の階層を参照するのにDOS同様に"../"が使用できます。(複数使用可)
  [例] 現在のフォルダが~/my/test/の場合
   load"../res/file1.bas"
    -> /storage/emulated/0/Android/data/and.bas/files/my/res/file1.bas と判断される
   (一度上へ上がって/my/に行き、res/に下がる)
   *アクセス権限のないパスにはアクセスできません。

  AndroidのファイルシステムはOSのバージョンによって構成システムの変遷を繰り返しているので複雑なものになっています。
  [Android11のSDストレージシステムの変更について]
  Android11以降でもこれまで通りの方法でストレージアクセスできますが
  一部アクセスできない機種のために[DOCUMENT_TREE]と呼ばれるアクセス方法を用意しました。
  ユーザーが使用できるフォルダを自分で選択する方式です。
  Android11以降でストレージが特殊な機種は[Menu>Load]を選択した時に
  リストの一番上に"Set SD Access."という項目が現れます。
  こちらを選ぶと[使用フォルダの選択画面]が現れます。
  こちらで使用するフォルダを選んで下さい。
  ID[xxxx-xxxx]が含まれるカレントフォルダになり、アクセス可能となります。
  カレントフォルダを元の通常モードに戻すには、[使用フォルダの選択画面]で
  Backボタンを2回押してBasic画面に戻します。
  これで[DOCUMENT_TREE]モードがキャンセルされます。
  *[DOCUMENT_TREE]形式でのアクセスでの制限。
  SQLでの使用フォルダは内部ストレージに限定してご使用下さい。
  このモードはアクセス速度が低下します。
  CHDIRでのカレントフォルダの変更はできますが
  各命令で指定するパスは絶対指定("/storage/emulated/0/~test1.png")や
  相対指定("sub/test2.png")はできません。
  単体指定("test1.png")のみ可能となっています。
  例 下層フォルダ"sub"へのアクセス例
   chdir "sub"
   gload "test1.png"
   chdir ".." : '元の位置に戻す
  このような切り替えで下層フォルダをアクセスして下さい。

  ・ダイアログでのロード。(Menu>Load)
  ファイルリストが表示されるのでタッチの選択でロードできます。
  フォルダ(後ろに"/"付き)を選ぶとフォルダ移動になります。
  上の階へのフォルダ移動は'..'を選びます。

  ロードするとその場所へ自動で chdir されたことになりカレントがその場所へ移ります。
  *'Cancel'でダイアログ終了するとロードは行われず chdir のカレント移動だけが行われます。

  'New folder'を選ぶとフォルダ名テキスト入力になり
  新しいフォルダを作成できます。

  ・ダイアログでのセーブ。(Menu>Save)
  ファイル名入力してセーブできます。
  カレントフォルダの位置にセーブされますが
  冒頭でパス名を入力するこによりカレントに続くパスを指定できます。

  ファイル削除管理プログラム'filedel.bas'によりカレントフォルダ内のファイル削除作業ができます。
  選択したものが削除されます。(中身のあるフォルダは削除できません)
  またRenameを選ぶことでファイル名変更もできます。


 割り込み


 各種割り込み機能が使えます。
  error  エラーがでたとき。
  stop   STOP キーが押された時。
  time$  指定時間になった時。
  interval  インターバルタイマーが呼ばれた時。
  play  音楽演奏チャンネル0の演奏が終了した時。
  touch  タッチパネルがタッチ又はタッチオフされた時。
  bluetooth  データを受信した時。

  記述:
  on (割り込み種類) gosub 飛び先
  return 


 エラー


 プログラムが実行不能な場合、エラーメッセージ、行番号を出力してコマンドレベルに戻ります。


 Autorun


 起動時カレントに "autorun.bas" ファイルがある場合、読み込んで実行されます。
 初期の設定などに使われます。


 スクリーンモード


 当BASIC は次の4つのスクリーンを持っています。
  T - テキストスクリーン
  G - グラフィックスクリーン
  S - スプライトスクリーン
  B - バックグランドグラフィックスクリーン

 スプライトは256個使用出来ます。(最大1024)
 各画面は'PRIORITY'ステートメントにより優先順位を決めることができます。
 画面サイズは各機種によって異なります。
 画面の縦横方向は起動時の状態によって決定されます。


 リファレンスの見方、表記


 Command Parameter [,Parameter]
  'Command' は大文字でも小文字でも記述できます。
  [] で囲まれたパラメータは省略できます。
  '...' は以下にいくつかのパラメータを並べて記述することができます。
  |A or B| で囲われた表記はどちらか一つを選んで記述します。
 [例] [結果] で使用例や結果が示されています。
 例では行番号が省略して記述されている場合があります。
 [smp_サンプルプログラム名.bas]の表記のあるものはストレージに同梱されているので
 ロードして実行することができます。