ＥＳＰ３２でＧＡＭＥエミュレーターを動かす

## 概要
　ESP32で(著名な)家庭用ＧＡＭＥエミュレーターを動かしているサイトを見つけたので、追試を試みる。
　　[esp32-nesemu ]　https://github.com/espressif/esp32-nesemu
　うまくいったらコンパクトに纏めて携帯型にできないかと妄想を膨らます。
##　本家の方で下記の現象は 2017年10月26日に改修されたようです。
　　こちらを見て修正する必要はありません。

## やること、やった事
#　1.ESP32等の購入
　　ESP32は外部接続に使うピンが出ていたら、何でも構わないと思う。
　　　LCD接続　 MISO 25,MOSI 23,CLK 19,CS 22,DC 21,RST 18,BCKL 5 
　　　キー接続　CLK 14,DAT 27,ATT 16,CMD 2 
　　　※ピンは変更可能だろうが方法がよく判らない。
　　こんなのをebayで買ってみたが、秋月で買ったほうが安心かも。
　　※幅が少し狭くブレッドボードを使うのに少し便利だった。
　　　買った後でよく見たらESP-32Sとなっていたが、中身はESP32D0WDQ6だったので一安心。 
　　　でも、このボードは921600bpsでは通信できませんでした。(しくしく)

　ESP32 EPS-32s Dev Board WiFi+Bluetooth Module for Arduino Programmable Lua UK 
![s-l300.jpg](https://qiita-image-store.s3.amazonaws.com/0/159764/3c23a7f3-3abe-1699-af89-9a56399bc064.jpeg)
　これ以外に、下記が必要となります。
　　(1)ＬＣＤ　320x240 SPI ILI9341 と書かれていればＯＫと思います。
　　(2)コントローラー　PS1/PS2用
　　(3)ブレッドボード(と配線材少々)
# 2.ESP32-IDFの導入
　　導入方法はネットに色々書かれているので、自分で調べてください。
　　Hello Worldがコンパイル、実行できればＯＫです。
# 3.ソースプログラム
　　上記ＵＲＬからダウンロード(Clone or Downloadを押す)して、適当な位置に格納。
　　ここでは(ホームディレクトリ)/esp/nesemuに格納しています。
# 4.配線
　　ブレッドボード上で配線しています(こんな感じ)。ピンは元ネタの表記に合わす。(丸投げですな)
　　ps2のコントローラーのピン配置はここを見ました。
　　http://store.curiousinventor.com/guides/PS2/

![esp32-emu-tkshoot.jpg](https://qiita-image-store.s3.amazonaws.com/0/159764/389ceb00-9de4-98dd-ab01-2040ee43a2e4.jpeg)
# 5.コンパイルと実行
　　IDFを開いてコマンドを実行
　　　make menuconfig
　　　　COMポートと通信速度をボードに合わせます。
　　　　※COM6なのに"/dev/ttyS5"でないと繋がりませんでした。
　　　make flash
　　　　プログラムをflashに書き込みます。
　　　./flashrom.sh xxxx.nes
　　　　※xxxx.nesはエミュレーションプログラムです。(例えばSHOOT.nes)
　　　　　flashrom.shはPATHが設定されていないとespefuse.pyが動作しません。この場合は、
　　　　　flashrom.sh内のespefuse.pyを../esp-idf/components/esptool_py/esptool/esptool.py
　　　　　のように、格納ディレクトリを追加してください。
　　ESP32をリセットするとプログラムが起動....しないと思います。
　　これで起動したらこの投稿は没ネタということになったと思います。
　　※本家が5カ月更新がなかったので放置プレイかと思ったのですが、早くも没ネタになってしまいました。(しくしく)
# 6.起動するために
　　GitHubに記載のままでは起動しませんでした。
　　※落とし穴のようですが、恐らくIDFのライブラリの動作が変わったためと思います。
　　LogicAnalyzerで信号を調べて見ると、LCDの制御信号は出ているようですが、SPIの信号が出ていません。
　　初期化に失敗しているのではないかと当たりをつけて、別のプログラムから初期化ルーチンを持って来ました。
　　大当たり、画像が表示されました。
　　結論としてはcomponents\nofrendo-esp32\spi_lcd.cに下記を追加します。

```
#include "spi_lcd.h"
#include "driver/spi_master.h"                 // 追加
#define PIN_NUM_MISO CONFIG_HW_LCD_MISO_GPIO

```
```
static void spi_master_init()
{
    spi_bus_config_t buscfg={       // 追加
        .miso_io_num=PIN_NUM_MISO,  // 追加
        .mosi_io_num=PIN_NUM_MOSI,  // 追加
        .sclk_io_num=PIN_NUM_CLK,   // 追加
        .quadwp_io_num=-1,          // 追加
        .quadhd_io_num=-1           // 追加
    };                              // 追加
    spi_bus_initialize(VSPI_HOST, &buscfg, 1);    //Initialize the SPI bus // 追加
```
# 7.音について
　　menuconfigにAnalog audio on GPIO26の設定がありますが、これを設定するとout of memoryで落ちます。
　　components\nofrendo\memguard.cのdebugging flagをfalseにする事により、GPIO26より音がでますが、
　　内部的にはヒープ不足でアロケーションエラーを起こしているようで、何が起こるかは保証の限りではありません。
　　※TkShootでは自機が衝突したときに音が出ます。マイク入力に入れた場合は大きな音にびっくりしないように。
```
/* debugging flag */
//bool mem_debug = true;
bool mem_debug = false;
```

## その他
　上記記載のハード、ソフトは無保証であり、各自の責任においてご利用願います。
　エミュレーションプログラムとして下記を利用して、動作確認を行いました。製作者には感謝いたします。
　[TkShoot 1.00]　http://hp.vector.co.jp/authors/VA042397/nes/games.html
　蛇足ですが、今回動作確認に使用したエミュレーションプログラムは著作権フリーと明記されておりますが、
　世の中にはフリーでないプログラムも存在しますので、注意の上で遊ばれることをお勧めします。