↑は任天堂のゲームには入ってるかな。スクロール値をリセットするおまじないだ。
スクロール値って実はPPUアドレスそのものだから、$2006や$2007にアクセスすると、スクロール値が勝手に変っちゃう。
それを、VBLANK期間に VRAM転送が終わったら、VBLANK期間から出るより前にリセットする必要がある。
>>734のコードでリセットした直後に、最初のスキャンラインの自分が求めているスクロール値を$2005に書き込むべし。
ヒントや詳細は、
The Skinny on NES Scrolling
NTSC 2C02 technical reference
らを読むべし。難しいから分らないなら読まなくてよし。

>>732を読んでて、ぱっと見、明らかに悪いとこや勘違い?がある。今のうちに癖を直さないとそのうち、つまずく。
VirtuaNESでまともに動けばそこそこ安心と思うべし。動かないなら作法が悪い。

NMIルーチン入ったらVBLANK期間が終わらないうちに小規模なBG転送と、sta $4014のみに専念するべし。
    VBLANK期間は短いので、NMIの直後は時間を無駄にしないこと。
  ⇒Main: が長すぎて、sta $4014がVBLANK期間内に終わらないんじゃないか?
    動作しちゃうでしょうけど、あまり(・A・)イクナイ!!
    NMIルーチン直後の定説は、まずSPRDMA、次にBG小転送。

VBlank: 内でBGの初期化(=大量転送)をやってる
  ⇒BGやSPRオフにしてさえいれば、BGの初期化はReset: 内でもok。
    むしろBGやSPRの初期化は長くなりがちだからReset: でやるべき。
    BG, SPR, NMIなどを再びオンにする前にVBLANKを待った方がいいかも。

jsr PadGetは⇒ 「スプライトとBGの表示をONにする」の直後に書くべき。
Main: 内の位置更新作業も同様に⇒ 「スプライトとBGの表示をONにする」の直後に書くべき。

.org $0600 sprdma: .db 0
  ⇒他のアセンブラならアリでしょうが、NESASMしょぼいから、.orgやたらにやらないほうがいいかも。
    NESファイルに実体確保しちゃったりして、思わぬアドレスのズレやコンパイルミスが起こりうる。
    RAM上の変数定義だけなら=や.equでいいんじゃないか。