最適化7

6502の各レジスタをプログラムで表現するために、何の型を使うか?ということについては、最初かなり迷ったのですが、とりあえずは全てのレジスタをint型にすることにしたのでした。

6502のAレジスタは8ビット幅ですので、同じく8ビット幅であるbyte型を使えれば簡単になるはずです。しかし、加算命令のキャリーを高級言語上で表現するためには一時的に9ビット目の情報が必要になりますので、byte型では無理だろうと判断して、int型を使うことにしたのです。

intは32ビット幅なので、演算結果をa & 0xFFみたいなことをやって、8ビットで切ってやったりする必要があり面倒ですが、それは仕方ないと思います。

また、JavaとかC#とかのVM上で動作する言語の場合は、byteの加算は一旦intに符号拡張してから演算されるため、逆に遅くなるらしいです。

そのため8個のフラグレジスタを、1つのint型の変数として、論理演算の組み合わせで処理することにしました。

しかし、その考えは間違っていたことに今日気がつきました。

論理演算だけでフラグ操作を構成すれば、条件分岐を使わないので高速かなあと思ったのですが、フラグの値は結果的に条件分岐命令の条件として使われるので、だったらbool型の変数8個でフラグレジスタを表現したほうが速いじゃん!っていうことに気が付いたのです。
Javaとかではifの条件にbool型しか書けないので、int型でフラグレジスタを表現したら毎回変換しないといけなくなるわけです。

マリオとかの実際のゲームのコードを見てみると、Zフラグで分岐してる場合がかなり多いですね。Zフラグを高速に操作できるように最適化しようと思います。