標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第358回]

●完成してしまいましたよ、というメールをいただきました

クロック信号回路についてのメールをお送りいただいたMS様(前回からそのクロック回路についての説明をはじめたところなのですが)。
そのMS様からメールをいただきました。
もう完成してしまったのだそうです。
めちゃめちゃ早いです!

まだ最後のシリアル通信の部分はお送りしていませんけれど、それ以外は全部組立を終わってしまって、動いているのだそうです!
そうですか!
動きましたか!

多分大丈夫とは思っていながら、それでも、ひょっとしたらまた何かミスがあって誤動作したりはしないだろうか、なんてちょいと不安なところもありましたから、いやあ、安心しました。
MS様。完成おめでとうございます。
そして、ご苦労様でした。
有難うございました。

うう。残りの作業を急がなければいけません。
ほんとにもうあと少し。詰めの作業だけになってきています。
多分、あと、2〜3日だと思いますので、いましばらくお待ちください。

●さて前回の続きです

クロック信号回路についてなのですが、ストレートに説明をするのは、ちょっとむつかしいようです。
以前どこかで書いたように思いますが、回路というものにも、それを考える人の思想なり性格なりがあらわれているように思います。
今回のMYCPU80の回路についても、大きく言えば、そこには、私の過去の人生なり経験なりがどうしてもでてきてしまう、と思っています。
開発のコンセプトというものも、結局それを作ろうとする開発者の思想というか考えの傾向を無視しては語れないのではないかと、そう思います。

そこで、昔話からはじめます。
もどかしいのは我慢していただいて、しばらくおつきあいを願います。

●創業間も無いころの雑誌広告です


80年4月号とメモしてありますから、およそ30年前の広告です。
この2年ほど前から、会社勤めのかたわら、会社には内緒で土曜、日曜、そして夜間のフルタイムで(いつ寝ていたのでしょう)、TK80ソフトコンパチブルのオリジナルマイコンボードND80を設計、製作して、電源込み価格43000円で売り出したのです(通信販売で)。
まだ宅急便も無い時代で、もっぱら送るのは郵便小包でした。
電源つきで、トランスが重かったので、小包料金もけっこう高くなってしまい、書留小包にすると当時でも1000円ほどは、かかってしまいました。それでも創業当時から送料サービスでした。

TK80は電源は別でしたので(その電源がまたベラボーに高かった)、電源込み価格で比較すると、43000円というのはTK80のおよそ半額でした。

NECは当然のことながら自社工場で製造しているわけですし、CPUもTTLも自社生産ですから、普通に考えたら、その半額で販売して利益が出るわけがない(広告代だって零細企業にとっては大きな負担です)。
でも現実にこうやって売り出したのです。

どうやって?

TK80と同じ回路、同じ規格で作ったら、そりゃあ完全なコピーボードですけれど、同じ国内で、個人がそれをやって、NECより安く売るなんて、そりゃあ無理というもの。それにいくらなんでも回路まで同じってのは、良くないでしょう。
まあ、面倒だったので、説明書はTK80のマニュアルの一部をてきとうに無断コピーしたものをつけちゃいましたけど。
どうだ、TK80のマニュアルの通りに動作するだろう、って意味も含めて(NEC様ごめんなさい)。

回路は徹底的に見直して、省けるものはとことん省いて、安いICで代えられると思ったところは徹底して工夫して代えました。
メカニカルキーの代わりに、タッチキーを使いました。これもコストを下げるための工夫でした(とにかくキーも高かった)。
プリントパターンをそのままタッチキーとして利用したため、キーのコストは0円になりました。

このタッチキー回路には沖電気のCMOSICゲートを使いました。
当時はまだスタンダードのTTLがはばをきかせていたころで、74LSももちろん使われてはいましたが、スタンダードに比べるとまだまだ高かったという、そういう時代でしたから、まあ、時代の先端をいっていた、のではないでしょうか。
当時はCMOSは壊れやすいなどということがわりとよく言われていたようで、製品に使うことに躊躇するむきもあったようにも思いますが、私は実際にさわった経験から、言われているほどCMOSはもろいものではないと思っていましたので、平気でCMOSも製品に取り入れていました。
ですから、私は、CMOSには慣れているのです。

電源も今のように+5V単一ではありません。
何しろCPUは8080でしたから、+5Vのほかに+12Vと−5Vも必要でした。
それを1つのトランスを使って、ブリッジ整流回路と、7812、7805、7905を使って、オンボードで(!)供給したのです。
その電源も含めて43000円ですから、安い!といえるでしょう。

