PCEmulator (FabGL)

FabGL は (主に) ESP32 用のグラフィックライブラリです。I2C / SPI LCD や VGA 出力ディスプレイドライバーが実装されています。

PCEmulator は 8086 ベースの PC エミュレータで、FabGL のサンプルスケッチの一つです。FreeDOS, MS-DOS, CP/M-86, Linux-ELK, Windows 3.0 等が動作します。



必要なハードウェア

PCEmulator に必要なものは次の通りです。

ESP32 で PSRAM 付きとなると ESP32-WROVER となります。ESP32-WROOM-32 ではダメです。PSRAM を外付けする事もできますが、部品点数と難易度が上がってしまうため、ESP32-WROVER モジュールが載った ESP32-DevKitC を使う事にします。

FabGL を使うだけだったら ESP32-WROOM-32 モジュールが載った ESP32-DevKitC を使ってもよく、例えば VIC20 エミュレータ等は ESP32-WROOM-32 でも動作します。

開発ボード

FabGL 開発用ボードあるいはその互換品があると便利です。

TTGO VGA32 がコンパクトでいいのですが、技適を通っていないため、日本国内では常用できません (電波を出せません)。しかしながら PCEmulator はデフォルト状態だと Wi-Fi が必要です。

TTGO VGA32 を購入する際は必ず ver1.4 にしましょう。それ以前のバージョンには microSD カードスロットがありません。

See Also:



ブレッドボードによる構築

FabGL 開発用ボードと同等のものをブレッドボードで構築する事もできます。

先述の通り、PCEmulator を動作させるには ESP32-WROVER モジュールが載った ESP32-DevKitC が必要となります。部品表は次の通りです。

部品 数量 備考
ESP32-DevKitC-Vxx1ESP32-WROVER 搭載
6 穴ブレッドボード2
VGA コネクタ (DE-15) 変換基板1
PS/2 コネクタ (ミニ DIN-6) 変換基板2
3.5mm オーディオコネクタ変換基板1
microSD ブレークアウト基板1プルアップ、レベル変換なし
ピンヘッダ適当
抵抗適当後述
電解コンデンサ 10μF1
セラミックコンデンサ 0.1μF1
ジャンパーワイヤー適当
ジャンパーケーブル適当

必要な抵抗の明細は次の通りです。VGA コネクタ用の 400Ωと800Ωの抵抗はまず入手できないので、他の抵抗を組み合わせて使います。PS/2 コネクタ用の 2kΩの抵抗も (抵抗パックにあまり含まれていないという意味で) 入手難ですが、プルアップ抵抗なので、2.2kΩを使っても問題ないと思います。配線の関係で他の抵抗を組み合わせて使うのは困難です。

抵抗値 数量 備考
120Ω4
150Ω1
270Ω1
400Ω3代替: 180Ω + 220Ω または 200Ω + 200Ω
800Ω3代替: 330Ω + 470Ω または 120Ω + 680Ω
2kΩ4代替: 2.2kΩ または 2.2kΩ || 22kΩ(並列)
10kΩ1SD カードプルアップ用。不要かも。

他に必要なものは次の通りです。

See Also:

配線

6 穴ブレッドボードを 2 つ繋ぎ、ジャンパーワイヤーや抵抗、コンデンサを配置します。

コンデンサの配置が分かりづらいですが、次のようになっています。電解コンデンサは極性 (向き) に注意してください。

各種変換基板を配置します。VGA 端子の所は工夫するとちょっとだけコンパクトにできます。

ESP32-DevKitC を配置します。

ジャンパーケーブルを配置します。これで完成です。

余談ですが、ESP32-WROOM-32 (rev.1) のような ESP32 チップモデルが ESP32D0WDQ6 の場合には次のような配線になります。SD カード用の配線が 2 本だけ異なります。

ESP32-WROVER では GPIO 16 および 17 が使えないので、ESP32-WROVER が載った ESP32-DevKitC ではこの配線はできない事になりますが、そもそも ESP32-WROVER が載った ESP32-DevKitC で SoC が ESP32D0WDQ6 のものは存在しません。

ESP32D0WDQ6 ESP32D0WDQ5 ESP32PICOD4
・ESP32-WROOM-32 rev.1 ・ESP32-WROVER
・ESP32-WROOM-32D
・ESP32-WROOM-32E
・TTGO VGA32 ver1.4
MISO16352
MOSI171212
SCK14
SS13

ESP32 のチップモデルは ESP32 用のスケッチ GetChipID を実行すると判別できます。[ファイル | スケッチ例 | ESP32 | ChipID | GetChipID] です。

