パッド入力の件
はてなブックマーク - とぴやまの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
なるほど。こういう処理はなるべく早めに済ませた方が良いと思っていたが、全く逆で後回しにすべきということらしい。先のボンバザルでもパッド読み取りの前にいろいろ処理が入っていたので、それがポイントだったのか。じゃあ試してみよう。
上の画像は、パッド入力の取りこぼしをテストするプログラムの画面で、左上から順番に入力を取れた個所は明るい色、取れなかった個所は暗い色のブロックを置いている。ノイズ程度ではなく大量の取りこぼしがあり、使い物にならない。
こちらはパッド読み取りに入る前に空ループを入れて時間稼ぎをしたもの。めでたく、全て明るいブロックになった。
こんなんでいいですか。
スーパーファミコンのプログラムを書きたい
2016/04/06追記
はてなブックマークの「一年前の話題」だとかでやたら人が来てたので、一年前の一年後(つまり今)の状況を記しておきます。
↓
http://gyuque.hatenablog.com/entry/2016/03/28/215253
今年はSFC 25周年である。大学ではなくスーパーファミコンのことである。
@pornanime いいからスーファミでピコピコしてろよな。
— カザオカマリ (@ykzts) March 16, 2015
スーパーファミコンを買ってもらったのは小学校に上がった頃か、日焼けして真っ茶色になってはいるが未だに動作し、手元に置いてある。共に育ったマシンなので美しい思い出を語っては上のように若造に馬鹿にされているのだが、よく考えるとこれだけ思い入れの深いスーパーファミコンで動くプログラムを書いたことはなかった。プログラマーとしてこれは誠実ではない、ということで書くことにした。
https://github.com/gyuque/SNESZoi
参考サイトとしては
- SNES研究室
- SNES Graphics Information
- Super NES Programming/SNES Hardware Registers - Wikibooks, open books for an open world
などなど。普通に検索して出てくる情報を頼りにする。
任天堂公式のドキュメントではないので、同じものをサイトによって別の言葉で指していたり、欠落している情報があったり、といった難がある。まあ、試行錯誤でカバーしていきましょう。
開発言語に関しては、Cコンパイラを使う方法もあるようだけど、もちろん野良SDKだし却って泥沼にはまりそうなので、素直にアセンブリで書いていく。
スプライト/BGデータはこんな感じ。
便利なことに、makeして出てきたバイナリはもうエミュレータで起動できる状態になっている。では早速……
左右に動かせる。
Bボタンを押すと「がんばるぞい」……はい、これだけ。いや、さすがにゲームを一本作るのはね。
ちなみに、画面の左端よりもさらに左に移動できる(つまりx座標をマイナスにできる)が、これは結構面倒臭い。スーファミのゲームでこういうシーンを見つけたらプログラマーの苦労を偲ぼう。
実機起動
Windows上で動いてるだけじゃWindowsアプリと区別付かんので、やっぱり実機で動かないとねえ、ということで Super EverDrive を発注した。これはSFC本体にROMのフリをしてイメージファイルを読ませる装置で、要するにマジコンの類。なので税関に没収されないか心配だったけど、無事通過した。ちなみに後で調べたところ、輸入禁止になっているのはDS用のみ名指しで、ということらしい。
動作チェックに使ったと思われるドラゴンボールZのゲームがそのまま入っていたのは見なかったことにする。
さて、SDカードにイメージファイルを入れて、いよいよ電源投入。
あれ……
上の動画ではさもサクッと動いたかのように編集しているが、実はこんなことになっていた。これは深刻なバグではなく、BGやスプライトの管理メモリをクリアするのを忘れていただけ。エミュレータでは勝手にクリアしてくれるので見落としていた。
では再挑戦。
ムム……
静止画だと問題ないように見えるけど、動きがガクガクしている。処理落ちしているわけではなくて、パッドの入力を取りこぼしている様子。いろいろ試してみた結果、パッドからのデータ受信完了を待つ処理を1回ではなく3回に増やすと取りこぼしが無くなった。三度目の正直か。こんなんでいいのか。 →補遺
ともかく、完成形はこちら。
まあこんなわけで、かつてスーファミ少年だったおっさんの願いは叶ったわけである。
しかしまあなんですね、私のようにスーファミで育った人間が働く歳になった頃にはスーファミのソフトを作る仕事なんてもう存在せず、同様に今3DSで遊んでいる子供達が大人になる頃には3DSのソフトを作る仕事なんて無いんでしょう。ゲームの仕事は儚い。
マック
昨日のテクネIDの話、もう少し真面目に自己採点すると、食い物で言うならば、食えないレベルでまずい、という事は無かったと思う。しかしこれは、ピザやハンバーガーを買ってきて食えばそりゃ食えないほどまずいってことは無いよね、という話であり、つまるところファストフード的なうまさから脱出できてないということ。マックが出てきてデザインがマックになってしまったという奴ではないかと思う。
はあ、なんか悩みが増えたな。
マックといえば新しいMacBook、今この瞬間にもUSBポート全部塞いでる身としてはかなり厳しい。別に今のAirで当分困りはしないけど……
テクネIDに応募してみたが
賞はもらえなかった。902作品とか激戦過ぎてどうしようもない。
ダイジェストみたいなところには滑り込んだようだけども。
よく見ると、右下の人とネタが被った気がする。どんな技術や機材を使ってもネタが被るようでは全くダメ。
v1.0.3 リリース
iPhone版リリース
今朝iPhone対応版が審査を通りましたのでお知らせいたします。
サイト: http://pa-gam.es/rb/
AppStore: https://itunes.apple.com/jp/app/rats-busters!/id963634673?mt=8
先日書いた通り、今回はiPhone 5以降を正式対応とします。iPhone 4SとiPod touchへの正式対応には少々お待ち下さい。次こそは三度目の正直で……