【MSX0】IoT BASIC サンプルの移植【Turbo Pascal】

# はじめに

『MSX0 Stack』付属の IoT BASIC サンプルを『Turbo Pascal』へ移植してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/9b876ff2-92d2-ecce-5920-a075debdf46a.png)

**See also:**

 - [MSX0 Stackで伝説の 8 ビット MSX パソコンが甦り、IoT 用コンピュータに (CAMPFIRE)](https://camp-fire.jp/projects/view/648742)
 - [『MSX0 Stack』の操作方法 (Qiita)](https://qiita.com/ht_deko/items/b284cb93ac34e2b77d9a)

# サンプルプログラム

オリジナルの IoT BASIC サンプルは、microSD 内の `DSK\SAMPLE.DSK` に格納されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/0a8c1a89-2415-75bb-82d9-dd3172187fc7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/ad947228-3d1a-2e51-b163-431fb691046e.png)

サンプルの説明は `DOC\SAMPLE.TXT` にあります。

:::note info
まずは BASIC サンプルでオリジナルの動作を確認してみる事をオススメします。
:::

## 移植リスト

移植したサンプルのリストです。サンプルのリンク先はソースコードではなく独立した記事となっています。

| サンプル | 本体 | 説明|
|:---|:---:|:---|
| [ACCEL.PAS](https://qiita.com/ht_deko/items/965eee5f3c701dea826d) | 〇 | Battery Bottom2 の加速度センサの値を取得して表示します。 |
| [ANALOG_G.PAS](https://qiita.com/ht_deko/items/92540899719a9ea71a36) | × | Port B (黒) のピン 36 からのアナログ入力信号で簡単なグラフを描きます。 |
| [DHT_KNJ.PAS](https://qiita.com/ht_deko/items/68ffbc25276d1742095d) | × | 温度湿度センサから取得した値を表示します。 |
| [I2C.PAS](https://qiita.com/ht_deko/items/da12e1d74a294f1b8912) | × | DHT20 に対して直接 I<sup>2</sup>C アクセスを行い温度を取得します。 |
| [INFO.PAS](https://qiita.com/ht_deko/items/e8dbbdbe4d3c0fcf0ef9) | 〇 | システムメニューにある `MSX0 Stack 情報` と同等のプログラムです。 |
| [LED.PAS](https://qiita.com/ht_deko/items/609aa0edcbd792e1f11e) [^2] | 〇 | Face Bottom Base や Battery Bottoms に搭載されている 10 個の LED を iotput 命令を使って制御します。 |
| [PERFORMC.PAS](https://qiita.com/ht_deko/items/47c0bceaaa635ac7e757) | 〇 | 仮想 Z80 の周波数を振ってオーバークロック余力を測定します。 |
| [RCONSOLE.PAS](https://qiita.com/ht_deko/items/cff149a9408a98c46692) | 〇 | リモートコンソールに文字列を送信します。 |
| [SEND2NET.PAS](https://qiita.com/ht_deko/items/9ff95f578cd2ce2cf068) | × | 温度湿度センサーから値を取得しサーバーへ送信します。 |
| [TOUCH_G.PAS](https://qiita.com/ht_deko/items/12ad82bccfaf9b1aef8e) | 〇 | 本体の LCD タッチパネルを使って簡単なお絵描きができます。 |
| [TREE.PAS](https://qiita.com/ht_deko/items/65024c96f97ee9430e5e) | 〇 | ノードを再帰的にスキャンしてリスト表示します。 |
| [WIFILVL.PAS](https://qiita.com/ht_deko/items/2696faddb243d1b99ccd) | 〇 | 接続中の Wi-Fi AP の RSSI (受信信号強度) 値を表示します。 |

:::note
比較対象として BASIC で実行した結果も掲載してあります。Turbo Pascal に興味がなくても何かの参考にはなるかもしれません。
:::

※ `×` になっているものは外部センサーが必要です。


### その他のサンプルリスト

IoT BASIC サンプルにないサンプルのリストです。

| サンプル | 本体 | 説明|
|:---|:---:|:---|
| [BLINK.PAS](https://qiita.com/ht_deko/items/4e089f8e4d2be898bb9b) | × | いわゆる L チカを行います。 |
| [BUZZER.PAS](https://qiita.com/ht_deko/items/8bde669981ab50ffef79) | × | パッシブブザーを鳴らします。 |

※ `×` になっているものは外部センサーが必要です。


## 外部センサー

サンプルプログラムには『MSX0 Stack』に内蔵されていないセンサーを使ったものがあります。

### Grove Beginner Kit

外部センサーは Seeed 社の [『Grove Beginner Kit for Arduino』](https://www.seeedstudio.com/Grove-Beginner-Kit-for-Arduino-p-4549.html) が想定されています。

 - [Grove Beginner Kit for Arduino (Switch Science)](https://www.switch-science.com/products/6361)

中央の『Seeeduino Lotus (Arduino UNO R3 互換)』をプログラミングする事で、各種センサーがそのまま使える製品となっています (画像の状態ですべてのセンサーが結線されています)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/13dfa018-60da-b8a3-1196-8abec697fc8f.png)

クラウドファンディング版『MSX0 Stack』に付属するのは[『Grove Beginner Kit for Arduino』](https://www.seeedstudio.com/Grove-Beginner-Kit-for-Arduino-p-4549.html)のカスタム品である **『Grove Beginner Kit for MSX0』** です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/9ca4c236-b7c2-537b-ba55-7434476fa8a9.png)

:::note
Grove コネクタの位置が裏表になっている以外の差異はありませんので、当記事および関連記事ではオリジナルの方の画像を使っています。
:::

#### 切り離す or 切り離さない？

センサーモジュールを切り離してセンサー単体で使う事もできますが、単体で使う場合には付属の Grove ケーブルで結線する必要があります。もちろん一度切り離したセンサーを元に戻すのは不可能です。


##### ・切り離して使う場合の注意点

センサーモジュールを切り離して使う場合、ビア (穴) でカットしないで下さい。ビアでカットしてしまった場合には、切断面をきれいにして短絡を防止してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/73a7f4ea-cc87-21b5-5159-7191142aa8d4.png)

センサーモジュールと MSX0 を Grove ケーブルで直接接続して使います。

##### ・切り離さないで使う場合の注意点

センサーモジュールを (物理的に) 切り離して使わない場合、『Seeeduino Lotus』に空のスケッチを転送して制御 (デモプログラム) を殺しておく必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/5cbb9a74-27c1-82e8-5ad1-9ad51f540798.png)

これを行わないと、センサーが動作しないか正しい値を返しません。Wiki にある [Arduino IDE の使い方](https://wiki.seeedstudio.com/Grove-Beginner-Kit-For-Arduino/#how-to-get-started-with-arduino)を参考にして空のスケッチを書き込んでください。デモプログラム (初期ファームウェア) を書き込んで元の状態に戻す事も可能です。

MSX0 とは普通に接続してもいいのですが、『Grove Beginner Kit for MSX0』だと Grove コネクタが裏にあるのでそのままでは接続しづらいです。中央の『Seeeduino Lotus』の Grove コネクタに接続しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/7df6b249-98ac-719f-a493-94fd56544c86.png)

:::note
I<sup>2</sup>C タイプのモジュールを挿せる所が 2 つあります。DHT20 等の I<sup>2</sup>C センサーを使う際にはいずれかに接続してください。
:::

**See also:**

 - [Grove Beginner Kit for Arduino (Switch Science)](https://www.switch-science.com/products/6361)
 - [Grove Beginner Kit for Arduino (秋月電子)](https://akizukidenshi.com/catalog/g/gK-15515/)
 - [Grove Beginner Kit For Arduino Wiki ページ (seeedstudio.com)](http://wiki.seeedstudio.com/Grove-Beginner-Kit-For-Arduino/)
 - [Grove Beginner Kit for Arduino ユーザーマニュアル (seeedstudio.com)](https://files.seeedstudio.com/wiki/Grove-Beginner-Kit-For-Arduino/res/Grove-Beginner-Kit-For-ArduinoPDF.pdf) [^1]
 - [Grove Beginner Kit for Arduino 初期ファームウェア (seeedstudio.com)](https://files.seeedstudio.com/wiki/Grove-Beginner-Kit-For-Arduino/res/GroveBeginnerKitFirmwareFINAL.zip) [^1]
 - [Arduino (ht-deko.com)](https://ht-deko.com/arduino/)

### LTE 通信モジュール

クラウドファンディング版『MSX0 Stack』**Plan E** に付属する通信モジュールです。

### LoRaWAN 通信モジュール

クラウドファンディング版『MSX0 Stack』**Plan F** に付属する通信モジュールです。

### PoE 通信モジュール

クラウドファンディング版『MSX0 Stack』**Plan G** に付属する通信モジュール (有線 LAN + PoE モジュール) です。

 - [M5Stack 用 W5500 搭載 LAN モジュール (PoE 対応) (Switch Science)](https://www.switch-science.com/products/7590)
 - [M5Stack 用 W5500 搭載 LAN モジュール (Switch Science)](https://www.switch-science.com/products/7589)
 - [M5Stack Core2 用ポート拡張モジュール (Switch Science)](https://www.switch-science.com/products/8308)

### UART モジュール

『MSX0 Stack』の PortC に接続して使うユニットです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/c9dbbb84-d9c6-e6cb-cff5-a4ea6b8757bc.png)
 
 - [M5Stack 用 GPSユニット [U032] (Switch Science)](https://www.switch-science.com/products/5694)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/38321fd6-0b80-a095-2474-89f8713b0f34.png)

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


## Turbo Pascal
MSX-DOS/2 では CP/M-80 用の『Turbo Pascal』が動作します。CP/M-80 で動作する『Turbo Pascal』の最終バージョンは 3.01A です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/2a9b67d8-4506-4154-08d3-34cd34b4c06b.png)

ここに MSX 固有の機能を使うためのライブラリを整備して、IoT BASIC サンプルを移植しています。

 - [MDL-LIB version 2.2 の使い方 (Qiita)](https://qiita.com/ht_deko/items/6f15aee0bd25b550e4df)
 - [【MSX0】IOT.LIB (Qiita)](https://qiita.com/ht_deko/items/a5c0bf6e7969093beb3c)
 - [【MSX0】LCD.LIB (Qiita)](https://qiita.com/ht_deko/items/084bdf1abaeb12753b38)

:::note info
必要なライブラリは各移植記事の中にも記述してあります。
:::

**See also:**

 - [Turbo Pascal 40 周年！ (Qiita)](https://qiita.com/ht_deko/items/4e0ee4c7f52b777a620b)
 - [Turbo Pascal 3.0 の使い方 (Qiita)](https://qiita.com/ht_deko/items/ec212f5cc17cbe5f718b)
 - [Turbo Pascal (MSX) に関する情報 (Qiita)](https://qiita.com/ht_deko/items/4a622080b58fbc7d865d)

# おわりに
記事中のソースコードは GitHub でも公開されています。

 - [MSX0_TP3/IoT_SAMPLES (GitHub: @ht_deko)](https://github.com/ht-deko/MSX0_TP3/tree/main/IoT_SAMPLES)
 - [MSX0_TP3/IoT_SAMPLES2 (GitHub: @ht_deko)](https://github.com/ht-deko/MSX0_TP3/tree/main/IoT_SAMPLES2)

[^1]: Wiki の [Resources](https://wiki.seeedstudio.com/Grove-Beginner-Kit-For-Arduino/#resources) の所にあります。
[^2]: 要ファームウエア ver0.07.08 以上