ワンボードマイコンをつくろう!(パソコンの原点はここから始まった)
TK80ソフトコンパチブル!8080、Z80マシン語からBASICまでこれ1台でこなせます
当記事は2009年11月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 2011.6.30
前へ
次へ
目次へ戻る
ホームページトップへ戻る
☆ND80ZVでBASICを。
とんでもない機能追加を思いついてしまいました。
ND80ZVでBASICを実行できるようにしようというのです。
それも浮動小数点演算ができて、三角関数や対数計算までできる本物のBASICです!

[第52回]

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

ここのところZ80BASICシステムプログラムのデバッグ作業について書いております。
PRINT文を含む簡単なテストプログラムを実行させたところ、画面に何も表示しないでハングアップしてしまいました。
その前に、複数に分割して作成したZ80BASICプログラムを仮アドレスにロードしてテストしたときには、ちゃんと表示されましたし期待通りの動作をしたのです。
そのことからすると、分割して作成されているシステムプログラムを再構成してメモリに割りつける過程で、プログラム相互間でCALLしたりジャンプしたりしているアドレスに食い違いがおきているか、単純にアドレスの変更ミスをしてしまっている可能性が高い、と考えられます。

とにかく全く表示してくれないのですから、真っ先にPRINT文を疑ったのでした。

ところが。
ブレイクポイントを設定しながら、PRINT命令の動作を少しずつデバッグしていきましたところ、なんと。

ブレイクポイントを設定しないで普通に実行させたときは、何も表示しないでハングアップしてしまったのに、ステップ動作をさせて追及してみましたら、画面にポロリと、文字 a が表示されてしまいました。

こ、これは何かの間違いに違いない…。

さらに続けてブレイクポイントを設定しながら、そこのところを実行させてみましたら…。



アドレス23CBのJP NZ,PRN34の条件が変わって、ZフラグがONになったとき、つまりその前のDEC Cの結果が0になったときに、JP NZ,PRN34の次に実行されるのは、アドレス23CEのJP PRNT6です。
そこで、23CEにブレイクポイントを設定して、リターンしてみました。

bp 23ce
rt

です。
すると、さきほどの a の続きの文字列、 %= が表示されたあと、ブレイクしました。

PRINT命令を疑っていたのですけれど、どうやら違っていたようです。
いや、まだ、PRINT命令が無罪放免と決まったわけではありませんが、こうなってくると、なにかほかに原因が潜んでいるようです。

しかし、デバッグのためにこうやって部分的に実行させていったら、画面に表示されるのに、普通にプログラムを実行させると「全く」画面表示が行われない、というのは非常におかしい、どこかひどくまっとうではないところがある、としか考えられません。

考えても何も思いつかないときは、とにかく下手な鉄砲でも機関銃でもなんでもやたらぶっぱなしてみるべきです。
そうするうちに、いたずらだぬきかきつね、ではありません、バグに命中するかもしれませんから。

ということで別の方面からさぐってみることにしました。



ひょっとしたら、普通では見えないデータの動きの中に、なにか原因が隠れているかもしれません。
そこで、USB(HID)を通じてND80ZVから送られてくる画面表示データをチェックしてみることにしました。

上の画面左は、Z80BASICのDOS側のプログラムです。
Borland C++で作成しています。
そのHID受信部分です。
右のコンパイル画面では「警告」が出されています。まだプログラムの細部では調整が完全に済んではいませんから、記述におかしなところもあるようです。でも今回の問題とは無関係ですから、とりあえずは気にしないでくださいませ。

デバッグのために、535と537の行を追加しました。
printsrは画面表示のためのユーザー関数ですが、ここは普通のprintfだと思ってください。
rbf[]はHID受信バッファです。

ND80ZVからデータを受信する都度、その内容を16進数で表示させてみました。
inbfendは受信した文字数です。



helpコマンドの入力に応答して、プログラムのアドレス情報が送られてきました。
ここまでは何の問題もありません。
でもこうやってソースプログラムにちょいと手を加えるだけで、見えなかったものが見えてくる場合があります。
なんだかおかしいなあ、と思ったら、このように、とにかく実際に見て確認できるように工夫してみる、という方法は単純ですけれど、結構ヒットする方法だと思います。

