X-BASIC/68との違い


[戻る]

// 互換性について


X-BASIC'は、機種依存外部関数を除き、基本的に「SHARP X68000のX-BASIC v2.0」(以下X-BASIC/68) および「ぺけ-BASIC v0.2」と互換性を持っています。
プログラムもSHIFT-JISのまま読み込むことが出来ます。

主な違いは以下の通りです。
X-BASIC' X-BASIC/68 ぺけ-BASIC
行番号 自動削除
gosub × ×
goto行番号 ×
goto "ラベル" 常時○ × 設定で○
goto *ラベル × × 設定で○
戻り値のないreturnで()の省略 ×
エディタ 内蔵 内蔵 なし(呼び出し可)
コマンド なし(一部関数化) あり なし
ダイレクト実行 不可 不可
?(print省略形) ×
その他省略形 × ×
文字列長 設定で全体に変更可宣言時に[]で任意に設定可255バイト固定
配列次元 10次元 255次元 10次元
配列要素上限 OS状態による FREE設定まで OS上限まで
宣言なしint変数 標準ではエラー 警告
dimなし配列 標準ではエラー 警告
表示コントロールコード CTRL-G/CTRL-J以外あり あり 一部あり
多バイト文字の
バイト単位出力による表示
×
chars2Sjis()/chars2Utf8()で処理可能
可変長配列 常時○ なし 設定で○
配列引数 常時○ なし 設定で○
定数宣言 enum/fenum なし なし
using指定 文字列定数のみ 変数も可 文字列定数のみ
using ! 1文字 1バイト 1バイト
using "%" 不足桁を0で埋める %が表示される %が表示される
e表現float
(>3e10,4E-10など)
×(バグ)
単項演算子の連続
(-notなど)
×(バグ)
変数名長 無制限 64 無制限
変数の初期化 常時 常時 設定でなし
変数宣言時代入 制約なし 定数式のみ 制約なし
date$/time$ 代入不可 代入可 代入可
inkey$ あり
ただしタッチまたはファンクションキー設定が必須
あり あり
外部関数互換性 機種依存分以外 あり あり
MML互換性 FM音源/PCM以外OPMDRV.X相当 音源ドライバによる /68と同じ
マルチステートメント 可(省略不可)
//コメント × ×
空行 ×
ファイルエンド サイズ/&h1a &h1a必須 サイズ/&h1a
改行コード &h0dのみ/&h0aのみ/&h0d+&h0a &h0d+&h0a &h0d+&h0a
文字コード UTF-8/SHIFT-JISSHIFT-JIS SHIFT-JIS
起動時引数 なし なし 設定で○
startup.bas
(事前実行ファイル)
あり なし なし
autorun.bas
(自動実行)
なし あり なし
エラー停止 コンパイル時は全体
実行時発生行
実行時発生行 コンパイル時発生行
実行時発生行
.cnf設定 一部SETUP あり 拡張あり
マルチステートメントについてはわかりにくいので補足しておきます。
X-BASICでは ':' で区切ることでマルチステートメントを書けますが、X-BASIC/68ではその後の文を省略できません(存在しないとエラーになる)。
iOS版及びぺけ-BASICでは省略できます。この差は特にcase文で顕著になります。
case 1:    X-BASIC/68ではエラーになるのでcase 1と記述しなければならない
オーバーフローチェック
X-BASIC' X-BASIC/68 ぺけ-BASIC 補足
charで255+1 0 エラー 0 8ビットオーバーフロー
0-1 255 エラー 255 8ビットアンダーフロー
dim a(65536) dim a(0)相当 エラー dim a(0)相当 配列要素数は16ビットで管理されているから

また、ハードやOSの違い等により、以下の項目の取り得る値や規則が異なります。 一部はX-BASIC/68→X-BASIC'変換関数が存在します。

MMLはFM音源/PCMに依存しない部分についてほぼ互換性があります。
FM音源ではありませんので、FM音源に依存する関数やMML構文は全くありません。
発声そのものがPCM音源ですので、PCMに関する関数やMML構文もありません。
詳しくは音楽関数を御覧ください。


