ランダムアクセス
目次
小改良
2014.8.9午前追記
非常に小さな改良ですが、投稿されました。小さくても大事です。小さなことからコツコツと。
まず冒頭、LDX #>DATA としていますが、例題の条件として「DATA の内容は 256ページ以内で、1ページに収まる」と書いていました。ということは、DATA はページの先頭から始まっていると想定してもよいはずで、これは LDX #0 と同じ意味になります。
すると、その次で >0 に 0 を入れるためだけに A に 0 を入れているのが無駄になります。
LDX #0 ; STX >0 とすればよい、ということですね。2クロックの短縮です。
次に、LOOP 中にあるたった一つの ADC 。計算式が足し算だったのでつい ADC を使っていましたが、ここは先にシフトを行って 0 になったところに数値を入れる、というのが目的です。ならば足し算ではなく、OR でもいい。実際、Z80 版ではそうしています。
それだけなら速度は同じなのですが、プログラムから ADC が無くなるため、前処理に入っている CLC が不要になります。これでまた、2クロック短縮。
いずれも小改良なのでプログラムは示しません。また、ループ内は変わっていないため、全体でも4クロック減るだけで、総計 1738 クロック。
地味な改良だけど、僕も、16bit テーブル化改良してくれた人も気づかなかった重要な発見です。
速度判定
2014.8.10 午前時点での比較です。
6502 は 1738 クロック。周波数を考慮して倍にすると、MSX での 3484 クロック相当の実時間になります。
Z80 は 4011 クロックなので、差は531クロック 14% ほどファミコンが速いです。
1割を超えるとさすがに速度差がある、というべきか。こういうメモリアクセスの多いプログラムは、Z80 の苦手なところなんです。
しかし、ゲームを作るならメモリアクセスは避けられない。
いくら Z80 がレジスタをたくさん持っていると言っても、動き回る多数の敵キャラクターを全て記憶できるほどではないのだから。
次の例題は…パッド入力