Artichoke Brethren

カリフォルニア・ベイエリアに住む CG エンジニアの気まぐれなブログ (ただいま引っ越し中)

全然WebGLと関係ないのですけれど、最近ちょっとした事情で夜な夜なとあるファミコンのゲームのコードを読んでました(スペランカーではないです)。NES 回りとかさすがにもう枯れきってるはずなんですが、エミュはどれも完成度高いし最近は JavaScript 版なんかも使えるんですけど、逆アセンブラってあんまりいいのがないんですよね。もっとあったけどなくなってしまったのかもしれません。しかもたまたま使ったやつが微妙にバグっててちょっと悲しい思いをしました。

ndss1.png
JavaScript 版の逆アセンブラもすでにいくつかあるんですが、どちらかというとエミュ指向だったりして、今の自分のようにただソースを読みたいという場合にはあんまり向いていません。というわけで、3時間くらいかかりましたが作ってみました。

NES Disassembler  JavaScript 版

HTML5...といっても FileAPI 使ってるだけですけど、ほんとこういうツールはもうブラウザでいいな、って感じがします。

ちなみにこの逆アセンブラはどの辺がいいのかというと、
  • 2パス(以上)なのでラベルを解決する
  • 割り込みベクタからPC到達範囲を調べるので、データセクションを分離できる
  • その上ジャンプテーブルを使った間接ジャンプ先も結構追いかけてコードセクションを識別する
  • NES の IO アクセスをコメントで出してくれる
といった辺りが素敵な感じになっています。そしてこれが今後どうなるかというと・・・どうなるんだろう。。。とりあえずバンク切り替えに対応しないとですね。
あくまでエミュにせずにちゃんと解析していろいろする、というあたりに強いこだわりが感じられます(意味不明)

それではまた。

さて少しコード整理してみます。

スプラインのベジェ変換は一度やればいい話なので、キャッシュしてしまいます。動的言語はこうした処理が泥縄にかけるんで楽ですね。後悔することも多いですが・・・

これだけでかなり軽くなりましたが、やはりちょっと大きなデータを読んだりすると、すぐにMacBookAirのファンが盛大に回り始めてしまいます。これはおそらく新型のCorei7なMBAを買ってこい、ということなのだと思いますが、もうちょっとどうにかしてみます。

Firebug のプロファイラがお手軽なので、これを使ってみましょう。

profile1.jpg

こんな結果になりました。createBezierPath は svg の path エレメントを作っているところ、apply は3D座標変換ですね。差し当たって vec4 を使う意味はあまりなかったので、vec3 をそのまま使うことにします。glMatrix のベクトルは typedarray なんですが、演算だけだと通常の float array とどっちが速いんでしょうね? よく調べていないんですが、後で webgl と混ぜたい気持ちもあるので typedarray に統一していくのが良さそうです。

パーサ側も直すのが面倒なので、キャッシュした結果だけ vec3 にしました。glMatrix、Cプログラマには取っ付きにくいインタフェースですが慣れると便利です。path エレメントの生成も毎回やる必要はなかったので、これも固定にしてしまいます。d アトリビュートの変更だけで再描画できるようになりました。empty() も毎回やらなくてよくなります。この方が自然ですよね。

そして今更気づきましたが、svg の座標系は左上が原点になるので GL 的には上下が逆でした。transform アトリビュートで反転しておきます。

grabcad で iges がいくつか拾えるので、もらってきて試してみます。円弧とトリムドサーフェスがないとまだまだちゃんと出ないです・・・

(現状のデモはこちら IGES to SVG converter )

iges_ss2.jpg

↑このページのトップヘ