ワンボードマイコンをつくろう!(パソコンの原点はここから始まった)
TK80ソフトコンパチブル!8080、Z80マシン語からBASICまでこれ1台でこなせます
当記事は2009年11月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 2011.6.29
前へ
次へ
目次へ戻る
ホームページトップへ戻る
☆特注品Z80ボードND80ZHの機能説明
TK80コンパチブルで、その上中日電工オリジナルのND80Zとしても動作するというZ80CPUのワンボードマイコンを企画し、その開発準備をしていたところに、ND80Zの特注品の開発依頼をいただきました。製品名はND80ZHです。
新企画のZ80ボード(ND80ZV)はこのあとで製作することになりますが、基本的な機能はND80ZHと共通していますから、まずはND80ZHの機能を説明します。

[第21回]

●たかが1クロックされど1クロック

前回、TK80がメモリアクセスにウェイトをかけていたことがわかって、それを考慮してチャタリングタイマーのルーチンのクロック数を計算し直したところ、やっと計算が合いました、と書きました。
昨晩その記事をUPしたときには、もう眠かったので、「おお!合いました」と書いて、ケリをつけてしまったのですけれど…。

本当は合っていませんでした。

その点については、計算をした時点で気がついていました(そりゃあ気がつきます)。
端数が合っていませんです。
私の計算では、D2=9017.1μsecなのですけれど、TK80ユーザーズマニアルのリストでは、9017.6(μsec)になっています(前回[第20回]の計算を参照)。
計算が0.5μsec合いません。
クロック2MHzで、1クロック分の差です。
最初は計算誤差だろう、と思ったのですが…。

02DFのルーチンがちょうど256クロックで、そしてその実行時間が端数なしの125μsecジャストになることがわかってしまいますと。

うう。
これは、計算誤差なんかじゃありえない。
ここには、何かがある…。

なぜかと言いますと。
02DF〜02E6のルーチンを1回実行するのにかかる実行時間が125μsecジャストということは、それにD1、D2、D3の繰り返し回数を掛けると、各タイマールーチンの100μsec単位での実行時間がそのまま端数無しで求まってしまうからです。
D1の場合繰り返し回数は24H(=36)なので125×36=4500になりますし、
D2は48H(=72)なので125×72=9000になりますし、
D3はD8H(=216)なので125×216=27000になります。

CPUクロックが2MHzちょうどではなくて2.048MHzであることが、こんなところで生きてくるなんて、まさかこのためにクリスタルを18.432MHzにした、なんてことはないでしょうから、ここでちょうど125μsecが得られたのは、たまたまジャストになった、ということなのでしょうけれど、そこらあたりの事情はともかくとして、そのように考えると、俄然端数部分だけがクローズアップされてきます。

100μsec以上を除外してしまうと、残るのはD1は11.2μsec、D2とD3は17.6μsecです。
この残った時間は、D1についてはMVIとRET、D2とD3については、MVIとJMPとRETの実行時間です。
メモリアクセスのウエイトを考慮すると、MVIは9クロック、RETとJMPは13クロックになります。

計算をしてみます。
D1は22×(1/2.048)=10.74μsecで、D2とD3は35×(1/2.048)=17.09μsecです。
いずれの場合も、やっぱりTK80ユーザーズマニアルのリストの数値は、私が計算によって求めた数値よりも約0.5μsec大きい値です。

D1〜D3で共通している命令は、MVIとRETです。
うう。
さては、どちらかの命令のクロック数を間違ってしまったのか。

しかし、MVIは02DF〜のルーチンでも使われています。
もしもMVIのクロック数を間違えてしまったとすると、こんなわずかな差ではありえないことになります。

おお。今度こそ、本当に見えてきました。
すると、犯人は、RET以外にはありえない。

なのですが…。


[出典]Intel社「8080 Microcomputer Systems User’s Manual September 1975」

この8080User’s ManualはCPUをつくろう![第77回]でご紹介をいたしました。
RET命令のクロック数(States)はちゃんと10になっています。
私が間違えているわけではありませんでした。

すると?

うう。まてよ。え…と。
NECの8080互換チップとインテルの8080とは、どこかが違っている、というようなことを、どこかで読んだことがあるような…。

ひょっとしたら、と思って久しぶりにご訪問をさせていただきました。
CPUをつくろう![第19回]でご紹介させていただいた、 半導体コレクション展示会場さまのサイトです。

やっぱり。思った通りでした。
このサイトの記事によりますと、NECの8080互換チップ(μPD8080A)はインテルのセカンドソースではなくて、NECの独自設計(といっても単なる真似だったようですが)によるもの、なのだそうです(以上、孫引き、伝聞です)。
そのために、オリジナルの8080とは、一部の命令のクロック数が異なっていた、のだそうです。
おお。そこ、そこんとこが知りたかった!

下記は同サイトから一部を勝手に引用させていただきました。

命令コード アセンブラ表記  clock uPDck 意味
01 ddd sss  MOV   rm, r     5/7   4/7  move

   この間省略

11 001 001  RET             10    11   return
      以下省略

clockはオリジナルの8080のクロック数で、uPDckはTK80に使われていたNECのμPD8080Aのクロック数です。
なんと。RETが10クロックではなくて、11クロックになっています!

これで、やっと、疑問氷解です。
計算が端数までぴったり合いました。
めでたし、めでたし、でありました。
CPUをつくろう!第453回(2010.3.10upload)を再編集

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

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