See Also:




動作確認

まずは Arduino IDE に Arduino core for the ESP32 を導入しておく必要があります。導入がお済みでない方は ESP32 WROOM-32 の記事を参考にしてください。

※ 2021/09/01 現在: ESP32 パッケージのバージョンが 2.0.0.0 だと microSD カードが使えないようです。ver 1.0.6 をインストールしてください。

FabGL はライブラリマネージャからインストールできます。[スケッチ | ライブラリをインクルード |ライブラリを管理...] から FabGL を探してインストールします。

※ 2021/09/01 現在: FabGL パッケージを GitHub から持ってくると microSD からのファイルロードで失敗する事があるようです。ライブラリマネージャから ver 1.0.4 をインストールしてください。


SD カードの準備

PCEmulator.ino に書かれているイメージファイルを事前にダウンロードしておきます。

CD \WORK
curl -OL http://www.fabglib.org/downloads/A_freedos.img
curl -OL http://www.fabglib.org/downloads/C_dosdev.img
curl -OL http://www.fabglib.org/downloads/C_winherc.img
curl -OL http://www.fabglib.org/downloads/C_dosprog.img
curl -OL http://www.fabglib.org/downloads/A_MSDOS331.img
curl -OL http://www.fabglib.org/downloads/A_ELK040.img
curl -OL http://www.fabglib.org/downloads/A_CPM86.img

ダウンロードしたファイルを microSD カードのルートにコピーしておきます。イメージファイルを事前ダウンロードしない場合には Wi-Fi 接続が必要となります。


スケッチのコンパイルとインストール

[ファイル | スケッチ例 | FabGL | VGA | PCEmulator] を開き、ボードの設定を次のように変更します。

項目 設定値
ボードESP32 Dev Module
Partition SchemeHuge App (3MB No OTA/1MB SPIFSS)
PSRAMDisabled
シリアルポートDevKitC のシリアルポート

後は普通にコンパイルして転送されるのを待つだけです。転送が終わったら、一旦 USB ケーブルを抜いておきます。


PCEmulator の起動

VGA ケーブル、キーボード、マウス、microSD、3.5mm オーディオケーブルを接続し、USB ケーブルを挿すと PCEmulator が起動します。

microSD カードモジュールの接続がうまくいってなかったり、microSD カードを挿していないとエラーになります。

初回は Wi-Fi の設定が必要です。イメージファイルを事前ダウンロードした場合は、Wi-Fi Configulation をスキップできます。

初回の Wi-Fi 設定で [Yes] を押しても "Configure Wi-Wi?" のダイアログが繰り返し表示される場合は、USB 充電器などを使って電力を供給してください (100均にあるようなもので充分だと思います)。シリアルモニタに "brownout detector was triggered" が出ている時は電力不足です。

Wi-Fi の設定が完了すると Disk Selector で起動するディスクを選択できます。イメージファイルを事前ダウンロードしていない (SD カードにファイルが存在しない) 場合、イメージファイルがダウンロードされます。バージョンによっては [Edit] ボタンを押すと構成を編集する事ができます。

次回の起動からは Wi-Fi の設定は表示されません。


Wi-Fi の接続先を変更したい

PCEmulator.ino を書き換えます。setup() 中の preferences.clear(); の行をアンコメント (コメントアウトを外す) して一度これで起動します。

