Z80のDJNZ命令とIO空間

2019.09.17(since2017.1.1)
サイトマップ トップ << 電よも < <*> IOアクセスとシングルワードDMA

(2017.09.30)(googleのサーチコンソールで、このページへのクリックが発生しているのが見えるので、ちょっと追記)。

Z80の掛け算プログラム例解説で、DJNZ(Decrement and Jump if Non Zero)というあまり見ない命令を利用しているのに気が付いたでしょうか?
これは、Bレジスタをデクリメントして0でなければ相対ジャンプする命令です。

 DJNZ:if (デクリメントBレジスタ)<>0 
     then JR オペランド相対アドレス(計13ck) 
     else next命令(計8ck)

ようは、Bレジスタに回数設定し、オペランドの跳び先と、DJNZまでの命令群をその回数繰り返し実行する専用命令です(dec B; jr NZ,roop:の2命令(4+7ck)より若干遅い。(2017.10.11若干早いの数え間違いでした。) フラグを壊さないので他への影響なく使いやすいし、そもそもソースが見やすい。

他のアセンブラ(CPU)経験者は、頭にうかぶアルゴリズム実行に合う命令はどれだ?と探すので、特殊な命令に目がいかないんだろう思います。

ところで、この命令は、ハード設計者の目で見るとIND/OTD等の命令群に準備したハードの応用なんだろうと思います。
このIND,OTD系命令は、Cレジスタで示すIO空間のアドレス(のレジスタ)に、Bレジスタで設定した回数データを読み書きする命令です。データは、HLレジスタで指定するメモリアドレスを起点に、Bレジスタ指定回数回、連続したアドレスのものを利用します(アドレスインクリメントでもデクリメントでも対応する準備がある)。ソフトウエアDMAというのが分かりやすいかな?

 IO空間応用例で例えばPS2マウスですが、原理的にはシリアル(RS232C)通信で、専用ポート(元祖は有名な8251:USART)につながってました。このICは、制御・データの2アドレス(読み書き))を持っています。これを他のメモリやデバイスと重ならないように、また、合計アドレスに余裕が(ゴーストアドレスを大量に使え)ない場合、全回路のアドレスデコーダ複雑になるので、連続大量アドレスのメモリから、小数アドレスの周辺機器を8ビットアドレスのIO空間と分離すれば、デコーダの作り方として合理的です。
 ところで、マウスなら、CPUが暇なときにたまに、データポートを読んでマウスの動きを決めればいいですが(動画再生等忙しい時マウスの動きが変になるでしょ?)、たとえば、FAXやLANなら、ひとつのポート(アドレス)に大量データを連続して送受信することが必要になります。 連続するアドレスに順にアクセスするのがメモリの基本なら、同一アドレスに繰り返しアクセスするのがIOデバイスの基本という差があるので、それに特化した命令が作られたりする訳です(なるほどCISC)。

さて、余談ついでにいうと、Z80には、BCレジスタ(B:8bitとC8bitの計16ビット)に格納したデータ数値をメモリアドレスとして、アクセスできます(例 LD (BC),A;)。したがってZ80のハードウエアとしても、IO空間で使われるCレジスタが、アドレスであれば(out (C),A;)、ペアのBレジスタが上位アドレスに出力されるというのが、素直な回路想定です。 IO空間8ビットの256アドレス以外に、あるレジスタ値が上位アドレスとしてでるので、活用すれば、16bitフル64kバイトに拡張できるという記事を雑誌(IO誌かな?)で読んだの記憶があります。Z80セカンドソースICの取説をテキストに使い、若手君に導入解説したことがありますが、IOアクセスの時の上位アドレスが、固定であると(記憶が怪しいが”0”?)と書いてあって、何かの理由があって修正か?と思ったら、単なる誤記だったとか。(ザイログいわく)もともと不定ですから、なにも考えないなら、変な加筆するな!!と愚痴った記憶あります。 IND,OUD系命令を使うと、上位アドレスも変化するので、不定とするザイログ記載が無難です。

注意:Z80のIO命令のアドレス上位あくまで仕様書上は不定だと思いますし、セカンドソースメーカの思惑で、その通りかどうかも不明ですから、遊び実験ならともかく、業務に使わないように。

仕様書の誤記で思い出した話。

