10

別の無害なZ80の質問でもう一度:-)エミュレータコアが現在構造化されている方法で、オペコードバイトがメモリからフェッチされるたびにメモリリフレッシュレジスタの下位7ビットをインクリメントしています-これは、マルチバイト命令の場合などです。 DDまたはFDを開始するものとして、レジスタを2回インクリメントしています。またはRLC(IX + d)などの命令のインスタンスでは3回(opcode1-opcode2-d-opcode3に配置されているため)。

これは正しいです?よくわかりません-Z80のマニュアルでは、CPDR(2バイト命令)が2回インクリメントすると記載されているため、これについては少し不明確ですが、「メモリリフレッシュレジスタ」セクションでは、各命令フェッチ後にインクリメントすると記載されています。J80(これについてはよくわからないのでチェックしたエミュレーター)は、命令の最初のオペコードバイトの後でのみインクリメントすることに気づきました。

どちらが正しい?いずれにせよそれほど重要ではないと思いますが、知っておくといいでしょう:-)ありがとうございます。

よろしく、フィルポッター

4

4 に答える 4

15

Zilog のタイミング図に、あなたの質問に対する答えがあります。

リフレッシュは、すべての M1 (オペコード フェッチ) サイクルの T3 と T4 の間に発生します。

単一オペコード命令の場合、これは命令ごとに 1 回のリフレッシュです。シングルプレフィックス命令 (プレフィックスは M1 サイクルを使用して読み取られる) の場合、命令ごとに 2 回のリフレッシュになります。

これらの奇妙な DD-CB-disp-opcode および FD-CB-disp-opcode タイプの命令 (変位バイトが最終オペコードの後ではなくに来るので奇妙です) の場合、リフレッシュの数は少なくとも 3 です (2 つのプレフィックスの場合)。および最終オペコード)、しかし、変位バイトが M1 サイクル (別のリフレッシュをトリガーする) の一部として読み取られるのか、通常のメモリ読み取りサイクル (リフレッシュなし) として読み取られるのかはわかりません。これらの命令では、変位バイトは M1 サイクルで読み取られると思いがちですが、よくわかりません。私はこれについてショーン・ヤングに尋ねました。彼も確信が持てませんでした。誰か確実に知っていますか?

アップデート:

私は、これらの奇妙な DD-CB-disp-opcode および FD-CB-disp-opcode 命令に関する自分の質問に答えました。RLC (IX+d) などのこれらのタイプの命令に関する Zilog のドキュメントを確認すると、命令には 6 つの M サイクルと 23 の T サイクルが必要であることがわかります。 、3)。

最初の 2 つの M サイクルは、DD および CB プレフィックスを取得するための M1 サイクルであることがわかっています (それぞれ 4 つの T サイクル)。次の M サイクルは、変位バイト d を読み取ります。しかし、その M サイクルは 4 ではなく 3 つの T サイクルのみを使用するため、M1 サイクルになることはできません。代わりに、通常のメモリ読み取りサイクルです。

RLC (IX+d) 命令の 6 つの M サイクルの内訳は次のとおりです。

  1. 0xDD プレフィックスを読み取るための M1 サイクル (4 T サイクル)
  2. 0xCB プレフィックスを読み取るための M1 サイクル (4 T サイクル)
  3. 変位バイトを読み取るためのメモリ読み取りサイクル (3 T サイクル)
  4. 0x06 オペコードをフェッチし、IX を ALU にロードするための M1 サイクル (5 T サイクル)
  5. アドレス IX+d から計算して読み取るためのメモリ読み取りサイクル (4 T サイクル)
  6. RLC を計算し、結果をアドレス IX+d に書き込むメモリ書き込みサイクル (3 T サイクル)

(RLC 計算は、M サイクル 5 と 6 をオーバーラップします。)

これらのタイプの命令は、連続していない M1 サイクル (上記の M サイクル 1、2、および 4) を持つ唯一の Z80 命令であるという点で独特です。彼らはまた、最も遅いです!

ポール

于 2012-02-19T17:03:40.700 に答える
5

SeanYoungのZ80UndocumentedFeaturesには別の話があります。プレフィックスなしの場合は1回、シングルプレフィックスの場合は2回、ダブルプレフィックスの場合は2回(DDCBのみ)、ノーオペレーションプレフィックスの場合は1回。

もちろん、ブロック命令は実行するたびにRに影響します(そしてBC回実行します)。

于 2011-12-19T15:50:13.383 に答える
-2

私がオンラインで見つけることができるすべての参考文献は、その長さに関係なく、R は命令ごとに 1 回インクリメントされると述べています。

于 2011-12-16T22:23:02.823 に答える