開発日記 (UNROM 互換設計)

リセットボタンを押さずリセット相当の命令(jmp ($FFFC))を実行させる回路を設計途中. これはおそらくレジスタが5個いるので先述の SLG46826 で組んでみることにした. リセットについては後日記載する予定. (もう1個書きたいネタがあるが私の余裕が足りてない)

UNROM にそこそこ互換の拡張カートリッジ

リセット相当回路のおまけに UNROM もどきを作ることにした. UNROM はソフト数が多いし、何よりキャラクタ側はRAM確定とか簡単な汎用ロジックICで回路が組みやすい.

UNROM には過去に私が提示した方法では SST39SF040 を利用できないという問題がある. 当時に私にとってこの問題は小さかったものの、今安定供給しているのが SST39SF040 だけだからいつの間にか問題は大きくなっていた.

今回の配線では下記でやってみようと思う. (今の段階で実験は一切してないので注意)

A[17:15] = 74161.Q[2:0] | {3{CPU_A[14]}};
A[14:0] = CPU_A[14:0];
CE# = CPU_ROMSEL#;
WE# = CPU_RW;
OE# = CPU_RW NAND BUSMASTER;

ここでの肝は本物の UNROM では ROM に接続しない CPU_A14 を ROM に接続し、バンクレジスタの側の入力は 1 bit ずらしている点. これにより command address A14 が確保できない問題は一応解決するはず.

ここで互換性を損なう問題と拡張性が同時に存在する. バンクレジスタの値は 0 から 7 が書けるが、 page 7 については CPU address $8000-$BFFF (可変バンク) と CPU address $C000-$FFFF (固定バンク)の内容が一致しない. 本当の UNROM では 8 通りあるが、この構成では 9 通りある.

素直にプログラムを組む場合は固定バンクの内容を可変バンクに置いて利用するということはほとんどないはずで、おそらく、たぶん、きっと昔のソフトも無難に動くと予想される. 新しくソフトを作る場合は ROM の容量が 1/8 増えるので去年自分が作って容量不足で完成を断念した FF3 の hack では簡単に ROM 容量をひねり出すことが可能になると思う.

Flash 側の A18 については対応ソフトが少ないことと74161からのレジスタを別の目的に利用するので省略.

OE# についてはリセット相当回路とデータバス出力が重ならないようにいれているが、それがないなら CPU_RW の反転でいいと思う. *1

半固定バンクを作る

MMC1 やそれ以降にある CPU address $8000-$BFFF と同 $C000-$FFFF をどちらか固定と可変のバンクに入れ替えるという回路も考えた. 74157 か 74257 を利用する.

74157.A = 74161.Q[3:0];
74157.B = {4{CPU_A[14]}};
74157.S = CPU_A14 ^ 74161.Q[x];

74157.Y を FLASH の上位アドレスに接続する. 先述の A17:15 を繋ぐ方法を利用すると、16 ページ利用できる. OR gate 4 つ (7432) はいらなくなるが XOR gate 1 つ (7486) が必要になる.

この回路自体を考えるのは面白かったが gate を使い切れなく中途半端にあまるとか 74161 のレジスタ 4 bit では足りなくなるとか74161 のレジスタの power on reset 回路が必要など部品が増えるなり、互換性が低くなるなど実用性が低そうだったのでボツにした.

*1:以前 Read Cycle の hold time が足りないような指摘を受けたので改めて考え直したが、その問題はないと思った