問題です。
○次のプログラムは何をするものでしょう?(MODE=2/4、PAGE=4)

答えは...実際に動かしてみて下さい。実際に動く形にしたものが↓です。
testp6.zip
画像データも必要なので、FDで動作させるようにしました。
mk2以降で test_p6.d88 をセットして起動させて下さい。
画像データは、Hashiさんの所のデータを使用させて頂きました。感謝です>Hashiさん
では、本題です。
○上のプログラムを1度動かした場合、どれくらいの時間が掛かるでしょうか?
という問題を答えるために、動作速度の計算が出来る必要があります。
P6で、動作速度について言及しているものを見たことがないような気がして、とりあえずまとめてみる事にしました。
(注意)
今回は、初代/mk2/66について、になります。
mk2SR/66SR に関しては、ちゃんと調査できていないので、また後日にまとめる事にします。
ただ、mk2SR/66SR 上で、MODE=1〜5で動作させる場合は、初期設定時では初代/mk2/66と同等の速度になるように設計されていますので、参考になるかと思います。
プログラムのある処理がどれだけの時間が掛かるかを算出するためには、
・CPUの1クロックが何MHzで動作するか(=1クロックは、何秒か)
・処理の合計が何クロックで動くか
が分かれば、その積で時間が算出できますが、P6特有の事情によりちょっと変わってきます。
1.CPUクロック
CPUは、入力されるクロックを基準として動作しています。
初代機:3.9936MHz
mk2:3.9936MHz
66:4.0000MHz
計算の際は面倒なので全部4MHzで構わないと思います。
4MHzなので1クロックは 1/4MHz = 250ns になります。
2.バスリクエスト(nBASREQ)
初代/mk2/66では、VRAMがメインRAMでもあります。
そのため両方からのアクセスがぶつからないように、画面描画をする時にCPUを止めています。
CPUに対して、アクセスしないように要求する信号がバスリクエスト(nBASREQ:負論理入力)で、実際にCPUが止まっているのを示しているのが、バスアックノリッジ(nBASACK:負論理出力)です。
mk2で実際に波形を表示させたものが↓です(MODE=2)。

真ん中やや下(下から5本目)が nBASACK です。"H"の時はCPUが動作、"L"の時は停止します。
nBASACK を見ると、H の区間がちょっと続いた後、縞模様(=L/Hの繰り返し)があり、また H の区間が続き...となっているのが分かると思います。
この H の区間は、画面に描画していない区間になります。長く H が続いている区間は、画面の一番下を表示し終わって、次フレームの画面の一番上を表示するまでの間になります。
縞模様(=L/Hの繰り返し)を拡大したものが↓です(MODE=2)。

L の区間、H の区間、…と続きますが、L の区間がちょっと長いです。
この L の区間の間に、画面描画を行っています。
MODE5の場合は、L と H の割合が変わります↓

MODE5の方が、描画するデータが多いため、CPUが止まっている時間が長くなります。
停止している時間を図示すると、こんな感じです。

で、CPUが止まっている事を考慮に入れて、平均のクロック速度を算出しておきます。
MODE1〜4:
1フレーム時間のクロック数 = 912×262
1フレーム時間のCPU停止クロック数 = 608×200
平均クロック速度 = 4MHz × (912×262 - 608×200) / 912×262 = 1.96MHz
MODE5:
1フレーム時間のクロック数 = 912×262
1フレーム時間のCPU停止クロック数 = 736×200
平均クロック速度 = 4MHz × (912×262 - 736×200) / 912×262 = 1.54MHz
かなーり画像表示のために、CPU停止を食らっていますね。
続きます。
とあるマシン語のMSX用ソフトをP6に移植しようと思っています。そこで質問があるのですが、画面表示のためのBUSREQを停止する方法はあるでしょうか? 移植しようとしているソフトはIOポートのin/outしか行わないもので、実行中に画面を描画する必要がありません(砂嵐でも可)。実行速度が重要なので、CPU動作がMSXより遅くなるのは困ります。M1サイクルで1waitはMSXも同じなのでこちらは問題ありませんが、画面表示で実行速度が半減するのは許容し難いです。
他のサイトやブログも検索してみましたが、SR的にBUSREQを止めるとか(SRのみ?)、操作しているIOポート番号も何種類かあってちょっと混乱してます。P6全機種で画面描画のBUSREQを止めてCPUを4MHzで動作させれられる手段があればご教示いただけますと幸いです。
SRに関しては、調査し切っていないのですが、以下の通りになります。
・画面OFF
OUT (&H93),2 で画面OFF、 OUT (&H93),3 で画面ON
・BUSREQ(SRのみ)
I/O ポート &HC8 のbit1 を 0 にすると、バスリクエストON
I/O ポート &HC8 のbit1 を 1 にすると、バスリクエストOFF
初代/mk2/66 は、画面OFF がバスリクエストオフになります。
mk2SR/66SR は、BUSREQ をOFF にすると、少しだけバスリクエストオフになります。画面OFF + BUSREQ OFF で、完全にバスリクエストオフになります。
(動作速度を合わせるためのようです)
で、結論は以下の通りです。
・初代/mk2/66
画面OFF で、CPU フルパワーです。
・mk2SR/66SR
画面OFF + BUSREQ OFF で、CPU フルパワーです。
フルパワー時の動作クロックは以下の通りです。
・初代/mk2 3.9936MHz
・66 4.0000MHz
・mk2SR/66SR 3.579545MHz
SR的にBUSREQオフという意味が理解できました。SRにだけ画面表示をしながら余計な?BUSREQを止める手段があるのですね。
とりあえず全機種で3.58MHz以上で動作できることが分かりましたので、目的のソフトは移植できそうです。成果物ができましたら改めてご報告に上がります。
https://youtu.be/uTFBIxBZv8M
プログラムではBUSREQオフについて、一旦#C8hを読んでbit1を立ててから#C8hに書き戻しています。特に機種判定をせずに書いていますが、SR以外で問題になることはあるでしょうか。
ポート0xC8に関しては、SR以降のみしかポートが存在しないので、特に問題ないと思います。