まごころせいじつ堂

浜町庄金 研究開発  マイコンで遊んでばっかりで

2019年02月

8080Aの割り込み応答の謎

 きっかけはNEC μPD8080Aのカタログにあったこの記述。

The μPD8080A has the capability to accept a multiple byte instruction upon an interrupt. This means that a CALL instruction can be inserted so that any address in the memory can be the starting Iocation for an interrupt program. This can be accom- plished without auxilliary circuit because INTA is active for all three bytes of the CALL instruction.

 わざわざ3バイト命令のCALLを受け付けるよ書いてあるのはなんでだろうか。8080Aはもともとできたのでは?ということで調べてみた。その前に8080Aの割り込み動作について。

 8080Aは割り込み許可の状態でINT入力がHになると割り込み動作にはいる。割り込み復帰のための現プログラムカウンタの保存はしない代わりに1命令分をデータバスから読み込んで(fetch)実行する。ここで特定の命令、RST7(FFH)を読み込むと現在のPCを保存して38Hにジャンプする。この1命令実行時はPCを更新しないので、38Hからの割り込み処理からリターンする時に元通りの番地に戻ることができる。RSTn命令はRST0〜RST7まで存在し、n × 8番地がエントリポイントとなる。
 スタックにPCを保存してジャンプする命令ならCALL命令でもよく、これは3バイト長である。任意のアドレスをエントリポイントにできるが、割り込み時の回路が複雑になる。

 さて割り込み時は8080Aのデータバスに出力されるステータスをデコードすることにより得られる*INTA信号がアクティブになる。ここを観測することにより割り込み時にどんな長さのコードを取り込んでいるのかがわかるはず。命令実行時にはSYNC信号が立つので、*INTAの立ち下がりをトリガにして同時にSYNC信号をオシロで観測することにした。

 実験に使用するのはSBC8080ボードとPALO ALTO BASICを元に機能を追加してあるSBC8080システムROMを使用した。これは割り込みを許可し8251UARTを初期化し端末の文字入力でINTを上げてくれるのでそのまま割り込みの観測に使える。

 *INTA信号は8228システムコントローラが8080Aのデータバスからデコードし出力する。ただし+12Vにプルアップした状態では何も変化しなかった。+12Vプルアップしていると割り込み発生時に内部で自動的にRST7(FFH)を生成し、*INTA信号は外に出さないようだ。

 8228の*INTAの+12Vプルアップを外し、観測する。端末から1文字入力すると*INTAが発生した。ただし*INTAの数はまちまちである。これは割り込みサイクルで命令取り込み時にバスがフローティング状態のため、バラバラなデータを読み込んでいるせいだと思われる。以下はたまたま1バイト命令のRST7がはいった様子(キー入力が続けてできたので38H番地に飛んでいると思われる)。
2019INTA1


 データバスを弱くプルアップ/プルダウンして任意の命令フォーマットを与えることにする。10KΩプルアップ/プルダウンでCALL命令に相当するCDHに設定した。CALL CDCDHとなるはず。
2019INTA

 観測結果は以下の通り*INTAが3発。
2019INTA3

 さて割り込みで使うRST7とCALL xxxxは観測できたが、ひょっとしてこの*INTA信号は任意の命令のデコード後にわかる命令のバイト数分出るのではなかろうか。ということで配線を変えてADC imm(CEH CEH)にしてみた。結果は予想どおり*INTA 2発。

2019INTA2

 8080Aは割り込み時に1命令を読み込んで実行し、RSTnやCALL xxxxでスタックにPCを保存することを期待している。が、これは任意の命令でよく、命令をフェッチ/デコードして得られた命令のバイト数分*INTAを発生して1命令を実行する。
 Intel 8080Aとそのクローン、NEC μPD8080Aも同じ結果であり、NECのカタログに書いてあった割り込み時に3バイト命令も受け付けるよという記述はわざわざ書くまでのことでもなかったということになる。

 あとクローン8080Aについては解析済で以下からverilogソースが見られます。




NEC 8bit 2MHz MPU i8080互換 UPD8080AFC
B0773MVDKN
5つ星のうち5.0
¥ 1,200

NEC μPD8080Aの非互換部分まとめ

 NEC μPD8080Aのデータシートが見つからないで悩んでいたら@electrelicさんからbitsaversにあるよ、と教えていただきました。その 1977_NEC_Microcomputer_Catalog.pdf を参照しつつこれまでの実験結果からINTEL 8080との非互換部分を整理。(電気的特性は省略)


・命令実行のサイクル数
 これはIC Collection MCS80に詳しい表があります。

・割り込み応答時間が3バイト命令(例:CALL)後でアクティブ
 通常、割り込み発生時にはデータバスにRSTx(1バイト命令)のコードを流し込んで決まったエントリに飛ぶが、3バイトのCALL命令で任意の番地を割り込みエントリにできるということか?

※追記:システムコントローラ8228は割り込み時にCALL命令が入ると続く2サイクルの間も*INTAをアクティブにして、CALL命令で指定した任意のアドレスを割り込みの飛び先にする機能がある。NEC μPD8080Aは8228のサポートなしでこれができるということだろうか。

8080Aの割り込み応答の謎を参照。Intel 8080Aと変わらず

・未定義フラグbit3が常に1。INTEL 8080Aは常に0

・フラグbit5はSUBフラグ。DAA命令で参照。INTEL 8080Aは常に0

NEC μPD8080Aのフラグ
スクリーンショット 2019-02-13 21.00.44

NEC μPD8080AF(INTEL 8080A完全互換)のフラグ
スクリーンショット 2019-02-13 21.01.28


・DAA十進補正命令はSUBフラグ=1で減算後十進補正。SUBフラグは減算命令(SUB/DCR)で1になる。加算命令(ADD/INR)で0クリア。

・DCR命令でACYフラグが立たない場合があり、被減数が00,10,20,30,40,50,60,70,80,90でDCR後DAAで誤動作する。

・XRA/ANA/ORA命令後ACフラグがクリアされずそのまま。
 カタログには"Also,arithmetic flags not affected by logical instructions. "とある


また、さる方面からBCD演算の実装について教えていただきました。https://en.wikipedia.org/wiki/Double_dabble


 減算命令後のDAA補正対応や論理演算命令での算術フラグを操作しないなど命令を追加しないで改善しようとした感じがしますね。




マイクロコンピュータ・ハードウエア基礎技術―M6800系,8080系,Z-80系 (1981年)
B000J7VKF8 1981-03

¥ 2,400 (中古品)
記事検索
プロフィール

hardyboy

カテゴリ別アーカイブ
月別アーカイブ
QRコード
QRコード
  • ライブドアブログ