![見出し画像](https://assets.st-note.com/production/uploads/images/126712068/rectangle_large_type_2_c931ff866fca54d3c74075f23e22896b.png?width=1200)
MSX-DOSでのプログラミング第1回
MSX-DOSって何?
MS-DOSとコマンドが同じでMSXでも動作するやつです。
フロッピーディスク(いまはもう昔)がMSXに搭載されたときと同時にMSX-DOSも公開されました。
発売当時はMS-DOSは16ビット機向けに作成されたものでしたが、それを8ビットのMSXでも動かそうとしたのがMSX-DOSになります。
MSX-DOSは初代のMSX-DOS(1984)とMSX-DOS2(1988)の2種類があります。MSX-DOS2のほうは階層ディレクトリに対応してたりパイプに対応してたりしたみたいです。基本的にMSXDOS.SYSとCOMMAN.COMで構成されます。MSXDOS.SYSがカーネルで、COMMAND.COMがDIRとかCDとかのコマンドを解釈するやつ。という感じ(たぶん)
筆者が少年時代では田舎のMSXユーザーはそもそも少なく、なおかつFDD付きのMSXを持っている友人もいなかったため、MSX-DOSをほぼ知らずに今日まで至ります。ですが、今になってみるとROMでプログラミングしてわかるのですが、FDDの容量720KiBはとても魅力に思える気もします。
、、、っということで。
MSX-DOSでのマシン語プログラミングについて記事にすることにしました。伝えることが多すぎて複数回に分けます。
謝辞:この記事の作成にいたるまでにいろんなかたからのアドバイスをいただきました。本当にありがとうございます。
知識は共有するもの
知識は楽しむもの
MSX-DOSの起動状態
MSX-DOS.SYSとCOMMAND.COMが保存されているディスクを挿入してMSXを起動するとMSX-DOSモードで起動します。
以下はWebMSXに筆者が作成したディスクイメージを読み込ませて、起動した画面イメージです。
![](https://assets.st-note.com/img/1704448919987-0UvvynzaYe.png?width=1200)
DIRコマンドを実行するとふつうーにディスクの内容を確認できます。
これは説明いらないですね。
![](https://assets.st-note.com/img/1704448992472-O8vLaWhbhV.png?width=1200)
BASICとタイプしてエンターすると、DISK-BASICのモードに切り替わります。
![](https://assets.st-note.com/img/1704449051413-Nlc0b0edYP.png?width=1200)
![](https://assets.st-note.com/img/1704449085057-1uOwBvAFjC.png?width=1200)
プログラミングするうえでは、いろいろと、こむずかしい
さて、MSX-DOS版でプログラミングする場合、いろいろとこむずかしいです。
まずはスロットとページについて理解する必要があります。
MSXではスロットとページという概念があって、RAMの場所(ページといいます)をいろいろと変えることができるようになってます。
MSXではRAMの16KBごとにページ番号というのが割り振られています。
0000H - 3FFFH : ページ0
4000H - 7FFFH : ページ1
8000H - BFFFH : ページ2
C000H - FFFFH : ページ3
話が少しそれますが、先日作成したゲームでは、0000Hから7FFFH、C000HからFFFFHまではMSXのRAMのページ0とページ1、ページ3(ワークエリア含む)を使用して、ページ2(8000HからBFFFHまで)だけROMのページ2を使うようにプログラム内で指定することで動作させています。
なお、筆者はいまだこの仕組みについて完全に納得いくまで理解したわけではありませんので、間違いがあることもあらかじめご容赦ください。
インタースロットコールという仕組み
さて、MSX-DOSが動作している状態ではすべてがRAMになっていて、BIOSを呼び出すためにはBIOSのBASIC-ROMのページに切り替えないと呼び出せません。下図では通常はMSX-DOSではすべてのページがRAMですが、そこにBIOSは存在しておらず、BIOSを呼び出すときにはページ0をBASIC-ROMのページ0に置き換えてから呼び出すイメージをあらわしたものです。
この呼び出しかたを「インタースロットコール」と呼びます。
![](https://assets.st-note.com/img/1704447314537-Q5Nmmdq7Vy.png?width=1200)
初期状態はどうなっているの?
スロットとページについては機種依存で機種ごとに違うようです。
FDD付きの機種であれば必ず以下のワークエリアにそれぞれのページがどのスロットにあるのか、その情報が格納されているようです。
![](https://assets.st-note.com/img/1704448326805-XbeWY5qRRC.png?width=1200)
ちなみにWebMSX(MSX2 Japan NTSC)で確認したところ、基本スロットの3番と、拡張スロットの0番にページ#0からページ#3までの情報が存在していました。何がなにやらわかりません。。。
![](https://assets.st-note.com/img/1704448239412-y2gaZ9eExu.png?width=1200)
とりあえず、ワークエリアはDISK-BASICでも使用されるため、MSX-DOSであってもいわゆるワークエリアは使えます。
ワークエリアはページ3(F380H以降)です。
とりあえず作ってみた
ということで、百聞は一見にしかず。
とりあえずDOS版のアプリケーションを作ってみました。ちなみに筆者としても人生初のMSX-DOS向け完全ネイティブプログラムです。
ちょっとだけうれしい。
![](https://assets.st-note.com/img/1704450701987-yhCmNT9dPg.png?width=1200)
前のArkosTracker2の関する記事で作ったやつをDOS版に加工してるだけです。
ソースコードもGitにアップしてあります。
https://github.com/sailorman-msx/games/tree/main/src/sample019
当たり前ですがGitにアップしてある.romファイルやら.binファイルをROMとしてWebMSXに認識させようとしてもエラーになります。
次回の記事でソースコードを眺めながらのMSX-DOSでの注意点について説明したいと思います。
それでは、また。ノシ
セーラー服が似合うおじさんです。猫好き、酒好き、ガジェット好き、楽しいことならなんでも好き。そんな「好き」をつらつらと書き留めていきます。