// X-BASIC'で追加・拡張されたステートメントおよび機能追加された主な関数


ここでは、X-BASIC'で追加または拡張されたステートメントと、機能追加された主なで関数について記述します。
ステートメント名 enum/endenum
機能 intの定数を宣言します。

ステートメント名 fenum/endenum
機能 floatの定数を宣言します。

ステートメント名 //
機能 // 以降行末までをコメントとします。/*と同機能です。

ステートメント名 print using "%"
機能 表示する桁数を指定します。桁に足りない部分は0で埋めます。

関数名 rand([type;int])
追加機能 typeで乱数の発生方法を変更できます。

関数名 rnd([type;int])
追加機能 typeで乱数の発生方法を変更できます。

関数名 fopen(name;str,md;str)
追加機能 mdに"ra"が追加されています。

機能 startup.bas
機能 すべてのプログラム実行前に読み込まれます。主にシステムに必要な定数の宣言などを行っています。


// X-BASIC/68の同名関数またはステートメントとの違い


ここでは、X-BASIC/68とX-BASIC'で同名の関数またはステートメントにおける違いを記述します。
引数の取れる値範囲、数値引数の型およびリターン値のみ異なる関数もありますが、それについては重要なもの以外は記述していません(数値引数の型は自動変換されます)。
ここでは、引数の詳細についての説明は省略します。

なおV3.00から、一部関数にはX68互換関数が用意されています。

関数名 freads
書式 int freads(st;str,fp;int)
相違点 認識する改行コードが異なります。
iOS版は&h0dのみ/&h0aのみ/&h0d+&h0aのいずれも改行コードとみなしますが、X-BASIC/68では&h0d+&h0aだけです。
もし/68で、&h0dまたは&h0aのみの場合は改行とみなさず読みこむような処理を書かれている場合は、 書き換える必要があります。

関数名 apage
X68版書式 int apage(page;char)
iOS版書式 int apage(page;int)
相違点 page番号の設定値
pageの値が全く異なります。必ず定数を使って設定してください。 apageX68()が互換関数になります。

関数名 vpage
X68版書式 vpage(page;char)
iOS版書式 int vpage(page;int)
相違点 pageの値が異なります。
vpageX68()が互換関数になります。

ステートメント名 width
X68版書式 width wx
iOS版書式 int width(wx;int[,wy;int][,fzenhan;int][,fdescender;int][[,baseCharacterSet;int],baseCharacter;str])
相違点 iOSでは関数になっています。また、wx=文字数は条件付きですが自由です。
また、設定時に画面がクリアされません。

ステートメント名 locate
X68版書式 locate x,y,カーソルスイッチ
iOS版書式 locate(x;int,y;int)
相違点 iOSでは関数になっています。また、カーソルスイッチの設定はありません。

関数名 a_play
X68版書式 void a_play(na;数値型一次元配列,sf;char,md;char[,lng;char])
iOS版書式 int a_setPlayData(fname;str[,rateNo;int])
int a_play(no;int)
相違点 X68版ではバッファへのデータ登録やサンプリングレートの設定も行いますが、
iOS版ではデータ登録はa_setPlayData()で行い、a_play()は再生のみを制御します。

関数名 box
X68版書式 box(sx;int ,sy;int ,ex;int ,ey;int,col;int[,style;int])
iOS版書式 box(sx;float,sy;float,ex;float,ey;float [,style;int])
相違点 座標の他、色コードの指定方法が違います(iOS版ではgColor()で別途設定します)。
また、styleの設定値に制約があります。詳しくは取説を参照のこと。
ビットマップにもbitmapBox()があります。
boxX68()/box16X68()が互換関数になります。

