-2
; We now have about 30,000 cycles to burn before the PPU stabilizes.
; One thing we can do with this time is put RAM in a known state.
; Here we fill it with $00, which matches what (say) a C compiler
; expects for BSS.  Conveniently, X is still 0.
txa
@clrmem:
    sta $000,x
    sta $100,x
    sta $300,x
    sta $400,x
    sta $500,x
    sta $600,x
    sta $700,x  ; Remove this if you're storing reset-persistent data

; We skipped $200,x on purpose.  Usually, RAM page 2 is used for the
; display list to be copied to OAM.  OAM needs to be initialized to
; $EF-$FF, not 0, or you'll get a bunch of garbage sprites at (0, 0).

inx
bne @clrmem

基本的には、前述のすべてのアドレスを 0 で初期化し、x をインクリメントし、ラベルの先頭に戻り、すべてのアドレスを 1 で埋め、x を再度インクリメントし、BNE が false になるまで繰り返し発生します (したがって、ゼロ フラグが 1 の場合)。したがって、基本的に X が 0xFF のときに INX が発生すると、X は 0 になり (そうですか?)、BNE は false になり、分岐を停止してプログラムを続行します。残りの大部分は理解できますが、一見ランダムなメモリアドレスでこれを行うのはなぜですか? なぜ 0x000、0x100、0x200 などなのですか? そして、なぜこのループが 256 回も発生するのでしょうか? この後のコードは、プログラムが 2 番目の VBLANK (NES PPU 関連) を待っていることを示しています。約 30k サイクルを燃焼させる必要があると記載されていますが、なぜこのようになるのでしょうか。

注: コードを読んでいる間、注意を払っていなかったことが判明し、この質問をしたときに STA 命令が何をしたかを一瞬忘れてしまいました。上記の情報の一部は正しくありません。

4

1 に答える 1

5

STA (Store Accumulator) 命令を詳しく見てみましょう。与えられた

sta $300,x

アキュムレータを に格納し、$300+xインクリメントしxています..

したがって、実行している連続する反復全体で、次のようになります。

Accumulator -> $300+00
Accumulator -> $300+01
Accumulator -> $300+02
...
Accumulator -> $300+FF

これを行う必要がある理由: 待機時間が必要なため、メモリを「既知の状態」にしない理由。これにより、後でバグが原因で予期しない動作が発生するのを防ぐことができます。たとえば、C では、常に値 0 (null) を持つ初期化されていないポインターが役立ちます。

于 2013-08-05T21:43:12.977 に答える