-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbasicn3.txt
321 lines (259 loc) · 20.5 KB
/
basicn3.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
☆★☆ 『MSXべーしっ君たーぼ』について その3(応用編) ☆★☆
このマニュアルでは、「MSXべーしっ君たーぼ」の使用にあたっての注意点や、
高度な使い方について説明しています。基本的な使い方については、「『MSXべ
ーしっ君たーぼ』について その1(基本編)」をご参照下さい。各命令の使用
方法については、「『MSXべーしっ君たーぼ』について その2(命令編)」をご
参照下さい。
また、付属のサンプルプログラムの使い方については、「サンプルプログラム
について」をご参照下さい。
MSXは、アスキーの商標です。
MSX-DOSは、Microsoft Corporationの登録商標です。
【8】 動かないとき
「MSXべーしっ君たーぼ」は、MSX-BASICと互換性を持つように作られていますが、
コンパイラという性格上、仕様の異なる部分が存在します。「MSX-BASICで動作した
のに『MSXべーしっ君たーぼ』ではエラーが出て動かない」場合や、「エラーは出な
いが、MSX-BASICとは動作が違う」などの時は、以下の点を確かめて下さい。
・「Illegal function call」が出て止まる
一回も使っていない変数や、宣言していない配列変数を引数として使って
いませんか。「CALL TURBO ON/OFF」でデータの受け渡しをする時は、必ず
一度使用した変数名をお使い下さい。また、配列変数を使用する時は、必ず
宣言をして下さい。
・「String formula too complex」が出て止まる
長い文字変数の式を書いていませんか。MSX-BASICでは10個の文字列スタ
ック(式の途中結果を入れておく場所)がありますが、「MSXべーしっ君た
ーぼ」には1つしかありません。文字式が複雑になるときは、いくつかの式
に分けて下さい。
・変数の型宣言をしたのに、計算結果が違う型で出る
1. DEFDBLを使って宣言していないか
「MSXべーしっ君たーぼ」では、倍精度変数宣言はすべて単精度変数
宣言として扱われます。
2. 実行命令の後で変数の型宣言をしていないか
「MSXべーしっ君たーぼ」では、機械語に変換されるプログラムの1番
最初に宣言命令がなければいけません。
・計算結果がまったく違う
整数型変数の計算式で、答えがオーバーフローしていませんか。例えば次
のような計算の場合、MSX-BASICとは違う答えが出ます。
10 A%=200
20 PRINT A%*A%
これは、整数型で扱うことのできる数値の範囲を越えたためです。このよ
うな場合、MSX-BASICでは自動的に答えを実数型にして表示しますが、「MSX
べーしっ君たーぼ」では特別な場合を除き、整数型の式は必ず整数型の答え
になるものとして計算しています。このため、実際の答えとは違った値が出
てしまいます。これを回避するためには、次のような措置を取って下さい。
10 A%=200
20 PRINT 1!*A%*A%
こうすると、式自体が実数の式として扱われます。(実数は優先度の最も
高い演算子でつけるようにして下さい。)また、特別な場合とは、答えが実
数になり得る場合のことです。例えば、割り算やべき乗算などが該当します。
・動かすと暴走する
1. #N-を使用していないか
#N-を使用している時にFOR~NEXTのパラメータがオーバーフロー
(&H8000を越える)すると、処理から抜け出せなくなります。もしも、
このような原因で暴走している場合は、その部分だけ#N+を指定するよ
うにして下さい。
なお、このようなプログラムはMSX-BASICでも動作しませんので、プ
ログラムを見直されることをお勧めします。
2. USR命令を使っていないか
もしも、USR命令がMSX-BASICの内部を使用するような構造になってい
ると、その動作は保障できません。これはメモリマップがMSX-BASIC実
行時とは違うためです。「MSXべーしっ君たーぼ」で実行している時は、
ページ1(4000H~7FFFH)に「MSXべーしっ君たーぼ」が出ていますので、
ご注意下さい。
・動作するが、速くならない
割り込み命令を使っていませんか。割り込み命令を使うと、実行時間が増
加します。
・変な動作をする
上位機種の命令を使っていませんか。MSX2でMSX2+やMSX turbo Rの命令を
使ったり、MSX2+でMSX turbo Rの命令を使うと、その動作は保障されません。
・他のMSXで動くのに動作しない
接続しているフロッピーディスクの台数が多いなど、システム構成が異な
ると、メモリのフリーエリアの関係上コンパイルできないことがあります。
・まったく動作しない
「MSXべーしっ君たーぼ」を組み込んでから、一度MSX-DOSを起動していま
せんか。「MSXべーしっ君たーぼ」は、MSX-DOSが使用するメモリに組み込ま
れます。
このため、一度MSX-DOSを起動すると「MSXべーしっ君たーぼ」がメモリか
ら消えてしまいます。
【9】 より速いプログラムを目指して
「MSXべーしっ君たーぼ」は、BASICプログラムをそのまま機械語に変換します。で
すから、計算式の書き方や変数の型によっては、その実力を十分に発揮できない場合
があります。
ここでは、「MSXべーしっ君たーぼ」の実力を十分に発揮させるためのプログラミ
ングテクニックについて解説します。
1. 変数はできるだけ整数型変数を使う
MSXの頭脳であるCPU Z80/R800には、浮動小数点演算の機能がありません。実
数型変数を計算をする時は、「MSXべーしっ君たーぼ」の内部に用意された実数
計算プログラムが動作することになります。また、式に出て出てくる実数型変数
の値が整数だとしても、内部表現は実数(例えば5は5.0と表現されます)なので、
実行速度は変わりません。
あらかじめ変数で扱う数値が整数であると分かっている場合には、整数型変数
を使用することにより、飛躍的に計算速度が向上します。また、プログラム全体
で実数を使わないのであれば、プログラムの一番始めに「DEFINT A-Z」と書いて
おくと、すべての変数が整数型として扱われます。
《 備考 》
「DEFINT A-Z」と書いた場合、変数名の「%」は省略することができます。
また、このとき実数変数を使用する場合には「!」を付けて下さい。
なお、文字型変数の場合は、「$」を付けます。
2. 割り算は「/」よりも「\」を使う
MSXの割り算記号には「/」と「\」があります。「/」は実数の割り算で「\」
は整数の割り算です。Z80/R800では実数を直接扱うことができませんので、「\」
を使うと計算速度が向上します。
《 備考 》
「\」を使うと、小数点以下の演算結果が切り捨てられます。
3. 「^」はできる限り「*」で代用する
「^」はN乗を求める演算子です。例えば「A=A^4」という式の場合、「MSXべー
しっ君たーぼ」の内部では「A=A*A*A*A」という形に直されてから実行されます。
ですから、あらかじめ「A*A*A*A」という式を書いておけば、式の変換がなくな
る分だけ実行速度が速くなります。
4. 整数型変数の割り算は、できる限り2のN乗で割る
Z80/R800には、割り算の命令がありません。しかし、2のN乗で割る場合は、シ
フト命令という機能を使うことにより、高速に演算することができます。ですか
ら、2のN乗で割るようにすると、計算速度が向上します。
5. MSX2/2+では、整数型変数の掛け算もなるべく2のN上で掛けるようにする
Z80には掛算命令がありません。しかし割り算同様、2のN乗を掛ける場合には、
シフト命令を使うことにより、高速に演算することができます。
また、割り算の場合と異なり、2のN乗以外の次の数値で掛ける場合も高速処理
できるようになっています。
3, 5, 6, 7, 9, 10, 20, 25, 40, 50, 80, 100, 200, 257
6. 配列の大きさは、できる限り2のN乗にする
配列変数は、メモリの連続した領域に確保されます。ですから、指定された配
列変数を使用するときには、掛け算が使用されます。したがって、DIMで定義す
る時は 5. で説明した数値-1を使うと、処理が高速になります。またどうしても
望ましい数値を使うことができない場合は、その数値を一番右側の添字に書くよ
うに宣言して下
さい。
7. あまり「CALL TURBO ON/OFF」を繰り返さない
「CALL TURBO OFF」を使うとMSX-BASICで実行されるようになるので、当然遅
くなりますが、それ以外にもコンパイル(機械語のプログラムを作り出す)時間
が必要です。「CALL TURBO ON」を使用すると、その都度コンパイルを行ないま
すから、特に高速性を持たせたいプログラムには、ON/OFFをなるべく使用しない
ように工夫して下さい。
【10】 メモリ制限について
「MSXべーしっ君たーぼ」を使用する場合には、メインRAM上のBASICのプログラム
(ソースプログラム)と、機械語に変換されたプログラム(オブジェクトプログラム)
が同時に存在することになります。ですから、大きなプログラムをコンパイルしよう
としても、オブジェクトプログラムの入る余裕がないために、コンパイルできない場
合があります。プログラムの内容にもよりますが、だいたいの目安として、10KBくら
いまでのソースプログラムはコンパイルおよび実行が可能です。
しかし、次のような場合には、更に制限が厳しくなります。
1. 高度なシステム構成の場合
ディスクドライブの増設などをしている場合、それぞれの周辺機器が動作する
ための作業領域(ワークエリア)が必要になるため、自由に使えるメモリ(フリ
ーエリア)が少なくなっています。
2. CLEAR命令およびMAXFILES命令を使用した場合
CLEAR命令は「MSXべーしっ君たーぼ」以外の機械語プログラムが入る場所を設
定する命令です。当然フリーエリアが減りますので、「MSXべーしっ君たーぼ」
以外の機械語プログラムを使用する時以外は使わないで下さい。
MAXFILES命令は、BASICで使用するファイル数を設定するものです。これも、
ファイルを操作するためにワークエリアを確保するので、フリーエリアが減りま
す。
3. マルチステートメントを多用したプログラムの場合
コメントをいっさい使わず、しかもマルチステートメントにより極限までメモ
リの有効利用をしたソースプログラムの場合、10KBの範囲に収まっていても、コ
ンパイルできない場合があります。
4. 割り込み命令を使った場合
タイマ割り込みやファンクションキー割り込み、スプライト割り込みを使用す
ると、大きな機械語プログラムを登録しなければいけないので、プログラムでき
る領域が大幅に減少します。
5. 多くの文字変数や大きな配列変数を使っている場合
「MSXべーしっ君たーぼ」では、高速処理のため、文字変数1つにつき256バイ
トのメモリを消費します。また、配列変数も宣言した時点でメモリ領域の確保を
するため、あまり大きなものはプログラム領域に影響を与えます。
【11】 フリーエリアを増やす方法
フリーエリアを増やす方法は、大きく分けると2つあります。1つはプログラムを小
さくする方法、もう1つはワークエリアを小さくする方法です。
・プログラムを小さくする方法
1) サブルーチンの多用
似たような処理をしているものを、なるべくサブルーチンとしてまとめる。
2) マルチステートメントを使う
1行にまとめられるプログラムは、なるべくまとめるようにする。
3) コメントをなくす
コメントそのものを取ってしまってもいい場合は取る。また、どうしても
取りたくない場合は、次のようにする。
(a) コメント内の文字数を減らす。
(b) 「'」(内部では3バイト)を「REM」(内部では1バイト)に変える。
4) 余分なスペースをなくす
各命令の間に入っているスペースをなくす。プログラムは見にくくなるが、
フリーエリアが広くなる。
・ワークエリアを小さくする方法
1) ディスクを増設している場合や、RS-232Cがついている場合は、取り外す
ディスクドライブが1台の場合は、[CTRL]キーを押しながらMSXを起動する
ことにより、2ドライブシミュレータ機能を切り離すことができます。この
とき、Bドライブが使えなくなりますが、約3.5KBのメモリが節約できます。
2) MAXFILESのパラメータを少なくする
MAXFILESはOPEN命令を使う時にしか必要ありません。電源投入時は、この
数が1に設定されていますので、ファイルを1つもオープンしないときは
「MAXFILES=0」を設定して下さい。なお、MAXFILESでは、設定値が1増える
ごとに267バイトのメモリを消費します。
3) MSX-BASICの文字変数領域を小さくする
もしも「CALL RUN」で動かすプログラムや「CALL TURBO OFF」の時で文字
変数を使わないのであれば、「CLEAR 0」として文字変数領域を削除して下
さい。なお、電源投入時に文字変数領域は200バイトに設定されています。
4) 機械語領域を小さくする(その1)
今、動かそうとしているプログラムの前に別のプログラムを動かしている
と、そのプログラム中でCLEAR命令を使い、機械語領域を確保していること
があります。このような時は、1度電源を切るか、リセットをかけてからプ
ログラムを実行するようにして下さい。このようにすると、それぞれのMSX
にあった1番広いフリーエリアを取ることができます。
5) 機械語領域を小さくする(その2)
ここで紹介する方法は大変危険な方法ですから、MSXのシステムについて
十分理解されている方やアセンブラでプログラミングできる知識のある方だ
けお使い下さい。
「CLEAR 文字変数領域,&HF380」を実行することにより、フリーエリアの
上限をシステム領域ギリギリのところまで持って行くことができます。ただ
し、これはMSXのシステムをだましてフリーエリアを増やしているのですか
ら、ディスクを使ったり、機械語プログラムをインストールしている場合の
保障はまったくありません。また、&HFD9F番地(H.TIMI、1/60秒間隔タイマ
割り込みフック)のフックエリアが&HC9でない場合は、タイマ割り込みによ
り&HF380番地以下のプログラムを読んでいることになりますので、必ずこの
フックを&HC9に書き換えてからCLEARを実行するようにして下さい。
【12】 変数の内部形式
ここでは、より高度に使いこなしたい方のために、変数内部の表現方法について説
明します。
・整数型
2バイトで表現されます。表現方法はZ80/R800の16ビットデータと同じように
なりますが、MSB(最上位ビット)が符号フラグになります。
・実数型
3バイトで表現されます。表現方法は、アドレスの若い順から指数部、仮数部
Low、仮数部Hiになります。指数部と仮数部の関係は、次のようになります。
仮数部×2^指数部
指数部は80Hが0になり、マイナス1乗の時は7FHになります。
指数 : … -2 -1 0 +1 +2 …
内部表現 : … 7E 7F 80 81 82 …
仮数部は、0.5以上1未満の数で表現されます。つまりMSBが0.5、その次が0.25
といった表現になります。この方法で表現するとMSBは必ず1になります。
それではこのビットは意味のないものになってしまいますので、符号フラグと
して利用することにしています。ですから、実際にメモリを参照してその変数の
値を調べるには
(仮数部+0.5)×2^指数部
または
(仮数部-0.5)×2^指数部
と計算することになります。
仮数部の内容は次のようになります。
MSB LSB
ビット : 15 14 13 12 11 …
表現値 : 符号 2^-2 2^-3 2^-4 2^-5 …
《 例 》
1という数値は、次のようにして表現されます。
最初に「1×2^0」という表現からスタートします。まず、1は仮数部に入
り切らない数なので、指数を1つ上げて仮数部を小さくします。指数部は2
のN乗という表現ですから、指数部を1つ上げるということは、仮数部を2で
割るということになります。つまり、
(1÷2)×2^(0+1) = 0.5×2^1
です。さらに0.5が自動的に仮数部に加えられるわけですから、内部表現では
(0.5-0.5)×2^1 = 0×2^1
になります。これを先ほどの内部フォーマット通りにして16進表記すると、
81H、00H、00H
になります。マイナス1の場合は、仮数部の符号が反転しますので、
81H、00H、80H
です。
この表現方法では、仮数部で「0」を表現することはできません。ですから、
指数部が「0」の時が実数の「0」であるように処理しています。この時の仮
数部はどんな値になっていても意味を持ちません。
・文字型
文字変数は256バイトで表現されます。最初の1バイト目はその文字列の長さが
格納されています。2バイト目から256バイト目は、実際の文字データが格納され
ます。VARPTRで示されるアドレスは、文字列の長さが入っている部分を示してい
ます。
(C) Copyright 1994 ASCII Corporation. All rights reserved.