MSX-
BASICは、
MSX規格のパーソナルコンピュータに標準で搭載されていた、
マイクロソフトが開発した
BASIC言語処理系です。ROMに内蔵されているため、電源を入れるとすぐに利用開始できる点が特徴でした。基本的な文法や操作感は、同時期に広く使われていた他の
マイクロソフト製
BASICと共通しています。
特徴と仕様
言語仕様の点では、他の機種向けに機能拡張が進んでいた
マイクロソフト製
BASICと比較すると、初期バージョンに近い特徴を持っていました。例えば、変数名は先頭の2文字のみが有効とされたり、行番号を抽象化するラベル機能がなく、GOTO命令などでラベルを指定できなかったりする制約がありました。
一方で、浮動小数点演算には独特な実装が採用されています。仮数部を単精度で6桁、倍精度で14桁を持つBCD(2進化10進数)で処理しており、これは他の
BASIC処理系が仮数部に基底2(2進数)を用いるのと異なります。基底を10とすることで、コンピューターの扱いに慣れていない初心者にも計算結果が分かりやすいという利点がありました。この演算処理の中核部分は「Math-Pack」として仕様が公開されており、
BASIC以外からも直接呼び出すことが可能でした。ただし、
BASICの内部
サブルーチンとして実装されているため、関連する
BASIC機能と密接に連携しています。BCD演算は高い精度を誇りますが、その反面処理コストが高めでした。そのため、応答速度や処理速度が重要となるゲームなどを作成する際には、変数を整数型として宣言することが効率化のための常套手段とされていました。
MSXのメモリ空間において、前半の32KBにはBIOSと
BASICインタプリタのROMが配置され、後半の32KBがユーザープログラム領域や周辺機器が使用するワークエリアに割り当てられていました。
MSX2以降で追加された機能や、ディスクドライブ接続時に使用されるDISK-
BASIC用のROMは、前半32KBのスロット切り替えにより実装されますが、これらのワークエリアはユーザー領域の末尾に配置される構造でした。結果として、システム機能が拡張されるにつれて、ユーザーが自由に使えるメモリ領域(フリーエリア)は減少していく傾向にありました。また、後半のユーザー領域は常に固定のアドレスで使用されることが前提となっており、たとえ32KB以上のRAMを搭載したり、メモリマッパを備えたりする機種であっても、
BASICから直接使えるユーザー領域は初期の32KBに配置されるRAM部分に限定され、それ以外の拡張メモリは
RAMディスクなどの特定の機能として利用される形でした。
システムがROM主体で構成されているため、機能拡張やシステム変更のためのフックはメモリ空間の最後尾に設けられていました。また、ディスクドライブなどのBIOSもワークエリアを確保するため、ユーザーが直接メモリを操作するプログラムを作成する際は、事前に使用可能なメモリ領域の終端アドレスを確認する必要がありました。
BASICから外部の機能やハードウェア拡張を利用する場合、`CALL`命令を使ってそれらの
ルーチンを初期化・有効化するという手順が一般的でした。
MSX BIOSとの連携
MSXのBIOSは、単なるマシン語モニタとは異なり、ハードウェアへのアクセス窓口としての規格化された側面を持っていました。そのため、
BASICから離れたマシン語プログラムからでも、システムコールの形で呼び出される性質を持っていました。標準構成では、他の環境にあるようなメモリやバイナリを直接操作する簡略化されたマシン語モニタ機能は提供されていませんでしたが、BIOSや
BASICの実装に伴う公開されている
サブルーチンは、ユーザープログラムからも`CALL`命令などを通じて利用することが可能でした。
ハードウェア活用と拡張命令
MSX-
BASICは、
MSX規格が持つスプライト機能やVDP(Video Display Processor)命令を活用するための独自の拡張命令を備えていました。これにより、他の機種では困難だった、キャラクターが画面上で高速に滑らかに動き回るようなリアルタイムゲームを
BASICレベルで比較的容易に開発できました。命令によっては、低水準言語によるハードウェア直接制御に近い速度で動作させることも可能でした。ただし、グラフィックス処理においては、アルゴリズムレベルでの最適化を行わない限り、ハードウェアを直接操作しても速度向上に限界がある場合もあり、VDPの処理速度によっては必ずしも他の実装に比べて高速とは限りませんでした。
主な拡張命令には以下のようなものがあります。
`VPOKE`, `VPEEK`:
VRAM(ビデオRAM)へのデータの書き込みと読み出しを行う命令および関数。
MSXでは
VRAMがCPUのアドレス空間とは別に管理されていたために必須でした。
`VDP`: VDPレジスタの値を
BASICから直接読み書きするための関数。
`ON ~ GOSUB`:
ファンクションキー、タイマ割り込み、スプライト衝突、プログラム中断など、特定のイベント発生時に指定した
サブルーチンへ処理を分岐させる割り込み命令です。
`CALL`: カートリッジスロット等に接続された周辺機器の拡張BIOSや組み込み
ルーチンを呼び出す命令です。`_`という短縮形も使えました。例として、DISK-
BASICから`CALL SYSTEM`を実行すると
MSX-DOSに戻るといった用途がありました。
`PUT SPRITE`: スプライトの画面上での位置、表示パターン、色などを制御します。
`SPRITE$(n)`: スプライトのパターンデータを定義するための関数です。
フロッピーディスクドライブ(FDD)を接続している環境では、FDD側の内蔵ROMによって拡張されたDISK-
BASICが起動しました。物理的にドライブが1台でも、内部的には2台分のワークエリアを確保する仕様でしたが、起動時に`CTRL`キーを押すことで1台分に制限し、ユーザーが使える空きメモリを増やすことができました。また、`SHIFT`キーを押しながら起動すると、FDD環境を完全に無効化し、従来のROM-
BASIC環境での空きメモリ量を前提としたプログラムを実行することが可能でした。
バージョン展開
MSX-
BASICは、
MSX規格の発展に合わせていくつかのバージョンが存在します。
ローマ字入力など一部機能を除けば、主な変更点は規格拡張に対応した新しい予約語の追加でした。ただし、メモリ構造については、ユーザーが自由に使える領域を積極的に増やすような拡張は行われず、
RAMディスクなど拡張ストレージとしての対応に留まっています。
MSX turboRを除き、すべてのバージョンで文法に上位互換性があり、特別なモード変更やシステムの切り替えなしに旧バージョンのソフトウェアをそのまま実行できる互換性の高さも特徴です。
MSX turboRに搭載されたVersion 4.xでは、新しいプロセッサ
R800への対応やPCM機能が追加される一方、カセットテープ関連の命令は削除されました。互換性を維持するため、起動時に特定のキーを押したり、Version 1のDISK-
BASICでフォーマットされたディスクを使用したりすることで、
Z80ベースの互換モード(Version 1相当のDISK-
BASIC)で起動する仕組みも用意されていました。
Version 1.x:
[MSX]用。32KB以上のRAM搭載機でのユーザー領域は約28KB。
Version 2.x:
MSX2用。SCREENモードやスプライト機能の拡張、マウス対応、
CMOSメモリを利用したカレンダー時計や設定機能(SET/GET命令)、裏RAMを擬似
RAMディスクとして利用する`CALL MEMINI`、漢字ROM出力(オプション)、
ローマ字入力、VDPコマンド利用(COPY命令)などが追加されました。
MSX2以降は全機種が64KB以上のRAMを搭載していたため、ROM-
BASICのユーザー領域は約28KBで固定されました。
Version 3.x:
MSX2+用。SCREENモードの追加(10-12)、縦横スクロール命令(SET SCROLL)、改良されたフォント、漢字
BASICの標準搭載(ただし漢字変換システムはメーカー依存、漢字ROMはオプション)などが特徴です。ユーザー領域のサイズはVersion 2.xと同様です。
Version 4.x:
MSXturboR用。
R800高速モード、PCM機能に対応。内蔵
MSX-DOS2に連携したDISK-
BASIC Version 2では、カレントディレクトリ変更やメモリマッパを
RAMディスク化する命令などが追加されました。
MSX-
BASIC向けには、
MSX独自の機能を活用できる
コンパイラも存在しました。代表的なものが、アスキーから発売された「
MSXべーしっ君」シリーズです。これは、
プログラマの鈴木仁志氏が開発したもので、ROMカートリッジやディスク媒体で提供されました。
「べーしっ君」は、既存の
MSX-
BASICプログラムに少し手を加えるだけで高速化できることをコンセプトに設計されています。一般的な
コンパイラとは異なり、コンパイルされた中間コードや実行可能な機械語ファイルを生成するのではなく、プログラム実行時にその場でコンパイルを行い、生成した機械語コードをメモリ上で直接実行するオンメモリコンパイル方式を採用していました。このため、
MSX-
BASICのソースコードそのものが「べーしっ君」のソースコードとなり、
BASICの扱いの容易さと機械語による高速実行という利点を兼ね備えた開発環境でした。
実行速度は最大で10倍程度に高速化されることがありましたが、
MSX-
BASICのすべての命令を完全にサポートしているわけではありませんでした。特にディスク入出力など、一部未サポートの命令が存在したため、プログラム全体をコンパイルするか、高速化したい特定の部分のみをコンパイルするかを選択できるようになっていました。プログラム全体をコンパイルする場合は、`RUN`命令の代わりに拡張命令である`CALL RUN`を使用しました。プログラムの一部のみをコンパイルする場合は、高速化したい部分の前後に`CALL TURBO ON`と`CALL TURBO OFF`という拡張命令を記述しました。実行時にこれらの命令に達すると、指定された範囲のコードがワークエリアに一時的にコンパイルされ実行される仕組みです。コンパイル対象外の部分は引き続き
BASICインタプリタで実行されるため、未サポート命令を含むプログラムでも、「べーしっ君」の機能を部分的に利用することが可能でした。
ただし、「べーしっ君」の浮動小数点演算は、効率化のために
MSX-
BASICが採用するBCD方式とは異なる独自の3バイト2進数方式で実装されていました。このため、コンパイルされた部分と
BASICインタプリタで実行される部分との間で浮動小数点数の値を直接受け渡しすることはできませんでした。
「べーしっ君」は、
MSX2+対応の「べーしっ君ぷらす」、
MSXturboR対応の「べーしっ君たーぼ」とバージョンアップを重ね、サンヨーの
MSX2+には同等機能が内蔵された機種も存在しました。アスキー以外にも、ソフトウエストやハート電子産業といったメーカーからも
MSX-
BASICコンパイラが発売されていました。