40H368 は 74HC368 になってることもあるが、40Hのほうで統一する(機能差はないはず)。音声アンプとしての用途はここでは言及しない。
input device の仕組み
- RDP0 が $4016, RDP1 が $4017 の address decode で 40H368 の dataoutput control につながる。
- P2:0 が $4016.write の bit2:0 に対応する。P0 が input controller 内部の CMOS4021 の PS に接続される。
- これによって shift register の Q8=P8 が確定し、shift 順番の初期化となる。
- CMOS4021 の CLK には前述の 40H368 を介した PHI2 が接続される(A15:0 == 16'h4016 | ~PHI2)。つまり $4016へアクセスした時点で CMOS4021 の shift register が動くことになる。
- RDP1:0 が基本 read として使う。おそらく RDP = !(A15:0 == 16'h4016 || R/W == 1) という感じで read 専用 strobe だと思われる。
信号入力
この部分は inverted tristate buffer の 40H368 が重要。このバッファから CPU DB4:0 <-> 4016.DB2:0.read, 4017.DB4:0.read のデータバスの切り替えが発生する。
本物の 40H368 を2つ実装したほうが IO ピンが減らせる。
- RDP1:0 (相当)
40H368 の機能を内蔵すると IO ピンが増える.
- 4016.DB2:0.read
- 4017.DB4:0.read
input record の実装
本題に入る。recorder は CPU の 4016/4017 への data access を監視し、記録することによって input recorder として機能する。
PC 上のエミュレータがどういう仕組みかはわからないが、 NMI などの定期記録の場合では、実機でやる場合にバスを勝手に止める必要があって都合が悪い。このため、元のソフトウェアの動きを半分取り込むことによって同期を取る。そのため、元のソフトウェアが入力ポートを見ていないときは何を押したかはわからない。
また replay 時に seek 機能をいれると利便性が向上する。これは定期的に state save を取ればいいのだが、 CPU の動作に影響が入るので難しいかもしれない。
input replay の実装
$4016 と $4017 への read access の時に CPU に渡すデータを操作することで replay が実現できる。
40H368 外付け時では RDP を強制的に H にする。40H368 相当内蔵の場合は CPU DB7:0 を接続先を変える。
残り
P2:0 に関しては重要度を感じなかったので CPU の出力をそのままにしたほうがいいみたい。