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

[第48回]

●BASICが動き出しました

ND80ZV試作基板のアドレス1000〜7FFFがRAMになりましたので、これでハードの準備は完了です。
次はいよいよソフトウェアの準備です。
もちろん、最初にしなければならない作業は、ZBKボードでアドレス0000〜3FFFにバンク切り換えで多重に置かれていたBASICシステムプログラムを、ND80ZVのアドレス1000〜7FFFに配置し直すことと、それでちゃんと動作してくれるように、新たな配置先に合わせてジャンプ命令やコール命令のアドレスを直す作業です。
これはなかなかに大変な作業ではありますけれど、幸いソースプログラムが保存してありましたので、ステップバイステップで順を追って作業をしていくことで、格好だけはなんとかつくところまで仕上がりました。

直さなければならないプログラムはND80ZVの側のプログラムだけではありません。
ZBKシステムでは、DOS/Vパソコンの側のプログラムもかなり大きなプログラムになっています。
こちらはBorlandC++コンパイラで作成したものです。

このC++プログラムとZBKターゲットボード上のBASICプログラムがUSBを通じて連動することではじめて意味の有る動きになるようにできています。
そのUSBのところは、FTDI社のFT245を使った仮想的なRS232C通信で行っていたのですが、今回はそれをPIC18F14K50を使ったHID通信に変更しなければなりません。

まあ、ちょいと工夫は必要でしたけれど、その通信の部分をHIDに書き換えたDOS/V側のBASICシステムプログラムを、先に作りましたリモートプログラムと合体させる形でまとめてしまいました。
なんだかちょいとまとまりのない、けっこう大きなプログラムになってしまいました。

最初はなかなかうまく応答してはくれませんでしたけれど。
およそ2日ほどもあちこちいじって調整に努めましたところ、なんとBASICシステムが応答してくれるようになりましたよ。
ちょいと。感動!です。


最初はリモートプログラムとして起動します。
あ。いまはデバッグの段階ですから、最終的にこのスタイルのままでいくかどうかは未定です。
この画面以前に何日間かの、汗、汗の作業がありました。
その結果、とりあえずはアドレス1000〜7FFFにプログラムをはめ込んで、それをzbrom2a.btkというファイルとしてsaveするところまで出来ました。

ここまでの動作テストとデバッグ作業によって、上の画面のように、BASICプログラムを作成し、それをLIST表示させるところまで出来るようになりました。
たかがプログラムリストなどと侮ることなかれ、です。
たったこれだけの表示でも、実は大変なプログラムが動いているのです。

ですから、DOS/VパソコンのキーボードからBASICのプログラムを入力作成することができて、そしてそれをLISTコマンドでプログラムリストの形で表示することができれば、BASICシステムの中心部分は正常に機能している、と判断できます。
それがどういうことなのかは、もう少し先で詳しく説明いたします。

実は、ここまでのところで、BASICのプログラムを「実行」することについても、とりあえずは、うまくいったのです。
いわば、「試運転」の成功です。

さてでは、まずは、上の画面の説明から始めることにいたしましょう。
実は上の画面はBASICの動作テストの過程でうまく動かないところが出て来てしまったために、これからその原因を確認しようとしているところなのです。

せっかくの機会でありますから(うまく動作してくれないということは、私にとっては不幸な事態なのですけれど)、その動作異常の原因を追求する過程を記録することで、今回ZB80ZVに移植しつつあるBASICシステムなるものの機能や特徴の、具体的な説明ともなる、と考えました。
いわばプログラムデバックのサンプルです。
まあ、テレビ番組のNG特集のような趣であります。

そういうことで、最初はリモートプログラムとして起動して、次に、BASICプログラムはすでにND80ZVの増設RAMアドレス1000〜7FFFに書き込まれていて、そればボタン電池でバックアップされているはずなのでありますけれど、デバッグのため、念の為に、保存してありますzbrom2a.btkをLOADしました。

そしてそこからがBASICシステムのエントリです。
DOS/Vパソコンのキーボードから z と入力すると、Z80BASICシステムにエントリします。