続いてlistコマンドを実行してみました。



送られてきたデータをデバッグのために表示させているところは、データ量が多すぎて、スクロールして消えてしまいました。
でもこのlistコマンドも特に異常は無いようです。
念の為にここまでのところをログファイルでも確認してみました。

logfile nd80zlog\06230710.txt open

ND80ZVに接続しました
[00],inbfend=1
send[read+]
[04][00][01][00][00][00],inbfend=6
0001 0000 - zzentry
[00],inbfend=1
[00],inbfend=1
[00],inbfend=1
[00],inbfend=1
[04][10][00][00][C3][00],inbfend=6
1000 00C3 - send goto zentry
[3E][01],inbfend=2
>help
[54][45][58][54][20][38][30][30][34][2D][38][30][44][35][0D][0A][CD][DD][BD][B3][20][44][46][45][46][2D][44][46][46][46][0D][0A][3E][01],inbfend=34
TEXT 8004-80D5
ヘンスウ DFEF-DFFF
>list
[20][20][20][20][31][30][20][41][25][3D],inbfend=10
[31][32][33][0D][0A][20][20][20][20][32][30][20][42][25][3D][34][35][36][0D][0A][20][20][20][20][33][30][20][43][25][3D][41][25][2B][42][25][0D][0A][20][20][20][20][34][30][20][50][52][49][4E][54][20][22][61][25][3D][22][3B][41][25],inbfend=68
[2C][22][62][25][3D][22][3B][42][25][2C][22][63][25][3D][22][3B][43][25][0D][0A][20][20][20][20][35][30][20][46][4F][52][20][41][25][3D][30][20][54][4F],inbfend=106
[20][31][30][0D][0A][20][20][20][20][36][30][20][50][52][49][4E][54][20][41][25][2C][0D][0A][20][20][20][20][37][30][20][4E][45][58][54][20][41][25][0D][0A][20][20][20][20][38][30][20][46][4F][52][20][41][3D][30][20][54][4F][20][31][30][0D][0A][20],inbfend=168
[20][20][20][39][30][20][50][52][49][4E][54][20][53][51][52][28][41][29][0D][0A][20][20][20][31][30][30][20][4E][45][58][54][20][41][0D][0A][3E][01],inbfend=205
    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

デバッグのためのデータ表示は、画面では画面の右端で折り返して表示されていますが、改行コードが使われているわけではありませんから、ログファイルでは1回の受信ごとに横一行に表示されています。
あ。改行コード[0D][0A]も送られてきていますが、デバッグのための表示では、それを改行情報としてではなくて、16進数コードとして文字(16進数)に変換して表示していますから、表示文字列としては改行は行われません。

さきほどinbfendは受信文字数だと書きましたが、正しくは受信バッファに読み込まれている文字数を示しています。
受信バッファに205文字まで受信してから、リストが表示されています。

う…。
ちょいとおかしいことに気が付きました。
どこかが間違っています。
そうじゃない、はずなのですがねえ。

以前に何回か説明をしましたように、HIDでは1msecに1回、それも一度には64バイトしか送受信されません。
したがってその1msecの間には何回か、プログラムが受信バッファを確認に行くはずですから、そんな、200バイトも受信バッファに溜まるはずはない、のですがねえ。

でも、溜まっています…。
画面に表示されない件が片付いていないのに、またもや新たな問題が浮上してきたようです。
でもまあ、この問題については、とりあえず後回しといたしまして、まずは画面に表示されない件を先に追求することにいたしました。

なにはともあれ、もう一度 run コマンドを入力して、テストプログラムを実行してみることにいたしましょう。
ひょっとしたら、何かが見えるかもしれません。

runコマンドを入力してみましたら。
うわあ。
なんだ、こりゃあ。

