68000 と Interrupt Acknowledge Cycle

tv80 (Z80) でいくら割り込みをかけても音がなってくれなかったのは M1 と IORQ から発生される Interrupt Acknowledge Cycle を無視していたということが判明してから、その重要性をしった。恥ずかしい。

68000 でのその関係性を調査しつつ、 TG68 で調査した。 Freescale のデータシートを見るに、抜粋するとこうなる。*1

  • FC2:0 が 3'b111 になる
  • A23:4 が 20'hfffff になる
  • A3:1 が受け付けた IPL と同じ値になる (負論理入力値が正論理で出力されるかは不明)
  • D7:0 にベクタ番号を出力する (出力なのに R/W は H)

これに対する TG68 の動きはこうだった。 $000032 で stop #$2000 を実行してしてから割り込み処理に入る。

  • FC2:0 は存在しない (ダメ)
  • A23:4 は 20'hfffff だ (おそらくたまたま一致)
  • A3:1 は 3'b111 だ (ダメ)
  • D7:0 は動いてない (ダメ), 0000 と 0000 の間にある値は 0036 でスタックに積む値を早めに処理している様子
  • ベクタアドレスがなぜか 24'h000007x になっているが正しくは 24'h000070

最後のベクタアドレスの取り込みはシミュレーションの設定が変だと思うので、無視するとして、 TG68 では intterupt acknowledge はベクタアドレスから longword で取ってくることでないと認識できないようだ。

定石としては FC をみるのが一般的らしいが、 FC が未接続の設計が一杯あるのにはなんでだ。

*1:M68000 8-/16-/32-Bit Microprocessors User’s Manual, 5.1.4