Z80BASICシステムにエントリすると画面に表示される文字の色が緑になります。
この機能はWindows98とWindowsXPでは確認できているのですが、なにしろMicrosoft様のことですから、いつまでこういうことが可能なのかは保証の限りではありません。
ですから最終的に着色表示にするかどうかはちょいと未定ということにさせておいてください。

ともかく今のところはそのように文字表示が緑になって、Z80BASICシステムにエントリしていることがわかるようになっています。
そしてキー入力を促すプロンプトマークとして>が表示されます。
DOSプロンプトでの>と同じ表示ですが、今はZ80BASICシステムの制御下にあります。

helpというコマンドを入力しています。
Z80BASICシステムではBASICのプログラム(ユーザープログラム)は本来のRAMアドレスの8004から後ろに置かれます。
8000〜8003はシステムのリザーブエリアです。
リセットすると、RAMの8004からに書かれていたプログラムは形の上ではクリアされて、消えてしまいます。
メモ帳などで最初は何も書かれていない画面が表示されるのと同じ意味合いです。

しかしシステムがハングアップしたとか、その他の理由があって、一旦はリセットまたは電源をOFFにしたけれども、いままで作業していたプログラムをクリアしないで復活させたい、という場合もあるはずです。
そのようなときに使うのが、helpコマンドです。

リセットする前のプログラムが(もしまだRAMの中にそのまま残っていれば)元通り復活します。
なお緑色で表示された文字は、ND80ZVからUSBを経由して送られてきた、そのままを表示しています。
キーボードから入力した文字は白色で表示されます。

そのあとに入力したlistコマンドで、helpによって「復活」したプログラムリストが表示されています。
変数名の後ろに%をつけると、その変数が「整数型」になります。
行番号40のPRINT文で結果が表示されるはずなのですが、実行してみますと全くなにも表示されません。

そこで、どこに原因があるのかを、これから追求しよう、というわけです。

実は、実は。
BASICシステムプログラムの移植作業は、この前日までは、とりあえずはうまくいっていたのでした。
上の画面のリストのプログラムもちゃんとうまく実行されたのです。

ところが。
そこまでは、とりあえず移植し易いように、もともとの置かれていたアドレスのベースをあまりいじらないで、たとえばもとはアドレス3200〜のプログラムなら、それを5200〜に置く、というように配置してデバッグしていたのです。
その結果、とりあえず試しに実行してみた上のプログラムはうまくいったのですけれど、そのほかのいろいろな命令も実行できるようにするためには、ちょっとメモリが不足してしまいます。
そこで。
もとのアドレスにこだわらないで、できるだけ空きをつくらないように、プログラムを再配置したり、複数のプログラムをまとめてひとつのプログラムにしたり、という作業を行ったのですが。

その結果、一旦はうまく動作したプログラムが、うんともすんとも言ってくれなくなってしまったのです。
がっかり、です。

何がおきてしまったのか、それを確認するために、まずはdmコマンドを使っています。
ダンプメモリです。
この機能は、リモートプログラムの/dと同じですけれど、ND80Zモニタのメモリダンプ機能とは別のプログラムです。
リモートプログラムでは、[F][4][4][0][ADRSSET][F][4][4][F][/][d]と操作したのですが、ここではもうND80ZモニタではなくてZ80BASICシステムの中にいますから、その中にあるマシン語モニタ機能にアクセスしています。
ですからアドレスはコマンドに続くパラメータとして、dm f440,f44fのように与えています。

F440〜はBASICの固定変数エリアです。
F440、F441がA%、F442、F443がB%、F444、F445がC%です。
最初が下位バイト、次が上位バイトです。
dmコマンドで値を確認したところ、
A%=000B
B%=01C8
C%=0243
であることがわかりました。
16進数の000Bは十進数の11、16進数の01C8は十進数の456、16進数の243は十進数の579です。
C%は123+456=579になっています。
A%が123ではなくて11になっているのは、行番号50〜70のFOR〜NEXT文を実行したためです。
CPUをつくろう!第533回(2010.6.24upload)を再編集

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

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