MSX-BASIC

MSX-BASIC（エムエスエックス ベイシック）は、MSXパソコンにROMで搭載されたマイクロソフト製のBASIC。他のマイクロソフト製BASICと基本的に同じ文法、ユーザーインターフェースを持っていた。 言語の仕様としては、変数名が最初の2文字のみ有効、行番号を抽象化するラベルの概念がなく、GOTO命令等の飛び先にラベルを指定できないなど、他機種に採用されていたマイクロソフト製BASICが拡張されていたのと比べると初期の版に近かった。 一方で、浮動小数点には仮数部は単精度6桁、倍精度14桁のBCDで演算している。他のBASICの処理系の仮数部の基底が2であるのに対して、基底を10とすることで、コンピューター初心者にも分かりやすくなっている。演算サブルーチンは仮想計算機として実装されており、仮想レジスタ相当のワークエリアに引数を書き込み処理を行うルーチンをコールする形になっている。この演算の中核部分はMath-Packとして仕様が公開されており、BASIC以外からも直接呼び出せるようになっている。また、BASICのサブルーチンとして実装されているため、一部関連するBASICの機能とは不可分である。また、浮動小数点演算は精度は高いものの相応にコストが高いため、ゲームなどレスポンスや処理速度を重視するゲームなどの作成では変数を整数として宣言することがTipsとなっていた。 Z80のメモリ空間のうち前半32KBをBIOSとBASICインタプリタのROM、後半32KBにユーザーエリアと、周辺機器の使用するものを含むワークエリアが配置される。MSX2以降の追加機能やディスクドライブを接続した際のDISK-BASICのためのROMは前半32KBのスロットを切り替える形で実装されていたが、そのワークエリアはフリーエリアの末尾に配置される。そのため、機能を拡張するにつれてフリーエリアは削減される。また、後半のユーザーエリアはページが固定であることを前提に使用されるため、BASICのVersionやハードウェアに関わらず、32KiB以上実装された機種やメモリマッパを持っている機種でもBASICのユーザーエリアは増えず、初期状態で配置されるRAM以外はRAMDISK等の拡張機能で使用する形となっている。 システム部分がROMで構成されているため機能の拡張や、変更用のフックがメモリの最後部に配置されているほか、ディスクドライブなどのBIOSがワークエリアとして使用するため、ユーザーが直接メモリに書き込みを行う場合には、事前に使用可能な末尾のアドレスを確認する必要がある。BASIC上で機能の拡張を行う場合、call命令によって初期化、有効化を行う必要がありハードウェアの拡張などの場合BASICからの利用に対応している場合は、同じ手順で制御ルーチンの組み込みと初期化も行う形となっていた。 MSXのBIOSは同時期の実装におけるマシン語モニタなどとは異なり、規格としてハードウェアに対するアクセスの窓口ともなっているため、純正のシステムを離れたプログラムでもシステムコールの形で呼び出される性質のものになっているほか、マシン語モニタとして簡略化されたメモリやバイナリに対する操作は標準の構成として提供していない。スロット、ハードウェア制御以外はBASICの実装に伴うサブルーチンであるが、公開されているエントリに関してはユーザーも呼び出して利用できるのは他の環境のマシン語モニタでのエントリと同様である。 MSX規格に則ったハードウェアの持つスプライト機能、VDP命令の補助によるグラフィックス処理等によって、他の機種では難しかった高速にキャラクタが動き回るリアルタイムゲームをBASICレベルで作成することが簡単だった。また、命令単位では低級言語によるハードウェアの直接制御に肉薄する速度で動作させることが可能だったことも特徴である。ただし、グラフィックス制御に関してはアルゴリズムレベルで最適化するなどしない限り、直接ハードウェアを制御してもそれ以上の速度は望めないということでもあり、VDPの処理速度から必ずしも他の実装に対し高速なわけではない。 MSXの規格にあわせた次のような命令を持っていた。 VPOKE,VPEEK VRAMへの書き込み命令と読み込み関数。MSXではVRAMはVDPが管理し、CPUのアドレス空間とは別になっているため用意された。 VDP 画像コントローラVDPのレジスタをBASICから直接読み書きする関数。 ON ～ GOSUB 割り込み命令。ファンクションキー押下（KEY）、インターバルタイマ（INTERVAL）、スプライト衝突（SPRITE）、プログラム中断操作（STOP）などを検知して特定のサブルーチンをコール。 CALL スロットに接続されたデバイスの拡張命令を呼び出す。周辺機器の持つ拡張BIOSにCALL命令の処理ルーチンが格納されており、BASICプログラムから周辺機器をコントロールすることができた。短縮形はアンダーバー(_)。 例：MSX-DOSから「BASIC」コマンドでDISK-BASICを起動した場合、CALL SYSTEMを実行するとMSX-DOSが起動。 PUT SPRITE スプライトの表示位置・パターン・色を制御。 SPRITE$(n) スプライトのパターンを定義する関数。 本体またはカートリッジスロットにフロッピーディスクドライブが存在する場合、それらの内蔵ROMにより拡張されたDISK-BASICが起動した。物理的にドライブが1台の場合でも、ワークエリアは2台分確保される。CTRLキーを押しながら起動することで1台分に制限され、空きエリアを増やすことができた。また、SHIFTキーを押しながら起動するとフロッピーディスク環境は一切無効化され、従来のROM-BASICの空きエリアを前提としたアプリケーションが実行できた。 MSX-BASICにはMSXの規格と対応するいくつかのバージョンが用意された。ローマ字入力等の一部を除けば、規格の拡張に伴い機能に対応する予約語の追加が主な変更点となる。但し、メモリについては積極的にフリーエリアや、ワークエリアとして使用するような拡張はされず、RAMDISKなど拡張ストレージとしての対応に留まっている。すべてのバージョンで文法に上位互換性があり、大幅なシステムプログラムの更新が行われたturboRを除けばスイッチ、システムの読み込みなどによるモード変更やシステムの変更などを必要とせずにそのまま旧版のソフトウェアが実行可能である。MSX turboRではプロセッサの変更やMSX-DOSの改版に伴い、起動時に「1」キーを押し続けるか、MSX-DOS1またはDISK-BASICのVersion1でフォーマットしたディスクで起動するとDISK-BASICがVersion1でZ80ベースの互換モードで起動し、互換性を維持している。 MSX(1)用。 FDDを含む拡張BASICを使用しない場合、ROM-BASICのワークエリアは約4KBである。ユーザエリアは RAM 32KB以上の機種 28,815バイト RAM 16KBの機種 12,431バイト RAM 8KBの機種（CASIO PV-7） 4,239バイト となっており、標準で32KiB未満の機種では拡張したメモリが直接BASICで使用可能な容量に反映される。 MSX2用。 SCREEN命令やスプライト命令の拡張。 マウスやトラックボール等の入力機器の情報取得。 CMOSメモリによるカレンダ時計機能や設定バックアップ機能が搭載されたことにより、設定変更のためのSET命令を追加。 カレンダ時計の設定（SET TIME、SET DATE）。 カレンダ時計の取得（GET TIME、GET DATE）。 画面表示位置の補正値を設定（SET ADJUST）。 ビープ音の音量や種類を設定（SET BEEP）。 デフォルトの画面設定を保存（SET SCREEN）。 6文字以内の任意の文字列を起動ロゴ画面に表示（SET TITLE）、プロンプトを標準のOkから6文字以内の任意の文字列に変更（SET PROMPT）、起動時の簡易パスワードロック機能を設定（SET PASSWORD）。これらは、CMOSメモリの保存領域が共通のため排他使用となる。 SET VIDEOなどグラフィックに関するSET命令を多数追加。 ROM空間に隠された裏RAM32kバイトを擬似RAMディスクとして使用する命令（CALL MEMINI）。装置名MEM:の追加。 擬似RAMディスクはMSX2+まではRAMディスク、MSXturboRではメモリディスクと呼称。Disk-BASIC ver2.0で実装されたRAMディスクと異なり裏RAMを利用する性質上、インタースロットコールにより間接的にしかアクセスできない関係で転送速度はカセットテープ並に遅かった。 漢字ROM（オプション）の内容を出力するPUT KANJIを追加。 かな文字のローマ字入力モードを追加。かなキーをShiftキーを押しながらONにすることにより、ローマ字入力が可能になる。 V9938のVDPコマンドを利用したCOPY命令。 配列の形で確保したメインメモリと画面の矩形との間での転送と、画像をメインメモリを経由することなく矩形でコピーが可能。論理演算や透明色を適用でき、非常に容易にグラフィックを取り扱うことが可能となった。 MSX2は全機種がRAM 64KiB以上であるため、ROM-BASICのユーザエリアは28,815バイトである。2.xで拡張された命令は1.xで未使用だったワークエリアで動作する。 MSX2+用。 SCREEN命令（10～12）のモード追加。 SET SCROLLを追加。MSX2ではVDPで縦スクロールはあるものの、VDP命令から直接指示しなければならなかったが、この命令で直接、BASIC上から縦横スクロールが出来るようになった。 平仮名などのフォントを変更し、SCREEN 0の横6ドット表示でも識別できるようになった。 漢字BASICを標準搭載。（連文節変換機能のMSX-JEは規格上はオプション。非搭載の機種では単漢字変換となる。）ただし、漢字フォントのスタイルは本体メーカーによって違う。 ファンクションキーのF7の登録命令が「cload"」から「load"」に変更。 MSX2+は全機種がRAM 64KiB以上であるため、ROM-BASICのユーザエリアは28,815バイトである。3.xで拡張された命令は1.x, 2.xで未使用だったワークエリアで動作する。 MSXturboR用。 R800の高速モードに対応。 PCM機能などの命令を追加。 MSX-DOS2内蔵によりDISK-BASICがVersion2になり、カレントディレクトリを変更するCALL CHDIR命令やメモリマッパをRAMディスクとして使用するCALL RAMDISK命令などが追加。互換Z80モードではVersion1で起動。 カセットテープI/Oに関する命令（CSAVE/CLOAD/CLOAD?/MOTOR）および装置名CAS:が削除され、実行するとエラーとなる。 CSAVE/CLOAD/CLOAD?/MOTORはSyntax errorとなり、CAS:はBad file nameとなる。Device I/O errorとはならない 対応するBIOSのエントリは残っているものの、コールしても何もせず正常終了かエラーを返すだけになっている これまでのBASICインタプリタはPLAY文が終了する時に1カウント分余計な空白が入るバグがあり、MIDIインターフェイスが本体へ搭載される際に解消された。 MSX-BASICには「MSXべーしっ君」という名称でMSX独自の機能を活用できるコンパイラも存在した。 アスキーに所属していたプログラマ・鈴木仁志が開発した。初版は雑誌に発表、1986年にアスキーからROMカートリッジで発売された。製品名は当時ログイン誌で連載していた4コママンガのタイトルから取られており、ソフトのパッケージにも主人公・べーしっ君のイラストが描かれ、一見するとゲームソフトを思わせる体裁だった。付属のフロッピーディスクにはサンプルのマンデルブロ集合の描画やワイヤーフレームの3D迷路自動作成のプログラムが収められていた。 MSX2+が発表されると新機能に対応した「べーしっ君ぷらす」が発売されたほか、サンヨーのMSX2+であるWAVY77シリーズに同等のものが内蔵された。また、MSXturboRが発表されるとソフトベンダーTAKERUからディスク版で「べーしっ君たーぼ」が発売された。 なお、MSX-BASICのコンパイラは、べーしっ君以外にも、ソフトウエスト、ハート電子産業がそれぞれ開発・発売していたものが存在する。 オンメモリのコンパイラで、拡張BASICとして実装されている。ROM媒体や本体内蔵のバージョンではROMカートリッジや本体内のスロットに、ディスク媒体のバージョンではメインRAMの未使用領域（裏RAM）に格納されて動作する。 既存のBASICプログラムに対し少し手直しするだけで高速化できるというコンセプトで設計されている。 一般的なコンパイラと違い、中間コードや機械語オブジェクトをファイルとしては生成せず、プログラム実行の都度コンパイルを行い、オンメモリで機械語オブジェクトを生成して実行する仕様となっている。このため、MSX-BASICのプログラムソースそのものがMSXべーしっ君のソースとなり、一般のBASICプログラムと同等に管理できるため、BASICの扱いの簡便さと機械語の高速さを併せ持った開発環境となっている。 実行速度は最大で10倍程度に高速化される。 ただし、MSX-BASICの完全互換ではなく、ディスク入出力など未サポートの命令が一部あるため、プログラム全体をコンパイルするか一部分のみをコンパイルするかを選択できるようになっている。 RUN の代わりに拡張命令 CALL RUN により実行開始した場合、プログラム全体の機械語オブジェクトを生成し実行する。 一部分のみをコンパイルする場合は、BASICプログラム内に拡張命令（CALL TURBO ON、CALL TURBO OFF）を用い、高速化したい部分の前後にこの拡張命令を記述する。実行時にその拡張命令に処理が移ると、ワークエリアにコンパイル対象の部分の機械語オブジェクトが一時的に生成されて実行される仕組みとなっている。コンパイル対象外の箇所はそのままBASICインタプリタで動作するため、MSXべーしっ君非対応の命令がプログラムソース中に同居できる。 浮動小数点数は、MSX-BASICがBCDで実装しているのに対して効率化を理由に3バイトの2進数という独自方式で実装しているため、非コンパイル部分と受け渡しすることはできない。