『MSX0 Stack』の操作方法 - ソフトウェア

# ■ ソフトウェア
ソフトウェア関連です。

## ・収録ソフトウェア
付属の microSD に収録されているソフトウェアは次の通りです。

| ディスク | 内容 | システム|ドキュメント| 備考|
|:---|:---|:---|:---|:---|
| BLANK_DISK.DSK  | 空のディスクイメージ  |   |   | 2DD フォーマット (720KB)。  |
| BLANK_FAT16.DSK [^1]  | 空のディスクイメージ  |   |   | Nextor 用 FAT16 フォーマット (32MB)。  |
| MSX_C_V1.1.DSK [^1] | MSX-C Ver1.1 |   | 15 [^2]| MSX-DOS 用。C コンパイラ。 |
| MSX_C.DSK  | MSX-C Ver1.2  |   | 16 [^2] | MSX-DOS2 用。C コンパイラ。 |
| MSX_C_LIB.DSK  | MSX-C Library |   | 17 [^2] | C ライブラリ。  |
| MSX_DOS_TOOLS.DSK  | MSX-DOS TOOLS  | DOS1 | 5, 6, 7  | MSX-DOS 用。外部コマンド、スクリーンエディタ MED、M80 マクロアセンブラ、L80 リンカ付属。  |
| MSX_DOS2_ENG.DSK  | MSX-DOS2 (英語)  | DOS2 | 9, 10  | ROM カートリッジは内蔵。  |
| MSX_DOS2_JPN.DSK  | MSX-DOS2 (日本語)  | DOS2 | 9, 10  | ROM カートリッジは内蔵。  |
| MSX_DOS2_TOOLS.DSK  | MSX-DOS2 TOOLS  | DOS2 | 11  | MSX-DOS2 用。外部コマンド、スクリーンエディタ AKID、日本語スクリーンエディタ KID、M80 マクロアセンブラ、L80 リンカ付属。  |
| MSX_SBUG.DSK  | MSX-SBUG  |   | 12  | MSX-DOS 用 SBUG シンボリックデバッガ。  |
| MSX_SBUG2.DSK  | MSX-SBUG2  |   | 13  | MSX-DOS2 用 SBUG2 シンボリックデバッガ。  |
| MSX0MENU.DSK  | MSX0 Stack システムメニュー  | DOS2 | 1  | MSX System Unit1 (U1) の起動ディスクに指定されている。  |
| SAMPLE.DSK  | IoT BASIC サンプルプログラム  |   | 2, 3, 4  | `DOC\SAMPLE.TXT` が概要になっている。 |

:::note
ドキュメントの番号は microSD の `DOC\manual` に格納されている PDF に付いている番号を表しています。
:::

## ・開発ツール
開発ツールの組み合わせは次のようになります。

| MSX | MSX-DOS | アセンブラ/<br>リンカ/エディタ| C コンパイラ | C ライブラリ | デバッガ |
|:---|:---|:---|:---|:---|:---|
| MSX1 | MSX-DOS | DOS TOOLS | MSX-C ver1.1 [^1] | MSX-C Library | SBUG |
| MSX2 / 2+ | MSX-DOS2 | DOS2 TOOLS | MSX-C ver1.2 | MSX-C Library | SBUG2 |

