ワンボードマイコンをつくろう!(パソコンの原点はここから始まった)
TK80ソフトコンパチブル!8080、Z80マシン語からBASICまでこれ1台でこなせます
当記事は2009年11月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 |
2011.6.30 前へ 次へ 目次へ戻る ホームページトップへ戻る |
☆ND80ZVでBASICを。 とんでもない機能追加を思いついてしまいました。 ND80ZVでBASICを実行できるようにしようというのです。 それも浮動小数点演算ができて、三角関数や対数計算までできる本物のBASICです! |
[第50回]
●デバッグ作業の続き、のつもりだったのですが…
前回、「おばかなことをやっておりました」と書きました。
突然ブレイクもしない、ハングアップもしないで終了してしまう、という肩透かしの状態になってしまったものですから、ついうろたえてしまいました。
なんだかテストプログラムが蒸発してしまったような、異な感じになりまして…。
dmコマンドでメモリの中身を確認してみたら、ちゃんとあるじゃないのお。
なのに、なぜか全く実行してくれないで、でもハングアップもブレイクもしないで、しれっとして終了してしまうって、どういうこと?
listコマンドを入力してみたけれど、何も表示されません。
う。リストが表示されない?
……!
わかりましたあ。
そりゃあ、当たり前でした。
前回、ハングアップしてしまったときに、一旦強制終了して、それからあらためてZ80BASICシステムを起動したのでありました。
その直後にブレイクポイントを設定して、runしたのですから、何も実行しないのが当たり前でした。
Z80BASICの起動直後は、ユーザープログラムは見かけ上はクリアされているのでありました。
自分でそのように設計しておいて、自分で忘れてしまうのですからたまりません(トホ…)。
いやあ。じつに、なんともおはずかしい。
helpコマンドを実行してから、listコマンドを実行しました。
今度はちゃんとテストプログラムが表示されました。
あらためて、2397にブレイクポイントを設定してrunしました。
おお。
今度はちゃんとアドレス2397でブレイクしました。
PRINTルーチンの入り口には来ているようです。
これから先はちょいとしたテクニックなのですが、命令を1つずつ順にブレイクさせながら実行していくのでは手間がかかってたまりません。
JP命令などのプログラムが分岐するポイントごとにブレイクさせるようにすると、効率よいデバッグが行えます。
2397でPRINTルーチンにエントリした後の最初の分岐は23A1のJP NZ命令です。
そこで、23a1にブレイクポイントを設定するのですが、画面を見ますと、その前に
dm 8060,807f
を実行しています。
実はメモリのこのあたりに、これから実行するPRINT命令があるので、そこを確認しているのです。
●BASICプログラムの構造について
BASICのプログラム(ユーザープログラム)は、list文で表示されるままの形でメモリに入れられるのではなくて、処理効率がよくなるように中間コードに変換してからメモリに入れられます。
ただPRINT文の” ”で囲んだテキストのように、そのままの文字列を表示するような命令では、その文字列部分はそのままの形でメモリに入れられます。
dmコマンドで表示された内容を、右のASCIIダンプ部分で確認してみますと、行番号40のPRINT文にある、”a%=”や”b%=”がそのままあることがわかります。
しかし、その前のあたりを見ても、どこにもPRINTの文字はありません。
実はPRINTという命令は、プログラムを入力した時点で、81というコードに変換される仕組みになっているのです。
上の画面のメモリダンプリストを見ますと、アドレス806Bに81があります。
ことのついでですから、Z80BASICのデータ(ユーザプログラム)の構造について簡単に説明をいたしましょう。
ちょうど、今ターゲットにしております、PRINT文について説明をすることにいたします。
今回のテストプログラムのプログラムリストと、メモリダンプリストは、前回の作業画面に見えますけれど、そのところだけ、ログファイルから切り取って、下に示します。
>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 >dm 8000,80d5 8000 41 55 54 4F 00 80 FF DF 10 80 0C 00 B3 53 44 94 AUTO...゚....ウSD. 8010 40 F4 41 25 00 00 00 85 0A 00 02 00 42 F4 42 25 @.A%........B.B% 8020 00 00 00 85 14 00 02 00 44 F4 43 25 00 00 00 85 ........D.C%.... 8030 1E 00 02 00 F0 DF 41 00 00 00 00 85 50 00 04 00 .....゚A.....P... 8040 0A 00 08 F2 0C 00 9A FA 7B 00 0D 0B 14 00 08 F2 ........{....... 8050 18 00 9A FA C8 01 0D 0B 1E 00 0C F2 24 00 9A F2 ....ネ.......$... 8060 0C 00 2B F2 18 00 0D 0F 28 00 1F 81 22 61 25 3D ..+.....(..."a%= 8070 22 3B F2 0C 00 2C 22 62 25 3D 22 3B F2 18 00 2C ";...,"b%=";..., 8080 22 63 25 3D 22 3B F2 24 00 0D 22 32 00 0D 84 F2 "c%=";.$.."2.... 8090 0C 00 9A FA 00 00 98 FA 0A 00 0D 10 3C 00 06 81 ............<... 80A0 F2 0C 00 2C 0D 09 46 00 05 85 F2 0C 00 0D 08 50 ...,..F........P 80B0 00 0D 84 F0 30 00 9A FA 00 00 98 FA 0A 00 0D 10 ....0........... 80C0 5A 00 08 81 DE 28 F0 30 00 29 0D 0B 64 00 05 85 Z...゙(.0.)..d... 80D0 F0 30 00 0D 08 08 21 37 31 22 FC F0 00 31 00 F8 .0....!71"...1.. |
8060 0C 00 2B F2 18 00 0D 0F 28 00 1F 81 22 61 25 3D ..+.....(..."a%= 8070 22 3B F2 0C 00 2C 22 62 25 3D 22 3B F2 18 00 2C ";...,"b%=";..., 8080 22 63 25 3D 22 3B F2 24 00 0D 22 32 00 0D 84 F2 "c%=";.$.."2.... |
8000 41 55 54 4F 00 80 FF DF 10 80 0C 00 B3 53 44 94 AUTO...゚....ウSD. 8010 40 F4 41 25 00 00 00 85 0A 00 02 00 42 F4 42 25 @.A%........B.B% 8020 00 00 00 85 14 00 02 00 44 F4 43 25 00 00 00 85 ........D.C%.... 8030 1E 00 02 00 F0 DF 41 00 00 00 00 85 50 00 04 00 .....゚A.....P... |