2016-08-21 4 views
0

私はZ80アセンブリを使用してゲームボーイのプログラミングを試し始めましたが、何か変わったことがあります。 decを使用して遅延を作成する

私は遅れを作成するために使用されるコードのスニペットが見つかりました:

simpleDelay: 
dec bc 
ld a,b 
or c 
jr nz, simpleDelay 
ret 

それで遊んでいる間、私は書いて12月のBCは二回遅延を短縮し、それを3回書くことよりも長い遅延を作ることを発見それを1回または2回使用します。なぜ偶数のdec文を持つと遅延が短くなるのですか?

編集:ここでは遅れを呼び出すコードのスニペットがあります:

ld hl,Title2 
ld de, _SCRN0+3+(SCRN_VY_B*5) ; 
ld bc, Title2End-Title2 
call mem_CopyVRAM 
call simpleDelay 
+0

IDK Z80ですが、ループ条件で '!= 0'がチェックされていますか?あなたの最初の数は3の数ではなく2の倍数ですか? –

+1

直接関係はありませんが、より短いループについては 'DJNZ'を参照してください。それはここでも適用されている論理を裏切っています。減少すると、ゼロと比較し、比較が失敗するとジャンプします。これは、単純に8ビットの値ではなく16ビットの値を比較するためのORで、「OR」はゼロフラグを設定し、2つの値がゼロを生成する唯一の方法は、両方が個別にゼロである場合です。 – Tommy

+0

@Tommyああクール、ありがとう! –

答えて

4

ループが実行されます回数は、BCにロードされた値に依存します。使用している値は指定していません。

は、ロード値が偶数の場合

dec bcdec bcdec bcjr nzsimpleDelayがループに最初の頃とラップアラウンドする bcの値を終了していないことになります。これにより、ループが予想よりも多く実行されます。

+3

実際には、初期値が偶数で3の整数倍(例えば6)の場合、折り返さずにループを終了します。 –

+0

説明をありがとう! :) –

関連する問題