2013.4.16
前へ
次へ
ホームページトップへ戻る

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第371回]


●またバグがみつかりました

先回に続いて当記事用にZB3BASIC用のSTARTREKプログラムを実行していましたら、またまたエラーでブレークしてしまいました。
なかなかに大変なことです。
今回は当記事用に画像をコピーしております途中でバグに遭遇しましたものですから、ちょうどよい機会ですので、それを修正する様子などもお見せすることにいたします。

前回同様、[第367回]のBASICプログラムは最新のものに差し換えました。

こちらがエラーでブレークしてしまったときの画像です。


前回書きましたようにZB3BASICは文字定数、文字変数の文字数は39文字までという制限があります。
それは短かすぎるとお考えかも知れませんが、ZB3BASICは制御用に開発したBASICがもとになっておりまして、いろいろ用途を考えてこのような制約になっております。
さて、ご覧のようにエラーでブレークしてしまったのですが、これからが「おおおっ。そんなことがありか?」というところです。

これからプログラムを修正いたします。
スクリーンエディタの便利なところを利用します。

LISTコマンドで同じ行を表示させました。
む?
そんなことをして、どうするのだ?

こうしました。

何をしたのかわかりますでしょうか?
まずはカーソルを上に表示されている行に移動して、文字の長さを縮めて最後に”;を置いて[Enter]を押しました。
これで7360行が変更されました。
続いてカーソルを下の行に移動して行番号を7361に書き換えてから、文字列を途中から後ろだけに縮めてからそこで[Enter]を押したのです。

スクリーンエディタの便利なことがおわかりいただけたと思います。
しかし、おおっと驚いていただくのはこれからなのです。

ふつうプログラムがバグでブレークしてしまったならば、そのバグを修正して、もう一度最初から実行する、というのが常識かと思います。
コンパイラならばここでもう一度コンパイルして、それからリンクしてという手続きが必要なのですが、こういう場合にインタプリタはその強みを発揮します。
そのエラー行を修正したらすぐにまた実行することができます。

しかし。
実は、インタプリタの便利なところはそんなもんじゃないのです。
こんなことができてしまいます。

何をしたのかわかりますでしょうか。
画面真ん中から少し下のところで、先ほどの行を修正したあと、
goto 7360
を実行しています。
ええ。
インタプリタは最初からRUNする必要はないのです(こうはいかない場合も勿論ありますが)。
このようにブレークしたところから、もう一度続きを実行させることができるのです。
ちょいと驚きの機能ではありませんか?

あ。さて。
しかし、またエラーでブレークしてしまいました。
7365でも同じエラーがありました。
やはり文字列が長すぎました。
この画面はさきほどと同じように修正作業を行なったあとの画面です。
あれ?今回はエラーコードがさきほどとは違っていますね。
ま。こういうこともあります。

おっと、気がつきませんでした。
go to 7360は間違いです。
ZB3BASICには go to はありません。goto にしなければいけませんでした。

やっぱりエラーになってしまいました。

しかしこのときは go to と入力したのが原因だったとは気がつかなくて、ここがon goto文の途中のところだったので、いっそのことコマンドの入力からやり直すか、と考えて
goto 7320
で、COMMAND?
の入力から再実行することにしました。
ほら。
ここはCOMコマンドを入力して、そのあとのサブコマンドを入力するところからの再実行です。
もう、インタプリタならこんなことも自由自在にできてしまいます。

●STARTREKのルールについて(その3)

ほんとうはこの説明がしたくて、それで途中でバグで止まってしまっていたのでした。
STARTREKの説明の続きです。

COMコマンドはエンタープライズ号のコンピュータに情報を要求するコマンドです。
COMMAND?
のところにCOM[Enter]
と入力すると
COMPUTER ACTIVE AND AWAITING COMMAND?
と表示されます。
ここには0〜5を入力しますが、それよりも大きな数を入力すると下の画面のように各サブコマンドの説明が表示されたあと、再入力を要求されます。



とりあえずここでは2を使います。
2は敵に光子魚雷を発射するときの方位データを計算してくれます。

DIRCTION=8.16667
DISTANCE=7.81025
と答えてくれました。
光子魚雷で敵を攻撃するのにDISTAMCEは必要ありません。
DIRCTION(発射方向)だけが必要な情報です。

あ。
ここは前回の敵と遭遇したときの場面の続きです。
こちらが前回のその画面です。


前回も書きましたように実は敵までの方向は、COMPUTERに問い合わせなくても簡単に求めることができます。
上の画面でエンタープライズ号は(1,2)にいます。
敵は(6,8)です。
すると敵までは、右に6、下に5移動することになります。
右に6、下に6の方向が”8”ですから、それよりも1/6だけ上の位置です。
つまり8+1/6=8.16667になります。

光子魚雷の発射コマンドはTORです。
TOR[Enter]と入力しました。

おお。
命中です。
KLINGONを破壊しました。

●宇宙基地にドッキング

やっと宇宙基地をみつけました。
いよいよこれから今度は宇宙基地とドッキングです。

先ほどと同じように宇宙基地までの方位と距離をコンピュータに聞きます。
COMMAND?
にCOM[Enter]と入力して、次に
3[Enter]と入力します。
DIRECTION=2.33333
DISTANCE=7.2111
というデータが得られました。
これも実はCOMPUTERに聞かなくても計算で求めることができます。

エンタープライズ号は(8,3)にいます。
宇宙基地は(2,7)です。
上に6、右に4行ったところです。
上に6、右に6が”2”の方向です。
それよりも2/6だけ”3”の方向ですから、
方向は2+2/6=2.33333になります。
そして距離は6+4=52の平方根7.2111になります。
そこでNAVコマンドでこのデータを入力するのですが、ただしQUADRANT内の移動距離は計算値の1/10を入力します。

宇宙基地にドッキングできました。

CONDITIONのところにDOCKEDと表示されています。

が。
またしてもエラーです。
むむ。
今度のエラーは重症のような…。

説明の途中ですが時間がなくなってしまいました。
続きは次回にいたします。

ワンボードマイコンでCP/Mを![第371回]
2013.4.16upload

前へ
次へ
ホームページトップへ戻る