ORANGE BASIC の使い方・仕様

ORANGE pico では最小限構成で

BASIC プログラミング言語「ORANGE BASIC」が使えます。

 

「対応」のバージョン記載がない場合は初期バージョン 0.01 からの対応です。

あえて旧バージョンの解説を避けている仕様があります。

(動作に問題があり、仕様が変更されている場合など)


ORANGE pico の起動

ビデオ出力を行っている場合、(config 2,0 または spitft 0)

ORANGE pico の電源を入れ、下の画面が表示されれば、

ORANGE BASIC が正常に起動しています。

type E はビデオ出力が存在しません。

 


0.37 より起動表示が変更されました。

0.43 よりフォントが変更されました。

0.36 では右の表示になります。

 

USB-シリアル を用いて

ターミナルソフト等を起動した場合も

テキストで同じように出力します。

 

ファームウェア 0.98 より

スクリーンエディタがデフォルトとなり

シリアルへの送出を行いません。 

シリアルを使用する場合は
config 3,0 を実行して
ラインエディタへ切り替えて下さい。
(0.98 のみ mode 0 とします)

 

カラー TFT 液晶モジュールを出力先にしている場合

(config 2,1〜4 または spitft 1〜4)ビデオ出力は行われませんので、

上の画面が表示されなくてもシリアルで表示されていれば正常です。

 

USB-シリアル・カラー TFT 液晶モジュールについては
周辺機器パーツ を参照して下さい。


コマンドライン上でのキー操作

カーソルが出ている場合は下の操作を行えます。

キー 対応 動作
Enter   コマンドの実行・プログラムの入力確定
Back Space   カーソル左の文字を削除
Delete 0.17〜 カーソル部分の文字を削除
Esc 0.17〜 編集のキャンセル
カーソル 上 ↑ 0.17〜 カーソルを上へ移動
前の内容(最後の内容)を表示 ※
カーソル 下 ↓ 0.17〜 カーソルを下へ移動
次の内容(最初の内容)を表示 ※
カーソル 左 ← 0.17〜 カーソルを左へ移動
カーソル 右 → 0.17〜 カーソルを右へ移動
Scroll Lock 0.29〜 カナ・英数モード切替
カタカナ ひらがな|ローマ字 0.44〜 カナ・英数モード切替

 

※ カーソル上・下は、0.17〜0.45 でプログラムの内容を表示します。

0.46 からは入力内容の履歴を表示します。(ダイレクトモードの内容が含まれます)

\ Enter とするとプログラム編集モード(0.17〜0.45 同等)になります。

0.48 よりプログラム編集モードでは行頭が ] になります。

入力履歴モードに戻す場合は Esc・Ctrl+C です。

各モード、最初と最後がつながった状態となっています。

0.97 以降および mode 1 はスクリーンエディタモードになり、
カーソルの上下移動になります。

 

1行の長さは 255 文字まで有効です。
プログラムは行番号があるため、更に短くなります。

ただし一部のバージョンでは
文字数が長いとフォント表示がおかしくなる不具合があります。

 

行番号がない場合はダイレクトモードになり、
Enter を押した段階ですぐに実行されます。

行頭に行番号を含めた場合はプログラムの扱いになります。

 

カナ入力は JIS 配列です。JIS キーボードで印刷されているとおりになります。


キーの割り当て

kbstatus()・inkey() では次のように割り当てられています。

多くは 1980 年代のパソコンと共通していますが、カーソル左右は逆になっています。

print のコントロールコード割り当ては行われていませんので、
locate・cls などの別コマンドを使用する必要があります。

 

kbstatus() は複数のキーを検出できます。

一方で実際に接続したキーボードのみで使用でき、シリアルでは反応しません。

キー kbstatus() inkey() 0.26〜 inkey() 〜0.25
Back Space   8 8
Tab   9 9
Enter   13 13
カーソル 左 ← 1 28 17
カーソル 右 → 2 29 19
カーソル 上 ↑ 4 30 16
カーソル 下 ↓ 8 31 18
スペース 16 32 32
Del   127 127
左 Shift 32    
右 Shift 64    
左 Ctrl 128    
右 Ctrl ※ 256    

