世はまさにFPGA時代。かつて試作にしか用途がなかったFPGAが、今ではどんどん量産製品に使用されています。おかげで高集積化・大容量化が進み、システムがまるごとひとつのチップに入ってしまうまでになりました。そしてMSX、PC-8001、X1が相次いで実装に成功する中、「やっぱMZもFPGA化しないと!!」ということで、私もMZを題材に挑戦してみました。1chip MSXもアナウンスされて、アマチュアの世界にもFPGAがより身近になってきていると思います。そんな皆さんの参考になれば幸いです。
まずは構造が簡単でかつ人気のあったMZ-700を実装しました。
★スクリーンショット
MZ-700エミュレータの全画面モードと大差ないのですが、それに比べれば上下が詰まっているのがどうにかわかる違いでしょうか。
Spartan-3 Starter Kit版
|
|
少し暗くてごちゃごちゃしていますが、動作中の様子です。画面はS-BASICのAPPLICATIONSに含まれるOPENING MZ-700です。その下、緑っぽいものが見えているところが実装に使用したSpartan-3 STARTER KITです。 |
ある開発風景。 |
実装したMZ-700の仕様は次のとおりです。
- Xilinx/Digilent製SPARTAN-3 STARTER KITに実装しました。音声以外は特別なハードなしに楽しめるようになっています。
- テープシステムを再現しています。
- 本物と同じ3.579545MHzクロックを使用していますが、ウェイトの差により違いはあります。
- キーボードはPS/2ポートに接続したPC互換機用のキーボードを使用します。機能ではなく配置を似せて実装しています。
- RS-232Cポートにmztファイルを送り込むことで、テープの読み込みに対応しました。残りバイト数が表示されるようになっています。
- キャラクタ印字に限り、プリンタ出力に対応しました。紙の代わりにシリアルポートに出力します。MZ-1P01のペンチェンジコマンドにより、色が変るところは再現しています。
- HAL研のPCG-700互換のPCGに対応しています。
- 配布イメージのモニタには、MZ-NEW MONITORを使用しています。もちろん再合成することで1Z-009Aも使用できます。
技術的にもう少し詳しく説明すると、次のような要領で設計しています。
- CPUはOPENCORESで公開されているT80を使用しています。使用スライス数が大きいことはわかった上で、ただVHDLで構成されているという理由で使用しています。次からはfz80を使うつもりです。
- モニタROM、CG-ROM、VRAMをFPGA内のブロックRAMで構成し、メインRAMには外部SRAMを使用しています。VRAMは本物とは違いデュアルポート構成としており、ブランキングチェックなしにノイズのない画面を描画できます。
- PS/2キーボードは完全にハードで制御しています。
- mztファイル読み込みとプリンタ出力にはマイコン(PicoBlaze)を使用しています。
- 音声の再生が必要なので、本物の回路を参考にアンプとスピーカーを組み合わせた基板を搭載しています。出力はボードの拡張クロック入力です(クロックに使わなければ出力に転用できるのです)。作った基板と、その回路図は次のとおりです。
基板はできるだけ薄くなるよう、平板スピーカーと薄型ボリュームを使用しています。どちらもジャンク屋で見つけてきたので、量産はきびしいですねぇ。回路はMZ-700の回路図から抜き出してきました。Q2が当時のとは違いますが、古くて入手できないがゆえの代替品です。まぁ単純に音を出すだけのしょうもない回路ですので、特性云々はこだわらなくていいでしょう。これを、連結ヘッダ(というのかな?いまいち正式名称がわからない)で8ピンICソケットに挿せるようにしています。ちなみに、基板の上が欠けているのはダウンロードケーブルを挿せるようにするためです。
|
|
Spartan-3 Starter Kit |
スピーカーを取り付けたところ |
8ピンICソケットは4桁ある7セグメントLEDのすぐ左にあります。スイッチにも被るので、それなりに位置を調節して取り付けました。でも電源LEDと再コンフィグレーションボタンは隠れてしまうのですが…。
★制限事項
回路で動きますのでほとんど本物と変らないのですが、それでもいくらかの制限はあります。
- VGAモニタにしか接続できません。コンポジットビデオへの出力回路もありません。
コンポジットビデオへの出力にはいくらかの外付け回路の追加が必要です。 例えそれを実装しても、出力にはいくらかの外付け回路の追加が必要です。
PS/2キーボードを初期状態で使用しているため、InsertとDeleteキーをMZのINSTとDELキーに割り当てていません。キーボードからの出力で、これらを含むいくつかのキーについてShiftを併用してもそれを自動的に解除するコードが送られてくるためです(HOMEとCLRを入力できない)。受信回路としてはそれがウソの解除コードか本当に解除されたのか判別できません。これを回避するにはモードを変えればよいのですが、致命的な問題ではないので着手していません。 INSTとDELキーの割り当ては表記どおりになりました。
- MZフォーマットのテープ入力について、これ以外のフォーマットには対応していません。例えば、TS-700モニタではテープからの読み込みはできません。PicoBlazeのプログラムエリアとスイッチに余りはあるので、フォーマットさえわかれば対応は不可能ではないでしょう。
- 同様にテープ出力はサポートしていません。やりようはあるとは思っています。
- ビデオのタイミングがVGAを基準にしているだけに、本物と違いがあります。野球拳Y2Kバージョンのようにブランキング信号を厳密に参照するようなプログラムは期待した動作をしません(その前に現時点では水平ブランキング信号を省略していますが…)。
- 著作権問題回避のためモニタにMZ-NEW MONITORを使っていますが、これはSP-1002互換のため一部のソフトが機種を誤認識することがあります。手元では、マッピーがそれに相当します。マッピーについては、.mztファイルの1486h番地から21 20 00と変更することで強制的にMZ-700として認識させることができます。
- たまに、XMODEM転送がうまくいかない時があります。PC側の進行表示が異様に速く進んだり、ロードバイト数が変な値だったりで判別できると思います。その時はやりなおしてください。特にリセットなどの必要もありません。
★ダウンロード
★関連情報
「Win32サブルーチンズ」シリーズの著者である常岡さんが、モニタを1Z-009Aなどに入れ替えるためのユーティリティを作成してくださいました。再合成は必要ですが、もし正式なユーザーの方で1Z-009Aのイメージが手元にある方は挑戦してみると良いと思います。思った以上にROMを機種判別の手がかりにしているソフトが多く、MZ-NEW
MONITORでは不都合が出てしまいますので…。
★履歴
V1.2a (2005/11/22)
V1.2 (2005/11/20)
- キーボード配列を若干変更(INSTとDELキーを本来の割り当てに)
- 外付けSRAM書き込みと8253モード設定を同期化
V1.1 (2005/10/25)
- ISE7.1プロジェクトにて再構成
- 多段ロードに対応(単独でロード可能なイメージファイルの連結に限る)
- ドキュメント中、ボードへの書き込みに関すてより詳細に記述
V1.0 (2005/10/23)
1chipMSX版
|
|
こちらも動作中の様子。画面はキャリーソフトのレーダースネーキーです。 |
実装したMZ-700の仕様は次のとおりです。現在まだ作業中のため、予定の内容も含みます。
- 2004年秋から世間を騒がせた(?)1chipMSXに、MSXではなくMZ-700を実装しました。当然動作上は以前のMSXなど微塵も残っていません。
- SD/MMCという大容量メディアの活用により、テープ/ディスク/QDをサポートするシステムを再現しています。
- VGAディスプレイ、15kHz対応RGBモニタ、ビデオモニタ(S/コンポジット)に対応しています。
- HAL研のPCG-700互換のPCGに対応しています。
- 公開するデータは互換モニタのMZ-NEW MONITORを使用していますが、純正モニタROMデータが用意できれば本体操作だけで入れ替えが可能です。
- 特にツールを使わず、MSX-DOS2の操作でMZ-700に変身させられます。元のMSX2(ESEMSX3)に戻すこともできます。
技術的にもう少し詳しく説明すると、次のような要領で設計しています。右のブロック図は作業中の現時点でのものです。
- 引き続きCPUはOPENCORESで公開されているT80を使用していますが、ESEMSX3で使っているT80aではなくSpartan-3版と同じT80sを使用しています。
- イメージファイル操作などのサポート部には、メモリカードアクセスやFATファイルシステム操作のため高機能なマイコンが必要になりました。そこでOPENCORESで公開されているAVR-Coreを使用しています。
- コンフィグレーションROM(EPCS4)には、ESEMSX3の場合と同様ROMデータを含ませて書き込んであります。AVRはこれを読み出し、MZ-700のモニタROMに相当するエリアに書き込んでいます。
- AVR自身のプログラムも、大部分をEPCS4に書き込んでいます。起動時は必要最小限のプログラムを含むブロックRAMがプログラムメモリとして接続され、本命のプログラムが入るメモリはデータメモリ(AVRにとっての外部メモリ)として接続されます。最初に動作するプログラムはEPCS4に書かれた本命のプログラムを読み出してデータメモリに書き込みます。終わったらレジスタを一発アクセスすると、それまでのプログラムメモリが切り放され、データメモリだったブロックRAMがプログラムメモリとして接続され、データメモリとしてはSDRAMなどが接続されるようになっています。
データメモリのバス幅(8bit)とプログラムメモリのバス幅(16bit)の整合をとるため、本命のプログラムが入るブロックRAMはデータバス幅が異なるデュアルポートRAMとして構成しています。
- AVRとZ80はSDRAMを共有しています。つまりコントローラはデュアルポート構成となっているわけです。SDRAMアクセスに関して双方にウェイトは入りません。
- AVRはZ80に対してバスリクエストをかけてバスを乗っ取ることができるようになっています。
-
ホットキー |
動作 |
ALT+A |
最初のメニューを表示 |
ALT+X |
メニュー操作を終了する |
ALT+G |
PCGオン |
ALT+C |
PCGオフ |
ALT+P |
テープPLAY |
ALT+S |
テープSTOP |
ALTと併用して押すキーにより、AVRに対してコマンドを送ることができます。メニュー表示では、現在の画面を一時保存することで画面まで乗っ取っています。もちろん、操作終了にて画面も復帰します。ホットキーを右に示します。
- モニタからロードして動かすソフト専用になってしまいますが、メニュー操作でMZ-700のメモリに直接ロードする機能を設けてあります。10F0h番地からのワークエリアにもロードするファイルの情報を入れているのですが、ここで1105h番地に"C3h"を強制的に書き込むことで、どんなプログラムでも盲目的に1105h番地にジャンプすればスタートさせられるようにしています。
本当はロード後いきなり動作するのが理想なのでしょうが、それだとかなりT80に手を入れないといけなくなりそうで敬遠中です。また画面にジャンプコマンドを書いてあとはCRキーを押すだけというのもかなり簡単なのですが、純正モニタと互換モニタでコマンドが違うというしょうもない問題をクリアできない(TS-700にも対応しますか?と問題が広がってしまう)ために敬遠しています。
- せっかくジョイスティックポートがあるので、ジョイスティックで遊べるようにしています。具体的にはカーソル移動キーやスペース・シフトなどのキーの信号に接続しているだけです。ゲームによってトリガがバラバラなので、現時点ではとりあえずゼビウス専用ポートとその他用ポートというように分けて使えるようにしています。
★制限事項
回路で動きますのでほとんど本物と変らないのですが、それでもいくらかの制限はあります。
- 基本的にSpartan-3版の制限を引き継いでいます。
★ダウンロード
MZ-700 on FPGA
(C)2007 Nibbles lab. |
for 1chipMSX
(EP1C12)
|
mz700_cd.zip
(2989512bytes) |
★履歴
V1.0 (2007/夏)
さて、次は何を作りましょうか。
謝辞
本プロジェクトにあたり、次の方々による情報や成果物を使用または参照させていただいております。この場をもってお礼を申し上げます。
題字は富士通のコンピュータ製造をわかりやすく紹介した小冊子「コンピュータをつくる」からいただきました。この小冊子の作者は緒方健二氏で、絵と文を担当されています。当時はパソコンなどない時代で、後に氏はシャープに請われてMZ-80Kのマニュアルを制作し、名著と讃えられることになります。まぁ流行の「〜のつくりかた」でも良かったんですが、ここはやはり「コンピュータを作る」というところで件の小冊子と重なるところがあり、こちらを採用することにしました。