関数名 circle
X68版書式 circle(cx;int ,cy;int ,r;int ,col;int[,startAngle;int] [,endAngle;int] [,hv;int])
iOS版書式 circle(cx;float,cy;float,r;float [,startAngle;float][,endAngle;float][,clockwise;int][,ffill;int][,style;int])
および
ellipse(cx;float,cy;float,r;float[,hv;float][,ffill;int][,style;int])
相違点 座標の他、色コードの指定方法が違います(iOS版ではgColor()で別途設定します)。
startAngle/endAngleの単位が異なります。X68は度、iOSはラジアンです。
また、X68は反時計回りの角度指定なのに対し、iOSは時計回りの角度指定になります。
X68での描画結果は以下の通りです。

iOSではclockwise,ffill指定が追加されています。
また、styleの設定値に制約があります。詳しくは取説を参照のこと。
扁平率指定hvがiOSにはありません。逆に扁平率を指定して楕円を描画するときはellipse()を使います。
ビットマップにもbitmapCircle()および扁平率を指定できるbitmapEllipse()/bitmapEllipse2()があります。
circleX68()/circle16X68()が互換関数になります。

関数名 fill
X68版書式 fill(sx;int ,sy;int ,ex;int ,ey;int ,col;int)
iOS版書式 fill(sx;float,sy;float,ex;float,ey;float)
相違点 座標の他、色コードの指定方法が違います(iOS版ではgColor()で別途設定します)。
ビットマップにもbitmapFill()があります。
fillX68()/fill16X68()が互換関数になります。

関数名 line
X68版書式 line(sx;int ,sy;int ,col;int ,style;int)
iOS版書式 line(sx;float,sy;float,ex;float,ey;float[,ffill;int][,style;int])
相違点 座標の他、色コードの指定方法が違います(iOS版ではgColor()で別途設定します)。
また、styleの設定値に制約があります。詳しくは取説を参照のこと。
ビットマップにもbitmapLine()があります。
lineX68()/line16X68()が互換関数になります。

関数名 hsv
X68版書式 int hsv(h;char,s;char,v;char)
iOS版書式 int hsv(h;int,s;int,v;int[,alpha;int])
相違点 h/s/vの値範囲が異なります。 hsvX68()が互換関数になります。
また、hsvX68X68()が全く同じ関数になります。

関数名 rgb
X68版書式 int rgb(r;char,g;char,b;char)
iOS版書式 int rgb(r;int,g;int,b;int[,alpha;int])
相違点 r/g/bの値範囲が異なります。
X68000の色コードをiOSの色コードに変換するにはx68Color2iOSColor()を使います。
rgbX68()が互換関数になります。 また、rgbX68X68()が全く同じ関数になります。

関数名 symbol
X68版書式 symbol(sx;int ,sy;int ,string;str,h;char,mo;char,col;int,an;char)
iOS版書式 symbol(sx;float,sy;float,string;str,fontName;str,pointSize;float[,ht;float])
相違点 座標の他、色コードの指定方法が違います(iOS版ではgColor()で別途設定します)。
X68版の以下の設定がiOS版にはありません。
h横方向の倍率
V縦方向の倍率
mo文字フォントの種類
an回転角度0~3(90度単位)
moはfontNameとpointSizeで相当します。
symbolX68()/symbol16X68()が近似関数になります。

関数名 pset
X68版書式 pset(x;int ,y;int ,col;int)
iOS版書式 pset(x;float,y;float)
相違点 座標の他、色コードの指定方法が違います(iOS版ではgColor()で別途設定します)。
ビットマップにもbitmapPset()があります。
psetX68()/pset16X68()が互換関数になります。

関数名 inkey$()
X68版書式 inkey$(0)
iOS版書式 inkey$()
相違点 リアルタイムキー入力
iOSでは引数は無視され、常にリアルタイムキー入力になります。

関数名 pos
X68版書式 pos
iOS版書式 pos()
相違点 iOSでは関数になっています。

関数名 csrlin
X68版書式 csrlin
iOS版書式 csrlin()
相違点 iOSでは関数になっています。

関数名 beep
X68版書式 beep
iOS版書式 beep()
相違点 iOSでは関数になっています。

システム変数名 date$
相違点 iOSでは代入出来ません。

システム変数名 day$
相違点 iOSでは代入出来ません。

システム変数名 time$
相違点 iOSでは代入出来ません。

