はてなブックマーク - とぴやまのbookmark - 2015年4月6日
『処理を1回ではなく3回に増やすと取りこぼしが無くなった』こういう対処はダメだろ、ちゃんと理由を調べよう
……はあ。お前は俺のママか何かかよ。
まあしかし、気になることも確かなのでもう少し調べてみた。まず、手持ちの「ボンバザル」というソフトを逆アセンブルしてパッド入力のルーチンを見てみる(ちゃんと自分で吸い出してるので悪しからず)
このソフトを選んだのはスーファミ初期の作品で、凝ったことをしていなさそうだから。しかしこのゲーム大して面白くないのに何で買ったんだっけかな。姉が欲しがったんだっけか、いやそれはゴエモンだったかな……まあいいや。
; (この前に画面更新関係と思われるサブルーチンコール) padwait: lda $4212 ; ad 12 42 and #$01 ; 29 01 (入力完了待ち) bne padwait ; d0 f9 lda $4218 ; ad 18 42 (Pad1, I/Oポートから読み取り) sta $021e ; 8d 1e 02 (メモリに保存している) lda $4219 ; ad 19 42 sta $021f ; 8d 1f 02 lda $421a ; ad 1a 42 (ここからPad2) sta $0220 ; 8d 20 02 lda $421b ; ad 1b 42 sta $0221 ; 8d 21 02 lda $421c ; . . .(Pad4まで処理が続く)
入力完了待ちを何回も繰り返している様子はない。うーん、なんか別の方法がありそうだな。ということで再びインターネットを探し回り、以下のコードに当たる。
https://github.com/DanielOaks/sneskit/blob/master/source/snes_joypad.asm
>this function should not be called at the
>beginning of vblank because a few scanlines
>are required by the hardware to read the joypads
なるほど。こういう処理はなるべく早めに済ませた方が良いと思っていたが、全く逆で後回しにすべきということらしい。先のボンバザルでもパッド読み取りの前にいろいろ処理が入っていたので、それがポイントだったのか。じゃあ試してみよう。
上の画像は、パッド入力の取りこぼしをテストするプログラムの画面で、左上から順番に入力を取れた個所は明るい色、取れなかった個所は暗い色のブロックを置いている。ノイズ程度ではなく大量の取りこぼしがあり、使い物にならない。
こちらはパッド読み取りに入る前に空ループを入れて時間稼ぎをしたもの。めでたく、全て明るいブロックになった。
こんなんでいいですか。