※ コンパクトキーボードでは存在していない場合があります。

 

直接接続したキーボードのテンキーは Num Lock オフの状態で認識されています。

そのためテンキー 2・4・6・8 キーはカーソルキーとして動作します。

移動で数字 2・4・6・8 を考慮する事はありません。

シリアルは接続しているパソコンの Num Lock の状態によって決まります。

 

Esc キーはプログラムの中断になるため、使用する事はできません。

 

Web・Email などの特殊キーが存在する場合は、w や e などに割り当てられています。


変数

変数名は 20 文字まで識別対象になります。!・$ を加えて 21 文字です。

0.36 までは大文字・小文字の区別がありません。

0.37〜0.66 は 1 文字の場合は大文字・小文字の区別がありませんが、

2 文字以上ある場合は大文字・小文字が区別されます。(A!・a$ は区別されます)

0.67 からは 1 文字も含めて大文字・小文字の区別があります。

基本的には大文字・小文字を統一した変数にしておくと無難でしょう。

run のタイミングで変数は初期化されます。

 

後ろに !・$ を付けない場合は整数型数値の変数です。

範囲は -2147483648〜2147483647 です。
(65536×65536÷2=2147483648)

 

a=5

b=10

c=a+b

 

後ろに $ を付けた場合は文字列変数として扱います。

 

a$="ORANGE"

b$="pico"

c$=a$+" "+b$

 

" を入れたい場合は \" が使えます。\x22 でも代用可能です。

 

0.40 より後ろに ! を付けた場合は単精度実数型変数として扱います。

(単精度浮動小数点数型・32 ビット長浮動小数点数型)

 

pi!=3.141593

 

a・a$・a! は異なる領域で扱われるので、同時に用いて問題ありません。

 

なお、コマンドとして let は存在しません。


整数型と単精度実数型

0.40 より単精度実数型が採用されています。

当初から数値は整数型だったため、整数型が優先になっています。

 

上の項目で記載している変数以外に、数字に小数点 . が付かない場合は整数型、

一番左の数値に . が付く場合は単精度実数型の扱いで計算を行います。

 

5/3 → 整数同士の計算になり、1 が返ります。

5./3 → 単精度実数型の計算になり、1.666667 が返ります。

 

単精度実数型変数から整数型変数に入れると小数点以下は切り捨てになります。

 

a!=3.5

a=a! → 変数 a は 3 になります。 

a!=-5.2

a=a! → 変数 a は -5 になります。 

 

コマンド floor・ceil も参照して下さい。floor に近いですが負の値が異なります。


16進数表記

0〜9、a〜f の 16 進数で扱う事ができます。

 

数値の場合は &h を頭に付けます。次の2つは同じ値が入ります。

 

a=157

a=&h9d

 

文字列の場合は \x00〜\xff による16進数表記が有効です。
次の3つは同じ文字列が入ります。

 

a$="!#%"

a$="\x21\x23\x25"

a$=chr$(&h21)+chr$(&h23)+chr$(&h25)

 

\x00(chr$(0))は文字列の終端と判断します。
そのため \x00(chr$(0))を文字列に含めていると意図しない動作をします。

 

今のところ 2 進数・8 進数は対応していません。


演算子

上から優先度の低い順です。下の演算子が優先して処理されます。
他の BASIC プログラム言語とは異なり、C 言語同等の処理を行います。

() で囲むと優先して処理を行います。

演算子 対応 動作
or   どちらかが真の場合に 1
|| 0.29〜 どちらかが真の場合に 1
and   両方真の場合に 1
&& 0.29〜 両方真の場合に 1
0.07〜 論理和
0.07〜 排他的論理和
0.07〜 論理積
  等しい場合に 1
== 0.23〜 等しい場合に 1
<> 0.03〜 等しくない場合に 1 >< は使用不可
!= 0.29〜 等しくない場合に 1
  右辺の方が大きい場合に 1
