ESP32でDOSを動かす

# 目的
　ESP32でDOSを動かせる事は、かなり前から知って居た。
　こんなチップでDOSが動くと言う事は、DOS世代の経験者としては「隔世の感」の一言。
　之の追試を行いたかったが、主にハード入手の問題で手を付けられなかった。
　所が、通販サイトを覗いている時に、稼働できるハードの有るサイトに目が留まった。
  　　◆◆◆　よし、本当にDOSが起動する所をこの目で見てやるぜ　◆◆◆
　汎用のESP32ボードでも、動かす事も出来るといいな。

# 経緯
　ESP32でDOSを動かすプロジェクトは、arduinoのライブラリFabGLのexamples/VGA/PCEmulatorに記載されている。
   　 「[FabGL](https://github.com/fdivitto/FabGL)」
　又、下記サイトに詳しく説明されている。※既に情報が多少旧くなってるが。
   　 「[ht-deko.com PCEmulator (FabGL)](https://ht-deko.com/arduino/fabgl.html)」
　サンプルをarduino開発環境でコンパイルすれば、実行可能となる筈である。

　PCEmulatorはFabGLのVGA表示ライブラリを、8086エミュレータの表示部として使って居る。
   　 ※但し画面はCGA相当であり、DOS/V(日本語DOS)は動かない。
   　 　当方のに勘違いなのかも知れないが。
　ESP32のクロックは公称240MHzであり、数MHzの8086として十分動作する。
   　 ※但しESP32の内蔵RAMが有効な範囲で有り、之を超えると途端に遅くなる。

　PCEmulatorを動かすには、DOSのRAMエリアとして、PSRAM付きのESP32が必要である。
  　※ESP32-WROOM32には、当然搭載されていない。
  　※此処で言ってるPSRAMとは、SPIインターフェースで制御する8ピンの疑似RAM。
   　 何しろ、ESP32の端子が限られているから。当然動作は遅くなる。
　動作可能なハードとしては、下記が考えられる。
   　 ・VGA32
   　 ・ESP32 WROVER DEV 開発ボード
   　 ・ESP32 WROOM32+PSRAM
　当初は入手に難が有ったが、現在では比較的容易に入手可能であろう。

　なお、VGA32以外の場合は、PSRAM付きのESP32の他に下記の追加ハードが必要。
  　・VGAポート
  　・SDカードスロット
  　・PS2キーボード/マウス入力ポート

# VGA32
　FabGLが推奨するハード。無変更で動作する。
　　※当方はアリエクで買ったが、最近はアマゾンでも売っている。
　　※ht-deko.comに記載の変更をしなくても動いた。
　注意事項として、此処に使われているESP32(T-Micro32)は技適非対応。
　電波を出さないようにするか、技適を受ける必要が有る。
  　※技適未取得機器を用いた実験等の特例制度を利用した。
  　　マイナンバーカードを使うと申請は簡単に済む。
　![53.giteki.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/f841e938-8efc-0996-cfa2-ed9f11c96c94.jpeg)


# ESP32 WROVER DEV 開発ボード
　WROVERは技適を受けており、日本国内で適法に運用可能。
　　※アマゾンでも売って居るが、多分セカンドソース。ピン配列とか機能は同じだと思うが。
　　　当方はFREENOVEから直接購入。基板にFREENOVA表記のシルク表示付き。
　　　支払いはペイパル経由なので、多分大丈夫だろう。
　PCEmulatorはこのボードには対応しておらず、若干のソフト変更が必要となる。
![53.WROVER.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/8ad15a2a-240f-b3e0-b736-fe8b3607d3e2.jpeg)

　このボードにはSDカードスロットが付いてるが、VGAの信号とバッティングする。
　　※DOS起動時にSDが見えなくなる。
　そこで下記プログラムに記載のESP32の端子に、外部にSDカードスロットを追加する。
　このプログラムを動作させ、"INIT OK"が表示されれば、SD接続はOKだろう。

```
#include <SD.h>

enum {            // 3.3v:sd.4 gnd:sd.6
    sd_ss   = 13, // sd.2
    sd_mosi = 12, // sd.3
    sd_sck  = 14, // sd.5
    sd_miso = 35  // sd.7
};

void setup() {
  SPI.end(); SPI.begin( sd_sck, sd_miso, sd_mosi, sd_ss );
  Serial.begin(115200); while(!Serial) { delay (10); }
  Serial.println("Card Mount");  
  if(!SD.begin(sd_ss)){
      Serial.println("Card Mount Failed");
      return;
  }
  Serial.println("INIT OK");
}

void loop(){

```
　この接続に合わせてライブラリを変更する。
　Arduino\libraries\FabGL\src\fabutils.h(1236)以降のcase文に下記を追加。
　　※ESP32D0WDQ5 は WROVER-B。ESP32D0WDQ6 は WROOOM-32 を表している。
　　※この変更にはWROOOM-32使用の場合に必要となる記述も併せて記載している。


```

bool FileBrowser::mountSDCard(bool formatOnFail, char const * mountPath, size_t maxFiles, int allocationUnitSize, int MISO, int MOSI, int CLK, int CS)
{
  switch (getChipPackage()) {
    case ChipPackage::ESP32PICOD4:
      MISO = 2;
      MOSI = 12;
      break;
    case ChipPackage::ESP32D0WDQ5:
      MISO = 35;
      MOSI = 12;
      break;
    case ChipPackage::ESP32D0WDQ6:
      MISO = 35;
      MOSI = 12;
      break;
    default:
      break;
  }

```

　CLK(14),CS(13)はディフォルト設定のピンを使用している。

```
　Arduino\libraries\FabGL\src\fabutils.h(887) :  static bool mountSDCard(bool formatOnFail, char const * mountPath, size_t maxFiles = 4, int allocationUnitSize = 16 * 1024, int MISO = 16, int MOSI = 17, int CLK = 14, int CS = 13);

```

　VGA,SD,PS2キーボードを接続して、SDカード(空で可)を刺しておく。
　電源を投入しVGAに「ESP32 PC EMULATOR」の表示が出れば、VGAの接続はOK。
 
 　後は、画面に文句が表示されたら、その部分の接続を確認する。
　　※PS2はマウスを使わなくても、プルアップ抵抗の接続は必要。
　　　無いとキーボードエラーとなり先に進まない。

　ハードエラーが無く、WIFI設定がキー入力できたら、ディスクの選択画面が出る。 　
　放置して置くと、自動的に先頭のFREEDOSがサイトからダウンロードされ、DOSが起動する。

![53.satrt.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/308fcbfb-1c0b-94df-6c05-10845f34fe34.jpeg)
　DOSが動く。
　　※DOS/Vを起動させたので、日本語表示部分がエラーとなっている。
　WindowsでEXCELも動く。
　Trubo-Cも動く
　　※BGIDEMOはTCCでコンパイルしないとLINKエラーになる。
![53.dos.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/5082af3c-c86b-19fc-e149-316b30d0800e.jpeg)




# ESP32 WROOM32+PARAM
　WROOM32はPSRAMを搭載しておらず、追加が必要となる。
　　※PARAMはアリエクで購入。
　当初はブレッドボード接続としたが、メモリとしては認識されるもののDOSは起動しなかった。
 　　※下図の左側。
　メモリチェックプログラム走らせると、エラーになる事が確認できた。

　次にESP32上に搭載し短距離で配線を行った所、DOS起動に行きつく事が出来た。
　但し、之でも動作が不安定で有り、特定操作でフリーズする。
　　※PSRAMの配線が外部に露出しており、之がダメと言う事だろう。
　　　最初からWROVERを使うべきであった。

![53.wroom.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/51e5b4c4-eb5f-efd7-ffaf-9ab2801f028f.jpeg)



# 感想
　FPGAで構築したものより、安定性が今一の様な気もするが、之は之で面白いアプローチだと思う。
　なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。