ファミコンの自作カセットが作りたくて、いろいろ準備をしています。前回はUV-EPROMの消去用の紫外線ライトの実験でした。
今回は、ROMライターを作りたいと思います。
ROMライターって作れるのか
ROMライターとは
ROMライターとは、プログラムの書かれていない生のROMにデータやプログラムを書き込む(昔は焼くと言っていました)装置です。
こんな感じの装置で、パソコンからデータを送って、ROMの書き込み信号に変換し、生のROMに書き込んでいきます。
書き込むにはどんな信号が必要なのか
Aliexpressで購入した、STmicroのUV-EPROMのM27C256のデータシートがこちらです。
電源の種類
通常の電源電圧は5V、消費電流は30mA程度とあります。最近の3.3Vでは動作しないので、5Vのマイコンでライターを作ることにします。arduinoにしようかな。
データシートの書き込みの説明をみてみます。
プログラミグモードにするには、Vppを12.75Vに、Vccを6.25Vにする。と、書いてあります。ライターには12.75Vと6.25Vの電源が必要なんですね。
- リード時の電源:5V
- ライト時の電源:12.75Vと6.25V
ということがわかりました。
書き込み制御の方法
次は、書き込みにどのような信号が必要か調べます。データシートの書き込み波形の図を見てみます。
- A0-A14:アドレス指定
- Q0-A7:データの指定
- Vpp:ライトモードにするための信号(通常5Vで、ライトモードにするために12.75Vに上げる)
- Vcc:電源(ライトモードにするためには6.25Vに上げる)
- /E(/CS):書き込みタイミングを指定
- /G(/OE):読み出しタイミングを指定
結構簡単な制御方法ですね。まとめると
- Vppを12.75V、Vccを6.25Vにしてライトモードにする
- アドレスとデータを指定する
- /EにLowのパルスを入れると書き込まれる
- /GをLowにすると書き込んだデータが読み出されるのでチェックする
です。arduinoでもできそうですね。
arduinoでROMライターを作る
IOピンが足りるかな?
制御方法が難しくなかったので、5Vのマイコンであるarduinoでライターを作ることを検討しようと思います。問題はarduinoのIOピンが足りるかです。
- アドレス 15本
- データ 8本
- Vpp、Vccをライトモードにするための信号 1本
- /E、/G 2本
合計、26本必要です。各arduinoのユーザが利用できるIOピン数は
- UNO:18本
- Leonardo:21本
- MEGA:46本
くらいでした。UNOだと全然足りず、MEGAだとかなり余裕で足ります。MEGAのボードは値段がちょっと高いので、Leonardoで考えたいと思います。Leonardoも普通に買うと高いので、Leonardoに使われている、Atmega32U4を使おうと思います。
IOピンの節約
データピンはライト動作と、リード動作で、双方向の信号のやりとりが必要ですが、アドレス線はマイコンからEP-ROMへの片方向です。なので、アドレスの15本はシフトレジスターを使って、IO数を節約します。
具体的には74HC595というメジャーなシフトレジスタを2段使って、SPI信号を16ビットのパラレル信号に変換します。
ブロック図にすると、こんな感じです。たった3本のIOで、ROMのアドレス線15本分がまかなえます。(注意:図のMOSIとIO?が逆になってした)もし、もっと大きなROMに書き込みたくなった時には、シフトレジスタを追加するだけでアドレスが拡張できるので、簡単に対応できますね。
回路の設計
ROM1個用
先ほどのブロック図に、電源の制御、制御信号、データバスを追加してみました(注意:図のMOSIとIO?が逆になってした)。アドレスバスをシフトレジスタにしたので、必要なIOピンがかなり少なくて済みました。全部で14本です。Atmega32U4(Leonardo)のピンにはまだ余裕があるので、2つのROMに書き込めるようにしようと思います。
というのも、ファミコンのカセットの中には、プログラムROMとキャラクターROMの2つが入っています。
写真の右側がプログラムROM、左側がキャラクターROMです。ファミコンのカセットのROMを作る時には、これらの2つのROMにデータを書き込む必要があります。
2つのROMをセットできて、プログラムROMもキャラクターROMも一緒に書き込むことができれば便利です。
ROM2個用に拡張
2個のROMが制御できるよう拡張したのが、この回路図です。どのIOピンを使うかのアサインもしてみました。Atmega32U4(Leonardo)で2個のROMに書き込みができそうです。
電源の切り替え回路
EP-ROMにデータを書き込む時には、Vppに12.75V、Vccを6.25Vにしてライトモードにする必要があります。このための電源と、電圧を切り替える回路を考えます。電源回路は、安いDCDCモジュールを使って、5Vから12.75Vと6.25Vを作ります。
これを使います。ボリュームを調節することで、25V近くまで昇圧することができます。このDCCDを使って、こんな感じの回路を考えます。
これを回路に置き換えるとこんな感じです。
ダイオードを使った電源のOR回路になっています。通常は5Vが出力されていますが、Pch MOS-FETがONすると、DCDCの電圧の方が高いために、DCDCコンバータの電圧が出力されます。
Pch MOS-FETは負論理(ゲートを0VにするとFETがON)なので、マイコンから制御しやすいように、トランジスタで正論理に変換しています。これによって、IOがLowの時はPch MOS-FETがOFFし、出力には5Vが出力され、Hiの時はPch MOS-FETがONしてDCDCの電圧が出力されるようになります。
Pch MOS-FETはON抵抗が小さければ何でもよく、秋月電子のIRLML6402などが使えます。トランジスタはNchの物であれば何でもよく、2SC1815など何でもいいです。
注意が必要なのは、回路の最後にあるダイオードによって電圧降下が起こるため、DCDCコンバータの電圧は、6.25Vや12.75Vに設定するのではなく、ダイオードを通過した後の電圧が6.25Vや12.75Vになるように調整します。
基板に実装
半田付け開始
回路が決定したので、回路を作ります。こんな感じの配置で行こうと思います。
数時間かかり、部品の実装が終わりました。次は基板の裏の配線です。
数時間かけて一通り配線も終わったので、動作テストです。あちこちのピンに5Vをつないだりして、誤配線がないかチェックです。電源の切り替えも回路もうまく動作しています。なかなかいい感じに動作しました。
完成
アドレスバス、データバス、制御信号とそれぞれに確認用のLEDを付けました。どの信号がONしているのかわかるので、書き込み用のプログラムのデバッグに便利です。
この基板、不思議な形をしていますが、これは自作のマイコン基板に刺すためです。
カセットArduino
今制作中のArduino Leonardo互換のマイコンボードです。ファミコンのカセットスロットがついていて、全てのIOピンと、32bitのパラレル出力がつながっています。ArduinoにHAT基板を接続するように、拡張ボードをこのカセットスロットに差し込んで使います。カセットArduinoという名称で、現在開発中です。
例えば、こんなカセットを刺すと、
時計が作れたりします。こんな感じです。いいでしょ。
それでもって、今回作った基板は、
ROMライタカセットになります。ROMが縦に刺さっているなんて前代未聞ですが、面白いでしょ。この仕組み。
回路が完成したので、今度はプログラムの作成です。うまく書き込めるようになるでしょうか????
2019.6.21 つづき ROMに書き込んだり読み込んだりできるようになりました
コメント
凄いです。自作カセットはいつか作りたいと思っています。
このブログで勉強させていただきます。
たぁぼう様
コメントありがとうございます。とても嬉しいです。私も勉強中ですが、いい情報がありましたら記事にしていきますので、今後ともよろしくお願いします。
UV-EPROMの書き込みは1バイト書くたびにベリファイする方法と全部書いてから通常の読み出しを全部やるほうほうがあり、後者のほうが速いです。
案外電流を食いますので試してみてください。
kaoaruさん コメントありがとうごさいます。
プログラムでは1バイト毎にリードしていました。ライトしてからリードすれば高速化できますね。改良しようと思います。
いいアイデアありがとうごさいます!!