<=   右辺の方が大きいまたは等しい場合に 1 => は使用不可
  左辺の方が大きい場合に 1
>=   左辺の方が大きいまたは等しい場合に 1 =< は使用不可
<< 0.07〜 論理左シフト
>> 0.07〜 論理右シフト
  加算
  減算
  掛算
  除算(整数型の場合は除算の商・小数点以下切り捨て)
mod   除算のあまり
0.19〜 除算のあまり
not 0.19〜 論理反転
0.19〜 論理反転
0.19〜 ビット反転

キャラクター

0.43 以降は初期状態で下のキャラクターになっています。

 


 

0.28〜0.42 のデフォルトは下のキャラクターです。

一部のキャラクターが存在しません。またフォントが異なります。

 


 

これ以外に 0.28 以降では cpoke で
キャラクター(花摘フォント)を割り当てる事ができます。

 

cpoke <キャラクターコード>,<割り当てコード>

 

<割り当てコード> は 0〜127 および 1000 以降(0.60〜)が存在します。

※ 2016年7月現在、1000 以降は順次追加されています。

 

0〜127 は 0.03〜0.27 では chr$(128)〜chr$(255) に割り当てられていました。
cpoke <キャラクターコード>,<割り当てコード>+128 で
同じキャラクターコードを用いて最新版でも表示可能です。

 

なお、0.43 より <割り当てコード> 16 のオレンジ、117 のハーフトーンは

+128 した <キャラクターコード> で

デフォルトのキャラクターにも割り当てされています。

 


 

<キャラクターコード> を 127 に設定すると、カーソルに反映されます。

 

これらのコードを紙面印刷できる PDF ファイルにしています。ご利用下さい。

 

キャラクターコード一覧 関連ファイル・ツール内

 

キャラクターは自由に作成できます。(PCG)
8x8 ピクセルで、0〜255 全てのコードに設定できます。

詳細は BASIC テクニック 内で紹介しています。

 

初期状態に戻したい場合は cpoke と入力して下さい。

 

また、ORANGE pico は JIS 第一・第二水準文字(漢字など)も備えています。

 

こちらも詳細は BASIC テクニック 内で紹介しています。

 

0.60 より 1000 以降は 16×16 ドットのキャラクターが割り当てられています。

これらは cpeek -1,<キャラクターコード> で仮想メモリに読み込み、

gput でグラフィック画面に表示する事が可能です。

また 0.64 より sprite を用いてスプライト表示する事ができます。

データの並びは左上より右に 16 ドットすすめて左下へ移動し右へ……と並んでいて、

テキスト画面へ使いたい場合、そのままでは使えず、データの修正が必要です。

 



テキスト画面

ビデオ出力でのテキスト画面は 40×25 文字です。

LOCATE などの座標は左・上が 0 となり、横が 0〜39、縦が 0〜24 となります。

 

 

ターミナルの画面は 80×24 がよく使われているサイズで、
実際にはウインドウサイズによって変更可能な状態なのが普通です。

VT100 対応のターミナルソフトでは locale 等のカーソル移動も対応しますが、

画面サイズの違いによって意図しない動作をする可能性がある事にご注意下さい。


グラフィック画面

ORANGE pico はグラフィック画面が標準で備わっています。

  • spitft 0 ビデオ出力 320×200 ドット
     横座標 0〜319 縦座標 0〜199
  • spitft 1・3 カラー TFT モジュール 横画面出力 320×240 ドット
     横座標 0〜319 縦座標 0〜239
  • spitft 2・4 カラー TFT モジュール 縦画面出力 240×320 ドット
     横座標 0〜239 縦座標 0〜319

座標は左・上が 0 になります。

 

グラフィック関連のコマンドを中心に書式を統一して使いやすくするため
マイクロソフト系の BASIC で採用されていた ( ) や - を外し、

, 区切りの書式にしてあるので、ご注意下さい。

 

LINE (100,50)-(200,150),1

     ↓

line 100,50,200,150,1

 

プログラムが終了してもグラフィック画面はそのままになります。

ダイレクトモードで線画する事も可能です。

