MSX-BASICの拡張命令
MSXに限らずBASICに含まれていない機能をアセンブラなどで書いて自分で追加した場合、それを呼び出す命令が予め用意されています。マイクロソフトBASIC系列では「公式」には DEF USR 命令を使うことになっているのですが、今、走らせている特定のプログラムだけで使うような呼び出しであればまだしも、デバイスのインターフェースカードにあるROMに載っているようなルーチンを呼び出すには力不足なので、敢えて未実装にしてある CMD 命令を使って拡張するという方法が採られていました。
4章 マシン語とのリンク
CMD
MSXのシステムソフトウェア
まあ USR の方はUSR0~USR9の10個しか使えず、それ以上使いたい時は定義を入れ替えて使うしか無く、引き数も必ずひとつ、戻り値もひとつと決まっていたので、デバイスとのデータのやりとりに使うには機能不足でした。
CMDの方は、命令に続くパラメタを書くことができるのですが、それをパースするのはありものが呼び出せるとはいえ自力でやる必要がありました。こちらは値を返せないので、状態などを戻す必要があれば変数を渡して、呼び出し後に値をチェックするくらいしかできません。
MSXはハードウェアも含めた規格なので、規格に則っている限りデバイスのアドレスなどは共通になるので、直接マシン語で呼び出しても互換性が損なわれません。そこでデバイスとのやりとりに必要なコードなどは、カセットまたはディスクから特定のアドレスに読み込んだり、ROMカートリッジに入れて、それらを呼び出すことを容易にするためにCALL命令があります。実は古のAPPLE BASICの時代から、この命令はあって、N-BASICにも実装されているのですが、MSXの場合は呼び出すアドレスではなく、名前を使うことが出来、さらに引き数も渡せることが強みです。さらに短縮形としてアンダーライン”_”を使うことも許されており、CALL FUNC(0) という命令を _FUNC(0) とすることで拡張機能であることをあまり意識せずに使うことができました。
CALL
この方法で、多くの拡張機能がROMカートリッジなどで供給され便利に使うことができます。実際には呼び出されるROMカートリッジを呼び出すプログラムから見えるアドレス空間に置く必要があるので、ちょっとしたコツが必要だったみたいですけどね(バンク切り替え時代のあるある)。
第1部 BASIC
ちなみに”LPT:”や”GRP:”といったデバイス名についても拡張スロットで追加することが出来るようになっており、例えばプロッタを接続しインターフェースのカートリッジを挿入することでROMにある初期化ルーチンが起動されて”PLT:”が追加されるという使い方もできるようになっています。
もっとも、このデバイス名ですが、プリンタに文字を出すのには LPRINT があるので、”LPT:”を使うのと何が違うのかは悩むところです。
MSXではハードウェアのアドレスや、それらを使うためにコードのアドレスはもちろん、BASICが使うワークエリアやサブルーチンのアドレスも仕様として公開されていました。アセンブラの知識があればBASICを使うまでも無くMSXであれば、どれでも動くようなマシン語コードを書くのはさほど苦労しませんでした。もちろんBASICコンパイラもあったので(コンパイラもCALL命令で呼び出すのです)、BASICで書けることはBASICで書いてしまったほうが楽だったことは確かです。
ですからMSX-BASICのプログラムで”_”で始まる他では見かけない命令があったとしたら、それは拡張された命令なので、対応するROMカートリッジの仕様を探してください。そちらに説明があるはずです。
ヘッダ画像は、いらすとや さんよりhttps://www.irasutoya.com/2014/03/blog-post_4006.html