AVRとZ80でCP/M
改良版も公開しています。
[2012.11.11] AVRとZ80でCP/Mの改良(高速化対応)
[2014.05.31] 部品を減らす工夫(よりシンプルにする方式)
あわせてご覧ください。
Z80の時代
Z80が登場した頃までは、マイコンといえば自作することも珍しくはありませんでした。最終目標はCP/Mを動かすことでした。当時多くのマイコン自作本が出版されていました。私は6800で自作したことはあるのですがCP/Mマシンは本を買うまでで止まっていました。
CP/M on an AVR(avrcpm)
AVRでZ80をシミュレートしてCP/Mを動かす「CP/M on an AVR」というのがある。シンプルな手書きの回路図。オーバースペックなハード設計。ソフトはアセンブラ1本のみでDRAMのリフレッシュまでもやっている、というとっても怪しげなもの。
だめもとで作ってみました。DRAMが手に入らないのでジャンク箱から探し出したold-MacのSIMMメモリ(秋葉原にAppleのショップがたくさんあったころ、無料で配布されていたやつ)を使っています。Mega88は手持ちに無かったのでMega168Pを使っています。ファームの修正は割り込みベクトルを2バイトに変更するだけでOKでした。
結果はとりあえず動いたんですが以下の問題がありました。
- ウォームブート時のシステムのリロード処理が実装されていない。
- エミュレータに実装されていないコードがある。
- エミュレーションにバグがある。
1.についてはBIOSを自分で修正して解決したのですが、別のサイトがやってました。このサイトに置かれているbios.asmは実装されています。
問題は2.と3.で、エミュレートしているのはZ80ではなく8080で、しかもDAA命令が実装されていません。ASMやDDTの一部のコマンドが動きません。自分でDAA命令を実装しASMとDDTは動くようになったのですがMBASICが動かない。どうやらエミュレーションにバグがあるようです。さすがにこちらを修正するのは無理。作者はゲームさえ動けばよいと考えていた模様。
【追記】このサイトやこのサイトに改善版があるようです。試してませんけど。→検証例
結局お手上げとなりました。日本でも同じようなことをやっている人がいて、こちらはz80packというエミュレータパッケージを使っているようですが今は入手できないようです。→入手できるそうです(コメント欄参照)
結論として、ちゃんとしたCP/Mを動かしたいならエミュレータは危険じゃなかろうかということです。配線は楽ですが検証には相当手間が掛かりそうです。
本物のZ80を使う
そんなわけでZ80は実物を使いAVRでなるべくシンプルにまとめることにしました。Z80は「鈴商」や「丹青通商(ヤフオク)」で入手可能です。
I/Oアドレスを「CP/M on an AVR」に合わせてあるのでそこで公開されているディスクイメージがそのまま使えます。入出力インターフェースはUART(38400,8N1)なのでシリアル端末か、USBシリアル変換器が必要です。私は、自作のシリアル端末かRecursionさんの「CDC-232 for ATtiny2313」を使っています。
拡大
LCD画面 CDC-232拡大 TeraTerm画面
自作のLCDシリアル端末とUSBシリアル変換器
設計概要
- ブートローダー機能を実現するため、Z80にリセットをかけているときにコントロールバスも開放するように工夫しています。
- I/Oリクエストがあったときのウェイトをかけるタイミングのみソフトでは難しかったのでハードでやってます。
- AVRは擬似I/O、DMAコントローラのような動作をし、シリアルI/F、ストレージデバイスI/Fとして機能します。
- 起動時はSDカードの先頭128バイトをメモリにロードし、バスを返却してZ80をリセットします。カードにアクセスできないときはAVRのEEPROMの内容をロードするようにしてあります。
- SDカードのアクセス処理はelm-ChaNさんのFatFsサンプルに付属のmmc用下位レイヤインターフェースモジュールを使用させていただきました。(FatFs自体は導入していません)
製作は自己責任でお願いします。
関連ページ
CP/Mコーナー
AVRとZ80で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://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
AVR Wiki
http://www34.atpages.jp/avrwiki/wiki.cgi?page=AVRWiki
その他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秒)
トップ メニュー
This web page is described in Japanese, but you can read in English by translation site.