ワンボードマイコンをつくろう!(パソコンの原点はここから始まった)
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 |
>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 |
[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 |