void setup()
{
  Serial.begin(115200); delay(500); printf("\n\n\nReset\n\n");// DEBUG ONLY

  disableCore0WDT();
  delay(100); // experienced crashes without this delay!
  disableCore1WDT();

  preferences.begin("PCEmulator"false);

  // uncomment to clear preferences
  preferences.clear(); // <- アンコメント

  ...

再度この行をコメントアウトしてコンパイルすると、Wi-Fi 設定が行えるようになります。


Wi-Fi を使いたくない

イメージファイルを先に DL していて Wi-Fi を使いたくない場合には、PCEmulator.ino を書き換えます。

void setup()
{

  ...

  // uncomment to format SD!
  //FileBrowser::format(fabgl::DriveType::SDCard, 0);

  //updateDateTime(); // <- コメントアウト

  // show a list of disks configurations
  StringList dconfs;

  ...

具体的には setup() 中の updateDateTime(); の行をコメントアウトします。但し、NTP から現在日付/時刻を持ってこないので、各 OS で日付/時刻を手動設定しなくてはなりません。


自分の好きな OS イメージを構築したい

アバンダンウェアとはいえ、PCEmulator のイメージファイルに含まれるソフトウェアはとってもグレーなので、利用に問題のないソフトウェアを動かしたくなります。例として、無償公開されている Turbo C / Turbo Pascal をインストールしてみます。A ドライブが FreeDOS、C ドライブに Turbo C / Turbo Pascal 等です。

  1. 事前ダウンロードした C_dosdev.img をコピーし、C_turbodev.img にリネームします。C_dosdev.img は 31MB の HDD イメージなので、これを空にして使うのが簡単です。
  2. 次の記事を参考にして Turbo C / Turbo Pascal の実行時ファイル群を収集します。A ドライブのディスクを交換できないのでインストーラは使えません。
  3. ImDisk をインストールします。ImDisk はディスクイメージファイルを仮想ドライブとしてマウントするアプリケーションです。
  4. コントロールパネルから ImDisk を起動します。

  5. ドライブレターを M: に変更し、[...] ボタンを押して C_turbodev.img を指定します。
  6. パーティションを選択して [OK] を押します。
  7. パラメータが自動で埋められるので [OK] を押します。
  8. C_turbodev.img が M: ドライブとしてマウントされました。
  9. Explorer で一旦すべてのファイルを削除し、Turbo C / Pascal の実行時ファイル群をコピーします。
  10. 作業が終わったら、ImDisk でマウントされたドライブを選択し、[Remove] を押してアンマウントします。
  11. 作業した C_turbodev.img を microSD にコピーしておきます。
  12. PCEmulator.ino の diskConfs を編集します。
    static const DiskConf diskConfs[] = {
      { "FreeDOS (A:)",                                "http://www.fabglib.org/downloads/A_freedos.img",  nullptr },
      { "FreeDOS (A:) + Turbo Programming Tools (C:)", "http://www.fabglib.org/downloads/A_freedos.img", "/C_turbodev.img" },
      { "FreeDOS (A:) + DOS Programming Tools (C:)",   "http://www.fabglib.org/downloads/A_freedos.img",  "http://www.fabglib.org/downloads/C_dosdev.img" },
      { "FreeDOS (A:) + Windows 3.0 Hercules (C:)",    "http://www.fabglib.org/downloads/A_freedos.img",  "http://www.fabglib.org/downloads/C_winherc.img" },
      { "FreeDOS (A:) + DOS Programs and Games (C:)",  "http://www.fabglib.org/downloads/A_freedos.img",  "http://www.fabglib.org/downloads/C_dosprog.img" },
      { "MS-DOS 3.31 (A:)",                            "http://www.fabglib.org/downloads/A_MSDOS331.img", nullptr },
      { "Linux ELKS 0.4.0",                            "http://www.fabglib.org/downloads/A_ELK040.img",   nullptr },
      { "CP/M 86 + Turbo Pascal 3",                    "http://www.fabglib.org/downloads/A_CPM86.img",    nullptr },
    };
    赤字の部分を追記します。ローカルファイルを指定したい場合には先頭に / (スラッシュ) を付けるとよいようです。新しいバージョンの場合には mconf.h の DefaultConfFile を編集します。
    static const char DefaultConfFile[] =
      "desc \"FreeDOS (A:)\"                                dska http://www.fabglib.org/downloads/A_freedos.img" NL
      "desc \"FreeDOS (A:) + Turbo Programming Tools (C:)\" dska http://www.fabglib.org/downloads/A_freedos.img dskc C_turbodev.img" NL
      "desc \"FreeDOS (A:) + DOS Programming Tools (C:)\"   dska http://www.fabglib.org/downloads/A_freedos.img dskc http://www.fabglib.org/downloads/C_dosdev.img" NL
      "desc \"FreeDOS (A:) + Windows 3.0 Hercules (C:)\"    dska http://www.fabglib.org/downloads/A_freedos.img dskc http://www.fabglib.org/downloads/C_winherc.img" NL
      "desc \"FreeDOS (A:) + DOS Programs and Games (C:)\"  dska http://www.fabglib.org/downloads/A_freedos.img dskc http://www.fabglib.org/downloads/C_dosprog.img" NL
      "desc \"MS-DOS 3.31 (A:)\"                            dska http://www.fabglib.org/downloads/A_MSDOS331.img" NL
      "desc \"Linux ELKS 0.4.0\"                            dska http://www.fabglib.org/downloads/A_ELK040.img" NL
      "desc \"CP/M 86 + Turbo Pascal 3\"                    dska http://www.fabglib.org/downloads/A_CPM86.img" NL;
    microSD カード内に mconfs.txt が存在する場合にはそこから設定が読み込まれます。スケッチを変更した場合には microSD カード内の mconfs.txt を削除してください。逆に mconfs.txt を編集して構成を変更する事も出来ます。
  13. スケッチをコンパイルして転送します。

無事に Turbo Pascal が動作しました。

スバラシイ!


VGA ケーブルのネジが締められない?

ブレッドボードなので、ネジ締めなくったって構わな...あぁ、TTGO (察し)。

VGA コネクタに頭の短い (パネル固定用) ネジが使われているので届かないのです。

簡易的には M3 のスプリングワッシャー (ばね座金) を噛ませれば OK です (VGA コネクタのネジは UNC #4-40 で、径は 2.8mm なのでそれなりに合います)。一枚で足りないようなら普通のワッシャー (平座金) と組み合わせてください。どちらもホームセンターで普通に買えると思います。

PC の古いマザーボードから非パネル固定用のネジだけ抜いてくるのもテです。

但し、キレイに外したりハメたりするには対辺 (二面幅) 4.8mm (3/16inch) のナットドライバーが必要です。

この対辺 4.8mm なナットドライバーは確かに便利なのですが、ほぼ VGA コネクタ専用なので新規で買うのはためらわれます (D-SUB には対辺 5mm のネジが使われる事もあるため、すべての VGA コネクタのネジが外せるとは限りません)。対辺 5mm の (M2.5) ナットドライバーでも回せますが、物によってはコネクタのシェルと干渉するかもしれません。ラジオペンチで無理矢理回す事もできますが、ネジが傷だらけになるので、気になる方はラジオペンチに熱収縮チューブを被せたりビニールテープを巻くなどの工夫をしてください。

See Also:


日本語 PS/2 キーボードを使いたい

日本語 PS/2 キーボードを使うだけだったら使えるのですが、一部のキーが刻印通りに打てません。

FreeDOS でキーボードレイアウトを日本語に変更する手順は次の通りです。

  1. FreeDOS 1.0 のアーカイブから keybs.zipkeybx.zip をダウンロードする。
  2. keybs.zip から JP.KEY (source\keydos にある) を抽出する。
  3. keybx.zip から KC.EXEKEYB.EXE (bin にある) を抽出する。
  4. 3 つのファイルを A_freedos.img の中の \FREEDOS\BIN へコピーする。
  5. PCEmulator を起動する。
  6. KC.EXE を使って JP.KEY から JP.KL を生成する。
    A:\>CD \FREEDOS\BIN
    A:\FREEDOS\BIN>KC.EXE jp.key JP.KL
    KEY file Compiler version 2.1 [2005/08/10] (creates KL ver 1.1 )
    Copyright (c) 2003-2005 by Aitor Santamaria_Merino (under GPL)
    Compiling jp.key...
    Linking jp.key...
    File JP.KL succesfully compiled (0 Errors)
  7. JP.KL が正しく生成されたら KC.EXE はもう不要なので削除する。
    A:\FREEDOS\BIN>DEL KC.EXE
  8. KEYB.EXE を実行する。
    A:\FREEDOS\BIN>KEYB JP
    FreeDOS KEYB 2.0 (pre4) - (c) Aitor Santamaria Merino - GNU GPL 2.0
    Keyboard layout    : A:\FREEDOS\BIN\JP.KL:JP [932]  (4)
  9. 記号キーを叩いて特に問題なさそうだったら AUTOEXEC.BAT に KEYB.EXE を記述する。
    A:\>EDIT A:\AUTOEXEC.BAT
    @echo off 
    set dosdir=A:\FREEDOS
    set PATH=A:\FREEDOS\bin;A:\BASIC
    set NLSPATH=%dosdir%\NLS 
    set temp=%dosdir%\temp
    set tmp=%dosdir%\temp
    
    ctmouse
    KEYB JP
    
    echo.
    echo. Welcome to FreeDOS on ESP32!
    echo. 2021 - Fabrizio Di Vittorio (www.fabgl.com)
    echo.
    
    if exist c:\nul c:
    if exist win.bat win.bat
    

もっと簡単なやり方があるような気はしますが、とりあえずはこれで日本語 PS/2 キーボードが使えるようになります。

この方法が使えるのは OS が FreeDOS の場合だけです。他の OS でも刻印通りに文字を入力したいのであれば、やはり英語キーボードを用意した方がいいと思います。


ここにある情報が役に立って、「調べる手間が省けたからオマイに飯でもおごってやるよ」 というハートウォーミングな方がいらっしゃいましたら、下のボタンからどうぞ。

メニュー: