ワンボードマイコンをつくろう!(パソコンの原点はここから始まった)
TK80ソフトコンパチブル!8080、Z80マシン語からBASICまでこれ1台でこなせます
当記事は2009年11月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 |
2011.7.5 前へ 次へ 目次へ戻る ホームページトップへ戻る |
☆ND80ZV組立説明書 ND80ZVは組立キットです。丁寧な組立説明書がついています。 ND80ZV組立説明書は現在はPDFファイルでダウンロードすることもできますが、ここでは作業途中の写真などもまじえて少しずつ、説明書の内容を紹介していくことにいたします。 |
[第96回]
●説明書の作成中です
ここのところずっと説明書の作成作業にかかりっきりです。
説明書を書きながら、書いた通りに動作するかどうか確認しつつ進むものですから、なかなかに手間がかかります。
昨日も、確認をしておりましたら、なんだか変な動作をみつけてしまいました。
それを追求しておりましたら、とうとう時間がなくなってしまい、ホームページをUPすることができませんでした。
一時はちょいとgloomyになってしまうような、いやーな動作で、解明するのにどこから切り崩していったものか、思案投げ首の状態でおりました。
その件につきましても、またUPしたいと思います。
そういえば、組立説明書の内容紹介も途中で止まったままですし、そもそもWindows7でUSB接続がこけてしまった件についても、まだ書いておりません。
毎日説明書の作業を進めつつ、結構あれこれ首をつっこんでおりますので、書きたいこととか、書かねばならぬこととか、あるいはちょいと読んでいただきたいことなどがぽろぽろ出てくるのですけれど、なかなかそれを書くにも手間がかかって思うにまかせません。
早く書かないとどんどん忘れていってしまいそうで、気ばかりあせっております。
ですけれど、あんまり道草ばかり食っておりますと、一体進行状況はどうなっておるのだ?
とお叱りをいただいてしまいそうで、そちらの方も気がかりです。
ですので、ここらあたりで、どのくらい、説明書ができたのか、ちょいと整理してみたいと思います。
現在、とりあえず完了した説明書です。
1)ND80ZV組立説明書
2)ND80ZV操作説明書
3)ND80ZVTK80モニタプログラム操作説明書
4)ND80ZVND80Zモニタプログラム操作説明書
5)ND80ZVUSB接続説明書
6)ND80ZVリモート接続プログラム操作説明書
現在作業中の説明書は
7)ND80ZVBASIC操作説明書 です。
これがちょいと大変でしたが、大分できてきました。
このあとまだ書かなくてはいけないものがかなり残っています。
ですけれど、MYCPU80用とか、そのほか用として、以前に作成したものが、多分一部を手直しすれば使えると思います。
以下は多分ほとんどそのまま使える説明書です。
8)8080命令説明書
9)Z80命令説明書
10)8080アセンブラASM80説明書
以下はまだ手直しが必要な説明書です。
11)Z80アセンブラZASM説明書
12)整数BASICコンパイラSBASIC説明書
13)8080ゲームプログラム説明書
あっと忘れていました。
14)Z80逆アセンブラ説明書 もつけるつもりです。
正直なところ、はやく片付けてしまって、一息つきたい気分です。
●CapsLcckキーのお話
またまた道草です。
じつはちょいと悩んでいることがありました。
キーボードのCapsLockについて、です。
私はもともとBASICやアセンブラのソースプログラムはアルファベットの大文字で書いておりました。
小文字は読みにくいのです。
大文字に比べて小文字は字体そのものが小さいところにもってきて、書体も大文字に比べて読みにくいのですよね。
ことに、l(小文字のL)と1(数字の1)の区別はつきません。間違えてしまいます。
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
大文字のほうが圧倒的に読み易いと思います(慣れということもあるとは思いますが)。
ですから、私の作ったZ80アセンブラも8080アセンブラも、そしてZ80BASICも、ソースプログラムは大文字で書くというルールになっています。
キーボードから大文字を入力するには、1文字だけでしたら、[Shift]を押しながら、アルファベットキーを押します。
でも連続で入力する、ということになりますと、ずっと[Shift]を押したまま、というのは大変なので、[CapsLock]キーを押して、大文字シフトを固定して使います。
私はそうやって使ってきたのですけれど、たとえばC++のソースプログラムなどは、大文字と小文字を使い分けたりするためか、普通は小文字を優先しているようです。
PICのアセンブラソースもやっぱり小文字を主に使っているようです。
そうなってきますと、せっかくのBASICのシステムですけれど、そのあたりの考慮が必要になってきます。
一番いいのは、BASICのシステム側で、大文字だけではなくて小文字でも受付けるようにできることなのですが、それをやるのは大変な手間がかかります。
そこで、コマンドプロンプトのWindows側のプログラムで、キー入力したキーコードを大文字に置き換えて、それをND80ZVのBASICプログラムに送るように考えました。
現在はそのようになっているのですが、ちょいと悩ましい問題があるのです。
あ。
今、ここまで書いていて、少しわかってきたことがあります。
今まで事態が飲み込めなくていささか混乱していたのですけれど、ここ2〜3日、悩みながらあちこちサーチしたおかげで、ようやくちょっとはわかってきたように思います。
いきなり、なんなのだ、ということなのですが。
ちょっと、説明の方向が変わります。
そのようにキー入力された文字コードを、小文字→大文字に変換することによって、めでたし、めでたし、のはずだったのですが。
困ったことが出てきたのです。
その変換は、アルファベットのA〜Zについてだけ行っていて、実際それでよいはずだったのですが、それではよくないことがでてきてしまったのです。
問題は、A〜Z以外のキーでおきていました。
たとえば大文字シフトの状態(CapsLockがオン)のときでも、1〜0のキーは、そのまま1〜0として働きます。
CapsLockがオンでもオフでも、1〜0のキーを押せば1〜0が入力されます。
[Shift]を押しながら1〜0を押すと、!”#$…が入力されます。
そりゃあ、当たり前…のはずだったのですけれど。
当たり前じゃあなかった、のです。
CapsLockがオンのときに、コマンドプロンプトのそのままの入力では、確かに何の問題もおきないのですけれど、ひとたびリモート接続プログラムを起動させて、ND80ZVと接続して、キーボードから入力を開始しますと…。
CapsLockがオフならばよいのですけれど、CapsLockがオンの状態でキー入力をしますと、1、2、3…と入力したはずなのに、なんと!、”、#…が入力されてしまいます。
んな、ばかな…。
で、しばらく前から、さて、どうしたものかと悩んでいたのです。
ところが。
唐突なのですが、実は、ここのところ、BASICの説明書を書きながら、実際にND80ZVをUSB接続して、そこでプログラムを書いて走らせながら、動作確認をしつつ、作業を進めております。
それで。
そのCapsLockの件については、ちょいとどうしようもないなあ、という感じでしたので、もう仕方がありませんから、リモート接続操作説明書の最初のところで、「CapsLockはオフにして使ってください」というように注意書きを入れました。
で。その、動作確認なのですが。
WindowsXPがこけてしまって、別のパソコンに引越しをしてしまいましたので、今までWindowsXPマシンが占有しておりました、普段私がモノ書き作業に使っておりますWindows98マシンの隣の場所に、新しくWindows7マシンが引っ越してまいりました。
そういうわけで、説明書を書きながら、動作確認をする関係上、このところ何日かの間は、もっぱらND80ZVとWindows7をUSB接続して使っております。
かなりWindows7にも慣れてきました。
ええ。
ND80ZVとの接続もうまくいっております。
そこで、今、これを書いておりまして、気が付いたのでありますが。
Windows7では、別におかしくないのですよねえ。
CapsLockをONにしていても、ちゃんと1、2、3…とはいります。
さては?
ということで、席を移動いたしまして、普段ハードがらみのプログラム開発に使っております、Windows98マシンで、同じように、ND80ZVをUSB接続しまして、リモート接続プログラムを走らせて確認をしてみました。
CapsLockをオンにして、1、2、3…と入力してみましたら。
!、”、#…と表示されてしまいました。
しかし。
リモート接続プログラムを終了して、コマンドプロンプトの通常の入力の状態で、1、2、3…と入力してみますと、ちゃんと1、2、3…と入力されるじゃありませんか。
つうことは。
おお。
C++のgetch()の問題か!
簡単なプログラムを書いて確認してみました。
// kbhit test #include <stdio.h> #include<conio.h> // void main() { int c; while(1) { if(kbhit()) { c=getch(); printf("c=%x,",c); if (c==3){printf("break");break;} } } } //end |