input replay / record を実装できるか考えてみる

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 の出力をそのままにしたほうがいいみたい。