ステートメント名 goto
相違点 iOSでは行番号は使えません。

関数名 sp_stat(pl;int,mode;int)
相違点 引数md=2に対するリターン値が異なります。またこれに伴い、md=3/4/5が追加されています。

関数名 sp_on
X68版 int sp_on([pl1;int][,pl2;int])
iOS版 int sp_on([pl1;int][,pl2;int][prw;int])
相違点 iOS版はprwの指定が出来ます。

関数名 sp_def
X68版 int sp_def(sp;int,na;char1次元配列[,sz;int])
iOS版 int sp_def(sp;int,ptn;intまたはchar1次元配列)
相違点 動作は同じですが、iOS版はパレットを使わない実色指定が可能のため、引数に相違があります。
パターンサイズの違いなど、詳細はこちらも参照のこと。

関数名 sp_pat
X68版 int sp_pat(sp;int,na;char1次元配列[,sz;int])
iOS版 int sp_pat(sp;int,ptn;intまたはchar1次元配列)
相違点 動作は同じですが、sp_def()で与えるパターンの要素内容の違いから、パターンを入れる配列の型が異なります。またリターン値が異なります。
パターンサイズの違いなど、詳細はこちらも参照のこと。

関数名 sp_color
X68版 int sp_color(p;int,col;int[,pb;int])
iOS版 int sp_color(p;int,col;int[,pb;int])
相違点 機能的には同じですが、色の指定方法が異なります。
sp_colorX68()が互換関数になります。

関数名 bg_fill
X68版書式 int bg_fill(pg;int,sp;int)
iOS版書式 int bg_fill(pg;int,sp;int[,pb;int][,flip;int])
相違点 X68ではspにpbとflipの情報もORで入れ込む必要がありますが、iOS版は分離して与える必要があります。
bg_fillX68()が互換関数になります。

関数名 bg_put
X68版書式 int bg_put(pg;int,x;int,y;int,sp;int)
iOS版書式 int bg_put(pg;int,x;int,y;int,sp;int[,pb;int][,flip;int])
相違点 X68ではspにpbとflipの情報もORで入れ込む必要がありますが、iOS版は分離して与えます。
bg_putX68()が互換関数になります。

関数名 bg_get
X68版書式 int bg_get(pg;int,x;int,y;int)
iOS版書式 int bg_get(pg;int,x;int,y;int[,pb;int][,flip;int])
相違点 X68ではリターン値にpbとflipの情報もORで入っていますが、iOS版は独立して返します。
bg_getX68()が互換関数になります。

関数名 stick
X68版書式 int stick(j;int)
iOS版書式 int stick([mode;int])
相違点 X68では単独で使えましたが、iOSでは必ずstickStart()で初期化、 stickEnd()で終了が必要です。
また、引数はジョイスティック番号を設定するものではなく、リターン値の切り替えになっています。

MMLおよび音楽関数の相違点については音楽関数の個別の項目で確認してください。


// X-BASIC/68とほぼ同機能となる関数


ここでは、X-BASIC/68とX-BASIC'でほぼ同機能となる関数またはステートメントについて記述します。

機能 画像読み込み
X68版書式 int img_load(st;str[,x;int][,y;int][,b;int])
iOS版書式 int imgLoad(sx;float,sy;float,wx;float,wy;float,fname;str)
int picLoader(sx;float,sy;float,fname;str)
int pic_load(sx;float,sy;float,fname;str)
int cutLoader(sx;float,sy;float,fname;str)
int cut_load(sx;float,sy;float,fname;str)
相違点 imgLoad()はX68のべた画像フォーマット(GM?/GL?/GS?)をサポートしません。
技術的には可能なのですが、無用でしょうから。

機能 画像書き出し
X68版書式 int img_save(st;str[,x;int][,y;int])
iOS版書式 int jpegSave(fname;str,quality;int)
int pngSave(fname;str)
相違点 iOS版はX68のべた画像フォーマットでの書き出し(GM?/GL?/GS?)をサポートしません。
技術的には可能なのですが、無用でしょうから。

