他のBASICからFuture BASICへの移植を行う場合について



 他のBASICからFuture BASICに移植する際の注意点をあげておきます。特に過去の資産を生かす場合のポイントとなる部分などもあげておきます。


●過去の資産を活かすために最初に検討すること
 現在では市販ソフトレベルで十分に実現可能な場合が多々あります。ですから、プログラムを移植する前に、市販ソフトで実現可能かどうか検討すべきです。
 市販ソフトの中にはBASICも含まれます。移植するものが、どうしてもMacintoshに移植しなければ、ならないものかどうかも検討すべきです。スムーズな移植を行いたいのであれば、Windows上で動作するBASICも検討すべきです。特にN88(86) BASICなどPC-9801で動作していたプログラムを活かしたい場合は、F-BASIC fow Win、N88-BASICや、その他エミュレーターなどがあります。これらを使用すれば比較的簡単に、もしくはプログラムは無修正で動作させる事ができます。


●どうしてもMacintosh上に移植を行う必要がある場合
 都合によりMacintosh上で移植を行わなければならない場合もあります。Macintosh用にはFuture BASICだけでなく、いくつかのBASICが存在します。現在確認されているものとして以下のものがあります。

(1) Future BASIC II日本語版
(2) True BASIC
(3) Chipmunk BASIC
(4) METAL
(5) Cross BASIC
(6) Quick BASIC
(7) SC Basic
(8) BWBASIC
(9) VIP BASIC

 この中でマニュアルが日本語化されているものはFuture BASICだけです。高速に数値演算を行う場合Future BASICでは不利な場合があります。高速な演算を行いたい場合は(2)のTrue BASICを使う方法もありますが、国内では代理店がなくなってしまったため入手は困難な状態です。

 (3)〜(5)は現在はフリーウェアまたはシェアウェアとなっているものです。グラフィックを使わないシンプルなプログラムであればChipmunk BASICを使用する方法もあります。

 グラフィックを高速に表示、簡単に取り扱いたい場合はMETALを使う事も可能です。METALは、まだ開発途中段階のためしばらく様子を見るしかありません。

 (5)のCross BASICは市販化されるそうで、WindowsのVisual BASICライクなインターフェースおよびJavaコードの生成も可能なBASICです。しかし、生成される命令は従来のものとは異なるため移植は困難です。

 (6) Quick BASICはマイクロソフト社が取り扱っていたBASICです。現在でも取り扱っているかどうかについては未確認です。また32ビットアドレッシングモードでは使用できません。バージョンは1.0のままで10年以上見放されています(^^;

 (7)〜(9)については詳しく知りません。


●Future BASICに移植をしなければならない場合
 Future BASICに移植をしなければ、ならない場合のために各種BASIC移植対応表を用意してあります。表の見方ですが、

 ●:互換性があり手直しの必要はほとんどない
 ▲:同類の命令があるが、命令が異なる
無印:移植が難しい命令、または不可能な命令

 となっています。
 以下に移植についての注意事項をあげておきます。参考にして下さい。


●変数の型について
 一般のBASICでは変数は「単精度」扱いとなっています。これに対しFuture BASICでは「整数型」となっています。そのため、小数演算を行った場合に全く結果が異なってしまいます。対策はプレファレンスの設定で「初期設定の変数タイプ」を整数から単精度にします。


●配列の添字の下限について
 一般のBASICでは配列の添字の下限は0となっています。この配列の添字の下限を1に設定できるBASICもいくつかあります。配列の添字の下限を設定する命令は「OPTION BASE」命令です。しかし、この命令はFuture BASICには存在しません。
 配列の添字を1から始めるにはプレファレンスで「配列要素を1から始める」部分のチェックマークを入れます。


●ラベルについて
 GOTO, GOSUB命令で行番号ではなくラベルを指定できるBASICがあります。先頭が*で始まるもの、LABEL命令で始まるものなど数種類あります。Future BASICでのラベルは"〜"のようにダブルクオーテーションで囲むことになっています。従ってラベルの部分は全てダブルクオーテーションで囲めば大丈夫です。


●READ, DATA文のサイズ
 滅多な事では発生しませんが、DATA文で記述してあるデータサイズが巨大(30KB程)である場合、Future BASIC上でコンパイルエラーが発生する事があります。これはセグメントサイズ(32KB)を超えてしまうために発生するものです。解決方法としてはデータ文の末尾にSEGMENT文を挿入します。
 データ文の位置によっては、動作しない場合もあります。


●同時にオープンできるファイル数
 同時に複数のファイルを操作する場合があります。この場合、Future BASICでは2つ以上のファイルをオープンできません。これはデフォルトの状態で同時に開くことが出来るファイル数が2に設定されているためです。プレファレンスで、この部分の数値を大きくしておくことで解決できます。


●演算誤差
 一般のBASICでの浮動小数演算は2進数レベルで行われます(IEEE準拠しているものもあれば、準拠していないものもある)。しかしFuture BASICはBCD演算という誤差の少ない方法で処理を行っています。このため、浮動小数演算を多用しているものは、結果が異なる場合があります。Future BASIC上では演算誤差は最低限に抑えられています。もし、浮動小数演算を行っているにも、関わらず整数値しか返さない場合は、プレファレンスで「式を整数として最適化」のチェックマークをはずして下さい。


●エラー処理について
 多くのBASICが「インタプリタ」であるのに対しFuture BASICは「コンパイラ」です。そのため「ON ERROR GOTO/GOSUB」で行われるエラー処理が正常に動作しません。Future BASICにもON ERROR GOTOは用意されていますが、主に「ファイルエラー」に関するものだけとなっています。処理するエラーコードも異なるため、エラー処理に関しては、あきらめるしかありません。


●サウンドについて
 サウンドを鳴らす場合、機種によって大きく異なります。以下に対処方法を示します。

・単音のみ(PC-9801など一定の高さの音)
 BEEP文そのままで変更する必要はありません。

・単音のみ(MZ-700など音程を変化させる事ができるもの)
 音程を変化させる事ができる機種は多くあります。これらはBEEP音は、そのままで変更する必要はありません。音程を変化させる部分は「SOUND」命令を使って下さい。

・MML (Music Macro Language)を使用しているもの
 単音のものであればFuture BASIC上で独自の解析関数を作成し処理することが可能です。

・PSG (FM-7/MZ-1500)
 PSG (Programmable Sound Generator)を使用している場合、3重和音または6重和音まで演奏させる事が出来ます。MMLと組み合わせて処理されるためFuture BASICでは独自に関数を用意する必要があります。また、サウンドリソースと併用して処理を行う必要があり、かなり困難です。

・FM音源 (PC-8801mkSR/MZ-2500)
 FM音源(OPN/OPM)を使用しているものは、ほぼ移植不可能です。素直にあきらめましょう。

・Music Track (X1turboZ/X68000)
 音楽等のトラックバッファを確保しMMLで演奏するためFuture BASICへの移植は実質的に不可能な状態です。

・PCM / ADPCM (X68000)
 PCMはサンプリングしたものを出力します。これはMacintosh上での標準的なサウンド出力形態ですので、サウンドデータさえあれば「SOUND リソース名」で手軽に移植できます。


●グラフィックについて
 グラフィック関係の移植も簡単そうですが困難が伴います。以下に注意事項をあげておきます。

・座標系の違い
 一般のBASICと異なりMacintoshのグラフィック座標は「数学座標」です。例えば座標(0,0)から(0,0)に線を表示する場合、以下のようになります。

 *一般のBASICでは点が1ドット表示される
 *Future BASICでは何も表示されない

 このためグラフィックを扱っているプログラムの場合、水平線、垂直線が表示されません。このような場合は、全て座標の変更が必要になります。例えば(0,0)から(319,199)まで線を引く場合

 *一般のBASIC:LINE (0,0)-(319,199)
 *Future BASIC:PLOT 0,0 TO 320,200

 となります。

・命令の違い
 一般のBASICとFuture BASICではグラフィックに関係する命令が異なります。以下のように変更する必要があります。(左側は従来のBASIC、右側がFuture BASIC)

点を表示PSET(x,y)PLOT x,y TO x+1,y+1
点を消去PRESET(x,y)PLOT x,y TO x+1,y+1(あらかじめCOLOR命令で背景色を指定する)
線を描画LINE(x1,y1)-(x2,y2)PLOT x1,y1 TO x2+1,y2+1
円を描画CIRCLE(x,y),rCIRCLE(x,y),r
多角形を描画POLY独自に関数を作成する必要あり(QuickDrawの命令を組み合わせて使用する)
パターン描画PATTERN独自に関数を作成する必要あり(QuickDrawの命令を組み合わせて使用する)
シンボル文字SYMBOLTEXT命令とCALL MOVETO(x,y)とPRINT命令を組み合わせる
塗りつぶし(境界色指定)PAINT独自に関数を作成する必要あり(QuickDrawの命令を組み合わせて使用する)
塗りつぶし(単色指定)PAINT独自に関数を作成する必要あり(QuickDrawの命令を組み合わせて使用する)
画面消去CLSCLS
ボックスLINE(x1,y1)-(x2,y2),BBOX x1,y1 TO x2+1,y2+1
ボックス(フィル)LINE(x1,y1)-(x2,y2),BFBOX FILL x1,y1 TO x2+1,y2+1
グラフィック取り込みGET@USR GETPICT
グラフィック表示PUT@PICTURE
グラフィック画面読み込みGLOAD独自に関数を作成する必要あり
グラフィック画面保存GSAVE独自に関数を作成する必要あり
ビューポート指定VIEWクリッピングリージョンを指定(QuickDrawの命令を組み合わせて使用する)
ウィンドウサイズWINDOWWINDOW命令で指定
画面解像度SCREEN/INIT独自に関数を作成する必要あり
色数指定SCREEN/INIT独自に関数を作成する必要あり(STAZ Softwareのサイトにサンプルあり)
スクロールROLLSCROLL
連続直線LINE/CONNECTPLOT x1,y1 TO x2,y2 TO x3,y3 TO...
パターン描画位置指定POSITION x,yCALL MOVETO(x,y)
点の色を読み出すPOINT(x,y)POINT x,y (ただし、白黒の値しか返さない)
パレットCOLOR=独自に関数を作成する必要あり(QuickDrawの命令を組み合わせて使用する)


●色の違い
 使用できる色自体は問題ではありませんが、「カラーコードの値」が異なるためCOLOR 0など直接数値を指定するものは正常な色指定にはなりません。カラーコードを以下のように定数で置き換える、または変数にする必要があります。
   0(黒色)_zBlack
   1(青色)_zBlue
   2(赤色)_zRed
   3(紫色)_zMagenta
   4(緑色)_zGreen
   5(水色)_zCyan
   6(黄色)_zYellow
   7(白色)_zWhite


●実行速度の違い
 多くの機種は、その機種上での速度で動作する事を期待してプログラムされています。特にゲームなどでは、よく見られます。これらのプログラムを移植するとMacintoshでは速すぎて期待通りに動作しない事があります。特にMacintoshでは機種により動作速度が異なるため以下のような時間待ち処理は無意味となります。

FOR I=0 TO 1000:NEXT

 これは一定時間処理を停止させるためのものです。このような命令は以下のように書き換える必要があります。

DELAY 1000


●乱数の生成値による違い
 乱数を発生させる命令にRND命令があります。しかし、機種によってこの乱数命令が返す値の範囲が定まっていません。おおよそ、以下のような乱数値範囲を返します。

(1) 0〜1未満
(2) 1〜指定値
(3) (1)と(2)の両方を備えたもの

 Future BASICのRND命令は(2)に相当します。N88(86)BASICから移植を行う場合、N88(86)BASICでは以下のような乱数式を使用しています。

A = RND(1) * N

 これをFuture BASICで正しく動作させるためには

A = RND(N*10000)/10000 - 1

 といった具合に式を変形する必要があります。


●ファイル操作の違い
 シーケンシャルファイルアクセスに関してはスムーズな移植が期待できますが、「ランダムファイルモード」では移植が困難になります。Future BASICではランダムファイルモードでファイルを開くことが出来ますが、操作する命令がありません。FIELD, LSET, RSET, GET, PUTは存在しません。これらの処理を行う場合は、一度メモリに読み込んで代用するか、シーケンシャル処理に切り換えるか、あきらめるしかありません。


●表示フォント(書体)の違い
 機種固有の文字を使用しているものがあります。罫線や特殊記号などが該当します。これらを移植するには外字を作成するのが一番速いと思われます。


●RS-232C処理(通信)
 RS-232Cの多くの処理は移植可能です。ただし、RS-232C回線からの割り込みに関しては処理するのは難しくなります。RS-232Cからのデータ入力待ちであればREAD a$;0のように処理することが可能ですが、それ以外の処理の移植はあきらめた方がよいでしょう。


●カセット/フロッピー等外部デバイス関係
 ディスクやカセットに直接データを書き込むプログラムは移植できません。GP-IBなどを操作するようなものも移植はできません。


●ジョイスティック関係
 ジョイスティック関係の命令はFuture BASICにはありません。が、本書のゲーム編で解説しているようなGETKEYを利用する事で実現可能です。ただし、アナログスティックに関しては移植できません。


●ライトペン関係
 移植できません。マウス、タッチパネル、タブレットで代用して下さい。


●PCG (Programmable Character Generator)関係
 MZ-1500/X1などではPCGという、独自の文字形状を指定できる機種があります。これらの移植も困難ですが、あらかじめフォントを作成しておく事により、多少実現可能です。別の方法としてはスモールアイコン(PCGは8*8ドットサイズ)を作成し代用する方法があります。


●スプライト関係
 MSXやX68000などスプライト機能を搭載した機種からの移植は非常に困難です。CD内にSprite Worldというスプライトをソフトで擬似的に処理したサンプルがありますので、参考にしてください。


●BG (Back Ground) /スクリーン関係
 機種によっては複数の画面を合成、切り返して表示できます。これらを移植するには「オフスクリーン」を利用します。オフスクリーンの使用方法、解説については本書「画像処理アプリケーションを作成する」を参考にして下さい。


●カラーパレット関係
 4096色16色など、任意の色を任意の色に割り当てる事ができる機種があります。これらは「パレットマネージャー」を利用することで、ある程度実現が可能になります。MZ-2500などのように、カラーブロックをまとめて切り換えるような場合は、あらかじめpltt,clutリソースを作成しておくと処理が楽になります。これらのリソースについてはCD内収録のリソースエディタの使い方を参照して下さい。


●ファンクションキー関係
 Macintoshには拡張キーボード以外ファンクションキーがありません。拡張キーボードを利用するという前提であればCALL GETKEYを利用することで直接ファンクションキーの入力を知ることができます。ただし、ファンクションキーからの割り込みは受け付けることが出来ません。


●文字画面とグラフィック画面
 ほとんどの機種は「文字画面」と「グラフィック画面」が分離しており、同時合成表示が出来ます。しかしFuture BASICでは、「グラフィック画面」のみでテキスト画面は存在しません。これらを実現するためには、オフスクリーンなどを利用し独自に処理を行う必要があります。


●各BASICの入手先

・Future BASIC II日本語版
 http://www.mode.co.jp/

・VIP BASIC
 http://www.mstay.com/vb20_ab1.html

・True BASIC
 http://www.truebasic.com/

・Mac Standard BASIC
 http://www.zcurve.com/

・Cross BASIC
 http://www.fyisoftware.com/cross.html

・Chipmunk BASIC
 http://www.nicholson.com/rhn/basic/

・BW BASIC
 http://ring.aist.go.jp/ringo-cgi-bin/ftpsel.cgi?fname=%2Farchives%2Fmac%2Finfo-mac%2Fdev%2Fbw-basic-210.hqx&node=ring.aist.go.jp