AVRとZ80でCP/Mの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
""改良版も公開しています。
""[2012.11.11] AVRとZ80でCP/Mの改良(高速化対応)
""[2014.05.31] 部品を減らす工夫(よりシンプルにする方式)
""あわせてご覧ください。

!Z80の時代
[Z80|http://ja.wikipedia.org/wiki/Z80]が登場した頃までは、マイコンといえば自作することも珍しくはありませんでした。最終目標は[CP/M|http://ja.wikipedia.org/wiki/CP/M]を動かすことでした。当時多くのマイコン自作本が出版されていました。私は6800で自作したことはあるのですがCP/Mマシンは本を買うまでで止まっていました。

http://star.gmobb.jp/koji/data/Z80_book.jpg http://star.gmobb.jp/koji/data/CPM_book.jpg
[拡大1|http://star.gmobb.jp/koji/data/Z80_book_l.JPG] [拡大2|http://star.gmobb.jp/koji/data/CPM_book_l.JPG]
!CP/M on an AVR(avrcpm)
AVRでZ80をシミュレートしてCP/Mを動かす「[CP/M on an AVR|http://spritesmods.com/?art=avrcpm&page=2]」というのがある。シンプルな手書きの回路図。オーバースペックなハード設計。ソフトはアセンブラ1本のみでDRAMのリフレッシュまでもやっている、というとっても怪しげなもの。

だめもとで作ってみました。DRAMが手に入らないのでジャンク箱から探し出したold-MacのSIMMメモリ(秋葉原にAppleのショップがたくさんあったころ、無料で配布されていたやつ)を使っています。Mega88は手持ちに無かったのでMega168Pを使っています。ファームの修正は割り込みベクトルを2バイトに変更するだけでOKでした。

http://star.gmobb.jp/koji/data/avrcpm.jpg [拡大|http://star.gmobb.jp/koji/data/avrcpm_l.JPG]

結果はとりあえず動いたんですが以下の問題がありました。
+ウォームブート時のシステムのリロード処理が実装されていない。
+エミュレータに実装されていないコードがある。
+エミュレーションにバグがある。
1.についてはBIOSを自分で修正して解決したのですが、[別のサイト|http://www.mikrocontroller.net/articles/AVR_CP/M]がやってました。このサイトに置かれているbios.asmは実装されています。

問題は2.と3.で、エミュレートしているのはZ80ではなく8080で、しかもDAA命令が実装されていません。ASMやDDTの一部のコマンドが動きません。自分でDAA命令を実装しASMとDDTは動くようになったのですがMBASICが動かない。どうやらエミュレーションにバグがあるようです。さすがにこちらを修正するのは無理。作者はゲームさえ動けばよいと考えていた模様。

【追記】[このサイト|http://petersieg.bplaced.net/?AVR_CP%2FM]や[このサイト|http://www.mikrocontroller.net/articles/AVR_CP/M]に改善版があるようです。試してませんけど。→[検証例|http://yoshi-s.cocolog-nifty.com/cpu/2011/10/avr-cpm.html]

結局お手上げとなりました。日本でも[同じようなことをやっている人|http://code.google.com/p/cp-mega88/]がいて、こちらはz80packというエミュレータパッケージを使っているようですが今は入手できないようです。→入手できるそうです(コメント欄参照)

結論として、ちゃんとしたCP/Mを動かしたいならエミュレータは危険じゃなかろうかということです。配線は楽ですが検証には相当手間が掛かりそうです。
!本物のZ80を使う
そんなわけでZ80は実物を使いAVRでなるべくシンプルにまとめることにしました。Z80は「[鈴商|http://www.suzushoweb.com/osusume.php#s2229]」や「[丹青通商(ヤフオク)|http://booth.search.auctions.yahoo.co.jp/strsearch?desc=Z80&sb=desc&alocale=0jp&acc=jp&seller=kazumi_kikou]」で入手可能です。

http://star.gmobb.jp/koji/data/CPMdiag.PNG

I/Oアドレスを「CP/M on an AVR」に合わせてあるのでそこで公開されているディスクイメージがそのまま使えます。入出力インターフェースはUART(38400,8N1)なのでシリアル端末か、USBシリアル変換器が必要です。私は、自作のシリアル端末かRecursionさんの「[CDC-232 for ATtiny2313|http://www.recursion.jp/avrcdc/cdc-232j.html]」を使っています。
http://star.gmobb.jp/koji/data/avrz80cpm.jpg
[拡大|http://star.gmobb.jp/koji/data/avrz80cpm_l.JPG]
http://star.gmobb.jp/koji/data/CPM_pc.jpg http://star.gmobb.jp/koji/data/cdc232.jpg
[LCD画面|http://star.gmobb.jp/koji/data/LCD_term.jpg] [CDC-232拡大|http://star.gmobb.jp/koji/data/cdc232_l.JPG] [TeraTerm画面|http://star.gmobb.jp/koji/data/PC_term.JPG]

自作のLCDシリアル端末とUSBシリアル変換器
!設計概要
*ブートローダー機能を実現するため、Z80にリセットをかけているときにコントロールバスも開放するように工夫しています。
*I/Oリクエストがあったときのウェイトをかけるタイミングのみソフトでは難しかったのでハードでやってます。
*AVRは擬似I/O、DMAコントローラのような動作をし、シリアルI/F、ストレージデバイスI/Fとして機能します。
*起動時はSDカードの先頭128バイトをメモリにロードし、バスを返却してZ80をリセットします。カードにアクセスできないときはAVRのEEPROMの内容をロードするようにしてあります。
*SDカードのアクセス処理は[elm-ChaNさん|http://elm-chan.org/index_j.html]のFatFsサンプルに付属のmmc用下位レイヤインターフェースモジュールを使用させていただきました。(FatFs自体は導入していません)
[クロック回路図|http://star.gmobb.jp/koji/data/avrz80clk_cir.PNG] [CPU回路図|http://star.gmobb.jp/koji/data/avrz80cpu_cir.PNG] {{ref z80cpm20110723.zip,AVRとZ80でCP/M,ソフトウェア}}

製作は自己責任でお願いします。
!関連ページ
CP/Mコーナー
AVRとZ80でCP/Mの改良
[[mbed(ST Nucleo F401RE)版CP/Mエミュレータ|mbed(ST Nucleo F401RE)版CP/Mエミュレータ]]
部品を減らす工夫
メモ集
CP/Mディスクイメージ作成手順メモ
CP/Mコマンド概要メモ
CP/M資料メモ
DSK形式のディスクイメージからファイルを取り出す方法メモ
DISKDEFマクロの使い方メモ
CP/Mメモリサイズ変更手順メモ
CP/Mでソフト開発メモ

ソフトウェア
CpmtoolsGUI
!!関連サイト
CP/Mとは
http://ja.wikipedia.org/wiki/CP/M
[マニュアル|http://userweb.port.ac.uk/~msm/interests/chistory/documents/cpm-22-manual/]
http://www.d1.dion.ne.jp/~ytera/sub2.htm
非公式サイト
http://www.cpm.z80.de/index.html
ソース
http://www.cpm.z80.de/source.html
アーカイブなど
http://www.nasekouki.co.jp/~shig/cpm.html
http://www.retroarchive.org/cpm/
http://www.e-tech.net/~pbetti/mirrors/oak.oakland.edu/
http://www.seasip.demon.co.uk/Cpm/index.html
http://retrotechnology.com/dri/d_dri.html
CP/M on breadboard
http://searle.hostei.com/grant/cpm/index.html
CP/KM web(Web版CP/Mエミュレータ)
http://www.recfor.net/jeans/index.php?itemid=920
これ、欲しいかも
http://microvga.com/uvga-images
http://ddlab.jp/shop/edisp/syouhin.cgi
MMC(SDC)の使いかた
http://elm-chan.org/docs/mmc/mmc.html
Atmel AVRについて
http://elm-chan.org/docs/avr.html
[千秋ゼミISPライター HIDaspx|http://www-ice.yamagata-cit.ac.jp/ken/senshu/sitedev/index.php?AVR%2FHIDaspx#content_1_1]
AVR Wiki
http://www34.atpages.jp/avrwiki/wiki.cgi?page=AVRWiki
//http://avrwiki.jpn.ph/wiki.cgi
その他AVR関連の製作
AVRビデオ端末の製作
AVRパラレルライターの製作
AVR学習リモコンの製作
AVRとZ80でTK-80
Mega64でLED GAME
----
*z80pack は http://www.autometer.de/unix4fun/z80pack/index.html にあるようですよ. - kyo (2011年12月31日 20時22分51秒)
*情報ありがとうございます。 - 管理人 (2012年01月01日 01時19分42秒)
*Z80(NMOS)は電源を切ると、全ての信号線がハイインピーダンスになりますよ〜。 - ama (2014年11月19日 18時07分34秒)
*続きです。Zilogのデータブック(http://www.z80.info/zip/ZilogProductSpecsDatabook129-143.pdf) の3-130ページの3番目のアンサーにバスの解放方法が載っています。 - ama (2014年11月19日 18時09分48秒)
*amaさん。コメントありがとうございます。改良版(部品を減らす工夫)ではトライステート(367)は無くなっています。詳しくはAVRのソースを見て下さい。これから同様の製作を考えている方は部品を減らす工夫の方もぜひ参照ください。さらにシンプルになっています。 - 管理人 (2014年11月19日 22時16分40秒)
*遅くなりましてすいません。HLTを使うと、他の割り込みでもHALT状態を抜け出してしますね。 - ama (2017年02月05日 18時11分18秒)
*HALT中はINTが掛けられないように回路を組めばいいのでは。CP/Mしかやらないなら関係ないですけどね。 - 管理人 (2017年02月05日 21時01分07秒)
{{comment}}