標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第539回]
●今回もデバッグ作業の続きです
さて前回までのデバッグでテストプログラムの行番号70までは正しく実行されることが確認できました。
そうなれば、問題はその後ろ、80〜100にあることは誰でもわかります。
いくらなんでもそこまでわかっていて、そのまま実行するのは時間のムダというものです。
80〜100はFOR NEXT文です。
FOR NEXTはその前の50〜70でも実行しています。
ただちょいと気になりますのは、50〜70は変数A%を使った整数型のFOR NEXT文であるのに対して、80〜100は変数Aを使った実数型のFOR NEXT文である点です。
ええ。FOR NEXT文については、整数型と実数型で扱いが少し異なっているのです。
でもまあ、とりあえずは、行番号90のPRINT SQR(A)を外してみることにしました。

前回でのデバッグで追加した75のSTOP文をコメント行にして、ついでに90のPRINT文もコメント文にします。
代わりに85のPRINT A,を追加しました。
で、実行してみたのですが。
あ。その結果につきましては、ログファイルでお見せします。
logfile nd80zlog\06230904.txt open
ND80ZVに接続しました
send[read+]
0001 0000 - zzentry
1000 00C3 - send goto zentry
>help
TEXT 8004-80F3
ヘンスウ DFEF-DFFF
>list
10 A%=123
15 'STOP
20 B%=456
30 C%=A%+B%
40 PRINT "a%=";A%,"b%=";B%,"c%=";C%
45 'STOP
50 FOR A%=0 TO 10
60 PRINT A%,
70 NEXT A%
75 'STOP
80 FOR A=0 TO 10
90 PRINT SQR(A)
100 NEXT A
> 90'PRINT SQR(A)
>85print a,
>list
10 A%=123
15 'STOP
20 B%=456
30 C%=A%+B%
40 PRINT "a%=";A%,"b%=";B%,"c%=";C%
45 'STOP
50 FOR A%=0 TO 10
60 PRINT A%,
70 NEXT A%
75 'STOP
80 FOR A=0 TO 10
85 PRINT A,
90 'PRINT SQR(A)
100 NEXT A
>run
ndremote.exeを終了しました
logfile closed at Wed Jun 23 09:04:11 2010
やっぱりハングアップしてしまいました。
とするとやっぱり実数型のFOR NEXT文に問題があるのでしょうか。
問題は実数演算?
結論から先に言いますと、実はその通りだったのですけれど、ここではまだちょっと惜しいことに踏み込みが足りませんでした。

もうちょっと踏み込めば、ビンゴ、だったのですけれど。
ニアミスで外れてしまいました。
上はそのニアミスです。
71と72を追加しました。
実数型の変数ABCに実数を代入したあと、PRINT文で、その内容を表示させてみよう、というわけです。

うーん。
実行してみた結果、残念ながら、かすりもしませんでした。
せっかくここまで来て、これじゃだめだったのです。

なんだ。なんだ。
わからんではないか。
ということで、いささか、やけになって、方角違いのことをやっています。
80〜100の文を整数型に直してしまいました。
この変更作業も前回説明しましたスクリーンエディタで、カーソルを各行まで移動して行っています。
これができるとほんと、便利です。
実行した結果は、またログファイルでお見せします。
logfile nd80zlog\06230907.txt open
ND80ZVに接続しました
send[read+]
0001 0000 - zzentry
1000 00C3 - send goto zentry
>help
TEXT 8004-8103
ヘンスウ DFEF-DFFF
>list
10 A%=123
15 'STOP
20 B%=456
30 C%=A%+B%
40 PRINT "a%=";A%,"b%=";B%,"c%=";C%
45 'STOP
50 FOR A%=0 TO 10
60 PRINT A%,
70 NEXT A%
75 'STOP
80 FOR A=0 TO 10
85 PRINT A,
90 'PRINT SQR(A)
100 NEXT A
> 75 STOP
>71abc=123.5
>72print "abc=";abc
>list
10 A%=123
15 'STOP
20 B%=456
30 C%=A%+B%
40 PRINT "a%=";A%,"b%=";B%,"c%=";C%
45 'STOP
50 FOR A%=0 TO 10
60 PRINT A%,
70 NEXT A%
71 ABC=123.5
72 PRINT "abc=";ABC
75 STOP
80 FOR A=0 TO 10
85 PRINT A,
90 'PRINT SQR(A)
100 NEXT A
>run
a%=123 b%=456 c%=579
0 1 2 3 4 5
6 7 8 9 10 abc=123.5
break in 75
> 75'STOP
> 80 FOR A%=0 TO 10
> 85'PRINT A,
> 90 PRINT SQR(A%)
> 100 NEXT A%
> 85 PRINT A%,
>run
a%=123 b%=456 c%=579
0 1 2 3 4 5
6 7 8 9 10 abc=123.5
0 0
1 1
2 1.41421
3 1.73205
4 2
5 2.23607
6 2.44949
7 2.64575
8 2.82843
9 3
10 3.16228
>/save bstest.txt
ndremote.exeを終了しました
logfile closed at Wed Jun 23 09:07:16 2010
まあ、ちょいと、方向違いではありますけれど、それでもとにかくちゃんと最後まで実行できました。
こうしてみると、やっぱり問題はどうやら実数型のFOR NEXT文にあるらしい、ということになりそうです。
●SQR()
ところで、行番号90のSQR()は何なのでしょうか?
表示された結果の値を見てください。
ちょいとなつかしい値ですねえ。
昔、中学校のころに憶えませんでした?
ヒトヨヒトヨニヒトミゴロとかフジサンロクオームナクなんてやりましたよね?
そうです。
SQR()はsquare root(平方根)を計算する関数です。
しっかり計算してますでしょう?
最近の方は何を見ても余り感動したり驚いたりしないらしいということなのだそうですけれど。
私などは、こういうことに素直に感動してしまいます。
なぜって。
もう何回も書いておりますように、ここで今このBASICプログラムを実行しているのは8ビットのCPU、Z80なのです。
計算機能としては、8ビットもしくは、16ビット2進数の加算と減算しかできないのですよお。
ということは、0〜255(または−128〜+127)の間の加減算か、0〜65535(または−32768〜+32767)の間の加減算しかできないのです。
小数点付の計算なんてどうやってやるのでしょう。
ねえ。
それが、あなた。
平方根ですよ、ルートですよお。
ADDとSUBだけでどうやって計算しているのでしょうねえ。
ここは、素直に、すごいなあ、とお思いになりませんか?
プログラムって、そういうことができてしまうんです。
あ。つい余談になってしまいました。
とにかく。
実数型のFOR NEXTが怪しい。
で。次回はそのFOR NEXTの追求にかかることにいたします。実数型の演算の仕組みにつきましても、ほんの少しだけ、さわり程度は説明できれば、と思っています。
2010.7.1upload
前へ
次へ
ホームページトップへ戻る