標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第453回]
●たかが1クロックされど1クロック
前回、TK80がメモリアクセスにウェイトをかけていたことがわかって、それを考慮してチャタリングタイマーのルーチンのクロック数を計算し直したところ、やっと計算が合いました、と書きました。
昨晩その記事をUPしたときには、もう眠かったので、「おお!合いました」と書いて、ケリをつけてしまったのですけれど…。
本当は合っていませんでした。
その点については、計算をした時点で気がついていました(そりゃあ気がつきます)。
端数が合っていませんです。
私の計算では、D2=9017.1μsecなのですけれど、TK80ユーザーズマニアルのリストでは、9017.6(μsec)になっています(前回[第452回]の計算を参照)。
計算が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は[第77回]でご紹介をいたしました。
RET命令のクロック数(States)はちゃんと10になっています。
私が間違えているわけではありませんでした。
すると?
うう。まてよ。え…と。
NECの8080互換チップとインテルの8080とは、どこかが違っている、というようなことを、どこかで読んだことがあるような…。
ひょっとしたら、と思って久しぶりにご訪問をさせていただきました。
[第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のクロック数です。