MSX-BASIC

今更 MSX-BASIC を触る人がどれくらいいるだろう? とは思いますが、これはその昔、私がハマった言語です。 いわゆる「MSXパソコン」に搭載されている BASIC言語ですが、これが当時としては良く考えられたものでした。
…Tips とか言って、超基本的なことしか書いてませんが^^;


Index

整数型の宣言

乱数の初期化

謎のTips RND(-TIME) で高速化!?

初期ルーチンを後ろのほうにして高速化!?


整数型の宣言
どの言語でもそうですが、変数には文字型(string)と数値型があります。
数値型は更に実数型(double)と整数型(integer)に大別されます。 そこで、数値型変数に対してどちらにするのか宣言が必要になってきます。 整数型に宣言するには、下記のようにします。

DEFINT A

これは、A という変数を整数型にするという意味です。 この変数に対して下記コードを実行してみます。

A=1.2

結果、変数 A には 1 が入ります。 先に整数型に宣言していたので、小数点以下は切り捨てられるのです。

整数型にすることのメリットとしては…

1. 変数に割り当てられるメモリを節約できる
2. 実行速度が速くなる(これがいちばんの理由ですね)

MSX-BASIC の場合、宣言無しの数値型変数は実数型(倍精度実数)として扱われます。 小数点以下を含む数値を扱えますが、その分処理速度は遅くなってしまいます。 これは体感できるくらいの違いがあるため重要です。 特にゲームを作る場合はほとんどは整数計算で問題ありませんし、できるだけ整数で済むようにコーディングすることが望ましいです。 そのような理由から、全ての数値型変数を整数型に宣言することがあります。

DEFINT A-Z

これを実行すると、全ての数値型変数を整数型に宣言したことになります。 ゲームなどでは初期ルーチンで必ずといっていいほど入っている処理です。



乱数の初期化
10 PRINT RND(1)*100

これは 0〜99 の乱数を表示するものです。
しかし、このままでは乱数のはずなのに RUN(※)で実行するたびに数に変化がありません。 これは、乱数の初期化を行っていないためなのです。 他の言語では RANDOMIZE と書いたりすることがありますが、MSX-BASIC の場合は下記のようにします。

A=RND(-TIME)

A という変数は何でも構いません。(文字型は当然ダメですが^^;)
これで乱数の初期化(というか初期値のかき回し)になります。 じつは TIME 関数を利用しているのですね。-TIME というのがそれです。 TIME 関数は 1/60秒で自動的にカウントアップされるので、毎回初期値が変化するという仕組みです。

結果、下記のようなコードになります。

10 A=RND(-TIME)
20 PRINT RND(1)*100


実行してみると、ちゃんと乱数が得られます。


※RUN を実行すると、変数や RND の初期値が初期化されます。



RND(-TIME) で高速化!?
※これはかなり怪しい情報ですが、うちの経験上は本当だったので一応載せてます。

10 DEFINT A-Z:I=RND(-TIME)

なぜか分からないのですが、これを初期ルーチンで実行しておくと、その変数が高速になるっぽいです。

10 DEFINT A-Z:I=RND(-TIME):X=RND(-TIME):Y=RND(-TIME):S=RND(-TIME)

このように、特に高速にしたい(使用頻度の高い)変数ほど先に書くと体感できるほどの違いが出ることがあります。 I という変数名は習慣的に汎用やループ用に使うことが多いため最初にしておきます。 ゲームを作っている際に気づいたことだったのですが、体感的に倍速程度の違いが感じられることさえあります。 理由はいまだに分かりません。オカルトチックですが、実機では明らかに差が現れていました。 じつに謎です…。

たぶん、これについて書いているところは無いと思われます。あったら教えてね♪(長年の謎なので)



初期ルーチンを後ろのほうにして高速化!?
10 GOSUB 5000
20 …ここから以下メインルーチン
(中略)
以下初期ルーチン
5000 CLEAR 200:DEFINT A-Z:I=RND(-TIME)
5010 …以下初期ルーチン続き(スプライトの定義など、最初に1回実行する処理)
(中略)
5090 RETURN


当時の様々なコードを見ると、初期ルーチンを後ろに記述して GOSUB〜RETURN を使用している例が多いです。 私もこうしていました。じつは上のほうに書かれたコードほど実行速度が速いらしいのです。 何故かと言いますと、上の方ほど RAM の若い番地に記録されます。で、若い番地ほどアクセスが速いとのこと。 …と、当時聞いた^^; 処理速度を稼ぐのに色々工夫したものです。え?アセンブラで書けって?w

※体感できるくらいメモリが遅かったからなぁ…。



トップページ Tips トップ

© 1998-2010 Miecat. All rights reserved.