ワンボードマイコンをつくろう!(パソコンの原点はここから始まった)
TK80ソフトコンパチブル!8080、Z80マシン語からBASICまでこれ1台でこなせます
当記事は2009年11月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 |
2011.6.30 前へ 次へ 目次へ戻る ホームページトップへ戻る |
☆ND80ZVでBASICを。 とんでもない機能追加を思いついてしまいました。 ND80ZVでBASICを実行できるようにしようというのです。 それも浮動小数点演算ができて、三角関数や対数計算までできる本物のBASICです! |
[第56回]
●FOR NEXTのデバッグ
前回は/saveコマンドのデバッグ作業をしていて、listコマンドでの表示がおかしいことに気が付きました。
/saveコマンドでは受信バッファのデータをそのまま表示しているのですが、listコマンドでは受信バッファにデータがあっても表示しないで、最後にプロンプトマーク>(コード3E)と入力要求コード01を受信したときにはじめて受信バッファにたまっている全データを表示するようになっていました。
このままではたとえば非常に長いプログラムをlist表示させるときなどに困ったことになります。
なにしろ全データを受信し終わるまで、全く表示されないわけですから。
それは、困ります。
なので、そこのところは、受信する都度表示するように、C++のプログラムを直しました。
前回最後にお見せしたログファイルはデバッグのための受信データも一緒に表示されています。
下はプログラムの修正後に、デバッグ用の受信データを表示しないようにしてから、listコマンドと/saveコマンドを実行した画面です。
ひょんなことから、listコマンドの表示がまずいことに気が付いて直したのですが、それでやっとテストプログラムが何も表示しないでハングアップしてしまう理由がわかりました。
listコマンドだけではなくて、そのほかの多くのコマンドやBASICプログラムのPRINT文の表示なども同じ表示方法になっていたことがその理由でした。
どうも実数型のFOR NEXT文にバグがあるらしくて(まだこの時点では原因を追求中なのですが)そこまでくると無限ループになってしまうらしく、BASICプログラムから抜け出せないようなのです。
するとどこまでいっても、プロンプトマーク>(コード3E)と入力要求コード01が送られてこないことになりますから、受信バッファにはそれ以前の表示データは溜まっていたのですけれど、それが全然表示されなくて、ハングアップしたように見えていたのです。
これで不可解に思えた現象もかなりはっきりと見えるようになってきました。
解決まであと1歩です。
とりあえず/saveコマンドでテストプログラムは保存しましたので、newコマンドでBASICプログラムをクリアしました。
newコマンドはそれまでそこに書かれていたプログラムを全消去するコマンドです。
と言っても本当にメモリクリアしてしまうのではなくて、プログラムの開始アドレス、終了アドレスや変数エリアの情報を初期化するだけですから、newコマンドを実行しただけで、まだ新たなプログラムを一行も入力していないときでしたら、helpコマンドで元通りにプログラムを復活させることができます。
さてここでは新規にプログラムを書くために、まずnewコマンドを実行しました。
もうlistコマンドを入力しても何も表示されなくなりました。
ちょっとわかりにくいのですが、newの下でlistと入力したその下にはプロンプトマーク>しか表示されていません。
10のfor文と20のnext文は、その後でキーボードから新たに入力したものです。
実数型のFOR NEXTがおかしい、ということはほぼ確実になりましたから、余計な部分は省いてしまって、画面のようにFORとNEXTだけにして実行してみました。
これは予想通りハングアップしてしまいました。
そこでいよいよ実数型のFORとNEXTのデバッグです。
FOR NEXTループのカウンタに使う変数名としてA%のように整数型変数を使うと、整数型のFOR NEXT文になります。
変数名の後ろに%をつけると、その変数は整数型になります。
何もつけないで、AとかABCとだけ書いた場合、その変数は実数型になります。
上で新たに書いたテストプログラムではFOR NEXT文の変数に実数型変数のAを使いましたから、このFOR NEXTは実数型で実行されます。
FOR文のエントリアドレスは256Dです。
いきなりサブルーチンをコールしていますから、まずはそのCALL FGOSの次のアドレスにブレイクポイントを置いて、テストプログラムを実行してみます。
bp 2570
run
です。
アドレス2570でブレイクしました。
ユーザープログラムのアドレスを保持しているDEレジスタの値は…。
あれ?
4020になっています。
これはいけません。
とんでもないバグです。
実はこのZ80BASICシステムのもとになったZBK開発セット用のBASICでは、ユーザープログラムの開始アドレスは4000でした。
そこのところは、8000になるように直したつもりだったのですが、変更していないところがあったようです。
今回のZ80BASICシステムでは4000番地台にはシステムプログラムがありますから、モロ破壊されてしまっています(汗)。
この時点ではまだそのことに気が付いていないようです。
なんと恐ろしいこと。
しかしFOR NEXTの動作には幸い影響は及んでいないようです。
システムプログラムを破壊してテストプログラムが書かれてしまっているわけですけれど、とりあえずは動作しているようですし、せっかくの画面コピーですから、それを使ってしばらくは説明を続けていくことにいたします。
アドレス256Dから2580までのところで、FOR文で使っている変数のアドレスをFORVLに保存し、その変数の型をFORVTに保存しています。
変数のアドレスはDFFCで変数の型はF0(実数型)です。
[10.7.4追記ここから]
この値はアドレス2576でブレイクしたときのレジスタダンプに表示されています。
HLレジスタに変数AのアドレスDFFCが、そしてAレジスタに変数Aの型(実数型)を示すF0が入っています。
サブルーチンFGOSとLETSの実行によって、FOR A=0の部分が解読されて、実行された結果です。
テストプログラムのアドレスを保持しているDEレジスタは4020から4027に進みました。
そういえば、テストプログラムのメモリダンプリストがありませんねえ。
うっかりしていて、それを表示させるのを忘れてしまったようです。
でもここで同じ内容を再現しようとしますと、またシステムプログラムを破壊してしまいます。
もう今はバグを修正してアドレス8000からユーザープログラムが格納されるようになっていますから、この時点ではアドレスが4000からになっていたところを、アドレス8000からになってしまいますが、テストプログラムを再入力して、そのメモリダンプリストを表示させてみました。
logfile nd80zlog\07032039.txt open ND80ZVに接続しました 0001 0000 - Z1000 00C3 - *** nd80z3 basic **** > >10FOR A=0 TO 10 >20NEXT A >LIST 10 FOR A=0 TO 10 20 NEXT A >HELP TEXT 8004-8036 ヘンスウ DFFB-DFFF >DM,8000,8036 8000 04 80 10 80 00 80 FF DF 10 80 0C 00 B3 53 44 94 .......゚....ウSD. 8010 FC DF 41 00 00 00 00 85 0A 00 04 00 0A 00 0D 84 .゚A............. 8020 F0 0C 00 9A FA 00 00 98 FA 0A 00 0D 10 14 00 05 ................ 8030 85 F0 0C 00 0D 08 00 0D 10 14 00 0B F1 0C 00 9A ................ >/EXIT ndremote.exeを終了しました logfile closed at Sat Jul 03 20:39:44 2010 |
F0 0C 00 9A FA 00 00 |