機能 テキスト画面色設定
X68版書式 color 属性
iOS版書式 tColor(r;int[,g;int,b;int[,alpha;int]])
tAtrb(atrb;int)
相違点 iOS版では関数になり、 色指定はtColor()、反転と強調(ボールド)はtAtrb()として指定し分けます。
tColorX68()が互換関数になります。

機能 画面全体のコントラストを指定する
X68版書式 contrast(ch;char)
iOS版書式 tBackgroundAlpha(alpha;float)
gBackgroundAlpha(alpha;float)が近い
相違点 厳密に言えば両者は異なりますが、実質的に同じ働きをします。
ただし、テキスト画面及びグラフィック画面はページ毎に独立制御になります。

contrastX68()が近似関数になります。

機能 ファンクションキーの設定
X68版書式 key ファンクションキー番号,"文字列"
iOS版書式 setFunctionKey(no;int,title;str,keyCode;int)が近い
相違点 ファンクションキー番号の範囲が異なります。
また、 keyステートメントは設定した文字列がそのままinput等で入力されるのに対し、
setFunctionKey()は設定したキーコードを返します。
(iOSにはキーコードという概念がないから。)

機能 マウスカーソル座標を得る
X68版書式 mspos(x;int,y;int)およびmsstat(x;int,y;int,bl;int,br;int)
iOS版書式 int getTouchPoint(xys;float1次元配列)が近い
相違点 iOSではマルチタッチが可能なため、座標は配列で返されます。

機能 ドット色を得る
X68版書式 int point(x;int,y;int)
iOS版書式 int bitmapPoint(x;int,y;int[,r;int,g;int,b;int,alpha;int])が近い
相違点 iOSではグラフィック画面のドット色を直接得る関数はありません。
ただし、bitmapOpen(fdirect=YES)時にはbitmapPoint()が同等の機能を果たします。

機能 単色領域内を塗りつぶす
X68版書式 int paint(x;int,y;int,col;int)
iOS版書式 int bitmapPaint(x;int,y;int[,r;int,g;int,b;int,alpha;int])が近い
相違点 iOSではグラフィック画面で単色領域を直接塗りつぶす関数はありません。
ただし、bitmapOpen(fdirect=YES)時にはbitmapPaint()が同等の機能を果たします。

機能 ドットデータを配列に読み込む
X68版書式 get(sx;int,sy;int,ex;int,ey;int,na;数値型一次元配列)
iOS版書式 bitmapGet(sx;int,sy;int,ex;int,ey;int,buff;int型一次元配列)が近い
相違点 iOSではグラフィック画面からドットデータを直接取得する関数はありません。
ただし、bitmapOpen(fdirect=YES)時にはbitmapGet()が同等の機能を果たします。
格納データには互換性はありません。

機能 配列内のドットデータをグラフィック画面に描画する
X68版書式 put(sx;int,sy;int,ex;int,ey;int,na;数値型一次元配列)
iOS版書式 bitmapPut(sx;int,sy;int,ex;int,ey;int,buff;int型一次元配列)が近い
相違点 iOSでは配列内のドットデータを直接グラフィック画面に直接描画する関数はありません。
ただし、bitmapOpen(fdirect=YES)時にはbitmapPut()が同等の機能を果たします。

機能 ファイル名一覧を得る
X68版 files "パス名"
iOS版 int files(pathes;1次元文字列配列[,basedir;str][,ext;str][,fhave;int][,mode;int][,freg;int])
相違点 X68では指定パス内のファイルの一覧を表示する「コマンド」でしたが、
iOS版ではファイル一覧を配列に格納する「関数」になっています。
iOS版はサブディレクトリ内まで取得するのも異なります。

機能 スプライトの状態を得る
X68版 int sp_set(pl;int,[x;int][,y;int][cd;int][,prw;int])
iOS版 int sp_setting(pl;int[,x;int][,y;int][,sp;int][,pb:int][,flip;int][,prw;int])
相違点 機能的には同じですが、引数の範囲と与え方に違いがあります。
特に左上座標が異なり、sp_set()は(16,16)で、sp_setting()は(0,0)です。
sp_setX68()が互換関数になります。