私の職場は、自主開発以外に、お得意様の開発した回路のIC化も行っていたのですが、開発仕様として、74シリーズのようなロジックICで組み立て実験した回路図がベースになる事がありえます。 同僚がこのような回路図のIC化に、最終的にはIC向けロジック回路に特化しますが、ある部分をロジックICのカタログに記載された等価回路を使って、手軽に初期検証行うと、得意先の検証したはずの回路が動かない!!ヘルプをうけてカタログ回路をおいかけると誤記発見。 まあ数値や、真理値表がすべてで、資料作成者も注意散漫なのかもしれません。真理値表で省略された組み合わせの挙動の確認のため、等価回路図みるのは、実はよくあります。仕様書の端から端までみて矛盾がないか最終開発までには見とかんといかんで((2019.09.17)はっきり覚えてないけど、別クロックではなくアップダウン制御信号付きカウンダだった気がするので、74HC191あたりだったかな? いや余計な話でした。現行カタログ直っているかどうか追いかける元気はない)

仕様書読んでも奥歯に何か挟まったような違和感ある表現があったとき、等価回路を想定すると、なるほどと理解できることもあります。 無駄だと思わずに隅ずみまで読むのは楽しい(ただし納期は忘れないように)。 雑談シングルワードDMAのタイミング

バイブル:Z-80マイクロコンピュータ 丸善 寺田浩詔(監訳) 1980年第四刷

さらに雑談: Z80が好きな理由。

マイコンの起源:日本の電卓会社ビジコン社が、インテルと4004というCPUの原型(4bit)を作りました。契約上将来をしっかり踏まえ、特許とかしっかり押さえておけば、日の丸CPUが主流となり得たのに。ちょっと残念。 (2019.09.17)ヤフー知恵袋でこの手の雑談

CQ出版の完全版 FPGA電子工作オールインワン・キットの第6部 マイコン黎明期の4004システムを設計し,歴史的電卓を再現するという記事で、この4004のエミュレータが紹介されています。 上の電卓の模擬とのことです。 興味があったら買ってもいいかも(家は未開封で放置していますが、そのうち手を出します)。
興味のある方は次のリンクに参照してもいいかな?

これをもとに、嶋正利氏が今度はインテルに移籍し、8080(8bitCPU)を作る(この前にインテルは単独で8008(8bitCPU)という4004後続作ったがこれは評判良くない)。これを使ってNECがワンボードマイコンTK80を発売(大学同級生にこの1ボードを核とした組み立てキットのマイコン:コンポBSを持っている人がいた)。 ついでながら、シャープのMZ-80も最初は組み立てキット。 中身を知る機会がいっぱいあったのが当時生きていた人の幸せな点かな。このマイコンという製品の紹介記事をラジオの製作誌で高校の頃読みました(固定回路ではなくプログラムによって、いろいろな処理ができる画期的なハードウエアという紹介だったような気がする。プログラムという言葉の意味がはっきり理解できなかったけど)。

TK80で思い出すと、家の本棚に、アスキー出版社の復活!TK-80 榊柾憲著があります。未開封ですが、win98までならエミュレータでTk-80で遊ぶことが可能なはずです。win7で(あるいはXPモードで)動くかどうかは不明ですが、インテルCPUのシュミレータとしては面白いかも。Z80の掛け算プログラムを他で書いてみましたが、適当なエミュレータ見つけられずに困っています。
ちなみに、機械語コード互換ではありますが(専用命令は除く)、アセンブラ記述としてはザイログと、インテルには差があります。 私の母国語はザイログZ80ですが、そのアセンブラ記述は、データのやり取りは、すべて、LD(ロード)命令で統合されてますが、インテルの場合は、ソースとデステネーション、間接アドレスがなどなど全て異なる命令で記述します。 覚えるのが大変なので、ザイログが好きになったという話もあります。
(2017.09.28)もちろんアセンブラ言語開発者にとってみれば、(オペランドと呼ばれる)パラメータが何をいみしているのか、命令(オペコード)見れば、判断できる(ラベルなのか、判断不要)ので、その方がコンパイラ動作が楽だというのは理解できる。 余談ながら、暇だったら、機械語コードを命令と対比してみると結構面白いと思いますよ。 8ビットのうち、このビット群が命令で、このビット群がレジスタxを表しているとか、なんとなく想像できるようになります。すると、意味不明の機械語コードというのが、丸暗記でなくとも、なんとなく読めるようになる気がしてきます(離れて長いのでもう私はむりですけど)。

