MSX-BASIC
MSX-BASIC(エムエスエックス ベイシック)は、MSXパソコンにROMで搭載されたマイクロソフト製のBASIC。他のマイクロソフト製BASICと基本的に同じ文法、ユーザーインターフェースを持っていた。
概要
変数名が最初の2文字のみ有効、行番号を抽象化するラベルの概念がないため、GOTO
命令等にラベルを指定できないなど、拡張された他機種のBASICと比べると原型に近かった。
浮動小数点にはBCD(仮数部は6桁または14桁)を使用していた。
Z80のメモリ空間のうち前半32KBをBIOSとBASICインタプリタのROM、後半32KBにユーザーエリアと、周辺機器の使用するものを含むワークエリアが配置される。MSX2以降の追加機能やディスクドライブを接続した際のDISK-BASICのためのROMは前半32KBのスロットを切り替える形で実装されていたが、そのワークエリアはフリーエリア最後尾から削って使用されるようになっている。また、後半のユーザーエリアはページが固定であることを前提に使用されるため、そのVersionやハードウェアに関わらず、32KiB以上実装された機種やメモリマッパを持っている機種であってもBASICのユーザーエリアは増えず、初期状態で配置されるRAM以外はRAMDISK等の拡張機能で使用する形となっている。
システム部分がROMで構成されているため機能の拡張や、変更用のフックがメモリの最後部に配置されているほか、ディスクドライブなどのBIOSがワークエリアとして使用するため、ユーザーが直接メモリに書き込みを行う場合には、事前に使用可能な末尾のアドレスをきちんと確認する必要がある。BASICからの利用を前提としたハードウェアでは、カートリッジ内に制御BIOSと、拡張BASICを持っており、使用前にcall命令によって、初期化を行うことで拡張される。
MSXのBIOSは通常のパソコンのBIOSとは意味合いが異なり、ハードウェアを隠蔽するために起動時だけでなくハードウェアドライバやシステムコールとして常に使われる性質が強い。MSX-BASICの内部処理もほとんどの場合BIOSを経由して処理が行われ、BIOSの中にはBASICインタプリタのための機能もいくつか存在している。前述のBASIC上で行われるBCD浮動小数点演算もMATHPACKと呼ばれるサブルーチンライブラリとしてBASIC内で実装されており、機械語ベースのユーザープログラムやMSX-DOSアプリケーションからの使用も可能になっていた。
また、そのハードウェアの持つ、スプライト機能、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が起動。
- 例:MSX-DOSから「
PUT SPRITE
- スプライトの表示位置・パターン・色を制御。
SPRITE$(n)
- スプライトのパターンを定義する関数。
DISK-BASIC
本体またはカートリッジスロットにフロッピーディスクドライブが存在する場合、それらの内蔵ROMにより拡張されたDISK-BASICが起動した。物理的にドライブが1台の場合でも、ワークエリアは2台分確保される。CTRLキーを押しながら起動することで1台分に制限され、空きエリアを増やすことができた。また、SHIFTキーを押しながら起動するとフロッピーディスク環境は一切無効化され、従来のROM-BASICの空きエリアを前提としたアプリケーションが実行できた。
バージョン
MSX-BASICにはMSXの規格と対応してさまざまなバージョンがあった。すべてのバージョンで文法に上位互換性があり、スイッチによるモード切替などは必要としなかった。MSX turboRでは起動時に「1」キーを押し続けるか、MSX-DOS1またはDISK-BASICのVersion1でフォーマットしたディスクで起動すると、旧来のZ80モードとなりDISK-BASICがVersion1で起動した。
Version1.x
MSX(1)用。
Version2.x
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ディスク[1]として使用する命令(
CALL MEMINI
)。装置名MEM:
の追加。 - 漢字ROM(オプション)の内容を出力する
PUT KANJI
を追加。 - かな文字のローマ字入力モードを追加。かなキーをShiftキーを押しながらONにすることにより、ローマ字入力が可能になる。
- V9938のVDPコマンドを利用した
COPY
命令。- 配列の形で確保したメインメモリと画面の矩形との間での転送と、画像をメインメモリを経由することなく矩形でコピーが可能。論理演算や透明色を適用でき、非常に容易にグラフィックを取り扱うことが可能となった。
Version3.x
MSX2+用。
SCREEN
命令(10~12)のモード追加。SET SCROLL
を追加。MSX2ではVDPで縦スクロールはあるものの、VDP命令から直接指示しなければならなかったが、この命令で直接、BASIC上から縦横スクロールが出来るようになった。- 平仮名などのフォントを変更し、
SCREEN 0
の横6ドット表示でも識別できるようになった。 - 漢字BASICを標準搭載。(連文節変換機能のMSX-JEは規格上はオプション。非搭載の機種では単漢字変換となる。)ただし、漢字フォントのスタイルは本体メーカーによって違う。
- ファンクションキーのF7の登録命令が「
cload"
」から「load"
」に変更。
Version4.x
- 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コンパイラ
MSX-BASICには「MSXべーしっ君」という名称でMSX独自の機能を活用できるコンパイラも存在した。
アスキーに所属していたプログラマ・鈴木仁志が開発した[2]。初版は雑誌に発表、1986年にアスキーからROMカートリッジで発売された。製品名は当時ログイン誌で連載していた4コママンガのタイトルから取られており、ソフトのパッケージにも主人公・べーしっ君のイラストが描かれ、一見するとゲームソフトのようだった。付属のフロッピーディスクにはサンプルのマンデルブロ集合の描画やワイヤーフレームの3D迷路自動作成のプログラムが収められていた。
MSX2+が発表されると新機能に対応した「べーしっ君ぷらす」が発売されたほか、サンヨーのMSX2+であるWAVY77シリーズに同等のものが内蔵された。また、MSXturboRが発表されるとソフトベンダーTAKERUからディスク版で「べーしっ君たーぼ」が発売された。
なお、MSX-BASICのコンパイラは、べーしっ君以外にも、ソフトウエスト、ハート電子産業、ソフトウエストがそれぞれ開発・発売していたものが存在する。
仕様
オンメモリのコンパイラで、拡張BASICとして実装されている。ROM媒体や本体内蔵のバージョンではROMカートリッジや本体内のスロットに、ディスク媒体のバージョンではメインRAMの未使用領域(裏RAM)に格納されて動作する。
既存のBASICプログラムを、少しの手直しをするだけで高速化できるというコンセプトで設計されている。 一般的なコンパイラと違い、中間コードや機械語オブジェクトをファイルとしては生成せず、実行のたびにその都度機械語オブジェクトを生成する仕様となっている。このため、MSXべーしっ君で書かれたプログラムはMSX-BASICのプログラムソースそのものであり、一般のBASICプログラムと同等に管理できるため、BASICの扱いの簡便さと機械語の高速さを併せ持った開発環境となっている。
実行速度は最大で10倍程度も高速化される。
MSX-BASICの完全互換ではなく、ディスク入出力など未サポートの命令が一部あるため、プログラム全体をコンパイルするか一部分のみをコンパイルするかを選択できるようになっている。
RUN
の代わりに拡張命令 CALL RUN
により実行開始した場合、プログラム全体の機械語オブジェクトを生成し実行する。
一部分のみをコンパイルする場合は、BASICプログラム内に拡張命令(CALL TURBO ON
、CALL TURBO OFF
)を組み込む。実行時にその拡張命令に処理が移ると、ワークエリアにその範囲の機械語オブジェクトが一時的に生成されて実行される仕組みとなっている。範囲外の箇所はそのままBASICで動作するため、MSXべーしっ君非対応の命令がプログラムソース中に同居できる。
浮動小数点は単精度型のみサポートしており、MSX-BASICがBCDで実装しているのに対して効率化を理由に3バイトの2進数という独自方式で実装している[3]ため、実数型変数の内容を非コンパイル部分と受け渡しすることはできない。
脚注
- ^ MSX2+まではRAMディスク、MSXturboRではメモリディスクと呼称。Disk-BASIC ver2.0で実装されたRAMディスクと異なり、裏RAMを利用する性質上、インタースロットコールにより間接的にしかアクセスできない関係で転送速度はカセットテープ並に遅かった。
- ^ 「超速コンパイラMSXべーしっ君たーぼとR800の秘密! 岸岡和也×鈴木仁志」『MSX MAGAZINE 永久保存版 2』アスキー書籍編集部編著、アスキー、2003年。p.68。
- ^ MSXマガジン永久保存版2 「超速コンパイラMSXべーしっ君たーぼとR800の秘密!」P.70