// 同名関数があるが機能が全く異なるもの


関数名 home
X68版 グラフィック画面の実画面における表示画面の左上座標を指定する(スクロール)
iOS版 テキスト画面のカーソル位置をホームに移動する
補足 homeX68()が近似関数になります。



// 基本的に同じだが、注意が必要な関数


関数 rand(),randomize(),rnd(),srand()
相違点 整数系乱数と実数系乱数は内部では同じ乱数関数から発生させています。
randomize()srand()は内部は同じ処理なので、片方で初期化すると他方も初期化されます。
X-BASIC/68ではrandomize()がrnd()の初期化、srand()がrand()の初期化と分かれており別系列です。
また、seedの値の範囲がX68ではrandomize(-32768〜32767)とsrand(0〜65535)では異なりますが、
iOS版では同じで、X68版の値範囲を含みます。

関数 rand()
相違点 乱数の発生範囲が、iOS版では0~2147483647なのに対し、X-BASIC/68では0~32767です。
このため、iOS版で同じ値範囲にするには、(rand() mod 32728)とする必要があります。
iOSとX68では乱数発生式が異なるので、同じseedでも同じ結果は出力されません。

randX68()が互換関数になります。ただし、これも同じ結果は返しません。

ステートメント input/linput
相違点 メッセージが1行に収まらない場合、X68では改行して表示された後入力欄が出ますが、
iOS版ではメッセージと入力欄が1行に収まる必要があります。
正確に言えば、1行の内メッセージを除いた部分が入力欄になります。
したがって、長いメッセージは別途printで表示させるなど対策が必要になります。

ステートメント print
相違点 表示コントロールコードは、その1文字だけをprintした場合にのみ実行されます。
そうでない時はコントロールコードは全て無視されます(高速化のため)。
なので、例えばTABを含む文字列を表示した時は、TABが処理されず、文字列が詰まって見えます。



// X-BASIC'に存在しない関数・ステートメント・システム変数


以下のX-BASIC/68の関数・ステートメント・システム変数はX-BASIC'には存在しません。
exit(n;int) endに置き換えてください。要望があれば、プログラム終了時にいきなりリスト画面に戻る関数として実装するかもしれません。
a_rec() 技術的にはほぼ解決してますが、多分必要性がないので実装しないでしょう。
chdrv "d:" iOSにはドライブという概念がありません。
chdir "direc" X-BASIC'にはカレントディレクトリという概念がありません。なので、カレントディレクトリを移動するという機能もありません。
console 画面幅設定を入れるとかなり重たくなるので実装してません。
window(sx;int,sy;int,ex;int,ey;int) 画面幅設定を入れるとかなり重たくなるので実装してません。
dskf(drv;char) iOSにはディスク容量という概念はありません。
free X-BASIC'は可変ワークなので無意味です。
gosub~return あえて利用禁止にしています。全てfunc~endfuncで記述し直してください。
lprint iOSにはプリンターに1行単位で出力する機能はありません(iOSだけでなく最近のOS全般にない)。hcopy()で画面のハードコピーは出力できます。
screen 表示画面サイズ,実画面,解像度,表示 iOS版では画面サイズは変更できないので設定できません。
X68用ソースを移植するとき一番わかりにくいのがこれだと思われるので、
X-BASIC V2.0ユーザーリファレンスから該当ページ(p212〜213)を転載しておきます。
screen〔<表示画面サイズ>〕,<グラフィック画面の実画面サイズ及び色モード>〕,<ディスプレイ解像度>〔,<グラフィック画面の表示ON/OFF>〕
    
画面全体(テキスト画面、グラフィック画面、スプライト画面)のスクリーンモードを設定します。

<表示画面サイズ>
    O………256×256
    1………512×512
    2………768×512 (<ディスプレイ解像度>が1(高解像度モード)のときのみ使用可能)
            
