MEEPROMMER前編

MEEPROMMERというEEPROMライターの記事がありました。

https://ibymemo.hatenablog.com/entry/2021/03/16/185552

これを改造して[EPROMライター](https://qiita.com/yamori813/items/afcc28bfa26a91cfe48b)を作ろうと思いつきました。

ROMはPROM->EPROM->EEPROM->Flashと変わってきました。EPROMはチップの真ん中に窓があり紫外線で消去して、高電圧(25V,21V,12V)をかけて書き込むタイプの部品でした。EEPROMは電気的に消せるようになったので、窓はありません。

EPROMは70年代から90年代にかけて主流だったので、かなりの数生産され中古部品で潤沢にあり入手しやすいと思われます。それに比べるとEEPROMが主流だったのはFlashが出てくるまでの5年程度の期間だったので、生産量はかなりすくなかったと思われます。

DIP 600milのEEPROMは新品を購入できるみたいですが、1000円以上もしてかなり高価です。おそらく同じ容量の中古のEPROMは100円くらいで買えることもあると思います。

大昔の中学生時代にEPROMライターを作ろうとして、いまだに未完成案件になっています。

完成してないのは紫外線のイレーサーの問題があったためでもあるが、今はamazonやaitendoさんで安いのがあるので今度購入するつもりだ。

MEEPROMMERのリポジトリはここです。

https://github.com/mkeller0815/MEEPROMMER

Hardwareの下に非常に分かりやすく書かれた回路図があります。ターゲットは32KByteのEEPROMの28C256のようです。

こちらのターゲットはまずEPROMの27C256にします。ほぼほぼピンは同じなので回路図に沿ってワイヤリングしていきます。

データーシートを見るといくつかピンが違います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/3c0a178c-4d2a-1ff9-cac0-bf7aaf4bab3f.png)

A14は1ピンから27ピンに変更して、VPPはとりあえずVCCにつなぎます。

これで回路は完成なのでPlatformioの設定ファイルを用意して、Arduinoのスケッチを書き込みます。

ワーニングは出ますがコンパイルできます。ボーレートはflashromが115200でうまく動かなかったので57600に変えました。

ファームの用意ができたのでホスト側のプログラムを用意します。MEEPROMMERはJavaで書かれたGUIのプログラムとPythonのコマンドラインのツールが用意されていました。ところがPythonのスクリプトは不完全なものでした。

しかたないので、Pythonで続きを書こうかと思ったのですが、いろいろ調べていたらMEEPROMMERを大きなEEPROM対応にしている人のところに完全なスクリプトがありました。おそらくどっかのアーカイブにはあってコミットし忘れたのかもしれません。

https://github.com/Lana-chan/EEPROMDate

ちょっと変更されているので、MEEPROMMER向けにバックポートしてみました。


```
% ./CommandlineClient/meepromer.py -h
usage: meepromer.py [-h] [-w | -W | -r | -d | -v | -V | -S] [-a ADDRESS]
                    [-o OFFSET] [-b BYTES] [-p PAGE_SIZE] [-f FILE] [-c COM]
                    [-s SPEED]

Meepromer Command Line Interface

optional arguments:
  -h, --help            show this help message and exit
  -w, --write           Write to EPROM
  -W, --write_paged     Fast paged write to EPROM
  -r, --read            Read from EPROM as ascii
  -d, --dump            Dump EPROM to binary file
  -v, --verify          Compare EPROM with file
  -V, --version         Check burner version
  -S, --signature       Check EPROM Electonic Signature (set A9 to 12V)
  -a ADDRESS, --address ADDRESS
                        Starting eeprom address (as hex), default 0
  -o OFFSET, --offset OFFSET
                        Input file offset (as hex), default 0
  -b BYTES, --bytes BYTES
                        Number of kBytes to r/w, default 32
  -p PAGE_SIZE, --page_size PAGE_SIZE
                        Number of bytes per EPROM page e.g.:CAT28C*=32,
                        AT28C*=64, X28C*=64, default 32
  -f FILE, --file FILE  Name of data file
  -c COM, --com COM     Com port address
  -s SPEED, --speed SPEED
                        Com port baud, default 57600

Read source for further information
```

EPROMはVPPが12Vになった256kBitの頃から部品番号を返す仕組み（シグネチャ）が入りました。メーカーが1バイトで部品番号が1バイトの2バイトになります。256しかメーカーがない平和な時代でした。FlashになるとCFI仕様になり、メーカーと部品番号が2バイトづつに拡張されます。USBも2バイトづつですね。

これを読めるように拡張してみます。まずArudinoのファームウエアーにSを追加して2バイトを読んで返すようにします。

Pythonのスクリプトにもコマンドを追加します。

シグネチャを読み出すにはA9ラインに12Vを加える必要があるので595から切り離して、12Vを加えられるようにします。

![IMG_20211228_090426.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/8a92c708-6a61-6a24-d7c5-e9dd0adf29f8.jpeg)

```
% ./CommandlineClient/meepromer.py -S -c /dev/cuaU0
EPROM Signature:
20 8D
ST M27C256B
ST M27C256B*PLCC32
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/c5bd47d8-e49c-5eb5-a110-29570a521a38.png)

読めました。デバイスハックの一歩目は正しい値が読めるところから始まります。

VPP関係の部品が手元にないので、書き込みについては後日いじります。

https://github.com/yamori813/MEEPROMMER

まずは27C256で使えるようにして、その後他のチップもサポートしないな。

|Type|Pin|Size|VPP|Address|Signature|
|:--|:--|:--|:--|:--|:--|
|27C32|24|4K|21V|A0-A11|NO|
|27C64|28|8K|21V|A0-A12|NO|
|27C128|28|16K|21V|A0-A13|NO|
|27C256|28|32K|12V|A0-A14|YES|
|27C512|28|64K|12V|A0-A15|YES|

MC34063で5Vを昇圧してVPPを作るようにしました。

![写真（2022-04-09 11.41）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/6bb65933-d134-2f26-bb16-c128c89f018e.jpeg)

適当に実装したら、コイルとレバーがギリギリぶつからない状態でした。

まずは64,256をサポートしたい。64はPGMピンがあり256にはない。しかしEEPROMにはPGMと同等のWEが復活している。64のEPROMを動くようにしてから256対応を考えるのが良さそう。