はじめに
『MSX0 Stack』付属の IoT BASIC サンプルを『Turbo Pascal』へ移植してみます。
PERFORMC.BAS
◆負荷測定
項目 | 説明 |
---|---|
概要 | 仮想 Z80 の周波数を振ってオーバークロック余力を測定します。 |
ファイル名 | PERFORMC.BAS |
対応デバイス | |
コメント | SCREEN モードや、ネットワーク機能利用時など使用状況に影響を受けます。 |
See also:
MSX0 Stack での挙動
PERFORMC.BAS
をロードして、
実行してみました。
240% までクロックアップしながら負荷測定を行います。OVER
が表示され負荷が 100% を超えると処理が追い付いていない事を意味します。逆に言うと、負荷が 100% を超えない範囲ならクロックアップが可能という事になります。
プログラムは〔Ctrl〕+〔Stop〕(リモートコントロールパネルからは〔Ctrl〕+〔F12〕) で中断できます。
Turbo Pascal へ移植
別途、MDL-LIB と SYSUTILS.LIB
、IOT.LIB
が必要です。
program PERFORMC;
{$I MDLLIB.LIB}
{$I VRAM2.LIB}
{$I SYSUTILS.LIB}
{$I IOT.LIB}
label
JP;
type
Str4 = string[4];
const
OVSTR: array [Boolean] of Str4 = ('', 'OVER');
var
S: Byte;
I, P, W: Integer;
begin
S := sys_scrmod;
ScrMode(1);
Writeln;
Writeln('**** PERFORMANCE CHECK ****');
Writeln;
I := 0;
repeat
I := I + 20;
IoTPutInt('msx/me/pm/cpu/percent', I);
write('Z80:', I:3, '% ');
for W:=0 to 2 do
begin
Delay(I * 10);
if KeyPressed then
goto JP;
write('-');
end;
P := IoTGetInt('msx/me/pm/cpu/load');
Writeln(' LOAD:', P:3, '% ', OVSTR[P > 100]);
until I >= 280;
Writeln;
Writeln('Press any key.');
while not KeyPressed do
;
JP:
IoTPutInt('msx/me/pm/cpu/percent', 100);
ScrMode(S);
end.
実行してみました。
SAMPLE.TXT
の説明にもあったように負荷は環境によって左右されるようで、BASIC での結果よりも負荷が軽めに出るようです。
任意のキーで中断できます。
解説
ループ (1)
Pascal の for 文にステップ構文はないので、I
のループは repeat ~ until で置換しています。
ループ (2)
多重ループを抜けるために goto を使っています。Pascal に行番号はないのでラベルによるジャンプとなります。
負荷
負荷が軽めなので、280% まで測定する事にしました。
測定終了時の処理
プログラム終了時にスクリーンモードを元へ戻すようにしましたが、そうすると測定終了後の画面を確認できないため、何かのキーが押されるまで画面をそのままにしておく事にしました。
おわりに
今回の移植に関して難しい所は特にありませんでした。
記事に関連しますが、以前 MSX-DOS でクロックアップを行うトランジェントコマンド M0CLKUP を作った事があります。
MSX-C のセルフコンパイルは遅いので、M0CLKUP で 200% にクロックアップしてコンパイルし、実行形式ファイルは 100% に戻して実行する、なんて事が可能です。
事前にパフォーマンスチェックを行って、何 % くらいまでクロックアップが可能なのかを調べておくといいかもですね。