ただし、<表示画面サイズ>が768×512以外のときにのみ、スプライト画面は使用できます。
また、<表示画面サイズ>が768×512のときは、<グラフィック画面の実画面サイズ及び色モード>は、0しか設定できません。
                    
<グラフィック画面の実画面サイズ及び色モード>(使用可能なグラフィックページ)
    O………1024×1024、16色(グラフィックページ0)
    1………512×512、16色(グラフィックページ0~3)
    2………512×512、256色(グラフィックページ0,1)
    3………512×512、65536色(グラフィックページ0)
    ただし、<グラフィック画面の実画面サイズ及び色モード>が0以外のときは、<表示画面サイズ>は0または1しか設定できません。
        
<ディスプレイ解像度>
    O………Low(標準解像度)
    1………High(高解像度)
ただし、screen ,,0は<ディスプレイ解像度>のみをLowに設定し、screen ,,1は<ディスプレイ解像度>のみをHighに設定します。
この場合、グラフィックRAMのデータは保存されたままます。<ディスプレイ解像度>がLowのときは<表示画面サイズ>で768×512は使用できません。
            
<グラフィック画面の表示ON/OFF>
    0………表示OFF(グラフィック関数使用不可)
        グラフィックRAMをグラフィック以外の目的で使用する場合に設定してください。
    1………表示ON(グラフィック関数使用可)
        グラフィックRAMをグラフィック関数などで使用する場合に設定してください。(グラフィックRAM初期化)
        
なお、一旦<グラフィック画面の表示ON/OFF>を1に設定するとすべてのグラフィックRAMのデータは消去されます。
特にグラフィックRAMをRAMディスクとして使用している場合は、RAMディスクが破壊されますので、あらかじめRAMディスク
のデータをディスクなどにセーブしてください。

screen命令実行後、window関数(グラフィック画面のクリッピングエリア)は表示画面サイズに、home関数
(グラフィック画面の実画面における表示画面の左上座標)は(0,0)に再設定されます。
また、テキスト画面は、通常表示ON、スプライト画面及びグラフィック画面は表示OFFです。
グラフィック関数を使用する場合は、必ず最初にscreen命令で初期化を行ってください。


// 補足

X-BASIC'は、ぺけ-BASICの持つ拡張機能の多くを標準で動作するようにしています。

ぺけ-BASICの拡張配列については、元の説明書きが不十分な上に、具体的なサンプルが1つも見当たりませんでしたので、
同じ動作が出来ているかどうかわかりません。実動結果が全てです。

ぺけ-BASICもX-BASIC/68互換ですが、バグもしくは仕様の違いによりに一部動作が異なります。
その部分は基本的にX-BASIC/68に合わせてあります。

X-BASIC/68では変数の初期化時には定数のみ可能で式を使うことは出来ませんが、
iOS版(とぺけ-BASIC)では他の変数を参照した式も記述できます。

外部関数の実装はX-BASIC/68のそれにきわめて近い形式にしており、拡張が容易です。
外部関数がどんどん増えるのはその恩恵です。

X-BASIC/68と同じ外部関数を作ることが出来れば、より多くのX-BASIC/68上の資産が使えるようになる、かもしれません。


// これはできないのか?


FM音源 MML自体は実装できましたので、あとはiOS上で動くFM音源ドライバ(シミュレーター)が実装されてれば、いつかはなんとかなるかもしれません。
inputで変数型別にキーボードの種類を変える変数指定を1つに限れば可能かも知れないが、
inputWithPlaceholderで制御して欲しい。
エディタ部の強化ライブラリがあれば出来るけど、自作は無理
まあ、ほとんどは、生活が維持できる程の数が出ればのお話。現在の価格は1年間公開するための費用充填程度です(事実)。
iOSアプリは公開するだけでAppleに支払う維持費が必要なのです。
なお、iOSのメモリや非公開APIを直接いじるような外部関数は作れません。アプリとして公開できなくなりますので。


// おまけ:「ぺけ-BASIC」について

