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

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

[第375回]


●バグ取りで1日つぶれてしまいました

本日も1日中CP/M互換DOSの説明書作成関連の作業をしておりました。
説明書そのものはほぼ完了するところまでできてきました。
本日は説明書を仕上げつつ、当ホームページで過去に引用しましたサンプルプログラムを再実行する作業をしておりましたところ、以前はちゃんと動作しておりましたのに、正しく動作してくれないプログラムにぶつかってしまったものですから、
なぜだ?
というわけで、その追求をしておりました。
それがなにしろファンクション22(ランダムライト)だったものですから、なかなかにホネな作業になってしまいました。
ほぼ一日を費やしまして、やっと原因をつきとめ、修正をすることができました。
やれやれです。
あとまだつぶさなければならない問題がいくつか残っています。
本当は来週始めには完成の予定だったのですが、この分ではあと数日かかるかもしれません。
なかなかに難儀なことではあります。

●ZB3BASIC用STARTREKのデバッグ作業(続き)

前回からの続きです。
ログの記録をもとに、プログラムリストを見ながらプログラムの流れを追っていきましたところ、あれえ?というところをみつけました。
というところまで、前回は説明をいたしました。

プログラムの下の部分に問題がありました。

2080 FOR I=1 TO 9:IF LEFT$(A$,3)<>MID$(A1$,3*I-2,3)THEN GOTO 2160
2140 ON I GOTO 2300,1980,4000,4260,4700,5530,5690,7290,6270
2160 NEXT I

FOR〜NEXTの中で ON GOTOが使われています。
やばいことをやっているなあ、と思ってその流れを追ってみましたら。
やっぱり。
NEXTを実行しないまま、元に戻ってしまっているらしいことがわかりました。
めちゃめちゃ複雑な動きをしているものですから、絶対にそうだとは断言できないのですけれど、そういうことにほぼ間違いはないようです。

そういうことだとしますと。
ZB3BASICの場合、FOR〜NEXTはスタックを使っているものですから、スタックが食い違ってしまって、その結果暴走してしまうことになります。

うむむむ。
いやあ。まいった。
こういうプログラムはタブーのはずなんだけどなあ…。
しかし。
MBASICはこれでも平気なのか。
うむ。
今更ながら、恐れ入りました。

さて。
ZB3BASICの場合。
当然のことながら対策が必要です。
もっとも安全な対策はこういうところでは(FOR〜NEXTの途中で外に出てしまう場合は)、FOR〜NEXTを使わないで、IF GOTOにすることです。

で。
このように直しました。

2080 I=1
2090 IF LEFT$(A$,3)<>MID$(A1$,3*I-2,3)THEN GOTO 2160
2140 ON I GOTO 2300,1980,4000,4260,4700,5530,5690,7290,6270
2160 I=I+1:IF I<=9 GOTO 2090

これならスタックを使いませんからどこに飛び出してもおかしな結果にはなりません。
よくよく確認をしましたら他にも同じようなところが何箇所かみつかりましたから、全部 IF GOTOに直しました。
そのほかにも新たにみつかったバグも直しましたので、[第367回]のプログラムリストは最新のものに差し換えました。

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

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