; 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 为假(所以如果零标志为 1)。所以基本上当 X 为 0xFF 时发生 INX 时,X 将为 0(对吗?),并且 BNE 将为假,它将停止分支并继续执行程序。我理解其余的大部分内容,但为什么它会用看似随机的内存地址来做这件事呢?为什么是 0x000、0x100、0x200 等?为什么这个循环会发生 256 次?之后的代码显示程序等待第二个 VBLANK(NES PPU 相关),我有点明白,但是 256 时间循环是什么?它声明它需要燃烧大约 30k 个周期,但为什么要这样呢?
注意:原来我在阅读代码时没有注意,当我问这个问题时,我忘记了 STA 指令做了什么。上面的一些信息是不正确的。