どうもうまく動いてくれないSDカードインタフェースですが、問題はクリアになりました。 わかりにくいので、シーケンス図にします。
この図で、PCからのリクエストがin/out命令で、OUT buffer/IN bufferがそれぞれフリップフロップやラッチです。
最初にコマンドをout命令で送出し、その後inを繰り返してデータを取得するという典型的な例です。 コマンド処理中はbusyをあらわすステータスがIN bufferに入っているので、PC側からはポーリングしながら待ちます。
問題は、赤い部分です。 ここは本来、INT1の処理の最後で書き込んだステータスが返されるはずなのですが、実際にはステータスは稀にしか返りません。 なぜか、ここでINT0の出力が返ります。
しかし、ときどきステータスも返ることがあるため、INT0の出力データの最初のバイトにステータスを埋め込んだとしても、データのずれが発生してしまいます。
なんでこんなことが発生するのか、まだ解明できていません。 busyが返るin命令でも割り込み信号自体はAVRに伝わっているので、それが何か影響しているのかもしれません。 プログラム上は、INT0/INT1の処理中(=割り込み処理中)は割り込みは禁止になっているはずなのですが。
なお、プログラムのメインループはsleepによりアイドル状態(スリープではない)の無限ループとしています。
while (1) {
sleep_mode();
}
こんな感じです。 基本的に割り込みでしか動作しません。

INT0がエッジトリガだとすると、INT1の割り込み終了後すぐ
INT0のペンディングされていた割り込み処理が開始されて、
その結果 stat はすぐに data で上書きされてしまう…
と勝手に妄想しました。
調べていたのですが、どうもそのようです。
割り込み要求はハード処理なので、処理中にも生きているんですね。
追試して報告します。