MBASIC (エムベーシック)は、CP/M 向けのMicrosoft BASIC である。MBASICは、マイクロソフト の最初の製品であるAltair BASIC インタプリタの子孫である。MBASICは、Osborne 1 に同梱されていた2つのバージョンのBASICのうちの1つである。「MBASIC」という名前は、BASICインタプリタのディスクファイル名 MBASIC.COM に由来する。
動作環境
MBasic 5.21をZ80上のCP/Mシステム上で動作させ、当時としては典型的なモノクロモニタに表示させたもの。
MBASIC バージョン5では、最低28 kB のRAM と最低1台のディスクドライブを備えたCP/Mシステムが必要だった。
ホームコンピュータ メーカーがそのコンピュータ固有のハードウェア機能を使用するためにカスタマイズしたMicrosoft BASIC-80とは異なり、MBASICは全ての入出力をCP/Mのシステムコール のみに依存していた。使用可能なのはCP/Mのコンソール(スクリーンとキーボード)、ラインプリンタ、ディスクデバイスのみだった。
カスタマイズされていない状態のMBASICには、グラフィックス 、カラー、ジョイスティック、マウス、シリアル通信 、ネットワーク 、サウンド、リアルタイムクロックなどの機能はなかった。MBASICはホストのCP/Mの機能に完全には対応していなかった。例えば、フロッピーディスク上のファイルを整理するためのCP/Mのユーザ領域に対応していなかった。CP/Mシステムは一般的にシングルユーザでスタンドアローンであったため、ファイルやレコードのロックや、いかなる形態のマルチタスク にも対応していなかった。これらの制限を除けば、MBASICは、当時、BASICの強力で有用な実装であると考えられていた。
機能
言語システム
MBASICはインタプリタ である。プログラムのソースはトークン化 された形でメモリに格納され、BASICのキーワードを1バイトのトークンに置き換えることで、メモリ容量を節約し、実行を高速化した。行番号 を先頭に書いた行はプログラムテキストとして保存され、行番号を先頭に書かないBASIC文はコマンドとして直ちに実行される。プログラムは編集のために画面に表示したり、圧縮されたバイナリ形式またはプレーンなASCIIテキストとしてディスクに保存したりすることができた。ソースの各行は行番号で識別され、GOTO やGOSUB の転送先として使用することができる。ソースの編集には行編集コマンドのみが提供されていた[ 1] 。プログラムをプレーンテキストとして保存し、フル機能のテキストエディタ で編集することがしばしば行われた。
プログラムテキスト、変数、ディスクバッファ、そしてオペレーティングシステム(CP/M)自体も、全てIntel 8080 プロセッサの64キロバイトのアドレス空間を共有しなければならなかった。通常、MBASICを最初に起動したときには、64キロバイトのRAMを搭載したマシンであっても、プログラムやデータに使用できるメモリは32キロバイト以下になる。 REM
キーワードやアポストロフィ を先頭にしたコメント 行をプログラムのテキストに配置することがはできたが、貴重なメモリスペースを占有してしまうため、ユーザがコメントをあまり残さないようになった。より大きく複雑なプログラムを実行できるようにするために、MBASICの後のバージョンでは、プログラムテキストの一部を読み込んでプログラム制御下で実行できるようにする関数が追加された( CHAIN
(英語版 ) や MERGE
文)。"shell"コマンドの実行には対応していなかったが、この機能はプログラマによって複製することができた。
MBASICの特に優れた点は、シンタックスエラーやランタイムエラーのようなエラーメッセージが全文表示されることだった。MBASICには、実行時に行番号を表示する"trace"機能もあった。これは通常のプログラム出力と同じ画面スペースを占有するが、無限ループ のような状態を検出するのに役立った。
ファイルと入出力
データは、シーケンシャルファイル(CP/Mの規約により、各行の最後がCRLFで区切られている)として、または固定レコード長のランダムアクセスファイルとして、ディスクへの読み取り・保存ができ、十分な能力を持ったプログラマであれば、データベースタイプのレコード操作に使用することができる。
浮動小数点数 のためのMicrosoft Binary Format (英語版 ) は、その実装がプロプライエタリ なものであった。すなわち、浮動小数点数のデータを他のプログラムとの間で交換する場合は、ASCIIテキスト表現を使用するか、バイナリフォーマットを変換するための大規模なプログラミングが必要であった。
変数とデータ型
MBASICには以下のデータ型があった。
8ビット 文字列データ。文字列長は0から255文字。
16ビット 整数
32ビット 浮動小数点数 (単精度 )
64ビット 浮動小数点数(倍精度 )
文字列演算子には、部分文字列の選択、連結、代入、文字列が等しいかどうかのテストなどがある。
上記のデータ型の配列 は7次元まで使用できる。関数や演算子は配列では動作しない。例えば、配列の代入はできない。当時の他のBASICの実装とは異なり、MBASICは行列 演算、複素数 、金融計算用の十進数(BCD) データ型に対応していない。典型的なCP/Mシステムには浮動小数点演算ハードウェア がなかったため、浮動小数点演算は全てソフトウェアで行われた。内蔵の数学関数(三角関数 、対数 、指数 、平方根 )は単精度の結果しか得られなかった。ソフトウェアによる疑似乱数発生器 が提供されていた。これは、ユーザが入力したシード値から、ゲームやシミュレーションに有用な数列を得るものである。MBASICには代入文のための LET
キーワードがあったが、なくても代入できた。
マイクロコンピュータにおけるのBASICの初期のバージョンでは、1文字または2文字の変数名しか使用できず、複雑なプログラムでは変数の意味を思い出すのが困難となった。MBASICバージョン5では、40文字までの識別子を使用できるようになり、プログラマは変数に読みやすい名前を付けることができるようになった。
制御構造
MBASICの制御構造 には、条件判定の IF...THEN...ELSE...
、 WHILE...WEND
ループ、 GOTO
、 GOSUB
があった。 CASE
はなかったが、 ON...GOTO...
による多方向分岐があった。サブルーチン には引数がなく、全ての変数はグローバル変数だった。MBASICは構造化プログラミング を必須としていなかったので、容易にスパゲッティコード となってしまった。
PEEK、POKE、ユーザ関数
1970年代後半から1980年代前半の8ビットコンピュータのBASICについての議論は、メモリへの直接読み書きのためのPEEKとPOKE の重要性への言及が不可欠である。これらのシステムには通常、メモリ保護 機能がなかったため、プログラマはOSの一部の通常の方法では利用できない機能にアクセスすることができた。これにより、ユーザプログラムによってシステムがハングアップする可能性も高くなった。例えば、CP/Mプログラマは、(システムBIOSが対応していれば)BASIC がコンソールデバイスをシリアルポートに切り替えるために POKE
関数を使用した。リアルタイムクロック を持つマシンでは、時刻を取得するためにPEEK
命令を使用していた。
より複雑な操作のために、MBASICはBASICプログラムから呼び出すことができるユーザ定義の関数を仕様できるようにした。これは通常メモリの予約領域に配置されたり、一連の機械語 コード(オペコード)として文字列定数にPOKEされたりする。また、MBASICには、8080のハードウェア入出力ポートに直接読み書きするINP
命令とOUT
命令もある。少なくともOsborne 1 では、全てのI/O命令はシステムで使用するためにプリエンプション されていたが、この命令は周辺機器を制御するために使用することができる。
PEEK
やPOKE
、機械語のユーザ関数を利用したMBASICプログラムは、そのままでは異なる機種間の移植性がなかった。
MBASICの後継
CP/M用のMicrosof BASIC-80の他に、ISIS-II (英語版 ) 用のMBASICもあった。
MSX-BASIC もまたMBASICの後継として知られており、MSX に特化したいくつかの拡張機能を備えている。
CP/M用MBASIC の全ての機能は、IBM PC のBASICA やGW-BASIC (英語版 ) で利用可能であり、CP/MシステムからIBM PC互換機 へのプログラムの移行が可能だった。キーワードを表すために使用されるトークンが異なるため、移植のためにはCP/MプログラムはASCIIソース形式で保存されなければならなかった。
BASCOM
マイクロソフトは、MBASICと同様のソース言語を使用するCP/M BASICコンパイラ ・BASCOM を販売した。MBASICでデバッグ されたプログラムはBASCOMでコンパイルすることができた。プログラムのテキストがメモリに残らず、コンパイラのランタイム要素がインタプリタよりも小さかったため、ユーザデータに使用できるメモリが増えた。また、実際のプログラム実行速度は約3倍に向上した。
開発者たちは、人気はあったが遅くてぎこちないCBASIC (英語版 ) の代替としてBASCOMを歓迎した。CBASICとは異なり、BASCOMはMBASICソースコードのためのプリプロセッサ を必要としなかったので、対話的にデバッグすることができた[ 2] 。ただし、マイクロソフトは、BASCOMでコンパイルしたプログラムのコピーを1つ配布するごとに9%のロイヤルティー を要求し[ 3] 、ハードウェアとソフトウェアの組み合わせには40ドルを要求した。また、マイクロソフトは開発者の財務記録を監査する権利を持っていた。ソフトウェアの著作者のロイヤルティー率は一般的には10-25%だったので、『インフォワールド (英語版 ) 』誌は1980年に、BASCOMを使用することによる9%のロイヤルティーの上乗せは「ソフトウェア開発を収益性の低いものにする可能性がある」と述べ、「マイクロソフトには(CBASICに対抗する)技術的な解決策はあるが、経済的な解決策はない」と結論づけた[ 2] 。
MBASICの重要性
MBASICは8ビットのCP/Mコンピュータの時代には重要なツールだった。熟練したユーザは、現代のシステムならば強力なアプリケーションプログラムのコマンドやスクリプト言語によって実行されるであろうタスクを自動化するために、MBASICでルーチンを書くことができた。便利なMBASICプログラムの交換は、コンピュータのユーザーグループ の機能の1つだった。雑誌の記事に掲載された長いBASICのプログラムリストをキー入力することは、新しいCP/Mシステムにソフトウェアを「ブートストラップ」(インストール)"する一つの方法だった。大規模な高レベル言語用のコンパイラがMBASICで書かれ、数行から数千行のコードまでの小さなゲームやユーティリティプログラムが数多く書かれていた。
その他
Basic Micro, Inc.が開発したマイクロチップ・テクノロジー のPIC ファミリー用の商用BASICコンパイラの名称もMBASICであるが、本項目で説明したCP/M用BASICインタプリタとは無関係である。
脚注
Thom Hogan and Mike Iannamico, Osborne 1 User's Reference Guide ,(1982) Osborne Computer Corporation
David A. Lien, The BASIC Handbook , 2nd Edition Encyclopedia of the BASIC Computer Language",(1981), Compusoft Publishing
BASIC 80 Reference Manual , Microsoft Corporation, no date