今回の開発に際しては、中谷秀洋氏の「ぺけ-BASIC」を大いに参考にさせていただきました。
中間コードにコンパイルしてから実行するという構造もそこからいただきました。
ぺけ-BASICではエディタは省略されましたが、iOS版では省略できないので実装しています。
実はこの部分の開発もかなり大変でした。

物理的に速くないX68000上で、出来るだけ速くX-BASICを動かそうとする優秀なプログラムですが、
いかんせんオールアセンブラな上にメンテナンス性が考慮されてない記述だったため、解析はきわめて難しいものでした。
68000というMPUやアセンブラHASに強く依存する記述や、定数化しない即値記述が非常に多いなどです。

原作者の方が「バグ取り以外はしない」とおっしゃられていましたが、
実際のところ「それ以外出来ない」状況にあったというのが真実でしょう。
少しでもいじろうもんなら他の部分に影響を与える、そんな、ある意味「絶妙なバランス」でした。
(iOS版発表後オリジナルの作者さんとメイルのやりとりをする機会を得ましたが、
「usingやfloatは使わないからデバッグし切れてなかった」とのことでした。)

今回の開発ではX-BASIC/68だけでなくぺけ-BASIC上でも動作確認をしましたが、
いろいろとバグを発見しました。今更ではありますが、ここに公開しておきます。
もちろん、iOS版ではすべて解消しています。

以下は、ソース内に見つけた不具合らしき部分です。実動作では確認してません。 なんにしても、動作を考える上でぺけ-BASICが参考になったのは紛れもない事実です。
この場で感謝いたします。


// おまけ2:ぺけ-BASICのバグ;外部関数編
ぺけ-BASICの外部関数にもバグがいるようです(教えていただきました)。

X-BASIC'は、本体こそぺけ-BASICのソースを解析した結果を元に作っていますが、
外部関数はX-BASIC/68の仕様を元に完全に一から書き上げたので、気がつきませんでした。

関数名 dskf()
バグ 大容量メディアに対して使った場合、リターン値が正しくないことがある。
詳細 この関数はDOSコールの_DSKFREの返す値を
使用可能なクラスタ数.w * クラスタ当りのセクタ数.w * セクタ当りのバイト数.w
と乗算してリターン値を作っていますが、ここで使っている68000の命令がすべてmulu.w =.w*.w->.l演算であるため、
3つ目の乗算で.lで得られた値の.w部分のみ使ってしまい、 このバグが発生します。
要するに、使用可能なクラスタ数.w * クラスタ当りのセクタ数.w が16ビットで収まらない ような大容量デバイスに対して使用すると、バグります。
iOS版での状況 iOS版には存在しない関数です。

関数名 fread()/fwrite()
バグ リターン値が、X-BASIC/68は読み書き出来た「要素数」であるのに対し、 ぺけ-BASICではバイト数が返ってきています。
詳細 これはDOS _READ/_WRITEのリターン値をそのまま返しているためで、 リターン値を要素サイズで割る処理が抜けています。
iOS版での状況 iOS版は/68と同じく要素数を返します。 ちなみに、Cの関数であるfread()/fwrite()も要素数を返します。

これら3つの外部関数とfloat変数の初期化バグ、およびエラーが発生した時に OSがトラップを発生させることがあるバグを修正したぺけ-BASICを一応作りましたので、
ご入用の方は、「こちら」からどうぞ。

そうそうもう1つ言い訳を。ぺけ-BASICには/68互換外部関数以外にも多くの外部関数が標準で用意されていますが、
iOS版ではそれらを再現していません。理由は、すべて機種もしくはOS依存関数だと思っていたので端から移植対象から外していたためです。
ところが、いくつかの関数はiOS版のバージョンアップに伴って実現可能になりました。
ですが、その時にはすでにその存在をすっかり忘れていたので、ほぼ同一機能(用途)であるにもかかわらず同名ではない関数ができてしまっています。
以下がその例です。

ぺけ-BASICiOS版
spfile_def() sp_image()
v_priority() vpriority()
lzh_extend() zipExpand()
files()は同名でほぼ機能も同じですが、引数が異なります。

[戻る]