部品を減らす工夫の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
AVRとZ80でCP/Mの改良の更なる改良の検討です。

http://star.gmobb.jp/koji/data/AKICPM_HALT.JPG
!別の方法を試す
I/OにWAITを入れる正攻法の方式では、タイミングが間に合わないのでやや複雑なゲートが必要になりCPLDを使いました。できればこれを無くせないかと考えていたのですが、すごいアイデアを考え付く人がいるものです。[T_colonさんのTweet|https://twitter.com/T_colon/status/463225176868401152]。HALTとRESETを使う方法です。実際に[PSoC4|http://special.nikkeibp.co.jp/ts/article/ac0e/145322/]でCP/Mを動かしていらっしゃいます。
I/OにWAITを入れる正攻法の方式では、タイミングが間に合わないのでやや複雑なゲートが必要になりCPLDを使いました。できればこれを無くせないかと考えていたのですが、すごいアイデアを考え付く人がいるものです。[T_colonさんのTweet|https://twitter.com/T_colon/status/463225176868401152]。HALTとRESETを使う方法です。実際に[PSoC4|http://japan.cypress.com/products/psoc-4]でCP/Mを動かしていらっしゃいます。

私が製作したAKI-80のCP/Mマシン(AVRとZ80でCP/Mの改良)ならちょっとの変更で試すことができるのでやってみました。但しHALTからの復帰にRESETを使うとIFFが初期化されてしまい割り込みに影響するのでNMIでやることにしました。NMIならRETN命令で復帰すればIFFが保存されINT割り込みに影響を与えません。CP/Mだけなら関係ないですが本物のZ80を使うからにはINT割り込みは残しておきたいですからね。

[回路図|http://star.gmobb.jp/koji/data/AKICPM_HALT_CIR.png]

{{ref AKI80CPM_HALT20140531.zip,部品を減らす工夫,ソフトウェアのダウンロード}}

問題なく動きましたが、Z80側のコードが多くなるのでIPL(BOOT)が1セクタに収まりきらず2セクタ分になりました。この方式の良い点はゲートが不要になるだけでなくI/Oアドレスを消費しないところですかね。

詳細はソースを見ていただくとして処理は大体こんな感じ。
::Z80
++コマンドとデータをRAMに書き込む
++NMI割り込みベクタ(0066Hから2バイト分)をバックアップ
++割り込みベクタにRETN命令を書き込む
++HALT命令実行
++バックアップを書き戻す
++RAMから結果を受け取る

::AVRマイコン
++HALT検出
++BUSREQ発行
++BUSAK検出
++RAMからコマンド、データを取得
++コマンド処理
++結果をRAMに書き込む
++NMI発行
++BUSREQ解放
++HALT脱出(NMIの受理)を検出
++NMI解放

CPLDが不要になっちゃいました。ところでこの[PSoC4|http://www.cypress.com/?rID=92146]って異常に安くないですか。

!!関連リンク
PSoC4 Prototyping Kit CY8CKIT-049-42XX
http://akizukidenshi.com/catalog/g/gM-08446/
http://itcorp24.cart.fc2.com/ca9/46/
マイコンPCB [PCB-ATMEGA128](ATmega64/128対応)
http://www.aitendo.com/product/2837
当サイト内
AVRとZ80でCP/Mの改良
CP/Mコーナー
----
*シンプルで良いですね〜!、昔のX68K用のZ80カードでHALT使ってありました〜 https://twitter.com/DragonBallEZ/status/461566441758535682 - kyo (2014年06月12日 19時57分11秒)
*当時からこのテクは使われていたんですね。興味深い情報、ありがとうございます。 - 管理者 (2014年06月12日 22時52分30秒)
{{comment}}