Hello, my name is pornanime.

スーファミプログラミング近況・今年買った物

スーファミプログラミング近況

ローカル変数の使い方がわかって、かなり楽にプログラムが書けるようになった。今まで書いたつらいプログラムは捨てる。

お前は何を言っているんだと思われそうなので補足しておくと、初代ファミコンのCPU 6502ではおそらくローカル変数は使えなくて、全ての変数をグローバルにぶちまけて、衝突しないよう気を使いながらプログラムを書いていた、と思う(そんなことはない、という情報があればお教えください)

しかしスーパーファミコンのCPU(65816)の仕様をよく調べると、スタックの中身をロード・ストア可能になっていて、つまり現代の一般的なCPUと同じ機構でローカル変数が使える。これとは別に、ファミコン時代に使っていたグローバル領域(zero pageと呼ばれる)のアドレスをオフセットしていく方法もあって、初代ファミコンのプログラミングに慣れていた人たちはこれを使っていたのではないかと想像している。

現代のプログラミング環境に慣れた身からすると、ローカル変数なしでプログラムを書けと言われたら精神に異常をきたしそうになるが、昔の行番号BASICにはグローバル変数しかなかったので、それでプログラミングを覚えた人々にとっては、アセンブリで同じことをするのに疑問を抱くことすらなかったのではないか。

参考 http://www.wizforest.com/diary/150209.html;p1

今年買った物

f:id:gyuque:20151212155836j:plain

I/Oとベーマガ

I/Oとベーマガは割と最近まで実家にあったんだけど、ある年帰るときれいに消滅していた。15年前なら泣き叫んでいたかもしれないが、この歳になると感情が希薄になり国会図書館で見ればいいか、と思って再入手もしなかった。

しかし去年、一時ライターをされていた方にベーマガを一冊譲っていただいたのをきっかけにまた読んでみたくなり、ちょうど開店した秋葉原BEEPベーマガを何冊か買ってみた。I/Oの方は駿河屋だけど。

スーファミのゲームができたらどっかで雑誌と一緒に展示したい。もっとも、雑誌を来場者に読ませるために置くと著作権の問題があるので、あくまでオブジェとして置いといて、でも来場者が勝手に手に取って読んじゃうのは仕方ないよね、みたいな白々しいことを言う用意がある。

f:id:gyuque:20151212155940j:plain

ブラウン管テレビとファミコン

ブラウン管テレビは以前書いた通り、1975年製のもの。ほとんど使われていなかったようで40年ものとは思えないほど発色が良いのだが、埃が溜まって発火すると怖いので普段はカバーをかけてプラグも抜いてある。

で、このテレビと組み合わせてファミコンをするんだけど、昔のゲームってこまめにセーブしながらちまちま進めるみたいなことができないので一気にやるしかない。しかしボロいテレビを長時間稼働させたくないので結局永遠にクリアできないみたいな事になっている。ロックマン5とか完全に酷くて、ゲーム全体の半分ぐらいの所がパスワードで記録できる最終地点になっている。

SPCで音を出す

いままで後回しにしてきたSPC700のコントロールに挑戦。

楽器のサンプリングを持っていないので、音色は手で入力した矩形波ファミコンみたいな音だけど、ADSRが効いてるので多少マシかな?
実機でハマった点が2つ

  • SPCは起動時にミュートがかかっているので解除する必要がある(エミュレータだと再現されていない場合がある)
  • フィルタ関係のレジスタにゴミが入っているので、初期化しないと音がおかしくなる(エミュレータでは勝手に初期化されている)

使っていないチャンネルも明示的にキーオフして初期化したほうがいいのかもしれない。

SPCはやってる人が少なく、情報も少ないのでなかなか難儀。リッチすぎてあまりチップチューン屋の心が躍らないのかもしれない。SPCってPCMでしょ?だったら普通のシンセ使うわ、みたいな感じで。

状況です