画面クリアが必要な場合は cls を使用して下さい。

 

ビデオ出力では白黒の 2 色になりますが、テキスト画面との合成になります。

グラフィックのみを表示させたい場合は

cls で一度テキスト・グラフィック共に画面をクリアさせて下さい。

0.36 以前ではプログラム実行中もカーソルが表示されたままになるため、

cursor 0 でカーソルを非表示にする必要があります。

 

ビデオ出力の色指定は 0 以外で表示、0 で非表示となります。

カラー TFT モジュールとプログラム動作を共有する場合は
白の表示になる 65535(&hFFFF)などにすると良いでしょう。

初期バージョンのプログラムではカラー TFT モジュールの対応がなかったため、

1 で指定されている場合があります。ビデオ出力前提であればこれでも構いません。

 


 

カラー TFT モジュール へ出力するとフルカラーでの出力が可能です。

テキスト画面はカラー TFT モジュールへ出力しません。

また、ビデオ出力にも出力されなくなります。

そのため USB-シリアル を用いて他のパソコンから
ターミナルソフトを経由してのテキスト入出力が必須となります。

カラー TFT モジュール・USB-シリアル については 周辺機器パーツ で紹介しています。

 

色コードは 0〜65535(&h0000〜&hffff)となります。

ビットは次の並びになっています。

 

RRRRRGGG GGGBBBBB

 

&h0000 = 黒、&hf100 = 赤、&hf7e0 = 緑、&h001f = 青、&hffff = 白 となります。

 

表現を変えると次の意味です。

  • R = 赤の輝度 0〜31
  • G = 緑の輝度 0〜63
  • B = 青の輝度 0〜31

色コード = R×2048+G×32+B となります。

 

この計算が難しい場合、0.32 より採用されている rgb を使用して下さい。

rgb(0,0,0) = 黒、rgb(255,0,0) = 赤、rgb(0,255,0) = 緑、rgb(0,0,255) = 青、

rgb(255,255,255) = 白 となります。

 



スプライト

0.64 よりスプライトをサポートしています。

 

sprite スプライト番号,横座標,縦座標,キャラクターコード,表示

sprite 1,160,160,1000,0

 

スプライト番号は 1〜16 です。番号が大きい程手前に表示されます。

キャラクターコードは 1000 以降の 16 ドットキャラクターを指定できます。
(上項目 キャラクター を参照)

表示は 0 で表示、-1 で非表示になります。

 

スプライト領域はテキスト領域・グラフィック領域とは別に存在し、
各領域が重なった表示で表示されます。

 



ラベル

0.29 よりラベルをサポートしています。

<ラベル名>@ と後ろに @ を付けます。
goto・gosub の行番号に代わってラベル名を使用できます。

飛び先は <ラベル名>@ のみを記載して下さい。

1行に1ラベルが有効です。

 

100 i=0

110 loop@

120 i=i+1

130 print i

140 if i<100 goto loop@

 

<ラベル名> は 20 文字、@ を含めて 21 文字 までです。

<ラベル名> は 0.36 まで大文字・小文字の区別はありません。

0.37 からは大文字・小文字の違いで異なるラベル名として扱われます。

基本的には大文字・小文字を統一したラベルにしておくと無難でしょう。

 

ラベルを使用すると renum を行った後に

goto・sogub の行番号を変更する作業がなくなるメリットがあります。


仮想メモリ

0.34 より仮想メモリが追加されています。

 

0.34〜0.59 ではアドレス 0〜8007 番地の 8008 バイト存在します。

0.60〜 ではアドレス 0〜8031 番地の 8032 バイト存在します。

値は 0〜255(&h00〜&hff)の1バイト分です。

 

仮想メモリは mwrite・mread で EEPROM の保存・読み出しが可能で、

プログラムとは別に保存する事が可能です。

別のプログラムで予めデータを収納しておき、初期値としておく事が可能です。

また mmove で仮想メモリ間の移動、vmove でテキスト領域間の移動が可能です。 

また、8000〜8031 番地はフォントパターンの書き込み・読み込みにも使用できます。

