X-BASIC' について



iOS依存関数説明書
X68互換&便利&カード関数
音楽関数

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'を使うだけなら、特に知っている必要はありません。)


// 基本画面


プログラム自体には行番号が付いていませんが、管理のために内部的に行番号を付けています。
画面は上下のみスクロールします。また、ステータスバーのところをタップするとプログラム先頭行から表示します。
表示には「編集」と「リスト」の2つが有り、最初はリストモードです。詳しくは後述します。

「操作」では次の操作ができます。
最終行へプログラムまたはヘルプの最終行を表示します。最終行までスクロールするのが大変なときに使います。
実行画面表示前回の実行結果画面を表示します。
デバッグ画面表示直前の実行でデバッグ画面に出力された内容と実行画面を表示します。
プログラムリスト印刷プログラムのリストを印刷します。
デバッグ画面印刷デバッグ画面に出力された内容を印刷します。
実行画面印刷前回の実行結果画面を印刷します。
一度も実行していないときは表示されません。
実行画面は、次のプログラムが実際に走り始めて初めて更新されます。
逆に言えば、プログラムのコンパイル開始から実実行状態になるまでは、前のままです。
一方で、デバッグ画面はコンパイル開始時から更新されます。
したがって、コンパイル中にエラーが発生した時にデバッグ画面を表示すると、
デバッグ画面は今回のプログラムのもの、実行画面は前のプログラムのものという状態になります。
ご注意ください。

「文字列検索」をタップすると、プログラム中の文字列で検索できます。
検索開始位置は以下のようになります。
または「行番号ジャンプ」をタップするとその行にジャンプします。
(左;「文字列検索」、右;「行番号ジャンプ」)
 
iPadでは、文字列検索はヘルプ内でも行えます(結果表示はエディター内とは異なります)。


// 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を表示する


// プログラムの編集

「編集」ボタンを押すと、プログラムリストの編集モードになります。 ボタンが「リスト」に変わり、行番号が消えます。
編集したい行でタップすると、キーボードが表示されます。
 
編集し終わったら「リスト」を押すします。プログラム保存確認の後「編集」に戻ります。
編集に戻る際に行番号の付け直しをしますので、若干時間がかかります。
リストモードと編集モードのリスト表示位置は完全には一致していません。これはiOSのシステムの制約と技術不足によるものです。

なお、強制SHIFT-JISモードのときは編集できません(iOSがSHIFT-JISのままのテキストを編集できないため)。


// 動作設定

X-BASIC'には、以下の動作及び全般設定があります。

項目設定範囲説明
最大文字列長 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()関数で一時的に変更できます。
表示される文字列定数 print, input, linput, setFunctionKey(), symbol(), prints()
外部関数へ渡すファイル名 fopen(), fdelete(), frename(), filelength(),
pngSave(), jpegSave(), imgLoad(), tileImgLoad(),
setFunctionKeyBackgroundImage()
外部関数へ渡すフォント名 font(), symbol()
ただし、キャラクターコード単位で処理させている場合は対応できないので、 プログラム的にSHIFT-JIS→UTF8コード変換をする必要があります。 (サンプル:codeSJIS.bas/codeUTF8.bas参照)
スプライト機能 オン/オフ スプライト機能を有効にするかどうかを設定します。
スプライトは大量のワークを必要としますので、メモリ不足になるときはこれでオフにしてください。
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つエラーが発生すると停止します。


// プログラムの実行

実行時の画面は以下のようになります。
を押すとプログラムを中断できます。 中断したプログラムを再開することは出来ません。 また、input/ linput/ selectMenu系/ logoAlert()関数の実行中は/が効きません。 input/linputは入力直後に中断されます。

プログラムが終了もしくは中断すると、が無効になり、が有効になります。

を押すと、プログラムリスト表示に戻ります。

を押すと再実行します。
プログラム表示に戻っても、から「実行画面表示」を選択すれば、直前の実行結果の画面は いつでも見ることが出来ます。 実行画面表示からは、を押すことで、元の画面に戻ります。
補足:
// デバッグ支援

デバッグ支援機能では以下のことが出来ます。
デバッグ情報の出力はプログラムで設定します。
詳しくはデバッグ関数を参照してください。
基本的には、どのタイミングで変数及び配列の内容をダンプするかを設定することと、
ユーザーがプログラムの進行度を示したりするために、任意に文字列を出力することが出来ます。
また、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と全く同じではありません。

他コードは動作未定義です。


// ファイルの格納場所とファイル名規約について

X-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の言語設定を変えるだけ)。
両者は、システムが表示するメッセージの言語以外は、文字コードも含めほとんど同じです。
相違点を以下にまとめます。
詳細は、双方版の説明書を参照してください。
  1. print using の 書式 "\"
  2. day$の返してくる文字列
ただし、今回の公開版では英語版用の取説系と画面データファイルは多くを削除しています。

// X-BASIC/68との違い


以下にまとめてありますので、X68版のソースを移植する方はご覧ください。
X-BASIC/68との違い


// サンプルプログラム

権兵衛&カラス XBgonbe.zip
PushBon XBpushbon.zip
ライフゲームXBlife.zip
TICBAN XBticban.zip
YETXByet.zip
STACKYXBstacky.zip
スタートレックXBstartrek.zip
地底最大の作戦XBsnake.zip
信州XBsinshu.zip
レーダースネーキーXBrs.zip
PITMANXBpit.zip
新説桃太郎ゲームXBmomo.zip
ルナレスキューXBlunar.7z
DIGMANXBdigman.zip
人間対戦チェスXBches.zip
爆弾捜しゲームXBbs.zip
ビンゴゲームXBbingo.zip
8QUEENXB8queen.zip
カードゲーム:TENXBten.zip
カードゲーム:SURVIVALXBsurvival.zip
カードゲーム:スピードXBspeed.zip
カードゲーム:ローリング・ストーンXBrol.zip
カードゲーム:Pyramid & Pyramid BreakXBpyramid.zip
カードゲーム:ポーカーXBpoker.zip
カードゲーム:Are You Lucky?XBlucky.zip
カードゲーム:おいちょカブXBkabu.zip
カードゲーム:HEARTXBheart.zip
カードゲーム:GAPXBgap.zip
カードゲーム:CoupleXBcouple.zip
カードゲーム:アコーディオンXBaccordion.zip
カードゲーム:99XB99.zip
カードゲーム:Thirteen DownXB13down.zip
カードゲーム:七並べXB7.zip
カードゲーム:ブラックジャックXBbj.zip
時計XBclock.zip
エレベーターシミュレーターXBele.zip
MML表示XBmml.7z
SuperBASEXBsbase.7z
コンパスXBcompass.zip
フラクタルグラフィックXBfractal.zip
画像ファイルローダーXBpicloader.7z
音声ファイルローダーXBsoundloader.7z
プログラムローダーXBprogloader.zip
スプライトテストXBsprite.7z
スプライト回転XBrotSprite.zip
startup.basXBstartup.zip
ミニサンプルXBmini.zip
MZ-80 BASICからのサンプルXBmz80.zip
X-BASIC/68からのサンプルXBrefSample.zip
音楽関数サンプル XBmusic.zip
音声系テストXBaudioTest.zip
テストプログラムXBtest.zip


<戻る>