uttsu.com > N88BASIC >

機種間の実行速度差を小さくする

内容

 N88BASIC では、プログラムの実行速度は機種の速度に依存しています。なので、空ループを用いてウェイトをとっていては、機種間で実行速度に差が出てしまいます。

 ここでは、実行速度差を小さくする方法を何通りか紹介します。

T$=TIME$ 方式

 FOR ループの中に T$=TIME$ の一文を入れます。TIME$ の取得はどの機種でも時間がかかるため、機種間での差が小さくなります。

 この方法を用いる場合、あらかじめ 1 秒間で T$ = TIME$ が何度実行できるかを調べておきます。あとは実際にウェイトをかけるときにその回数だけループすれば約 1 秒間のウェイトをかけられます。

 先頭の方に次のコードを記述します。

T=0:T$=TIME$:WHILE T$=TIME$:WEND:T$=TIME$:WHILE T$=TIME$:T=T+1:WEND

 実際にウェイトをかけたいところに次のコードを記述します。次の例ではサブルーチンにしています。

*WA:FOR WA=0 TO T:WA=WA-1:T$=TIME$:NEXT:RETURN

 繰り返す回数を半分にすれば、約 0.5 秒のウェイトとなります。このようにしてウェイトの時間を設定できます。

垂直同期方式

 画面書き換えの垂直同期信号の周期を利用する方法です。IO ポートのアドレス A0H の 5 ビット目を読むことにより、垂直同期信号の発生を知ることができます(ON の場合は信号が発生)。垂直同期の周期はだいたい 1 秒間に 60 回前後ですが、機種により多少異なります。

 次の例では、約 0.5 秒のウェイトをとっています。

FOR I=0 TO 30:WHILE(INP(&HA0)AND 2^5)>0:WEND:WHILE(INP(&HA0)AND 2^5)=0:WEND:NEXT

ハードウェア割り込みを利用する

 ハードウェアのタイマを利用する方法で、BASIC だけでは実現できませんが、一番正確な方法です。BLOAD 命令などによりマシン語のプログラムを呼び出し、利用します。このサイトでも Timer Driver というプログラムを公開していますので、よかったら使ってみてください。


Copyright (C) Takashi Utsunomiya. All Rights Reserved. 2001.12.28掲載