androidでBASIC
はじめに
このページは、android搭載のタブレット上で作動するBASIC!についてのページです。
1980年代、国産の8ビットパソコンのBASICで、プログラムを組んでいた私が
タブレット上で自分の組んだプログラムを作動させたい、ということで見つけたのがBASIC!です。
当時のBASICなら、マニュアルを見なくてもプログラムは書けるんだけど
コマンドの書式等、異なる部分があり、そのままでは動いてくれません。
そこで、「当時のBASICとどう違うのか」ということを書き記していきます。
(自分への覚書と言う事でもあります)
したがって、BASICそのものの解説は行っていません。
当時のBASICを知る方の、参考になれば幸いです。

BASIC!のページはこちら

ここから先のページで紹介している内容は、私が個人で調べた結果です。
間違いがあるかもしれませんし、バージョンアップ等で書いてある通りに作動しない可能性もあります。
行なう場合は、自己責任でお願いします。

行番号とラベル
いままで、ポケコンで使っていたプログラムを移植しようとして、最初に行ったのが行番号の削除とラベルの追加です。
行番号は、gotoやgosubの飛び先を示す番号で、BASIC!ではエラーになります。
その代りにあるのがラベルで、英字から始まりコロンで終わります。日本語は使えません。
inputで省略不可
INPUT文でメッセージの省略がエラーになります。
たとえば三角形の面積を求めるプログラム。
input a
input b
print a*b/2
と書くといきなりエラーです。(笑)
input "底辺は",a
input "高さは",b
print a*b/2
のように、入力時に表示させるメッセージをダブルクォーテーションで挟んでカンマの後に変数名です。
if then の直後のgotoが省略不可
「もしAが1なら、○○○へジャンプ」という判断が必要な場合
if a=1 then ○○○ と書くと機能しません。
if a=1 then goto ○○○ で機能します。
配列変数
配列変数の添え字が0からじゃなく1から始まります。
また、括弧は( )じゃなく[ ]です。
なんでだよ?( )でいいじゃん(笑)
inkey$ リアルタイムキー入力
この命令を実行したときに、押されているキーの文字を返す命令なんですが
キーボードが無い… これはかなり苦労しました、マニュアルが英語だし。
例えば、キーを入力するまで待つプログラムを当時のBASICでは
10 a$=inkey$
20 if a$="" then goto 10
と、こんな感じですが、BASIC!では
keyloop:
inkey$ a$
if a$="@" then goto keyloop
こんな感じになります。
inkey$の書式が逆で、何も入力が無いときは @ が代入されます。
が、このままではキーボードが表示されていないので機能しません。
キーボードの表示を切り替える命令、kb.toggle というのを使うんですが、どうも安定しません。
で、試行錯誤の結果以下のようなプログラムになりました。

key:                 ラベルです。gosubでここを呼びます
pause 50              安定させるため少し待ちます。
kb.hide                念のためキーボードを非表示にします。
pause 50              安定させるため少し待ちます。
kb.toggle              キーボードの表示を切り替えます。
keyloop:               ラベルその2です。 
inkey$ a$              押されているキーがあればa$に代入します。
if a$="@" then goto keyloop   何も押されていなければラベル2へ戻ります。
pause 50              安定させるため少し待ちます。 
kb.hide               念のためキーボードを非表示にします。  
return                戻ります     

注意点は、実行する前にタブレットの入力方法をAndroidキーボードにしておくこと。
Japanese IMEでは作動しません。
ソースの入力画面で画面を長押し、入力方法を選択し、Androidキーボードを選択してから実行します。
安定しない場合は、pause 50 の50を色々変えてみて下さい。
LOCATE X,Y:PRINT "○○"
画面の任意の場所に表示。
簡単な計算結果を表示するだけなら、PRINT文で表示させれば良いのですが
画面をデザインし、特定の場所に表示させたい場合はLOCATEを使います。
ところが、BASIC!にはこの命令が見当たりません。
マニュアルを翻訳し眺めていると、画面上へのランダムアクセスは無く
PRINT文では、「最後の行の次に出力される」というような事が書いてあります。だめじゃん...

で、色々調べた結果、コンソール画面(テキスト画面)とグラフィック画面があり
グラフィック画面に文字を表示できる命令がある事が分かりました。
しかし、両方を同時に表示できないらしく
任意の場所に文字表示を行う場合は全てをグラフィック画面に表示させる必要がありそうです。
と言うわけでLOCATEのサブルーチンを作り、座標と文字をセットして呼び出すことで表示させることにしました。
以下はそのLISTです。
まずは、メインルーチンでグラフィック画面の設定を行う必要があります。
gr.open 255,0,0,0       グラフィック画面をオープン 最初の255は透明度?次の3個の数字はバックカラー赤緑青
gr.color 255,255,255,255   表示させる色の指定 最初の255は透明度?次の3個の数字は表示色 赤緑青
gr.text.size 30         文字のサイズ
gr.orientation 1        画面の向きを設定。−1=センサーに依存、1=縦、0=横
この設定で画面が黒、文字は白、文字のサイズは30、画面は縦になります。

input "x",x
input "y",y          LOCATEをCALLする前に設定するのは
input "文字",m$       X,Y座標と文字
gosub locate

gr.front 1           ここから6行はサブルーチンとは関係ありません
do               画面がタップされるまで待って
gr.touch touched ,x,y   その後終了する処理です。
until touched
gr.front 0
end

 ここからがサブルーチンです。
locate:
LX=X*17               フォントサイズで座標計算
LY=(y+1)*30
gr.text.draw a,LX,LY,M$      文字をセット
gr.render               実際に表示されます
return

gr.text.draw 文の最初のaはオブジェクトナンバーで省略できないようです。(実はまだよく分かっていません)
注意点としては、フォントザイズにより座標計算の数値が異なる点です。



ホーム