MBASIC(エムベーシック)は、CP/M向けのMicrosoft BASICである。MBASICは、マイクロソフトの最初の製品であるAltair BASICインタプリタの子孫である。MBASICは、Osborne 1に同梱されていた2つのバージョンのBASICのうちの1つである。「MBASIC」という名前は、BASICインタプリタのディスクファイル名 MBASIC.COM に由来する。

## 動作環境

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の転送先として使用することができる。ソースの編集には行編集コマンドのみが提供されていた。プログラムをプレーンテキストとして保存し、フル機能のテキストエディタで編集することがしばしば行われた。

プログラムテキスト、変数、ディスクバッファ、そしてオペレーティングシステム(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ソースコードのためのプリプロセッサを必要としなかったので、対話的にデバッグすることができた。ただし、マイクロソフトは、BASCOMでコンパイルしたプログラムのコピーを1つ配布するごとに9%のロイヤルティーを要求し、ハードウェアとソフトウェアの組み合わせには40ドルを要求した。また、マイクロソフトは開発者の財務記録を監査する権利を持っていた。ソフトウェアの著作者のロイヤルティー率は一般的には10-25%だったので、『インフォワールド』誌は1980年に、BASCOMを使用することによる9%のロイヤルティーの上乗せは「ソフトウェア開発を収益性の低いものにする可能性がある」と述べ、「マイクロソフトには(CBASICに対抗する)技術的な解決策はあるが、経済的な解決策はない」と結論づけた。

## MBASICの重要性

MBASICは8ビットのCP/Mコンピュータの時代には重要なツールだった。熟練したユーザは、現代のシステムならば強力なアプリケーションプログラムのコマンドやスクリプト言語によって実行されるであろうタスクを自動化するために、MBASICでルーチンを書くことができた。便利なMBASICプログラムの交換は、コンピュータのユーザーグループの機能の1つだった。雑誌の記事に掲載された長いBASICのプログラムリストをキー入力することは、新しいCP/Mシステムにソフトウェアを「ブートストラップ」(インストール)"する一つの方法だった。大規模な高レベル言語用のコンパイラがMBASICで書かれ、数行から数千行のコードまでの小さなゲームやユーティリティプログラムが数多く書かれていた。

## その他

Basic Micro, Inc.が開発したマイクロチップ・テクノロジーのPICファミリー用の商用BASICコンパイラの名称もMBASICであるが、本項目で説明したCP/M用BASICインタプリタとは無関係である。