0.39 より mptr でアドレスを指定し、mdata で連続してデータを入れる事ができます。

 

0.35 より new や run を行っても仮想メモリは初期化されないようになりました。

必要な場合は mset で初期化して下さい。

 

mset 0,255,8032

 

0.34 では new・run で初期化されます。


その他 ORANGE BASIC の仕様

  • 行番号は 1〜32767 が有効です。
  • 1 プログラムの容量は約 8k バイト(8190 バイト)です。
    0.37 以降コマンドは内部的に中間コードで短縮するようになったため、
    文字数より大きいサイズでプログラムを作成できます。
  • コマンドは公開上小文字になっていますが、大文字でも動作可能です。
    大文字・小文字の区別はありません。
    0.36 までは入力されたまま保存されていますが、
    0.37 以降は list などでコマンド類が小文字に変換されて表示されます。
  • : 区切りで複数のコマンドを記載するマルチステートメントは
    現在完全対応ではなく、誤動作する場合があります。
    現在のところは 1 行 1 コマンドでの記載がおすすめです。
  • ¥ の割り当てはありません。初期状態のキャラクターに存在しません。
    (JIS 第一水準文字にはシフト JIS コード &h818f に含まれています)
    JIS 日本語キーボードで ¥ を入力した場合は \ の入力となります。
  • 配列は 3 次元まで使用可能です。(dim array(10,20,30)) 
    添字は初期状態より 1 次元で 5600〜5800 位まで有効です。
    (バージョンによって異なります)
    run のタイミングで配列は初期化されます。
  • cls の状態で空いている領域は chr$(0) が入っています。
    一方スペースキーでの入力は chr$(32) です。
    多くの BASIC では初期状態が chr$(32) だったため、違いにご注意下さい。
  • 0.36 までデフォルト状態でビデオ出力では
    プログラム実行中でもカーソルは常に点滅表示しつづけます。
    必要な場合は cursor 0 を用いてカーソルを非表示にして下さい。
    0.37 からはカーソル非表示がデフォルトになりました。
    カーソル表示は cursor 1 を実行する必要があります。
  • プログラムの実行を停止する場合、
    直接接続しているキーボードは Esc キー、シリアル経由では Ctrl+C です。

エラーメッセージ

次のエラーメッセージが存在します。

  • Bad File (0.34〜)
     → ファイル属性の異なる内容を EEPROM から読み込もうとした
  • BREAK without FOR (0.22〜)
     → for が実行されていないのに break for があった
  • BREAK without WHILE (0.22〜)
     → while が実行されていないのに break while があった
  • CONTINUE without FOR (0.23〜)
     → for が実行されていないのに continue for があった
  • CONTINUE without WHILE (0.23〜)
     → while が実行されていないのに continue while があった
  • Division by zero
     → 0 で除算をしようとした
  • Duplicate label (0.29〜)
     → ラベル名が重複している
  • File not found (0.35〜)
     → 存在しないファイル名を読み込もうとした
  • Formula too cmplex (0.24〜)
     → 式が複雑すぎて処理できない
  • Illeagal function call
     → 数値の指定に頭理がある
  • Illeagal line number
     → 行番号に誤りがある
  • NEXT without FOR
     → for が実行されていないのに next があった
  • Out of memory
     → メモリ領域が不足
  • Out of string space
     → 文字列の領域が不足
  • Redimensioned array
     → すでに存在する配列を再度設定している
  • RETURN without GOSUB
     → gosub が実行されてないのに return があった
  • Stack overflow (0.39〜)
     → データスタックに空きがない
  • Stack underflow (0.39〜)
     → データスタックが空なのに取り出そうとした
  • String too long
     → 文字列が長すぎる
  • Subscript out of range
     → 配列の範囲が設定を超えている
  • Syntax error
     → 構文に誤りがある
  • Type mismatch
     → データの型が一致していない
  • Undefined label (0.29〜)
     → 無効なラベル名
  • Undefined line number
     → 無効な行番号
  • WEND without WHILE
     → while が実行されてないのに wend があった