スーファミプログラミング近況・今年買った物
スーファミプログラミング近況
ローカル変数の使い方がわかって、かなり楽にプログラムが書けるようになった。今まで書いたつらいプログラムは捨てる。
お前は何を言っているんだと思われそうなので補足しておくと、初代ファミコンのCPU 6502ではおそらくローカル変数は使えなくて、全ての変数をグローバルにぶちまけて、衝突しないよう気を使いながらプログラムを書いていた、と思う(そんなことはない、という情報があればお教えください)
しかしスーパーファミコンのCPU(65816)の仕様をよく調べると、スタックの中身をロード・ストア可能になっていて、つまり現代の一般的なCPUと同じ機構でローカル変数が使える。これとは別に、ファミコン時代に使っていたグローバル領域(zero pageと呼ばれる)のアドレスをオフセットしていく方法もあって、初代ファミコンのプログラミングに慣れていた人たちはこれを使っていたのではないかと想像している。
現代のプログラミング環境に慣れた身からすると、ローカル変数なしでプログラムを書けと言われたら精神に異常をきたしそうになるが、昔の行番号BASICにはグローバル変数しかなかったので、それでプログラミングを覚えた人々にとっては、アセンブリで同じことをするのに疑問を抱くことすらなかったのではないか。
今年買った物
I/Oとベーマガ
I/Oとベーマガは割と最近まで実家にあったんだけど、ある年帰るときれいに消滅していた。15年前なら泣き叫んでいたかもしれないが、この歳になると感情が希薄になり国会図書館で見ればいいか、と思って再入手もしなかった。
しかし去年、一時ライターをされていた方にベーマガを一冊譲っていただいたのをきっかけにまた読んでみたくなり、ちょうど開店した秋葉原BEEPでベーマガを何冊か買ってみた。I/Oの方は駿河屋だけど。
スーファミのゲームができたらどっかで雑誌と一緒に展示したい。もっとも、雑誌を来場者に読ませるために置くと著作権の問題があるので、あくまでオブジェとして置いといて、でも来場者が勝手に手に取って読んじゃうのは仕方ないよね、みたいな白々しいことを言う用意がある。
SPCで音を出す
いままで後回しにしてきたSPC700のコントロールに挑戦。
楽器のサンプリングを持っていないので、音色は手で入力した矩形波。ファミコンみたいな音だけど、ADSRが効いてるので多少マシかな?
実機でハマった点が2つ
- SPCは起動時にミュートがかかっているので解除する必要がある(エミュレータだと再現されていない場合がある)
- フィルタ関係のレジスタにゴミが入っているので、初期化しないと音がおかしくなる(エミュレータでは勝手に初期化されている)
使っていないチャンネルも明示的にキーオフして初期化したほうがいいのかもしれない。
SPCはやってる人が少なく、情報も少ないのでなかなか難儀。リッチすぎてあまりチップチューン屋の心が躍らないのかもしれない。SPCってPCMでしょ?だったら普通のシンセ使うわ、みたいな感じで。
テレビを買った
どうせならレトロゲームに似合うやつを、ということで1975年製ブラウン管です。写真では伝わりにくいがかなりの小型なのであんまり邪魔にはならない。
スーパーファミコンよりメガドライブが似合いそうな感じがするな。
自作のプログラムを映してみたところ。やっぱりテレビに映るとテレビゲームを作っているという気分が盛り上がる?かもしれない。
ところでスーパーファミコンにはフェードアウト演出等のために画面を暗くする機能があり、走査線が画面上を走っている途中に操作すると、画面の上半分、あるいは下半分だけ暗くする、といったことができる(海腹川背の水面はこれで描かれている)のだけれど、今のところこれを簡単なベンチマークとして使っている。つまり1フレーム分の処理が終わった時点でどれくらい走査線が下まで降りてきているか、というのを見て、もうちょっと処理を入れても大丈夫そうだな、という判断をしている。
まあ随分と野蛮な方法だけど、任天堂公式の開発キットには計測ツールとかがあったんだろうか。
初夏のスー活
こんな状況。
以前とあまり変わり映えしないように見えるけど、前のは床の当たり判定しか見てない(頭を天井にぶつけてもすり抜ける)ハリボテだった。ので、中身はかなり進化している。
やっぱプラットフォーマー(アクションゲーム)はロマンだよ。なんでみんなRPGを作りたがるのか……
さて、プログラムが複雑になってくると、デバッグの方法を考えなければいけない。地球上に70億も人間がいると相当におかしい人もいて、世の中にはスーパーファミコン用プログラムのデバッガというものが存在する。
いろいろ機能があるけど主に使っているのはメモリビューアで、デバッグ情報を空いているメモリ領域に書き込んでそれをビューアで切り出すという方法でログを取ることができる。(一応書いておくと、コンソールなんてものは無い)
画像では初期値で埋められているけど、ロギングのルーチンを有効にすると、赤枠で囲った部分にログが書き込まれる。下のような感じで。
88 06 C2 0E 88 06 C2 0E 78 06 AC 0E 78 06 AC 0E 68 06 97 0E 70 06 97 0E 6E 06 83 0E 70 06 83 0E 6E 06 70 0E 70 06 70 0E 6E 06 5E 0E 70 06 5E 0E 6E 06 4D 0E 70 06 4D 0E 6E 06 3D 0E 70 06 3D 0E 6E 06 2E 0E 70 06 2E 0E 6E 06 20 0E 70 06 20 0E 6E 06 13 0E 70 06 13 0E 6E 06 07 0E 6E 06 07 0E 6A 06 B0 0E 6A 06 B0 0E 64 06 B1 0E 64 06 B1 0E 5C 06 B3 0E 5C 06 B3 0E 52 06 B6 0E 52 06 B6 0E 46 06 BA 0E 46 06 BA 0E 38 06 BF 0E 38 06 BF 0E 28 06 C5 0E 28 06 C5 0E 18 06 CC 0E 18 06 CC 0E 08 06 D4 0E 08 06 D4 0E F8 05 DD 0E F8 05 DD 0E E8 05 E7 0E E8 05 E7 0E D8 05 E8 0E D8 05 E8 0E C8 05 E9 0E C8 05 E9 0E B8 05 EB 0E B8 05 EB 0E A8 05 EE 0E A8 05 EE 0E 98 05 E8 0E 98 05 E8 0E 88 05 E9 0E 88 05 E9 0E 78 05 EB 0E 78 05 EB 0E 68 05 EE 0E 68 05 EE 0E 58 05 E8 0E 58 05 E8 0E
これだけ見ても意味が分からないが、これは当たり判定の動きがおかしかった際に取ったキャラクターの座標のログで、プロットすると下図のようになる。
左の薄茶色は地形のブロックで、暗緑はキャラクター。注目すべきは11番で、キャラクターが地形にめり込んでいるにも関わらず位置が補正されていない(補正前=黒いドットと補正後=緑のドットが同じ位置にある)ので、ここを詳しく調べていく……という感じ。
スーファミ現役時代に実際の現場でどういうデバッグをしていたのかは知らないけど、当時だと方眼紙に手でプロットという力技もありそうかな。90年代ぐらいだと、まだ何もかも画面の上で済ませるという感覚ではなかったと思う。