標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第538回]

●今回もデバッグ作業の続きです

今までPRINT文を疑ってきたのですが、どうもバグはそこではないようです。
プログラムを少しずつブレイクさせながら実行させてみると、ちゃんと画面に文字列が表示されることを確認しました。
また受信側のDOS/Vの方のプログラムに細工をして、受信データを表示させるようにしてみたところ、ND80ZVから大量のデータが送られてきていることも確認しました。
どうやら画面に表示されない原因はDOS/Vの側のプログラムにもありそうです。

今回はまた別の方向からデバッグを進めてみることにしました。
テストプログラムを少しずつ実行してみたら、どうなるでしょうか?


まずは手始めに行番号10だけを実行してみることにしました。
15 STOP
を追加します。
プログラムの行番号を10番ごとにつけるのは、このように間に別の命令文を挿入し易くするためです。
listコマンドを実行してみました。
ちゃんと行番号10と20の間に挿入されました。

run で実行してみましたら、行番号15のSTOP文でブレイクしました。
ここまでは正しく実行されることが確認できました。
それではいよいよ行番号40のPRINT文のテストです。

●スクリーンエディタ

下の画面をよく見てください。
何をしているのでしょう。

先ほどの上の画面では白い_(アンダーバー)は画面の一番下にありました。
カーソルがその位置にあることを示しています。
ところが下の画面ではその _ が上の方に移動しています。



Z80BASICを起動すると、[←][↑][↓][→]の各キーを使って、DOSプロンプトの画面の中のどこへでもカーソルを移動させることができるようになります。
これがスクリーンエディタです。

試しに皆様のパソコンでDOSプロンプトを開いてカーソルを移動してみてください。
動きませんでしょう。
通常のDOSプログラムでは原始的な行エディタ(ラインエディタ)の機能しか使えませんから、[BackSpace]や[Insert]によって行内での編集しか行えないのです。

それではBASICプログラムの作成や修正作業には余りに不便ですから、Z80BASICではカーソルを画面のどこにでも移動してプログラムの修正などが簡単に行えるようにしてあります。

上の画面では先ほど run を入力して実行する前にlist表示させたプログラムリストの15の行まで[↑]キーでカーソルを移動して、さらに[→]キーで15の右にカーソルを移動して、そこに ’ を入力したところです。
15の行を ’ でリマーク(コメント)行にするためです。

これだけでは行の内容の変更は行われません。
[Enter]キーを入力すると、その行の今表示されている内容があらためて入力されて確定されます。



この画面はそのあとの複数の動作をしてしまったあとの画面です。
まず、上の画面で行った15の行をコメント行にする作業を確定するために、そこで[Enter]キーを入力しました。
その結果、>(プロンプトマーク)がその下の20の行の左端に表示されています。
そのあとカーソルを画面の下まで移動して、そこで45のSTOP文を追加しました。

念の為にlistコマンドを入力して15の変更と45の追加が行われていることを確認してみました。



正しく変更作業が行われました。
これで今度は行番号10から40までの文が実行されるはずです。

runコマンドで実行してみました。



おお。ちゃんと40のPRINT文まで実行されました。
ここまでは問題はないようです。

それではさらに先まで実行してみることにします。



先ほどと同じ要領で、今度は45のSTOP文をコメント行にして、75のSTOP文を追加しました。

listコマンドで変更の結果を確認したあとで、runコマンドで実行してみました。



おお。ここまで正しく実行されました。

すると、問題は残りの80〜100のところに絞られる、ということになります。
ちょっと長くなりましたので、この続きは次回にすることにいたしまして、ここまでの作業をログファイルで見ていただくことにいたしましょう。

logfile nd80zlog\06230721.txt open

ND80ZVに接続しました
send[read+]
0001 0000 - zzentry
1000 00C3 - send goto zentry
>help
TEXT 8004-80D5
ヘンスウ DFEF-DFFF
>list
    10 A%=123
    20 B%=456
    30 C%=A%+B%
    40 PRINT "a%=";A%,"b%=";B%,"c%=";C%
    50 FOR A%=0 TO 10
    60 PRINT A%,
    70 NEXT A%
    80 FOR A=0 TO 10
    90 PRINT SQR(A)
   100 NEXT A
>15stop
>list
    10 A%=123
    15 STOP 
    20 B%=456
    30 C%=A%+B%
    40 PRINT "a%=";A%,"b%=";B%,"c%=";C%
    50 FOR A%=0 TO 10
    60 PRINT A%,
    70 NEXT A%
    80 FOR A=0 TO 10
    90 PRINT SQR(A)
   100 NEXT A
>run

break in 15
>    15'STOP
>45stop
>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%
    80 FOR A=0 TO 10
    90 PRINT SQR(A)
   100 NEXT A
>run
a%=123       b%=456       c%=579

break in 45
>    45'STOP
>75stop
>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
>run
a%=123       b%=456       c%=579
0            1            2            3            4            5
6            7            8            9            10           
break in 75
>    75'STOP
>/exit

ndremote.exeを終了しました
logfile closed at Wed Jun 23 07:21:22 2010

おや。
画面にはありませんでしたが、終了する前に、75のSTOP文に ’ を挿入してコメント文に直しています。
あらためて全部を通して実行してみよう、というわけです。
2010.6.30upload

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