プリント基板も、当然レジストは無し、です。ハンダレベラーのみでした。
スルーホール基板はコスト的に無理だったので、両面基板でしたが、スルーピンという両面結合用のピンを基板に100本以上、一本ずつ手作業で打ち込んでスルーホール基板と同等の仕様にしました。

そりゃあ、見た目も、回路的にも、TK80とは比べものになりません。
でも、いいじゃありませんか。
ちっとばかりみっともなくったって、ちゃんとTK80と同じように動くんですから。
世の中には、8万円はムリだけど、4万円なら出せるから、みてくれなんか気にしないから、いいよ、買うよ、と言ってくれる人だって、それなりにいるはずなのですから。

最初は内職、アルバイトのつもりではじめたのですけれど、毎月結構注文が来て、とうとう寝る時間が無くなってしまいましたので、ついに会社を辞めてしまいました。脱サラです。
まだ、長男が生まれたばかりで、それなのに、新築のマンションまでローンで買ってしまって、今から思えば、背筋が寒くなるような無鉄砲な船出でした。
(次回に続きます)

☆☆☆とうとう、といいますか、ついに、といいますか、MYCPU80をご購入いただいた方で組立作業を完了されてしまった、という方も出てまいりました。説明の方も急がなくてはいけません。今回からはいよいよTK80回路の説明です☆☆☆

●[13]TK80回路の実装です

[第318回]で説明した作業です。
今回はTK80回路を実装します。
実装する部分は、こちらのシルク図で、濃い青色で着色したところです。
だったのですが、[10]のIN、OUT命令の動作テストにTK80回路を利用することを考えたために、当初は[13]で取り付けることになっていたICなどの一部は、すでに[10]の作業で取り付けてしまいました。
リンク先の着色図も直さなければいけませんが、ちょっといまはそこまで手が回りません。
いずれは直すつもりです。

ここまで、[13]の作業まででMYCPU80のハードウェアは完成です。
あとはいよいよTK80モニタROMを実装して、TK80回路の動作テストを行います。
TK80回路の動作テストの説明は、要するに、TK80モニタの操作説明、ということになりますから、今までの命令回路の説明を行ってきた、MYCPU80操作説明書ではなくて、MYCPU80(TK80回路)操作説明書を見ていくことになります。

そこでMYCPU80(TK80回路)操作説明書の内容の紹介です。
最初は第1章 基礎知識 です。
十分おわかりの方には無用の項目です。読み飛ばしてください。
ちょっとまだ自信がないなあ、という方は復習のつもりでお読みください。

●MYCPU80(TK80回路)操作説明書 1章  基礎知識

●1. はじめに

この章では、TK80回路を使うために、最低これだけは知っていなければならない基本的な事柄について、簡単に説明します。
マイクロプロセッサやプログラムなどについて、ある程度の知識をお持ちの方は、この章は読みとばしても構いません。

●2. コンピュータの命令

コンピュータはプログラムがなければ動きません。
プログラムは命令を順番に書いて並べたものです。コンピュータはメモリに書かれたプログラムの命令をひとつずつ読みだして、実行します。
この場合の命令とはマシン語の命令のことです。
マシン語というのはコンピュータが直接理解できる命令のことです。
これに対してBASICなどの命令は、コンピュータが直接理解することはできません。
BASICのような言語はインタプリタとかコンパイラなどの翻訳プログラムによってマシン語に直してから実行します。
それではそのマシン語とは、どんな命令なのでしょうか。
以下簡単に説明をします。
なお以下の説明の大部分はコンピュータ全体に共通する事柄ですが、マシン語コードは8080固有のものです。

●コンピュータと2進法

具体的な命令について説明する前に、2進法について理解しておく必要があります。
2進法とは0と1しか使わない計算方法のことです。
私達は一般に10進法を使っています。
10進法では1+1=2です。しかし2進法では1+1=10になってしまいます。
そんなべらぼうな、と思うかもしれません。
しかしちょっと考えると私達も普段べらぼうとも何とも思わないで、10進以外の計算をしている場合があります。
下の計算をよく見て下さい。
59+1=100
ちょっと見にはべらぼうにみえますが、これに少し細工をして、こう表現してみたらどうでしょうか。
59+1=1 00
さらにこうすれば、なあんだ、そうか、わかりますね。
     59+1=1:00
 そうです。分や秒の計算は10進表記をしていますが、59の次は60にならずに上の桁(単位)に繰り上がる、60進法なのです。
さてそこでもう一度先程の計算を見てみます。
2進法の1+1=10は、10(十)ではなくて、1, 0(イチ、ゼロ)と考えて下さい。仮に ,(カンマ)をつけましたが、実際には10進と同じように10と表記します。
2進法では0と1しか使わないので、1+1=2ですぐに桁上がりをする結果、10になるのです。
同様にして10進の3は2進では11、4は100と表現します。以下5は101、6は110、7は111、8は1000、9は1001になります。
このように10進の1桁を表記するのに2進では4桁も必要になります。
しかし桁数は増えても、コンピュータにはこのほうが都合が良いのです。
電気には+と−の2通りしかありません。+を1 、−を0と考えて、コンピュータは計算をするのです。