>run
[61][25][3D],inbfend=3
[31][32][33][20][20][20][20][20][20][20][62][25][3D][34][35],inbfend=18
[36][20][20][20][20][20][20][20][63][25][3D][35][37][39][0D][0A][30],inbfend=35
[20][20][20][20][20][20][20][20][20][20][20][20][31][20][20][20][20][20][20][20][20][20][20][20][20][32][20][20][20][20][20][20][20][20][20][20][20][20][33][20][20][20][20][20][20][20][20][20][20][20][20][34][20][20][20][20][20][20][20][20][20][20],inbfend=97
[20][20][35][0D][0A][36][20][20][20][20][20][20][20][20][20][20][20][20],inbfend=115
[37][20][20][20][20][20][20][20][20][20][20][20][20][38][20][20][20][20][20][20][20][20][20][20][20][20][39][20][20][20][20][20][20][20][20][20][20][20][20][31][30],inbfend=156
[20][20][20][20][20][20][20][20][20][20][20][30][0D][0A],inbfend=170
[31][2E][30][33][30][37][39][0D][0A],inbfend=179
[31][2E][30][30][30],inbfend=184
[31][32][0D][0A],inbfend=188
[31][2E][30][30][30][31][32][0D][0A],inbfend=197
[31][2E][30][30][30][31][32][0D][0A],inbfend=206
[31][2E][30][30][30][31][32][0D][0A],inbfend=215
[31][2E][30][30][30][31][32][0D][0A],inbfend=224
[31][2E][30][30][30][31][32][0D][0A],inbfend=233
[31][2E][30][30][30][31][32][0D][0A],inbfend=242
[31][2E][30][30][30][31][32][0D][0A],inbfend=251
[31][2E][30][30][30][31][32][0D][0A],inbfend=260
[31][2E][30][30][30][31][32][0D][0A],inbfend=269
[31][2E][30][30][30][31][32][0D][0A],inbfend=278
[31][2E][30][30][30][31][32][0D][0A],inbfend=287
[31][2E][30][30][30][31][32][0D][0A],inbfend=296
[31][2E][30][30][30][31][32][0D][0A],inbfend=305
[31][2E],inbfend=307
[30][30][30][31][32][0D][0A],inbfend=314
[31][2E][30][30][30][31][32][0D][0A],inbfend=323
[31][2E][30][30][30][31][32][0D][0A],inbfend=332
[31][2E][30][30][30][31][32][0D][0A],inbfend=341
[31][2E][30][30][30][31][32][0D][0A],inbfend=350
[31][2E][30][30][30][31][32][0D][0A],inbfend=359
[31][2E][30][30][30][31][32][0D][0A],inbfend=368
[31][2E][30][30][30][31][32][0D][0A],inbfend=377
[31][2E][30][30][30][31][32][0D][0A],inbfend=386
[31][2E][30][30][30][31][32][0D][0A],inbfend=395
[31][2E][30][30][30][31][32][0D][0A],inbfend=404
[31][2E][30][30][30][31][32][0D][0A],inbfend=413
[31][2E][30][30][30][31][32][0D][0A],inbfend=422
[31][2E][30][30][30][31][32][0D][0A],inbfend=431
[31][2E][30][30][30][31][32][0D],inbfend=439
[0A],inbfend=440
[31][2E][30][30],inbfend=444
[30][31][32][0D][0A],inbfend=449
[31],inbfend=450
[2E][30][30][30][31][32][0D][0A],inbfend=458
[31][2E][30][30][30][31][32][0D][0A],inbfend=467
[31][2E][30][30][30][31][32][0D][0A],inbfend=476
[31][2E][30][30][30][31][32][0D][0A],inbfend=485
[31][2E][30][30][30][31][32][0D][0A],inbfend=494
[31][2E][30][30][30][31][32][0D][0A],inbfend=503
[31][2E][30][30][30][31][32],inbfend=510
[0D][0A],inbfend=512
[31][2E][30][30],inbfend=516
[30][31][32][0D][0A],inbfend=521
[31][2E][30][30][30][31][32][0D][0A],inbfend=530
[31][2E][30][30][30][31][32][0D][0A],inbfend=539
[31][2E],inbfend=541
[30][30][30][31][32][0D][0A],inbfend=548
[31][2E][30][30][30][31][32][0D][0A],inbfend=557
[31][2E][30][30][30][31][32][0D][0A],inbfend=566
[31][2E][30][30][30][31][32][0D][0A],inbfend=575
[31][2E][30][30][30][31][32][0D][0A],inbfend=584
[31][2E][30],inbfend=587
[30][30][31][32][0D][0A],inbfend=593
[31][2E][30][30][30][31][32][0D][0A],inbfend=602
[31][2E][30][30][30][31][32][0D][0A],inbfend=611
[31][2E],inbfend=613
[30][30][30][31][32][0D][0A],inbfend=620
[31][2E][30][30][30][31][32][0D][0A],inbfend=629
[31][2E][30][30][30][31][32][0D][0A],inbfend=638
[31][2E][30][30][30][31][32][0D][0A],inbfend=647

