Z80 の 研究部屋、 M6809 の 研究部屋と同様に、 HuC6280 の CPU について調査したデータを置いておきます。
HuC6280 には無印と A リビジョンがありますが、今回調査したのは無印の方です。無印と A リビジョンとの違いは不明です。
HuC6280 のマスタークロックを L/H に変化させるたびに制御信号線やバスの値を読んで記録したデータです。 マスタークロックを L/H にセットして十分に時間が経ってからデータを取り込んでいると考えてください。
マスタークロックの H と L 変化ごとにデータを取得しているため、 CPU の 1 サイクルが 24 行になっています。 1 サイクルが縦に長くて見づらい向きもありますが、一応これによって各信号がマスタークロックの立ち上がり/立ち下がりのどちらで変化するか、また CSH/CSL 命令でクロック周波数が切り替わるタイミングも詳しく見ることができます。見づらい場合は適当にデータを間引いてください。
例として、NOP 命令実行時の信号線の変化を次に掲載します。
/RESET CLK SX ADDR DATA /RD /WR RDY SYNC HSM /NMI /IRQ1 /IRQ2 /CEK /CE7 /CER O0 O1 P23
1 0 1 0000FC FF 1 1 1 1 0 1 1 1 1 1 1 1 1 1 ; SYNC=H なので opcode ($EA) フェッチサイクル
1 1 1 0000FC FF 1 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 1 0000FC FF 1 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 1 0000FC FF 1 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 1 0000FC FF 1 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 1 0000FC FF 1 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 1 0000FC FF 1 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 1 0000FC FF 1 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 1 0000FC EA 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 1 0000FC EA 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 1 0000FC EA 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 1 0000FC EA 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 1 0000FC EA 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 1 0000FC EA 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 1 0000FC EA 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 1 0000FC EA 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 0 0000FC EA 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 0 0000FC EA 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 0 0000FC EA 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 0 0000FC EA 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 0 0000FC EA 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 0 0000FC EA 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 0 0000FC EA 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 0 0000FC EA 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 1 0000FD FF 1 1 1 0 0 1 1 1 1 1 1 1 1 1 ; dummy operand read
1 1 1 0000FD FF 1 1 1 0 0 1 1 1 1 1 1 1 1 1 ; 6502 同様 NOP のような 1 バイト命令でも
1 0 1 0000FD FF 1 1 1 0 0 1 1 1 1 1 1 1 1 1 ; 2 バイト目を読む (値は捨てられる)
1 1 1 0000FD FF 1 1 1 0 0 1 1 1 1 1 1 1 1 1
1 0 1 0000FD FF 1 1 1 0 0 1 1 1 1 1 1 1 1 1
1 1 1 0000FD FF 1 1 1 0 0 1 1 1 1 1 1 1 1 1
1 0 1 0000FD FF 1 1 1 0 0 1 1 1 1 1 1 1 1 1
1 1 1 0000FD FF 1 1 1 0 0 1 1 1 1 1 1 1 1 1
1 0 1 0000FD 60 0 1 1 0 0 1 1 1 1 1 1 1 1 1
1 1 1 0000FD 60 0 1 1 0 0 1 1 1 1 1 1 1 1 1
1 0 1 0000FD 60 0 1 1 0 0 1 1 1 1 1 1 1 1 1
1 1 1 0000FD 60 0 1 1 0 0 1 1 1 1 1 1 1 1 1
1 0 1 0000FD 60 0 1 1 0 0 1 1 1 1 1 1 1 1 1
1 1 1 0000FD 60 0 1 1 0 0 1 1 1 1 1 1 1 1 1
1 0 1 0000FD 60 0 1 1 0 0 1 1 1 1 1 1 1 1 1
1 1 1 0000FD 60 0 1 1 0 0 1 1 1 1 1 1 1 1 1
1 0 0 0000FD 60 0 1 1 0 0 1 1 1 1 1 1 1 1 1
1 1 0 0000FD 60 0 1 1 0 0 1 1 1 1 1 1 1 1 1
1 0 0 0000FD 60 0 1 1 0 0 1 1 1 1 1 1 1 1 1
1 1 0 0000FD 60 0 1 1 0 0 1 1 1 1 1 1 1 1 1
1 0 0 0000FD 60 0 1 1 0 0 1 1 1 1 1 1 1 1 1
1 1 0 0000FD 60 0 1 1 0 0 1 1 1 1 1 1 1 1 1
1 0 0 0000FD 60 0 1 1 0 0 1 1 1 1 1 1 1 1 1
1 1 0 0000FD 60 0 1 1 0 0 1 1 1 1 1 1 1 1 1
(ここまでで NOP の実行は完了)
// next op-code fetch
1 0 1 0000FD FF 1 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 1 0000FD FF 1 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 1 0000FD FF 1 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 1 0000FD FF 1 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 1 0000FD FF 1 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 1 0000FD FF 1 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 1 0000FD FF 1 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 1 0000FD FF 1 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 1 0000FD 60 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 1 0000FD 60 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 1 0000FD 60 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 1 0000FD 60 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 1 0000FD 60 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 1 0000FD 60 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 1 0000FD 60 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 1 0000FD 60 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 0 0000FD 60 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 0 0000FD 60 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 0 0000FD 60 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 0 0000FD 60 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 0 0000FD 60 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 0 0000FD 60 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 0 0 0000FD 60 0 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 0 0000FD 60 0 1 1 1 0 1 1 1 1 1 1 1 1 1
NOP 命令は 2 クロックサイクルで完了する命令です。なので上のかたまり(24行のブロック) 2 つで完了します (3 つめのブロックは次の命令をフェッチしていることを確認するための参考情報です)。
読み出しに関しては、24 行のブロックの最初の 8 行はアドレス変化期間 (6502 でいうところの Φ2=L 期間)、後の 16 行はデータバスアクセス期間(6502 の Φ2=H 期間)です。 書き込みの場合は最初と最後の 4 行で /WR=H となるため、バスサイクルの設計は 6502 とは根本的に異なるようです。
信号の意味を以下に説明します。(I) は HuC6280 への入力、(O) は HuC6280 からの出力信号を表します。
調査したデータを以下に示します(OP-CODE 順)。
データは半自動で取得したためミス等発見次第修正します。
今後さらに命令を調査することがあれば追加します。