部屋をかたずけていたら、NESのコントローラーが出てきた、本体は無い、多分これは、20年くらい前のもので、その時務めていた会社(ライブプランニング)からNESのソフトと本体など借りた時(丁度「暴れん坊天狗」の NES 版「Zombie Nation」を作っていた頃だ)本体は返したがコントローラーだけ自宅に置き去りになったものと思う。
折角なので、RX65N Envision kit のNESエミュレーターのパッドとして使ってみた。
ネットを探して、コントローラーのピンアサインを探して、コネクタを付けた。
白:Vcc(電源、通常+5V)
茶:GND(電源、0V)
橙:P/S(パラレル、シフト切り替え)
赤:CLK(クロック)
黄:OUT(シリアル出力)
ところが・・・
ボタンを押しても反応が無い・・・
配線を確認したが、問題無さそう、ファミコン互換パッドでは問題無く動作する。
これは多分、クロックの遅延が足りないものと思い、クロックの遅延ループを6回から20回にして動作するようになった。
この純正パッドはC-MOS「4021B」を使っているが、互換パッドに使われているICは、4021Bの互換ICで、クロックの許容範囲が広いものと思う。
uint8_t update(uint32_t cnt = 20) noexcept
{
P_S::P = 0; // seirial
uint8_t d = 0;
for(uint8_t i = 0; i < 8; ++i) {
d <<= 1;
if(!OUT::P()) ++d;
CLK::P = 1;
utils::delay::loop(cnt);
CLK::P = 0;
utils::delay::loop(cnt);
}
P_S::P = 1; // parallel
data_ = d;
return data_;
}
上記のように、ループ数を「6」から「20」に変更した。
※120MHz動作の場合なので、もっとCPUクロックが速い場合は調整する必要がある。
static void loop(uint32_t cnt)
{
while(cnt > 0) {
asm("nop");
--cnt;
}
}
loop 関数は上記のように「nop」を実行するだけのものだ。
RX65N Envision Kit には、上記のように接続してある。
FAMIPAD.hpp
今回の話とは関係無いが、写真の圧着工具、安い割りにはなかなかに良い!
この小さいコネクタの圧着では、まともにできずに、ラジオペンチで修正したり、最悪ハンダ付けしたりと苦労してきたが、この工具なら、ほぼ間違いなく綺麗に圧着できる。
専用の工具は非常に高価で、たいてい1種類のピンにしか対応しないので、DIYでは買う機会は無いのだが、この工具ならそれに匹敵する、すばらしい!