処理時間を求める、の続きです。
4.実際に処理時間を求めてみる
まず各命令のサイクル数を横に書いてみます。

ループ/分岐/サブルーチンコールがあるので、それを考慮してサイクル数を算出します。
・10〜24行目まで、DJNZでループするので、96回繰り返しになる。
CALL先以外の合計サイクル数 = 132
→ 132x96 = 12672
・25行目のDJNZは、95回ジャンプ、1回スルー
→ 14x95+9 = 1339
・34行目のLDIRは、31回ジャンプ、1回スルー
→ 23x31+18 = 731
・37行目のLDIRは、6111回ジャンプ、1回スルー
→ 23x6111+18 = 140571
・42行目のLDIRは、31回ジャンプ、1回スルー
→ 23x31+18 = 731
・31行から44行までのサイクル数の合計
→ 142122
・1行目〜27行目までのサイクル数の合計
→ 13+12672+1339+16+142122*96*2 = 27301464
MODE2なので、平均クロックは 1.96MHz
処理時間は、27301464 * 1 / 1.96MHz = 13.929s
128x192のSCREEN3の画面を1ドットずつスクロールさせるだけなんですが、1画面分スクロールするのに大体14秒かかります。
サイクル数の計算は結構面倒なのですが、大抵は繰り返し数が多い所だけの概算で事足ります。
ちょっと遅いので、速くなる工夫をしてみます。
38行の LDIR の部分が少ないサイクル数で動かすと速くなるので、こんな感じ↓に変更してみます。
(CPY_LDIRの中身のみを変更)

LDIR → LDI×32 に展開しています。
この変更で、通常は1バイト当たり、23クロック掛かっていたのが、18 + 0.34 クロックで済みます。
LDIの個数を多くすると、+0.34クロックの部分を減らす事が出来ます。
二つのプログラムを連続するものを作りました↓
目に見えて速度が違うと思います。
test2p6.zip
mk2以降で test2_p6.d88 をセットして起動させて下さい。
画像データは、前回と同じ、Hashiさんの所のデータを使用させて頂きました。感謝です>Hashiさん
さらに速度を上げるには...いろいろ考えましたが、まだ出来そうですが........
続きます(^^;)