敵キャラを置いたりタイトル画面を付けたりして、だいぶ立派になった。ステージが1つしか無いけど。
コイン(?)を10枚取ると「10」と書かれたドアに入れて、20枚とれば「20」のドアに、というシステムになっている。もちろんステージが増えたら分岐するように。

ところで、高級言語と違ってアセンブリではreturn命令(rts/rti)を書かないと本当にリターンしないでそのまま次のサブルーチンに突き抜けていくという大惨事が起きるので、return命令を忘れていないか自動でチェックするスクリプトをかますようにした。 突き抜けた先のrtsにうまくぶつかって、偶然動いてしまう場合もあるので……

テレビを買った

f:id:gyuque:20150702231438j:plain

どうせならレトロゲームに似合うやつを、ということで1975年製ブラウン管です。写真では伝わりにくいがかなりの小型なのであんまり邪魔にはならない。
スーパーファミコンよりメガドライブが似合いそうな感じがするな。

f:id:gyuque:20150702232201j:plain

f:id:gyuque:20150702232428j:plain

自作のプログラムを映してみたところ。やっぱりテレビに映るとテレビゲームを作っているという気分が盛り上がる?かもしれない。

f:id:gyuque:20150703003947p:plain

ところでスーパーファミコンにはフェードアウト演出等のために画面を暗くする機能があり、走査線が画面上を走っている途中に操作すると、画面の上半分、あるいは下半分だけ暗くする、といったことができる(海腹川背の水面はこれで描かれている)のだけれど、今のところこれを簡単なベンチマークとして使っている。つまり1フレーム分の処理が終わった時点でどれくらい走査線が下まで降りてきているか、というのを見て、もうちょっと処理を入れても大丈夫そうだな、という判断をしている。
まあ随分と野蛮な方法だけど、任天堂公式の開発キットには計測ツールとかがあったんだろうか。

アクションゲーム活動

スーパーファミコン実機で収録

トゲに当たると死ぬ、という処理が入り、デモからゲームへ昇格しました。ただし、進んだ先には人を馬鹿にしたようなゴールの看板があるだけです。

現在のプログラムの規模はアセンブリで5000行程度。本質的にやっている事は少ないので、意外と頭の中だけでプログラムの構造を管理できます。他人が見たらどう思うかはともかく……

初夏のスー活

こんな状況。

以前とあまり変わり映えしないように見えるけど、前のは床の当たり判定しか見てない(頭を天井にぶつけてもすり抜ける)ハリボテだった。ので、中身はかなり進化している。
やっぱプラットフォーマー(アクションゲーム)はロマンだよ。なんでみんなRPGを作りたがるのか……



さて、プログラムが複雑になってくると、デバッグの方法を考えなければいけない。地球上に70億も人間がいると相当におかしい人もいて、世の中にはスーパーファミコン用プログラムのデバッガというものが存在する。

いろいろ機能があるけど主に使っているのはメモリビューアで、デバッグ情報を空いているメモリ領域に書き込んでそれをビューアで切り出すという方法でログを取ることができる。(一応書いておくと、コンソールなんてものは無い)
f:id:gyuque:20150604021843p:plain
画像では初期値で埋められているけど、ロギングのルーチンを有効にすると、赤枠で囲った部分にログが書き込まれる。下のような感じで。

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

これだけ見ても意味が分からないが、これは当たり判定の動きがおかしかった際に取ったキャラクターの座標のログで、プロットすると下図のようになる。
f:id:gyuque:20150604022409p:plain
左の薄茶色は地形のブロックで、暗緑はキャラクター。注目すべきは11番で、キャラクターが地形にめり込んでいるにも関わらず位置が補正されていない(補正前=黒いドットと補正後=緑のドットが同じ位置にある)ので、ここを詳しく調べていく……という感じ。

スーファミ現役時代に実際の現場でどういうデバッグをしていたのかは知らないけど、当時だと方眼紙に手でプロットという力技もありそうかな。90年代ぐらいだと、まだ何もかも画面の上で済ませるという感覚ではなかったと思う。