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-JIS | SHIFT-JIS | SHIFT-JIS |
起動時引数 | なし | なし | 設定で○ |
startup.bas (事前実行ファイル) |
あり | なし | なし |
autorun.bas (自動実行) |
なし | あり | なし |
エラー停止 | コンパイル時は全体 実行時発生行 |
実行時発生行 | コンパイル時発生行 実行時発生行 |
.cnf設定 | 一部SETUP | あり | 拡張あり |
オーバーフローチェック | ||||
例 | 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ビットで管理されているから |
ステートメント名 | 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 |
機能 | すべてのプログラム実行前に読み込まれます。主にシステムに必要な定数の宣言などを行っています。 |
関数名 | 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版にはありません。
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()で終了が必要です。 また、引数はジョイスティック番号を設定するものではなく、リターン値の切り替えになっています。 |
機能 | 画像読み込み |
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で表示させるなど対策が必要になります。 |
ステートメント | |
相違点 |
表示コントロールコードは、その1文字だけをprintした場合にのみ実行されます。 そうでない時はコントロールコードは全て無視されます(高速化のため)。 なので、例えばTABを含む文字列を表示した時は、TABが処理されず、文字列が詰まって見えます。 |
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で制御して欲しい。 |
エディタ部の強化 | ライブラリがあれば出来るけど、自作は無理 |
今回の開発に際しては、中谷秀洋氏の「ぺけ-BASIC」を大いに参考にさせていただきました。 中間コードにコンパイルしてから実行するという構造もそこからいただきました。 ぺけ-BASICではエディタは省略されましたが、iOS版では省略できないので実装しています。 実はこの部分の開発もかなり大変でした。 物理的に速くないX68000上で、出来るだけ速くX-BASICを動かそうとする優秀なプログラムですが、 いかんせんオールアセンブラな上にメンテナンス性が考慮されてない記述だったため、解析はきわめて難しいものでした。 68000というMPUやアセンブラHASに強く依存する記述や、定数化しない即値記述が非常に多いなどです。 原作者の方が「バグ取り以外はしない」とおっしゃられていましたが、 実際のところ「それ以外出来ない」状況にあったというのが真実でしょう。 少しでもいじろうもんなら他の部分に影響を与える、そんな、ある意味「絶妙なバランス」でした。 (iOS版発表後オリジナルの作者さんとメイルのやりとりをする機会を得ましたが、 「usingやfloatは使わないからデバッグし切れてなかった」とのことでした。) 今回の開発ではX-BASIC/68だけでなくぺけ-BASIC上でも動作確認をしましたが、 いろいろとバグを発見しました。今更ではありますが、ここに公開しておきます。 もちろん、iOS版ではすべて解消しています。
X-BASIC/68 | ぺけ |
-^^^^^ | ^^^^^- |
+** | **+ |
X-BASIC/68 | 符号(+の時は空白)+数値+空白1文字 |
ぺけ | 空白+符号付き数値+空白 |
/68 | iOS | ぺけ | |
"A";100;"B" | A 100 B | ← | ←← |
"A";-100;"B" | A-100 B | ← | A -100 B |
"A";3.14;"B" | A 3.14 B | ← | ←← |
"A";-3.14;"B" | A-3.14 B | ← | A -3.14 B |
sin(pi/2)/cos(pi/2)=1.6331239353195E+016以下も正しい。
tan(pi/4)=1
tan(pi/8)=0.4142...
func testFunc(n;int,s(4,1);str)引数配列の要素数は省略が可能=呼び出し時に確定されるため、コンパイル時には未定のままになっています。
~
subFunc(s) :// ここでエラーが発生する
endfunc
func subFunc(s(4,1);str)
~
endfunc
using "###";a /* OKX-BASIC/68では発生しない。
using "###" ;a /* エラー
関数名 | 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()も要素数を返します。 |
ぺけ-BASIC | iOS版 |
spfile_def() | sp_image() |
v_priority() | vpriority() |
lzh_extend() | zipExpand() |