画面は16進数データの洪水です。
文字通り、洪水のようなデータ量です。
こんなにたくさん送信されてきているのに、一文字も画面に表示されなかったなんて!なぜ?

いや、事実、一文字も表示されていないのです。
この洪水のようなデータは、デバッグのために強制的に表示させているだけで、本来の受信文字列の表示ではありません。
上のリストはログファイルの一部を表示したもので、実際はこのあとにも16進数表示はまだまだ続きますが、その間に本来表示されるべき文字列の表示はありません。

ログファイルの終わりの部分を下に示します。

[31][2E],inbfend=2782
[30][30][30][31][32][0D][0A],inbfend=2789
[31][2E][30][30][30][31][32][0D][0A],inbfend=2798
[31][2E][30][30][30][31][32][0D][0A],inbfend=2807
[31][2E][30][30][30][31][32][0D][0A],inbfend=2816
[31][2E][30][30][30][31][32][0D][0A],inbfend=2825
[31][2E][30][30][30][31][32][0D][0A],inbfend=2834
[31][2E][30][30][30][31][32][0D][0A],inbfend=2843
[31][2E][30][30][30][31][32][0D][0A],inbfend=2852
[31][2E],inbfend=2854
[30][30][30][31][32][0D][0A],inbfend=2861
[31][2E][30][30][30][31][32][0D][0A],inbfend=2870
[31][2E][30][30][30][31][32][0D][0A],inbfend=2879
[31][2E][30][30][30][31][32][0D][0A],inbfend=2888
[31][2E][30][30][30][31][32][0D][0A],inbfend=2897
[31][2E][30][30][30][31][32][0D][0A],inbfend=2906
[31][2E][30][30][30][31][32][0D][0A],inbfend=2915
[31][2E][30][30][30][31][32][0D][0A],inbfend=2924
[31][2E],inbfend=2926
[30][30][30][31][32][0D][0A],inbfend=2933
[31][2E][30][30][30][31][32][0D][0A],inbfend=2942
[31][2E][30][30],inbfend=2946
[30][31][32][0D][0A],inbfend=2951
[31][2E][30][30][30][31][32][0D][0A],inbfend=2960
[31][2E][30][30][30][31],inbfend=2966
[32][0D][0A],inbfend=2969
[31][2E],inbfend=2971
[30][30][30][31][32][0D][0A],inbfend=2978
[31][2E][30][30][30][31][32][0D][0A],inbfend=2987
[31][2E][30][30][30][31][32][0D][0A],inbfend=2996
[31],inbfend=2997
[2E][30][30][30][31][32][0D][0A],inbfend=3005

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

inbfendで示される受信バッファの文字数はなんと3000を超えています。
それなのに1文字も画面に表示されないなんて…。
それに、この洪水のような文字列は一体何なのか?

ますます謎は深まるばかり…。
一見そのように思えるのでありますが。
後になって、全てが明らかになってみますと、ここには全ての手がかりが見えておりました。

この時点では、私自身としては、まだおきていることの意味についてはっきりとは理解できていなかったのでありますけれど、このときすでに、問題解決の核心に触れていたのでありました。
CPUをつくろう!第537回(2010.6.29upload)を再編集


ワンボードマイコンをつくろう![第52回]
2011.6.30upload

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