●16進法

ところで10進の10以上の数は2進ではどう表現されるでしょうか。
9+1=10の計算は、2進では1001+1=1010になります。
この調子で計算して行くと、20は10100 、50は110010、100は1100100 となります。これだけ大きい数になると、2進←→10進の換算も厄介ですし、0と1がだらだら続いていて、見ているだけで疲れてしまいます。
コンピュータはこれでも良いのでしょうが、これではプログラムを組むのが大変です。
そこで上の2進数を見易くするため、4桁毎に区切って表示してみます。
10進の20→0001 0100 、50→0011 0010 、100→0110 0100 となって少し見易くなりました。
さてこうして4桁毎に区切って見ると、4桁の2進数はなんとなくそれぞれ10進数に置き換えができそうな気がします。
そこで置き換えてみるとつぎのようになります。
0001 0100 → 14 、0011 0010 → 32 、0110 0100 → 64
これが16進法なのです。マシン語はこの16進法で表記します。
ところで上の例はたまたま良かったのですが、このままでは表現できない数が出てきます。たとえば、1010 1110 はどう表現すればよいのでしょうか。
 1010は10、1110は14というので、1014と表現したいところですが、これは0001 0000 0001 0100 のことになってしまいます。
 そこで図1-1 を見て下さい。1010〜1111にはA〜Fの文字を当てています。


これならさきほどの1010 1110 も AE とすっきり表現できます。
そして10進←→16進の換算は比較的簡単に行うことができます。

 10進→16進の場合は割れなくなるまでどんどん16で割って行きます。
  例) 10進の1234を16進に換算します。
16)1234
 16) 77  余り2
     4  余り13(D)
上の計算により10進の1234は16進では4D2 になります。
  また2進数で表現すると0100 1101 0010になります。

逆に16進→10進の場合は各桁ごとに16のn-1乗 を掛けて最後に合計します。ここで n は桁位置を示します。
例) 16進の4D2 を10進に換算します。


このように2進数よりも16進数のほうが扱いやすいので、マシン語のプログラムは16進数で表記しますが、これはあくまで表現上の約束事であって、コンピュータの内部ではすべて2進数で処理されています。
たとえば上の例で使った16進数 4D2は、TK80回路のキーから入力するときは、そのまま 4 D 2と入れますし、LED表示器にもそのまま 4D2と表示されますが、CPUの内部には010011010010というように区切なしの2進数で入っていきます(もう少し正確に言うと、8080は8ビットのCPUで、2進数の8桁を一区切りとして扱っています。したがって上の 4D2は頭に0 をつけて、04D2にして、00000100 11010010 という形で実際は扱われています)。
2進数と16進数とは4桁毎に区切って表現するかしないかの違いがあるだけで、数そのもののもつ値は同じです。
というわけで、プログラムを組むときは普通は16進だけで扱っていればよいのですが、もともとCPU内部では2進で処理しているために、16進で考えているとよく理解できない命令にぶつかることがあります。
そのような時には、図1-1 を見ながら2進数に置き換えて考えてみて下さい。

●マシン語コード

CPU内部には区切なしの2進数で入る、と説明しましたが、正しくは8桁ごとにまとめて処理される、ということはすでに説明しました。
4桁だったり8桁だったりややこしい話が続きますが、かんじんのところですから、もうしばらく我慢して下さい。
さきほどの16進数で4桁毎に区切って表現したのは、そのほうが(人間が)理解し易いという理由からで、言わば便宜的な表記に過ぎません。
しかしこれから説明する、8桁毎の処理、というのはハード上の制約からで、とにかく回路がそうなっているのです。
TK80回路の回路図を見て下さい。CPUとメモリやI/Oポートをつなぐ線が沢山引かれています。このうちD0〜D7の8本のラインがCPUとメモリやI/Oが命令コードやデータをやりとりする線で、データバスといいます。
この線が8本なので、8080は一度に8桁のデータを読んだり、書いたりします。
この1か0で示される2進数の桁のことを、ビットといいます。
8桁ですから8ビットです。
8ビットのパソコンとか16ビットのパソコンとかいうのは、ここからきています。
そしてこの8ビットを1バイトとよぶこともあります。
さてそこで、命令コードに戻ります。そのように一度に8桁(8ビット)のデータを扱うように作られたCPUなので、命令コードも8ビットが単位になります。
言い換えれば、1バイトが命令の単位になります。
ここに、00111100という2進数があります。16進で表せば3Cです。(10進数と間違えないように、普通16進数は、3CH というように、最後にH をつけて表しますが、これが命令コードである場合には、ただ3Cと表すだけでH はつけません)
これは数値として考えれば、10進に換算して60という値になります。
一方これをCPUが命令コードとして受け取った場合には「Aレジスタの中身を+1せよ」という命令になります。
ある16進数(2進数)をCPUが命令として受け取るか、数値として受け取るかは、プログラムをルール通りに書きさえすれば、はっきりと区別されるので、誤ることはありません。

