TIME 関数使用上の注意

(New:1997/4/16)
(Update:1997/5/20)

TIME関数は(turbo Rかそうでないかによらず)60分の1秒毎にその値が1増える関数です。 TIME関数は0〜65535までの値を取り、65535の次は0に戻ります。 また、RUNしたときにも初期化されません(0になるとは限らないということ)。
TIME関数は値を代入することもできます。

TIME関数のこのような特徴を生かして、例えば速度的に標準、高速を問わないプログラムを簡単に作ることができます。

TIME関数を使ったサンプルプログラム1:
※MSX1(RAM 8KB以上)で実行可能

10  DEFINT  A−Z
20  FOR  I=1  TO  20
30    TIME=0
40    PRINT  I
50    FOR  WT!=0  TO  60
60      WT!=TIME
70    NEXT
80  NEXT
90  END
1から20までの数字を、1秒おきにモニタ(テレビ)に出力します。 標準モード、高速モードいずれでも同様に動作します。 MSX turbo Rを使っている人は標準モード、高速モード両方でお試し下さい。 サンプルプログラムはプログラムを見やすくするため、FORループに段落を付けたり、1行1命令で書いています。
注意すべきは60行。 TIME関数の値を変数に入れるところですが、ここで変数は単精度型になっていますね。 これはTIME関数が0〜65535の値を取るためで、整数型だとオーバーフローしてしまうことがあるからです(整数型変数では-32768〜32767の整数しか扱えません)。
サンプルでは普通に実行していれば、TIME関数が32768以上になることはないように見えますが、例えばSTOPキーを利用してしばらく一時停止状態にした場合などでは、TIME関数の値が32768以上になる可能性があるので(STOPキーで一時停止させてもTIME関数の値は増えていく)、TIME関数の値を代入する変数はやはり単精度型にするべきでしょう(別に倍精度型でもいいだろうけど、単精度型の方が処理速度がわずかに速い)。
TIME関数を利用する方法を含めた速度調整の方法について、詳しくは、「高速、標準両モードいけるウエイトの掛け方」をご覧ください。

TIME関数はこの他にも、RUNしてもその値が初期化されないという性質を利用して、乱数の初期化などにも使われます

TIME関数を使ったサンプルプログラム2:
※MSX1(RAM 8KB以上)で実行可能

10  DEFINT  A−Z
20  I=RND(−TIME)
30  FOR  I=0  TO  2
40    PRINT  RND(1)
50  NEXT
60  END
このプログラムを実行すると、乱数を3つ、モニタに出力します。 よほど運が良くない限り、RUNする毎に異なる乱数が出てきます。
先日、TIME関数の値を変数に代入することについて、A to Cさんから、「『TIME-32768』とすれば整数型変数でも代入可能」という御指摘を受けました。 A to C さん、つっこみありがとうございました。(^^)
MSXの適当手帳 MSX駅 西山駅