その後、嶋氏らが、ザイログという会社を起こし、Z80を開発。今度はNECの8ビットマイコンPC-8001に乗って、大学入学後購入しました。工学部だったので、他のCPUもいろいろ勉強しましたが、論理的に美しいのはモトローラ6800。 インテルの8080を超える(最後の80系という意味かな?)Z80が高性能。 遅れたインテル8080が追いかけようともがいた結果が8085という認識でした。 日本人つながりと、インテルよりいろいろ賢い命令・ハードという印象から、Z80フリークとなりました。 大学時代、10キーと、7セグLEDのワンボードマイコン+キー操作などのモニタソフトを、EPROMに実際に書いて楽しんだ思い出もあります(正確に言うと、卒論のテーマ)。
大学教員を講師に招いた地域企業の開発者向け16ビットマイコンセミターというのに紛れ込んで聞かせてもらったことがあります。インテル・ザイログ・モトローラのそれぞれの仕様書の説明解説だったりしますが、各機能を比べてその用途の向き不向き比較するとかいうのが無かった。 ちなみに、16ビットのZ8000は、ピン数足りずピン配の異なる3種類くらいが提唱されていて、マーケッティング上なんだかなぁという不満。 機械語プログラムが8bitCPUの上位互換のインテルが主流かなぁと予測してました。命令体系が美しいというとモトローラなんですが、高そうだし、遠くから眺めるだけかな。 ハードの体系でいうと、インテルが80386あたりで追いついたアドレス体系とか初代の68000あたりですでに優れてた気がする。他社16ビットに対して、モトローラの8ビット6809は対抗可能だとかやはり憧れはありました。インテルはインテルでセグメントレジスタアドレスを用意することで、プログラマが従来8bit相当どうような考え方でプログラムし易いというメリットと、16bitCPUらしいプログラム面倒というデメリットを感じてました

 念のため。MS-DOSが最初のOSという訳ではありません。一般の人が最初に触ったのはMSDOSかもしれませんが。 8bitマイコンでもデジタルリサーチ社のCP/Mが走っていて、数値計算系研究室ではこのOS上のフォートラン80とか使っていたようですし。大学の先生の論文清書のお手伝いで日本語ワープロを使ったのは大学のUNIXベースのミニコンだった気がする(システム詳細はしらず単なるオペレータに徹する)。 シスマネの横文字のまもなくシャットダウンしますというメッセージ理解できず作業していたら、最後に電源落とされてしまって翌日メッセージくらいちゃんと読めと怒られた思い出。 作業途中の文章はバックアップから救済してもらいました。この頃16ビットMSDOS上でもそろそろ日本語ワープロが使え始めたころで、評判の高い”松”というのは高すぎましたが(8bitPCが買えた値段)、ユーカラ(?)等何とか個人で買えるものが出始めたころ(卒論は、図表の入れ込みとか、数式うまくかけそうにないので、あきらめました)。 一太郎の最初のをみたのもこの頃。 いろいろできるのでDOS版一太郎には長らくお世話になりました。 MSDOS版日本語ワープロを最初に使ったのは入社一年目の、最初の形ある仕事(ICの内蔵ロジックの評価用の実験回路の設計評価報告書)。 提出したら課長に、家(寮)で仕事をするのは問題外。手で書き直せと言われてぐれた(報告書を書かないという反抗)。

ところで、複数クロック利用のインテル・ザイログ対位相差クロック使用のモトローラ。
その昔、4MHzのZ80が、1MHzの6800とどっちが早いか?という話題がありました。Z80は、命令読み込み・解釈が4クロック(M1サイクル)、その後のオペランド読み込みや、入出力が3クロックという命令実行時間が必要です(最速4クロック、通常+3クロックの倍数)。一方モトローラは、1MHzとはいっても位相の違う2相クロックをつかって、読み込み命令実行などを行うので、実質4Mザイログと、1Mモトローラは基本同じという理解がほぼ正しい。 あとは命令体系の効率の良さや、ソフトの出来不出来があって、最終性能が決まるという話になります。16ビットのインテル8086採用のPCと、6809採用のFM7で、速度を比較するという話題が出るくらいモトローラ人気はすごかった。とはいえインテルMSDOSペースのPCに対して、モトローラマイコン採用のマンマシンインタフェースに注力したマッキントッシュはどうも遅くて信頼ならんかったというのが実感。その流れでいえば、windowsでCPU等リソースを割り振るMS*インテル方針があまり好きになれなかったのは内緒。職場配属当時の先輩で本社勤務になった方がマイコン、パソコン、OSの勉強のために、ときおり、電話してきておりましたが、長くは続かなかったかな?(田舎に帰ったと噂にききましたが地震の影響どうなったか知人に聞いたが良く解らんかった)

重ならない多相クロック利用してレーシング(クロック単位で1サイクルづつずれるはずの回路が、失敗すると筒抜けになって計算が合わなくなることがある現象が発生))を避けるという考えは、我々より上の年代の人にはある程度認知されているようで別の部署にいた上司の回路図にも採用されていました。 強力なクロックドライバを準備して、クロック位相差(スキュー)が場所により発生しないようにという発想の方がシンプルではあります。自動レイアウトになると本当に強力なクロックドライバを置くという噂を聞いたことがあるような気がします(ハードウエア記述言語によるIC開発にはかかわる機会ありません)。 

嶋正利氏のwikiリンク


サイトマップ トップ << 電よも < <*>  IOアクセスとシングルワードDMA