●命令の長さ

このような命令、データは決められた順序で予めメモリの中に書いておきます( これがプログラムです) 。
CPUはメモリから1バイトずつ命令コードを読んで実行して行きます。
上で説明した命令コードは8ビット(1バイト)でした。つまりこの場合CPUはメモリから1回命令コードを読むだけで、ただちに実行します。
しかし命令の中には、一度では読めなくて2〜3回読んで初めて実行できるものもあります。
一度で読めてしまう命令は1バイト長だといいます。したがって一度で読めない命令は2バイト長、3バイト長、ということになります。
たとえば3Eというコードは「Aレジスタに、数値を入れよ」という命令ですが、これだけでは実行できません。 どういう数値を入れるかを指定してやらなければなりません。3Eに続けて25と書いておくと、Aレジスタに25H が入ります。これはメモリには、図1-2 のように続けて書き込みます。


3Eが命令コードで25が数値になります。またC3と言うコードは「次に示すアドレス( メモリ番地) に無条件にジャンプせよ」という命令ですが、このコードに続いて、ジャンプ先のアドレスを指定してやらなければなりません。 これは図1-3 のように全部で 3バイトになります。はじめのC3が命令コードでそのあとの07、80が数値です

●マシン語プログラムの表記法

図1-2 と図1-3 の命令をメモリに書き込む作業を考えます。普通はいきなりメモリに書き込んだりしないで、まずノートなどに下書きしてから、書き込みます(これをコーディングといいます)。
この場合に図1-2 や図1-3 のように1バイトずつ縦に並べて書いてしまうと、あとで見たときどれが命令コードで、どれが数値だか分からなくなってしまいます。
そこで下のように書きます。
8000 3E 25
8002 C3 07 80
こうするといつも一番前に命令コードがきて、その後ろに数値がならぶので、理解し易くなります。
なお、命令コードのことを「OPコード」、数値のことを「オペランド」ともいいます。

●ニーモニック

慣れてくると、上のようにマシン語コードでいきなりコーディングすることもできるようになります。
しかしはじめのうちは、そんなに簡単にはできません。
それにマシン語だけでは、あとから見た時、どんな命令だったのか分からなくなってしまいます。(それこそ暗号表を見ているようなものです)
じつは命令コード全てに、理解し易いように、英語名(省略形)がつけられているのです。この英語名のことをニーモニックといいます。
先程の例をこのニーモニックで書いてみると、下のようになります。
MVI A,25
JMP $8007
MVIはMove Immediateの略で、JMPはJumpの略です。
8007の前に$がついているのは、当社オリジナルの8080アセンブラのルールです(一般的なルールではありません)。
なんだい、少しも分かり易くないじゃないか、と思われたかもしれません。
でも少し慣れてくると、ニーモニックでプログラムを書いたり、読んだりすることが楽にできるようになります。
なにしろマシン語コードの場合には、00から始まってFFまで、256 個もあって、そのうち8080で命令として使われているコードだけでも100個以上あるのですから全部覚えるのは不可能です。
ニーモニックも結構沢山ありますが、同じ性質のものには同じニーモニックがつけてあるので、マシン語コードよりはずいぶんまとまりやすくなります。
たとえば、MOV A,B、MOV A,C、MOV A,D、MOV A,E、MOV A,H、MOV A,L、MOV A,M など全部MOVですが、マシン語コードはひとつひとつ異なっています。
それによく使う命令は数が限られているので、それさえ覚えてしまえば、あとはうんと楽になります。(参考までに代表的なものを下にあげておきます)
MOV、MVI 、ADD 、SUB 、ANA 、ORA、XRA 、CMP、INR 、DCR 、INX、DCX、PUSH、POP 、JMP、CALL、RET 、IN、OUT 、NOP
できるだけニーモニックに慣れるようにして下さい。

以上で、最低限必要と思われる事柄についての説明は終りです。
じつはまだまだ色々知っておかなければならないことは多いのですが、後は次章以降の説明の中で、必要になったときに少しずつ説明を加えることにします。
2009.10.10upload

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