MC68000 read/write cycle
SD カードを SPI モードでつなぐが、シリアルの clock や data を 1bit ずつソフトでやるのは時間がかかるので自動的に 8bit のデータを取れるようにする回路を作った。(以前も作ったので作り直し)
シミュレーション上ではうまくいくのにちゃんと動かないので安物ロジックアナライザで計測したところ、 write 時に dtack を上げたのにそれに気づかず次のメモリアクセスにいってしまうのが原因だった。
いくらか試して、アドレスが確定した時点で dtack を上げておかないとダメだということが経験的に分かった。今回の場合は純粋な R/W が来ておらず、 R/W と LDS が合成してくるため、 LDS が下がったタイミングでないと write かわからないので、これは使えないと write 用, read 用にアドレスをばらすことにした。
実装が落ち着いた段階で MC68000UM.pdf を見直す。波形を AA で書く。
[read cycle] [write cycle] state|01234567 | 01234567 CLK |10101010 | 10101010| 1:high 0:low x:変更中 n:条件に応じて high or low FC2:0|Xnnnnnnn | Xnnnnnnn| -:有効ではない Z:high-Z r:fetch timing A23:1|-Xnnnnnn | -Xnnnnnn| AS |11000001 | 11000001| ULDS |11nnnnn1 | 1111nnn1| R/W |11111111 | 11000001| DTACK| r | r | D15:0|---ZZZrZ | ---Xnnnn|
問題になったのは write の state 4 で、このタイミングで dtack を取り込んで state 5 に移行するか切り換えるとちゃんと書いてあった。これをもとにシミュレーションのメモリアクセス task を確認すると、 dtack は state 6 で読むように適当に解釈して実装されていた。というオチ。
言い訳をするといままでは純粋な R/W をみてから dtack をあげていたので間に合ったんだが、ちゃんと仕様書を読まないとこういうことになって時間を無駄にするということがわかった。