**See also:**

 - [MSX-C に関する情報 (Qiita)](https://qiita.com/ht_deko/items/2a822c2edb85e1d54a11)
 - [MSX0 Stack で MSX-C ver1.2 のディスクを作る (C コンパイラを動かせるようにする) (Qiita)](https://qiita.com/ht_deko/items/c81fdf6a9758cbf824ac)

## ・ディスクからの起動
FD イメージを microSD の `DSK` フォルダに格納し、[\[システムメニュー | FD 変更\]](https://qiita.com/ht_deko/items/f9eb7a5e5e215230b802#fd-%E5%A4%89%E6%9B%B4) でディスクを指定して[再起動](https://qiita.com/ht_deko/items/f9eb7a5e5e215230b802#%E5%86%8D%E8%B5%B7%E5%8B%95)します [^5]。

FD イメージをイジェクトするには [\[Setup Utility | MSX System Unit0\]](https://qiita.com/ht_deko/items/2ccf08e3014fbe46e913#msx-system-unit0) でしか行えませんが、MSX-DOS を起動したくないだけであれば、空のディスクイメージである `BLANK_DISK.DSK` を指定すればよいでしょう。

:::note
MSX0 Stack で扱える FD イメージは 2DD (720KB) ベタ形式です。ファイルサイズは 737,280 bytes になります。
:::

## ・ROM カートリッジからの起動
現状、現状では ROM カートリッジを挿せるアダプタは用意されておらず、任意の ROM イメージを扱う事もできません。

内蔵ゲームカートリッジは [\[システムメニュー | カートリッジ変更\]](https://qiita.com/ht_deko/items/f9eb7a5e5e215230b802#%E3%82%AB%E3%83%BC%E3%83%88%E3%83%AA%E3%83%83%E3%82%B8%E5%A4%89%E6%9B%B4) で選択して[再起動](https://qiita.com/ht_deko/items/f9eb7a5e5e215230b802#%E5%86%8D%E8%B5%B7%E5%8B%95)する事で起動します [^5]。

:::note
[Project EGG](https://www.amusement-center.com/project/egg/game/?maker_id=&oldplat=48&genre=) のゲームはファームウェア更新という形で内蔵ゲームカートリッジを差し替えます。
:::

### Nextor + SofaRun

MSX0 Stack はファームウエアバージョン 0.07.08 で Nextor に対応しており、FAT16 32MB 空ディスクイメージ (`BLANK_FAT16.DSK`) [^1] に Nextor を組み込み、SofaRun を組み込む事で ROM イメージを実行できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/f088fb63-2019-d762-0d03-5526743b0809.png)

 - [Nextor 用 FAT16 ブランクディスク](#nextor-%E7%94%A8-fat16-%E3%83%96%E3%83%A9%E3%83%B3%E3%82%AF%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF)
 - [Nextor の起動ディスク](#nextor-%E3%81%AE%E8%B5%B7%E5%8B%95%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF)
 - [SofaRun (louthrax.net)](https://www.louthrax.net/mgr/sofarun.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/89efe678-8a6a-bc75-4611-56b7fb466074.png)

ROM のダンプ (吸出し) には Gamebank-web.com の『MSX ダンパー』が使えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/342cc66b-e022-6f29-cc61-6be14ad1652d.png)

 - [MSX ダンパー V3 (gamebank-web.com)](https://www.gamebank-web.com/product/308)
 - [MSX ダンパー V3 (Amazon)](https://www.amazon.co.jp/dp/B087GJGFRT/)

## ・MSX-DOS <-> BASIC への遷移
MSX-DOS から BASIC へは `BASIC` で移動できます。

```
MSX-DOS version 1.03
Copyright 1984 by Microsoft

COMMAND version 1.11

A>BASIC
```

BASIC から MSX-DOS へは `CALL SYSTEM` で移動できます [^3]。

```
MSX BASIC version 2.0
(C)Copyright
Microsoft 1983-2023
IoT Media Lab 2023
MSX Licensing Corp 2016-2023

25335 Bytes free
Disk BASIC version 2.00
Ok
CALL SYSTEM
```

:::note
MSX-DOS2 の場合、遷移時に `CALL SYSTEM` のパラメータで指定したコマンドを実行できます。

CALL SYSTEM("コマンド")

パラメータを省略すると `REBOOT.BAT` が検索され、存在すれば実行されます。この際、`REBOOT.BAT` にはパラメータとして起動ドライブが渡されます (`%1` は起動ドライブ)。
:::

## ・BASIC ソースの閲覧
BASIC 上では `LIST` で閲覧できますが、中間コード形式でセーブされている *.BAS ファイルはテキストエディタで読む事ができません。

```vb
LOAD "SYSMENU.BAS"
SAVE "SYSMENU2.BAS",A
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/533c2903-8f33-f5b3-6a28-ffa15783bff1.png)

BASIC で LOAD し、別名でアスキー形式セーブ (`,A` を指定) しましょう。


```
A:>LIST SYSMENU.BAS > SYSMENU2.BAS
```

『MSX-DOS TOOLS』や『MSX-DOS2 TOOLS』に含まれる `LIST.COM` を使って MSX-DOS 上から変換する事もできます。


## ・MSX べーしっ君 (BASIC コンパイラ)
『MSX べーしっ君 (X-BASIC)』の ROM カートリッジは内蔵されています。

べーしっ君には 3 種類あります。MSX0 Stack のものは、付属のマニュアルこそ無印の『MSX べーしっ君』ですが、搭載されている ROM は MSXturboR 対応の『MSX べーしっ君 たーぼ』との事です。

| 製品名 | Ver | 対応機種 | 形態 | 価格 |
|:---|:---:|:---|:---:|---:|
| [MSX べーしっ君](https://akasik-libraries.jp/modules/booklist/bookinfo.php?id=577) | 1.0 | MSX, MSX2 | ROM | &yen;4,500 |
| MSX べーしっ君 ぷらす | 2.0 | MSX, MSX2, MSX2+ | ROM | &yen;6,800 |
| MSX べーしっ君 たーぼ [^11]| 2.1 | MSX, MSX2, MSX2+, MSXturboR | Disk | &yen;3,500 |

BASIC プログラムを `RUN` ではなく `CALL RUN` で実行すると、BASIC コンパイラを通して実行されます [^3]。

BASIC コンパイラが実行できない命令が含まれるプログラムの場合、`CALL TURBO ON` と `CALL TURBO OFF` で囲った部分だけをコンパイラに処理させる事もできます。この場合には `CALL RUN` ではなく `RUN` で実行します。

```
10 PRINT "Hello,"
20 CALL TURBO ON
30 PRINT "world."
40 CALL TURBO OFF
50 END
```

BASIC コンパイラの詳しい使い方はドキュメントを参照してください。

:::note
ドキュメントは microSD の `DOC\manual` に格納されている `14_MSXべーしっ君.pdf` です。
:::

| 掲載号 | ページ | 内容 |
|:---:|:---:|:---|
| [1986/11](https://akasik-libraries.jp/modules/booklist/bookinfo.php?id=547) | pp.187-190 | ・コンパイラに挑戦<br>　BASIC コンパイラ (MSX べーしっ君) | 
| [1986/12](https://akasik-libraries.jp/modules/booklist/bookinfo.php?id=548) | pp.215-217 | ・コンパイラに挑戦<br>　BASIC コンパイラ (MSX べーしっ君) Part II | 
| [1987/03](https://akasik-libraries.jp/modules/booklist/bookinfo.php?id=551) | pp.191-192 | ・べーしっ君の使い方 (第 1 回) | 
| [1987/04](https://akasik-libraries.jp/modules/booklist/bookinfo.php?id=552) | pp.191-192 | ・べーしっ君の使い方 (第 2 回) | 
| [1987/05](https://akasik-libraries.jp/modules/booklist/bookinfo.php?id=553) | pp.172-175 | ・べーしっ君の使い方 (第 3 回) | 
| [1987/06](https://akasik-libraries.jp/modules/booklist/bookinfo.php?id=554) | pp.174-177 | ・べーしっ君の使い方 (最終回) | 
| [1989/03](https://akasik-libraries.jp/modules/booklist/bookinfo.php?id=593) | pp.150-151<br> pp.204-206 | ・べーしっ君ぷらす<br>　あのべーしっ君が MSX2+ 対応でパワーアップ！ | 
| [1989/04](https://akasik-libraries.jp/modules/booklist/bookinfo.php?id=594) | pp.180-183 | ・べーしっ君ぷらす<br>　べーしっ君で横スクロールゲームに挑戦だ | 
| [1992/05](https://akasik-libraries.jp/modules/booklist/bookinfo.php?id=497) | pp.50-69 | ・MSX べーしっ君たーぼ | 
| [1992/07](https://akasik-libraries.jp/modules/booklist/bookinfo.php?id=496) | p.145 | ・MSX べーしっ君たーぼ 補足・訂正 | 

 - [MSX べーしっ君 (Wikipedia)](https://ja.wikipedia.org/wiki/MSX-BASIC#BASIC%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9)
 -  [\[MSX\] カテゴリ (AKASIK Libraries)](https://akasik-libraries.jp/modules/booklist/booklist.php?genre=24)

## ・IoT BASIC

MSX0 Stack の BASIC には IoT 拡張命令があります。IoT ROM カートリッジが内蔵され、その機能を利用しているような恰好になっています。

| 命令 | 説明 |
|:---|:---|
| CALL IOTPUT(パス名, 値) | ノードに対して値を書き込みます。  |
| CALL IOTGET(パス名, 変数)  | ノードから値を読み出します。  |
| CALL IOTFIND(パス名, 数値変数)  | 対象のノードが持つアイテムの個数を取得します。  |
| CALL IOTFIND(パス名, 配列変数 [,個数])  | 対象のノードが持つアイテム名のリストを取得します。 |
| CALL IOTINIT() | シリアル⼊出⼒などの機能を初期化します。  |

`DSK\SAMPLE.DSK` に含まれるサンプルプログラムは次のようになっています。

| 機能 | ファイル名 | 説明 |
|:---|:---|:---|
| M5 LCD タッチパネル | TOUCH_G.BAS | 本体の LCD タッチパネルを使って簡単なお絵描きができます。 | 
| アナログ入力  | ANALOG_G.BAS  | PortB (黒) のピン 36 からのアナログ入力信号で簡単なグラフを描きます。 | 
| 温度湿度センサ | DHT_KNJ.BAS  | 温度湿度センサから取得した値を表示します。 |
| 加速度センサ  | ACCEL.BAS | M5GO Bottom2 の加速度センサの値を取得して表示します |
| Wi-Fi 値取得 | WIFILVL.BAS | 接続中の Wi-Fi AP の RSSI 値を表示します。 |
| リモートコンソールへの文字列送信 | RCONSOLE.BAS | リモートコンソールに文字列を送信します。 |
| サーバーとの送受信 | SEND2NET.BAS | 温度湿度センサーから値を取得しサーバーへ送信します。 |
| ノードリスト表示 | TREE.BAS  | ノードを再帰的にスキャンしてリスト表示します。 |
| 負荷測定 | PERFORMC.BAS  | 仮想 Z80 の周波数を振ってオーバークロック余力を測定します。 |
| I2C アクセス  |I2C.BAS  | DHT20 に対して直接 I2C アクセスを行い温度を取得します。  |

`DSK\MSX0MENU.DSK` に含まれるシステムメニュープログラムもサンプルの一部です。

| 機能 | ファイル名 | 説明 |
|:---|:---|:---|
| 設定値変更 | SYSMENU.BAS | システム設定アプリを想定したサンプルになります。 | 

空の microSD カードを挿した時に自動生成される `DSK\MSX0MENU.DSK` には上記サンプルプログラムと、説明書とは異なる質素なメニュープログラムが含まれます。

| 機能 | ファイル名 | 説明 |
|:---|:---|:---|
| 情報表示 | INFO.BAS | MSX0 の情報を表示します。 | 
| 設定値変更 | MENU.BAS | システム設定アプリを想定したサンプルになります。 | 

例えば Unit0 側の CPU の動作速度を調べるには次のようにします。

```vb
CALL IOTGET("msx/u0/pm/cpu/percent", V)
PRINT V
 100
Ok
```

Unit0 側の CPU の動作速度を 150% に変更するには次のようにします。

```vb
CALL IOTPUT("msx/u0/pm/cpu/percent", 150)
Ok
```

:::note
・ノード情報については ドキュメントフォルダにある `2_IoT_BASICノード情報.pdf` を参照してください。
・実際のノードツリーは `SAMPLE.DSK` 内の `TREE.BAS` を実行して取得できます。シリアルコンソールやリモートコンソールで接続してリストを取得する事ができます。
・詳細な使い方については `SAMPLE.DSK` 内のソースコードを参考にしてください。
:::

### 他の言語からの利用

MSX-BASIC 以外から使う方法もあります。

| 言語 | 説明 |
|:---|:---|
| BASIC コンパイラ| [BACON (Github: @hra1129)](https://github.com/hra1129/msx_basic_compiler)|
| C | [LibIoT (Github: @renatus-xxxx)](https://github.com/renatus-xxxx/libiot/tree/main) |
| Turbo Pascal | [IOT.LIB (Qiita: @ht_deko)](https://qiita.com/ht_deko/items/a5c0bf6e7969093beb3c) <br>[IOT.LIB (Github: @ht_deko)](https://github.com/ht-deko/MSX0_TP3/tree/main/LIB)|

**See also:**

 - [【MSX0】IoT BASIC サンプルの移植【Turbo Pascal】(Qiita)](https://qiita.com/ht_deko/items/2362488c5c99aec4afbf)


## ・日本語入力/表示
『MSX0 Stack』には漢字 ROM が搭載されており、日本語の入力/表示が可能です。

 - 実機では`〔かな〕`で **英数入力 ⇔ かな/カナ入力** の切り替えで、`〔CapsLock〕`キーで **かな入力  ⇔ カナ入力** 切り替え。
 - 実機 (MSX2 以降) では`〔Shift〕+〔かな〕`で **英数入力 ⇔ ローマ字入力(かな/カナ)** の切り替えで、`〔CapsLock〕`キーで **ローマ字入力 (かな) ⇔ ローマ字入力 (カナ)** 切り替え。
 - 実機では **漢字モード** 中に`〔Ctrl〕+〔Space〕`で **日本語入力 (全角)** の ON / OFF 切り替え。入力方法 (かな/ローマ字) や文字種　(Ａあア) は切り替え前のものを引き継ぐ。
 - **日本語入力** 時の文字種が英数以外の場合に **単漢字変換** が利用可能。

現状の『MSX0 Stack』だと[リモートコントロールパネル](https://qiita.com/ht_deko/items/0cbc386e4719c82bc743#%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%83%91%E3%83%8D%E3%83%AB)でのみ日本語入力が可能です [^10]。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/2fc19aaf-d41f-85ca-b7b3-62a40fbe9e0d.png)

日本語入力 / 表示が可能な **漢字モード** への移行は 

```
BASIC: CALL KANJI モード (0～3)
MSX-DOS2: KMODE モード (0～3)
```

元に戻すには

```
BASIC: CALL ANK
MSX-DOS2: KMODE OFF
```

となります [^3]。

#### 漢字ドライバ

MSX-DOS2 で KMODE を実行して `漢字ドライバが組み込まれていない！` と怒られた場合には 2 通りの対処方法があります。

```
A> kmode 0
*** Kanji driver is not installed
*** use "CALL KANJI" under BASIC.

A>
```

**・BASIC で CALL KANJI を実行する (そして CALL SYSTEM で戻ってくる)。**
エラーメッセージの通りですね。なお、MSX-DOS(1) には KMODE はないのでこの方法で漢字モードにするしかありません (多分)。

```
A> BASIC
```
```
MSX BASIC version 2.0
(C)Copyright
Microsoft 1983-2023
IoT Media Lab 2023
MSX Licensing Corp 2016-2023

25335 Bytes free
Disk BASIC version 2.00
Ok
CALL KANJI

Ok
CALL SYSTEM
```

**・任意の漢字モードで起動するようにディスクのブートセクタを書き替える。**
毎度毎度 BASIC に移動するのが面倒な場合に。

```
A> KMODE OFF /S
ドライブ A: のディスクは日本語 MSX-DOS2 しか立ち上げられなくなります
何かキーを押して下さい

A>
```

ブートセクタを書き替えるための KMODE の書式は次の通りです。

```
KMODE [数値|OFF] /S [d:]

数値: 0～3 (漢字モード) | OFF: ANK 指定
d: ドライブ。未指定の場合はカレントドライブ。
```

最初から KMODE が使えるようになります。

## ・RS-232C
ファームウエアバージョン 0.11.08 以降で RS-232C をサポートしています。<font color="#3FBFFF">PortC</font> を UART として使えます。

| ピン | ケーブル | PortC<br>(UART) |
|:---:|:---:|:---:|
| 1 | 黄 |  RXD |
| 2 | 白 |  TXD |
| 3 | 赤 |  5V |
| 4 | 黒 |  GND |

USB シリアル変換モジュールを使って PC と通信する事ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/a373be6f-f714-9a62-2647-b0af31ce7f7a.png)

BASIC からだと、

```vb
CALL COMINI("0:8N1NH", 9600)
CALL COMTERM
```

で、簡易ターミナルが起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/85887298-9ae3-3197-9f7a-44c4c6d307ce.png)

 - エコーバックは`〔F7〕`(`〔Shift〕+〔F2〕`) です
 - 終了は`〔Ctrl〕+〔Stop〕` (`〔Fn〕+〔C〕`) です

拡張 BASIC のステートメントは『MSX-Datapack Volume 2』の pp.99-145 に詳細があります。

 - [MSX-Datapack Volume 2 (アカシックライブラリ)](https://akasik-libraries.jp/modules/booklist/bookinfo.php?id=589)

### MSX-DOS2 / Nextor

MSX-DOS2 / Nextor では、MSX-DOS2 TOOLS に含まれる `ADDAUX.COM` を用いてデバイスファイル名 `AUX` に RS-232C を割り当てる事ができます。

```txt
A:\addaux
```

通信パラメータは `SPEED.COM` で設定します。

```txt
A:\speed 9600 8N1NHANN
```

| パラメータ | 項目 | 値 |
|:---:|:---|:---|
| #1 | 通信速度<br>(1200)| 50, 75, 110, 300, 600, 1200, 1800, 2000, <br>2400, 3600, 4800, 7200, 9600, 19200 |
| #2 | パラメータ<br>(8N1XNNNN) | キャラクタ長: 5, 6, 7, 8<br>パリティ: N(なし), E(偶数), O(奇数)<br>ストップビット: 1(1), 2(1.5), 3(2)<br>XON/XOFF 制御: X(あり), N(なし)<br>CTS-RTS ハンドシェーク: H(あり), N(なし) <br>CR 受信時の LF の付加: A(あり), N(なし)<br>CR 送信後の LF の除去: A(あり), N(なし)<br>SI/SO 制御: S(あり), N(なし) |
| #3 | 送信タイムアウト<br>(0) | 0..255 |

デバイスファイル名 `AUX` に RS-232C が割り当てられた状態だと、次のようなコマンドで `AUTOEXEC.BAT` の内容を送信できます。

```txt
A:\type autoexec.bat > AUX
```

`ADDAUX.COM` / `SPEED.COM` については『MSX-DOS2 TOOLS ユーザーズマニュアル』の pp.19-20, pp.43-44 に詳細があります。

 - [MSX-DOS2 TOOLS ユーザーズマニュアル (アカシックライブラリ)](https://akasik-libraries.jp/modules/booklist/bookinfo.php?id=570)

:::note
プログラミングでデバッグ用文字列の出力先に使う事もできます。
:::

### 19200 baud よりも高速な通信

MSX0 では 19200 baud よりも高速な通信が可能です。通信速度に次の値を指定する事で高速通信が可能です。

| 通信速度 | 設定値1 | 設定値2 |
|---:|---:|---:|
| 38400  | -3 | 65533 |
| 57600  | -2 | 65534 |
| 115200 | -1 | 65535 |
| 230400 | -32757 | 32779 |
| 460800 | -32751 | 32785 |
| 921600 | -32748 | 32788 |

`設定値` または `設定値2` を通信速度に設定してください。次の設定は 115200 baud での通信となります。

```txt:BASIC
CALL COMINI("0:8N1NH", -1)
```

```txt:MSX-DOS
A:\speed -1 8N1NHANN
```

## ・MIDI
ファームウエアバージョン 0.11.08 以降で (限定的ながら) MIDI をサポートしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/54681e68-345a-6674-0479-d2cd4ad1391b.png)

 - [MIDI Unit for GROVE (Switch Science: @necobit)](https://www.switch-science.com/products/7587)
 - [M5Stack 用 MIDI シンセサイザユニット (SAM2695) (Switch Science)](https://www.switch-science.com/products/9510)

拡張 BASIC のステートメントは『MSX-Datapack turbo R 版 Volume 3』の pp.631-655 に詳細があります。

 - [MSX-Datapack turbo R 版 Volume 3 (アカシックライブラリ)](https://akasik-libraries.jp/modules/booklist/bookinfo.php?id=592)


## ・ディスクイメージの操作

### DiskExplorer
FD イメージの操作には『DiskExplorer (EDITDISK.EXE)』が紹介されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/a686daa5-9ebd-97e3-6d5a-7d53e2edaddd.png)

 - [DiskExplorer (Vector: @junnno)](https://www.vector.co.jp/soft/win95/util/se107750.html)
 - [DiskExplorer (実験室)](https://web.archive.org/web/20241128201838/https://hp.vector.co.jp/authors/VA013937/editdisk/)

:::note
Vector のホームページサービスが、2024/12/20 で終了してしまったので、DiskExplorer の最新版は Internet Archive 経由で取得する必要があります。古いバージョンは普通に Vector から DL 可能です。
:::

### MSX Floppy Disk Manager

『MSX Floppy Disk Manager (MSXDiskMgr.exe)』も使えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/5b0fc7e3-464a-d67e-bcf2-41544a20c675.png)
 
 - [MSX Floppy Disk Manager (sonono.net)](https://sonono.net/blog/2021/03/04/msx-floppy-disk-manager%EF%BC%88%CE%B1%E7%89%88%EF%BC%89%E3%81%AE%E5%85%AC%E9%96%8B/)

### DSKTOOL

MSX-DOS2 のディレクトリを考慮しなくていいのであれば、『DSKTOOL』でファイル操作が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/53972f7a-77e3-3135-0e07-24d616fa2872.png)

- [DSKTOOL (Github: @nataliapc)](https://github.com/nataliapc/MSX_devs/tree/master/dsktool)

### ImDisk Virtual Disk Driver

Nextor 用のディスクイメージ (FAT16) を操作するには ImDisk の利用をオススメします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/50183a2f-cdf9-06b3-ad8b-9824a2118dad.png)

`Mount new...` でディスクイメージをマウントすると仮想ドライブとして利用できます。`Remove` で選択されたドライブをアンマウントします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/8a109777-4629-ef05-142c-bfe10730951c.png)

`MountImg.exe` の方だとドラッグ＆ドロップでディスクイメージを指定できて便利です。

`MountImg.exe` のショートカットを作り、オプションに `"D:\MSX0\NEXTOR_32MB.DSK" /MP=M:` のように指定すると、ファイル名とドライブレターが指定された状態で起動します。[OK] を押せば `M:` としてマウントされます。既に `M:` にマウントされている状態でこのショートカットから起動し、[Unmout] ボタンを押せばアンマウントされます。


 - [ImDisk Toolkit (SourceForge)](https://sourceforge.net/projects/imdisk-toolkit/)
 - [ImDisk Virtual Disk Driver (窓の杜)](https://forest.watch.impress.co.jp/library/software/imdiskvdiskr/)


## ・ブランクディスク
ブランクディスクを作る最も簡単な方法は microSD の `DSK` フォルダにある `BLANK_DISK.DSK` (2DD / 720KB) をコピーする事です。現状、MSX-DOS の `FORMAT` コマンドや DISK BASIC の `CALL FORMAT` [^3]は動作しません。

『DSKTOOL ver 1.4』 以降では以下のコマンドでブランクディスクを作る事ができます。

```
DSKTOOL C 720 BLANK.DSK
```

:::note
Disk BIOS が有効 (MSX0 Stack では有効) かつ MSX-DOS のシステムディスクになっていないディスクに `AUTOEXEC.BAS` という名前の BASIC プログラムファイルを置いておくと起動時に自動実行されます。
:::

### Nextor 用 FAT16 ブランクディスク
microSD の `DSK` フォルダには Nextor 用の FAT16 フォーマットな 32MB ブランクディスクイメージ (`BLANK_FAT16.DSK`) が用意されています [^1]。　

## ・MSX-DOS のバージョンによる違い
ざっくりとした違いです。

|| MSX-DOS | MSX-DOS2 | Nextor |
|:---|:---|:---|:---|
| 最低動作環境 | MSX | MSX2 | MSX |
| DOS ROM | 不要 | 必要 | 必要 |
| Disk BASIC | ver 1.0 | ver 2.0 | Nextor BASIC |
| 必要メモリ | 64KB 以上 | 128KB 以上 | 128KB 以上 |
| 階層化ディレクトリ | なし  | あり | あり |
| RAM ディスク | なし  | あり | あり |
| 環境変数 | なし  | あり | あり |
| REBOOT.BAT | なし  | あり | あり |
| ヒストリ機能 | なし  | あり | あり |
| TAB 補完機能 | なし  | なし | あり |

**See also:**

 - [MS-DOS ver2.0 と MSX-DOS のバッチコマンド (Qiita)](https://qiita.com/ht_deko/items/873d2136a56627b07925)

## ・各種 DOS の起動ディスク

### MSX-DOS1 の起動ディスク
MSX-DOS1 の起動ディスクは microSD の `DSK` フォルダにある `MSX_DOS_TOOLS.DSK` をコピーして作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/cfd18788-bdae-d45f-e08e-a724323961fe.png)

`MSX_DOS_TOOLS.DSK` をコピーして `MSX_DOS.DSK` にリネームしたものを『DiskExplorer』で開き、`MSXDOS.SYS` と `COMMAND.COM` を除いて削除します。

:::note
起動時、`AUTOEXEC.BAT` という名前のバッチファイルが検索され、存在すれば実行されます。
:::

:::note
`MSXDOS.SYS` と `COMMAND.COM` がルートディレクトリの最初の方にエントリされてないと許せない方 [^12] はブランクディスクに `MSXDOS.SYS` と `COMMAND.COM` をコピーして起動ディスクを作るか、[Rewty](https://www.vector.co.jp/soft/other/msx/se041068.html) で並べ替えてください。
:::

### MSX-DOS2 の起動ディスク
MSX-DOS2 の起動ディスクは microSD の `DSK` フォルダにある `MSX_DOS2_ENG.DSK` または `MSX_DOS2_JPN.DSK` をコピーして作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/f0d2e280-6519-c61d-1554-998d638c25bc.png)

`MMSX_DOS2_xxx.DSK` をコピーして `MSX_DOS2.DSK` にリネームしたものを『DiskExplorer』で開き、`MSXDOS2.SYS` と `COMMAND2.COM` を除いて削除します。

:::note
起動時、`AUTOEXEC.BAT` という名前のバッチファイルが検索され、存在すれば実行されます。この際、`AUTOEXEC.BAT` にはパラメータとして起動ドライブが渡されます (`%1` は起動ドライブ)。
:::

:::note
`MSXDOS2.SYS` と `COMMAND2.COM` がルートディレクトリの最初の方にエントリされてないと許せない方 [^12] はブランクディスクに `MSXDOS2.SYS` と `COMMAND2.COM` をコピーして起動ディスクを作るか、[Rewty](https://www.vector.co.jp/soft/other/msx/se041068.html) で並べ替えてください。
:::

#### MSX-DOS と MSX-DOS2 の混在
MSX-DOS から `MSXDOS.SYS` と `COMMAND.COM`、MSX-DOS2 から `MSXDOS2.SYS` と `COMMAND2.COM` の計 4 ファイルをブランクディスクにコピーすると、MSX-DOS2 が起動可能な環境では MSX-DOS2 が起動し、そうでない環境では MSX-DOS が起動する起動ディスクが作れます。

### Nextor の起動ディスク
Nextor の起動ディスクは空のディスクイメージに `NEXTOR.SYS` と、MS-DOS2 に含まれる `COMMAND2.COM` をコピーして作ります。`COMMAND2.COM` は The New Image (TNI) 氏による ver2.44 を使う事もできます。

Nextor は FAT16 に対応しているので、FAT16 32MB 空ディスクイメージ (`BLANK_FAT16.DSK`) を使う事ができます。この際には FAT16 に対応している **COMMAND2.COM ver2.44** または **COMMAND2.COM パッチ** を使うとよいでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/a50ae9ff-8e69-3a33-0f8b-a535b191547c.png)

日本語に対応したフルバージョンの `NEXTOR.SYS` は `NEXTOR.SYS.japanese` や `NEXTORJP.SYS` という名前で配布されていますので、`NEXTOR.SYS` にリネームして使います。

:::note
Nextor を起動するには [Setup Utility の 設定 (MSX System Unit0)](https://qiita.com/ht_deko/items/2ccf08e3014fbe46e913#msx-system-unit0) で Dos の種類を Nextor に変更する必要があります。
:::

 - [Nextor (konamiman.com)](https://www.konamiman.com/msx/msx-e.html#nextor)
 - [Nextor (msxhub.com)](https://msxhub.com/NEXTOR)
 - [Nextor DOS - MSX Wiki (MSX resource Center)](https://www.msx.org/wiki/Nextor_DOS)
 - [TNI COMMAND2.COM 2.44 (tni.nl)](http://www.tni.nl/products/command2.html)
 - [TNI COMMAND2.COM 2.44 (Internet Archive)](https://web.archive.org/web/20150920002038/http://www.tni.nl/products/command2.html)
 - [COMMAND2.COM 2.44 - MSX Wiki (MSX resource Center)](https://www.msx.org/news/software/en/command2com-244)
 - [COMMAND2.COM パッチ (Okei's Homepage)](http://niga2.sytes.net/kmizuo/fat16/down.html)

:::note warn
konamiman.com に置いてあるアーカイブは Windows 標準の機能では正しく展開できない事があるようです。別途何らかのアーカイバを用意しておいた方がいいかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/dc67672d-91c9-6e24-54e9-93b32b329b2f.png)
:::

:::note
起動時、`AUTOEXEC.BAT` という名前のバッチファイルが検索され、存在すれば実行されます。この際、`AUTOEXEC.BAT` にはパラメータとして起動ドライブが渡されます (`%1` は起動ドライブ)。
:::

#### COMMAND2.COM ver2.44 の入手方法
[The New Image (TNI) 氏のサイトにあるのはパッチ](http://www.tni.nl/products/command2.html)なので、自前で MSX-DOS2 の `COMMAND2.COM` にパッチを当てる必要があります。

 1. [MSX-DOS2 の起動ディスク](#msx-dos2-%E3%81%AE%E8%B5%B7%E5%8B%95%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF)を用意
 2. パッチのアーカイブを解凍し、[MSX-DOS2 の起動ディスク](#msx-dos2-%E3%81%AE%E8%B5%B7%E5%8B%95%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF)にコピー
 3. このディスクから起動
 4. `AUTOEXEC.BAT` により `COMMAND2.COM` にパッチされる
 5. ディスクから `COMMAND2.COM` ver2.44 を抽出

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/0067d58b-f3f1-c2f2-4aa4-49df3447d915.png)

:::note
Nextor のアーカイブにはパッチ済の `COMMAND2.COM` ver2.44 が含まれていますが、大した手間ではないので自分でパッチを行っておくとよいでしょう。
:::

## ・ディスク機能の無効化
MSX0 Stack では 2 つのディスクドライブ (`A:`, `B:`) が有効になっています。挙動を見る限り、`B:` ドライブは仮想ドライブ (2 ドライブシミュレータ) ではなさそうです。

**2 ドライブシミュレータ** というのは、1 台のドライブを都度切り替えて 2 台あるかのように振る舞う機能です。`B:` ドライブへのアクセスはディスク交換で対応します。

MSX では次のようなドライブ構成ができます。MSX0 Stack では `B:` ドライブの FD イメージを変更する UI がないため、(現状) `B:` ドライブは使えないものと思われます。

|  | ドライブ A: | ドライブ B: |
|:---:|:---:|:---:|
| 2 ドライブ | 実ドライブ | 実ドライブ |
| 2 ドライブ<br>シミュレータ | 実ドライブ | 仮想ドライブ |
| 1 ドライブ | 実ドライブ | N/A |
| ドライブなし | N/A | N/A |

起動時 (MSX ロゴが表示された直後) に特定のキーを押しっぱなしにして起動する事により、ディスクドライブを切り離す事ができます。

|  | 実機 | MSX0 (Faces II Keyboard) |
|:---:|:---:|:---|
| 2 ドライブ  |   |   |
| 1 ドライブ | 〔Ctrl〕  | 〔Fn〕を押して〔C〕を押しっぱなし [^10] |
| ドライブなし | 〔Shift〕 | 〔Alt〕を押しっぱなし |

BASIC で確認すると判りやすいです。ユーザーエリアのサイズに注目してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/7c4e6416-1b0b-b7e0-8b35-c1c59c56d143.png)

1 ドライブにするとユーザーエリアが増えます。MSX-DOS で `B:` にアクセスすると Invalid Drive のエラーになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/31594258-11e0-e2d2-32bd-123f935a2d68.png)

ドライブなしにすると純粋な ROM Basic が起動します (Disk BASIC の表示が消える)。ユーザーエリアは最大の 28,815 bytes になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/e4fa3216-29eb-2816-332f-a2a1d3599f09.png)

MSX0 Stack では CMT (カセットテープ) が使えないので、ユーザーエリアが増えても…🤔

:::note
Disk BIOS を無効にすると、結果的に `AUTOEXEC.BAS` の実行をキャンセルする事ができます。ただ、ディスクを読めないので、あまり使い道はないかと思います。
:::

## ・MSX-DOS と CP/M-80 の関係
MSX-DOS は **CP/M-80** (v1.4) と高い互換性があります。

MSX-DOS のコマンドは MS-DOS に寄せてあるので、とても使いやすいです。以下に MSX-DOS の内部コマンドと、対応する CP/M-80 のコマンドを示します。

| 機能 | CP/M-80 | MSX-DOS |
|:---|:---|:---|
| ファイル: リスト表示  | DIR | DIR |
| ファイル: 削除  | ERA | DEL / ERA / ERASE |
| ファイル: コピー | PIP (外部) | COPY |
| ファイル: リネーム | REN | REN |
| ファイル: メモリをセーブ | SAVE | |
| ファイル: データの表示 | TYPE | TYPE |
| 日付/時刻: 日付表示/設定 | | DATE |
| 日付/時刻: 時刻表示/設定 | | TIME |
| バッチファイル: 一時停止 |  | PAUSE |
| バッチファイル: コメント |  | REM |
| ディスク: フォーマット  |  | FORMAT |
| ディスク: ベリファイ |  | VERIFY |
| バッチファイルの実行 | SUBMIT (外部) | |
| BASIC 実行 | MBASIC など (外部) | BASIC |
| 画面の文字数変更 |  | MODE |

「コマンドが違うのに互換性？」と思われたかもしれませんが、実は CP/M-80 用の実行形式ファイル (*.COM) の多くは MSX-DOS 上でそのまま動作します。なので、**MSX-DOS は「MS-DOS の操作性を備えた CP/M-80」** とも言えます。

:::note
CP/M-80 における外部コマンド (トランジェントコマンド) とは、実行形式ファイル (*.COM) 事です。実行形式ファイルなしで実行できるのが DIR のような内部コマンド (ビルトインコマンド) です。例えば CP/M-80 でファイルコピーをしたい場合には PIP.COM が必要となります。
:::

 - [MSX-DOS (Wikipedia)](https://ja.wikipedia.org/wiki/MSX-DOS)
 - [CP/M (Wikipedia)](https://ja.wikipedia.org/wiki/CP/M)
 - [The Unofficial CP/M Web site](http://www.cpm.z80.de/)

みんな大好き **Turbo Pascal** とかね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/a176902e-33df-652b-80f6-c7d2465f7140.png)

 - [Turbo Pascal (MSX) に関する情報 (Qiita)](https://qiita.com/ht_deko/items/4a622080b58fbc7d865d)

# 索引
 - [■ メイン](https://qiita.com/ht_deko/items/b284cb93ac34e2b77d9a)
 - [■ ハードウェア](https://qiita.com/ht_deko/items/cdb1594e9879a5e9e660)
 - [■ システムメニュー](https://qiita.com/ht_deko/items/f9eb7a5e5e215230b802)
 - [■ Setup Utility](https://qiita.com/ht_deko/items/2ccf08e3014fbe46e913)
 - [■ リモート接続](https://qiita.com/ht_deko/items/0cbc386e4719c82bc743)
 - ■ ソフトウェア

[^1]: [公式ダウンロードサイト](https://dl.msx-hub.com/)よりダウンロード可能。
[^2]: [アカシックライブラリ](https://akasik-libraries.jp/)でも読む事ができます。

[^3]: BASIC の `CALL` は `_` で置換可能です。例えば `CALL SYSTEM` は `_SYSTEM` と同じになります。
[^5]: 本体上部のリセットボタンを押して再起動する事もできます
[^10]: Keyboard Face では`〔Fn〕〔C〕`(〔Ctrl〕+〔Stop〕) を利用して、〔Ctrl〕キーを押す事ができますが、理屈上 Break が一回含まれてしまいます。
[^11]: 『MSX べーしっ君 たーぼ』を MSXturboR 以外で動かすと『MSX べーしっ君 ぷらす』同等品となります。
[^12]: MS-DOS の使い過ぎです。`IO.SYS` とか `IO2.SYS` はありませんよ？