X-BASIC'は、1980年から90年代前半に一世を風靡したSHARPのX68000に付属したBASIC言語 「X-BASIC」(以下X-BASIC/68)およびその互換高速BASIC「ぺけ-BASIC」をiOS上に再現・拡張した物です。
ですので、iOS上でちょっとしたプログラムを組みたい時、基本的なプログラミングの勉強をしたい時 などに使えます。 XcodeのようにiOSを駆使したプログラムは作れませんが、はるかに簡単にプログラムを作れます。 実際のところ、iOS上のみで完結する、実用に耐えるプログラム環境の構築を目指しています。 X-BASIC/68のプログラムも、機種依存のステートメントや関数の一部やコマンドを除き(ここ重要)、 多くのプログラムを少しの改変で動かすことが出来るはずです(上位互換)。 なお、これはエミュレーターではありません。 また、X68000についてはここでは詳細は説明しませんので、ちまたで調べてください。 (X-BASIC'を使うだけなら、特に知っている必要はありません。)
![]() |
逆に言えば、プログラムのコンパイル開始から実実行状態になるまでは、前のままです。 一方で、デバッグ画面はコンパイル開始時から更新されます。 したがって、コンパイル中にエラーが発生した時にデバッグ画面を表示すると、 デバッグ画面は今回のプログラムのもの、実行画面は前のプログラムのものという状態になります。 ご注意ください。 |
BASICのプログラムはを押して、プログラム選択メニューを開いて選択します。
ここには、X-BASIC'にサンプルとして内蔵されているプログラムと、ユーザーが作成したプログラムが表示されます。 どれを表示するかは下のソース種別で選択できます。その上に書かれている数値はそこに含まれる本数です。 青字ファイル名が内蔵サンプル、黒字がユーザー作成分です。 「新規作成」を選択した場合は、プログラムを新たに作成します。 新規作成もしくは編集を加えたプログラムを実行する前、もしくはそれがある状態で別のプログラムを選択しようとしたときは、 先にプログラムの保存を確認してきます。
ユーザープログラム | 内蔵/新規作成 |
![]() | ![]() |
上書き保存 | 同じプログラムに上書きする。内蔵サンプルおよび新規作成時は選択できません。 |
名前を付けて保存 | 名前を付けて保存します。![]() |
保存しない(オンメモリのみ) | プログラムを保存しません。 保存しない場合も別のプログラムを読み込むまではオンメモリには記録され続けますので、実行は可能です。 保存するまでは、上記タイミングで毎回確認してきます。 逆に、保存しないで別のプログラムを選択すると消えてしまうので注意してください。 |
プログラムの文字コードは常にUTF8で保存されます。 //---------------------------------------------
作成したプログラムを削除したい場合、![]() |
![]() |
![]() |
![]() |
プログラムファイルは、自動的に文字コードを変換して読み込みます。 標準では、ASCII範囲の文字のみ使っている、またはUTF8のファイルはそのまま、 SHIFT-JISはUTF8に変換します。 基本的に(UTF8とSHIFT-JISの)文字コードは自動認識しますが、 特殊な文字の組み合わせによっては誤認識する場合もあるので、 その場合は設定から後述の「強制SHIFT-JISモード」を使い、回避してください。 強制SHIFT-JISモードでは、実際にプログラムファイルがSHIFT-JISの場合、 文字コード変換をせずSHIFT-JISのまま読み込みます。 (プログラムファイルがUTF8の場合は、自動的に強制SHIFT-JISモードは解除されます。)
1行の長さ |
1行の長さは最大255バイトです。 これは後述する「最大文字列長」の設定には関係ありません。 UTF8の複数バイトコードの文字を使うと、見た目では長さを測れないので、 1行は出来るだけ短くしておくことをおすすめします。 |
改行コード |
CR(&h0d)のみ、LFのみ(&h0a)、CR+LF(&h0d+&h0a)を自動識別します(混在は出来ません)。 また、ファイル中に&h1aが出てきた場合、それ以降は読み込みません。 これにより、X68000上で作られたX-BASIC(ぺけ-BASICも含む)のプログラムだけでなく、 それをシャーペン.xで修飾したファイルもそのまま読み込めます。 |
タブコード |
ファイルにTABが含まれる場合、桁位置に関係なく半角スペース4つに置き換えられます。 なお、内蔵エディタではタブは入れられません。 |
行番号 |
X-BASIC/68の行番号付きプログラムファイルもそのまま読めます。 しかし、行番号そのものはすべて消しますので、ラベルでないgotoおよびgosubを使っているとエラーが発生します。 行番号があるかどうかは、プログラムの最初の1行で判断します。1行目に行番号がない場合、2行目以降に行番号があっても削除されません。 (dimの要素だけの行を誤判断で消さないため。) |
コメント |
/* または // があると、以降行末までをコメントと見なします。 改行だけの行(空行)も許されます。 コメント内には任意の文字を記述することが可能です。 |
字下げ | スペースまたはタブによる字下げは自由。 |
マルチステートメント |
複数の文をつなげて記述する場合は':'でつなげます。 文の後にコメントを記述するときも(基本的に)':'が必要です。 「例」print a :// aを表示する |
項目 | 設定範囲 | 説明 | ||||||
最大文字列長 |
15~1023(バイト) 標準は255バイト |
1文字列に格納できる最大バイト数を設定します。 変数だけでなく、定数やその加算によってできる文字列(a$+b$など)にも全て影響します。 X-BASIC'の1文字列分のワークエリアサイズは固定で、終端コード1バイトを加え、このサイズ+1バイトになります。 文字列ワークは全体サイズが固定のため、この設定は文字列変数の最大数確保にも影響をします。 短くすると確保数が増え、長くすると減ります。 たとえば、文字列長を15バイト(ワークは16バイト)にすると標準より16倍多く、1023バイトにすると標準の1/4の文字列変数が確保できるようになります。 文字列長が足りない場合、または文字列長は減らしてでも確保数を増やしたい場合にこの設定で変更します。 なお、この設定は文字列処理の速度には影響しません。 設定値はmaxStringLength()関数で読み出しが可能です(設定はできません)。 | ||||||
自動的変数宣言の許可 |
オン=許可 オフ=不許可 |
未宣言の変数が出てきたときに自動的にintとして定義するかどうかと、
dim文なしでの配列確保を許可するかどうかを同時に制御します。 dimなし配列宣言とは、「型 名前(要素数)」という形式で配列を確保できる書式で、 X-BASIC/68では隠し仕様でした。 標準は「オフ」です。 X-BASIC/68のプログラムで、修正が大変なときのみ使うようにしてください。 | ||||||
強制SHIFT-JIS | オフ/オン/自動 |
強制SHIFT-JISモードとは、プログラムファイルの読み込み時のコード変換を含め、内部の文字コード処理を全てSHIFT-JISのまま行うモードです。 自動では、ソースファイルの文字コードを認識して、オフ/オンいずれかに設定します。 X-BASIC/68由来のプログラムで、内部処理がSHIFT-JISに強く依存したプログラムではこれを使ってください。 オンにすると文字コードはSHIFT-JISのまま処理されますが、X-BASIC/68にも同様の機能があったステートメントまたは関数の一部は自動的にUTF8に変換されます。 実行中の強制SHIFT-JISモードはforcedSJIS()関数で一時的に変更できます。
| ||||||
スプライト機能 | オン/オフ |
スプライト機能を有効にするかどうかを設定します。 スプライトは大量のワークを必要としますので、メモリ不足になるときはこれでオフにしてください。 | ||||||
X68互換関数 | オン/オフ |
X68互換/便利/カード関数を有効にするかどうかを設定します。 既存プログラムで関数名などが重複してしまい、変更が難しい時にオフにしてください。 なお、スプライト関数と異なりオフにしてもメモリの消費量は変わりません。 | ||||||
旧表示互換 | オン/オフ |
V3.00ではテキスト画面の表示制御が少し変わりました。そのため、従来とは表示結果が異なる可能性があります。 V3.00で表示がおかしいと思うときはこれをオンにしてみてください。 | ||||||
fopen()のエラー値 | 旧(0)/新(-1) |
V3.10でfopen()のエラー判定値がX-BASIC/68に合わせて変更になりました。 V3.00までと同じにしたい場合は「旧」に設定してください。 errorCodeFopen()でプログラム的に設定することもできます。 | ||||||
リスト表示フォント |
プログラムリストを表示・編集する画面でのフォントを設定します。 プログラムリストの表示に向かない一部のフォントは省かれています。 日本語が多いプログラムを英語フォントで表示しようとすると、読み込みや編集処理がやや重くなるので注意してください(ちゃんと日本語表示されます)。 ![]() ![]() プログラム実行中のフォントは関係ありません。 |
を押すと、BASICプログラムを内部的に中間コードにコンパイルした後、実行します。 中間コードコンパイル時には、エラーが発生するとその行を飛ばして次行からコンパイルを継続します。 このため、1つのエラーが次行以降のコンパイルに影響を与える場合があります。 従って、エラーは上から順に直すことを推奨します。 1つのエラーを直すと複数のエラーが消える場合もあります(特に制御構文系)。 なお、コンパイルは常にソース全体に対して行われます。 途中にendまたはstopステートメントがあっても、それ以降もコンパイルされます。 また、実行時には通らないところもコンパイルされます。 「例」
int a a=10 if NO then { // ここは実行時には来ない int a ←変数二重宣言のエラーが発生する }エラー発生時は、プログラムの下にエラー発生行とそのエラー内容が羅列されます。
それぞれのエラーをタップすると、その行へジャンプします。を押すとエラー表示を消します。 実行時は1つエラーが発生すると停止します。
実行時の画面は以下のようになります。
![]() |
![]() ![]() ![]() プログラムが終了もしくは中断すると、 ![]() ![]() ![]() ![]() |
デバッグ支援機能では以下のことが出来ます。
デバッグ情報の出力はプログラムで設定します。 詳しくはデバッグ関数を参照してください。 基本的には、どのタイミングで変数及び配列の内容をダンプするかを設定することと、 ユーザーがプログラムの進行度を示したりするために、任意に文字列を出力することが出来ます。 また、stop実行時や、Break押下時も停止行番号が出力されます。 (誠に申し訳ありませんが、Break時の停止行番号は若干ずれることがあります。) 実行中を押すと、実行画面にデバッグ画面を重ねて表示します。
![]()
を押すと、重ね具合(実行画面の透過度)を調整できます。
を押すと、デバッグ画面内容をクリアします。 デバッグ画面を表示したままRUN出来ますが、デバッグ画面の内容更新は1秒に1回なので、若干表示が遅れます。 デバッグ情報は、ユーザー操作でクリアするか、次回実行まで保持されます。 一旦リスト画面に戻っても、操作から「デバッグ画面表示」を選べば再表示可能です。 デバッグ画面には実行中だけでなくコンパイル中のエラーも出力されます。 従来エラー発生箇所の特定が難しかったstartup.bas内のエラーも、捉えることが出来ます。 コンパイル中エラー情報を得る場合は(プログラム実行前ですので)、操作から「デバッグ画面表示」で表示できます。
内部の文字コードは標準ではUTF8ですが、「強制SHIFT-JISモード」にした場合はSHIFT-JISとなります。 どちらの場合も&h20~&h7eの範囲(ASCIIコード範囲)は全く同じです。 同じ文字でもUTF8とSHIFT-JISでは文字コードは全く異なります。 また、UTF8では見た目の幅とバイト数も一致しません。 注意してください。 ASCII &h20~&h7e 1バイト1文字 -code-:-+0-+1-+2-+3-+4-+5-+6-+7-+8-+9-+A-+B-+C-+D-+E-+F- 20 : ! " # $ % & ' ( ) * + , - . / 30 : 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 40 : @ A B C D E F G H I J K L M N O 50 : P Q R S T U V W X Y Z [ \ ] ^ _ 60 : ` a b c d e f g h i j k l m n o 70 : p q r s t u v w x y z { | } ~ * &h5cの文字はフォントによってバックスラッシュまたは「¥」に変化します。 テキスト画面表示処理の関係で、全角スペース1個表示=半角スペース2個表示とはなりません。 ご注意ください。 UTF8 https://ja.wikipedia.org/wiki/UTF8 (日本語版) 1文字が2~6バイトになりますが、X-BASIC'でサポートするのは4バイトまでの文字です。 SHIFT-JIS X680x0でサポートされていた範囲のみをiOS版もサポートします。 1/2,1/4角文字はASCIIの相当文字に変換されます。 1文字は2バイトです。 関数群の中にはUTF16を扱う物もありますが、UTF16はX-BASIC'の中では 標準的には扱えない(直接表示したり出来ない)ので注意してください。 &h00~&h1fおよび&h7fは制御コードとなります。 特に、&h00は文字列の終端を示すコードとなっており、文字列に含めることは出来ません。 以下のコードはそれぞれの意味を持ちます。後ろは、同等の処理を行う外部関数(後述)です。
&h05 | カーソル位置から行末まで消す | |
&h07 | ビープ音を鳴らす | beep() |
&h09 | 水平タブ | tab(1) |
&h0a | 改行 | |
&h0b | カーソルをホーム位置に移動 | home() |
&h0c | テキスト画面消去 | cls() |
&h0d | 改行 | |
&h0e | 逆改行 | |
&h1a | カーソル位置から画面端まで消す | |
&h1c | カーソルを右に移動 | cursorMove() |
&h1d | カーソルを左に移動 | cursorMove() |
&h1e | カーソルを上に移動 | cursorMove() |
&h1f | カーソルを下に移動 | cursorMove() |
なお、各制御コードの動作結果はX-BASIC/68およびぺけ-BASICと全く同じではありません。 他コードは動作未定義です。
ユーザーファイル領域だけ |
pngSave() ,
jpegSave() ,
fdelete() ,
frename() hcopy() , emailSend() , zipExpand() , zipArchive() mkdir() , rmdir() fopen("r")以外 ユーザーの作ったプログラムファイル |
ユーザーファイル領域→システム領域の順で検索(可能) |
fopen("r")のみ ,
filelength() ,
filecopy() picLoader() , cutLoader() , bitmapImageFile() , sp_image() imgLoad() , tileImgLoad() , setFunctionKeyBackgroundImage() files() , cardInit() m_ftrk() , m_tone() プログラムファイル |
システム領域内には、X-BASIC'内蔵のサンプルプログラムおよびそのデータファイルしか格納されておらず、それらは改変や削除ができません。 ユーザーファイル領域には、ユーザーの作った、プログラムを含む全てのファイルが格納され、自由に改変や削除ができます。 ここにはディレクトリ(フォルダ)も作ることができます。 X-BASIC'にはカレントディレクトリという概念がありません。 また、プログラムは、実際の存在位置にかかわらず、常にルートに存在するように振る舞います。 従って、ディレクトリ内を指定するとき、その先頭に'/'は必要ありません 「例」"dir/file" 正しい "/dir/file" 誤り ファイル名の規則はiOSのそれに従います。基本的にはMacOSと同じですが、フォルダ名もしくはファイル名に サロゲートペア文字を含めてはいけません。 X68000やWindowsとの主な違いは
で、他はほぼ同じです。 X68000ではTwentyOneで21文字比較を有効にしていない環境ではファイル名8バイト+拡張子3バイトのみが 比較対象になりましたが、iOS版では常に全文字比較されます。 ユーザーが作ったファイルやディレクトリは、それを使ったプログラムを削除しても自動的に消えることはありません。 逆に言えば、ファイルなどはユーザーがプログラム的に消さない限り残り続けるので、 不用意なったファイルは、fdelete()やrmdir()で削除するようにしてください (iOSにはアプリケーション内ファイルに直接アクセスする手法がないので)。 サンプルプログラムの「filer.bas」は、ユーザーファイル領域内の全てのファイルを一覧し、削除するものです。 これを使えば削除が可能になりますが、基本的には「自分で作ったファイルは自分で削除する」です。
X-BASIC'には日本語版と英語版があります(OSの言語設定を変えるだけ)。 両者は、システムが表示するメッセージの言語以外は、文字コードも含めほとんど同じです。 相違点を以下にまとめます。 詳細は、双方版の説明書を参照してください。